diff --git a/.codespellrc b/.codespellrc index f14154708..cfaa308e4 100644 --- a/.codespellrc +++ b/.codespellrc @@ -1,3 +1,3 @@ [codespell] -ignore-words-list: crate,everytime,inout,co-ordinate,ot,nwo,absolutey,atleast,ue,afterall -skip: **/target,node_modules,build,**/Cargo.lock,./docs/kcl/*.md,.yarn.lock,**/yarn.lock,./openapi/*.json,./src/lib/machine-api.d.ts +ignore-words-list: crate,everytime,inout,co-ordinate,ot,nwo,atleast,ue,afterall +skip: **/target,node_modules,build,**/Cargo.lock,./docs/kcl/*.md,.yarn.lock,**/yarn.lock,./openapi/*.json,./src/lib/machine-api.d.ts,./packages/codemirror-lang-kcl/test/all.test.ts diff --git a/.github/ci-cd-scripts/playwright-browser-chrome.sh b/.github/ci-cd-scripts/playwright-browser-chrome.sh deleted file mode 100755 index 676529d20..000000000 --- a/.github/ci-cd-scripts/playwright-browser-chrome.sh +++ /dev/null @@ -1,59 +0,0 @@ -# bash strict mode -set -euo pipefail - -if [[ ! -f "test-results/.last-run.json" ]]; then - # if no last run artifact, than run plawright normally - echo "run playwright normally" - if [[ "$3" == "ubuntu-latest" ]]; then - yarn test:playwright:browser:chrome:ubuntu -- --shard=$1/$2 || true - elif [[ "$3" == "windows-latest" ]]; then - yarn test:playwright:browser:chrome:windows -- --shard=$1/$2 || true - else - echo "Do not run playwright. Unable to detect os runtime." - exit 1 - fi - # # send to axiom - node playwrightProcess.mjs | tee /tmp/github-actions.log > /dev/null 2>&1 -fi - -retry=1 -max_retrys=4 - -# retry failed tests, doing our own retries because using inbuilt playwright retries causes connection issues -while [[ $retry -le $max_retrys ]]; do - if [[ -f "test-results/.last-run.json" ]]; then - failed_tests=$(jq '.failedTests | length' test-results/.last-run.json) - if [[ $failed_tests -gt 0 ]]; then - echo "retried=true" >>$GITHUB_OUTPUT - echo "run playwright with last failed tests and retry $retry" - if [[ "$3" == "ubuntu-latest" ]]; then - yarn test:playwright:browser:chrome:ubuntu -- --last-failed || true - elif [[ "$3" == "windows-latest" ]]; then - yarn test:playwright:browser:chrome:windows -- --last-failed || true - else - echo "Do not run playwright. Unable to detect os runtime." - exit 1 - fi - # send to axiom - node playwrightProcess.mjs | tee /tmp/github-actions.log > /dev/null 2>&1 - retry=$((retry + 1)) - else - echo "retried=false" >>$GITHUB_OUTPUT - exit 0 - fi - else - echo "retried=false" >>$GITHUB_OUTPUT - exit 0 - fi -done - -echo "retried=false" >>$GITHUB_OUTPUT - -if [[ -f "test-results/.last-run.json" ]]; then - failed_tests=$(jq '.failedTests | length' test-results/.last-run.json) - if [[ $failed_tests -gt 0 ]]; then - # if it still fails after 3 retrys, then fail the job - exit 1 - fi -fi -exit 0 diff --git a/.github/ci-cd-scripts/playwright-electron.sh b/.github/ci-cd-scripts/playwright-electron.sh index f447b5a88..dab07f69b 100755 --- a/.github/ci-cd-scripts/playwright-electron.sh +++ b/.github/ci-cd-scripts/playwright-electron.sh @@ -1,15 +1,17 @@ +#!/bin/bash + # bash strict mode set -euo pipefail if [[ ! -f "test-results/.last-run.json" ]]; then # if no last run artifact, than run plawright normally echo "run playwright normally" - if [[ "$1" == "ubuntu-latest" ]]; then - xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- yarn test:playwright:electron:ubuntu || true - elif [[ "$1" == "windows-latest" ]]; then - yarn test:playwright:electron:windows || true - elif [[ "$1" == "macos-14" ]]; then - yarn test:playwright:electron:macos || true + if [[ "$3" == *ubuntu* ]]; then + xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- yarn test:playwright:electron:ubuntu -- --shard=$1/$2 || true + elif [[ "$3" == *windows* ]]; then + yarn test:playwright:electron:windows -- --shard=$1/$2 || true + elif [[ "$3" == *macos* ]]; then + yarn test:playwright:electron:macos -- --shard=$1/$2 || true else echo "Do not run playwright. Unable to detect os runtime." exit 1 @@ -28,11 +30,11 @@ while [[ $retry -le $max_retrys ]]; do if [[ $failed_tests -gt 0 ]]; then echo "retried=true" >>$GITHUB_OUTPUT echo "run playwright with last failed tests and retry $retry" - if [[ "$1" == "ubuntu-latest" ]]; then + if [[ "$3" == *ubuntu* ]]; then xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- yarn test:playwright:electron:ubuntu -- --last-failed || true - elif [[ "$1" == "windows-latest" ]]; then + elif [[ "$3" == *windows* ]]; then yarn test:playwright:electron:windows -- --last-failed || true - elif [[ "$1" == "macos-14" ]]; then + elif [[ "$3" == *macos* ]]; then yarn test:playwright:electron:macos -- --last-failed || true else echo "Do not run playwright. Unable to detect os runtime." diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 2b885816f..81f655172 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,24 +5,28 @@ version: 2 updates: - - package-ecosystem: 'npm' # See documentation for possible values - directory: '/' # Location of package manifests - schedule: - interval: 'daily' - reviewers: - - franknoirot - - irev-dev - - package-ecosystem: 'github-actions' # See documentation for possible values - directory: '/' # Location of package manifests - schedule: - interval: 'daily' - reviewers: - - adamchalmers - - jessfraz - - package-ecosystem: 'cargo' # See documentation for possible values - directory: '/src/wasm-lib/' # Location of package manifests - schedule: - interval: 'daily' - reviewers: - - adamchalmers - - jessfraz + - package-ecosystem: 'npm' # See documentation for possible values + directory: '/' # Location of package manifests + schedule: + interval: 'weekly' + reviewers: + - franknoirot + - irev-dev + - package-ecosystem: 'github-actions' # See documentation for possible values + directory: '/' # Location of package manifests + schedule: + interval: 'weekly' + reviewers: + - adamchalmers + - jessfraz + - package-ecosystem: 'cargo' # See documentation for possible values + directory: '/src/wasm-lib/' # Location of package manifests + schedule: + interval: 'weekly' + reviewers: + - adamchalmers + - jessfraz + groups: + serde-dependencies: + patterns: + - "serde*" diff --git a/.github/workflows/build-apps.yml b/.github/workflows/build-apps.yml new file mode 100644 index 000000000..f50e096ff --- /dev/null +++ b/.github/workflows/build-apps.yml @@ -0,0 +1,427 @@ +name: build-apps + +on: + pull_request: + push: + branches: + - main + - updater-test + tags: + - 'v[0-9]+.[0-9]+.[0-9]+' + schedule: + - cron: '0 4 * * *' + # Daily at 04:00 AM UTC + # Will checkout the last commit from the default branch (main as of 2023-10-04) + +env: + # IS_RELEASE: ${{ github.ref_type == 'tag' }} + IS_RELEASE: true + IS_NIGHTLY: ${{ github.event_name == 'schedule' }} + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + prepare-files: + runs-on: ubuntu-22.04 # seperate job on Ubuntu for easy string manipulations (compared to Windows) + outputs: + version: ${{ steps.export_version.outputs.version }} + notes: ${{ steps.export_notes.outputs.notes }} + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: 'yarn' + + - run: yarn install + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + - uses: Swatinem/rust-cache@v2 + with: + workspaces: './src/wasm-lib' + + # TODO: see if we can fetch from main instead if no diff at src/wasm-lib + - name: Run build:wasm + run: "yarn build:wasm" + + - name: Set nightly version, product name, release notes, and icons + if: ${{ env.IS_NIGHTLY == 'true' }} + run: yarn files:flip-to-nightly + + # - name: Set release version + # if: ${{ env.IS_RELEASE == 'true' }} + # run: | + # export VERSION=${GITHUB_REF_NAME#v} + # yarn files:set-version + + - uses: actions/upload-artifact@v4 + with: + name: prepared-files + path: | + package.json + electron-builder.yml + src/wasm-lib/pkg/wasm_lib* + release-notes.md + assets/icon.ico + assets/icon.png + + - id: export_version + run: echo "version=`cat package.json | jq -r '.version'`" >> "$GITHUB_OUTPUT" + + - id: export_notes + run: echo "notes=`cat release-notes.md`" >> "$GITHUB_OUTPUT" + + # - name: Prepare electron-builder.yml file for updater test + # if: ${{ env.IS_RELEASE == 'true' }} + # run: | + # yq -i '.publish[0].url = "https://dl.zoo.dev/releases/modeling-app/updater-test"' electron-builder.yml + + # - uses: actions/upload-artifact@v4 + # if: ${{ env.IS_RELEASE == 'true' }} + # with: + # name: prepared-files-updater-test + # path: | + # electron-builder.yml + + + build-apps: + needs: [prepare-files] + strategy: + fail-fast: false + matrix: + include: + - os: macos-14 + platform: mac + - os: windows-2022 + platform: win + - os: ubuntu-22.04 + platform: linux + runs-on: ${{ matrix.os }} + env: + VERSION_NO_V: ${{ needs.prepare-files.outputs.version }} + steps: + - uses: actions/checkout@v4 + + - uses: actions/download-artifact@v4 + name: prepared-files + + - name: Copy prepared files + run: | + ls -R prepared-files + cp prepared-files/package.json package.json + cp prepared-files/electron-builder.yml electron-builder.yml + cp prepared-files/src/wasm-lib/pkg/wasm_lib_bg.wasm public + mkdir src/wasm-lib/pkg + cp prepared-files/src/wasm-lib/pkg/wasm_lib* src/wasm-lib/pkg + cp prepared-files/release-notes.md release-notes.md + cp prepared-files/assets/icon.ico assets/icon.ico + cp prepared-files/assets/icon.png assets/icon.png + + - name: Sync node version and setup cache + uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: 'yarn' # Set this to npm, yarn or pnpm. + + - run: yarn install + + - run: yarn tronb:vite + + - name: Prepare certificate and variables (Windows only) + if: ${{ (env.IS_RELEASE == 'true' || env.IS_NIGHTLY == 'true') && matrix.os == 'windows-2022' }} + run: | + echo "${{secrets.SM_CLIENT_CERT_FILE_B64 }}" | base64 --decode > /d/Certificate_pkcs12.p12 + cat /d/Certificate_pkcs12.p12 + echo "::set-output name=version::${GITHUB_REF#refs/tags/v}" + echo "SM_HOST=${{ secrets.SM_HOST }}" >> "$GITHUB_ENV" + echo "SM_API_KEY=${{ secrets.SM_API_KEY }}" >> "$GITHUB_ENV" + echo "SM_CLIENT_CERT_FILE=D:\\Certificate_pkcs12.p12" >> "$GITHUB_ENV" + echo "SM_CLIENT_CERT_PASSWORD=${{ secrets.SM_CLIENT_CERT_PASSWORD }}" >> "$GITHUB_ENV" + echo "C:\Program Files (x86)\Windows Kits\10\App Certification Kit" >> $GITHUB_PATH + echo "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools" >> $GITHUB_PATH + echo "C:\Program Files\DigiCert\DigiCert One Signing Manager Tools" >> $GITHUB_PATH + shell: bash + + - name: Setup certicate with SSM KSP (Windows only) + if: ${{ (env.IS_RELEASE == 'true' || env.IS_NIGHTLY == 'true') && matrix.os == 'windows-2022' }} + run: | + curl -X GET https://one.digicert.com/signingmanager/api-ui/v1/releases/smtools-windows-x64.msi/download -H "x-api-key:%SM_API_KEY%" -o smtools-windows-x64.msi + msiexec /i smtools-windows-x64.msi /quiet /qn + smksp_registrar.exe list + smctl.exe keypair ls + C:\Windows\System32\certutil.exe -csp "DigiCert Signing Manager KSP" -key -user + smksp_cert_sync.exe + shell: cmd + + - name: Build the app (debug) + if: ${{ env.IS_RELEASE == 'false' && env.IS_NIGHTLY == 'false' }} + # electron-builder doesn't have a concept of release vs debug, + # this is just not doing any codesign or release yml generation + run: yarn electron-builder --config + + - name: Build the app (release) + if: ${{ env.IS_RELEASE == 'true' || env.IS_NIGHTLY == 'true' }} + env: + APPLE_ID: ${{ secrets.APPLE_ID }} + APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} + APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_PASSWORD }} + APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} + CSC_LINK: ${{ secrets.APPLE_CERTIFICATE }} + CSC_KEY_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} + CSC_KEYCHAIN: ${{ secrets.APPLE_SIGNING_IDENTITY }} + WINDOWS_CERTIFICATE_THUMBPRINT: ${{ secrets.WINDOWS_CERTIFICATE_THUMBPRINT }} + DEBUG: "electron-notarize*" + # TODO: Fix electron-notarize flakes. The logs above should help gather more data on failures + uses: nick-fields/retry@v3.0.0 + with: + timeout_minutes: 10 + max_attempts: 3 + command: yarn electron-builder --config --publish always + + - name: List artifacts in out/ + run: ls -R out + + - uses: actions/upload-artifact@v4 + with: + name: out-arm64-${{ matrix.platform }} + # first two will pick both Zoo Modeling App-$VERSION-arm64-win.exe and Zoo Modeling App-$VERSION-win.exe + path: | + out/*-${{ env.VERSION_NO_V }}-win.* + out/*-${{ env.VERSION_NO_V }}-arm64-win.* + out/*-arm64-mac.* + out/*-arm64-linux.* + + - uses: actions/upload-artifact@v4 + with: + name: out-x64-${{ matrix.platform }} + path: | + out/*-x64-win.* + out/*-x64-mac.* + out/*-x86_64-linux.* + + - uses: actions/upload-artifact@v4 + if: ${{ env.IS_RELEASE == 'true' || env.IS_NIGHTLY == 'true' }} + with: + name: out-yml-${{ matrix.platform }} + path: | + out/latest*.yml + + # TODO: add the 'Build for Mac TestFlight (nightly)' stage back + + # The steps below are for updater-test builds, only on release + + # - uses: actions/download-artifact@v4 + # if: ${{ env.IS_RELEASE == 'true' }} + # name: prepared-files-updater-test + + # - name: Copy updated electron-builder.yml file for updater test + # if: ${{ env.IS_RELEASE == 'true' }} + # run: | + # ls -R prepared-files-updater-test + # cp prepared-files-updater-test/electron-builder.yml electron-builder.yml + + # - name: Build the app (updater-test) + # if: ${{ env.IS_RELEASE == 'true' }} + # env: + # APPLE_ID: ${{ secrets.APPLE_ID }} + # APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} + # APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_PASSWORD }} + # APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} + # CSC_LINK: ${{ secrets.APPLE_CERTIFICATE }} + # CSC_KEY_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} + # CSC_KEYCHAIN: ${{ secrets.APPLE_SIGNING_IDENTITY }} + # WINDOWS_CERTIFICATE_THUMBPRINT: ${{ secrets.WINDOWS_CERTIFICATE_THUMBPRINT }} + # DEBUG: "electron-notarize*" + # # TODO: Fix electron-notarize flakes. The logs above should help gather more data on failures + # uses: nick-fields/retry@v3.0.0 + # with: + # timeout_minutes: 10 + # max_attempts: 3 + # command: yarn electron-builder --config --publish always + + # - uses: actions/upload-artifact@v4 + # if: ${{ env.IS_RELEASE == 'true' }} + # with: + # name: updater-test-arm64-${{ matrix.platform }} + # path: | + # out/*-arm64-win.exe + # out/*-arm64-mac.dmg + # out/*-arm64-linux.AppImage + + # - uses: actions/upload-artifact@v4 + # if: ${{ env.IS_RELEASE == 'true' }} + # with: + # name: updater-test-x64-${{ matrix.platform }} + # path: | + # out/*-x64-win.exe + # out/*-x64-mac.dmg + # out/*-x86_64-linux.AppImage + + + upload-apps-release: + runs-on: ubuntu-22.04 + permissions: + contents: write + # if: ${{ github.ref_type == 'tag' || github.event_name == 'schedule' }} + env: + VERSION_NO_V: ${{ needs.prepare-files.outputs.version }} + VERSION: ${{ format('v{0}', needs.prepare-files.outputs.version) }} + needs: [prepare-files, build-apps] + steps: + - uses: actions/checkout@v4 + + - uses: actions/download-artifact@v4 + with: + name: out-arm64-win + path: out + + - uses: actions/download-artifact@v4 + with: + name: out-x64-win + path: out + + - uses: actions/download-artifact@v4 + with: + name: out-yml-win + path: out + + - uses: actions/download-artifact@v4 + with: + name: out-arm64-mac + path: out + + - uses: actions/download-artifact@v4 + with: + name: out-x64-mac + path: out + + - uses: actions/download-artifact@v4 + with: + name: out-yml-mac + path: out + + - uses: actions/download-artifact@v4 + with: + name: out-arm64-linux + path: out + + - uses: actions/download-artifact@v4 + with: + name: out-x64-linux + path: out + + - uses: actions/download-artifact@v4 + with: + name: out-yml-linux + path: out + + - name: Generate the download static endpoint + env: + NOTES: ${{ needs.prepare-files.outputs.notes }} + PUB_DATE: ${{ github.event.repository.updated_at }} + WEBSITE_DIR: ${{ github.event_name == 'schedule' && 'dl.zoo.dev/releases/modeling-app/nightly' || 'dl.zoo.dev/releases/modeling-app' }} + URL_CODED_NAME: ${{ github.event_name == 'schedule' && 'Zoo%20Modeling%20App%20%28Nightly%29' || 'Zoo%20Modeling%20App' }} + run: | + RELEASE_DIR=https://${WEBSITE_DIR} + jq --null-input \ + --arg version "${VERSION}" \ + --arg pub_date "${PUB_DATE}" \ + --arg notes "${NOTES}" \ + --arg mac_arm64_url "$RELEASE_DIR/${{ env.URL_CODED_NAME }}-${VERSION_NO_V}-arm64-mac.dmg" \ + --arg mac_x64_url "$RELEASE_DIR/${{ env.URL_CODED_NAME }}-${VERSION_NO_V}-x64-mac.dmg" \ + --arg windows_arm64_url "$RELEASE_DIR/${{ env.URL_CODED_NAME }}-${VERSION_NO_V}-arm64-win.exe" \ + --arg windows_x64_url "$RELEASE_DIR/${{ env.URL_CODED_NAME }}-${VERSION_NO_V}-x64-win.exe" \ + --arg linux_arm64_url "$RELEASE_DIR/${{ env.URL_CODED_NAME }}-${VERSION_NO_V}-arm64-linux.AppImage" \ + --arg linux_x64_url "$RELEASE_DIR/${{ env.URL_CODED_NAME }}-${VERSION_NO_V}-x86_64-linux.AppImage" \ + '{ + "version": $version, + "pub_date": $pub_date, + "notes": $notes, + "platforms": { + "dmg-arm64": { + "url": $mac_arm64_url + }, + "dmg-x64": { + "url": $mac_x64_url + }, + "exe-arm64": { + "url": $windows_arm64_url + }, + "exe-x64": { + "url": $windows_x64_url + }, + "appimage-arm64": { + "url": $linux_arm64_url + }, + "appimage-x64": { + "url": $linux_x64_url + } + } + }' > out/last_download.json + cat out/last_download.json + + - uses: actions/upload-artifact@v4 + with: + name: out-download-json + path: out/last_download.json + + - name: List artifacts + run: "ls -R out" + + - name: Set more complete nightly release notes + if: ${{ env.IS_NIGHTLY == 'true' }} + run: | + # Note: preferred going this way instead of a full clone in the checkout step, + # see https://github.com/actions/checkout/issues/1471 + git fetch --prune --unshallow --tags + export TAG="nightly-${VERSION}" + export PREVIOUS_TAG=$(git describe --tags --match="nightly-v[0-9]*" --abbrev=0) + export NOTES=$(./scripts/get-nightly-changelog.sh) + yarn files:set-notes + + - name: Authenticate to Google Cloud + uses: 'google-github-actions/auth@v2.1.7' + with: + credentials_json: '${{ secrets.GOOGLE_CLOUD_DL_SA }}' + + - name: Set up Google Cloud SDK + uses: google-github-actions/setup-gcloud@v2.1.2 + with: + project_id: ${{ env.GOOGLE_CLOUD_PROJECT_ID }} + + - name: Upload nightly files to public bucket + if: ${{ env.IS_NIGHTLY == 'true' }} + uses: google-github-actions/upload-cloud-storage@v2.2.1 + with: + path: out + glob: '*' + parent: false + destination: 'dl.kittycad.io/releases/modeling-app/nightly' + + - name: Upload updater-test files to public bucket + uses: google-github-actions/upload-cloud-storage@v2.2.1 + with: + path: out + glob: '*' + parent: false + destination: 'dl.kittycad.io/releases/modeling-app/updater-test' + + - name: Invalidate bucket cache on latest*.yml and last_download.json files + if: ${{ env.IS_NIGHTLY == 'true' }} + run: yarn files:invalidate-bucket:nightly + + - name: Tag nightly commit + if: ${{ env.IS_NIGHTLY == 'true' }} + uses: actions/github-script@v7 + with: + script: | + const { VERSION } = process.env + const { owner, repo } = context.repo + const { sha } = context + const ref = `refs/tags/nightly-${VERSION}` + github.rest.git.createRef({ owner, repo, sha, ref }) diff --git a/.github/workflows/build-test-publish-apps.yml b/.github/workflows/build-test-publish-apps.yml deleted file mode 100644 index c05b303e2..000000000 --- a/.github/workflows/build-test-publish-apps.yml +++ /dev/null @@ -1,414 +0,0 @@ -name: build-publish-apps - -on: - pull_request: - push: - branches: - - main - - updater-test - release: - types: [published] - schedule: - - cron: '0 4 * * *' - # Daily at 04:00 AM UTC - # Will checkout the last commit from the default branch (main as of 2023-10-04) - -env: - CUT_RELEASE_PR: ${{ github.event_name == 'pull_request' && (contains(github.event.pull_request.title, 'Cut release v')) }} - # BUILD_RELEASE: ${{ github.event_name == 'release' || github.event_name == 'schedule' || github.event_name == 'pull_request' && (contains(github.event.pull_request.title, 'Cut release v')) }} - BUILD_RELEASE: true - NOTES: ${{ github.event_name == 'release' && github.event.release.body || format('Non-release build, commit {0}', github.sha) }} - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -jobs: - prepare-files: - runs-on: ubuntu-22.04 # seperate job on Ubuntu for easy string manipulations (compared to Windows) - outputs: - version: ${{ steps.export_version.outputs.version }} - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 - with: - node-version-file: '.nvmrc' - cache: 'yarn' - - - run: yarn install - - - name: Setup Rust - uses: dtolnay/rust-toolchain@stable - - - uses: Swatinem/rust-cache@v2 - with: - workspaces: './src/wasm-lib' - - # TODO: see if we can fetch from main instead if no diff at src/wasm-lib - - name: Run build:wasm - run: "yarn build:wasm" - - - name: Set nightly version - if: github.event_name == 'schedule' - run: | - VERSION=$(date +'%-y.%-m.%-d') yarn bump-jsons - - # TODO: see if we need to inject updater nightly URL here https://dl.zoo.dev/releases/modeling-app/nightly/last_update.json - - - name: Generate release notes - run: | - echo "$NOTES" > release-notes.md - cat release-notes.md - - - uses: actions/upload-artifact@v3 - with: - name: prepared-files - path: | - package.json - src/wasm-lib/pkg/wasm_lib* - release-notes.md - - - id: export_version - run: echo "version=`cat package.json | jq -r '.version'`" >> "$GITHUB_OUTPUT" - - - name: Prepare electron-builder.yml file for nightly - if: ${{ github.event_name == 'schedule' }} - run: | - yq -i '.publish[0].url = "https://dl.zoo.dev/releases/modeling-app/nightly"' electron-builder.yml - - - uses: actions/upload-artifact@v3 - if: ${{ github.event_name == 'schedule' }} - with: - name: prepared-files-nightly - path: | - electron-builder.yml - - - name: Prepare electron-builder.yml file for updater test - if: ${{ env.CUT_RELEASE_PR == 'true' }} - run: | - yq -i '.publish[0].url = "https://dl.zoo.dev/releases/modeling-app/updater-test-release-notes"' electron-builder.yml - - - uses: actions/upload-artifact@v3 - if: ${{ env.CUT_RELEASE_PR == 'true' }} - with: - name: prepared-files-updater-test - path: | - electron-builder.yml - - - build-apps: - needs: [prepare-files] - strategy: - fail-fast: false - matrix: - include: - - os: macos-14 - platform: mac - - os: windows-2022 - platform: win - - os: ubuntu-22.04 - platform: linux - runs-on: ${{ matrix.os }} - env: - APPLE_ID: ${{ secrets.APPLE_ID }} - APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} - APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_PASSWORD }} - APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} - CSC_LINK: ${{ secrets.APPLE_CERTIFICATE }} - CSC_KEY_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} - CSC_KEYCHAIN: ${{ secrets.APPLE_SIGNING_IDENTITY }} - CSC_FOR_PULL_REQUEST: true - VERSION: ${{ github.event_name == 'schedule' && needs.prepare-files.outputs.version || format('v{0}', needs.prepare-files.outputs.version) }} - VERSION_NO_V: ${{ needs.prepare-files.outputs.version }} - WINDOWS_CERTIFICATE_THUMBPRINT: F4C9A52FF7BC26EE5E054946F6B11DEEA94C748D - steps: - - uses: actions/checkout@v4 - - - uses: actions/download-artifact@v3 - name: prepared-files - - - name: Copy prepared files - run: | - ls -R prepared-files - cp prepared-files/package.json package.json - cp prepared-files/src/wasm-lib/pkg/wasm_lib_bg.wasm public - mkdir src/wasm-lib/pkg - cp prepared-files/src/wasm-lib/pkg/wasm_lib* src/wasm-lib/pkg - cp prepared-files/release-notes.md release-notes.md - - - uses: actions/download-artifact@v3 - if: ${{ github.event_name == 'schedule' }} - name: prepared-files-nightly - - - name: Copy updated electron-builder.yml file for nightly build - if: ${{ github.event_name == 'schedule' }} - run: | - ls -R prepared-files-nightly - cp prepared-files-nightly/electron-builder.yml electron-builder.yml - - - name: Sync node version and setup cache - uses: actions/setup-node@v4 - with: - node-version-file: '.nvmrc' - cache: 'yarn' # Set this to npm, yarn or pnpm. - - - run: yarn install - - - run: yarn tronb:vite - - - name: Prepare certificate and variables (Windows only) - if: ${{ env.BUILD_RELEASE == 'true' && matrix.os == 'windows-2022' }} - run: | - echo "${{secrets.SM_CLIENT_CERT_FILE_B64 }}" | base64 --decode > /d/Certificate_pkcs12.p12 - cat /d/Certificate_pkcs12.p12 - echo "::set-output name=version::${GITHUB_REF#refs/tags/v}" - echo "SM_HOST=${{ secrets.SM_HOST }}" >> "$GITHUB_ENV" - echo "SM_API_KEY=${{ secrets.SM_API_KEY }}" >> "$GITHUB_ENV" - echo "SM_CLIENT_CERT_FILE=D:\\Certificate_pkcs12.p12" >> "$GITHUB_ENV" - echo "SM_CLIENT_CERT_PASSWORD=${{ secrets.SM_CLIENT_CERT_PASSWORD }}" >> "$GITHUB_ENV" - echo "C:\Program Files (x86)\Windows Kits\10\App Certification Kit" >> $GITHUB_PATH - echo "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools" >> $GITHUB_PATH - echo "C:\Program Files\DigiCert\DigiCert One Signing Manager Tools" >> $GITHUB_PATH - shell: bash - - - name: Setup certicate with SSM KSP (Windows only) - if: ${{ env.BUILD_RELEASE == 'true' && matrix.os == 'windows-2022' }} - run: | - curl -X GET https://one.digicert.com/signingmanager/api-ui/v1/releases/smtools-windows-x64.msi/download -H "x-api-key:%SM_API_KEY%" -o smtools-windows-x64.msi - msiexec /i smtools-windows-x64.msi /quiet /qn - smksp_registrar.exe list - smctl.exe keypair ls - C:\Windows\System32\certutil.exe -csp "DigiCert Signing Manager KSP" -key -user - smksp_cert_sync.exe - shell: cmd - - - name: Build the app - run: yarn electron-builder --config ${{ env.BUILD_RELEASE && '--publish always' || '' }} - - - name: List artifacts in out/ - run: ls -R out - - - uses: actions/upload-artifact@v3 - with: - name: out-arm64-${{ matrix.platform }} - # first two will pick both Zoo Modeling App-$VERSION-arm64-win.exe and Zoo Modeling App-$VERSION-win.exe - path: | - out/*-${{ env.VERSION_NO_V }}-win.* - out/*-${{ env.VERSION_NO_V }}-arm64-win.* - out/*-arm64-mac.* - out/*-arm64-linux.* - - - uses: actions/upload-artifact@v3 - with: - name: out-x64-${{ matrix.platform }} - path: | - out/*-x64-win.* - out/*-x64-mac.* - out/*-x86_64-linux.* - - - uses: actions/upload-artifact@v3 - if: ${{ env.BUILD_RELEASE == 'true' }} - with: - name: out-yml - path: | - out/latest*.yml - - # TODO: add the 'Build for Mac TestFlight (nightly)' stage back - - - uses: actions/download-artifact@v3 - if: ${{ env.CUT_RELEASE_PR == 'true' }} - name: prepared-files-updater-test - - - name: Copy updated electron-builder.yml file for updater test - if: ${{ env.CUT_RELEASE_PR == 'true' }} - run: | - ls -R prepared-files-updater-test - cp prepared-files-updater-test/electron-builder.yml electron-builder.yml - - - name: Build the app (updater-test) - if: ${{ env.CUT_RELEASE_PR == 'true' }} - run: yarn electron-builder --config ${{ env.BUILD_RELEASE && '--publish always' || '' }} - - - uses: actions/upload-artifact@v3 - if: ${{ env.CUT_RELEASE_PR == 'true' }} - with: - name: updater-test-arm64-${{ matrix.platform }} - path: | - out/*-arm64-win.exe - out/*-arm64-mac.dmg - out/*-arm64-linux.AppImage - - - uses: actions/upload-artifact@v3 - if: ${{ env.CUT_RELEASE_PR == 'true' }} - with: - name: updater-test-x64-${{ matrix.platform }} - path: | - out/*-x64-win.exe - out/*-x64-mac.dmg - out/*-x86_64-linux.AppImage - - - publish-apps-release: - runs-on: ubuntu-22.04 - permissions: - contents: write - # if: ${{ github.event_name == 'release' || github.event_name == 'schedule' }} - needs: [prepare-files, build-apps] - env: - VERSION_NO_V: ${{ needs.prepare-files.outputs.version }} - VERSION: ${{ github.event_name == 'schedule' && needs.prepare-files.outputs.version || format('v{0}', needs.prepare-files.outputs.version) }} - PUB_DATE: ${{ github.event_name == 'release' && github.event.release.created_at || github.event.repository.updated_at }} - BUCKET_DIR: ${{ github.event_name == 'schedule' && 'dl.kittycad.io/releases/modeling-app/nightly' || 'dl.kittycad.io/releases/modeling-app/updater-test' }} - WEBSITE_DIR: ${{ github.event_name == 'schedule' && 'dl.zoo.dev/releases/modeling-app/nightly' || 'dl.zoo.dev/releases/modeling-app/updater-test' }} - URL_CODED_NAME: ${{ github.event_name == 'schedule' && 'Zoo%20Modeling%20App%20%28Nightly%29' || 'Zoo%20Modeling%20App' }} - steps: - - uses: actions/checkout@v4 - - - uses: actions/download-artifact@v3 - with: - name: out-arm64-win - path: out - - - uses: actions/download-artifact@v3 - with: - name: out-x64-win - path: out - - - uses: actions/download-artifact@v3 - with: - name: out-arm64-mac - path: out - - - uses: actions/download-artifact@v3 - with: - name: out-x64-mac - path: out - - - uses: actions/download-artifact@v3 - with: - name: out-arm64-linux - path: out - - - uses: actions/download-artifact@v3 - with: - name: out-x64-linux - path: out - - - uses: actions/download-artifact@v3 - with: - name: out-yml - path: out - - - name: Generate the download static endpoint - run: | - RELEASE_DIR=https://${WEBSITE_DIR} - jq --null-input \ - --arg version "${VERSION}" \ - --arg pub_date "${PUB_DATE}" \ - --arg notes "${NOTES}" \ - --arg mac_arm64_url "$RELEASE_DIR/${{ env.URL_CODED_NAME }}-${VERSION_NO_V}-arm64-mac.dmg" \ - --arg mac_x64_url "$RELEASE_DIR/${{ env.URL_CODED_NAME }}-${VERSION_NO_V}-x64-mac.dmg" \ - --arg windows_arm64_url "$RELEASE_DIR/${{ env.URL_CODED_NAME }}-${VERSION_NO_V}-arm64-win.exe" \ - --arg windows_x64_url "$RELEASE_DIR/${{ env.URL_CODED_NAME }}-${VERSION_NO_V}-x64-win.exe" \ - --arg linux_arm64_url "$RELEASE_DIR/${{ env.URL_CODED_NAME }}-${VERSION_NO_V}-arm64-linux.AppImage" \ - --arg linux_x64_url "$RELEASE_DIR/${{ env.URL_CODED_NAME }}-${VERSION_NO_V}-x86_64-linux.AppImage" \ - '{ - "version": $version, - "pub_date": $pub_date, - "notes": $notes, - "platforms": { - "dmg-arm64": { - "url": $mac_arm64_url - }, - "dmg-x64": { - "url": $mac_x64_url - }, - "exe-arm64": { - "url": $windows_arm64_url - }, - "exe-x64": { - "url": $windows_x64_url - }, - "appimage-arm64": { - "url": $linux_arm64_url - }, - "appimage-x64": { - "url": $linux_x64_url - } - } - }' > last_download.json - cat last_download.json - - - name: List artifacts - run: "ls -R out" - - - name: Authenticate to Google Cloud - uses: 'google-github-actions/auth@v2.1.6' - with: - credentials_json: '${{ secrets.GOOGLE_CLOUD_DL_SA }}' - - - name: Set up Google Cloud SDK - uses: google-github-actions/setup-gcloud@v2.1.0 - with: - project_id: ${{ env.GOOGLE_CLOUD_PROJECT_ID }} - - - name: Upload release files to public bucket - uses: google-github-actions/upload-cloud-storage@v2.2.0 - with: - path: out - glob: 'Zoo*' - parent: false - destination: ${{ env.BUCKET_DIR }} - - - name: Upload update endpoint to public bucket - uses: google-github-actions/upload-cloud-storage@v2.2.0 - with: - path: out - glob: 'latest*' - parent: false - destination: ${{ env.BUCKET_DIR }} - - - name: Upload download endpoint to public bucket - uses: google-github-actions/upload-cloud-storage@v2.2.0 - with: - path: last_download.json - destination: ${{ env.BUCKET_DIR }} - - - name: Upload release files to Github - if: ${{ github.event_name == 'release' }} - uses: softprops/action-gh-release@v2 - with: - files: 'out/Zoo*' - - - name: Invalidate bucket cache on latest*.yml and last_download.json files - run: | - gcloud compute url-maps invalidate-cdn-cache dl-url-map --path="/releases/modeling-app/last_download.json" --async - gcloud compute url-maps invalidate-cdn-cache dl-url-map --path="/releases/modeling-app/latest-linux-arm64.yml" --async - gcloud compute url-maps invalidate-cdn-cache dl-url-map --path="/releases/modeling-app/latest-mac.yml" --async - gcloud compute url-maps invalidate-cdn-cache dl-url-map --path="/releases/modeling-app/latest.yml" --async - - announce_release: - needs: [publish-apps-release] - runs-on: ubuntu-22.04 - if: github.event_name == 'release' - steps: - - name: Check out code - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.x' - - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install requests - - - name: Announce Release - env: - DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} - RELEASE_VERSION: ${{ github.event.release.tag_name }} - RELEASE_BODY: ${{ github.event.release.body}} - run: python public/announce_release.py diff --git a/.github/workflows/cargo-check.yml b/.github/workflows/cargo-check.yml index 1074c2d2d..e04ce4ec2 100644 --- a/.github/workflows/cargo-check.yml +++ b/.github/workflows/cargo-check.yml @@ -37,4 +37,4 @@ jobs: # We specifically want to test the disable-println feature # Since it is not enabled by default, we need to specify it # This is used in kcl-lsp - cargo check --all --features disable-println --features pyo3 --features cli + cargo check --workspace --features disable-println --features pyo3 --features cli diff --git a/.github/workflows/cargo-test.yml b/.github/workflows/cargo-test.yml index 4c4df0ad7..2c5c5c88a 100644 --- a/.github/workflows/cargo-test.yml +++ b/.github/workflows/cargo-test.yml @@ -2,24 +2,8 @@ on: push: branches: - main - paths: - - 'src/wasm-lib/**.rs' - - 'src/wasm-lib/**.hbs' - - '**/Cargo.toml' - - '**/Cargo.lock' - - '**/rust-toolchain.toml' - - 'src/wasm-lib/**.kcl' - - .github/workflows/cargo-test.yml pull_request: - paths: - - 'src/wasm-lib/**.rs' - - 'src/wasm-lib/**.hbs' - - '**/Cargo.toml' - - '**/Cargo.lock' - - '**/rust-toolchain.toml' - - 'src/wasm-lib/**.kcl' - - .github/workflows/cargo-test.yml workflow_dispatch: permissions: read-all concurrency: @@ -67,7 +51,7 @@ jobs: KITTYCAD_API_TOKEN: ${{secrets.KITTYCAD_API_TOKEN}} RUST_MIN_STACK: 10485760000 - name: Upload to codecov.io - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 with: token: ${{secrets.CODECOV_TOKEN}} fail_ci_if_error: true diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml deleted file mode 100644 index 56ff55231..000000000 --- a/.github/workflows/create-release.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: Create Release - -on: - push: - branches: - - main - -jobs: - create-release: - runs-on: ubuntu-latest - permissions: - contents: write - pull-requests: read - if: contains(github.event.head_commit.message, 'Cut release v') - steps: - - uses: actions/github-script@v7 - name: Read Cut release PR info and create release - with: - script: | - const { owner, repo } = context.repo - const pulls = await github.rest.repos.listPullRequestsAssociatedWithCommit({ - owner, - repo, - commit_sha: context.sha, - }) - const { title, body } = pulls.data[0] - const version = title.split('Cut release ')[1] - - const result = await github.rest.repos.createRelease({ - owner, - repo, - body, - tag_name: version, - name: version, - draft: true, - }) - console.log(result) diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 78daa5a1e..458ead581 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -33,20 +33,19 @@ jobs: rust: - 'src/wasm-lib/**' - browser: - timeout-minutes: ${{ matrix.os == 'macos-14' && 60 || 50 }} - name: playwright:browser:${{ matrix.os }} ${{ matrix.shardIndex }} ${{ matrix.shardTotal }} + electron: + timeout-minutes: 60 + name: playwright:electron:${{ matrix.os }} ${{ matrix.shardIndex }} ${{ matrix.shardTotal }} strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest] + # TODO: enable self-hosted-windows-8-cores once available + os: [namespace-profile-ubuntu-8-cores, namespace-profile-macos-8-cores, windows-16-cores] shardIndex: [1, 2, 3, 4] shardTotal: [4] runs-on: ${{ matrix.os }} needs: check-rust-changes steps: - - name: Tune GitHub-hosted runner network - uses: smorimoto/tune-github-hosted-runner-network@v1 - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: @@ -68,7 +67,7 @@ jobs: - name: Download Wasm Cache id: download-wasm if: needs.check-rust-changes.outputs.rust-changed == 'false' - uses: dawidd6/action-download-artifact@v6 + uses: dawidd6/action-download-artifact@v7 continue-on-error: true with: github_token: ${{secrets.GITHUB_TOKEN}} @@ -101,7 +100,8 @@ jobs: echo "/opt/homebrew/opt/gnu-sed/libexec/gnubin" >> $GITHUB_PATH - name: Install vector shell: bash - if: ${{ !startsWith(matrix.os, 'windows') }} + # TODO: figure out what to do with this, it's failing + if: false run: | curl --proto '=https' --tlsv1.2 -sSfL https://sh.vector.dev > /tmp/vector.sh chmod +x /tmp/vector.sh @@ -123,13 +123,16 @@ jobs: if: steps.download-wasm.outcome == 'failure' shell: bash run: yarn build:wasm - - name: build web - run: yarn build:local + - name: build electron shell: bash + run: yarn tron:package - name: Run ubuntu/chrome snapshots + if: ${{ matrix.os == 'namespace-profile-ubuntu-8-cores' && matrix.shardIndex == 1 }} shell: bash + # TODO: break this in its own job, for now it's not slowing down the overall execution as ubuntu is the quickest, + # but we could do better. This forces a large 1/1 shard of all 20 snapshot tests that runs in about 3 minutes. run: | - yarn playwright test --project="Google Chrome" --config=playwright.ci.config.ts --retries="3" --update-snapshots --grep=@snapshot --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }} + PLATFORM=web yarn playwright test --config=playwright.config.ts --retries="3" --update-snapshots --grep=@snapshot --shard=1/1 env: CI: true NODE_ENV: development @@ -150,6 +153,7 @@ jobs: continue-on-error: true run: rm -r test-results - name: check for changes + if: ${{ matrix.os == 'namespace-profile-ubuntu-8-cores' && matrix.shardIndex == 1 }} shell: bash id: git-check run: | @@ -186,12 +190,12 @@ jobs: with: name: test-results-${{ matrix.os }}-${{ matrix.shardIndex }}-${{ github.sha }} path: test-results/ - - name: Run playwright/chrome flow (with retries) + - name: Run playwright/electron flow (with retries) id: retry if: ${{ !cancelled() && (success() || failure()) }} shell: bash run: | - .github/ci-cd-scripts/playwright-browser-chrome.sh ${{matrix.shardIndex}} ${{matrix.shardTotal}} ${{matrix.os}} + .github/ci-cd-scripts/playwright-electron.sh ${{matrix.shardIndex}} ${{matrix.shardTotal}} ${{matrix.os}} env: CI: true FAIL_ON_CONSOLE_ERRORS: true @@ -199,11 +203,6 @@ jobs: VITE_KC_DEV_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN_DEV }} VITE_KC_SKIP_AUTH: true token: ${{ secrets.KITTYCAD_API_TOKEN_DEV }} - - name: send to axiom - if: always() - shell: bash - run: | - node playwrightProcess.mjs | tee /tmp/github-actions.log - uses: actions/upload-artifact@v4 if: always() with: @@ -221,136 +220,3 @@ jobs: retention-days: 30 overwrite: true - - electron: - name: playwright:electron:${{matrix.os}} - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest, windows-latest, macos-14] - timeout-minutes: 60 - runs-on: ${{ matrix.os }} - needs: check-rust-changes - steps: - - name: Tune GitHub-hosted runner network - uses: smorimoto/tune-github-hosted-runner-network@v1 - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version-file: '.nvmrc' - cache: 'yarn' - - uses: KittyCAD/action-install-cli@main - - name: Install dependencies - shell: bash - run: yarn - - name: Cache Playwright Browsers - uses: actions/cache@v4 - with: - path: | - ~/.cache/ms-playwright/ - key: ${{ runner.os }}-playwright-${{ hashFiles('yarn.lock') }} - - name: Install Playwright Browsers - shell: bash - run: yarn playwright install chromium --with-deps - - name: Download Wasm Cache - id: download-wasm - if: needs.check-rust-changes.outputs.rust-changed == 'false' - uses: dawidd6/action-download-artifact@v6 - continue-on-error: true - with: - github_token: ${{secrets.GITHUB_TOKEN}} - name: wasm-bundle - workflow: build-and-store-wasm.yml - branch: main - path: src/wasm-lib/pkg - - name: copy wasm blob - if: needs.check-rust-changes.outputs.rust-changed == 'false' - shell: bash - run: cp src/wasm-lib/pkg/wasm_lib_bg.wasm public - continue-on-error: true - - name: Setup Rust - uses: dtolnay/rust-toolchain@stable - - name: Cache Wasm (because rust diff) - if: needs.check-rust-changes.outputs.rust-changed == 'true' - uses: Swatinem/rust-cache@v2 - with: - workspaces: './src/wasm-lib' - - name: OR Cache Wasm (because wasm cache failed) - if: steps.download-wasm.outcome == 'failure' - uses: Swatinem/rust-cache@v2 - with: - workspaces: './src/wasm-lib' - - name: install good sed - if: ${{ startsWith(matrix.os, 'macos') }} - shell: bash - run: | - brew install gnu-sed - echo "/opt/homebrew/opt/gnu-sed/libexec/gnubin" >> $GITHUB_PATH - - name: Install vector - if: ${{ !startsWith(matrix.os, 'windows') }} - shell: bash - run: | - curl --proto '=https' --tlsv1.2 -sSfL https://sh.vector.dev > /tmp/vector.sh - chmod +x /tmp/vector.sh - /tmp/vector.sh -y -no-modify-path - mkdir -p /tmp/vector - cp .github/workflows/vector.toml /tmp/vector.toml - sed -i "s#GITHUB_WORKFLOW#${GITHUB_WORKFLOW}#g" /tmp/vector.toml - sed -i "s#GITHUB_REPOSITORY#${GITHUB_REPOSITORY}#g" /tmp/vector.toml - sed -i "s#GITHUB_SHA#${GITHUB_SHA}#g" /tmp/vector.toml - sed -i "s#GITHUB_REF_NAME#${GITHUB_REF_NAME}#g" /tmp/vector.toml - sed -i "s#GH_ACTIONS_AXIOM_TOKEN#${{secrets.GH_ACTIONS_AXIOM_TOKEN}}#g" /tmp/vector.toml - cat /tmp/vector.toml - ${HOME}/.vector/bin/vector --config /tmp/vector.toml & - - name: Build Wasm (because rust diff) - if: needs.check-rust-changes.outputs.rust-changed == 'true' - shell: bash - run: yarn build:wasm - - name: OR Build Wasm (because wasm cache failed) - if: steps.download-wasm.outcome == 'failure' - shell: bash - run: yarn build:wasm - - name: build electron - shell: bash - run: yarn tron:package - - uses: actions/download-artifact@v4 - if: ${{ !cancelled() && (success() || failure()) }} - continue-on-error: true - with: - name: test-results-electron-${{ matrix.os }}-${{ github.sha }} - path: test-results/ - - name: Run electron tests (with retries) - id: retry - if: ${{ !cancelled() && (success() || failure()) }} - shell: bash - run: | - .github/ci-cd-scripts/playwright-electron.sh ${{ matrix.os }} - env: - CI: true - FAIL_ON_CONSOLE_ERRORS: true - NODE_ENV: development - VITE_KC_DEV_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN_DEV }} - VITE_KC_SKIP_AUTH: true - IS_UBUNTU: ${{ startsWith(matrix.os, 'ubuntu') && 'true' || 'false' }} - #DEBUG: 'pw:browser*' - - name: send to axiom - if: ${{ !cancelled() && (success() || failure()) && !startsWith(matrix.os, 'windows') }} - shell: bash - run: | - node playwrightProcess.mjs | tee /tmp/github-actions.log - - uses: actions/upload-artifact@v4 - if: ${{ !cancelled() && (success() || failure()) }} - with: - name: test-results-electron-${{ matrix.os }}-${{ github.sha }} - path: test-results/ - include-hidden-files: true - retention-days: 30 - overwrite: true - - uses: actions/upload-artifact@v4 - if: ${{ !cancelled() && (success() || failure()) }} - with: - name: playwright-report-electron-${{ matrix.os }}-${{ github.sha }} - path: playwright-report/ - include-hidden-files: true - retention-days: 30 - overwrite: true diff --git a/.github/workflows/publish-apps-release.yml b/.github/workflows/publish-apps-release.yml new file mode 100644 index 000000000..2afb540e2 --- /dev/null +++ b/.github/workflows/publish-apps-release.yml @@ -0,0 +1,160 @@ +name: publish-apps-release + +on: + release: + types: [published] + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + publish-apps-release: + runs-on: ubuntu-22.04 + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: 'yarn' + + - name: Find tag workflow id + id: tag_workflow_id + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + id=$(gh run ls --repo kittycad/modeling-app -w build-apps.yml --branch ${{ github.event.release.tag_name }} --json databaseId | jq '.[0].databaseId') + echo "id=$id" >> "$GITHUB_OUTPUT" + + - uses: actions/download-artifact@v4 + with: + name: out-arm64-win + path: out + run-id: ${{ steps.tag_workflow_id.outputs.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + + - uses: actions/download-artifact@v4 + with: + name: out-x64-win + path: out + run-id: ${{ steps.tag_workflow_id.outputs.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + + - uses: actions/download-artifact@v4 + with: + name: out-yml-win + path: out + run-id: ${{ steps.tag_workflow_id.outputs.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + + - uses: actions/download-artifact@v4 + with: + name: out-arm64-mac + path: out + run-id: ${{ steps.tag_workflow_id.outputs.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + + - uses: actions/download-artifact@v4 + with: + name: out-x64-mac + path: out + run-id: ${{ steps.tag_workflow_id.outputs.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + + - uses: actions/download-artifact@v4 + with: + name: out-yml-mac + path: out + run-id: ${{ steps.tag_workflow_id.outputs.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + + - uses: actions/download-artifact@v4 + with: + name: out-arm64-linux + path: out + run-id: ${{ steps.tag_workflow_id.outputs.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + + - uses: actions/download-artifact@v4 + with: + name: out-x64-linux + path: out + run-id: ${{ steps.tag_workflow_id.outputs.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + + - uses: actions/download-artifact@v4 + with: + name: out-yml-linux + path: out + run-id: ${{ steps.tag_workflow_id.outputs.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + + - uses: actions/download-artifact@v4 + with: + name: out-download-json + path: out + run-id: ${{ steps.tag_workflow_id.outputs.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + + - name: List artifacts + run: ls -R out + + - name: Override release notes + env: + NOTES: ${{ github.event.release.body }} + run: yarn files:set-notes + + - name: Authenticate to Google Cloud + uses: 'google-github-actions/auth@v2.1.7' + with: + credentials_json: '${{ secrets.GOOGLE_CLOUD_DL_SA }}' + + - name: Set up Google Cloud SDK + uses: google-github-actions/setup-gcloud@v2.1.2 + with: + project_id: ${{ env.GOOGLE_CLOUD_PROJECT_ID }} + + - name: Upload release files to public bucket + uses: google-github-actions/upload-cloud-storage@v2.2.1 + with: + path: out + glob: '*' + parent: false + destination: 'dl.kittycad.io/releases/modeling-app' + + - name: Invalidate bucket cache on latest*.yml and last_download.json files + run: yarn files:invalidate-bucket + + - name: Upload release files to Github + if: ${{ github.event_name == 'release' }} + uses: softprops/action-gh-release@v2 + with: + files: 'out/Zoo*' + + + announce_release: + needs: [publish-apps-release] + runs-on: ubuntu-22.04 + steps: + - name: Check out code + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.x' + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install requests + + - name: Announce Release + env: + DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} + RELEASE_VERSION: ${{ github.event.release.tag_name }} + RELEASE_BODY: ${{ github.event.release.body }} + run: python public/announce_release.py diff --git a/.github/workflows/static-analysis.yml b/.github/workflows/static-analysis.yml index 155160e88..8908acd98 100644 --- a/.github/workflows/static-analysis.yml +++ b/.github/workflows/static-analysis.yml @@ -81,6 +81,31 @@ jobs: - name: Run codespell run: codespell --config .codespellrc # Edit this file to tweak the typo list and other configuration. + yarn-unit-test-kcl-samples: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: 'yarn' + + - run: yarn install + - run: yarn build:wasm + + - run: yarn simpleserver:bg + if: ${{ github.event_name != 'release' && github.event_name != 'schedule' }} + + - name: Install Chromium Browser + if: ${{ github.event_name != 'release' && github.event_name != 'schedule' }} + run: yarn playwright install chromium --with-deps + + - name: run unit tests for kcl samples + if: ${{ github.event_name != 'release' && github.event_name != 'schedule' }} + run: yarn test:unit:kcl-samples + env: + VITE_KC_DEV_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN_DEV }} yarn-unit-test: runs-on: ubuntu-latest diff --git a/.gitignore b/.gitignore index baa59a3d4..dffca3ff0 100644 --- a/.gitignore +++ b/.gitignore @@ -61,6 +61,7 @@ Mac_App_Distribution.provisionprofile *.tsbuildinfo src/wasm-lib/pkg +.eslintcache venv .vite/ diff --git a/.nvmrc b/.nvmrc index 78b913db0..dc0bb0f43 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v21.7.3 +v22.12.0 diff --git a/INSTALL.md b/INSTALL.md new file mode 100644 index 000000000..db69cc499 --- /dev/null +++ b/INSTALL.md @@ -0,0 +1,43 @@ +# Setting Up Zoo Modeling App + +Compared to other CAD software, getting Zoo Modeling App up and running is quick and straightforward across platforms. It's about 100MB to download and is quick to install. + +## Windows + +1. Download the [Zoo Modeling App installer](https://zoo.dev/modeling-app/download) for Windows and for your processor type. + +2. Once downloaded, run the installer `Zoo Modeling App-{version}-{arch}-win.exe` which should take a few seconds. + +3. The installation happens at `C:\Program Files\Zoo Modeling App`. A shortcut in the start menu is also created so you can run the app easily by clicking on it. + +## macOS + +1. Download the [Zoo Modeling App installer](https://zoo.dev/modeling-app/download) for macOS and for your processor type. + +2. Once downloaded, open the disk image `Zoo Modeling App-{version}-{arch}-mac.dmg` and drag the applications to your `Applications` directory. + +3. You can then open your `Applications` directory and double-click on `Zoo Modeling App` to open. + + +## Linux + +1. Download the [Zoo Modeling App installer](https://zoo.dev/modeling-app/download) for Linux and for your processor type. + +2. Install the dependencies needed to run the [AppImage format](https://appimage.org/). + - On Ubuntu, install the FUSE library with these commands in a terminal. + ```bash + sudo apt update + sudo apt install libfuse2 + ``` + - Optionally, follow [these steps](https://github.com/probonopd/go-appimage/blob/master/src/appimaged/README.md#initial-setup) to install `appimaged`. It is a daemon that makes interacting with AppImage files more seamless. + - Once installed, copy the downloaded `Zoo Modeling App-{version}-{arch}-linux.AppImage` to the directory of your choice, for instance `~/Applications`. + + - `appimaged` should automatically find it and make it executable. If not, run: + ```bash + chmod a+x ~/Applications/Zoo\ Modeling\ App-{version}-{arch}-linux.AppImage + ``` + +3. You can double-click on the AppImage to run it, or in a terminal with this command: + ```bash + ~/Applications/Zoo\ Modeling\ App-{version}-{arch}-linux.AppImage + ``` diff --git a/Makefile b/Makefile index 5b01a2652..319de60af 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ $(XSTATE_TYPEGENS): $(TS_SRC) yarn xstate typegen 'src/**/*.ts?(x)' public/wasm_lib_bg.wasm: $(WASM_LIB_FILES) - yarn build:wasm-dev + yarn build:wasm node_modules: package.json yarn.lock yarn install diff --git a/README.md b/README.md index c1123ea95..66ec43de4 100644 --- a/README.md +++ b/README.md @@ -99,7 +99,7 @@ yarn tron:start This will start the application and hot-reload on changes. -Devtools can be opened with the usual Cmd/Ctrl-Shift-I. +Devtools can be opened with the usual Cmd-Opt-I (Mac) or Ctrl-Shift-I (Linux and Windows). To build, run `yarn tron:package`. @@ -110,7 +110,7 @@ Which commands from setup are one off vs need to be run every time? The following will need to be run when checking out a new commit and guarantees the build is not stale: ```bash yarn install -yarn build:wasm-dev # or yarn build:wasm for slower but more production-like build +yarn build:wasm yarn start # or yarn build:local && yarn serve for slower but more production-like build ``` @@ -128,45 +128,37 @@ Before you submit a contribution PR to this repo, please ensure that: ## Release a new version -#### 1. Bump the versions by running `./make-release.sh` +#### 1. Create a 'Cut release $VERSION' issue -The `./make-release.sh` script has git commands to pull main but to be sure you can run the following git commands to have a fresh `main` locally. +It will be used to document changelog discussions and release testing. + +https://github.com/KittyCAD/modeling-app/issues/new + +#### 2. Push a new tag + +Create a new tag and push it to the repo. The `semantic-release.sh` script will automatically bump the minor part, which we use the most. For instance going from `v0.27.0` to `v0.28.0`. ``` -git branch -D main -git checkout main -git pull origin -./make-release.sh -# Copy within the back ticks and paste the stdout of the change log -git push --set-upstream origin +VERSION=$(./scripts/semantic-release.sh) +git tag $VERSION +git push origin --tags ``` -That will create the branch with the updated json files for you: -- run `./make-release.sh` or `./make-release.sh patch` for a patch update; -- run `./make-release.sh minor` for minor; or -- run `./make-release.sh major` for major. +This will trigger the `build-apps` workflow, set the version, build & sign the apps, and generate release files as well as updater-test artifacts. -After it runs you should just need the push the branch and open a PR. +The workflow should be listed right away [in this list](https://github.com/KittyCAD/modeling-app/actions/workflows/build-apps.yml?query=event%3Apush)). -#### 2. Create a Cut Release PR - -When you open the PR copy the change log from the output of the `./make-release.sh` script into the description of the PR. - -**Important:** Pull request title needs to be prefixed with `Cut release v` to build in release mode and a few other things to test in the best context possible, the intent would be for instance to have `Cut release v1.2.3` for the `v1.2.3` release candidate. - -The PR may then serve as a place to discuss the human-readable changelog and extra QA. The `make-release.sh` tool suggests a changelog for you too to be used as PR description, just make sure to delete lines that are not user facing. - -#### 3. Manually test artifacts from the Cut Release PR +#### 3. Manually test artifacts ##### Release builds -The release builds can be found under the `out-{platform}` zip, at the very bottom of the `build-publish-apps` summary page for each commit on this branch. +The release builds can be found under the `out-{arch}-{platform}` zip files, at the very bottom of the `build-apps` summary page for the workflow (triggered by the tag in 2.). -Manually test against this [list](https://github.com/KittyCAD/modeling-app/issues/3588) across Windows, MacOS, Linux and posting results as comments in the Cut Release PR. +Manually test against this [list](https://github.com/KittyCAD/modeling-app/issues/3588) across Windows, MacOS, Linux and posting results as comments in the issue. ##### Updater-test builds -The other `build-publish-apps` output in Cut Release PRs is `updater-test-{platform}`. As we don't have a way to test this fully automatically, we have a semi-automated process. For macOS, Windows, and Linux, download the corresponding updater-test artifact file, install the app, run it, expect an updater prompt to a dummy v0.255.255, install it and check that the app comes back at that version. +The other `build-apps` output in the release `build-apps` workflow (triggered by 2.) is `updater-test-{arch}-{platform}`. It's a semi-automated process: for macOS, Windows, and Linux, download the corresponding updater-test artifact file, install the app, run it, expect an updater prompt to a dummy v0.255.255, install it and check that the app comes back at that version. The only difference with these builds is that they point to a different update location on the release bucket, with this dummy v0.255.255 always available. This helps ensuring that the version we release will be able to update to the next one available. @@ -182,18 +174,17 @@ If the prompt doesn't show up, start the app in command line to grab the electro ./Zoo Modeling App-{version}-{arch}-linux.AppImage ``` -#### 4. Merge the Cut Release PR +#### 4. Publish the release -This will kick the `create-release` action, that creates a _Draft_ release out of this Cut Release PR merge after less than a minute, with the new version as title and Cut Release PR as description. +Head over to https://github.com/KittyCAD/modeling-app/releases/new, pick the newly created tag and type it in the _Release title_ field as well. +Hit _Generate release notes_ as a starting point to discuss the changelog in the issue. Once done, make sure _Set as the latest release_ is checked, and hit _Publish release_. -#### 5. Publish the release +A new `publish-apps-release` will kick in and you should be able to find it [here](https://github.com/KittyCAD/modeling-app/actions?query=event%3Arelease). On success, the files will be uploaded to the public bucket as well as to the GitHub release, and the announcement on Discord will be sent. -Head over to https://github.com/KittyCAD/modeling-app/releases, the draft release corresponding to the merged Cut Release PR should show up at the top as _Draft_. Click on it, verify the content, and hit _Publish_. +#### 5. Close the issue -#### 6. Profit - -A new Action kicks in at https://github.com/KittyCAD/modeling-app/actions, which can be found under `release` event filter. +If everything is well and the release is out to the public, the issue tracking the release shall be closed. ## Fuzzing the parser @@ -346,13 +337,47 @@ For individual testing: yarn test abstractSyntaxTree -t "unexpected closed curly brace" --silent=false ``` -Which will run our suite of [Vitest unit](https://vitest.dev/) and [React Testing Library E2E](https://testing-library.com/docs/react-testing-library/intro/) tests, in interactive mode by default. +Which will run our suite of [Vitest unit](https://vitest.dev/) and [React Testing Library E2E](https://testing-library.com/docs/react-testing-library/intro) tests, in interactive mode by default. ### Rust tests -```bash +**Dependencies** + +- `KITTYCAD_API_TOKEN` +- `cargo-nextest` +- `just` + +#### Setting KITTYCAD_API_TOKEN +Use the production zoo.dev token, set this environment variable before running the tests + +#### Installing cargonextest + +``` cd src/wasm-lib -KITTYCAD_API_TOKEN=XXX cargo test -- --test-threads=1 +cargo search cargo-nextest +cargo install cargo-nextest +``` + +#### just +install [`just`](https://github.com/casey/just?tab=readme-ov-file#pre-built-binaries) + +#### Running the tests + +```bash +# With just +# Make sure KITTYCAD_API_TOKEN= is set +# Make sure you installed cargo-nextest +# Make sure you installed just +cd src/wasm-lib +just test +``` + +```bash +# Without just +# Make sure KITTYCAD_API_TOKEN= is set +# Make sure you installed cargo-nextest +cd src/wasm-lib +export RUST_BRACKTRACE="full" && cargo nextest run --workspace --test-threads=1 ``` Where `XXX` is an API token from the production engine (NOT the dev environment). @@ -397,23 +422,6 @@ yarn test:unit:local #### E2E Tests -**Playwright Browser** - -These E2E tests run in a browser (without electron). -There are tests that are skipped if they are ran in a windows OS or Linux OS. We can use playwright tags to implement test skipping. - -Breaking down the command `yarn test:playwright:browser:chrome:windows` -- The application is `playwright` -- The runtime is a `browser` -- The specific `browser` is `chrome` -- The test should run in a `windows` environment. It will skip tests that are broken or flaky in the windows OS. - -``` -yarn test:playwright:browser:chrome -yarn test:playwright:browser:chrome:windows -yarn test:playwright:browser:chrome:ubuntu -``` - **Playwright Electron** These E2E tests run in electron. There are tests that are skipped if they are ran in a windows, linux, or macos environment. We can use playwright tags to implement test skipping. @@ -459,3 +467,9 @@ PS: for the debug panel, the following JSON is useful for snapping the camera ## KCL For how to contribute to KCL, [see our KCL README](https://github.com/KittyCAD/modeling-app/tree/main/src/wasm-lib/kcl). + +### Logging + +To display logging (to the terminal or console) set `ZOO_LOG=1`. This will log some warnings and simple performance metrics. To view these in test runs, use `-- --nocapture`. + +To enable memory metrics, build with `--features dhat-heap`. diff --git a/assets/icon-nightly.ico b/assets/icon-nightly.ico new file mode 100644 index 000000000..65c133520 Binary files /dev/null and b/assets/icon-nightly.ico differ diff --git a/assets/icon-nightly.png b/assets/icon-nightly.png new file mode 100644 index 000000000..910bcdab4 Binary files /dev/null and b/assets/icon-nightly.png differ diff --git a/assets/icon.icns b/assets/icon.icns deleted file mode 100644 index 32cbf7444..000000000 Binary files a/assets/icon.icns and /dev/null differ diff --git a/assets/icon.ico b/assets/icon.ico index dff715e40..8f72011a2 100644 Binary files a/assets/icon.ico and b/assets/icon.ico differ diff --git a/assets/icon.png b/assets/icon.png index f9ab2b458..7a5e4a754 100644 Binary files a/assets/icon.png and b/assets/icon.png differ diff --git a/assets/icon@2x.icns b/assets/icon@2x.icns deleted file mode 100644 index 9ca1da735..000000000 Binary files a/assets/icon@2x.icns and /dev/null differ diff --git a/docs/kcl/KNOWN-ISSUES.md b/docs/kcl/KNOWN-ISSUES.md index 0077b7e20..bfb702307 100644 --- a/docs/kcl/KNOWN-ISSUES.md +++ b/docs/kcl/KNOWN-ISSUES.md @@ -22,3 +22,5 @@ once fixed in engine will just start working here with no language changes. - **Chamfers**: Chamfers cannot intersect, you will get an error. Only simple chamfer cases work currently. + +- **Appearance**: Changing the appearance on a loft does not work. diff --git a/docs/kcl/abs.md b/docs/kcl/abs.md index d0b95a0d4..f39d8d358 100644 --- a/docs/kcl/abs.md +++ b/docs/kcl/abs.md @@ -36,9 +36,9 @@ myAngle = -120 sketch001 = startSketchOn('XZ') |> startProfileAt([0, 0], %) |> line([8, 0], %) - |> angledLine({ angle: abs(myAngle), length: 5 }, %) + |> angledLine({ angle = abs(myAngle), length = 5 }, %) |> line([-5, 0], %) - |> angledLine({ angle: myAngle, length: 5 }, %) + |> angledLine({ angle = myAngle, length = 5 }, %) |> close(%) baseExtrusion = extrude(5, sketch001) diff --git a/docs/kcl/acos.md b/docs/kcl/acos.md index 72b8cfb70..192740ad7 100644 --- a/docs/kcl/acos.md +++ b/docs/kcl/acos.md @@ -34,8 +34,8 @@ acos(num: number) -> number sketch001 = startSketchOn('XZ') |> startProfileAt([0, 0], %) |> angledLine({ - angle: toDegrees(acos(0.5)), - length: 10 + angle = toDegrees(acos(0.5)), + length = 10 }, %) |> line([5, 0], %) |> lineTo([12, 0], %) diff --git a/docs/kcl/angleToMatchLengthX.md b/docs/kcl/angleToMatchLengthX.md index 455ae4d94..bc0e5e445 100644 --- a/docs/kcl/angleToMatchLengthX.md +++ b/docs/kcl/angleToMatchLengthX.md @@ -1,10 +1,10 @@ --- title: "angleToMatchLengthX" -excerpt: "Compute the angle (in degrees) in o" +excerpt: "Returns the angle to match the given length for x." layout: manual --- -Compute the angle (in degrees) in o +Returns the angle to match the given length for x. diff --git a/docs/kcl/angleToMatchLengthY.md b/docs/kcl/angleToMatchLengthY.md index e758fb79c..c13dac5d1 100644 --- a/docs/kcl/angleToMatchLengthY.md +++ b/docs/kcl/angleToMatchLengthY.md @@ -33,8 +33,8 @@ sketch001 = startSketchOn('XZ') |> startProfileAt([0, 0], %) |> line([1, 2], %, $seg01) |> angledLine({ - angle: angleToMatchLengthY(seg01, 15, %), - length: 5 + angle = angleToMatchLengthY(seg01, 15, %), + length = 5 }, %) |> yLineTo(0, %) |> close(%) diff --git a/docs/kcl/angledLine.md b/docs/kcl/angledLine.md index 5f7b176c8..0d18e2b4f 100644 --- a/docs/kcl/angledLine.md +++ b/docs/kcl/angledLine.md @@ -32,7 +32,7 @@ angledLine(data: AngledLineData, sketch: Sketch, tag?: TagDeclarator) -> Sketch exampleSketch = startSketchOn('XZ') |> startProfileAt([0, 0], %) |> yLineTo(15, %) - |> angledLine({ angle: 30, length: 15 }, %) + |> angledLine({ angle = 30, length = 15 }, %) |> line([8, -10], %) |> yLineTo(0, %) |> close(%) diff --git a/docs/kcl/angledLineOfXLength.md b/docs/kcl/angledLineOfXLength.md index 83bfdbbdb..dc87fe75a 100644 --- a/docs/kcl/angledLineOfXLength.md +++ b/docs/kcl/angledLineOfXLength.md @@ -31,8 +31,8 @@ angledLineOfXLength(data: AngledLineData, sketch: Sketch, tag?: TagDeclarator) - ```js sketch001 = startSketchOn('XZ') |> startProfileAt([0, 0], %) - |> angledLineOfXLength({ angle: 45, length: 10 }, %, $edge1) - |> angledLineOfXLength({ angle: -15, length: 20 }, %, $edge2) + |> angledLineOfXLength({ angle = 45, length = 10 }, %, $edge1) + |> angledLineOfXLength({ angle = -15, length = 20 }, %, $edge2) |> line([0, -5], %) |> close(%, $edge3) diff --git a/docs/kcl/angledLineOfYLength.md b/docs/kcl/angledLineOfYLength.md index 180fe540d..1bf5da882 100644 --- a/docs/kcl/angledLineOfYLength.md +++ b/docs/kcl/angledLineOfYLength.md @@ -32,9 +32,9 @@ angledLineOfYLength(data: AngledLineData, sketch: Sketch, tag?: TagDeclarator) - exampleSketch = startSketchOn('XZ') |> startProfileAt([0, 0], %) |> line([10, 0], %) - |> angledLineOfYLength({ angle: 45, length: 10 }, %) + |> angledLineOfYLength({ angle = 45, length = 10 }, %) |> line([0, 10], %) - |> angledLineOfYLength({ angle: 135, length: 10 }, %) + |> angledLineOfYLength({ angle = 135, length = 10 }, %) |> line([-10, 0], %) |> line([0, -30], %) diff --git a/docs/kcl/angledLineThatIntersects.md b/docs/kcl/angledLineThatIntersects.md index f0cce7cd9..754654ccf 100644 --- a/docs/kcl/angledLineThatIntersects.md +++ b/docs/kcl/angledLineThatIntersects.md @@ -35,9 +35,9 @@ exampleSketch = startSketchOn('XZ') |> lineTo([-10, 10], %, $lineToIntersect) |> lineTo([0, 20], %) |> angledLineThatIntersects({ - angle: 80, - intersectTag: lineToIntersect, - offset: 10 + angle = 80, + intersectTag = lineToIntersect, + offset = 10 }, %) |> close(%) diff --git a/docs/kcl/angledLineToX.md b/docs/kcl/angledLineToX.md index d664df4d6..792ecdfd7 100644 --- a/docs/kcl/angledLineToX.md +++ b/docs/kcl/angledLineToX.md @@ -31,7 +31,7 @@ angledLineToX(data: AngledLineToData, sketch: Sketch, tag?: TagDeclarator) -> Sk ```js exampleSketch = startSketchOn('XZ') |> startProfileAt([0, 0], %) - |> angledLineToX({ angle: 30, to: 10 }, %) + |> angledLineToX({ angle = 30, to = 10 }, %) |> line([0, 10], %) |> line([-10, 0], %) |> close(%) diff --git a/docs/kcl/angledLineToY.md b/docs/kcl/angledLineToY.md index f32952c5c..054141eae 100644 --- a/docs/kcl/angledLineToY.md +++ b/docs/kcl/angledLineToY.md @@ -31,9 +31,9 @@ angledLineToY(data: AngledLineToData, sketch: Sketch, tag?: TagDeclarator) -> Sk ```js exampleSketch = startSketchOn('XZ') |> startProfileAt([0, 0], %) - |> angledLineToY({ angle: 60, to: 20 }, %) + |> angledLineToY({ angle = 60, to = 20 }, %) |> line([-20, 0], %) - |> angledLineToY({ angle: 70, to: 10 }, %) + |> angledLineToY({ angle = 70, to = 10 }, %) |> close(%) example = extrude(10, exampleSketch) diff --git a/docs/kcl/appearance.md b/docs/kcl/appearance.md new file mode 100644 index 000000000..a9ad33d92 --- /dev/null +++ b/docs/kcl/appearance.md @@ -0,0 +1,239 @@ +--- +title: "appearance" +excerpt: "Set the appearance of a solid. This only works on solids, not sketches or individual paths." +layout: manual +--- + +Set the appearance of a solid. This only works on solids, not sketches or individual paths. + +This will work on any solid, including extruded solids, revolved solids, and shelled solids. + +```js +appearance(data: AppearanceData, solid_set: SolidSet) -> SolidSet +``` + + +### Arguments + +| Name | Type | Description | Required | +|----------|------|-------------|----------| +| `data` | [`AppearanceData`](/docs/kcl/types/AppearanceData) | Data for appearance. | Yes | +| `solid_set` | [`SolidSet`](/docs/kcl/types/SolidSet) | A solid or a group of solids. | Yes | + +### Returns + +[`SolidSet`](/docs/kcl/types/SolidSet) - A solid or a group of solids. + + +### Examples + +```js +// Add color to an extruded solid. +exampleSketch = startSketchOn("XZ") + |> startProfileAt([0, 0], %) + |> lineTo([10, 0], %) + |> lineTo([0, 10], %) + |> lineTo([-10, 0], %) + |> close(%) + +example = extrude(5, exampleSketch) + |> appearance({ + color = '#ff0000', + metalness = 50, + roughness = 50 + }, %) +``` + +![Rendered example of appearance 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAADyoUlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquu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ZEA8JwPiORkQz8mAeE4GxHMyIJ6TAfGcDIjnZEA8JwPiORkQz8mAeE4GxHMyIJ6TAfGcDIjnZEA8JwPiORkQz8mAeE4GxHMyIJ6TAfGcDIjnZEA8JwPiORkQz8mAeE4GxHMyIJ6TAfGcDIjnZEA80z/8wz/89n333XcrV1111VVXXfUfCz3oQQ/iqquuuuqqq6666qqrrrrqqquuuuqqq676P4nKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+r+EdIks2wWqjO4wAAAABJRU5ErkJggg==) + +```js +// Add color to a revolved solid. +sketch001 = startSketchOn('XY') + |> circle({ center = [15, 0], radius = 5 }, %) + |> revolve({ angle = 360, axis = 'y' }, %) + |> appearance({ + color = '#ff0000', + metalness = 90, + roughness = 90 + }, %) +``` + +![Rendered example of appearance 1](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAG180lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666n+1a6655sE805kzZx7Mc7nmmmsezL/gvvvuu5UHOHv27K0803333XcrV1111VVXXXXVVVf9b0Xlqquuuuqqq6666qr/Ea655poHA5w5c+bB11xzzYPPnDnzIJ7pmmuuefA111zzYIAzZ848+Jprrnkw/wX27r6bneuvB+C+++67lWc6e/bsrffdd9+tAPfdd9+tZ8+efQbAfffddyvAP/zDP/w2V1111VVXXXXVVVf9T4Ae9KAHcdVVV1111VVXXXXVf75rrrnmwWfOnHnwNddc8+AzZ848CODFX/zFX/vMmTMPvuaaax7Mc9m75x4E7N19N/v33MP+3XcDsH/PPdxv/557eKD9u+9GwP499/CvsX3dddzPPNv29dcDsH3ddQBsX3cd29dfz/22r7sOgO3rr2fnuut4oPvuu+9WgLNnz95633333Xrffffdevbs2Wfcd999t549e/bW++6771auuuqqq6666qqrrvrPhh70oAdx1VVXXXXVVVddddV/jGuuuebBAC/2Yi/22mfOnHnQi7/4i782wIu92Iu9Ng+wf8897N19N3f91V8BsH/PPezfcw8AB3ffzf4993A/8ZzEfz3zvMzz2rruOgC2r7+e7euuY/u669i+/nq2r7uO7euvZ+e667jffffddyvAH/3Gb/z2znXX8Q//8A+/c9999936D//wD7/NVVddddVVV1111VX/UdCDHvQgrrrqqquuuuqqq67617vmmmse/GIv9mKvfebMmQe9+Iu/+Gu/2Iu92GvzTHv33IOAO//qr9i/+24A7vrrv+auv/orxBXi2cTzEs+f+K9nXjDzvMyzmWczsH3ddQDc8DIvg4EbX+Zl2L7uOm58mZfhfvfdd9+tT/nbv711Xcqt//AP//A79913363/8A//8NtcddVVV1111VVXXfWvhR70oAdx1VVXXXXVVVddddULds011zwY4LVf+7XfC+DFX/zFX/vFXuzFXhtg7557EPCEX/xFAO7667/mrr/6K8QV4tnEs4nnJJ4/8S8TgMR/NNv8S8zzZ56TeU7m2cwVBravu46t669n+7rruOFlXoad667jxpd5GQDuu+++WwH+4R/+4bf/4R/+4Xfuu+++W//hH/7ht7nqqquuuuqqq6666oVBD3rQg7jqqquuuuqqq6666tmuueaaB7/Yi73Ya585c+ZBL/7iL/7aL/ZiL/baAHv33MP+3Xdz11/9Ffv33MP+Pfdw91/9FQDiCvFs4tnEcxLPnyReGPHfw7wIbMzzMs/JPCfzbOYKc4W5Yuu669i+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9V9z91/9FQIECBAgQFwhrpAEgHg2cYV4NvFs4jmJ5ySek3he4pkkHki8YOKFEy868b+TedGZf5l5wcwD2ACY52Wel3lO5jmZ52SezTybucI8m20AzBUGzBUGzBUGDCSwde21vOL7vi+PfdM35b777rv1t37rt777R3/0Rz+Hq6666qqrrrrqqv9Y6EEPehBXXXXVVVddddVV/xGuueaaB7/2a7/2e73TO73TZ+/dfTeP/6Vf4s+/67sQIECAAAECxBXiCkkAiCvEs4krxLOJ5ySek3hO4nmJZ5K4n3j+xAsn/mXi30f81zL/duZFY1448/yZ52IDYJ6XeU7mOZnnZJ7NPJt5NvNs5grbAJgrzBUGzBUGDBhIYPvaa3nUm74pr/y+78t9991362/91m9994/+6I9+DlddddVVV1111VX/MdCDHvQgrrrqqquuuuqqq/49rrnmmge/9mu/9nu90zu902fv3X03j/+lX+LPv+u7CECAAHGFAHGFAAFIiGcTV4hnE88mnk08J/GcxPMSgMQDieclXjDxLxMvOvG/l/nXMf8y84KZ52Weiw2AeU7meZnnZJ7NPJt5TuYK82zmCtsAmCvMFQbMFQYMGEhg+9predSbvimPfZM3YVXKrb/1W7/13b/927/9Pffdd9+tXHXVVVddddVVV/3boQc96EFcddVVV1111VVX/Vtcc801D37t137t93qnd3qnz967+24e/0u/xJ9/13cRgAABAsQV4goBkgAQV4hnE88mnk08m3hO4jmJ5yQAiQcSz0s8f+KFEy8a8e8j/muZfx/zojEvnHn+zPNnHsAGwDwn85zMczLPyTybeTbzbOYKc4VtAMwV5goD5goDBgwY2Lr2Wm54mZfhMW/6pvQ33njrb/3Wb333b//2b3/PfffddytXXXXVVVddddVV/3roQQ96EFddddVVV1111VX/Gtdcc82DX/u1X/u93umd3umz9+6+m8f/0i/x59/1XQQgQIAAcYUAcYUkAMQV4tnEFeLZxLOJ5ySek3hOApC4n3j+xPMnXjDxwol/PfG/k/nXMf8y84KZ5888f+YBbMzzMs/JPCfzbObZzLOZZzNXmCtscz8D5goD5goDBgwYSJtHv8mb8Erv+76sSrn1t37rt777t3/7t7/nvvvuu5WrrrrqqquuuuqqFx160IMexFVXXXXVVVddddWL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P8jeb/wGz808m4FPLeUh1HorV1111VVXXfWfCz3oQQ/iqquuuuqqq/6ztWl68KPPnn36DKgSBQggAEkIECBAgAAB4goBApAQIK4QUIAChEQBAgiJAAIIICQEBCAgAEkEIECAgJAQIECAAAECJCFAXCFAgCQEiCsECBBXCJAEgLhCXCGuEICEeDbxbOI5iReNeU7mCnOFucJcYRsD5goDBgykjYEEDKRNA24t5bd/dnv7dbjqqqv+U1x//vxvnRiG164SBQhAQAACJCFAXCFAgLhCgLhCXCEJcYW4QlwhrhBXiGfbue46rn+Zl+GRb/ImXP8yL8NzO7jnHu7967/m3r/6K47uuYdzf/M3BBBASAQgICQCEBASAgKQhAABAUhCgAABkhAgQIAkBAgQIAkAAQIEICFAgLhCEgDiCgECkAAQV4hn66+9lp3Xf30ATr3ru/JA4733svcbv8H+r/8643338cKYKwx86mwmrrrqqquuuuo/H3rQgx7EVVddddVVV/1XuO78+d86NQyvXSUKEEAAISFAgAABAsQVAgQIQEJcIUBAAQoQEgUIICQCCCCAkBAQgIAAJCEgAAECJBGAAAECBAiQhLhCgAABAiQhrhAgrhAgAAkB4gpxhbhCXCGJ+4lnE89LvHDmOZlnM1eYK8wVtjFgrjBgwEDaGDCQQNo0IIGvns9fp87nv81VV131H+6Rd9/tmUQBAghAgABJCBAgQIC4QoC4QoC4QgAS4gpxhbhCXCGuEFeIZxOwdd11bF93Hde/zMtw/cu8DNe/zMvw3A7vuQeAc3/915z7m79hec89LO+5h9W99xKAgJAQICAkBAgIQBICBAiQhAABAiQhQIAASQAIECBAEgACxBWSABAgrhCAhIDu2mvprrmGjZd4CTZe8iXZeImX4LmN997L3m/8Bsu//VuWf//33E9cYZ4/c8VTI37727vudbjqqquuuuqq/3xUrrrqqquuuuq/SLNJwIB5NgPieRkQz2ZAPCcDBswLZ0C8aAyI58+AeP4MiP86BsTzZ/4NbB7IPJt5/sQVr9vae/0u/DZXXXXVf6j53t5nVUCAAHGFAEkIECCek3g28bzEFeIKcYW4QvzLDu65h8N77uGev/5r/uq7vovt664DiRte+qW5/mVflq3rruPal35pADbf+I150Bu/Mfc7uuceJHF0992s7r2Xi3/z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IECAeMEECBAgQIAAAQLECyZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCePwECBAgQIECAeP4ECBAgQIB4/gQIECBAgHjhBAgQIED86wkQIECAAAECBIgXTIAAAeI/nnn+QiKAkAggJAIQEBICJCFAgCQECJCEAAGSCECAJAQIkIQAAQIECBAgCQECJCFAgCQECBAgCQECkAAQIEAS9xOABIC4Qlwhnk0AEgDi2T57vX4frrrqqquuuuoqAIKrrrrqqquuuuqKWm+95/jx9xltRpsBGIEJaEACCRgwYCBtEjBgwIABAwbMsxkwYMCAAfOcDBgwVxgwgI0Bc4W5wlxhrjBX2OZ+5tnMczIvnAEDBgyY/0AS/xJxhXg2AeLZBAgQz58kxLMJECAJAQIEhIQAAeJfJkCAAAECBAgQL5wAAQIECBAgQIAAAQIEiP86AgQIECBAgAABAgQIECCePwECBAgQIECAeP4ECBAgQIB44QQIECBAgHjRCRAgQIAAAeI/lvjXMf96IRFASAQQEgEICAkBISEgAEkEIEASAQiQhAABkhAgQFwhQIAkBAiQhAABkhAgQIAAAQIkIZ5NgAABSAAIEICEeDYBSIhnE4AEgHi2r5ZeJ+fz3+aqq6666qqrrgKgHD9+nKuuuuqqq6666oro+79eArNheO0ABBQgJARIQoAkBAiQhAAB4gpJ3E88gMQLJCFAPJsAcYUASQCIKwSIK8SziSskcT/xbOJ5if864nmJK8QLICGek3gACfECSLxIJO4nQIAAAQIEiBeNAAECBAgQIECAAPGiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECD+ZQIECBAgQIAAAQLECyZAgAABAgSIF06AAAECBIgXjQABAgQIECD+a4n/GOZ5hUQAIRFASAQgICQEhISAACQhIABJCAhAEgIEBCAJAQIkISAASQgQIAkBAiQhQIAASQgQIAkAAQIkIUAAEgLEFZIQV4grJAEgrhCABIB4tifDb/+i9DlcddVVV1111VX3oxw/fpyrrrrqqquuuurZxlKeoXF86dragwECCCAkQkKAAEkACJCEAHGFACTEc5KEAAECBIgHkAAQIJ5NPJskAASIK8QV4tnEFZK4n3hO4nmJfxvzbyOeP3GFeF7iOYlnkgAQLyKJBxKA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hbjionTrRenWp0m//Wvj+Duez3+bq6666qqrrrrqqqueG3rQgx7EVVddddVVV1111VUvgml68M44vvaLlfKgB7X22juZDz5uP5h/gXjhxPMniedHPH/i+ROAxAOJ5yWek3gmCQDxvMSziWeSABDPJp5NPJsk7ieeTVwhCYBd6dYLcOvTIn77N5bLZ+TW1ndz1VVXXXXVVVddddWLAj3oQQ/iqquuuuqqq6666qp/o2l68DH7wTdLD7plml77mP3gW1p7bZ4P8YIJQOL5Ec+feP7EM0ncTzwv8bzEM0kAiOcknpN4JgnxnMSziWeTxP3EFeKKixG3AvxlxHcD/Po4/o7n89/mqquuuuqqq6666qp/K/SgBz2Iq6666qqrrrrqqqv+g03Tg4/ZD2KaHvLqEa91PPPBSNzS2mvzQojnTzx/4gEk7ieel3hO4rlIiOcknpN4AAnxbOLZxLNJ4n4CLkq3Crgo3fq0iN8G+I1x/G3P57/DVVddddVVV1111VX/0dCDHvQgrrrqqquuuuqqq676LzRNDz5mP5hpevCDuo4HtfZaAMfsBx/PfPAx+8E8F/FcJO4nnpd4XuI5SeK5iecknpMk7ieeTVxh4FLErQC70q0XpVsvwq1/NY7PuCjd6vn8t7nqqquuuuqqq6666r8SetCDHsRVV1111VVXXXXVVf/DTNODAB23H8w0PRjgQV3n4/aDj9sPBjiW+WCA4/aDeabj9oPF85LEA4nnJa4wcEm6VRIGdqVbBVyUbhVwUboVYLc1np75jF3pVmq91bXeylVXXXXVVVddddVV/9OgBz3oQVx11VVXXXXVVVdd9X/UND2YKwyI52RqfQZXXXXVVVddddVVV/1fRuWqq6666qqrrrrqqv+7ar2Vq6666qqrrrrqqqv+P6Ny1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fxT8CnUeMu8NyhNgAAAAASUVORK5CYII=) + +```js +// Add color to different solids. +fn cube(center) { + return startSketchOn('XY') + |> startProfileAt([center[0] - 10, center[1] - 10], %) + |> lineTo([center[0] + 10, center[1] - 10], %) + |> lineTo([center[0] + 10, center[1] + 10], %) + |> lineTo([center[0] - 10, center[1] + 10], %) + |> close(%) + |> extrude(10, %) +} + +example0 = cube([0, 0]) +example1 = cube([20, 0]) +example2 = cube([40, 0]) + +appearance({ + color = '#ff0000', + metalness = 50, + roughness = 50 +}, [example0, example1]) +appearance({ + color = '#00ff00', + metalness = 50, + roughness = 50 +}, example2) +``` + +![Rendered example of appearance 2](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAD0IUlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq676b3fNNdc8+MyZMw9+ndd5nffiqquuuuqqq/53E2CekwDznASY5yTAPCcB5jkJMM9JgHlOAsxzEmCekwDznASY5yTAPCcB5jkJMM9JgHlOAsxzEmCekwDznASY5yTAPCcB5jkJMM9JgHlOAsxzEmCekwDznPQP//APv/0P//APv33ffffdylVXXXXVVf+d0IMe9CCuuuqqq6767/W5n/u5v/ViL/Zir33p7ru56qr/D45dfz0Al+6+mxfGXHXV/w3Hr7+e+929ezf/I5irrvpPdf2J67nvvvtu/ZAP+ZCHcNVVV1111X8n9KAHPYirrrrqqqv++3zu537ub73Yi73Ya//ud34nv/ed38m/lbjqqv845j/Xh//Yj3Hs+uv5/o/4CJ7xV3/FfyTzP495Edj8RzP/dcx/PvOfy/znMPDgl3kZ3vfrv567d+/m7b/y7fkPY/7jmf8c5j+e+Tcz5nmY/3jmP575j2X+4xne7w3ej/d7w/fjvvvuu/VDPuRDHsJVV1111VX/XQiuuuqqq676b/O5n/u5v/ViL/Zir/23v/iL/P53ficCBAgQIECAAAECBAgQIECAuOqq/1gCBAgQIECAAAECBAgQIECAAAECxAt27PrrAXjGX/0V/9EECBAgQIAAAQIECBAg/msIECBAgAABAgQIkAQSSCCB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BAgQIP59BPfs3sOHf8uHc8011zz4wz/8w7/rmmuueTBXXXXVVVf9VyC46qqrrrrqP90111zz4A//8A//LoAf/IiP4Pa/+isECBAgQIAAAQIECBAgQPzfJECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAHi/z4BAgQIECBAgAABAgQIECBAgADxgt3yMi8DwG1/9Vf8RxIgQIAAAQIECBAgQPznEiBAgAABAgQIEP/xBAgQIECAAAECxH8sAQIECBAgQBKSQAIJJJBA4l9LgAABAgQIEP9+AgQIECBAgPj3EyBAgAAB4jn99S/9EgDXHb+OF5kAAQIECBD/PgIECBAgQPz7CBAgQID49xEgQIAAAeLfR4AAAQLEv48AAQIEiH+REEIIIYQQzyJAgAAB4t9HgAABAsS/jwABAgSIf7W7L97N5//o53PNNdc8+HM+53N+65prrnkwV1111VVX/WcjuOqqq6666j/dh3/4h3/Xi73Yi732L3zBF3DbX/0V/90ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBD/OwkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIP7nEiBAgAABL/kmb8Kx668HYO+eexAgQIAA8V9DgAABAgQIECBAgADxn0OAAAECBAgQIED8xxMgQIAAAQLEfzwBAgQIECAJSSCBBBJI/FsIECBAgAAB4t9PgAABAgSIfz8BAgRcuvtubv2rv+L649fzMg9+Gf5dBAgQIED8+wkQIECA+PcRIECAAAHi30eAAAECxL+PAAECBIh/HwECBAgQ/yIhhBBCCCGeRYAAAQLEv48AAQIEiH8fAQIECBD/ol/8i1/k83/087nmmmse/Lmf+7m/zVVXXXXVVf/ZCK666qqrrvpP9bmf+7m/9WIv9mKv/fvf+Z383S/9Ev9aAgQIECBAgAABAgQIECBAgAABAgQIECCu+r9EgAABAgQIECBAgAABAgQIECBAgAAB4j/XseuvB+DvfvEXeUEECBAgQIAAAQIECBAg/vMJECBAgAABAgQIEP/xBAgQIECAAAECxH8cAQIECBAgQID4jyVAgAABkpCEJJBAAgkk/i0ECBAgQID49xMgQIAAAQLEv82tf/mXALzMg18GBAgQIED8+wgQIECAAPHvI0CAAAECxL+PAAECBIh/HwECBAgQIP7tBAgQIECA+LcTIECAAAHihRJCCCGEEOJZBAgQIED8+wgQIECA+PcRIECAAPE8fvEvfpHv+LXv4MyZMw/68A//8O/iqquuuuqq/0xUrrrqqquu+k/zuZ/7ub/1Yi/2Yq9921/9FX/wnd+J+P9L/N9j/u8R/z7mBXuJN3kTAG77q7/iP4p40Zn/POJfZv5jiRfO/McQL5j5jyOei8T9zAPY/GuJF8z8+4jnz7xgz/irvwLgTV/6TfnO3/lOnod4/sy/nXj+zL+deF7m3048f+bfTjwv828nnpf5txPPy7xAQjw3Yy4Tz8v824nnZf7txPP4jl//DgDe7w3e770Bvv7rv/59uOqqq6666j8DwVVXXXXVVf8p3vEd3/GzXuzFXuy1b/urv+KHPuIj+O8mQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBD/NwkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECxP9MAgQIECBAgIBj118PwN//0i8hQIAA8V9DgAABAgQIECBAgADxn0OAAAECBAgQIED8xxIgQIAAAQIEiP8YAgQIECBAgADxH0eAAAGSkIQkJIEEEv9WAgQIECBA/PsJECBAgABxxe499wBw/fHruf749bzIBAgQIECA+PcRIECAAAHi306AAAECBIh/HwECBAgQ/z4CBAgQIP59BAgQIED8+wgQIECAeKGEEEIIIZ6DAAECBIh/HwECBAgQ/z6CX/jLX+Avn/aXvM7rvM57v+M7vuNncdVVV1111X8GyvHjx7nqqquuuuo/1ou92Iu99kd8xEd896W77+a73+d9+LcQIECAAAECBAgQIECAAAECBAgQIECAuOr/IgECBAgQIECAAAECBAgQIECAAAECBIj/XC/xJm/CI17zNfm7X/xFnvx7v8dzEyBAgAABAgQIECBAgPjPJ0CAAAECBAgQIP5zCBAgQIAAAQLEfywBAgQIECBA/McRIECAAAECxH8cAQIkIQlJSAIJJP6tBAgQIECA+PcTsD444EEv+7Icv/56nnzvk3nyvU/m30WAAAECxL+fAAECBIh/HwECBAgQ/z4CBAgQIP59BAgQIED8+wgQIECA+PcRIECAAPECCSGEEEII8RwECBAgQPz7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AQIECBAgXrDHvsmbAPC4X/ol9u65h38PAQIECBAgQIAAAeI/hwABAgQIECBA/McSIECAAAECxL+SBBJIIIEEEgIECBAgQID49xMgQIAAAQLEv48AAQIECBD/PgIECBAgQPz7CBAgQID499m75x5u+6u/4vpj1/MyD3oZEP8+AgQIECD+7QQIECBA/KsIIYQQQiBAgAAB4t9OgAABAsS/nQABAsS/nQABAgSIfzsBAgQIEP92AgQIEP92AgQIECD+7QQIECD+ze7evZuP+I6P4MyZMw/68A//8O+65pprHsxVV1111VX3I7jqqquuuuqya6655sEf/uEf/l0AP/6RH8kdf/VX/FcRIECAAAECBAgQIECAAAECBAgQIECAuOp/IgECBAgQIECAAAECBAgQIECAAAECxP8MAgQIECBAwM0v8zLcT4D4zydAgAABAgQIECD+4wkQIECAAAECxH8cAQIECBAgQPwrSCCBBBJIIAEgQIAAAQLEfwwBAgQIECD+fQQIECBAgPj3ESBAgADx7yNAgAABAsSL7hl/9VcAvMlLvgkACBAgQID49xEgQIAA8W8nQIAAAeJFJoQQQgghBAIECBAg/u0ECBAg/u0ECBAgQPzbCRAgQID4txMgQID4txMgQIAA8W8nQIAA8W8nQIAAAeJFdvfu3XzBT3wB11xzzYM/53M+57euueaaB3PVVVdddRUAwVVXXXXVVZd9+Id/+He92Iu92Gv/6hd+IXf81V/xryFAgAABAgQIECBAgAABAgQIEFdd9a8jQIAAAQIECBAgQIAAAQIECBD/uW56mZcB4I+/8zu5nwABAgQIECBAgADxn0uAAAECBAgQIP7jCRAgQIAAAeI/jgABAgQIECBeRBJIIIEEEkgACBAgQIAAAeLfT4AAAQLEv58AAQIEiH8fAQIECBAg/n0ECBAgQDx/t/3VXwHwMre8DC+QAAECBIh/HwECBIh/HwECBIh/FSGEEEIIAAQIECD+7QQIECBA/NsJECBAgPi3EyBAgPi3EyBAgADxbydAgADxbydAgAAB4t9OgAAB4oX6xb/6Rb7jN7+Da6655sGf8zmf81tcddVVV10FQHDVVVdddRWf+7mf+1sv9mIv9tp//J3fyeN/6ZcQIECAAAECBAgQIECA+J9LgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAsT/DgIECBAgQIAAAQIECBD/OjvXXQfA3j338K8lQIAAAQIECBAgQPznECBAgAABAgSI/1gCBAgQIECA+I8jQIAAAQLEi0gCCSSQQAKJ+wkQIECAAPHvI0CAAAECxL+PAAECBAgQ/z4CBAgQIP59BAgQIEDAbX/1VwBcf+x6XuaWl+FFJkCAAAHi306AAAECxL+dAAECBIgXmRBCCCGEEAgQIECA+LcTIECAAPFvJ0CAAPFvJ0CAAAHi306AAAHi306AAAECxL+dAAECxL+dAAECxPP4zt/8Tr7jN7+Da6655sEf/uEf/l1cddVVV11F5aqrrrrq/7kP//AP/64Xe7EXe+07/uqv+JPv+i7+u4ir/i8Q/7HMfz/xonnsm7wJAI/7pV/iP5P4l5n/WOKFM/8xxAtm/v3E82deBBLPw+Z+4vkz/3bi+TP/duJ5mX878bzMv52A2/7qr7jlZV6Gl3nQy/BXt/8VmH8b8bzMv414XubfRjwv8yIR4oGMQTwv828jnpP5txHPy/zbiOdk/m3E8zL/NuI5mX8b8ZzMv414Ht/5m98JwPu97vu9N8DXf/3Xvw9XXXXVVf9/EVx11VVX/T/2ju/4jp/1Oq/zOu99x1/9FT/xkR/Jv4cAAQIECBAgQIAAAQIECBAgQFx11fMnQIAAAQIECBAgQIAAAQIECBD/tR7zJm8CwJ1/9VcIECBAgAABAgSI/1wCBAgQIECAAPEfT4AAAQIECBD/cQQIECBAgADx7ydAgAABAgSIf4EEEkgggQQSDyRAgAAB4t9PgAABAsS/jwABAgQIEP92AgQIECD+dX7/O78TgJe55WW4TIAAAQLEv50AAQIEiH87AQIECBD/dgIECBAgXiRCCCGEEM8iQIAA8W8nQIAAAeLfToAAAeLfToAAAQLEv50AAQLEv50AAQLEv50AAQIEiH87wS/91S/xV0//K17ndV7nvd/xHd/xs7jqqquu+v+L4Kqrrrrq/6kXe7EXe+13eqd3+uy9e+7hJz7yI3kgAQIECBAgQIAAAQIECBD/8wkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIP53ESBAgAABAgQIECBAgADxb3fTy7wMAI/7pV/iRSFAgAABAgQIECBA/OcQIECAAAECBIj/WAIECBAgQID4jyNAgAABAsR/DAECBAgQIP4FEkgggQQSDyRAgAABAsS/jwABAgQIEP8+AgQIECD+7QQIECBAvGCX7r4bgOuOXccLJECAAAHi306AAAECxL+dAAECBIh/OwECBIgXiRBCCCGEEAAIECBAgPi3EyBAgPi3EyBAgADxbydAgADxbydAgADxbydAgAAB4t9OgAAB4l/l7t27+YKf/ALu3r2bd3qnd/rsd3zHd/wsrrrqqqv+fyK46qqrrvp/6MVe7MVe+3M/93N/a++ee/jJj/gIBAgQIP57CRAgQIAAAQIECBAgQIAAAQIkIQlJSEISkpAEEkgggQQSSCCBBBJIIIEEEkgggQQSSCCBBBJIIIEEEkgggQQSSCCBBBJIIIEEEkgggQQSSCCBBBJIIIEEEkgggQQSSCCBBBJIIIEEEkgggQQSSCCBBBJIIIEEEkgggQQSSCCBBBJIICEJAQIECBAgQIAAAQIECBAgQIAAAQIECBD/cwgQIECAAAECBAgQIJ7tsW/yJgA87pd+if9oAgQIECBAgADxn0OAAAECBAgQIP7jCBAgQIAAAeI/hgABAgQIEP8xBAgQIED8CySQQAIJJJ6bAAECBAgQ/z4CBAgQIP59BAgQIED82wkQIECAuOLSPfdw21/9Fdcfu56XueVleJEJECBAgPi3EyBAgADxbydAgADxbydAgAAB4kUihBBCCPEsAgQIEP92AgQIECD+7QQIECD+7QQIECD+7QQIECBA/NsJECBA/NsJECBA/Ivu3r2bD/+OD+fu3bt5ndd5nfd+sRd7sdfmqquuuur/H4Krrrrqqv9nrrnmmgd/7ud+7m8B/NoXfiF799zDfyQBAgQIECBAgAABAgRIQhKSkIQkkEACCSSQQAIJJJBAAgkkkEACiav+C0kggQQSSCCBBBJIIIEEEkgggQQSSCCBBBIAAgQIECBAgAABAgQIECBAgADx30OAgJte5mUAuPOv/goBAgQIECD+8wgQIECAAAECBIj/eAIECBAgQID4jyNAgAABAsR/DAECBAgQIP79BAgQIECAeCEkkEACCSSeHwECBAgQ/z4CBAgQIP59BAgQIED82wkQcNtf/RUA7/vq78u/iwABAsS/jwABAsS/nQABAgSIfzsBAgSIF4kQQgghxLMIECBAgPi3EyBAgPi3EyBAgPi3EyBAgADxbydAgADxbydAgADxbydAgADxfN2zew8f8R0fwTXXXPPgD//wD/+uF3uxF3ttrrrqqqv+fyG46qqrrvp/5JprrnnwN33TNz0d4Cc+8iO586/+ihdEgAABAgQIECBAgCQkIQlJSAIJJJBAAgkkkEACCSSQ+O8mQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLEfxMJJJBAAgkkkEACCSSQQAIJJJC4nwABAgQIECBAgAABAgSI/zg3vszLAHDnX/0VL4gAAQIECBAgQID4zyNAgAABAgQIEP+xBAgQIECAAPEfQ4AAAQIECBD/fgIECBAgQPz7CRAgQIAA8QJIIIEEEkg8PwIECBAg/n0ECBAgQID4txMgQIAA8a/z97/4iwBcf+x6ECBAgADxbydAgAAB4t9OgAABAsS/nQABAsS/nQABAgSIf5EQQgghxHMQIECA+LcTIECAAPFvI0CAAAHi306AAAHi306AAAHi306AAAHi306AAAECxGV3797N23/F23PNNdc8+MM//MO/65prrnkwV1111VX/fxBcddVVV/0/8uEf/uHfBfCTH/mR3PVXf4UAAQIkIQlJSAIJJJBAAgkkkEACif9sAgQIECBAgAABAgQIECBAgAABAgQIECBAgABx1QsiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEiP8kEkgggQQSSCCBBBJIIIHEAwkQIECAAAECBAgQIEA8f495kzdh57rrANi75x7+PQQIECBAgAABAsR/DgECBAgQIED8xxIgQIAAAQLEfwwBAgQIECD+/QQIECBAgPj3EyBAgADxAkgggQQSSDw/AgQIECBA/PsIECBAgPi3EyBAgADxgl265x5u+6u/4rpj1/Eyt7wMz0OAAAECxL+dAAECBIh/OwECBAgQ/zYCBAgQIP7tBAgQIP5FQgghhBDPQYAAAQLEv50AAQLEv50AAQLEv50AAQLEv50AAQLEv50AAQIEiH87AYK7L93N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zS/Di0SAAAECxL+dAAECxL+dAAECxL+dAAECxL+dAAECxL+NAAECBIh/GwECBIh/OwECBIjnIYQQQvyLBAgQIP5tBAgQIP7tBAgQIP7tBAgQIF6ou3fv5gt++gu4e/duXud1Xue9X+zFXuy1ueqqq67634ngqquuuup/oRd7sRd77c/93M/9LYDf/MIv5L+CAAECBAgQIECAAAECBAgQV131nAQIECBAgAABAgQIECBAgPjvIUCAAAECBNz40i8NwF1//deI/zwCBAgQIECAAPEfT4AAAQIEiP94AgQIECBAABJIIIEEEki8qAQIECBAgPj3EyBAgADx7ydAgAAB4t9OgAABAsS/jwABAgSIfzsBAgSIfx8B//BLvwTA+73q+yGEEP9qAgQIEP92AgQIEP92AgQIEP92AgQIEP92AgQIEP92AgQIEP82AgQIEP92AgQIEM9BCCGEEOJfJECAAPFvI0CAAPFvJ0CAAPFvJ0CAAPE87tm9h4/47o/gmmuuefCHf/iHf9eLvdiLvTZXXXXVVf/7EFx11VVX/S9zzTXXPPhzP/dzfwvgZz7yI7nrr/+afwsBAgQIECBAgAABAgSI/x0ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEiP+dBAgQIECAAAECBAgQIP5z3fAyLwPAXX/1VwAIECBAgAABAsR/HgECBAgQIED8xxIgQIAAAQLEfywBAgQIECAACSSQQAKJfw0BAgQIECD+fQQIECBA/PsJECBAgPi3EyBAgADx7yNAgADxbydAgAAB4l/n9r/6KwCuO3YdCBBIQhJCCPGvJkCAAAHi30aAAAECxL+NAAECBIh/GwECBIh/OwECBIh/OwECBIh/GwECBIh/OwECBIjnIIQQQgjxLxIgQID4txEgQID4txMgQID4txMgQIC47O7du3n7r357rrnmmgd/+Id/+Hddc801D+aqq6666n8Xgquuuuqq/2U+/MM//LsAfuYjP5K7/vqveSABAgQIECBAgAABAsR/PwECBAgQIECAAAECBAgQIECAAAECBAgQ/4kkkEACCSSQQAIJJJBAAgkkkEACCSSQQAIJJJBAAon/agIECBAgQIAAAQIECBAgQIAAAQIE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mgd/0zd909MBfu6jPoq7//qvESBAgAABAsR/PQECBAgQIECAAAECBAgQIEBc9X+JAAECBAgQIECAAAECBAgQIP57CRAgQIAAAQIEiOcigcT1L/MyANz9138NEkj8WwkQIECAAAHiP54AAQIECBAg/uMIECBAgADxH0OAAAECxL+fAAECBAgQ/36SkIQkJCGJfw8BAgQIEP92AgQIECD+7QQIECBA/NsJECBA/Ovc/ld/BcCbvNibgAABAsS/nQABAsS/mhBCSEISCBD/dgIECBD/NgIECBD/dgIECBD/NgIECBD/dgIECBD/NgIECBD/NgIECBD/dgIECBAIIYQQQrzIBAgQIP7tBAgQIF4kd+/ezYd/z4dzzTXXPPhzPudzfuuaa655MFddddVV/7MQXHXVVVf9D/PhH/7h3wXwcx/1Udz913/NfzYBAgQIECBAgAABAgSI//sECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA8f+HAAECBAgQIECAAAECxH89AQIECBBww0u/NAB3//VfI55JAgkkkEACCSSQ+LcQIECAAAECxH88AQIECBAg/uMIECBAgADx7ydAgAABAsS/nwABAgSIfz9JSEISkhD/PgIECBD/PgIECBD/PgIECBD/dgIECBAv3ON+6ZcAeJmbXobnIUCAAPFvJ0CAAPGvJoQQkkCAAPFvJ0CAAPFvI0CAAPFvJ0CAAPFvI0CAAPFvJ0CA+LcTIECA+LcRIECA+LcTIEBcJoQQQvyrCBAgQPzbCRAgXqi/esZf8QU/8wVcc801D/6cz/mc3+Kqq6666n8Wgquuuuqq/0E+93M/97de7MVe7LX/4ru+i7v/+q/5txIgQIAAAQIECBAgQPzPJECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBIj/XgIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQPzPJ0CAAAECBAgQIECA+M+xfd11bF93HQD799wDgAABAgQIECBAPJMEEkgggQQS/1YCBAgQIECA+I8lQIAAAQLEfxwBAgQIEP8xBAgQIED8+wkQIECA+HeSkIQkJCFA/NsJECBAgPi3EyBAgADxbydAgADxbydAgAAB4tn27rmHO/7qr7hu5zpe5qaX4YUSIECAAPFvI0CAAAHiRSaEEEJIAgEC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ddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9X8Y97+34M3zcLUQAAAABJRU5ErkJggg==) + +```js +// You can set the appearance before or after you shell it will yield the same result. +// This example shows setting the appearance _after_ the shell. +firstSketch = startSketchOn('XY') + |> startProfileAt([-12, 12], %) + |> line([24, 0], %) + |> line([0, -24], %) + |> line([-24, 0], %) + |> close(%) + |> extrude(6, %) + +shell({ faces = ['end'], thickness = 0.25 }, firstSketch) + |> appearance({ + color = '#ff0000', + metalness = 90, + roughness = 90 + }, %) +``` + +![Rendered example of appearance 3](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAD5o0lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuxzP/dzf4urrrrqqqv+z/iRH/mRz/mHf/iH3+aqq6666qqr/n9DD3rQg7jqqquuuuqq/89e53Ve570//MM//Lu46qqrrrrq/5wf+ZEf+ewf/dEf/Ryuuuqqq6666v8vgquuuuqqq676f+yaa6558Id/+Id/F8AvfsEX8Itf8AUAXLr7bq666qqrrvrf59Ldd/MLX/AF/MIXfAEAr/M6r/Pe11xzzYO56qqrrrrqqv+/qFx11VVXXXXV/2Mf/uEf/l0At/3VX/H3v/RLvPPXfR0Ax66/nlt/+Zc5uvtu/j3EfwKJ+4n/XOI/l/jPJf5zif984r+G+K8l/gNJ/GuI/5nEVf9eD3qv9+LY9dfz6u/7vnzT2789t7zMy/ASb/qmD/7wD//w7/rMz/zM1+Gqq6666qqr/n+ictVVV1111VX/T73O67zOe7/Yi73YawP8yEd8BC/xJm/CLS/zMhzccw9b113HM37plzj713/NA4l/HfGvI14EEvcT/zriX0e86MS/nvjXEf864l9H/AskHkj864h/HfGvJ/71xL+N+LcR/3biAST+NcR/DPEfS/znE//3HX+pl4L3ei8Ajl1/Pa/+vu/LH3znd3LLy7wML/ZiL/bar/M6r/Pev/Vbv/XdXHXVVVddddX/PwRXXXXVVVdd9f/QNddc8+AP//AP/y6AH/6Ij+DYddfxJp/2aQA85Zd+CYCN667jqv+9xL+O+BdIPJD41xH/+cS/nvi3Ef824t9GgHgAiX8N8e8nQPzHESD+8wgQ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rrnmwR/+4R/+XQA/+REfwd499/BK7/u+7Fx/PWf/+q953Hd/N/8hJF5UG9ddx/824qrnIPH/lXjRiOci8YKIF5140Yl/HfGvJ/71BIh/GwHihZBA4gURIP5jCBAg/vMJECBAgADxH2t27bVcvOce/ivd+ld/xa1/+ZfsXH89b/Cpn8rePffwa1/wBQC84zu+42ddc801D+aqq6666qqr/mchuOqqq6666qr/YT78wz/8uwDu/Ku/4q6/+ituepmX4RXf930B+Ifv+i4AxHMSz0m8YOLZxLOJZxPPdnjPPfxfJl404v8G8aIRLxrxohEvGvGiES8a8W8k8YKIF5140Yl/HfGvJ/71xL+NAPFCSCDxgggQ/34CBIj/PAIECBAg/mvMrruO/2q7d9/NT33BFwBw08u8DDe/zMvw+F/6Je74q7/immuuefA7vuM7fhZXXXXVVVdd9T8LwVVXXXXVVVf9D/JiL/Zir/1iL/Zirw3w61/4hSDxiu/7vgD8w3d9F2f/+q/5txD/dgf33MPmddfx30ri/yvxohEvhMR/J/GiES8a8aIRLzrxABIviHjRiRedeNEJEP86AsS/jgDxrydAvBASSDw/AgSIfz8B4j+HAAECxH+vC3ffzX8lA7t3381vfcd3sHP99bz+p30aAL/+BV8AwOu8zuu89+u8zuu8N1ddddVVV131PwfBVVddddVVV/0P8rmf+7m/BfDrX/iF7N9zD6/4Pu/DjS/zMhzecw+P++7v5oHEcxLPSbwIJF5UG9ddx1X/ccT/XOJFI/5vEA8g8YKIF5140YkXnfjXE/964l9PgHghJJB4fgSIfz8BAsR/LAECBIj/GWbXXQfAxbvv5r/DX//SL7F7993sXHcdr/S+78vePffwa1/wBQC80zu902dfc801D+aqq6666qqr/mcguOqqq6666qr/IT73cz/3twDu/Ku/4gm/9EtsX3cdr/i+7wvAn3/RFyH+44hnE88mnte9f/VXAGxedx1X/cvE/1ziv5540YgXjXjRiBeNeNGIF5140YkXnfjXE/86AsS/nnghJJB4fgSIfx8BAsR/HAECBIj/fgIECBAgYHbttfx32r37bn7qC74AgMe8yZtw48u8DI//pV/ijr/6K86cOfOgd3zHd/wsrrrqqquuuup/BoKrrrrqqquu+h/gxV7sxV77xV7sxV4b4Ne/8AsR8Pqf+qkA3PrLv8zZv/5rnh/xnMQLJv51xFX/W4gXQuJfQ7xoxH898aIRLxrxXCT+vcSLTrzoxL+OAPGvI/71BIgXQAKJ50eA+PcRIP7jCBAg/usJECBAgAABAsTzN7vuOgAu3n03/9nM82Fz61/9FX/9i7/IzvXX80rv+74A/PoXfAEAr/M6r/Per/M6r/PeXHXVVVddddV/P4Krrrrqqquu+h/gwz/8w78L4De+8As5uOceHv0mb8KNL/MyAPz5F30R9xP/OuJFIPHCHN5zDwAb113HVf+1xH8c8V9PvGjE/wASL4h40YgXnXjRiX8d8a8jQPzrCBAvhMTzI0D82wkQIP5jCBAg/vMJECBAgAAB4t/nwj33YP77/PZ3fAe7d9/NTS/zMrzS+74v+/fcw69/wRcA8I7v+I6fxVVXXXXVVVf99yO46qqrrrrqqv9mn/u5n/tb11xzzYPv/Ku/4gm/9EtsX3cdr/epnwrA73zUR/GfRTyb+JdtXncd/1+J/1jifzfxH0e8aMSLRrxoxANIvCDiRSNedOJFJ/51xL+O+NcTL4QEEs+P+LcTIP5jCBAg/vMIECBAgPiPN7v2WgAu3n03/xnMi2b3nnv47e/8TgAe8yZvws511/H4X/ol7vyrv+Kaa6558Id/+Id/F1ddddVVV13134vgqquuuuqqq/4bvdiLvdhrv9iLvdhrA/zGF34hAK/3qZ8KwNm//mvO/c3f8NzEcxLPSbxg4l8mnk3AwT33ALBx/fXcz1z1P4V4IST+NcR/HPEfR7xoxItGvGjEi0a86MSLTvzriBedAPGvI0C8ABJIPD8CxL+NAPHvJ0CA+M8hQIAA8V9jdt11PD/m38782/z1L/4if/2Lv8jO9dfz+p/2aQD8+hd8AQCv8zqv894v9mIv9tpcddVVV1111X8fgquuuuqqq676b/ThH/7h3wXwp9/5nezfcw83vszLcOPLvAwAf/7FX8x/BPHvd3DPPWxedx3/14j/WOI/jviPI/7jiP844j+OeNGI5yLx/IgXjXjRiReNAPGiEyBedOJfT7wQEs+PAPFvI0D8+wgQIP5jCRAgQID473Px7rt5Ycx/nd/+zu8E4MaXeRke86Zvyt499/DrX/AFAHz4h3/4d3HVVVddddVV/30Irrrqqquuuuq/yYd/+Id/1zXXXPPgO//qr/jz7/ouBLz1134tAH/+xV/M0T33ACCel3hO4jmJF0w8m3gmCfGCHd59N/+biKv+tcR/HPEfR/wnknh+xItGvOjEi0b864h/HfGvI0C8ABJIPDcB4t9GgPj3ESD+YwkQIP7n2H6pl+LC3XfzojLPZp7N/MfYvftufuYLvgCAV3rf9wXgzr/6K+78q7/immuuefCHf/iHfxdXXXXVVVdd9d+D4Kqrrrrqqqv+G7zYi73Ya7/O67zOewP82Xd9FwBv9bVfC8DZv/5rnvHLv8yzSIh/H/GvI57XxnXXcdW/n/iPI14Iif9o4j+O+I8jXjTiAST+q4gXjfjXES86AeJfR7wAEkg8NwHi30aA+LcTIED8xxAgQID4rydAgAABAgQIECCuuHjPPfxP8te/+Ivc+ld/xfZ11/H6n/qp7N9zD7/+BV8AwOu8zuu894u92Iu9NlddddVVV131X4/gqquuuuqqq/4bfPiHf/h3AfzZd34nd/3VX3HDy7wMN77MywDwF1/8xfxbiP8cAg7uuYer/ncS/7XEfxzxLxMvGvGiES8a8aIRLxrxryNedOJfR4B4ASSeH/FvI0D82wkQ/zEECBD/NQQIECBAgADxoplddx3/E/3MF3wBAI950zflxpd5GfbvuYdf/4IvAODDP/zDv4urrrrqqquu+q9HcNVVV1111VX/xT78wz/8u6655poH3/lXf8Wffdd3AfB6n/qpADz+u7+bo3vuQTwXiecmXjjxgolnE88kIZ6/g3vuYfO66/jvJv7riReN+I8j/muJf5n4jyP+ZeI/jnguEs+PeNGIF4140Yh/HfGiE/864gWQQOK5CRD/egLEv40AAeLfT4AA8Z9HgAABAgSI/xgX7r6b/2l2776bn/mCLwDg9T7t00Dizr/+a+78q7/immuuefCHf/iHfxdXXXXVVVdd9V+L4Kqrrrrqqqv+C73Yi73Ya7/O67zOewP82Xd9FwCv+6mfyvZ113H2r/+ax3/3d/OCiH8f8a8jnu3wnnsA2LjuOq76n0G8EBIA4r+W+JeJ/zji30Di+REvGvGiES8a8a8jXnTiRSdAvAASz4/41xMg/m0EiH8/AQLEfw4BAgSI/xyza68F4OLdd/M/0a1/+Zfc+ld/xc511/F6n/qp7N9zD7/+hV8IwOu8zuu894u92Iu9NlddddVVV131X4fgqquuuuqqq/4LvdM7vdNnAfzZd34nd//VX3Hjy7wMj36TNwHg8d/93TyQ+JeJ5ySek/iPcXj33QBsXncdV/3bif95xL9M/NcS/zLxohH/MvGiES8a8aIRLzoB4kUjQLzoxAsh8dwEiH8dAeLfRoD49xEgQPzHEiBAgADxX6O/7jr+J9u95x5+5gu+AIAbX+ZluPFlXob9e+7hT7/zOwH48A//8O/iqquuuuqqq/7rEFx11VVXXXXVf5F3fMd3/KwXe7EXe+27/uqv+PPv+i4AXuF93geAx3/3d3Pur/+aF0pC/McRzyZeNBvXXcf/FeJ/JvG/k/iXif9a4rlI/FuJF4140YgXnXjRiRedAPECSCDxQALEv44A8W8jQPzbCRAg/uMIECBA/PeZXXstABfvvpv/qXbvvpvf+Y7vYOe663j9T/1UAB7/S7/EnX/1V1xzzTUP/vAP//Dv4qqrrrrqqqv+axBcddVVV1111X+BF3uxF3vtd3qnd/psgD/7ru8C4OXf53244WVehqN77uEJ3/3dPD/iXyaek3jBxL9AQjyvg3vuAWDzuuu46r+feCEkAMS/TPzPI/5l4l8mnovE8yP+ZeJFI1404kUnXnTiRSdeCInnJv71xL+NAPFvJ0D8xxEgQPz3ECBAgADxbBfuuYf/Scxz+ptf+iVu/au/Yvu663il931fDu65h9/4wi8E4MVe7MVe+8Vf/MVfm6uuuuqqq676z0dw1VVXXXXVVf8F3umd3umzAP7sO7+Tu/7qr9i+7jpe4X3fF4C/+OIvBkC8aMS/jvi3E1e9KMT/XeJfJv5l4l8m/pNIPD/iP4540YgXnXjRiRedeAEkkHhu4l9HgPjXEyD+bQQIEP8xBAgQ/zUECBAgQIAA8fzNrrsOgIt3383/ZLt3383vfMd3APDoN3kTbnyZl2H/nnv40+/8Tq655poHf/iHf/h3c9VVV1111VX/+Qiuuuqqq6666j/ZO77jO37Wi73Yi732/j338Off9V0AvO6nfioAt/3yL3Pur/+a+4nnJR5A4vkRz0m8aMSziRfs8J57ANi4/nr+PxH/ccRV/xHEv0z8y8SLRvzLxItGvOjEi0686MQLIPHcBIgXnQDxrydA/NsIEP9+AgQIEP95BAgQIECA+Nfrr7uO/y2e8Vd/xd/84i+yfd11vN6nfioAT/ilX+LOv/orzpw586AP//AP/y6uuuqqq6666j8XwVVXXXXVVVf9J3qxF3ux136nd3qnzwb4rS/8QgQ8+k3ehBte5mU4uuce/uKLv5h/C/GvI55N/AskxPM6uOceNq+7jqv+84h/mXghJADEv0z8y8S/TPzLxL9M/MvEv0w8F4l/K/EfR7zoxItGgHjRCBAvgMRzE/864l9PgPi3ESD+fQQIEP85BAgQIED8x7pw9938b/E73/md7N59N9vXXccrvM/7sH/PPfzGF34hAC/2Yi/22i/2Yi/22lx11VVXXXXVfx6Cq6666qqrrvpP9E7v9E6fBfDn3/md3PVXf8X2ddfxOp/6qQD85Rd/Mc+PeF7iASSeH/GfQ1xxePfd/GcR/3HEVVc9k8TzI/5l4kUj/mXiRSdeNOJFJ14ACSQeSIB40QkQ/zoCxL+NAPHvI0D8xxMgQID4z7X9Ui/Fxbvv5n8C8y/bvftufvYLvgCAx7zpm7J93XXs33MPf/qd38k111zz4A//8A//Lq666qqrrrrqPw/BVVddddVVV/0necd3fMfPerEXe7HX3r/nHv78u74LgNf51E8F4Nxf/zXn/vqvEf924oUTL5h4NvFs4oXbuO46rvr/QfzLxL9M/MvEv0z8y8S/TPzLxItG/MvEi068aMSLTrwAEs9N/OuIfx0B4t9GgPi3EyBA/McRIECA+K934Z57+N/kGX/1V/zNL/4i29ddx+t96qci4Im/9Evs33MP11xzzYPf8R3f8bO46qqrrrrqqv8cBFddddVVV131n+DFXuzFXvud3umdPhvgt77wCwF41Ju8CTe8zMsA8Jdf/MW8MOJ5iX8f8a8jntO9f/3XbF53HVc9J/EfQ/zLxAshASD+ZeJ/F/EvE89F4j+T+I8lXjTiRSdeAInnJl50AsS/jvi3ESD+bQQIEP8xBAgQIP57CBAwu+46/jf63e/8TgBufJmX4dFv8ibs33MPv/GFXwjA67zO67z3i73Yi702V1111VVXXfUfj+Cqq6666qqr/hO80zu902cBPPGXfom7/uqvAHidT/1UAH7/oz+ao3vu4X7i30ACQDwn8ZzEv5HEC7Jx3XX8byf+a4n/e8S/TPzLxH8d8S8T/zLxohEvGvGiES8aAeIFkHggAeJFJ/51BIh/PQHi30aA+I8hQID4ryFAgAABAgQIEM/p4t1389/F/Nvs3n03P/sFXwDAK7zv+7J93XXc9Vd/xZ9953dyzTXXPPjDP/zDv4urrrrqqquu+o9HcNVVV1111VX/wd7xHd/xs17sxV7stffvuYff/sIvRMBbfu3XAnDur/+ac3/917woxPMS/3HEs4kXTsDBPfcAsHnddfyXkvjvIP5vEv8y8V9D/MvEv0w8F4nnJv5l4l8mXjTiRSNeNOJFI14ACSQeSLzoBIgXnQDxrydA/NsIEP9+AgSI/zwCBAgQIEC8aPrrrgPgwt1387/R3/ziL/KMv/ortq+7jld43/cF4Am/9Evs33MP11xzzYPf6Z3e6bO56qqrrrrqqv9YBFddddVVV131H+iaa6558Du90zt9NsBvf+EXAnDDy7wMN7zMywDwV1/8xTw/4t9OPCfxgol/mXj+Du++m6v+h5IAEP81xL9M/DeReG7iXyb+44gXjXjRiBeNeAEknpt40Yl/HfGvJ0D86wkQIP59BAgQ//EECBAgQPz7zK69lv/tfvYLvgCAR7/Jm3DDy7wM+/fcw2984RcC8Dqv8zrv/WIv9mKvzVVXXXXVVVf9xyG46qqrrrrqqv9AH/7hH/5dAE/8pV/irr/6KwBe+1M/FYAnfPd3c3TPPYjnTzwv8bzEM0m8KMS/nXheG9ddx1X/scS/TPzXEP81xL9M/MvEfx3xLxMvGvGiES8a8QJIPJAA8aIRIF50AsS/jgDxrydA/PsIECD+YwkQIED8B5JAor/uOgCe+ld/xX8l83zY/Fvs3n03P/sFXwDA633qpyLg7r/6K574S7/EmTNnHvThH/7h38VVV1111VVX/cchuOqqq6666qr/IK/zOq/z3i/2Yi/22vv33MNvf+EXAvDan/qpbF93Hef++q954nd/N/8W4l8m/m3Es4nnIvFAB/fcA8Dmdddx1YtO/M8h/muI/xriuUg8N/EvE/8y8S8TLxrxohEvGvECSDyQeNGJfx3xryNA/OsJEP92AgSI/zgCBAgQ/w4SSCCBBBJIIIHE87D538Q8p9v+6q94xl/+JdvXXcfrfuqnAvBn3/md7N9zD9dcc82D3/Ed3/GzuOqqq6666qr/GARXXXXVVVdd9R/gmmuuefCHf/iHfxfAb3/hFwJww8u8DI96kzcB4Inf/d08kHj+xItGvHDiBRP/MvG8xFXPTfwPIAEg/muIfz/xLxP/ShLPTfzLxL9M/MvEi0a8aMSLRrwAEg8kXnTiRSdAvOgEiH89AeLfRoAA8R9DgAAB4t9AAgkkkEACiRdVf911AFy8+27+N9u9+25+9gu+AIAbXuZluOFlXob9e+7hN7/gCwB4ndd5nfe+5pprHsxVV1111VVX/fsRXHXVVVddddV/gA//8A//LoAn/dIvcfdf/RUCXu593geAJ3z3d3Pur/+a5yZedOIFkHhRiH87ccXhPfdwcM89bFx/PVf91xL/NcS/n/j3E/8y8V9D/MvEi0a8aMSLRrwAEg8kXjQCxItO/OuIfz0B4t9GgPiPIUCA+FeSQAIJJJB4UQgQIECAAAECZtdey/3Mfy7zn+vSPffwu9/xHWxfdx2v+6mfCsBdf/3XPPGXfolrrrnmwR/+4R/+XVx11VVXXXXVvx/BVVddddVVV/07vc7rvM57v9iLvdhrA/z2F34hAC/3Pu/DDS/zMhzdcw9P+u7v5l9DvGjEcxLPSbxg4tnEs4nnIvFAh3ffzeZ113HVfxzxX0P8+4l/P/HvJ56LxHMT/zLxX0e8aMS/TIB4ASTuJ0C8aMSLToB40QkQ/zoCxL+NAPHvI0CAAPEikkACCSSQ+JcIECBAgADxwvXXXcfFu+/m/4q//aVf4hl/9VdsX3cdL/8+7wPAn33nd7J/zz282Iu92Gu/4zu+42dx1VVXXXXVVf8+BFddddVVV13173DNNdc8+MM//MO/C+DnPvIjAdi+7jpe7n3fF4C/+uIv5oURz594XuIFkHhRiH8d8fxtXHcdAOa/lvivI/53Ef9+4t9P/PuJfz/xLxP/MvEvE/8y8aIR/zLxQkjcT7zoxItOvOgEiH8dAeJfT4AA8W8nQID4V5BAAol/iQABAgSIf5vZtddy4Z57eG7mP4b5r7V799383nd8BwCPftM35caXeRkO7rmHP//O7wTgdV7ndd77mmuueTBXXXXVVVdd9W9HcNVVV1111VX/Dh/+4R/+XQB3/dVfcfdf/RUAr/WpnwrA7b/8y5z/678GQPznEM9JPCfxH+vwnnv4n0z8y8R/HfGfTOK/ivj3E/9+4rlI/GuJf5n4l4n/OOJfJl4ACSTuJ140AsSLRoB40Yl/HQHiX0+A+PcRIF5EEkgggcQLIkCAAAHiP9bFu+/mhTH/OuY/h3nR3PpXf8Xvfsd3sH3ddbzOp34qAE/8pV/iib/0S1xzzTUP/vAP//Dv5qqrrrrqqqv+7Qiuuuqqq6666t/odV7ndd77xV7sxV4b4Oc/8iMBeOSbvAk3vMzLcHTPPfzVl3wJDySeP/H8iecl/uOIZxMvnLji4J572LzuOq4C8V9D/PuJ/3zi30/8K0k8N/HvJ/5l4kUj/mXiXyZeAIkHEi8a8aITLzoB4kUnQPzrCRD/dgIEiBeBBBJIvCACBAgQ/7n6667jX8M8m3k28z/L3/7SL3Hp7rvZvu46Xv593geAP//O72T/nnt4sRd7sdd6ndd5nffmqquuuuqqq/5tCK666qqrrrrq3+Caa6558Id/+Id/F8DPf+RHImDnuut47U/9VAD+6ku+hH8N8W8nAIn7iRdM/MvEc5F4bhvXXcdV/37i30/8+4n/fOLfT7xw4l8m/v3Ei0b8y8S/TLwAEg8kXjTiRSNAvOjEv4741xMg/m0ECBAvAgkkkHh+BAgQIP7rXbjrLv6vuXT33fzcF3wBAI960zdl+7rr2L/nHv78O78TgHd8x3f8rGuuuebBXHXVVVddddW/HsFVV1111VVX/Rt8+Id/+HcB3P1Xf8Xdf/VXALzWp34qAOf/+q85/9d/zWUSDyT+dcTzEv864t9OPKfDe+4BYPO667jq/w/xwol/P/HCieci8a8l/mXiP4b4l4l/mXgBJB5IvGjEi0a86ASIF50A8a8jQPzbCBAvAgkkkHh+BAgQ/zUECBAgQMD2S70UABfuuYf/i57xV3/F3/7iL7J93XW8zqd+KgBP/KVf4q6/+iuuueaaB3/4h3/4d3HVVVddddVV/3oEV1111VVXXfWv9Dqv8zrv/WIv9mKvDfA7X/iFADzyTd6E61/mZQD4w4/5GMQLJp4/8V9PPJv4lx3efTdX/dcRL4TEi0K8cOI/n/jPJ/79xL9M/MvEv0z8y8QLIPFA4kUjXjTiRSdedALEv44A8W8jQPwLJJBA4vkRIED85xEgQIAAAeL566+9lv/rfvc7vgOAG17mZXj0m7wJAL/1hV8IwIu92Iu99uu8zuu8N1ddddVVV131r0Nw1VVXXXXVVf9KH/7hH/5dAD//kR/J/j33APBan/qpAPzhx3wMz0PiRSWel3he4jkJQOJ+4gUT/zLxvAQc3HMPABvXXcdVL5z4v0H85xMvnHguEv9a4oUT/zLxLxP/MvEvEy+AxAOJf5kA8aIRLxoB4kUn/nUEiH89AQLECyGBBBLPjwAB4j+eAAECBIh/m6f95V/yP5X597l0zz38/Bd8AQAv977vy85113Fwzz389hd+IQDv+I7v+FnXXHPNg7nqqquuuuqqFx3BVVddddVVV/0rfO7nfu5vAdz9V3/F3X/1VwC8+dd+LQDn//qvOf/Xf839xAsm/muJfzsBSDzQ5nXX8X+V+N9DvHDiP5944cR/PvHCiX8/8S8T/zLxLxMvgMQDiX+ZeNEIEC8a8aITIF50AsS/ngDxL5BA4vkRIED8xxEgQIAA8e/XX3cd/x/87S/+Is/4q79i+7rreLn3fV8AnvhLv8Rdf/VXXHPNNQ9+x3d8x8/iqquuuuqqq150BFddddVVV131InqxF3ux136xF3ux1wb4nS/8QgTc8DIvw/Uv8zIA/PWXfAnPTTyTxHMTz594XuJ5iecknpN4wcSziWcTL9zhPfdwFYh/P/HvIPEfQfz3Ey+ceC4SDyT+/cR/DfEvEy+AxAOJf5l40YgXjQDxohP/OuJfT4D4F0gg8dwECBD/MQQIECD+c8yuvRaAC3ffzf91P/8FXwDAo97kTbjhZV4GgN/+wi8E4HVe53Xe+3Ve53Xem6uuuuqqq6560aAHPehBXHXVVVddddWL4id+4icM8Dtf+IU8+Zd+CYB3+rEfY/u66/jrL/kSbv/lX+YFMYDNczPPn3le5nmZ52QAm/uZ52SezTybeTbzbOYKA9gAvNWP/ihH99zDrb/0S4h/mfh3kgAQ/zLx7yf+Y4gXTvw7SACIF078+4h/H/HCiX8/8cKJfz/xH0O8cOIFkPjXEi8a8R9P/OcT/3bif69Tb/RGbL3US/Hxr/IqACAhnk08m3g28Wzi2cSziWcTzyaeTTybeCYJ8ZzEs4lnE88mnpN4NnHFS77pm/Lmn/Zp7N9zDz/4Du8AwKPe5E147U/9VM6ePfuMD/7gD34wV1111VVXXfUvo3LVVVddddVVL4LP/dzP/S2Au//qr3jyL/0SAK/5qZ/K9nXXcf6v/5rbf/mX+bcQYJ6XAPOcBJjnJMA8mwDzbALMf7wzL/3SnHnpl+aqq6666qr/Whfuvpv/aQyIfx0D4oV7xl/9Fc/4q7/iQS/zMrz2p34qv/2FX8gTf+mXeOSbvAk3vMzLPOjDP/zDv+vrv/7r34errrrqqquueuGoXHXVVVddddW/4MVe7MVe+8Ve7MVeG+B3vvALAbj+ZV6GR77JmwDwpO/5HgSYF0yAJbB5bgLMi0aA+Y8hwFwhwLxgAizx0Dd+Yzavu47b/uqvuHT33Vx11VVXXfVf6yXe9E15hTd7M/7sF36B/+su3X03P/8FX8CH/fiP86g3eROe9Eu/xN1/9Vf8zhd+Ie/yYz/G67zO67z3b/3Wb33PP/zDP/w2V1111VVXXfWCoQc96EFcddVVV1111QvzTd/0TU+/5pprHvyX3/md/OV3fRcAb/a1X8v1L/MyPOm7v5snfc/3cD/zwtnm+THPn3le5nmZ52Sb+5nnZJ7NPJt5NnOFeTYDb/UjP8LmddfxJa/2alz1ohNX/V9irvrvYP5vM/+yY9dfz7t93deRwBe87duChHg28Wzi2cSziWcTzyaeTTybeDbxbOKZJADEs4lnE88mnpN4NvFs4jm9xvu+L6/xfu/H/j338EPv8A4APPJN3oTX/tRP5b777rv1Qz7kQx7CVVddddVVV71gBFddddVVV131Qnzu537ub11zzTUPvvuv/oq//K7vAuBl3+d9uP5lXoaje+7hSd/zPTyQeOEk8fyI5088L/GvI/7txLM99I3fmM3rruP3v+M7+L9CgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgPhPIIEEEkgggQQSSCCBBBJIIIEEEkgggQQSSCCBBBJIIIEEEkgggQQSSCCBBBJIIIEEEkgggQQSSCCBBBJIIIEEEkgggQQSSCCBBBJIIIEEEkgggQQSSCCBBBJIIIEEEkj8RxMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgrnpuAgQIECBAgAABAgQIEP/7CBAgQIAAAQIECLh099383nd+Jyeuv56HvezL8t/J/Ocxz+nvfvEXue2v/ort667jtT/1UwG4+6/+irv+6q+45pprHvzhH/7h38VVV1111VVXvWAEV1111VVXXfUCvNiLvdhrv9iLvdhrA/zVd30XAm54mZfhZd/3fQH4my/5Ev4jif8a4tnEs4kX7iFv8iYA/MF3fif/nQQIECBAgAABAgQIECBAgAABAgQIEP9GEkgggQQSSCCBBBJIIIEEEkgggQQSSCCBBBJIIIEEEkgggQQSSCCBBBJX/StJIIEEEkgggQQSSCCBBBJIIIEEEkgggQQSSCCBBBJIIIEEEkgggQQSSCDxryVAgAABAgQIECBAgAABAgQIECBAgADx/48AAQIECBAgQIAAAeJ/DwG3/9VfAfBOn/7p/H9x6Z57+Pkv+AIArn+Zl+H6l3kZ9u+5h9/5wi8E4HVe53Xe+8Ve7MVem6uuuuqqq656/giuuuqqq6666gX48A//8O8C+Mvv/E7u/qu/AuBl3ud9ALj9l3+Z83/91zw/4oUT/zrieYnnJJ6TJB5I/OuI5/SQN35jrn3pl+b3v+M7+PcQIECAAAECBAgQIECAAAECBAgQLyIJJJBAAgkkkEACCSSQQAIJJJBAAgkkkEACCSSQuOqqfzMJJJBAAgkkkEACCSSQQAIJJJBAAgkkkEACCSReVAIECBAgQIAAAQIECBAgQIAA8X+bAAECBAgQIECAAAHiv9+lu+/mF77gCzh5/fU87GVehv92Nv8VLt19N7/3Hd/B9nXX8dqf+qkA7N9zD7/9hV8IwId/+Id/F1ddddVVV131/BFcddVVV1111fPx4R/+4d91zTXXPPjuv/or/uq7vguAl3mf9+H6l3kZlvfcw998yZfwwogXQkI8f+J/HgEPfZM3AeDvf+mXECBAgAABAgQIECBAgAABAsSLQAIJJJBAAgkkkEACCSSQQAIJJJBAAomrrvp/RQIJJJBAAgkkkEACCSSQQAIJJJBAAol/iQABAgQIECBAgAABAgQIECD+bxEgQIAAAQIECBD/+W77y78E4A3f7/34r2T+fcy/z9/90i9x6e672b7uOl7+fd8XgLv/6q+466/+imuuuebBH/7hH/5dXHXVVVddddXzIrjqqquuuuqq5/JiL/Zir/06r/M67w3wV9/1XQBsXXcdL/u+7wvA33zJlyD+ZeI/jnhe4jmJ5yReMPFs4tnE87rmpV+aa176pfn7X/xF9u6+m3+RBBJIIIEEEkgggQQSSCCBBBJIXAUCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAuAoJJJBAAgkkkEACCSSQQAIJJJD4lwgQIECAAAECBAgQIECA+N9NgAABAgQIECBAgPi3u3TPPfzdL/4iD3vZl+VhL/My/H9x6e67+fkv+AIAHvkmb8LOdddxcM89/O4XfiEAr/M6r/PeL/ZiL/baXHXVVVddddVzIrjqqquuuuqq5/LhH/7h3wXwl9/5ndz9V38FwGt+6qcCcMcv/zLn//qvARD/MvECSIjnT/wHkXgg8a8jrnjx93kfAP7gO78TJJBAAgkkkEACCST+LxEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAcdV/JwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ/4dIIIEEEkgggQQSSCCBBBJIIPHCCBAgQIAAAQIECBAgQPzvJECAAAECBAgQIF6w3//O7wTgDd7v/fj/5La/+iv+7hd/ka3rruO1PvVTAdi/5x7+4ju/E4AP//AP/y6uuuqqq6666jkRXHXVVVddddUDvOM7vuNnXXPNNQ+++6/+ir/+ru9CwCPf5E24/mVeBoC/+ZIv4YHEv494/sTzEs9LPCfxnMS/zzUv/dJc89Ivzd//4i9y6Z57+J9MgAABAgQIECBAgAABAgQIECBAgAABAsRVV/3nEyBAgAABAgQIECBAgAABAgQIECBAgADxv4wEEkgggQQSSCCBBBJIIPHCCBAgQIAAAQIECBAg/ncRIECAAAEC9u6+m7/7xV/kYS/7sjzsZV6G/yzmv4Z50f3+d34nl+6+m+tf5mV45Ju8CQBP/qVf4u6/+iuuueaaB3/4h3/4d3HVVVddddVVz0Zw1VVXXXXVVc/0Yi/2Yq/9Tu/0Tp8N8Fff9V0ggcRrfOqnAvDHH/MxPD/ihRMvgMR/J/Fs4vl78fd5HwD+4Du/k/8sAgQIECBAgAABAgQIECBAgAABAsRVV111PwECBAgQIECAAAECBAgQIECAAPE/mAQSSCCBBBJIIIEEEkgg8YIIECBAgAABAgQIECD+Z/uD7/xOAN7g/d6P/08u3X03v/+d3wnAy77v+7J93XXs33MPv/2FXwjAi73Yi732i73Yi702V1111VVXXXUFwVVXXXXVVVc90zu90zt9FsBffdd3cc9f/zUAb/I1XwPA+b/+a87/9V/zgogXTrxg4vkTz0s8L/GcxANIPJD4l4krNq+7jmte+qX5+1/8RS7dcw8vjAABAgQIECBAgAABAgQIECCuuuqq/4kECBAgQIAAAQIECBAgQIAA8T+MBBJIIIEEEkgggQQSSLwgAgQIECBAgAABAsR/j0t3383f/eIvcvL663nYy74s/1HMfxzzn+PvfvEXue2v/ort667jZd/3fQE4uOce/uI7v5NrrrnmwR/+4R/+XVx11VVXXXXVFQRXXXXVVVddBbzjO77jZ73Yi73Yax/ccw9/9V3fBcB1L/3SXP8yLwPA33zJl/AvES+ceMHEi07864h/mxd7n/cB4O9/6ZcQIECAAAECBIir/icRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAHiqv9JBAgQIECAAAECBAgQIED8DyGBBBJIIIEEEkgggcQLIkCAAAECBAgQIP5z/MF3ficnrr+el3/TN+Xfw/zv8wtf8AUAPPJN3oQbXuZlEPDkX/ol7v6rv+Kaa6558Id/+Id/F1ddddVVV10FBFddddVVV/2/92Iv9mKv/U7v9E6fDfC7X/iF3O81P/VTAfjbL/kSVvfcw4tC/CtJvDDiP554NvFs4jk95I3fmL//xV/k9r/6K656wQQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECD+/xIgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIC46l9LgAABAgQIECBAgAAB4r+ZBBJIIIEEEkgggQQSz48AAQIECBAgQID417t0993c9ld/xcNe9mV56Mu8DP+fXLr7bn7xC74AgNf81E8F4OCee/idL/xCAF7sxV7stV/8xV/8tbnqqquuuur/O4Krrrrqqqv+33und3qnzwL4q+/6Lu75678G4DU+5VPYuu46zv/1X3PHL/8yAOLfT7xg4vkTz0s8J/GcxANIiH+dV/qUTwHg73/pl/i/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBXXfX8CRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAeIqAAECBAgQIECAAAECxH8jCSSQQAIJJJBAAonnR4AAAQIECBAgQDyvP/iO7+DEddfx8m/2ZtzPPH/m2cz/DuYFu+2v/orb/uqv2L7uOl7zUz8VgIN77uEvv/M7ueaaax784R/+4d/NVVddddVV/98RXHXVVVdd9f/aO77jO37Wi73Yi732wT338Nff9V0IuP6lX5pHvMmbAPDk7/keHkj8y8QLJ56LxP3E/wwPfuM35va/+itu/6u/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IECAuOq/kwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAXPXfRYAAAQIECBAgQIAAAQLE/w0CBAgQIECAAAHiv87tf/VXXLr7bl7//d6P/6/+4Du/k0t33831L/3SPOJN3gSAu//qr3jyL/0SZ86cedCHf/iHfxdXXXXVVVf9f0E5fvw4V1111VVX/d/3Oq/zOu/95m/+5h8N8LPv934AbF13HW/8tV8LwJ98zMewvPdeXhjxn0v893jQG78xD36TN+GXv+ALOPuUp3DVi0aAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBc9S8RIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQV72oBAgQIECAAAECBAgQIP73EiBAgAABAgSI/zjrgwPWBwe8xJu+KRfvvpu7n/xkxLOJZxPPJp5NPJt4NvGcxDNJiGcTzyaek3g28WziOYlnE89JPJt4NgFIrA8OWB8c8IjXfE1OPeIR3Pb7v894eMiFJz+ZB73ma3LTQx/6YIB/+Id/+B2uuuqqq676v47gqquuuuqq//OuueaaB3/4h3/4dwH88kd+JPd79U/5FAAu/PVfc+Fv/oYXhST+JeKFEy+YACSem3he4jmJ5yReMPFsD36TNwHgH37pl/i/SoAAAQIECBAgQIAAAQIECBAgQIAAAQLEVVe9aAQIECBAgAABAgQIECBAgAABAgQIECBAXAUgQIAAAQIECBAgQID430WAAAECBAgQIEC86G7/q7/i0t138wbv9378f/X3v/RL3P5Xf8XWddfxMu/zPgAc3Hsvf/Vd3wXA67zO67z3Nddc82Cuuuqqq676v47gqquuuuqq//M+/MM//LsA7vmrv+Lev/5rBFz/0i/NdS/zMgD83Zd+Kf8a4l8mXjjxX088rwe98Rtz5qVfmj/8zu/kfyIBAgQIECBAgAABAgQIECBAgAAB4qqr/m8RIECAAAECBAgQIECAAAECBAgQIP7/ECBAgAABAgQIECD+9xAgQIAAAQIEiGe7dM89/OF3ficnrr+eh77My/AfxfzPZp7TL37BFwDwiDd5Ex7xJm8CwJN/6Zd48i/9Etdcc82DP/zDP/y7uOqqq6666v86gquuuuqqq/5Pe53XeZ33frEXe7HXBviVj/oo7vdqn/qpAPzdl3wJy3vuQfzriH+ZeOHE8yeeP/G8xHMSz0k8HxL3e9CbvAkAf/Sd38l/FgECBAgQIECAAAECBAgQIEBcddVV/5kECBAgQIAAAQIECBAgQIAA8X+TAAECBAgQIECAAPE/nwABAm7/q78C4B0//dP538D8x9u75x5+6Qu+AICXeZ/34X5/9V3fxcE99/BiL/Zir/06r/M6781VV1111VX/lxFcddVVV131f9Y111zz4A//8A//LoBf+ciP5H6v9imfwtZ113Hhr/+aO3/lV7ifeBFJAIh/mfi3kcR/BvFsZ176pTnz0i/NP/ziL/KiEiBAgAABAgQIECBAgABx1VVX/V8kQIAAAQIECBAgQIAAAeL/DgECBAgQIECAAPE/x9499/CH3/mdnLj+eh76Mi/Dv5X53+3vf+mXuP2v/oqt667jNT7lUwA4uOce/uq7vguAd3zHd/ysa6655sFcddVVV131fxXBVVddddVV/2d9+Id/+HcB3PNXf8U9f/3XAFz30i/Nw9/kTQB4yvd8D89N/OuIf5l4wcS/jnhe4jmJF81j3ud9APij7/xOBAgQIECAAAECBIir/iMJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFf9RxIgQIAAAQIECBAgQID4302AAAECBAgQIED81/n7X/xFAF7//d6P/y7mv98vfcEXAPCIN3kTrn+ZlwHgyb/0S9z9V3/FNddc8+AP//AP/26uuuqqq676v4rgqquuuuqq/5Ne53Ve571f7MVe7LUB/uCLvoj7vdqnfioAT/me7+HC3/wNz48A8S+QuJ/4l4kXTDx/4j+GeF6nX+ZlOPPSL80//OIvsnfPPVz1nAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAsRV/1sIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFc9PwIECBAgQIAAAQIEiP+dBAgQIECAAAECxH+MvXvu4e9/8Rd56Mu+LA99mZfhRWX+b7l0zz380hd8AQCv8SmfggABv/9FXwTAi73Yi73W67zO67w3V1111VVX/V9EcNVVV1111f9JH/7hH/5dAL/ykR/JwT33APBS7/M+bF13HRf++q95yvd8D/8S8aIT/z7i+ZAQz0s8L/GcxAsm4DHv/d4A/NF3fif/FwgQIECAAAECBAgQIECAAAECBAgQIEBcddV/PQECBAgQIECAAAECBAgQIECAAAECxP9PAgQIECBAgAABAgSI/10ECBAgQIAAAeJF94ff+Z0AvP77vR//W5l/v9v/6q+4/a/+iq3rruM1PuVTADi45x5+74u+CIB3fMd3/KxrrrnmwVx11VVXXfV/DcFVV1111VX/53zu537ubwHc81d/xb1//dcIuO6lX5qXfp/3AeAp3/M9vKjECyHxQOKFE/9xxL+OeLbTL/3SnHnpl+YffvEX2bvnHv4nECBAgAABAgQIECBAgAABAgSIq6666oEECBAgQIAAAQIECBAgQIAAAeL/PgECBAgQIECAAAHifwcBAgQIECBAgHi2vXvu4e9/8Rd56Mu+LA992ZflBTH/t1265x5+6Qu+AIDrXuZluO6lXxqAp/zSL3HPX/0V11xzzYPf8R3f8bO46qqrrrrq/xqCq6666qqr/k95sRd7sdd+sRd7sdcG+MMv+iLu91Lv8z4APOV7vocLf/M3/GuIF5144cQLJp4PCfGiES+aB73xGwPwR9/5nfxHEyBAgAABAgQIECBAgAAB4qqrrvqfRIAAAQIECBAgQIAAAQIEiP97BAgQIECAAAECxP98AgQI+KPv/E4AXv/93o//Cua/jnnBzHPau+ce/vA7v5Ot667jNT71U7nf733RFwHwOq/zOu/9Oq/zOu/NVVddddVV/5cQXHXVVVdd9X/K537u5/4WwB980RdxcM89ALzU+7wP173My7C85x6e+j3fg/jXEy+AxHMTL5x4wcSLTrxw4nltXHcdt7zxG/MPv/iL7N1zDy+MAAECBAgQIECAAAECBIir/qcSIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAuOp/KgECBAgQIECAAAECBIj/GwQIECBAgAABAsT/HHv33MPtf/VXnLj+eh76Mi/D/cz/P3//i7/IpbvvZuu663jp93kfAA7uuYff+6IvAuAd3/EdP+uaa655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qv9aAgQIECBAgAABAgQIECBAgAABAsT/XwIECBAgQIAAAQLE/y4CBAgQIECA+M/3x9/5nQC83vu9H/8W5v+mP/rO7wTg2pd+aR7+Jm+CgIN77uEPvvALAXid13md936xF3ux1+aqq6666qr/iQiuuuqqq676H+nDP/zDvwvgab/0S9z713/N/V7lUz4FgH/40i9lec89vKgEiH87AeJFJx5A4vkR/36SADj10i/NqZd+aR7/i7/I3j338L+ZAAECBAgQIECAAAECBAgQIK666v83AQIECBAgQIAAAQIECBAgQID4v0+AAAECBAgQIED87yBAgAABAgQIEP9+e/fcw+N+8Rd5yMu8DA95mZfh/yLzr7d3zz38yhd8AQAv+T7vw9Z11yHgvr/+a/7mu76La6655sEf/uEf/l1cddVVV131PxHBVVddddVV/+O84zu+42e92Iu92Gsf3nMPf/RFXwSAgNf/mq8B4OLf/A13/cqv8G8hXgCJF4V40Yl/O/H8iefvpjd+YwD+5Du/k/8pBAgQIECAAAECBAgQIECAuOqqq/67CBAgQIAAAQIECBAgQID4v0eAAAECBAgQIED8zydAgAABAgSIF90ff+d3AvCyb/Zm/E9mXjDzH+9xv/RL3PFXf8XWddfxku/zPtzvqb/0Sxzccw/XXHPNg9/xHd/xs7jqqquuuup/GoKrrrrqqqv+R7nmmmse/E7v9E6fDfBHX/iFCBBwzUu/NNe+zMsA8A9f+qX8ewgQ/3biRSdeOPGCiRfNxnXXcfMbvzGP/8VfZO+ee/jPIkCAAAECBAgQIECAAHHV/1UCBAgQIECAAAECBAgQIECAuOr/IgECBAgQIECAAAECBIj/GwQIECBAgAABAsT/XAIECBAgQIB4Tnv33MMdf/VXPORlXoaHvMzL8J/B/O9gntOvfsEXAPCwN3kTrn3plwbg8J57+MMv/EIAXud1Xue9X+zFXuy1ueqqq6666n8Sgquuuuqqq/5H+fAP//DvAnjaL/0S9/31X3O/V/nUTwXgqd/zPSzvuYf/CALEA0i8qMSLTgASL4j41xHP6ZHv/d4APO6Xfol/LQECBAgQIECAAAECxFX/EQQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAsS/jwABAgQIECBAgAAB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67zO67z367zO67w3V1111VVX/VchuOqqq6666r/Mh3/4h38XwJ980RdxeM893O+VPuVTAHja934vq3vv5V8iQDwXif8IAsRzkXhRiBeNeOHE87rxjd+Yky/90vzpd34nz48AAQIECBAgQIC46n4CBAgQIECAAAECBAgQIECAAAECBIirrnrRCBAgQIAAAQIECBAgQIAAAQIECBAgrhIgQIAAAQIECBAg/pNJIIEEEkgggQQS/x4CBAgQIECAAPE/w9499/DrX/AFHL/+eh78Mi/DVc9r7557+LUv+AIAXuVTP5X7Hd5zD3/0RV8EwDu+4zt+FlddddVVV/1XIbjqqquuuuq/xOd+7uf+1jXXXPPg+/76r3n6L/8y93ulT/kUNq+7jot/8zc8/Xu/l38NAeI/hwDxrydA/MvEM0m8KG58ozcC4M++67sQIECAAPH/iwABAgQIECBAgAABAgQIECBAXHXV/24CBAgQIECAAAECBAgQIECAAPH/hwABAgQIECBAgPhPJIEEEkgggQQSSPx7CBAgQIAAAeK/1p1/9VcAvM77vR//Hub/rjv/6q+446/+is3rruNVPuVTuN/TfumXuPev/oprrrnmwR/+4R/+XVx11VVXXfVfgeCqq6666qr/dC/2Yi/22i/2Yi/22gB/8kVfxP2ueemX5iFv/MYAPP17v5d/KwECJPEfTTyTxL+G+JeJF0w828mXfmlOvvRL84Rf+iX+LxEgQIAAAQIECBAgQIAAAeKqq6769xAgQIAAAQIECBAgQIAA8X+XAAECBAgQIECA+E8igQQSSCCBBBJI/FsJECBAgAAB4j/e3j338Phf/EUe8rIvy0Ne9mUBMP+xzP9ue/fcw69/wRcA8NA3eROufemXRlzxR1/0RQC8zuu8znu/+Iu/+Gtz1VVXXXXVfzaCq6666qqr/tN9+Id/+HcB/P13fReH99zD/V78fd4HgKd97/dy8W/+hv8IAsR/LAHiX0/8y8QLJq54+Hu9FwB/+p3fyf9kAgQIECBAgAABAgQIEFddddX/FgIECBAgQIAAAQIECBD/twgQIECAAAECxH8SCSSQQAIJJJD4txIgQIAAAQLEv92ffud3AvA67/d+PAeb/43Mi868aPbuuYc/+c7vBOBVPvVTARBwdM89/PEXfREAH/7hH/7dXHXVVVdd9Z+N4Kqrrrrqqv9UH/7hH/5d11xzzYPv++u/5h+++7sRIODF3/u9uealX5rVPffw9O/9Xv7DSAAIEP+xJCH+dcS/TBIvyMmXfmlOvvRL84Rf+iX277mH/2oCBAgQIECAAAECBIir/jsIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFf9VxMgQIAAAQIECBAgQPzvJ0CAAAECBAgQ/wkkkEACCSSQQOLfSoAAAQIEiH/Z3j338Phf/EUe/DIvw4Nf5mW46vl7/C/+Inf+1V+xed11vMT7vA/3u/ev/op7/+qvOHPmzIM+/MM//Lu46qqrrrrqPxPBVVddddVV/2le7MVe7LVf53Ve570B/uG7vov7XfPSL82Lv8/7APC4L/sy/jMJECD+44h/HfFv9/D3ei8A/vQ7v5P/KAIECBAgQIAAAQIEiKv+NQQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAXPWiEiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgLjqX0OAAAECBAgQIECAAPG/kwABAgQIECBA/AeTQAIJJJBAAol/CwECBAgQIEA8259+53cC8Drv9368qMy/n/m3Mf/19u65h1//gi8A4KFv8iZc89IvDcDhPffwx1/0RQC8zuu8znu/2Iu92Gtz1VVXXXXVfxaCq6666qqr/tN8+Id/+HcB/P13fRf3/fVfc78Xe5/3AeDuX/kVLv7N3/AfTuL5ESD+Y4h/HfHCiee1uO46Tr70S/OEX/ol9u+5hxeFAAECBAgQIECAuOqBBAgQIECAAAECBAgQIECAAAECBAgQV131bAIECBAgQIAAAQIECBAgQIAAAQIECBBX3U+AAAECBAgQIED87yNAgAABAgSI/2ASSCCBBBJIIPFvIUDA/j338Phf/EUe8rIvy4Nf5mX4n8D8z7N3zz38yXd+J5vXXcerfOqncr/De+7hj7/oiwD48A//8O/iqquuuuqq/ywEV1111VVX/af48A//8O+65pprHnzfX/81//Dd3839HvLGb8w1L/3SrO65h8d/2Zfx30GA+DeSuJ8A8aITL4SEeE4Pe6/3AuBPv/M7ESBAgAABAgQIECD+/xEgQIAAAQIECBAgQIAAAQIEiKuu+t9BgAABAgQIECBAgAABAgQIECD+fxEgQIAAAQIECBD/ewgQIECAAAECxH8gCSSQQAIJJF5Uf/qd3wnAy7zZm/E/ks1/NvMve8Iv/iJ7d9/N5nXX8RLv8z7c796/+ivu/au/4pprrnnwh3/4h38XV1111VVX/WcguOqqq6666j/ci73Yi73267zO67w3wD9813dxv83rruMVP+VTAHjcl30ZAAIEiP9gEv8SAeLfT7zoxAsnrlhcdx03vvEb84Rf+iUO7rmH/+sECBAgQIAAAQIECBAgQIC46qqrXhQCBAgQIECAAAECBAgQIED83yVAgAABAgQIECD+dxAgQIAAAQLEfxAJJJBAAgkkkHig/Xvu4c6/+ise8jIvw4Nf5mX4v8L8x9q75x5+/Qu/EICHvsmbsHnddQAc3nMPf/xFXwTA67zO67z3i73Yi702V1111VVX/UcjuOqqq6666j/cO73TO30WwN9/13dx31//Nfd7xU/5FADu/pVfYfdv/obnJkCA+K8lQPwrSDw38aITL4DE/R72Xu8FwBN+6Zf430iAAAECBAgQIECAAAHiqquu+p9IgAABAgQIECBAgAAB4v8WAQIECBAgQID4n0+AAAECBIj/QBJIIIHEr3/hF3L8+ut5mTd7M656we78q7/i8b/4i2xedx2v8imfggABh/fcw99913cB8OEf/uHfxVVXXXXVVf/RCK666qqrrvoP9Y7v+I6f9WIv9mKvfd9f/zX/8N3fzf0e8sZvzDUv/dIAPP7Lvox/iQAB4t9B4l9DgPi3EyBeNOIFE3DjG78xT/ilX+Kuv/or/qcQIECAAAECBAgQIEBc9T+RAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBIir/qcRIECAAAECBAgQIED87ydAgAABAgQIEP9zCRAgQIAAAeLfZ/+ee7jzr/6KB7/My3D8+ut5buZFY/5vMC/Yn37nd7J3991c8zIvw0Pe5E0AEPD0X/ol7vurv+Kaa6558Id/+Id/F1ddddVVV/1HIrjqqquuuuo/zIu92Iu99ju90zt9NsA/fNd3IUCAgFf8lE8B4C8//uP51xIg/usIEP8CiRdEvGjE8/fin/RJADzhl36J/2wCBAgQIECAAAECBIir/q0ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEiP+bBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECxFX/VgIECBAgQIAAAQLE/14CBAgQIECAAPE/kwABAgQIEC+6P/2u7+L49dfzOu/3fvxnMP/xzH+9vXvu4U+/8zsBeIn3eR82r78egMN77uGPv+iLAHjxF3/x13mxF3ux1+aqq6666qr/KARXXXXVVVf9h3mnd3qnzwL4h+/6Ls7+9V9zv9f+mq8B4OLf/A27f/M3IPFvIUCA+FeQ+LcSIP5txItGPBeJG974jbnzr/6Ku/7qr/j3ECBAgAABAgQIEFc9PwIECBAgQIAAAQIECBAgQIAAAQIECBBX/V8nQIAAAQIECBAgQIAAAQIECBAgQIAAAeKqBxIgQIAAAQIECBAg/vcRIECAAAECxP88AgQIECBAPK87/+qvuPOv/ooHv8zL8F/NvGDmP4b5tzPP6Qm/9Evc+Vd/xeZ11/ES7/M+IIHE4b338nff9V2cOXPmQR/+4R/+XVx11VVXXfUfheCqq6666qr/EO/4ju/4WS/2Yi/22of33MM/fPd3c78zL/3SXPPSLw3A47/sy3gWiX8PAQLEfz4B4l9P/Os97L3eC4A/+67v4gURIECAAAECBAgQIP5/EiBAgAABAgQIECBAgAABAgQIEFdd9d9PgAABAgQIECBAgAABAgQIECD+fxIgQIAAAQIECBD/ewgQIECAAAHifxYBAgQIEPBn3/VdHL/+et7m0z6Nq164X/+CLwDgIW/8xlzz0i/N/Z7+y7/MfX/1V1xzzTUP/vAP//Dv4qqrrrrqqv8IBFddddVVV/27vdiLvdhrv9M7vdNnA/zpF30RD/SKn/IpADz+y76M1b338p9BgADxAkj8RxDPReJfIv5l4tke9l7vxV1/9Vfc/Vd/hQABAgQIEP8/CBAgQIAAAQIECBAgQIAAcdVVVwEIECBAgAABAgQIECBAgADxf58AAQIECBAgQID4n0+AAAECBAgQ/zPc+Vd/xZ1/9Vc8+GVfFnPVC7N/zz38+hd+IQCv/Cmfwv0O77mHP/7iLwbgxV7sxV77xV7sxV6bq6666qqr/r0Irrrqqquu+nd7p3d6p88C+Ifv+i7O/vVfc79X/JRPYfO667j4N3/D3b/6qzwPif9oAgSI/xwCxL+O+JcJuOGN3giAJ/zSL/F/jQABAgQIECBAgAABAsRVV13130GAAAECBAgQIECAAAHi/yYBAgQIECBAgPifTYAAAQIECBD/tf7su76L49ddx0u/6ZvyojD//5gr7vyrv+LOv/orNq+7jlf+lE/hfof33MPffdd3cc011zz4wz/8w7+Lq6666qqr/r0Irrrqqquu+nd5x3d8x896sRd7sdc+vOce/uG7v5v7nXnpl+bBb/zGADz9+76PF0jiP4sAAQKQ+I8knkniRSH+ZQ97r/di/557eOIv/RL/0wkQIECAAAECBAgQIEBcddVV/xcJECBAgAABAgQIECBA/N8gQIAAAQIECBD/cwkQIECAAAHiP97e3Xdz51/9Fa/zvu/Lv5f5r2VedObfb/+ee/j1L/xCAB7yxm/MtS/90ggQ8PRf/mUO77mHa6655sHv+I7v+FlcddVVV13170Fw1VVXXXXVv9mLvdiLvfY7vdM7fTbAn37RFwEgQMCLv8/7APD07/1edv/mb/jvJkCA+I8jQLzoxAt2wxu9EYvrruPPvvM7+e8kQIAAAQIECBAgQFz1H02AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQV/1HEiBAgAABAgQIECD+dxMgQIAAAQLE/1wCBAgQIED82+3fcw9P+KVf4vj11/PSb/qmXPXC7d9zD3/6nd8JwCt9yqdwv6N77uFPvuiLAHid13md937xF3/x1+aqq6666qp/K4Krrrrqqqv+zd7pnd7pswBu/eVf5txf/zXiise+93tz5qVfmtW99/L07/s+/kUS/yUkAASI/zjiRSeev4e+13sB8MRf+iX+MwgQIECAAAECBAgQV70wAgQIECBAgAABAgQIECBAgAABAgQIECBAgLjqfzIBAgQIECBAgAABAgQIECBAgAABAgQIECBAXPWCCBAgQIAAAQIECBD/+wgQIECAAAECxP88AgQIECBAvGju/Ku/4s6/+ite+33fl/9pzP88j/+lX+LOv/orNq+7jlf6lE/hfvf99V/z99/1XVxzzTUP/vAP//Dv5qqrrrrqqn8rgquuuuqqq/5N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qquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8V/wihZ6yMpZ7DXAAAAABJRU5ErkJggg==) + +```js +// You can set the appearance before or after you shell it will yield the same result. +// This example shows setting the appearance _before_ the shell. +firstSketch = startSketchOn('XY') + |> startProfileAt([-12, 12], %) + |> line([24, 0], %) + |> line([0, -24], %) + |> line([-24, 0], %) + |> close(%) + |> extrude(6, %) + |> appearance({ + color = '#ff0000', + metalness = 90, + roughness = 90 + }, %) + +shell({ faces = ['end'], thickness = 0.25 }, firstSketch) +``` + +![Rendered example of appearance 4](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAD5o0lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuxzP/dzf4urrrrqqqv+z/iRH/mRz/mHf/iH3+aqq6666qqr/n9DD3rQg7jqqquuuuqq/89e53Ve570//MM//Lu46qqrrrrq/5wf+ZEf+ewf/dEf/Ryuuuqqq6666v8vgquuuuqqq676f+yaa6558Id/+Id/F8AvfsEX8Itf8AUAXLr7bq666qqrrvrf59Ldd/MLX/AF/MIXfAEAr/M6r/Pe11xzzYO56qqrrrrqqv+/qFx11VVXXXXV/2Mf/uEf/l0At/3VX/H3v/RLvPPXfR0Ax66/nlt/+Zc5uvtu/j3EfwKJ+4n/XOI/l/jPJf5zif984r+G+K8l/gNJ/GuI/5nEVf9eD3qv9+LY9dfz6u/7vnzT2789t7zMy/ASb/qmD/7wD//w7/rMz/zM1+Gqq6666qqr/n+ictVVV1111VX/T73O67zOe7/Yi73YawP8yEd8BC/xJm/CLS/zMhzccw9b113HM37plzj713/NA4l/HfGvI14EEvcT/zriX0e86MS/nvjXEf864l9H/AskHkj864h/HfGvJ/71xL+N+LcR/3biAST+NcR/DPEfS/znE//3HX+pl4L3ei8Ajl1/Pa/+vu/LH3znd3LLy7wML/ZiL/bar/M6r/Pev/Vbv/XdXHXVVVddddX/PwRXXXXVVVdd9f/QNddc8+AP//AP/y6AH/6Ij+DYddfxJp/2aQA85Zd+CYCN667jqv+9xL+O+BdIPJD41xH/+cS/nvi3Ef824t9GgHgAiX8N8e8nQPzHESD+8wgQ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rrnmwR/+4R/+XQA/+REfwd499/BK7/u+7Fx/PWf/+q953Hd/N/8hJF5UG9ddx/824qrnIPH/lXjRiOci8YKIF5140Yl/HfGvJ/71BIh/GwHihZBA4gURIP5jCBAg/vMJECBAgADxH2t27bVcvOce/ivd+ld/xa1/+ZfsXH89b/Cpn8rePffwa1/wBQC84zu+42ddc801D+aqq6666qqr/mchuOqqq6666qr/YT78wz/8uwDu/Ku/4q6/+ituepmX4RXf930B+Ifv+i4AxHMSz0m8YOLZxLOJZxPPdnjPPfxfJl404v8G8aIRLxrxohEvGvGiES8a8W8k8YKIF5140Yl/HfGvJ/71xL+NAPFCSCDxgggQ/34CBIj/PAIECBAg/mvMrruO/2q7d9/NT33BFwBw08u8DDe/zMvw+F/6Je74q7/immuuefA7vuM7fhZXXXXVVVdd9T8LwVVXXXXVVVf9D/JiL/Zir/1iL/Zirw3w61/4hSDxiu/7vgD8w3d9F2f/+q/5txD/dgf33MPmddfx30ri/yvxohEvhMR/J/GiES8a8aIRLzrxABIviHjRiRedeNEJEP86AsS/jgDxrydAvBASSDw/AgSIfz8B4j+HAAECxH+vC3ffzX8lA7t3381vfcd3sHP99bz+p30aAL/+BV8AwOu8zuu89+u8zuu8N1ddddVVV131PwfBVVddddVVV/0P8rmf+7m/BfDrX/iF7N9zD6/4Pu/DjS/zMhzecw+P++7v5oHEcxLPSbwIJF5UG9ddx1X/ccT/XOJFI/5vEA8g8YKIF5140YkXnfjXE/964l9PgHghJJB4fgSIfz8BAsR/LAECBIj/GWbXXQfAxbvv5r/DX//SL7F7993sXHcdr/S+78vePffwa1/wBQC80zu902dfc801D+aqq6666qqr/mcguOqqq6666qr/IT73cz/3twDu/Ku/4gm/9EtsX3cdr/i+7wvAn3/RFyH+44hnE88mnte9f/VXAGxedx1X/cvE/1ziv5540YgXjXjRiBeNeNGIF5140YkXnfjXE/86AsS/nnghJJB4fgSIfx8BAsR/HAECBIj/fgIECBAgYHbttfx32r37bn7qC74AgMe8yZtw48u8DI//pV/ijr/6K86cOfOgd3zHd/wsrrrqqquuuup/BoKrrrrqqquu+h/gxV7sxV77xV7sxV4b4Ne/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/1HMfxzzn+PvfvEXue2v/ort667jZd/3fQE4uOce/uI7v5NrrrnmwR/+4R/+XVx11VVXXXXVFQRXXXXVVVddBbzjO77jZ73Yi73Yax/ccw9/9V3fBcB1L/3SXP8yLwPA33zJl/AvES+ceMHEi07864h/mxd7n/cB4O9/6ZcQIECAAAECBIir/icRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAHiqv9JBAgQIECAAAECBAgQIED8DyGBBBJIIIEEEkgggcQLIkCAAAECBAgQIP5z/MF3ficnrr+el3/TN+Xfw/zv8wtf8AUAPPJN3oQbXuZlEPDkX/ol7v6rv+Kaa6558Id/+Id/F1ddddVVV10FBFddddVVV/2/92Iv9mKv/U7v9E6fDfC7X/iF3O81P/VTAfjbL/kSVvfcw4tC/CtJvDDiP554NvFs4jk95I3fmL//xV/k9r/6K656wQQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECD+/xIgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIC46l9LgAABAgQIECBAgAAB4r+ZBBJIIIEEEkgggQQSz48AAQIECBAgQID417t0993c9ld/xcNe9mV56Mu8DP+fXLr7bn7xC74AgNf81E8F4OCee/idL/xCAF7sxV7stV/8xV/8tbnqqquuuur/O4Krrrrqqqv+33und3qnzwL4q+/6Lu75678G4DU+5VPYuu46zv/1X3PHL/8yAOLfT7xg4vkTz0s8J/GcxANIiH+dV/qUTwHg73/pl/i/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBXXfX8CRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAeIqAAECBAgQIECAAAECxH8jCSSQQAIJJJBAAonnR4AAAQIECBAgQDyvP/iO7+DEddfx8m/2ZtzPPH/m2cz/DuYFu+2v/orb/uqv2L7uOl7zUz8VgIN77uEvv/M7ueaaax784R/+4d/NVVddddVV/98RXHXVVVdd9f/aO77jO37Wi73Yi732wT338Nff9V0IuP6lX5pHvMmbAPDk7/keHkj8y8QLJ56LxP3E/wwPfuM35va/+itu/6u/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IECAuOq/kwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAXPXfRYAAAQIECBAgQIAAAQLE/w0CBAgQIECAAAHiv87tf/VXXLr7bl7//d6P/6/+4Du/k0t33831L/3SPOJN3gSAu//qr3jyL/0SZ86cedCHf/iHfxdXXXXVVVf9f0E5fvw4V1111VVX/d/3Oq/zOu/95m/+5h8N8LPv934AbF13HW/8tV8LwJ98zMewvPdeXhjxn0v893jQG78xD36TN+GXv+ALOPuUp3DVi0aAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBc9S8RIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQV72oBAgQIECAAAECBAgQIP73EiBAgAABAgSI/zjrgwPWBwe8xJu+KRfvvpu7n/xkxLOJZxPPJp5NPJt4NvGcxDNJiGcTzyaek3g28WziOYlnE89JPJt4NgFIrA8OWB8c8IjXfE1OPeIR3Pb7v894eMiFJz+ZB73ma3LTQx/6YIB/+Id/+B2uuuqqq676v47gqquuuuqq//OuueaaB3/4h3/4dwH88kd+JPd79U/5FAAu/PVfc+Fv/oYXhST+JeKFEy+YACSem3he4jmJ5yReMPFsD36TNwHgH37pl/i/SoAAAQIECBAgQIAAAQIECBAgQIAAAQLEVVe9aAQIECBAgAABAgQIECBAgAABAgQIECBAXAUgQIAAAQIECBAgQID430WAAAECBAgQIEC86G7/q7/i0t138wbv9378f/X3v/RL3P5Xf8XWddfxMu/zPgAc3Hsvf/Vd3wXA67zO67z3Nddc82Cuuuqqq676v47gqquuuuqq//M+/MM//LsA7vmrv+Lev/5rBFz/0i/NdS/zMgD83Zd+Kf8a4l8mXjjxX088rwe98Rtz5qVfmj/8zu/kfyIBAgQIECBAgAABAgQIECBAgAAB4qqr/m8RIECAAAECBAgQIECAAAECBAgQIP7/ECBAgAABAgQIECD+9xAgQIAAAQIEiGe7dM89/OF3ficnrr+eh77My/AfxfzPZp7TL37BFwDwiDd5Ex7xJm8CwJN/6Zd48i/9Etdcc82DP/zDP/y7uOqqq6666v86gquuuuqqq/5Pe53XeZ33frEXe7HXBviVj/oo7vdqn/qpAPzdl3wJy3vuQfzriH+ZeOHE8yeeP/G8xHMSz0k8HxL3e9CbvAkAf/Sd38l/FgECBAgQIECAAAECBAgQIEBcddVV/5kECBAgQIAAAQIECBAgQIAA8X+TAAECBAgQIECAAPE/nwABAm7/q78C4B0//dP538D8x9u75x5+6Qu+AICXeZ/34X5/9V3fxcE99/BiL/Zir/06r/M6781VV1111VX/lxFcddVVV131f9Y111zz4A//8A//LoBf+ciP5H6v9imfwtZ113Hhr/+aO3/lV7ifeBFJAIh/mfi3kcR/BvFsZ176pTnz0i/NP/ziL/KiEiBAgAABAgQIECBAgABx1VVX/V8kQIAAAQIECBAgQIAAAeL/DgECBAgQIECAAPE/x9499/CH3/mdnLj+eh76Mi/Dv5X53+3vf+mXuP2v/oqt667jNT7lUwA4uOce/uq7vguAd3zHd/ysa6655sFcddVVV131fxXBVVddddVV/2d9+Id/+HcB3PNXf8U9f/3XAFz30i/Nw9/kTQB4yvd8D89N/OuIf5l4wcS/jnhe4jmJF81j3ud9APij7/xOBAgQIECAAAECBIir/iMJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFf9RxIgQIAAAQIECBAgQID4302AAAECBAgQIED81/n7X/xFAF7//d6P/y7mv98vfcEXAPCIN3kTrn+ZlwHgyb/0S9z9V3/FNddc8+AP//AP/26uuuqqq676v4rgqquuuuqq/5Ne53Ve571f7MVe7LUB/uCLvoj7vdqnfioAT/me7+HC3/wNz48A8S+QuJ/4l4kXTDx/4j+GeF6nX+ZlOPPSL80//OIvsnfPPVz1nAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAsRV/1sIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFc9PwIECBAgQIAAAQIEiP+dBAgQIECAAAECxH+MvXvu4e9/8Rd56Mu+LA99mZfhRWX+b7l0zz380hd8AQCv8SmfggABv/9FXwTAi73Yi73W67zO67w3V1111VVX/V9EcNVVV1111f9JH/7hH/5dAL/ykR/JwT33APBS7/M+bF13HRf++q95yvd8D/8S8aIT/z7i+ZAQz0s8L/GcxAsm4DHv/d4A/NF3fif/FwgQIECAAAECBAgQIECAAAECBAgQIEBcddV/PQECBAgQIECAAAECBAgQIECAAAECxP9PAgQIECBAgAABAgSI/10ECBAgQIAAAeJF94ff+Z0AvP77vR//W5l/v9v/6q+4/a/+iq3rruM1PuVTADi45x5+74u+CIB3fMd3/KxrrrnmwVx11VVXXfV/DcFVV1111VX/53zu537ubwHc81d/xb1//dcIuO6lX5qXfp/3AeAp3/M9vKjECyHxQOKFE/9xxL+OeLbTL/3SnHnpl+YffvEX2bvnHv4nECBAgAABAgQIECBAgAABAgSIq6666oEECBAgQIAAAQIECBAgQIAAAeL/PgECBAgQIECAAAHifwcBAgQIECBAgHi2vXvu4e9/8Rd56Mu+LA992ZflBTH/t1265x5+6Qu+AIDrXuZluO6lXxqAp/zSL3HPX/0V11xzzYPf8R3f8bO46qqrrrrq/xqCq6666qqr/k95sRd7sdd+sRd7sdcG+MMv+iLu91Lv8z4APOV7vocLf/M3/GuIF5144cQLJp4PCfGiES+aB73xGwPwR9/5nfxHEyBAgAABAgQIECBAgAAB4qqrrvqfRIAAAQIECBAgQIAAAQIEiP97BAgQIECAAAECxP98AgQI+KPv/E4AXv/93o//Cua/jnnBzHPau+ce/vA7v5Ot667jNT71U7nf733RFwHwOq/zOu/9Oq/zOu/NVVddddVV/5cQXHXVVVdd9X/K537u5/4WwB980RdxcM89ALzU+7wP173My7C85x6e+j3fg/jXEy+AxHMTL5x4wcSLTrxw4nltXHcdt7zxG/MPv/iL7N1zDy+MAAECBAgQIECAAAECBIir/qcSIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAuOp/KgECBAgQIECAAAECBIj/GwQIECBAgAABAsT/HHv33MPtf/VXnLj+eh76Mi/D/cz/P3//i7/IpbvvZuu663jp93kfAA7uuYff+6IvAuAd3/EdP+uaa655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qv9aAgQIECBAgAABAgQIECBAgAABAsT/XwIECBAgQIAAAQLE/y4CBAgQIECA+M/3x9/5nQC83vu9H/8W5v+mP/rO7wTg2pd+aR7+Jm+CgIN77uEPvvALAXid13md936xF3ux1+aqq6666qr/iQiuuuqqq676H+nDP/zDvwvgab/0S9z713/N/V7lUz4FgH/40i9lec89vKgEiH87AeJFJx5A4vkR/36SADj10i/NqZd+aR7/i7/I3j338L+ZAAECBAgQIECAAAECBAgQIK666v83AQIECBAgQIAAAQIECBAgQID4v0+AAAECBAgQIED87yBAgAABAgQIEP9+e/fcw+N+8Rd5yMu8DA95mZfh/yLzr7d3zz38yhd8AQAv+T7vw9Z11yHgvr/+a/7mu76La6655sEf/uEf/l1cddVVV131PxHBVVddddVV/+O84zu+42e92Iu92Gsf3nMPf/RFXwSAgNf/mq8B4OLf/A13/cqv8G8hXgCJF4V40Yl/O/H8iefvpjd+YwD+5Du/k/8pBAgQIECAAAECBAgQIECAuOqqq/67CBAgQIAAAQIECBAgQID4v0eAAAECBAgQIED8zydAgAABAgSIF90ff+d3AvCyb/Zm/E9mXjDzH+9xv/RL3PFXf8XWddfxku/zPtzvqb/0Sxzccw/XXHPNg9/xHd/xs7jqqquuuup/GoKrrrrqqqv+R7nmmmse/E7v9E6fDfBHX/iFCBBwzUu/NNe+zMsA8A9f+qX8ewgQ/3biRSdeOPGCiRfNxnXXcfMbvzGP/8VfZO+ee/jPIkCAAAECBAgQIECAAHHV/1UCBAgQIECAAAECBAgQIECAuOr/IgECBAgQIECAAAECBIj/GwQIECBAgAABAsT/XAIECBAgQIB4Tnv33MMdf/VXPORlXoaHvMzL8J/B/O9gntOvfsEXAPCwN3kTrn3plwbg8J57+MMv/EIAXud1Xue9X+zFXuy1ueqqq6666n8Sgquuuuqqq/5H+fAP//DvAnjaL/0S9/31X3O/V/nUTwXgqd/zPSzvuYf/CALEA0i8qMSLTgASL4j41xHP6ZHv/d4APO6Xfol/LQECBAgQIECAAAECxFX/EQQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAsS/jwABAgQIECBAgAAB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67zO67z367zO67w3V1111VVX/VchuOqqq6666r/Mh3/4h38XwJ980RdxeM893O+VPuVTAHja934vq3vv5V8iQDwXif8IAsRzkXhRiBeNeOHE87rxjd+Yky/90vzpd34nz48AAQIECBAgQIC46n4CBAgQIECAAAECBAgQIECAAAECBIirrnrRCBAgQIAAAQIECBAgQIAAAQIECBAgrhIgQIAAAQIECBAg/pNJIIEEEkgggQQS/x4CBAgQIECAAPE/w9499/DrX/AFHL/+eh78Mi/DVc9r7557+LUv+AIAXuVTP5X7Hd5zD3/0RV8EwDu+4zt+FlddddVVV/1XIbjqqquuuuq/xOd+7uf+1jXXXPPg+/76r3n6L/8y93ulT/kUNq+7jot/8zc8/Xu/l38NAeI/hwDxrydA/MvEM0m8KG58ozcC4M++67sQIECAAPH/iwABAgQIECBAgAABAgQIECBAXHXV/24CBAgQIECAAAECBAgQIECAAPH/hwABAgQIECBAgPhPJIEEEkgggQQSSPx7CBAgQIAAAeK/1p1/9VcAvM77vR//Hub/rjv/6q+446/+is3rruNVPuVTuN/TfumXuPev/oprrrnmwR/+4R/+XVx11VVXXfVfgeCqq6666qr/dC/2Yi/22i/2Yi/22gB/8kVfxP2ueemX5iFv/MYAPP17v5d/KwECJPEfTTyTxL+G+JeJF0w828mXfmlOvvRL84Rf+iX+LxEgQIAAAQIECBAgQIAAAeKqq6769xAgQIAAAQIECBAgQIAA8X+XAAECBAgQIECA+E8igQQSSCCBBBJI/FsJECBAgAAB4j/e3j338Phf/EUe8rIvy0Ne9mUBMP+xzP9ue/fcw69/wRcA8NA3eROufemXRlzxR1/0RQC8zuu8znu/+Iu/+Gtz1VVXXXXVfzaCq6666qqr/tN9+Id/+HcB/P13fReH99zD/V78fd4HgKd97/dy8W/+hv8IAsR/LAHiX0/8y8QLJq54+Hu9FwB/+p3fyf9kAgQIECBAgAABAgQIEFddddX/FgIECBAgQIAAAQIECBD/twgQIECAAAECxH8SCSSQQAIJJJD4txIgQIAAAQLEv92ffud3AvA67/d+PAeb/43Mi868aPbuuYc/+c7vBOBVPvVTARBwdM89/PEXfREAH/7hH/7dXHXVVVdd9Z+N4Kqrrrrqqv9UH/7hH/5d11xzzYPv++u/5h+++7sRIODF3/u9uealX5rVPffw9O/9Xv7DSAAIEP+xJCH+dcS/TBIvyMmXfmlOvvRL84Rf+iX277mH/2oCBAgQIECAAAECBIir/jsIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFf9VxMgQIAAAQIECBAgQPzvJ0CAAAECBAgQ/wkkkEACCSSQQOLfSoAAAQIEiH/Z3j338Phf/EUe/DIvw4Nf5mW46vl7/C/+Inf+1V+xed11vMT7vA/3u/ev/op7/+qvOHPmzIM+/MM//Lu46qqrrrrqPxPBVVddddVV/2le7MVe7LVf53Ve570B/uG7vov7XfPSL82Lv8/7APC4L/sy/jMJECD+44h/HfFv9/D3ei8A/vQ7v5P/KAIECBAgQIAAAQIEiKv+NQQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAXPWiEiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgLjqX0OAAAECBAgQIECAAPG/kwABAgQIECBA/AeTQAIJJJBAAol/CwECBAgQIEA8259+53cC8Drv9368qMy/n/m3Mf/19u65h1//gi8A4KFv8iZc89IvDcDhPffwx1/0RQC8zuu8znu/2Iu92Gtz1VVXXXXVfxaCq6666qqr/tN8+Id/+HcB/P13fRf3/fVfc78Xe5/3AeDuX/kVLv7N3/AfTuL5ESD+Y4h/HfHCiee1uO46Tr70S/OEX/ol9u+5hxeFAAECBAgQIECAuOqBBAgQIECAAAECBAgQIECAAAECBAgQV131bAIECBAgQIAAAQIECBAgQIAAAQIECBBX3U+AAAECBAgQIED87yNAgAABAgSI/2ASSCCBBBJIIPFvIUDA/j338Phf/EUe8rIvy4Nf5mX4n8D8z7N3zz38yXd+J5vXXcerfOqncr/De+7hj7/oiwD48A//8O/iqquuuuqq/ywEV1111VVX/af48A//8O+65pprHnzfX/81//Dd3839HvLGb8w1L/3SrO65h8d/2Zfx30GA+DeSuJ8A8aITL4SEeE4Pe6/3AuBPv/M7ESBAgAABAgQIECD+/xEgQIAAAQIECBAgQIAAAQIEiKuu+t9BgAABAgQIECBAgAABAgQIECD+fxEgQIAAAQIECBD/ewgQIECAAAECxH8gCSSQQAIJJF5Uf/qd3wnAy7zZm/E/ks1/NvMve8Iv/iJ7d9/N5nXX8RLv8z7c796/+ivu/au/4pprrnnwh3/4h38XV1111VVX/WcguOqqq6666j/ci73Yi73267zO67w3wD9813dxv83rruMVP+VTAHjcl30ZAAIEiP9gEv8SAeLfT7zoxAsnrlhcdx03vvEb84Rf+iUO7rmH/+sECBAgQIAAAQIECBAgQIC46qqrXhQCBAgQIECAAAECBAgQIED83yVAgAABAgQIECD+dxAgQIAAAQLEfxAJJJBAAgkkkHig/Xvu4c6/+ise8jIvw4Nf5mX4v8L8x9q75x5+/Qu/EICHvsmbsHnddQAc3nMPf/xFXwTA67zO67z3i73Yi702V1111VVX/UcjuOqqq6666j/cO73TO30WwN9/13dx31//Nfd7xU/5FADu/pVfYfdv/obnJkCA+K8lQPwrSDw38aITL4DE/R72Xu8FwBN+6Zf430iAAAECBAgQIECAAAHiqquu+p9IgAABAgQIECBAgAAB4v8WAQIECBAgQID4n0+AAAECBIj/QBJIIIHEr3/hF3L8+ut5mTd7M656we78q7/i8b/4i2xedx2v8imfggABh/fcw99913cB8OEf/uHfxVVXXXXVVf/RCK666qqrrvoP9Y7v+I6f9WIv9mKvfd9f/zX/8N3fzf0e8sZvzDUv/dIAPP7Lvox/iQAB4t9B4l9DgPi3EyBeNOIFE3DjG78xT/ilX+Kuv/or/qcQIECAAAECBAgQIEBc9T+RAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBIir/qcRIECAAAECBAgQIED87ydAgAABAgQIEP9zCRAgQIAAAeLfZ/+ee7jzr/6KB7/My3D8+ut5buZFY/5vMC/Yn37nd7J3991c8zIvw0Pe5E0AEPD0X/ol7vurv+Kaa6558Id/+Id/F1ddddVVV/1HIrjqqquuuuo/zIu92Iu99ju90zt9NsA/fNd3IUCAgFf8lE8B4C8//uP51xIg/usIEP8CiRdEvGjE8/fin/RJADzhl36J/2wCBAgQIECAAAECBIir/q0ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEiP+bBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECxFX/VgIECBAgQIAAAQLE/14CBAgQIECAAPE/kwABAgQIEC+6P/2u7+L49dfzOu/3fvxnMP/xzH+9vXvu4U+/8zsBeIn3eR82r78egMN77uGPv+iLAHjxF3/x13mxF3ux1+aqq6666qr/KARXXXXVVVf9h3mnd3qnzwL4h+/6Ls7+9V9zv9f+mq8B4OLf/A27f/M3IPFvIUCA+FeQ+LcSIP5txItGPBeJG974jbnzr/6Ku/7qr/j3ECBAgAABAgQIEFc9PwIECBAgQIAAAQIECBAgQIAAAQIECBBX/V8nQIAAAQIECBAgQIAAAQIECBAgQIAAAeKqBxIgQIAAAQIECBAg/vcRIECAAAECxP88AgQIECBAPK87/+qvuPOv/ooHv8zL8F/NvGDmP4b5tzPP6Qm/9Evc+Vd/xeZ11/ES7/M+IIHE4b338nff9V2cOXPmQR/+4R/+XVx11VVXXfUfheCqq6666qr/EO/4ju/4WS/2Yi/22of33MM/fPd3c78zL/3SXPPSLw3A47/sy3gWiX8PAQLEfz4B4l9P/Os97L3eC4A/+67v4gURIECAAAECBAgQIP5/EiBAgAABAgQIECBAgAABAgQIEFdd9d9PgAABAgQIECBAgAABAgQIECD+fxIgQIAAAQIECBD/ewgQIECAAAHifxYBAgQIEPBn3/VdHL/+et7m0z6Nq164X/+CLwDgIW/8xlzz0i/N/Z7+y7/MfX/1V1xzzTUP/vAP//Dv4qqrrrrqqv8IBFddddVVV/27vdiLvdhrv9M7vdNnA/zpF30RD/SKn/IpADz+y76M1b338p9BgADxAkj8RxDPReJfIv5l4tke9l7vxV1/9Vfc/Vd/hQABAgQIEP8/CBAgQIAAAQIECBAgQIAAcdVVVwEIECBAgAABAgQIECBAgADxf58AAQIECBAgQID4n0+AAAECBAgQ/zPc+Vd/xZ1/9Vc8+GVfFnPVC7N/zz38+hd+IQCv/Cmfwv0O77mHP/7iLwbgxV7sxV77xV7sxV6bq6666qqr/r0Irrrqqquu+nd7p3d6p88C+Ifv+i7O/vVfc79X/JRPYfO667j4N3/D3b/6qzwPif9oAgSI/xwCxL+O+JcJuOGN3giAJ/zSL/F/jQABAgQIECBAgAABAsRVV13130GAAAECBAgQIECAAAHi/yYBAgQIECBAgPifTYAAAQIECBD/tf7su76L49ddx0u/6ZvyojD//5gr7vyrv+LOv/orNq+7jlf+lE/hfof33MPffdd3cc011zz4wz/8w7+Lq6666qqr/r0Irrrqqquu+nd5x3d8x896sRd7sdc+vOce/uG7v5v7nXnpl+bBb/zGADz9+76PF0jiP4sAAQKQ+I8knkniRSH+ZQ97r/di/557eOIv/RL/0wkQIECAAAECBAgQIEBcddVV/xcJECBAgAABAgQIECBA/N8gQIAAAQIECBD/cwkQIECAAAHiP97e3Xdz51/9Fa/zvu/Lv5f5r2VedObfb/+ee/j1L/xCAB7yxm/MtS/90ggQ8PRf/mUO77mHa6655sHv+I7v+FlcddVVV13170Fw1VVXXXXVv9mLvdiLvfY7vdM7fTbAn37RFwEgQMCLv8/7APD07/1edv/mb/jvJkCA+I8jQLzoxAt2wxu9EYvrruPPvvM7+e8kQIAAAQIECBAgQFz1H02AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQV/1HEiBAgAABAgQIECD+dxMgQIAAAQLE/1wCBAgQIED82+3fcw9P+KVf4vj11/PSb/qmXPXC7d9zD3/6nd8JwCt9yqdwv6N77uFPvuiLAHid13md937xF3/x1+aqq6666qp/K4Krrrrqqqv+zd7pnd7pswBu/eVf5txf/zXiise+93tz5qVfmtW99/L07/s+/kUS/yUkAASI/zjiRSeev4e+13sB8MRf+iX+MwgQIECAAAECBAgQV70wAgQIECBAgAABAgQIECBAgAABAgQIECBAgLjqfzIBAgQIECBAgAABAgQIECBAgAABAgQIECBAXPWCCBAgQIAAAQIECBD/+wgQIECAAAECxP88AgQIECBAvGju/Ku/4s6/+ite+33fl/9pzP88j/+lX+LOv/orNq+7jlf6lE/hfvf99V/z99/1XVxzzTUP/vAP//Dv5qqrrrrqqn8rgquuuuqqq/5N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qquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8V/wihZ6yMpZ7DXAAAAABJRU5ErkJggg==) + +```js +// Setting the appearance of a 3D pattern can be done _before_ or _after_ the pattern. +// This example shows _before_ the pattern. +exampleSketch = startSketchOn('XZ') + |> startProfileAt([0, 0], %) + |> line([0, 2], %) + |> line([3, 1], %) + |> line([0, -4], %) + |> close(%) + +example = extrude(1, exampleSketch) + |> appearance({ + color = '#ff0000', + metalness = 90, + roughness = 90 + }, %) + |> patternLinear3d({ + axis = [1, 0, 1], + instances = 7, + distance = 6 + }, %) +``` + +![Rendered example of appearance 5](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAACi7UlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VlOPHj3PVVVddddVVV1111VVXXXXV/z7XXHPNgx/84Ae/tCQODw93ueqqq6666qrnReWqq6666qqrrrrqqquuuuqq/zWuueaaB7/2a7/2e734i7/4a7/Yi73Ya9933323XnPNNQ/+kR/5kc/+0R/90c/hqquuuuqqq54TetCDHsRVV1111VVXXXXVVVddddVV/3Ndc801D37t137t93rxF3/x136xF3ux196/5x6e+Iu/CMATf+mXeNSbvAkv/77vy3333XfrZ33WZ73OfffddytXXXXVVVdddQV60IMexFVXXXXVVVddddVVV1111VX/s1xzzTUPfu3Xfu33ep3XeZ33vuaaax68f889PPEXf5GDe+7hib/0Szy3l3uf9+Hl3/d9ue+++279rd/6re/+0R/90c/hqquuuuqqq4DKVVddddVVV1111VVXXXXVVf8jXHPNNQ9+7dd+7fd6ndd5nfe+5pprHrx/zz088ed/nsfdcw9P/KVf4gXZvu46APbvuYdrrrvuwS/+4i/+2r/927/9Pffdd9+tXHXVVVdd9f8dlauuuuqqq6666qqrrrrqqqv+21xzzTUPfu3Xfu33ep3XeZ33vuaaax68f889PPHnf54/+eu/5q6/+itekO3rruORb/ImPOpN35Tt667jgV7sxV7stc+cOfPg++6771auuuqqq676/47KVVddddVVV1111VVXXXXVVf+lrrnmmge/9mu/9nu9zuu8zntfc801D96/5x6e+PM/z5/89V9z11/9FS/IznXX8cg3eRMe+aZvyvZ113G/o3vu4Rm//Muc++u/5uU++ZPZuO46zp49eytXXXXVVVddBVSuuuqqq6666qqrrrrqqquu+k93zTXXPPi1X/u13+t1Xud13vuaa6558P499/DEn/95/uSv/5q7/uqveG7iiu3rruORb/ImvNz7vi8PdHTPPTzjl3+Zc3/915z767/mfhvXXQfAfffddytXXXXVVVddBVSuuuqqq6666qqrrrrqqquu+k9xzTXXPPi1X/u13+ud3umdPhtg/557eOLP/zx/8td/zV1/9VfcTzyn7euu45Fv8ia83Pu+Lw90dM89POOXf5lzf/3XnPvrv+aqq6666qqrXgRUrrrqqquuuuqqq6666qqrrvoPc8011zz4tV/7td/rnd7pnT4bYP+ee/jz7/xO7v7rv+auv/orxBXiOW1fdx2PfJM34eXe9315oKN77uG2X/5lzv71X3Pur/+aF+b0S780AP/wD//w21x11VVXXXXVFVSuuuqqq6666qqrrrrqqquu+ne55pprHvzar/3a7/VO7/ROnw2wf889/Pl3fidP/qVfYv+ee7ifeE7Xv8zLcMNLvzQv977vywMd3XMPt/3yL3PbL/8yR/fcA4D5l21cdx0A9913361cddVVV1111RVUrrrqqquuuuqqq6666qqrrvpXe7EXe7HXfrEXe7HXeqd3eqfPBti/5x7+4ju/kyf90i+xf889vCDXv8zLcMNLvzQv977vywMd3XMPt/3yL3PbL/8yR/fcwwOZF83Gdddx1VVXXXXVVc+FylVXXXXVVVddddVVV1111VUvkhd7sRd77Rd7sRd7rXd6p3f6bID9e+7hL77zO3nSL/0S+/fcw/Ozfd11PPJN3gSAl3vf9+WBju65h9t++Ze57Zd/maN77uHfa/O66wD4h3/4h9/hqquuuuqqq66gctVVV1111VVXXXXVVVddddXzdc011zz4zJkzD36xF3ux13qnd3qnzwbYv+ce/uI7v5Mn/dIvsX/PPTw/29ddxyPf5E3Yvv56Hvkmb8IDHd1zD7f98i9z2y//Mkf33MO/xFx11VVXXXXVvwuVq6666qqrrrrqqquuuuqqq57lmmuuefBrv/Zrv9c111zz4Nd5ndd5b4D9e+7hL77zO/mL7/ounh8B29ddxyPe5E3Yvv56Hvkmb8IDHd1zD7f98i/zhO/+bv4znX7plwbgH/7hH36bq6666qqrrrqCylVXXXXVVVddddVVV1111f9z11xzzYNf+7Vf+72uueaaB7/O67zOewPs33MPf/Gd38lffNd38dzEFdvXXccj3uRNuOFlXobrX+ZleKCje+7htl/+ZZ7w3d/Nv5X519m47jquuuqqq6666rlQueqqq6666qqrrrrqqquu+n/ommuuefBrv/Zrv9eLv/iLv/aLvdiLvTbA/j338Bff+Z38xXd9F/cTz2n7uut4xJu8CTe8zMtw/cu8DA90dM893PbLv8wTv/u7ATD/Pe67775bueqqq6666qorqFx11VVXXXXVVVddddVVV/0/cc011zz4tV/7td/rxV/8xV/7xV7sxV4bYP+ee/iL7/xO/uK7vgtxhXhO29ddxyPe5E244WVehutf5mV4oHN//dec++u/5onf/d08kPn3Mf86p1/6pQG47777buWqq6666qqrno3KVVddddVVV1111VVXXXXV/xMf/uEf/l0v9mIv9tp3/dVf8Rff+Z385Xd9F/cTz2n7uut4xJu8CTe8zMtw/cu8DA907q//mnN//dc88bu/m/8pNq67DoB/+Id/+G2uuuqqq6666tmoXHXVVVddddVVV1111VVX/T/w4R/+4d/1Yi/2Yq+9f8893P1Xf8Vfftd38dy2r7uOR7zJm/DIN31Ttq+7jvsd3XMP5/76rzm65x6e+N3fzb/E/PuYq6666qqrrvoPQ+Wqq6666qqrrrrqqquuuur/gWuuuebBB/fcw/Z11/HIN31TAP7yu76L7euu4xFv8iY88k3flO3rruN+R/fcw22//Mss77mH2375l/mfbuO66wC47777buWqq6666qqrno3KVVddddVVV1111VVXXXXV/wNnzpx58N98x3ewdd11vNT7vA8v977vyyPf9E3Zvu467nd0zz3c9su/zPKee7jtl3+Zfwvz72P+bTavuw6As2fPPoOrrrrqqquuejYqV1111VVXXXXVVVddddVV/4/8zXd9FwAv9T7vw/Z113F0zz3c/su/zLm//mvO/fVf87/V6Zd+aQDuu+++W7nqqquuuuqqZ6Ny1VVXXXXVVVddddVVV131/8A111zz4L+6+24A7vnrv+algKN77uHX3/md+Y9i/n3Mv9/Zs2dv5aqrrrrqqquejcpVV1111VVXXXXVVVddddX/cddcc82DAQ7vuQeAreuuA+D8X/819zP/u21cdx0A9913361cddVVV1111bNRueqqq6666qqrrrrqqquu+j/uzJkzD+aFMP9+5t/H/NttXHcdAPfdd9+tXHXVVVddddVzonLVVVddddVVV1111VVXXfV/3DXXXPNggIN77gFg67rrADi65x7+I5j/XovrrgPg7Nmzt3LVVVddddVVz4nKVVddddVVV1111VVXXXXV/zNb118PwNE992D++5l/n83rrgPgvvvuu5Wrrrrqqquuek5Urrrqqquuuuqqq6666qqr/o87c+bMg+75q78CAIn/SOa/l4GN664D4L777ruVq6666qqrrnpOVK666qqrrrrqqquuuuqqq/6Pu+aaax58eM893G/ruusAOLrnHv67mX+/jeuuA+Ds2bPP4KqrrrrqqqueE5Wrrrrqqquuuuqqq6666qr/Zzavuw6Ao3vu4d/D/PcyV2xcdx1XXXXVVVdd9QIQXHXVVVddddVVV1111VVX/R93zTXXPPjgnnu439Z11wFwdM89/Hcy/zE2r7sOgH/4h3/4ba666qqrrrrqORFcddVVV1111VVXXXXVVVf9H3fmzJkHH9xzD/+RzL+P+fcxz7Zx3XUA3Hfffbdy1VVXXXXVVc+JylVXXXXVVVddddVVV1111f8jW9ddB8DRPfdw1VVXXXXVVf8PEFx11VVXXXXVVVddddVVV/0fd8011zz44O67QWLzuusAOLrnHv6tzL+P+fcxz3b6pV8agH/4h3/4ba666qqrrrrqeVG56qqrrrrqqquuuuqqq676P+yaa655MMDhPfcAsHXddQAc3XMP/xdsXncdAPfdd9+tXHXVVVddddXzonLVVVddddVVV1111VVXXfV/2JkzZx7MfyDz72P+fcxVV1111VVX/asQXHXVVVddddVVV1111VVX/R92zTXXPBjg4J57ANi67joAju65h/8LTr/0SwPwD//wD7/DVVddddVVVz0vKlddddVVV1111VVXXXXVVf/HHdxzD/fbuv56AJb33MO/lvn3Mf8+5qqrrrrqqqv+1ahcddVVV1111VVXXXXVVVf9H3bmzJkHHdx9N/9e5n+mMy/90gD8wz/8w29z1VVXXXXVVc+LylVXXXXVVVddddVVV1111f9h11xzzYMP77kHJACufemXBuDcX/81/5XMv4+56qqrrrrqqn8TKlddddVVV1111VVXXXXVVVe9UOZ/ro3rrgPgvvvuu5Wrrrrqqquuel4EV1111VVXXXXVVVddddVV/4ddc801Dz645x7ut3XddQAc3XMP/1XMv495/jauuw6A++6771auuuqqq6666vkjuOqqq6666qqrrrrqqquu+j/szJkzDz645x7+rcz/XGde+qUB+Id/+Iff5qqrrrrqqqueP4Krrrrqqquuuuqqq6666qr/w6655poH80xb110HwNE99/Bfxfz7mKuuuuqqq676d6Fy1VVXXXXVVVddddVVV131f9zB3XcDcO1LvzQAR/fcw4vC/M+2cd11ANx33323ctVVV1111VXPH5Wrrrrqqquuuuqqq6666qr/o6655poHAxzeey8PdHTPPfxXMP8+5oXbuO46AM6ePfsMrrrqqquuuur5o3LVVVddddVVV1111VVXXfV/1JkzZx7MA2xddx0vKvM/38Z11wFw33333cpVV1111VVXPX9Urrrqqquuuuqqq6666qqr/o+65pprHgxwcM89AGxdfz0A5//6r3lhzL+f+fcx/7LN664D4OzZs7dy1VVXXXXVVc8flauuuuqqq6666qqrrrrqqv/DDu65h/+rNq67DoD77rvvVq666qqrrrrq+aNy1VVXXXXVVVddddVVV131f9SZM2cedHD33dxv87rrADi65x5eEPPvZ/59zFVXXXXVVVf9h6Fy1VVXXXXVVVddddVVV131f9Q111zz4MN77+V+W9ddB8DRPffwn8X81zj90i8NwD/8wz/8NlddddVVV131glG56qqrrrrqqquuuuqqq6666jLz38+8aDavuw6A++6771auuuqqq6666gUjuOqqq6666qqrrrrqqquu+j/qH/7hH37n2pd+abauuw6AreuuA+Donnv4z2D+62xcdx1XXXXVVVdd9SIguOqqq6666qqrrrrqqquu+j/qH/7hH377KOLWN/yar+Hal35pAI7uuYfnx/z3My+6jeuuA+Af/uEffoerrrrqqquuesEIrrrqqquuuuqqq6666qqr/o+67777bv2sz/qs1zmKuPWNvuZrADi65x7+M5irrrrqqquu+h+J4Kqrrrrqqquuuuqqq6666v+w++6779bP+qzPeh2eaeO667jljd+YBzL//cy/zpmXfmkA/uEf/uG3ueqqq6666qoXjHL8+HGuuuqqq6666qqrrrrqqqv+Lzs8PNw9e/bsMw4PD3cf+RIv8dLXv/qrc8sbvzHHHv5w+q0tLj3lKfx7mP96D3/7t6fb2uIXfuEXvubw8HCXq6666qqrrnr+0IMe9CCuuuqqq6666qqrrrrqqqv+P7jmmmse/GIv9mKv/Tqv8zrv9WIv9mKvzTMd3XMP5/76r7ntl3+Zc3/91/xrmX8f86/3tr/92wC83du9nbjqqquuuuqqFww96EEP4qqrrrrqqquuuuqqq6666v+ba6655sGv/dqv/V4v/uIv/tov9mIv9to809E993Dur/+a2375lzn313/Nv8T8+5h/vY3rruONf/iHue+++279kA/5kIdw1VVXXXXVVS8Y5fjx41x11VVXXXXVVVddddVVV/1/c3h4uPsP//APv/Nbv/Vb3/Pbv/3b33N4eLgriRsf+tAHH3v4w7nljd+YW974jTn28IczHhxwdM89/E9xw6u/Oje8+qvzp3/6pz/9p3/6pz/DVVddddVVV71glOPHj3PVVVddddVVV1111VVXXfX/2eHh4e4//MM//M5v/dZvfc9v//Zvf8/h4eGuJG586EMffOzhD+eWN35jbnnjN+bYwx/OeHDA0T33AGD+fcy/zfGHP5wbXv3VufXWW//6T//0T3+Gq6666qqrrnrBKMePH+eqq6666qqrrrrqqquuuuqqKw4PD3f/4R/+4Xd+67d+63t++7d/+3sODw93r7nmmgcfv/ba48ce/nBueeM35pY3fmO6rS0Aju65h/9qN7z6q3PmpV+aP/3TP/3pf/iHf/gdrrrqqquuuuoFoxw/fpyrrrrqqquuuuqqq6666qqrntfh4eHuP/zDP/zOL/zCL3zNb//2b3/P4eHh7jXXXPPg49dee/z0S780D3rjN+ZBb/zGdFtbABzdcw8vKvNv96A3fmOOP/zh/PZv//b33HrrrX/NVVddddVVV71g6EEPehBXXXXVVVddddVVV1111VVXveiuueaaB7/2a7/2e73TO73TZ/MAR/fcwzN++Zc599d/zbm//mteGPNv9xpf/dWceemX5jM/8zNf5x/+4R9+m6uuuuqqq656wdCDHvQgrrrqqquuuuqqq6666qqrrvrXu+aaax585syZB7/O67zOe73O67zOe/MAR/fcwzN++Ze57Zd/maN77uGBzL/PG//wD7Nx3XV8yId8yEPuu+++W7nqqquuuuqqFww96EEP4qqrrrrqqquuuuqqq6666qp/n2uuuebBL/ZiL/baL/ZiL/Zar/M6r/PePMDRPffwjF/+ZW775V/m6J57MP8+b/vbvw3A273d24mrrrrqqquueuHQgx70IK666qqrrrrqqquuuuqqq676j3PNNdc8+MVe7MVe+8Ve7MVe63Ve53Xem2c6uuceDu+5h9t++Zd5xi//Mv8Wi+uu401++Ie57777bv2QD/mQh3DVVVddddVVLxx60IMexFVXXXXVVVddddVVV1111VX/Oa655poHv9iLvdhrv9iLvdhrvc7rvM5780xH99zD4T33cNsv/zLP+OVf5kV1+qVfmtf86q/mH/7hH377Mz/zM1+Hq6666qqrrnrhKMePH+eqq6666qqrrrrqqquuuuqq/xyHh4e7t95661//6Z/+6c/89m//9vfceuutf7O5uXn8xoc+9MGb113HDa/+6jzojd+YYw9/OP3WFpee8hReEANnXvqlueHVX51/+Id/+O0//dM//Rmuuuqqq6666oWjHD9+nKuuuuqqq6666qqrrrrqqqv+8x0eHu7eeuutf/1bv/Vb3/Pbv/3b33Prrbf+zebm5vEbH/rQBx9/+MO54dVfnQe98Rtz7OEPp9/a4tJTnsJzu+HVX50zL/3S/Omf/ulP/8M//MPvcNVVV1111VUvHOX48eNcddVVV1111VVXXXXVVVdd9V/r8PBw99Zbb/3r3/qt3/qe3/7t3/6eW2+99W82NzeP3/jQhz74+MMfzg2v/uo86I3fmGMPfzj91ha7T3kKAA9+4zfm+MMfzm//9m9/z6233vrXXHXVVVddddULhx70oAdx1VVXXXXVVVddddVVV1111f8M11xzzYNf7MVe7LVf53Ve571e7MVe7LV5pqN77uHsX/81G9ddx5mXfmm+/uu//n1+67d+67u56qqrrrrqqheOcvz4ca666qqrrrrqqquuuuqqq/6rXXPNNQ9+szd7s4/63M/93N++5pprHry5uXni1ltv/Wv+nzs8PNy99dZb//q3fuu3vue3f/u3v+fw8HBXEjc+9KEPPv7wh7N53XUAfNd3fdfHHB4e7nLVVVddddVVLxx60IMexFVXXXXVVVddddVVV1111X+FF3uxF3vtF3uxF3utd3qnd/psgP177uFJv/iLvNz7vi8AX//1X/8+v/Vbv/XdXPU8rrnmmge/9mu/9nu9+Iu/+Gt//dd//fvcd999t3LVVVddddVV/zL0oAc9iKuuuuqqq6666qqrrrrqqv8M11xzzYNf+7Vf+72uueaaB7/O67zOewPs33MPT/rFX+Sev/5r7v6rvwLgEW/yJrzWp34q9913362f9Vmf9Tr33XffrVx11VVXXXXVVf8R0IMe9CCuuuqqq6666qqrrrrqqqv+o1xzzTUPfu3Xfu33evEXf/HXfrEXe7HXBti/5x6e/Iu/yJN+6Zc4uOcenp83+9qv5fqXeRn+4R/+4bc/8zM/83W46qqrrrrqqqv+I1C56qqrrrrqqquuuuqqq676d7rmmmse/Nqv/drv9eIv/uKv/WIv9mKvDbB/zz385Xd+J0/6pV/i4J57eGG2rruO/Xvu4XrgxV7sxV77mmuuefB99913K1ddddVVV1111b8Xlauuuuqqq6666qqrrrrqqn+Da6655sGv/dqv/V4v/uIv/tov9mIv9toA+/fcw19+53fyl9/1XfxLtq67jke+yZuwff31POJN3oT73Xfffbe+9mu/9nv96I/+6Odw1VVXXXXVVVf9e1G56qqrrrrqqquuuuqqq656EV1zzTUPfu3Xfu33ep3XeZ33vuaaax4McPdf/RV/+Z3fyV9+13fxL9m+7joe8SZvwvUv8zJc/zIvwwMd3XMPANdcd92Dz549+wyuuuqqq6666qr/CFSuuuqqq6666qqrrrrqqqteiGuuuebBr/3ar/1e7/RO7/TZAPv33MPdf/EX3HH33fzld30XL4i4Yuu663jEm7wJ17/My3D9y7wMD3R0zz3c/su/zBO/+7sx8DKf/Mnc8sZvzFVXXXXVVVdd9R+GylVXXXXVVVddddVVV1111XO55pprHvzar/3a7/VO7/ROnw2wf889/OV3fif799zDk3/pl3h+xLNtXXcdj3iTN+GRb/qmbF13Hfc7uuceju65h/N//dc88bu/m/uZKzauuw6A++6771auuuqqq6666qr/CFSuuuqqq6666qqrrrrqqquAF3uxF3vtF3uxF3utd3qnd/psgP177uEvv/M7ufuv/5q7/+qveCDxvLauu45HvMmb8Mg3fVO2rruO+x3dcw+3//Ivc3TPPdz+y7/MC7Nx3XUAnD179lauuuqqq6666qr/CFSuuuqqq6666qqrrrrqqv+Xrrnmmge/9mu/9ntdc801D36d13md9wbYv+ce/vI7v5O7//qvufuv/goAAeL527ruOh7xJm/Cy77v+/JAR/fcw+2//Muc++u/5vxf/zUvjLnqqquuuuqqq/4TUbnqqquuuuqqq6666qqr/t+45pprHvzar/3a7/XiL/7ir/1iL/Zirw2wf889/OV3fidP+qVf4uCeexBXiOfv+pd5Ga576ZfmZd/3fXmgo3vu4fZf/mXO/fVfc/6v/5p/i43rrgPgvvvuu5Wrrrrqqquuuuo/ApWrrrrqqquuuuqqq6666v+0a6655sGv/dqv/V4v/uIv/tov9mIv9toA+/fcw19+53fy5F/6JQ7uuYf7iee1dd11POJN3oTt66/nEW/yJjzQ0T33cPsv/zK3//Ivc3TPPfxrmauuuuqqq6666j8Zlauuuuqqq6666qqrrrrq/5xrrrnmwa/92q/9Xi/+4i/+2i/2Yi/22gAH99zDX37nd/JX3/Vd/Eu2rruOR7zJm3D9y7wM17/My/BAR/fcw+2//Mvc/su/zNE99/AfZeO66wC47777buWqq6666qqrrvqPQuWqq6666qqrrrrqqquu+j/hmmuuefBrv/Zrv9frvM7rvPc111zzYIC7/+qv+Mvv/E7+6ru+i3/J1nXX8Yg3eROuf5mX4fqXeRke6Oiee7j9l3+ZJ373d/MfxTynjeuuA+Ds2bO3ctVVV1111VVX/UehctVVV1111VVXXXXVVVf9r3XNNdc8+LVf+7Xf653e6Z0+G+Dgnnu4+y/+gjvuvpu/+q7v4l+ydd11PPJN3oRHvOmbsnXddTzQ+b/+a8799V/zpO/+bgDMf66N664D4L777ruVq6666qqrrrrqPwqVq6666qqrrrrqqquuuup/pXd8x3f8rHd6p3f67IN77uEvv/M7ObjnHp78S7/Ev2T7+ut5xJu8CY94kzdh67rruN/RPfdw+y//MgBP+u7v5j+Tueqqq6666qqr/otQueqqq6666qqrrrrqqqv+13md13md936nd3qnzwb4kXd4B14QAUhsXXcdj3iTN+Fl3ud9eKCje+7h9l/+Zc7/9V9z/q//mhfE/Mcxz9/iuusAuO+++27lqquuuuqqq676j0Llqquuuuqqq6666qqrrvpf58yZMw/ima5/mZfh7r/6KwAkcb/rXvqluf5lXoaXeZ/34YGO7rmH23/5lzn/N3/D+b/+a7D5n2DjuusAOHv27DO46qqrrrrqqqv+o1C56qqrrrrqqquuuuqqq/5X2r/nHravu47X/NRP5Uff8R3Zuu46HvEmbwLAy7zP+/BAR/fcw+2//Muc/5u/4fxf/zX/GuY/jrnqqquuuuqqq/6LUbnqqquuuuqqq6666qqr/te55pprHnxw990I2LruOt7ka76G61/mZXigo3vu4fZf/mXu+JVf4eiee3iBJLB5fsx/nY3rrgPgvvvuu5Wrrrrqqquuuuo/CpWrrrrqqquuuuqqq6666n+lu//6r7n7r/+al32f9+H6l3kZAI7uuYfbf/mXedL3fA//05gXbuO66wA4e/bsrVx11VVXXXXVVf9RqFx11VVXXXXVVVddddVV/2sd3HMPAOf/+q/5w4/5GP4jmauuuuqqq6666v8Agquuuuqqq6666qqrrrrqf51rrrnmwfv33MPWddcBcO6v/5r/ycy/bOO66wC47777buWqq6666qqrrvqPQnDVVVddddVVV1111VVX/a9z5syZB/MfSeKBzFVXXXXVVVdd9X8Elauuuuqqq6666qqrrrrqf63t664DYHnvvfxPZf5lG9ddB8B99913K1ddddVVV1111X8kgquuuuqqq6666qqrrrrqf6WDu+/mP4P5r7dx3XUAnD179lauuuqqq6666qr/SARXXXXVVVddddVVV1111f8611xzzYP5jyZh/mOZF83GddcBcN99993KVVddddVVV131H4nKVVddddVVV1111VVXXfW/0v4997B13XUAHN1zD//TmKuuuuqqq6666n8AKlddddVVV1111VVXXXXV/1rb118PwPKee/j3Mv99FtddB8B99913K1ddddVVV1111X8kgquuuuqqq6666qqrrrrqf5VrrrnmwQAH99zDfziJ/wjmX2fjuusAOHv27DO46qqrrrrqqqv+I1G56qqrrrrqqquuuuqqq/5XOXPmzIP5D2auuuqqq6666qr/o6hcddVVV1111VVXXXXVVf9rbV13HQBH99zD/xTmX2/juusAuO+++27lqquuuuqqq676j0Rw1VVXXXXVVVddddVVV/2vcs011zx4/557+I9inovEf7WN664D4OzZs7dy1VVXXXXVVVf9R6Jy1VVXXXXVVVddddVVV/2vc3D33Wxddx0AR/fcw/8U5qqrrrrqqquu+h+G4Kqrrrrqqquuuuqqq676X0n8+5kXQOK/0sZ11wFw33333cpVV1111VVXXfUficpVV1111VVXXXXVVVdd9b/KmTNnHrR/zz1sX3cdAMt77uHfwvzHMlddddVVV1111f9AVK666qqrrrrqqquuuuqqq/4bbVx3HQD33XffrVx11VVXXXXVVf/RCK666qqrrrrqqquuuuqq/1WuueaaBwNsXX89AEf33MO/lnkRSLyozL/dxnXXAXD27Nlbueqqq6666qqr/qNRueqqq6666qqrrrrqqqv+1zm45x7+r9i47joA7rvvvlu56qqrrrrqqqv+oxFcddVVV1111VVXXXXVVf+rXHPNNQ/m38H8xzJXXXXVVVddddX/YARXXXXVVVddddVVV1111f86+/fcw9Z11wFwdM89/KeR+M+2uO46AO67775bueqqq6666qqr/qMRXHXVVVddddVVV1111VX/q5w5c+bBANvXXQfA8t57eVGZ/1jm32/juusAOHv27DO46qqrrrrqqqv+oxFcddVVV1111VVXXXXVVf/rHNx9N/9lJK666qqrrrrqqv+1qFx11VVXXXXVVVddddVV/6tcc801D+bfwPzHMv8xNq67DoD77rvvVq666qqrrrrqqv9oBFddddVVV1111VVXXXXV/zr799zD1nXXAXB0zz38p5P4z7Jx3XUAnD179lauuuqqq6666qr/aFSuuuqqq6666qqrrrrqqv+Vtq+/nheV+Y9lrrrqqquuuuqq/yWoXHXVVVddddVVV1111VX/a1xzzTUP5rks77mH/802rrsOgPvuu+9Wrrrqqquuuuqq/2gEV1111VVXXXXVVVddddX/Ogf33MOLyvwHkQAw/3HMVVddddVVV131n4zKVVddddVVV1111VVXXfW/xn333XcrwPUv/dJsXXcdAEf33MP/VhvXXQfAfffddytXXXXVVVddddV/BoKrrrrqqquuuuqqq6666n+Vf/iHf/jtR7zJm/CiMP/BJP6jGNi47joAzp49eytXXXXVVVddddV/BoKrrrrqqquuuuqqq6666n+VH/mRH/mcR77Jm/DfwfzH2rjuOgDuu+++W7nqqquuuuqqq/4zEFx11VVXXXXVVVddddVV/6v8wz/8w2//wz/8w28DHN1zDy+I+U8icdVVV1111VVX/a9BcNVVV1111VVXXXXVVVf9r/P3f//3v80zPfK93otTL/3S/Gcz/3HMFRvXXQfAfffddytXXXXVVVddddV/BipXXXXVVVddddVVV1111f86v/3bv/09Z8+efcaHf/iHf9ej3vu9ATi65x7O//Vfc/uv/Arn/vqv+U8lgc2/18Z11wFw9uzZZ3DVVVddddVVV/1noBw/fpyrrrrqqquuuuqqq6666n+Xw8PD3aOjo91f+IVf+JrDw8Pda6655sHHr732+LGHP5yb3/iNufmN35hjD3844+Ehy3vu4d/L/Mcxz3b9q786xx7+cP70T//0Z2699da/5qqrrrrqqquu+o+GHvSgB3HVVVddddVVV1111VVX/e93zTXXPPi1X/u13+t1Xud13vuaa655MM90dM89nP/rv+a2X/kVzv/1X/NvYV4Am38t82yv/tVfzemXfmk+8zM/83X+4R/+4be56qqrrrrqqqv+o6EHPehBXHXVVVddddVVV1111VX/t1xzzTUPfu3Xfu33evEXf/HXfrEXe7HX5pmO7rmH83/919z2K7/C+b/+a14U5oWw+dcwz+kNf/iH2bjuOj7kQz7kIffdd9+tXHXVVVddddVV/9HQgx70IK666qqrrrrqqquuuuqq/7uuueaaB7/2a7/2e734i7/4a7/Yi73Ya/NMR/fcw/m//mvO/c3fcPsv/zIviPkX2LyozHN6wx/+YTauu44P+ZAPech99913K1ddddVVV1111X809KAHPYirrrrqqquuuuqqq6666v+Ha6655sGv/dqv/V4v/uIv/tov9mIv9to809E993D+r/+ac3/zN9z+y7/MA5l/gc2Lyjynt/7t3wbg7d7u7cRVV1111VVXXfWfAT3oQQ/iqquuuuqqq6666qqrrvr/55prrnnwa7/2a7/Xi7/4i7/2i73Yi702z3R0zz2c/+u/5tzf/A23/fIv8yKx+ZeY5/XWv/3bALzd272duOqqq6666qqr/jOgBz3oQVx11VVXXXXVVVddddVV/79dc801D36xF3ux136d13md93qxF3ux1+aZju65h3N//dec/5u/4bZf/mVeIJt/iXlOG9ddxxv+8A9z33333fohH/IhD+Gqq6666qqrrvrPgB70oAdx1VVXXXXVVVddddVVV111v2uuuebBL/ZiL/bar/M6r/NeL/ZiL/baPNPRPfdwdM893P4rv8Jtv/zLPA+bF8Y8p9Mv/dK8+ld/Nf/wD//w25/5mZ/5Olx11VVXXXXVVf8ZqFx11VVXXXXVVVddddVVVz3Afffdd+t999333b/1W7/13ddcc82DX+zFXuy1X+d1Xue9XuzFXuy1N667jtMv/dI86r3ei6N77uHcX/81t//Kr3B0zz28MOZ5bVx3HQD33XffrVx11VVXXXXVVf9ZqFx11VVXXXXVVVddddVVV70A991336333Xffd//Wb/3Wd19zzTUPfrEXe7HXfrEXe7HXep3XeZ333rjuOk6/9Evz6Pd+b47uuYfbfvmXuf2Xf5mje+7hqquuuuqqq676H4Ny/Phxrrrqqquuuuqqq6666qqr/iWHh4e7t95661//6Z/+6c/89m//9vfceuutf3N4eLj7kIc85KW7rS1Ov/RL87C3f3tueeM3ptvaQsDRPfdgnr/rX/3VOf3SL82f/umf/vQ//MM//A5XXXXVVVddddV/Bsrx48e56qqrrrrqqquuuuqqq6761zg8PNy99dZb//pP//RPf+a3f/u3v+fWW2/9m8PDw92HPOQhL91tbXH6pV+aW974jbnljd+YbmsLgKN77uGBbnnjN+bYwx/Ob//2b3/Prbfe+tdcddVVV1111VX/GSjHjx/nqquuuuqqq6666qqrrvqPdc011zz4zd7szT7qmmuuecitt9761/wfdnh4uHvrrbf+9Z/+6Z/+zG//9m9/z6233vo3h4eHuw95yENeutva4vRLvzS3vPEbc8sbvzHd1hYAR/fcw/Wv/uoce/jD+dM//dOfufXWW/+aq6666qqrrrrqPwN60IMexFVXXXXVVVddddVVV13173fNNdc8+LVf+7Xf63Ve53Xe+5prrnkwwH333Xfr2bNnb/3Mz/zM1+H/mWuuuebBZ86cefDrvM7rvNfrvM7rvDcPcHTPPWxcdx0An/mZn/k6//AP//DbXHXVVVddddVV/xmoXHXVVVddddVVV1111VX/Ztdcc82DX/u1X/u93umd3umzeaaDe+7hL7/zO7nnr/+aN/3ar30w/0/dd999t9533323/sM//MNv/+iP/ujnnDlz5sGv8zqv816v8zqv894b110HwD/8wz/89tmzZ2/lqquuuuqqq676z4Ie9KAHcdVVV1111VVXXXXVVVe96F7sxV7stV/sxV7std7pnd7ps3mmu//qr7j7r/6Kv/qu7+KB3vRrv5brX+Zl+MzP/MzX+Yd/+Iff5qrLrrnmmge/9mu/9nv96I/+6Odw1VVXXXXVVVf9Z0IPetCDuOqqq6666qqrrrrqqqtesGuuuebBr/3ar/1e11xzzYNf53Ve570BDu65hyf94i9ycM89PPmXfokX5BFv8ia85qd+Kv/wD//w25/5mZ/5Olx11VVXXXXVVVf916Jy1VVXXXXVVVddddVVVz2Pa6655sGv/dqv/V4v/uIv/tov9mIv9toAB/fcw19+53dyz1//NXf/1V/xwghA4p6//msAzpw582Cuuuqqq6666qqr/utRueqqq6666qqrrrrqqqsuu+aaax782q/92u/1Oq/zOu99zTXXPBjg4J57+Mvv/E7u+eu/5u6/+iueHwFI3G/ruut4xJu8CQAv8z7vA8A111zz4GuuuebB9913361cddVVV1111VVX/dehctVVV1111VVXXXXVVf+PXXPNNQ9+7dd+7fd6ndd5nfe+5pprHgxwcM89/OV3fidP/qVf4uCee3huApB4oK3rruMRb/ImXPfSL831L/MyXHXVVVddddVVV/0PQeWqq6666qqrrrrqqqv+n3mxF3ux136xF3ux13qnd3qnz+aZ7v6rv+Ivf/7n+avv+i6emwAkntvWddfxiDd5E6576Zfm+pd5GR7o6J57uP2Xf5knfc/38Ho/9ENsXHcdV1111VVXXXXVVf8NqFx11VVXXXXVVVddddX/cddcc82DX/u1X/u9rrnmmge/zuu8znsDHNxzD3/5nd/JwT338ORf+iUeSAASz8/WddfxiDd5Ex7xJm/C1nXXcb+je+5hec89nP/rv+aJ3/M9XHXVVVddddVVV/0PQeWqq6666qqrrrrqqqv+D7rmmmse/Nqv/drv9eIv/uKv/WIv9mKvDXBwzz385Xd+J/f89V9z91/9FQACBCDxglz30i/N9S/zMrzM+7wPD3R0zz3c8cu/zNG993LHL/8yL8jGddcBcN99993KVVddddVVV1111X8tKlddddVVV1111VVXXfV/xDXXXPPg137t136v13md13nva6655sEAB/fcw19+53dyz1//NXf/1V8hAAlJvCBb113HI97kTdi67joe8SZvwgMd3XMPd/zyL3P+b/6G83/91zw3c9VVV1111VVXXfU/CpWrrrrqqquuuuqqq676X+yaa6558Gu/9mu/1+u8zuu89zXXXPNggIN77uEvv/M7efIv/RKH99wDEgCSeEG2rruOR7zJm3DdS78017/My/BAR/fcwx2//Mvc/iu/wvKee7jqqquuuuqqq676X4TKVVddddVVV1111VVX/S/zYi/2Yq/9Yi/2Yq/1Tu/0Tp/NM939V3/FX/78z/PX3/VdIPEsEi/I1nXX8Yg3eROue+mX5vqXeRke6Oiee7jjl3+ZJ33P9/DvsXHddQDcd999t3LVVVddddVVV131X4/KVVddddVVV1111VVX/Q93zTXXPPi1X/u13+uaa6558Ou8zuu8N8DBPffwl9/5nQj4q+/+bp5F4oXZuu46HvEmb8Ij3uRN2LruOu53dM89LO+5h/N//dc86Xu+h38Lc9VVV1111VVXXfU/DpWrrrrqqquuuuqqq676H+qaa6558Id/+Id/14u92Iu9NsDBPffwV9/5ndz913/NPX/917yornvpl+b6l3kZXuZ93ocHOrrnHu745V/m/N/8Def/+q/5z7C47joAzp49eytXXXXVVVddddVV//WoXHXVVVddddVVV1111f9Q7/iO7/hZL/ZiL/baf/Vd38Xdf/VX3PPXf82LYuu663jEm7wJ29ddx8Pf5E14oKN77uGOX/5lzv/N33D+r/+aq6666qqrrrrqqv/jqFx11VVXXXXVVVddddX/QNdcc82DX+d1Xue9Af7qu76Lf8nWddfxiDd5E65/6Zfmupd5GR7o6J57uOOXf5nbf+VXWN5zD/8ZzPO3cd11XHXVVVddddVVV/03onLVVVddddVVV1111VX/w1330i/NPX/91zy37euu4+Fv8iY84k3ehK3rruOBlvfcw+2//Ms86Xu+h/8J7rvvvlu56qqrrrrqqquu+q9H5aqrrrrqqquuuuqqq/6XELB13XU8/E3ehEe8yZuwdd113G95zz2c/+u/5uiee3jy93wP5qqrrrrqqquuuuoqgMpVV1111VVXXXXVVVf9D/fIN3kTrn+Zl+Fl3ud9eKDlPfdw+6/8Chf++q85/zd/AzZXXXXVVVddddVVVz0HKlddddVVV1111VVXXfU/0JkzZx7MMz38Td6E+y3vuYfbf+VXuPDXf835v/kbnoMEADb/UyyuvRaA++6771auuuqqq6666qqr/utRueqqq6666qqrrrrqqv/hlvfcw+2/8ivc8Su/wvKee/iXWAIAm/8K5qqrrrrqqquuuup/LCpXXXXVVVddddVVV131P9z5v/kbnvw938O/mgQANv9dNq67DoCzZ88+g6uuuuqqq6666qr/elSuuuqqq6666qqrrrrq/zoJAGyuuuqqq6666qqr/p+hctVVV1111VVXXXXVVf9fSABgc9VVV1111VVXXfX/BJWrrrrqqquuuuqqq676H+iaa655MM90dM89/IeSAMDmP9vGddcBcN99993KVVddddVVV1111X89KlddddVVV1111VVXXfV/iPlXkADA5t/KXHXVVVddddVVV/2PRnDVVVddddVVV1111VX/30n8Z1lcdx0AZ8+evZWrrrrqqquuuuqq/3pUrrrqqquuuuqqq6666iqQuMzmqquuuuqqq6666v8QKlddddVVV1111VVXXXXVs0lcZnPVVVddddVVV131fwCVq6666qqrrrrqqquu+h9uec89/JeTuMzm32PjuusAuO+++27lqquuuuqqq6666r8ewVVXXXXVVVddddVVV/0PdObMmQfxP4HEVVddddVVV1111f9iVK666qqrrrrqqquuuuqqF04CAJurrrrqqquuuuqq/2WoXHXVVVddddVVV1111VUvGgkAbF4UG9ddB8B99913K1ddddVVV1111VX/PQiuuuqqq6666qqrrrrqqn8diauuuuqqq6666qr/JahcddVVV1111VVXXXXVVf96EpfZvCCL664D4OzZs7dy1VVXXXXVVVdd9d+DylVXXXXVVVddddVVV/0PdM011zyYZ1recw//Y0lcZnPVVVddddVVV131PxDBVVddddVVV1111VVXXfXvJ/HcNq67DoD77rvvVq666qqrrrrqqqv+e1C56qqrrrrqqquuuuqqq/5jSABgc9VVV1111VVXXfU/BMFVV1111VVXXXXVVVdd9R9L4qqrrrrqqquuuup/CCpXXXXVVVddddVVV1111X88iauuuuqqq6666qr/AahcddVVV1111VVXXXXV/3BH997L/0aL664D4L777ruVq6666qqrrrrqqv8eVK666qqrrrrqqquuuup/oGuuuebBXHXVVVddddVVV13170Xlqquuuuqqq6666qqrrvpPsXHddQCcPXv2GVx11VVXXXXVVVf996By1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Vw1VVXXXXVVVddddVV/wPdd999t/JvIK666qqrrrrqqquuegCCq6666qqrrrrqqquuuurfTLxgG9deC8B99913K1ddddVVV1111VX/PahcddVVV1111VVXXXXV/0D33XffrTzT8p57uOqqq6666qqrrrrq34TKVVddddVVV1111VVX/Q909uzZZ/C/3OK66wA4e/bsrVx11VVXXXXVVVf99yC46qqrrrrqqquuuuqq/4Huu+++W/k3ElddddVVV1111VVXPRPBVVddddVVV1111VVX/Q909uzZW3mmm97ojbjqqquuuuqqq6666t+E4Kqrrrrqqquuuuqqq/6H+szP/MzXAXipT/okXvcHf5BX/sqv5KY3eiP+t9i47joA7rvvvlu56qqrrrrqqquu+u9BOX78OFddddVVV1111VVXXfU/zeHh4a4kbr311r/Z3Nw8fsNDH/rgjeuu47pXf3Ue+V7vxc1v9EbUrS0ELO+9l+cm/uuI5+9R7/VeAPzoj/7o53DVVVddddVVV1313wM96EEP4qqrrrrqqquuuuqqq/6n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z/vwQMt77uGOX/kVlvfeyx2/8itcddVVV1111VVXXfX/CpWrrrrqqquuuuqqq/7XEM8ksXXddTziTd6E6176pbn+ZV6GB1recw93/MqvcP5v/oYLf/M3/FfYuO46AO67775bueqqq6666qqrrrrqfwoqV1111VVXXXXVVVf9jyYACYCt667jEW/yJjziTd6Ereuu44GW99zDHb/yK9z5q7/K8p57ADBXXXXVVVddddVVV/0/R+Wqq6666qqrrrrqqv8xzpw58yCAg7vvRhIAW9ddxyPe5E14mfd5Hx5oec89LO+9l/N//dc85Xu/l+dHPCdz1VVXXXXVVVddddX/M1Suuuqqq6666qqrrvof57qXeRle4/rrecSbvAkPtLznHu74lV/hwt/8DRf+5m/41xLPZv6D2Vx11VVXXXXVVVdd9T8Olauuuuqqq6666qqr/se45pprHgxw/cu8DPdb3nMPd/zKr3Dhb/6GC3/zN/xHEc9mrrrqqquuuuqqq676P4rKVVddddVVV1111VX/4yzvuYc7fuVXeMr3fi//FcSzmauuuuqqq6666qqr/g+hctVVV1111VVXXXXV/zhP/t7v5c5f+RX+O4hnM1ddddVVV1111VVX/S9H5aqrrrrqqquuuuqqq14A8Wzmqquuuuqqq6666qr/hahcddVVV1111VVXXXXVi0BcYa666qqrrrrqqquu+l+EylVXXXXVVVddddVVV/0riGczV1111VVXXXXVVVf9D0flqquuuuqqq6666qr/Me67775bARbXXsv/BuIKc9VVV1111VVXXXXV/1BUrrrqqquuuuqqq6666t9JwOK66wC47777buWqq6666qqrrrrqqv8pqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXfU/xtmzZ58BsHHddfxvs3HddQCcPXv2GVx11VVXXXXVVVdd9T8Flauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVX/d8j8R/C5qqrrrrqqquuuuqq/9WoXHXVVVddddVVV131P5J4AIl/L/NvIHHVVVddddVVV1111f9qVK666qqrrrrqqquu+p9J4j+SeMHMVVddddVVV1111VX/R1G56qqrrrrqqquuuur/PfG8zFVXXXXVVVddddVV/wdQueqqq6666qqrrrrqqudDPC9z1VVXXXXVVVddddX/MlSuuuqqq6666qqrrrrqRSSek7nqqquuuuqqq6666n84KlddddVVV1111VVXXfVvJK666qqrrrrqqquu+h+OylVXXXXVVVddddVV//NIXHXVVVddddVVV1111X8AKlddddVVV1111VVX/Y9x33333QqwuPZarrrqqquuuuqqq6666j8Alauuuuqqq6666qqrrvoPsLjuOgDuu+++W7nqqquuuuqqq6666n8Kgquuuuqqq6666qqr/kc6+VIvxVVXXXXVVVddddVVV/07Ubnqqquuuuqqq6666n+Ms2fP3vpbv/Vb3/06r/M67/2KX/EVLO+5hwt/8zfc+au/yoW/+Ruuuuqqq6666qqrrrrqX4nKVVddddVVV1111VX/Y9x33323/tZv/db3ALzO67zOey+uu44br7uOG9/ojVjeey8X/vqvufA3f8Odv/qrXHXVVVddddVVV1111YsAPehBD+Kqq6666qqrrrrqqv+Zrrnmmge/9mu/9nu9+Iu/+Gu/2Iu92GvzAMt77uHOX/1VLvzN33Dhb/6G/26v+BVfwcmXeik+8zM/83X+4R/+4be56qqrrrrqqquuuup/AvSgBz2Iq6666qqrrrrqqqv+5ztz5syDXvzFX/x1XuzFXuy1Xud1Xue9eYDlPfdw4W/+hgt/8zfc+au/yn+HV/yKr+DkS70Un/mZn/k6//AP//DbXHXVVVddddVVV131PwHl+PHjXHXVVVddddVVV131P9/R0dGlW2+99a//9E//9Gd++7d/+3tuvfXWvzk8PNzd3Nw8fvzaa4/vPPzhXPtqr8aNb/RG7DzsYXRbW0wHB0yHh/xXuPGN3ojFddfxW7/1W99z9uzZW7nqqquuuuqqq6666n8CKlddddVVV1111VVX/a9z33333Xrfffd992/91m99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M+3fcw9P+sVf5Mm/9Evs33MPL4x4XlvXXccj3+RNAHjZ931fHmh5zz3c+au/CsBTv/d7Ec8mrrrqqquuuuqqq6666n8FKlddddVVV1111VX/Q11zzTUPfu3Xfu33ep3XeZ33vuaaax4MsH/PPdz9V3/FXX/1V/zld30X/xLxvLauu45HvsmbcP3LvAzXv8zL8EDLe+7hzl/9VS7+zd9w8W/+hvuJF2x5771cddVVV1111VVXXXXV/1BUrrrqqquuuuqqq/4Hep3XeZ33/vAP//DvAti/5x7+4ju/k7v/+q+5+6/+iheFeE5b113HI9/kTXjEm74p29ddxwMt77mHO3/1V7nrV36F1b33ctVVV1111VVXXXXVVf+HULnqqquuuuqqq676H+Z1Xud13vvDP/zDv+vuv/orfucLv5D9e+7hRSGebeu663jkm7wJAC/7vu/LAy3vuYc7f/VXWd1zD3f+6q8i/o0kntuZM2cezFVXXXXVVVddddVVV/3PQeWqq6666qqrrrrqf5gXe7EXey2Au/7qr9i/5x5eGPFsW9ddxyPf5E24/mVehutf5mV4oOU993Dnr/4qF//mb7jwN3+DuEL8K0lcddVVV1111VVXXXXV/yJUrrrqqquuuuqqq/6HebEXe7HXBji45x6eH/FsW9ddxyPf5E142fd9X57b8p57uPNXf5Wnfu/3AiCuEP9KElddddVVV1111VVXXfW/FJWrrrrqqquuuuqq/6Hu/qu/4n7iiq3rruORb/ImbF1/PY98kzfhgZb33MOdv/qrrO65hzt/9Ve5n/g3kPjXWN5zD4vrruOqq6666qqrrrrqqqv+h6Fy1VVXXXXVVVdd9T/MNddc82CA/XvuQcDWddfxyDd5E65/mZfh+pd5GR5oec893Pmrv8rFv/kbLvzN33A/8W8kcdVVV1111VVXXXXVVf+HULnqqquuuuqqq676H+R1Xud13hvg7r/6K17ufd6Hl33f9+W5Xfibv+HC3/wNT/3e7+W5iX8Diauuuuqqq6666qqrrvo/ispVV1111VVXXXXV/yAv9mIv9loA17/My3D9y7wMAMt77uHOX/1VLv7N33Dhb/6G50f8G0j8W4nn75prrnkwV1111VVXXXXVVVdd9T8Hlauuuuqqq6666qr/Qe67775bAZb33MOdv/qrXPybv+HC3/wNz4/4N5L41xJXXXXVVVddddVVV131vxKVq6666qqrrrrqqv+B7vzVX+Wp3/u9PD/i30jiX0NcddVVV1111VVXXXXV/3oEV1111VVXXXXVVf9LCBD/ShJIIPEvESBAgPjXWd17L1ddddVVV1111VVXXfU/EJWrrrrqqquuuuqq/+HEv4HEi0JcddVVV1111VVXXXXV/2lUrrrqqquuuuqqq/4HOXv27DMAFtdei/g3kPiXiKuuuuqqq6666qqrrvp/g+Cqq6666qqrrrrqfyDxbyDxwggQ//muueaaB3PVVVddddVVV1111VX/M1C56qqrrrrqqquu+h/kvvvuuxVgft11vMgkXhBx1VVXXXXVVVddddVV/69Rueqqq6666qqrrvrfSuL5Ef91xFVXXXXVVVddddVVV/2PRnDVVVddddVVV131v40EEs9NgPjPJUCAAPFsy3vv5aqrrrrqqquuuuqqq/4HonLVVVddddVVV131P8jZs2dvBVhcey3PQ+L5Ef95xFVXXXXVVVddddVVV/2vRnDVVVddddVVV131v4HEAwkQIP7jCRAg/m3OnDnzYK666qqrrrrqqquuuup/BipXXXXVVVddddVV/5NJPJD4zyGuuuqqq6666qqrrrrq/yQqV1111VVXXXXVVf+D3HfffbcCLK67DiTuJ/7jiauuuuqqq6666qqrrvo/j8pVV1111VVXXXXV/2DiP5b4z7G65x6uuuqqq6666qqrrrrqfyAqV1111VVXXXXVVf9Dif8Y4j+RBAASV1111VVXXXXVVVdd9T8QwVVXXXXVVVddddX/MPfdd9+tAItrr+XfSoAA8Z9DEpIQIK666qqrrrrqqquuuup/LIKrrrrqqquuuuqq/0MEiP94AiQhCUm8MNdcc82Dueqqq6666qqrrrrqqv8ZCK666qqrrrrqqqv+h7nvvvtuBZhfdx0vCgECxH8sAZKQBBJXXXXVVVddddVVV131vxCVq6666qqrrrrqqv+lxH8s8QAS/xqre+7hqquuuuqqq6666qqr/geictVVV1111VVXXfW/jPiPIx5A4qqrrrrqqquuuuqqq/6PIbjqqquuuuqqq676H+bs2bO3AiyuvZYHEiD+/QQIEM8kgcRVV1111VVXXXXVVVf9H0Tlqquuuuqqq6666n848e8nng+J/wgCxLOdOXPmQVx11VVXXXXVVVddddX/DFSuuuqqq6666qqr/oe57777bgVYXHst4t9HPB8S/x7iqquuuuqqq6666qqr/tegctVVV1111VVXXfV/jHgBJP4txL9see+9XHXVVVddddVVV1111f9AVK666qqrrrrqqqv+jxAvgMS/lrjqqquuuuqqq6666qr/Ewiuuuqqq6666qqr/oc5e/bsrQAnXuql+JcIECCeDwkkXlQCBIirrrrqqquuuuqqq676P4Pgqquuuuqqq6666n+Y++6779Z/+Id/+O0TL/VSvNr3fz+P/YRP4MRLvRQPJEC8ABJI/EsECBAgrrrqqquuuuqqq6666v8kKlddddVVV1111VX/w/zDP/zD7/zWb/3W97zYi73Yay+uvZbFG74hN7zhG7K89152/+ZvuPg3f8Pq3nu5+Dd/w3OQ+JeI/xzi2a655poHc9VVV1111VVXXXXVVf8zULnqqquuuuqqq676H+i3fuu3vvsf/uEffvvMmTMPfrEXe7HXevEXf/HXfrEXe7HXXrzhG3L9G74hAKt77+Xi3/wNd//qr3Lxb/+WF0b8xxJXXXXVVVddddVVV131vwJ60IMexFVXXXXVVVddddX/Btdcc82DX+zFXuy1X+zFXuy1Xud1Xue9eYDVvfdy8W/+hot/+7dc/Ju/YXXvvYj/OOKFm197La/yfd8HwG/91m9999d//de/D1ddddVVV1111VVXXfXfDz3oQQ/iqquuuuqqq6666n+ba6655sFnzpx50Iu92Iu99ou/+Iu/9ou92Iu9Ng+wuvdeLv7N33D3r/4qu3/7t/xbiBfd/NpreZXv+z4Afuu3fuu7v/7rv/59uOqqq6666qqrrrrqqv9+6EEPehBXXXXVVVddddVV/9tdc801D36xF3ux136xF3ux13qd13md9+YBVvfey8W/+Rt2//Zvufg3f8Pq3nt5fsS/3fzaa3mV7/s+AH7rt37ru7/+67/+fbjqqquuuuqqq6666qr/fuhBD3oQV1111VVXXXXVVf+XXHPNNQ8+c+bMg1/sxV7stV78xV/8tV/sxV7stXmA1b33cvFv/5a7f+VXuPS3f8u/m8T82mt5le/9XgB+5Ed+5LN/9Ed/9HO46qqrrrrqqquuuuqq/37oQQ96EFddddVVV1111VX/l505c+ZBL/7iL/46L/ZiL/Zar/M6r/PePMDq3nvZ/Zu/4eLf/i27f/M3rO69lxeZBICA+bXX8srf+70A/NZv/dZ3f/3Xf/37cNVVV1111VVXXXXVVf/90IMe9CCuuuqqq6666qqr/qNcc801D37t137t93rc4x73O3//93//2/wPc8011zz4zJkzD36xF3ux13rxF3/x136xF3ux1+YBVvfey+7f/A13/+qvsvu3f8vzkBDPa37ttbzy934vAD/yIz/y2T/6oz/6OVx11VVXXXXVVVddddV/P/SgBz2Iq6666qqrrrrqqn+ra6655sEv9mIv9tpnzpx50Du90zt9Ns909uzZZ/zIj/zIZ//Wb/3Wd/M/2DXXXPPgF3uxF3vtF3uxF3ut13md13lvHmB1773s/u3fsvs3f8Pu3/4tq3vv5YV57V/5FQC+/uu//n1+67d+67u56qqrrrrqqquuuuqq/35Urrrqqquuuuqqq/6Vrrnmmge/9mu/9nu9+Iu/+Gu/2Iu92GvzTPv33MMTf/EXedSbvilnrrvuQWfOnHkQ/8Pdd999t953333f/Vu/9Vvf/SM/8iOffc011zzkxV7sxV7rxV/8xV/7xV7sxV77ujd4A657gzcAYHXvvez+7d9yz6/+Krt/+7dcddVVV1111VVXXXXV/wJUrrrqqquuuuqqq14EL/ZiL/baL/ZiL/Zar/u6r/s+Z86ceRDPtH/PPTzxF3+RJ/3SL7F/zz0AvPz7vi8A11xzzYP5X+Ts2bPPOHv27DP+4R/+4bd/9Ed/9HOuueaaB7/Yi73Ya73Yi73Ya7/O67zOe8+vvZbr3uANuO4N3oDVvfey+7d/y+7f/A33/Nqv8UD33XffrVx11VVXXXXVVVddddX/DOhBD3oQV1111VVXXXXVVc/tmmuuefBrv/Zrv9eLv/iLv/aLvdiLvTbPtH/PPTzxF38RgL/4ru/iud3wMi/DW3zt1wLwD//wD7/9mZ/5ma/D/wHXXHPNg8+cOfPgF3uxF3utF3/xF3/tF3uxF3ttHmB1773Mr70WgA/5kA95yH333XcrV1111VVXXXXVVVdd9d+PylVXXXXVVVddddUzXXPNNQ9+7dd+7fd6ndd5nfe+5pprHswz7d9zD0/8xV/krr/+a+76q79CvGDb113H/0X33Xffrffdd9+t//AP//DbP/qjP/o511xzzYNf7MVe7LVf7MVe7LVe53Ve573n114LwD/8wz/8NlddddVVV1111VVXXfU/B5Wrrrrqqquuuur/rWuuuebBL/ZiL/baZ86cedA7vdM7fTbPtH/PPdz1V3/FXX/1V/z5d30X9xMgXrjrX+ZlALjvr/8auo7/q+67775b77vvvu/+rd/6re/+0R/90c85c+bMg6655pqH/NZv/dZ3c9VVV1111VVXXXXVVf9zULnqqquuuuqqq/5fueaaax782q/92u/14i/+4q/9Yi/2Yq/NM+3fcw9P/MVf5K6//mvu+qu/4n7iX+eGl3kZAJ7xq7/Kg977vR/M/wP33Xffrffdd9+t//AP//A7XHXVVVddddVVV1111f8sVK666qqrrrrqqv/zXuzFXuy1X+zFXuy13umd3umzeYD9e+7hib/4izzxl36J/Xvu4YHEi277uut45Ju8CY960zdl+7rrADi85x6uuuqqq6666qqrrrrqqv92VK666qqrrrrqqv9zrrnmmge/9mu/9nu9+Iu/+Gu/2Iu92GvzTPv33MMTf/EXAfjz7/ounpt40Wxfdx2PfJM3AeDl3/d9eW6H99wDEtdcc82Dueqqq6666qqrrrrqqqv+O1G56qqrrrrqqqv+T7jmmmse/Nqv/drv9Tqv8zrvfc011zyYZ9q/5x6e+Iu/yF1//dfc9Vd/xfMj/mXb113HI9/kTbjxZV+W61/6pXmg1b33ctev/Aq7f/u3vOyXfzmb113H0T33cNVVV1111VVXXXXVVVf9t6Ny1VVXXXXVVVf9r3TNNdc8+LVf+7XfC+Cd3umdPptn2r/nHu76q7/irr/6K/78u76LF0a8YNvXXcf29ddz/Uu/NC//vu/Lc7v4N3/Dxb/5G+7+1V9lde+9vCDXXHPNg++7775bueqqq6666qqrrrrqqqv+O1C56qqrrrrqqqv+17jmmmse/Nqv/drv9eIv/uKv/WIv9mKvzTPt33MPT/zFX+Suv/or7vrrv+aFES/Y9nXX8cg3eRNueJmX4YaXeRkeaHXvvdz1K7/Cxb/5G3b/9m95QVb33sv82muRxFVXXXXVVVddddVVV131347KVVddddVVV131v8I111zz4A//8A//rhd7sRd7bYD9e+7hib/4izzxl36J/Xvu4V8inr/t667jkW/yJjzqTd+U7euu44GW997L3b/yK9z9q7/K6t57eWHEFct77mF+7bVsXHstAGfOnHnwfffddytXXXXVVVddddVVV1111X8HKlddddVVV1111f8K7/iO7/hZL/ZiL/baT/ylX+K3vvALeVGI57V93XU88k3ehO3rr+dRb/ImPNDy3nu5+1d+BYCnfd/3IV404nkJOLrnHq666qqrrrrqqquuuuqq/1ZUrrrqqquuuuqq/xVe53Ve570B/vw7v5N/iXhO29ddxyPf5E244WVehhte5mV4oOW993L3r/wKF//mb7j4t38LgADxLxNXXXXVVVddddVVV1111f9wVK666qqrrrrqqv/xXud1Xue9AJ74S7/E/j338IKIK7avu44bXuZl2LruOl7+fd+XB1reey+re+7h4t/8DU/7vu/juYkXjXj+VvfeC8DGtddyeO+9XHPNNQ/+h3/4B6666qqrrrrqqquuuuqq/xZUrrrqqquuuuqq//Fe7MVe7LUB7vqrv+L5EbB93XU88k3ehBte5mW44WVehgda3nMPd//qr3Lxb/+Wi3/zN7wg4l8mXgiJ+4krzpw58yCuuuqqq6666qqrrrrqqv8uVK666qqrrrrqqv/xXuzFXuy1Ae76q7/ifgJueJmX4fqXfmle/n3fl+e2vOce7vrVX+XuX/kVVvfeCxIviHjRiBdCAmB1770AbFx3HVddddVVV1111VVXXXXVfzsqV1111VVXXXXV/2jXXHPNg6+55poH80wv/z7vww0v8zLc8DIvwwMt77mHu371V1ndcw93/eqvAiCeSeIFEf8y8S+QABDPaXnPPVx11VVXXXXVVVddddVV/62oXHXVVVddddVV/6O92Iu92GvzTO/2Yz/GAy3vuYe7fvVXufg3f8PFv/kbHki8cOJFI/4FEuLZVvfeC8DmddeBzTXXXPNgrrrqqquuuuqqq6666qr/LlSuuuqqq6666qr/0c6cOfMgnml5zz1c/Ju/YXnvvTzte7+X50c8F4nnJv5l4l8miRfm8N574eabueqqq6666qqrrrrqqqv+21C56qqrrrrqqqv+R3vxF3/x1wZ46vd+L0/73u/lhRHPReK5iX+Z+JdJ4vlZ3XMPABvXXsvRPfdwzTXXPJirrrrqqquuuuqqq6666r8LwVVXXXXVVVdd9T/afffddysvAvFcJJ6beOEEiBdOgCT+RRJH99zDVVddddVVV1111VVXXfXfispVV1111VVXXfU/2n333Xcr/wLxwol/mfiXCUDihVnfey8AG9deC8CZM2cezFVXXXXVVVddddVVV13134XKVVddddVVV131P9rZs2efAbC49lqeH/F8SNxP/MvECyeeSeIFEc9ree+9XHXVVVddddVVV1111VX/rahcddVVV1111VX/o9133323Aiyuu44HEi+AxP3ECyf+ZeKZJF4QcdVVV1111VVXXXXVVVf9D0Xlqquuuuqqq676X0e8ABL3Ey+ceOHEv0w8r9W99wKwce21HN1zD9dcc82Dueqqq6666qqrrrrqqqv+u1C56qqrrrrqqqv+Rzt79uytAPNrrwVAvHDiXyZeOPFcJB5IvGgkcdVVV1111VVXXXXVVVf9tyK46qqrrrrqqqv+1xAvhIR44QSIF0yAeC4SDyT+Zat77wVgcd11AFxzzTUP5qqrrrrqqquuuuqqq67670Bw1VVXXXXVVVf9j3bffffdCrC47jpeIAnxwokXTjwfEvcTIF44AeJ5nTlz5sFcddVVV1111VVXXXXVVf8dCK666qqrrrrqqv/x7rvvvlsB5tdey/MjXjjxwonnQ+J+4oUTIJ5tdc89AIirrrrqqquuuuqqq6666r8ZwVVXXXXVVVdd9T/efffddyvA4rrreG6SeEEEiBdMgHg+JAAEiBdOvHBH99zDVVddddVVV1111VVXXfXfhuCqq6666qqrrvpfSYAkXhDxwokXQAJAvHACxPO3uvdeADauvRaAa6655sFcddVVV1111VVXXXXVVf8dqFx11VVXXXXVVf/jnT179laA+bXXAiBeOPHCiRdMvHDiXyaebXnvvVx11VVXXXXVVVddddVV/22oXHXVVVddddVV/+Pdd999twIsrrsO8UwSz494wcQLJ4kXRrxw4orVvfcCsHHttQCcOXPmQVx11VVXXXXVVVddddVV/x2oXHXVVVddddVV//tIPD/iBRMvnCReEPHCiRdsee+9XHXVVVddddVVV1111VX/bahcddVVV1111VX/4509e/ZWgMW11/L8iBdOvGACkHhBxAsnntfq3nsB2LjuOgCuueaaB3PVVVddddVVV1111VVX/XcguOqqq6666qqr/se77777bgWYX3cdSDyQeMEEiBdMABLPjwDxggkQz4fEAx3dcw9XXXXVVVddddVVV1111X8bgquuuuqqq6666n8t8YKJF068YOKFEy+AhID1vfcCsLj2WgRcc801D+aqq6666qqrrrrqqquu+u9A5aqrrrrqqquu+h/vvvvuuxVgcd113E+8YOIFEw8g8dzECyZeCAlx1VVXXXXVVVddddVVV/0PQ3DVVVddddVVV/2vI14w8YKJB5B4IAHiBRMvmADxbOt77wVg47rrWN57L1ddddVVV1111VVXXXXVfxuCq6666qqrrrrqf7yzZ88+A2B+7bWIF0y8YOIBJB5IvGACxPMnQAASL8jy3ns5c+bMg7nqqquuuuqqq6666qqr/jsQXHXVVVddddVV/yvcd999twLMr72W5yZAPH8CxPMnQLxg4gUTzyRx1VVXXXXVVVddddVVV/2PRXDVVVddddVVV/2vcPbs2VsB5tddxwOJF0w8HxIA4gUTIJ4/AeKZJJ6bgPW99wKwuPZaAK655poHc9VVV1111VVXXXXVVVf9dyC46qqrrrrqqqv+V1lcey33Ey+YeD4kAMQLJl4w8QASz008r9U993DVVVddddVVV1111VVX/bchuOqqq6666qqr/lf4rd/6re+57777bn3MJ3wCr/r9389jP+ETuO4N35DnRzx/AsTzJ0A8fwLEA0g8kADxnFb33APA4rrrALjmmmsezFVXXXXVVVddddVVV131X43KVVddddVVV131v8Jv/dZvffeZM2ce9E7v9E6fPb/2Wq57wzfkujd8Qx7ynu8JwN2/8itc+tu/Zfdv/obnRxIviHjBxHORuJ/4l63uvZerrrrqqquuuuqqq6666r8Nlauuuuqqq6666n+NH/3RH/2cH/3RH/2ca6655sGv/dqv/V4v/uIv/tov9mIv9toAD3nP9wRgde+97P7N37D7N3/D6t572f2bv0ESL4h4/sQLJ14wAet772V+3XUsrr0WgDNnzjz4vvvuu5Wrrrrqqquuuuqqq6666r8Slauuuuqqq6666n+d++6779Yf/dEf/Zwf/dEf/ZxrrrnmwS/2Yi/22i/2Yi/2Wtdcc82DX+zFXuy1r3vDN+S6N3xDAFb33svu3/wN9/7qr7L7t3/L/cQLJl4ACfGCiedvee+9XHXVVVddddVVV1111VX/LahcddVVV1111VX/q91333233nfffd/9W7/1W98NcM011zz4xV7sxV77xV7sxV7rdV7ndd57fu21XPeGb8h1b/iGrO69l9U993Dpb/+W3b/5Gy797d/y3MQLICFeMPGc1vfdB8DiuusAOHv27K1cddVVV1111VVXXXXVVf/VqFx11VVXXXXVVf+n3Hfffbfed9993/1bv/Vb3/2jP/qjn2Pbr/M6r/PeL/7iL/7aL/ZiL/ba82uv5fhLvRQPeo/3YHXvvVz6m79h92//lvt+9Vd5QSTxgoh/2eLaa7nqqquuuuqqq6666qqr/lugBz3oQVx11VVXXXXVVf91rrnmmgffd999t/Lf4Jprrnnwi73Yi732i73Yi73WNddc8+AXe7EXe20eYHXvvVz6m7/h3l/9VS797d8CIInnR7xgAm5+j/fg5nd/dy78zd9w8qVeird7u7cTV1111VVXXXXVVVddddV/NfSgBz2Iq6666qqrrrrqP88111zz4Nd+7dd+r2uuueYhr/M6r/Ne9913362/9Vu/9d0/+qM/+jn8N7vmmmse/GIv9mKv/Tqv8zrv9WIv9mKvzQOs7r2X9b33cu+v/irre+/l0t/+LfcTL5i44ub3eA9ufvd3Z3nvvexLt37Ih3zIQ7jqqquuuuqqq6666qqr/quhBz3oQVx11VVXXXXVVf+xrrnmmge/9mu/9nu9zuu8zntfc801D+b5+JAP+ZCH3HfffbfyP8SZM2cedM011zzkxV7sxV7rxV/8xV/7xV7sxV6bB1jdey97f/u3XPqbv+G+X/s1npt4Tje/x3tw87u/OwC/9Vu/9d1f//Vf/z5cddVVV1111VVXXXXVVf/VqFx11VVXXXXVVf9u11xzzYNf+7Vf+70A3umd3umzeYD9e+7h8b/4i9z5V3/FY970TXn0m7wJAGfOnHnwfffddyv/Q5w9e/YZZ8+efcY//MM//PaP/uiPfs4111zz4Bd7sRd7rRd7sRd77dd5ndd57/m11zJ/gzfgmjd4Ax7x8R/P+t57uffXfo29v/kb9v72b3lu63vu4X7/8A//8DtcddVVV1111VVXXXXVVf8dqFx11VVXXXXVVf8m11xzzYNf+7Vf+71e/MVf/HVe7MVe7LV4pv177uHxv/iLAPzZd30XD/T6n/Zp/G9x33333Xrffffd+lu/9Vvf8/Vf//Xvc8011zz4xV7sxV77dV7ndd7rxV7sxV57du213PLu7w7v/u6s772XS3/7t+z9zd+wuvde9v/2b1nfdx9XXXXVVVddddVVV1111X87KlddddVVV1111YvkmmuuefBrv/ZrvxfAO73TO302D7B/zz08/hd/kbv++q+586/+iudHwPZ11wGwuvdeXuzFXuy1/uEf/uG3+V/ivvvuu/W+++777t/6rd/67muuuebBZ86cefDrvM7rvNc111zz4Bd7sRd77Wve4A245g3eAID1vfeyvvde7vcP//APv81VV1111VVXXXXVVVdd9d+BylVXXXXVVVdd9QJdc801D37t137t93rxF3/x136xF3ux1+aZ9u+5h8f/4i8C8Gff9V28MOKKR7/JmwBw76/+KrNrr+V/s/vuu+/W++6779Z/+Id/+G2AM2fOPOjFX/zFX+fFXuzFXut1Xud13nt27bXMrr2W+9133323ctVVV1111VVXXXXVVVf9d0APetCDuOqqq6666qqrrrjmmmse/GIv9mKvfebMmQe90zu902fzAPv33MPjf/EXueuv/5o7/+qv+JeI5/RWX/u13PgyL8MTv/zLufYN3oC/unDhu7/+67/+ffg/6Jprrnnwa7/2a78XwI/+6I9+DlddddVVV1111VVXXXXVfxcqV1111VVXXfX/3DXXXPPg137t136vF3/xF3/tF3uxF3ttnmnvnnu466/+ir277+bPvuu7eFGJ5+/Gl3kZAC79zd9w/CVfkmtuvPHB/B9133333fqjP/qjn8NVV1111VVXXXXVVVdd9d+NylVXXXXVVVf9P3PNNdc8+MyZMw9+sRd7sdd6p3d6p8/mAfbuuYcn/OIvctdf/zV3/tVf8a8hntP2ddfx6Dd5E7avv55Hv8mbAHDvr/4q63vvZXXvvXDjjVx11VVXXXXVVVddddVVV/0no3LVVVddddVV/w9cc801D37t137t93rxF3/x136xF3ux1+aZ9u65h/277+bOv/or/vS7vgvxryeebfu663j0m7wJN77sy3LDS780z21+7bUArO+9lzNnzjyYq6666qqrrrrqqquuuuqq/1xUrrrqqquuuur/oGuuuebBZ86cefCLvdiLvdY7vdM7fTYPsHfPPTzhF3+RO//6r7nzr/4KAAHiX0fA9nXX8eg3eRMAXuF935cHWt1zD8t772X3b/6Gu3/lV3jVH/gBZtddB8D6nnu46qqrrrrqqquuuuqqq676L0Dlqquuuuqqq/4PebEXe7HXfqd3eqfPerEXe7HX5pn27rmH/bvv5s6/+iv+9Lu+iwcS/3o7113Ho9/kTbjhZV6GG1/mZXig1T33cNev/ioX//qvufS3f8v95tdey/3EFddcc82Dr7nmmgffd999t3LVVVddddVVV1111VVXXfWfg8pVV1111VVX/R/xYi/2Yq/9Tu/0Tp/1Yi/2Yq+9d/fdPOGXfok7/+qvuPOv/5rnJl5029ddx6Pf5E0Q8Arv+7480Oqee1jeey8X/+ZvePr3fi/3E89pde+9AMyvvRaA1b33AnDNNdc8+L777ruVq6666qqrrrrqqquuuuqq/xxUrrrqqquuuur/iHd6p3f6rBd7sRd77V//wi/kCb/0Szw/4kWzfd11PPpN3oQbX+ZluPFlXoYHWt5zD3f/6q+y+zd/w8W/+Ruem3heAlb33MP8uuuYXXst4qqrrrrqqquuuuqqq6666r8Elauuuuqqq676P+LFXuzFXhvgzr/6K56beOG2r7uOR7/JmwDwiu/7vjy3i3/zN1z8m7/hrl/5FVb33ot4/sQLtrr3XubXXcfi2mu59Ld/C8CZM2cezFVXXXXVVVddddVVV1111X8eKlddddVVV131f8DrvM7rvDfA43/pl9i/5x7uJ16w7euu49Fv8ibc+DIvw40v8zI80PKee7jrV36F3b/5Gy7+zd+AxL9EPH/i+Vvfey9nzpx5EFddddVVV1111VVXXXXVVf95qFx11VVXXXXV/wGv8zqv814Ad/7VXwEgntf2ddfx6Dd5EwBe8X3fl+d28W/+hgt//dfc/au/yvKeexDPn3he4vkTz7a65x54qZdidt116G//ltU993DVVVddddVVV1111VVXXfWfjMpVV1111VVX/S/3Yi/2Yq/9Yi/2Yq8N8MRf+iXEs21fdx2PfpM34caXeRlufJmX4YGW99zDXb/yK1z8m7/h4t/8DS+QxP3E8xLPn3hOy3vvBWB+7bXc75prrnkIV1111VVXXXXVVVddddVV/3moXHXVVVddddX/cq/zOq/zXgBP+KVfYvu663j0m7wJAK/4vu/Lc1vecw93/cqvcNev/irLe+5BPH/ieYkXnXhe4pkkAPb+9m+55mVf9sFcddVVV1111VVXXXXVVVf956Fy1VVXXXXVVf/LvdiLvdhrA9z4Mi/De/7Yj/FAy3vu4c5f+RUu/s3fcPFv/oYXhXhe4vkTz0s8LwG7f/M3AOy85Esirrrqqquuuuqqq6666qqr/ktQueqqq6666qr/xa655poHnz179tZrrrnmwdvXXQfA8p57uPNXfoW7fvVXWd5zD+L5E89LPBeJF0Q8L/G8xHMSV6zvvZdrrrnmwVx11VVXXXXVVVddddVVV/3noXLVVVddddVV/4udOXPmwS/2Yi/22st77uHvvvRLufg3f8OLQrzoxPMSz0u8cKt77wVgdu21AKzvuYczZ848iKuuuuqqq6666qqrrrrqqv88BFddddVVV131v9jZs2dv5Zku/s3f8NzEi048L/G8xPMSz594/iQhrrjmmmsezFVXXXXVVVddddVVV1111X8Ogquuuuqqq676X+y+++67FWBx3XW8qMTzEs9LEv8e4jmt7r0XgNm11wKwvvdeAM6cOfNgrrrqqquuuuqqq6666qqr/nMQXHXVVVddddX/cvfdd9+tAIvrruOBxPMSz0u86MTzEs9LPBcJAat77wVgdu21XHXVVVddddVVV1111VVX/RcguOqqq6666qr/5c6ePXsrwOK667ifeF7iRSeel3he4nmJ5yWuWN1zDwDza69luPdeAK655poHc9VVV1111VVXXXXVVVdd9Z+D4Kqrrrrqqqv+l7vvvvtuBVhcey3/WuJ5CUDigcTzEs9LPC9JPF8Se3/zN5w5c+ZBXHXVVVddddVVV1111VVX/eegctVVV1111VX/y9133323AsyvvRYA8bzE8xLPSzwv8bzE8xLPSzyn1b33AjC79lrEVVddddVVV1111VVXXXXVfzoqV1111VVXXfW/3NmzZ58BsLjuOsTzEv/5xPMSz2t9zz0AzK67DoDh3nu55pprHsxVV1111VVXXXXVVVddddV/DoKrrrrqqquu+l/uvvvuuxVgcd11vKjE8xLPSzwv8S8TzyRxPwGre+8FYHbttQCs772Xa6655sFcddVVV1111VVXXXXVVVf956By1VVXXXXVVf/LnT179laAxXXX8dzE8xLPSzyABIB4XuJ5iX+ZuGJ1770A9Ndei7jizJkzD+aqq6666qqrrrrqqquuuuo/B8FVV1111VVX/T8nnpd4XuJ5ieclnpN4XuKK4d57ueqqq6666qqrrrrqqquu+k9EcNVVV1111VX/y91333233nfffbcurr2WxXXXcT/xvMS/jXhe4nmJB5B4but77gGgv/ZaANb33ss111zzYK666qqrrrrqqquuuuqq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zYNf7MVe7LV5gPW993Lpb/6Gvb/5G/b+5m9Y33svs2uv5WW///sB+K3f+q3v/vqv//r34aqrrrrqqquuuuqqq6666j8eetCDHsRVV1111VVXXfUf55prrnnwi73Yi73Wi73Yi73267zO67w3z2V9772s77mHnZd6KQC+/uu//n1+67d+67u56qqrrrrqqquuuuqqq676j4ce9KAHcdVVV1111VVX/ee55pprHvxiL/Zir/1iL/Zir/U6r/M6781z+ZAP+ZCH3Hfffbdy1VVXXXXVVVddddVVV131Hw896EEP4qqrrrrqqquu+q9xzTXXPBjgtV/7td/rxV/8xV/7677u69777Nmzz+Cqq6666qqrrrrqqquuuuo/B3rQgx7EVVddddVVV1111VVXXXXVVVddddVVV131fxKVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4p/BIIT3Xo7Sk2cAAAAAElFTkSuQmCC) + +```js +// Setting the appearance of a 3D pattern can be done _before_ or _after_ the pattern. +// This example shows _after_ the pattern. +exampleSketch = startSketchOn('XZ') + |> startProfileAt([0, 0], %) + |> line([0, 2], %) + |> line([3, 1], %) + |> line([0, -4], %) + |> close(%) + +example = extrude(1, exampleSketch) + |> patternLinear3d({ + axis = [1, 0, 1], + instances = 7, + distance = 6 + }, %) + |> appearance({ + color = '#ff0000', + metalness = 90, + roughness = 90 + }, %) +``` + +![Rendered example of appearance 6](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAACi7UlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VlOPHj3PVVVddddVVV1111VVXXXXV/z7XXHPNgx/84Ae/tCQODw93ueqqq6666qrnReWqq6666qqrrrrqqquuuuqq/zWuueaaB7/2a7/2e734i7/4a7/Yi73Ya9933323XnPNNQ/+kR/5kc/+0R/90c/hqquuuuqqq54TetCDHsRVV1111VVXXXXVVVddddVV/3Ndc801D37t137t93rxF3/x136xF3ux196/5x6e+Iu/CMATf+mXeNSbvAkv/77vy3333XfrZ33WZ73OfffddytXXXXVVVdddQV60IMexFVXXXXVVVddddVVV1111VX/s1xzzTUPfu3Xfu33ep3XeZ33vuaaax68f889PPEXf5GDe+7hib/0Szy3l3uf9+Hl3/d9ue+++279rd/6re/+0R/90c/hqquuuuqqq4DKVVddddVVV1111VVXXXXVVf8jXHPNNQ9+7dd+7fd6ndd5nfe+5pprHrx/zz088ed/nsfdcw9P/KVf4gXZvu46APbvuYdrrrvuwS/+4i/+2r/927/9Pffdd9+tXHXVVVdd9f8dlauuuuqqq6666qqrrrrqqqv+21xzzTUPfu3Xfu33ep3XeZ33vuaaax68f889PPHnf54/+eu/5q6/+itekO3rruORb/ImPOpN35Tt667jgV7sxV7stc+cOfPg++6771auuuqqq676/47KVVddddVVV1111VVXXXXVVf+lrrnmmge/9mu/9nu9zuu8zntfc801D96/5x6e+PM/z5/89V9z11/9FS/IznXX8cg3eRMe+aZvyvZ113G/o3vu4Rm//Muc++u/5uU++ZPZuO46zp49eytXXXXVVVddBVSuuuqqq6666qqrrrrqqquu+k93zTXXPPi1X/u13+t1Xud13vuaa6558P499/DEn/95/uSv/5q7/uqveG7iiu3rruORb/ImvNz7vi8PdHTPPTzjl3+Zc3/915z767/mfhvXXQfAfffddytXXXXVVVddBVSuuuqqq6666qqrrrrqqquu+k9xzTXXPPi1X/u13+ud3umdPhtg/557eOLP/zx/8td/zV1/9VfcTzyn7euu45Fv8ia83Pu+Lw90dM89POOXf5lzf/3XnPvrv+aqq6666qqrXgRUrrrqqquuuuqqq6666qqrrvoPc8011zz4tV/7td/rnd7pnT4bYP+ee/jz7/xO7v7rv+auv/orxBXiOW1fdx2PfJM34eXe9315oKN77uG2X/5lzv71X3Pur/+aF+b0S780AP/wD//w21x11VVXXXXVFVSuuuqqq6666qqrrrrqqquu+ne55pprHvzar/3a7/VO7/ROnw2wf889/Pl3fidP/qVfYv+ee7ifeE7Xv8zLcMNLvzQv977vywMd3XMPt/3yL3PbL/8yR/fcA4D5l21cdx0A9913361cddVVV1111RVUrrrqqquuuuqqq6666qqrrvpXe7EXe7HXfrEXe7HXeqd3eqfPBti/5x7+4ju/kyf90i+xf889vCDXv8zLcMNLvzQv977vywMd3XMPt/3yL3PbL/8yR/fcwwOZF83Gdddx1VVXXXXVVc+FylVXXXXVVVddddVVV1111VUvkhd7sRd77Rd7sRd7rXd6p3f6bID9e+7hL77zO3nSL/0S+/fcw/Ozfd11PPJN3gSAl3vf9+WBju65h9t++Ze57Zd/maN77uHfa/O66wD4h3/4h9/hqquuuuqqq66gctVVV1111VVXXXXVVVddddXzdc011zz4zJkzD36xF3ux13qnd3qnzwbYv+ce/uI7v5Mn/dIvsX/PPTw/29ddxyPf5E3Yvv56Hvkmb8IDHd1zD7f98i9z2y//Mkf33MO/xFx11VVXXXXVvwuVq6666qqrrrrqqquuuuqqq57lmmuuefBrv/Zrv9c111zz4Nd5ndd5b4D9e+7hL77zO/mL7/ounh8B29ddxyPe5E3Yvv56Hvkmb8IDHd1zD7f98i/zhO/+bv4znX7plwbgH/7hH36bq6666qqrrrqCylVXXXXVVVddddVVV1111f9z11xzzYNf+7Vf+72uueaaB7/O67zOewPs33MPf/Gd38lffNd38dzEFdvXXccj3uRNuOFlXobrX+ZleKCje+7htl/+ZZ7w3d/Nv5X519m47jquuuqqq6666rlQueqqq6666qqrrrrqqquu+n/ommuuefBrv/Zrv9eLv/iLv/aLvdiLvTbA/j338Bff+Z38xXd9F/cTz2n7uut4xJu8CTe8zMtw/cu8DA90dM893PbLv8wTv/u7ATD/Pe67775bueqqq6666qorqFx11VVXXXXVVVddddVVV/0/cc011zz4tV/7td/rxV/8xV/7xV7sxV4bYP+ee/iL7/xO/uK7vgtxhXhO29ddxyPe5E244WVehutf5mV4oHN//dec++u/5onf/d08kPn3Mf86p1/6pQG47777buWqq6666qqrno3KVVddddVVV1111VVXXXXV/xMf/uEf/l0v9mIv9tp3/dVf8Rff+Z385Xd9F/cTz2n7uut4xJu8CTe8zMtw/cu8DA907q//mnN//dc88bu/m/8pNq67DoB/+Id/+G2uuuqqq6666tmoXHXVVVddddVVV1111VVX/T/w4R/+4d/1Yi/2Yq+9f8893P1Xf8Vfftd38dy2r7uOR7zJm/DIN31Ttq+7jvsd3XMP5/76rzm65x6e+N3fzb/E/PuYq6666qqrrvoPQ+Wqq6666qqrrrrqqquuuur/gWuuuebBB/fcw/Z11/HIN31TAP7yu76L7euu4xFv8iY88k3flO3rruN+R/fcw22//Mss77mH2375l/mfbuO66wC47777buWqq6666qqrno3KVVddddVVV1111VVXXXXV/wNnzpx58N98x3ewdd11vNT7vA8v977vyyPf9E3Zvu467nd0zz3c9su/zPKee7jtl3+Zfwvz72P+bTavuw6As2fPPoOrrrrqqquuejYqV1111VVXXXXVVVddddVV/4/8zXd9FwAv9T7vw/Z113F0zz3c/su/zLm//mvO/fVf87/V6Zd+aQDuu+++W7nqqquuuuqqZ6Ny1VVXXXXVVVddddVVV131/8A111zz4L+6+24A7vnrv+algKN77uHX3/md+Y9i/n3Mv9/Zs2dv5aqrrrrqqquejcpVV1111VVXXXXVVVddddX/cddcc82DAQ7vuQeAreuuA+D8X/819zP/u21cdx0A9913361cddVVV1111bNRueqqq6666qqrrrrqqquu+j/uzJkzD+aFMP9+5t/H/NttXHcdAPfdd9+tXHXVVVddddVzonLVVVddddVVV1111VVXXfV/3DXXXPNggIN77gFg67rrADi65x7+I5j/XovrrgPg7Nmzt3LVVVddddVVz4nKVVddddVVV1111VVXXXXV/zNb118PwNE992D++5l/n83rrgPgvvvuu5Wrrrrqqquuek5Urrrqqquuuuqqq6666qqr/o87c+bMg+75q78CAIn/SOa/l4GN664D4L777ruVq6666qqrrnpOVK666qqrrrrqqquuuuqqq/6Pu+aaax58eM893G/ruusAOLrnHv67mX+/jeuuA+Ds2bPP4KqrrrrqqqueE5Wrrrrqqquuuuqqq6666qr/Zzavuw6Ao3vu4d/D/PcyV2xcdx1XXXXVVVdd9QIQXHXVVVddddVVV1111VVX/R93zTXXPPjgnnu439Z11wFwdM89/Hcy/zE2r7sOgH/4h3/4ba666qqrrrrqORFcddVVV1111VVXXXXVVVf9H3fmzJkHH9xzD/+RzL+P+fcxz7Zx3XUA3Hfffbdy1VVXXXXVVc+JylVXXXXVVVddddVVV1111f8jW9ddB8DRPfdw1VVXXXXVVf8PEFx11VVXXXXVVVddddVVV/0fd8011zz44O67QWLzuusAOLrnHv6tzL+P+fcxz3b6pV8agH/4h3/4ba666qqrrrrqeVG56qqrrrrqqquuuuqqq676P+yaa655MMDhPfcAsHXddQAc3XMP/xdsXncdAPfdd9+tXHXVVVddddXzonLVVVddddVVV1111VVXXfV/2JkzZx7MfyDz72P+fcxVV1111VVX/asQXHXVVVddddVVV1111VVX/R92zTXXPBjg4J57ANi67joAju65h/8LTr/0SwPwD//wD7/DVVddddVVVz0vKlddddVVV1111VVXXXXVVf/HHdxzD/fbuv56AJb33MO/lvn3Mf8+5qqrrrrqqqv+1ahcddVVV1111VVXXXXVVVf9H3bmzJkHHdx9N/9e5n+mMy/90gD8wz/8w29z1VVXXXXVVc+LylVXXXXVVVddddVVV1111f9h11xzzYMP77kHJACufemXBuDcX/81/5XMv4+56qqrrrrqqn8TKlddddVVV1111VVXXXXVVVe9UOZ/ro3rrgPgvvvuu5Wrrrrqqquuel4EV1111VVXXXXVVVddddVV/4ddc801Dz645x7ut3XddQAc3XMP/1XMv495/jauuw6A++6771auuuqqq6666vkjuOqqq6666qqrrrrqqquu+j/szJkzDz645x7+rcz/XGde+qUB+Id/+Iff5qqrrrrqqqueP4Krrrrqqquuuuqqq6666qr/w6655poH80xb110HwNE99/Bfxfz7mKuuuuqqq676d6Fy1VVXXXXVVVddddVVV131f9zB3XcDcO1LvzQAR/fcw4vC/M+2cd11ANx33323ctVVV1111VXPH5Wrrrrqqquuuuqqq6666qr/o6655poHAxzeey8PdHTPPfxXMP8+5oXbuO46AM6ePfsMrrrqqquuuur5o3LVVVddddVVV1111VVXXfV/1JkzZx7MA2xddx0vKvM/38Z11wFw33333cpVV1111VVXPX9Urrrqqquuuuqqq6666qqr/o+65pprHgxwcM89AGxdfz0A5//6r3lhzL+f+fcx/7LN664D4OzZs7dy1VVXXXXVVc8flauuuuqqq6666qqrrrrqqv/DDu65h/+rNq67DoD77rvvVq666qqrrrrq+aNy1VVXXXXVVVddddVVV131f9SZM2cedHD33dxv87rrADi65x5eEPPvZ/59zFVXXXXVVVf9h6Fy1VVXXXXVVVddddVVV131f9Q111zz4MN77+V+W9ddB8DRPffwn8X81zj90i8NwD/8wz/8NlddddVVV131glG56qqrrrrqqquuuuqqq6666jLz38+8aDavuw6A++6771auuuqqq6666gUjuOqqq6666qqrrrrqqquu+j/qH/7hH37n2pd+abauuw6AreuuA+Donnv4z2D+62xcdx1XXXXVVVdd9SIguOqqq6666qqrrrrqqquu+j/qH/7hH377KOLWN/yar+Hal35pAI7uuYfnx/z3My+6jeuuA+Af/uEffoerrrrqqquuesEIrrrqqquuuuqqq6666qqr/o+67777bv2sz/qs1zmKuPWNvuZrADi65x7+M5irrrrqqquu+h+J4Kqrrrrqqquuuuqqq6666v+w++6779bP+qzPeh2eaeO667jljd+YBzL//cy/zpmXfmkA/uEf/uG3ueqqq6666qoXjHL8+HGuuuqqq6666qqrrrrqqqv+Lzs8PNw9e/bsMw4PD3cf+RIv8dLXv/qrc8sbvzHHHv5w+q0tLj3lKfx7mP96D3/7t6fb2uIXfuEXvubw8HCXq6666qqrrnr+0IMe9CCuuuqqq6666qqrrrrqqqv+P7jmmmse/GIv9mKv/Tqv8zrv9WIv9mKvzTMd3XMP5/76r7ntl3+Zc3/91/xrmX8f86/3tr/92wC83du9nbjqqquuuuqqFww96EEP4qqrrrrqqquuuuqqq6666v+ba6655sGv/dqv/V4v/uIv/tov9mIv9to809E993Dur/+a2375lzn313/Nv8T8+5h/vY3rruONf/iHue+++279kA/5kIdw1VVXXXXVVS8Y5fjx41x11VVXXXXVVVddddVVV/1/c3h4uPsP//APv/Nbv/Vb3/Pbv/3b33N4eLgriRsf+tAHH3v4w7nljd+YW974jTn28IczHhxwdM89/E9xw6u/Oje8+qvzp3/6pz/9p3/6pz/DVVddddVVV71glOPHj3PVVVddddVVV1111VVXXfX/2eHh4e4//MM//M5v/dZvfc9v//Zvf8/h4eGuJG586EMffOzhD+eWN35jbnnjN+bYwx/OeHDA0T33AGD+fcy/zfGHP5wbXv3VufXWW//6T//0T3+Gq6666qqrrnrBKMePH+eqq6666qqrrrrqqquuuuqqKw4PD3f/4R/+4Xd+67d+63t++7d/+3sODw93r7nmmgcfv/ba48ce/nBueeM35pY3fmO6rS0Aju65h/9qN7z6q3PmpV+aP/3TP/3pf/iHf/gdrrrqqquuuuoFoxw/fpyrrrrqqquuuuqqq6666qqrntfh4eHuP/zDP/zOL/zCL3zNb//2b3/P4eHh7jXXXPPg49dee/z0S780D3rjN+ZBb/zGdFtbABzdcw8vKvNv96A3fmOOP/zh/PZv//b33HrrrX/NVVddddVVV71g6EEPehBXXXXVVVddddVVV1111VVXveiuueaaB7/2a7/2e73TO73TZ/MAR/fcwzN++Zc599d/zbm//mteGPNv9xpf/dWceemX5jM/8zNf5x/+4R9+m6uuuuqqq656wdCDHvQgrrrqqquuuuqqq6666qqrrvrXu+aaax585syZB7/O67zOe73O67zOe/MAR/fcwzN++Ze57Zd/maN77uGBzL/PG//wD7Nx3XV8yId8yEPuu+++W7nqqquuuuqqFww96EEP4qqrrrrqqquuuuqqq6666qp/n2uuuebBL/ZiL/baL/ZiL/Zar/M6r/PePMDRPffwjF/+ZW775V/m6J57MP8+b/vbvw3A273d24mrrrrqqquueuHQgx70IK666qqrrrrqqquuuuqqq676j3PNNdc8+MVe7MVe+8Ve7MVe63Ve53Xem2c6uuceDu+5h9t++Zd5xi//Mv8Wi+uu401++Ie57777bv2QD/mQh3DVVVddddVVLxx60IMexFVXXXXVVVddddVVV1111VX/Oa655poHv9iLvdhrv9iLvdhrvc7rvM5780xH99zD4T33cNsv/zLP+OVf5kV1+qVfmtf86q/mH/7hH377Mz/zM1+Hq6666qqrrnrhKMePH+eqq6666qqrrrrqqquuuuqq/xyHh4e7t95661//6Z/+6c/89m//9vfceuutf7O5uXn8xoc+9MGb113HDa/+6jzojd+YYw9/OP3WFpee8hReEANnXvqlueHVX51/+Id/+O0//dM//Rmuuuqqq6666oWjHD9+nKuuuuqqq6666qqrrrrqqqv+8x0eHu7eeuutf/1bv/Vb3/Pbv/3b33Prrbf+zebm5vEbH/rQBx9/+MO54dVfnQe98Rtz7OEPp9/a4tJTnsJzu+HVX50zL/3S/Omf/ulP/8M//MPvcNVVV1111VUvHOX48eNcddVVV1111VVXXXXVVVdd9V/r8PBw99Zbb/3r3/qt3/qe3/7t3/6eW2+99W82NzeP3/jQhz74+MMfzg2v/uo86I3fmGMPfzj91ha7T3kKAA9+4zfm+MMfzm//9m9/z6233vrXXHXVVVddddULhx70oAdx1VVXXXXVVVddddVVV1111f8M11xzzYNf7MVe7LVf53Ve571e7MVe7LV5pqN77uHsX/81G9ddx5mXfmm+/uu//n1+67d+67u56qqrrrrqqheOcvz4ca666qqrrrrqqquuuuqqq/6rXXPNNQ9+szd7s4/63M/93N++5pprHry5uXni1ltv/Wv+nzs8PNy99dZb//q3fuu3vue3f/u3v+fw8HBXEjc+9KEPPv7wh7N53XUAfNd3fdfHHB4e7nLVVVddddVVLxx60IMexFVXXXXVVVddddVVV1111X+FF3uxF3vtF3uxF3utd3qnd/psgP177uFJv/iLvNz7vi8AX//1X/8+v/Vbv/XdXPU8rrnmmge/9mu/9nu9+Iu/+Gt//dd//fvcd999t3LVVVddddVV/zL0oAc9iKuuuuqqq6666qqrrrrqqv8M11xzzYNf+7Vf+72uueaaB7/O67zOewPs33MPT/rFX+Sev/5r7v6rvwLgEW/yJrzWp34q9913362f9Vmf9Tr33XffrVx11VVXXXXVVf8R0IMe9CCuuuqqq6666qqrrrrqqqv+o1xzzTUPfu3Xfu33evEXf/HXfrEXe7HXBti/5x6e/Iu/yJN+6Zc4uOcenp83+9qv5fqXeRn+4R/+4bc/8zM/83W46qqrrrrqqqv+I1C56qqrrrrqqquuuuqqq676d7rmmmse/Nqv/drv9eIv/uKv/WIv9mKvDbB/zz385Xd+J0/6pV/i4J57eGG2rruO/Xvu4XrgxV7sxV77mmuuefB99913K1ddddVVV1111b8Xlauuuuqqq6666qqrrrrqqn+Da6655sGv/dqv/V4v/uIv/tov9mIv9toA+/fcw19+53fyl9/1XfxLtq67jke+yZuwff31POJN3oT73Xfffbe+9mu/9nv96I/+6Odw1VVXXXXVVVf9e1G56qqrrrrqqquuuuqqq656EV1zzTUPfu3Xfu33ep3XeZ33vuaaax4McPdf/RV/+Z3fyV9+13fxL9m+7joe8SZvwvUv8zJc/zIvwwMd3XMPANdcd92Dz549+wyuuuqqq6666qr/CFSuuuqqq6666qqrrrrqqqteiGuuuebBr/3ar/1e7/RO7/TZAPv33MPdf/EX3HH33fzld30XL4i4Yuu663jEm7wJ17/My3D9y7wMD3R0zz3c/su/zBO/+7sx8DKf/Mnc8sZvzFVXXXXVVVdd9R+GylVXXXXVVVddddVVV1111XO55pprHvzar/3a7/VO7/ROnw2wf889/OV3fif799zDk3/pl3h+xLNtXXcdj3iTN+GRb/qmbF13Hfc7uuceju65h/N//dc88bu/m/uZKzauuw6A++6771auuuqqq6666qr/CFSuuuqqq6666qqrrrrqqquAF3uxF3vtF3uxF3utd3qnd/psgP177uEvv/M7ufuv/5q7/+qveCDxvLauu45HvMmb8Mg3fVO2rruO+x3dcw+3//Ivc3TPPdz+y7/MC7Nx3XUAnD179lauuuqqq6666qr/CFSuuuqqq6666qqrrrrqqv+Xrrnmmge/9mu/9ntdc801D36d13md9wbYv+ce/vI7v5O7//qvufuv/goAAeL527ruOh7xJm/Cy77v+/JAR/fcw+2//Muc++u/5vxf/zUvjLnqqquuuuqqq/4TUbnqqquuuuqqq6666qqr/t+45pprHvzar/3a7/XiL/7ir/1iL/Zirw2wf889/OV3fidP+qVf4uCeexBXiOfv+pd5Ga576ZfmZd/3fXmgo3vu4fZf/mXO/fVfc/6v/5p/i43rrgPgvvvuu5Wrrrrqqquuuuo/ApWrrrrqqquuuuqqq6666v+0a6655sGv/dqv/V4v/uIv/tov9mIv9toA+/fcw19+53fy5F/6JQ7uuYf7iee1dd11POJN3oTt66/nEW/yJjzQ0T33cPsv/zK3//Ivc3TPPfxrmauuuuqqq6666j8Zlauuuuqqq6666qqrrrrq/5xrrrnmwa/92q/9Xi/+4i/+2i/2Yi/22gAH99zDX37nd/JX3/Vd/Eu2rruOR7zJm3D9y7wM17/My/BAR/fcw+2//Mvc/su/zNE99/AfZeO66wC47777buWqq6666qqrrvqPQuWqq6666qqrrrrqqquu+j/hmmuuefBrv/Zrv9frvM7rvPc111zzYIC7/+qv+Mvv/E7+6ru+i3/J1nXX8Yg3eROuf5mX4fqXeRke6Oiee7j9l3+ZJ373d/MfxTynjeuuA+Ds2bO3ctVVV1111VVX/UehctVVV1111VVXXXXVVVf9r3XNNdc8+LVf+7Xf653e6Z0+G+Dgnnu4+y/+gjvuvpu/+q7v4l+ydd11PPJN3oRHvOmbsnXddTzQ+b/+a8799V/zpO/+bgDMf66N664D4L777ruVq6666qqrrrrqPwqVq6666qqrrrrqqquuuup/pXd8x3f8rHd6p3f67IN77uEvv/M7ObjnHp78S7/Ev2T7+ut5xJu8CY94kzdh67rruN/RPfdw+y//MgBP+u7v5j+Tueqqq6666qqr/otQueqqq6666qqrrrrqqqv+13md13md936nd3qnzwb4kXd4B14QAUhsXXcdj3iTN+Fl3ud9eKCje+7h9l/+Zc7/9V9z/q//mhfE/Mcxz9/iuusAuO+++27lqquuuuqqq676j0Llqquuuuqqq6666qqrrvpf58yZMw/ima5/mZfh7r/6KwAkcb/rXvqluf5lXoaXeZ/34YGO7rmH23/5lzn/N3/D+b/+a7D5n2DjuusAOHv27DO46qqrrrrqqqv+o1C56qqrrrrqqquuuuqqq/5X2r/nHravu47X/NRP5Uff8R3Zuu46HvEmbwLAy7zP+/BAR/fcw+2//Muc/5u/4fxf/zX/GuY/jrnqqquuuuqqq/6LUbnqqquuuuqqq6666qqr/te55pprHnxw990I2LruOt7ka76G61/mZXigo3vu4fZf/mXu+JVf4eiee3iBJLB5fsx/nY3rrgPgvvvuu5Wrrrrqqquuuuo/CpWrrrrqqquuuuqqq6666n+lu//6r7n7r/+al32f9+H6l3kZAI7uuYfbf/mXedL3fA//05gXbuO66wA4e/bsrVx11VVXXXXVVf9RqFx11VVXXXXVVVddddVV/2sd3HMPAOf/+q/5w4/5GP4jmauuuuqqq6666v8Agquuuuqqq6666qqrrrrqf51rrrnmwfv33MPWddcBcO6v/5r/ycy/bOO66wC47777buWqq6666qqrrvqPQnDVVVddddVVV1111VVX/a9z5syZB/MfSeKBzFVXXXXVVVdd9X8Elauuuuqqq6666qqrrrrqf63t664DYHnvvfxPZf5lG9ddB8B99913K1ddddVVV1111X8kgquuuuqqq6666qqrrrrqf6WDu+/mP4P5r7dx3XUAnD179lauuuqqq6666qr/SARXXXXVVVddddVVV1111f8611xzzYP5jyZh/mOZF83GddcBcN99993KVVddddVVV131H4nKVVddddVVV1111VVXXfW/0v4997B13XUAHN1zD//TmKuuuuqqq6666n8AKlddddVVV1111VVXXXXV/1rb118PwPKee/j3Mv99FtddB8B99913K1ddddVVV1111X8kgquuuuqqq6666qqrrrrqf5VrrrnmwQAH99zDfziJ/wjmX2fjuusAOHv27DO46qqrrrrqqqv+I1G56qqrrrrqqquuuuqqq/5XOXPmzIP5D2auuuqqq6666qr/o6hcddVVV1111VVXXXXVVf9rbV13HQBH99zD/xTmX2/juusAuO+++27lqquuuuqqq676j0Rw1VVXXXXVVVddddVVV/2vcs011zx4/557+I9inovEf7WN664D4OzZs7dy1VVXXXXVVVf9R6Jy1VVXXXXVVVddddVVV/2vc3D33Wxddx0AR/fcw/8U5qqrrrrqqquu+h+G4Kqrrrrqqquuuuqqq676X0n8+5kXQOK/0sZ11wFw33333cpVV1111VVXXfUficpVV1111VVXXXXVVVdd9b/KmTNnHrR/zz1sX3cdAMt77uHfwvzHMlddddVVV1111f9AVK666qqrrrrqqquuuuqqq/4bbVx3HQD33XffrVx11VVXXXXVVf/RCK666qqrrrrqqquuuuqq/1WuueaaBwNsXX89AEf33MO/lnkRSLyozL/dxnXXAXD27Nlbueqqq6666qqr/qNRueqqq6666qqrrrrqqqv+1zm45x7+r9i47joA7rvvvlu56qqrrrrqqqv+oxFcddVVV1111VVXXXXVVf+rXHPNNQ/m38H8xzJXXXXVVVddddX/YARXXXXVVVddddVVV1111f86+/fcw9Z11wFwdM89/KeR+M+2uO46AO67775bueqqq6666qqr/qMRXHXVVVddddVVV1111VX/q5w5c+bBANvXXQfA8t57eVGZ/1jm32/juusAOHv27DO46qqrrrrqqqv+oxFcddVVV1111VVXXXXVVf/rHNx9N/9lJK666qqrrrrqqv+1qFx11VVXXXXVVVddddVV/6tcc801D+bfwPzHMv8xNq67DoD77rvvVq666qqrrrrqqv9oBFddddVVV1111VVXXXXV/zr799zD1nXXAXB0zz38p5P4z7Jx3XUAnD179lauuuqqq6666qr/aFSuuuqqq6666qqrrrrqqv+Vtq+/nheV+Y9lrrrqqquuuuqq/yWoXHXVVVddddVVV1111VX/a1xzzTUP5rks77mH/802rrsOgPvuu+9Wrrrqqquuuuqq/2gEV1111VVXXXXVVVddddX/Ogf33MOLyvwHkQAw/3HMVVddddVVV131n4zKVVddddVVV1111VVXXfW/xn333XcrwPUv/dJsXXcdAEf33MP/VhvXXQfAfffddytXXXXVVVddddV/BoKrrrrqqquuuuqqq6666n+Vf/iHf/jtR7zJm/CiMP/BJP6jGNi47joAzp49eytXXXXVVVddddV/BoKrrrrqqquuuuqqq6666n+VH/mRH/mcR77Jm/DfwfzH2rjuOgDuu+++W7nqqquuuuqqq/4zEFx11VVXXXXVVVddddVV/6v8wz/8w2//wz/8w28DHN1zDy+I+U8icdVVV1111VVX/a9BcNVVV1111VVXXXXVVVf9r/P3f//3v80zPfK93otTL/3S/Gcz/3HMFRvXXQfAfffddytXXXXVVVddddV/BipXXXXVVVddddVVV1111f86v/3bv/09Z8+efcaHf/iHf9ej3vu9ATi65x7O//Vfc/uv/Arn/vqv+U8lgc2/18Z11wFw9uzZZ3DVVVddddVVV/1noBw/fpyrrrrqqquuuuqqq6666n+Xw8PD3aOjo91f+IVf+JrDw8Pda6655sHHr732+LGHP5yb3/iNufmN35hjD3844+Ehy3vu4d/L/Mcxz3b9q786xx7+cP70T//0Z2699da/5qqrrrrqqquu+o+GHvSgB3HVVVddddVVV1111VVX/e93zTXXPPi1X/u13+t1Xud13vuaa655MM90dM89nP/rv+a2X/kVzv/1X/NvYV4Am38t82yv/tVfzemXfmk+8zM/83X+4R/+4be56qqrrrrqqqv+o6EHPehBXHXVVVddddVVV1111VX/t1xzzTUPfu3Xfu33evEXf/HXfrEXe7HX5pmO7rmH83/919z2K7/C+b/+a14U5oWw+dcwz+kNf/iH2bjuOj7kQz7kIffdd9+tXHXVVVddddVV/9HQgx70IK666qqrrrrqqquuuuqq/7uuueaaB7/2a7/2e734i7/4a7/Yi73Ya/NMR/fcw/m//mvO/c3fcPsv/zIviPkX2LyozHN6wx/+YTauu44P+ZAPech99913K1ddddVVV1111X809KAHPYirrrrqqquuuuqqq6666v+Ha6655sGv/dqv/V4v/uIv/tov9mIv9to809E993D+r/+ac3/zN9z+y7/MA5l/gc2Lyjynt/7t3wbg7d7u7cRVV1111VVXXfWfAT3oQQ/iqquuuuqqq6666qqrrvr/55prrnnwa7/2a7/Xi7/4i7/2i73Yi702z3R0zz2c/+u/5tzf/A23/fIv8yKx+ZeY5/XWv/3bALzd272duOqqq6666qqr/jOgBz3oQVx11VVXXXXVVVddddVV/79dc801D36xF3ux136d13md93qxF3ux1+aZju65h3N//dec/5u/4bZf/mVeIJt/iXlOG9ddxxv+8A9z33333fohH/IhD+Gqq6666qqrrvrPgB70oAdx1VVXXXXVVVddddVVV111v2uuuebBL/ZiL/bar/M6r/NeL/ZiL/baPNPRPfdwdM893P4rv8Jtv/zLPA+bF8Y8p9Mv/dK8+ld/Nf/wD//w25/5mZ/5Olx11VVXXXXVVf8ZqFx11VVXXXXVVVddddVVVz3Afffdd+t999333b/1W7/13ddcc82DX+zFXuy1X+d1Xue9XuzFXuy1N667jtMv/dI86r3ei6N77uHcX/81t//Kr3B0zz28MOZ5bVx3HQD33XffrVx11VVXXXXVVf9ZqFx11VVXXXXVVVddddVVV70A991336333Xffd//Wb/3Wd19zzTUPfrEXe7HXfrEXe7HXep3XeZ333rjuOk6/9Evz6Pd+b47uuYfbfvmXuf2Xf5mje+7hqquuuuqqq676H4Ny/Phxrrrqqquuuuqqq6666qqr/iWHh4e7t95661//6Z/+6c/89m//9vfceuutf3N4eLj7kIc85KW7rS1Ov/RL87C3f3tueeM3ptvaQsDRPfdgnr/rX/3VOf3SL82f/umf/vQ//MM//A5XXXXVVVddddV/Bsrx48e56qqrrrrqqquuuuqqq6761zg8PNy99dZb//pP//RPf+a3f/u3v+fWW2/9m8PDw92HPOQhL91tbXH6pV+aW974jbnljd+YbmsLgKN77uGBbnnjN+bYwx/Ob//2b3/Prbfe+tdcddVVV1111VX/GSjHjx/nqquuuuqqq6666qqrrvqPdc011zz4zd7szT7qmmuuecitt9761/wfdnh4uHvrrbf+9Z/+6Z/+zG//9m9/z6233vo3h4eHuw95yENeutva4vRLvzS3vPEbc8sbvzHd1hYAR/fcw/Wv/uoce/jD+dM//dOfufXWW/+aq6666qqrrrrqPwN60IMexFVXXXXVVVddddVVV13173fNNdc8+LVf+7Xf63Ve53Xe+5prrnkwwH333Xfr2bNnb/3Mz/zM1+H/mWuuuebBZ86cefDrvM7rvNfrvM7rvDcPcHTPPWxcdx0An/mZn/k6//AP//DbXHXVVVddddVV/xmoXHXVVVddddVVV1111VX/Ztdcc82DX/u1X/u93umd3umzeaaDe+7hL7/zO7nnr/+aN/3ar30w/0/dd999t9533323/sM//MNv/+iP/ujnnDlz5sGv8zqv816v8zqv894b110HwD/8wz/89tmzZ2/lqquuuuqqq676z4Ie9KAHcdVVV1111VVXXXXVVVe96F7sxV7stV/sxV7std7pnd7ps3mmu//qr7j7r/6Kv/qu7+KB3vRrv5brX+Zl+MzP/MzX+Yd/+Iff5qrLrrnmmge/9mu/9nv96I/+6Odw1VVXXXXVVVf9Z0IPetCDuOqqq6666qqrrrrqqqtesGuuuebBr/3ar/1e11xzzYNf53Ve570BDu65hyf94i9ycM89PPmXfokX5BFv8ia85qd+Kv/wD//w25/5mZ/5Olx11VVXXXXVVVf916Jy1VVXXXXVVVddddVVVz2Pa6655sGv/dqv/V4v/uIv/tov9mIv9toAB/fcw19+53dyz1//NXf/1V/xwghA4p6//msAzpw582Cuuuqqq6666qqr/utRueqqq6666qqrrrrqqqsuu+aaax782q/92u/1Oq/zOu99zTXXPBjg4J57+Mvv/E7u+eu/5u6/+iueHwFI3G/ruut4xJu8CQAv8z7vA8A111zz4GuuuebB9913361cddVVV1111VVX/dehctVVV1111VVXXXXVVf+PXXPNNQ9+7dd+7fd6ndd5nfe+5pprHgxwcM89/OV3fidP/qVf4uCee3huApB4oK3rruMRb/ImXPfSL831L/MyXHXVVVddddVVV/0PQeWqq6666qqrrrrqqqv+n3mxF3ux136xF3ux13qnd3qnz+aZ7v6rv+Ivf/7n+avv+i6emwAkntvWddfxiDd5E6576Zfm+pd5GR7o6J57uP2Xf5knfc/38Ho/9ENsXHcdV1111VVXXXXVVf8NqFx11VVXXXXVVVddddX/cddcc82DX/u1X/u9rrnmmge/zuu8znsDHNxzD3/5nd/JwT338ORf+iUeSAASz8/WddfxiDd5Ex7xJm/C1nXXcb+je+5hec89nP/rv+aJ3/M9XHXVVVddddVVV/0PQeWqq6666qqrrrrqqqv+D7rmmmse/Nqv/drv9eIv/uKv/WIv9mKvDXBwzz385Xd+J/f89V9z91/9FQACBCDxglz30i/N9S/zMrzM+7wPD3R0zz3c8cu/zNG993LHL/8yL8jGddcBcN99993KVVddddVVV1111X8tKlddddVVV1111VVXXfV/xDXXXPPg137t136v13md13nva6655sEAB/fcw19+53dyz1//NXf/1V8hAAlJvCBb113HI97kTdi67joe8SZvwgMd3XMPd/zyL3P+b/6G83/91zw3c9VVV1111VVXXfU/CpWrrrrqqquuuuqqq676X+yaa6558Gu/9mu/1+u8zuu89zXXXPNggIN77uEvv/M7efIv/RKH99wDEgCSeEG2rruOR7zJm3DdS78017/My/BAR/fcwx2//Mvc/iu/wvKee7jqqquuuuqqq676X4TKVVddddVVV1111VVX/S/zYi/2Yq/9Yi/2Yq/1Tu/0Tp/NM939V3/FX/78z/PX3/VdIPEsEi/I1nXX8Yg3eROue+mX5vqXeRke6Oiee7jjl3+ZJ33P9/DvsXHddQDcd999t3LVVVddddVVV131X4/KVVddddVVV1111VVX/Q93zTXXPPi1X/u13+uaa6558Ou8zuu8N8DBPffwl9/5nQj4q+/+bp5F4oXZuu46HvEmb8Ij3uRN2LruOu53dM89LO+5h/N//dc86Xu+h38Lc9VVV1111VVXXfU/DpWrrrrqqquuuuqqq676H+qaa6558Id/+Id/14u92Iu9NsDBPffwV9/5ndz913/NPX/917yornvpl+b6l3kZXuZ93ocHOrrnHu745V/m/N/8Def/+q/5z7C47joAzp49eytXXXXVVVddddVV//WoXHXVVVddddVVV1111f9Q7/iO7/hZL/ZiL/baf/Vd38Xdf/VX3PPXf82LYuu663jEm7wJ29ddx8Pf5E14oKN77uGOX/5lzv/N33D+r/+aq6666qqrrrrqqv/jqFx11VVXXXXVVVddddX/QNdcc82DX+d1Xue9Af7qu76Lf8nWddfxiDd5E65/6Zfmupd5GR7o6J57uOOXf5nbf+VXWN5zD/8ZzPO3cd11XHXVVVddddVVV/03onLVVVddddVVV1111VX/w1330i/NPX/91zy37euu4+Fv8iY84k3ehK3rruOBlvfcw+2//Ms86Xu+h/8J7rvvvlu56qqrrrrqqquu+q9H5aqrrrrqqquuuuqqq/6XELB13XU8/E3ehEe8yZuwdd113G95zz2c/+u/5uiee3jy93wP5qqrrrrqqquuuuoqgMpVV1111VVXXXXVVVf9D/fIN3kTrn+Zl+Fl3ud9eKDlPfdw+6/8Chf++q85/zd/AzZXXXXVVVddddVVVz0HKlddddVVV1111VVXXfU/0JkzZx7MMz38Td6E+y3vuYfbf+VXuPDXf835v/kbnoMEADb/UyyuvRaA++6771auuuqqq6666qqr/utRueqqq6666qqrrrrqqv/hlvfcw+2/8ivc8Su/wvKee/iXWAIAm/8K5qqrrrrqqquuuup/LCpXXXXVVVddddVVV131P9z5v/kbnvw938O/mgQANv9dNq67DoCzZ88+g6uuuuqqq6666qr/elSuuuqqq6666qqrrrrq/zoJAGyuuuqqq6666qqr/p+hctVVV1111VVXXXXVVf9fSABgc9VVV1111VVXXfX/BJWrrrrqqquuuuqqq676H+iaa655MM90dM89/IeSAMDmP9vGddcBcN99993KVVddddVVV1111X89KlddddVVV1111VVXXfV/iPlXkADA5t/KXHXVVVddddVVV/2PRnDVVVddddVVV1111VX/30n8Z1lcdx0AZ8+evZWrrrrqqquuuuqq/3pUrrrqqquuuuqqq6666iqQuMzmqquuuuqqq6666v8QKlddddVVV1111VVXXXXVs0lcZnPVVVddddVVV131fwCVq6666qqrrrrqqquu+h9uec89/JeTuMzm32PjuusAuO+++27lqquuuuqqq6666r8ewVVXXXXVVVddddVVV/0PdObMmQfxP4HEVVddddVVV1111f9iVK666qqrrrrqqquuuuqqF04CAJurrrrqqquuuuqq/2WoXHXVVVddddVVV1111VUvGgkAbF4UG9ddB8B99913K1ddddVVV1111VX/PQiuuuqqq6666qqrrrrqqn8diauuuuqqq6666qr/JahcddVVV1111VVXXXXVVf96EpfZvCCL664D4OzZs7dy1VVXXXXVVVdd9d+DylVXXXXVVVddddVVV/0PdM011zyYZ1recw//Y0lcZnPVVVddddVVV131PxDBVVddddVVV1111VVXXfXvJ/HcNq67DoD77rvvVq666qqrrrrqqqv+e1C56qqrrrrqqquuuuqqq/5jSABgc9VVV1111VVXXfU/BMFVV1111VVXXXXVVVdd9R9L4qqrrrrqqquuuup/CCpXXXXVVVddddVVV1111X88iauuuuqqq6666qr/AahcddVVV1111VVXXXXV/3BH997L/0aL664D4L777ruVq6666qqrrrrqqv8eVK666qqrrrrqqquuuup/oGuuuebBXHXVVVddddVVV13170Xlqquuuuqqq6666qqrrvpPsXHddQCcPXv2GVx11VVXXXXVVVf996By1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Vw1VVXXXXVVVddddVV/wPdd999t/JvIK666qqrrrrqqquuegCCq6666qqrrrrqqquuuurfTLxgG9deC8B99913K1ddddVVV1111VX/PahcddVVV1111VVXXXXV/0D33XffrTzT8p57uOqqq6666qqrrrrq34TKVVddddVVV1111VVX/Q909uzZZ/C/3OK66wA4e/bsrVx11VVXXXXVVVf99yC46qqrrrrqqquuuuqq/4Huu+++W/k3ElddddVVV1111VVXPRPBVVddddVVV1111VVX/Q909uzZW3mmm97ojbjqqquuuuqqq6666t+E4Kqrrrrqqquuuuqqq/6H+szP/MzXAXipT/okXvcHf5BX/sqv5KY3eiP+t9i47joA7rvvvlu56qqrrrrqqquu+u9BOX78OFddddVVV1111VVXXfU/zeHh4a4kbr311r/Z3Nw8fsNDH/rgjeuu47pXf3Ue+V7vxc1v9EbUrS0ELO+9l+cm/uuI5+9R7/VeAPzoj/7o53DVVVddddVVV1313wM96EEP4qqrrrrqqquuuuqqq/6n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z/vwQMt77uGOX/kVlvfeyx2/8itcddVVV1111VVXXfX/CpWrrrrqqquuuuqqq/7XEM8ksXXddTziTd6E6176pbn+ZV6GB1recw93/MqvcP5v/oYLf/M3/FfYuO46AO67775bueqqq6666qqrrrrqfwoqV1111VVXXXXVVVf9jyYACYCt667jEW/yJjziTd6Ereuu44GW99zDHb/yK9z5q7/K8p57ADBXXXXVVVddddVVV/0/R+Wqq6666qqrrrrqqv8xzpw58yCAg7vvRhIAW9ddxyPe5E14mfd5Hx5oec89LO+9l/N//dc85Xu/l+dHPCdz1VVXXXXVVVddddX/M1Suuuqqq6666qqrrvof57qXeRle4/rrecSbvAkPtLznHu74lV/hwt/8DRf+5m/41xLPZv6D2Vx11VVXXXXVVVdd9T8Olauuuuqqq6666qqr/se45pprHgxw/cu8DPdb3nMPd/zKr3Dhb/6GC3/zN/xHEc9mrrrqqquuuuqqq676P4rKVVddddVVV1111VX/4yzvuYc7fuVXeMr3fi//FcSzmauuuuqqq6666qqr/g+hctVVV1111VVXXXXV/zhP/t7v5c5f+RX+O4hnM1ddddVVV1111VVX/S9H5aqrrrrqqquuuuqqq14A8Wzmqquuuuqqq6666qr/hahcddVVV1111VVXXXXVi0BcYa666qqrrrrqqquu+l+EylVXXXXVVVddddVVV/0riGczV1111VVXXXXVVVf9D0flqquuuuqqq6666qr/Me67775bARbXXsv/BuIKc9VVV1111VVXXXXV/1BUrrrqqquuuuqqq6666t9JwOK66wC47777buWqq6666qqrrrrqqv8pqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXfU/xtmzZ58BsHHddfxvs3HddQCcPXv2GVx11VVXXXXVVVdd9T8Flauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVX/d8j8R/C5qqrrrrqqquuuuqq/9WoXHXVVVddddVVV131P5J4AIl/L/NvIHHVVVddddVVV1111f9qVK666qqrrrrqqquu+p9J4j+SeMHMVVddddVVV1111VX/R1G56qqrrrrqqquuuur/PfG8zFVXXXXVVVddddVV/wdQueqqq6666qqrrrrqqudDPC9z1VVXXXXVVVddddX/MlSuuuqqq6666qqrrrrqRSSek7nqqquuuuqqq6666n84KlddddVVV1111VVXXfVvJK666qqrrrrqqquu+h+OylVXXXXVVVddddVV//NIXHXVVVddddVVV1111X8AKlddddVVV1111VVX/Y9x33333QqwuPZarrrqqquuuuqqq6666j8Alauuuuqqq6666qqrrvoPsLjuOgDuu+++W7nqqquuuuqqq6666n8Kgquuuuqqq6666qqr/kc6+VIvxVVXXXXVVVddddVVV/07Ubnqqquuuuqqq6666n+Ms2fP3vpbv/Vb3/06r/M67/2KX/EVLO+5hwt/8zfc+au/yoW/+Ruuuuqqq6666qqrrrrqX4nKVVddddVVV1111VX/Y9x33323/tZv/db3ALzO67zOey+uu44br7uOG9/ojVjeey8X/vqvufA3f8Odv/qrXHXVVVddddVVV1111YsAPehBD+Kqq6666qqrrrrqqv+Zrrnmmge/9mu/9nu9+Iu/+Gu/2Iu92GvzAMt77uHOX/1VLvzN33Dhb/6G/26v+BVfwcmXeik+8zM/83X+4R/+4be56qqrrrrqqquuuup/AvSgBz2Iq6666qqrrrrqqqv+5ztz5syDXvzFX/x1XuzFXuy1Xud1Xue9eYDlPfdw4W/+hgt/8zfc+au/yn+HV/yKr+DkS70Un/mZn/k6//AP//DbXHXVVVddddVVV131PwHl+PHjXHXVVVddddVVV131P9/R0dGlW2+99a//9E//9Gd++7d/+3tuvfXWvzk8PNzd3Nw8fvzaa4/vPPzhXPtqr8aNb/RG7DzsYXRbW0wHB0yHh/xXuPGN3ojFddfxW7/1W99z9uzZW7nqqquuuuqqq6666n8CKlddddVVV1111VVX/a9z33333Xrfffd992/91m99N8A111zz4Nd+7dd+rxd/8Rd/7Rd7sRd77Rvf6I248Y3eCIDlPfdw16/+Khf+5m+48Dd/wwtirrrqqquuuuqqq676Pwg96EEP4qqrrrrqqquuuuqq/zvOnDnzoBd/8Rd/nRd7sRd7rdd5ndd5bx5gec89XPibv+Hi3/wNd/7qr/KiMv+yV/yKr+DkS70Un/mZn/k6//AP//DbXHXVVVddddVVV131PwF60IMexFVXXXXVVVddddVV/zddc801Dz5z5syDX+d1Xue9rrnmmge/2Iu92GvzTMt772V5zz3c9Su/woW/+RuW997Lv5Z5ttf6/u9ncd11fMiHfMhD7rvvvlu56qqrrrrqqquuuup/AipXXXXVVVddddVVV/2fdd99991633333foP//APvw1wzTXXPPi1X/u13+vFX/zFX/vFXuzFXntx7bWcfKmXAmB5zz3c9au/yoW/+Rsu/M3f8KIQV1111VVXXXXVVVf9D4ce9KAHcdVVV1111VVXXXXVv88111zzYID77rvvVv6XOHPmzINe/MVf/HVe7MVe7LVe53Ve5715gOU993Dhb/6Gi3/zN9z5q7/Ki+I1v//7WVx3HR/yIR/ykPvuu+9Wrrrqqquuuuqqq676nwA96EEP4qqrrrrqqquuuuqqf71rrrnmwa/92q/9Xq/zOq/z3tdcc82Df+u3fuu7f+u3fut7/uEf/uG3+V/mmmuuefCZM2ce/GIv9mKv9eIv/uKv/WIv9mKvzTMt772X5T33cNev/ArLe+/lwt/8Dc/Pa37/97O47jo+5EM+5CH33XffrVx11VVXXXXVVVdd9T8Blauuuuqqq6666qqrXiTXXHPNg1/7tV/7vQDe6Z3e6bN5pv177mH/nnt4ndd5nfe+7777bv2Hf/iH3+Z/mfvuu+/W++6779Z/+Id/+O0f/dEf/ZxrrrnmwS/2Yi/22q/zOq/zXi/2Yi/22otrr+XkS70UAMt77uHC3/4td/3Kr3Dhb/6Gq6666qqrrrrqqqv+R6Ny1VVXXXXVVVddddULdM011zz4tV/7td/rxV/8xV/7xV7sxV6bZ9q/5x6e9Iu/yJN/6ZfYv+ceXutTP5XtN3kT/q+47777br3vvvu++7d+67e++8yZMw968Rd/8dd5sRd7sdd6ndd5nfdeXHcdN153HTe+4RuyvOceLvzN33Dxb/6Gq6666qqrrrrqqqv+R6Jy1VVXXXXVVVddddVzuOaaax782q/92u/1Oq/zOu99zTXXPBhg/557uPuv/oq7/uqv+Mvv+i6e2/Z11wFwzTXXPJj/Y86ePfuM3/qt3/ru3/qt3/ruH/3RH/2cM2fOPPjFXuzFXuvFX/zFX/vFXuzFXvvG667jxjd6I6666qqrrrrqqquu+h+JylVXXXXVVVddddX/c9dcc82DX/u1X/u9AN7pnd7ps3mm/Xvu4S++8zu5+6//mrv/6q94fsQVW9ddx/8H991336333Xffrf/wD//w2z/6oz/6Oddcc82DX+zFXuy1X+d1Xue9XuzFXuy1P+RDPuQh9913361cddVVV1111VVXXfU/BZWrrrrqqquuuuqq/4euueaaB7/2a7/2e734i7/4a7/Yi73Ya/NM+/fcw5N+8Rd58i/9Evv33MPzI57X9vXX8//Rfffdd+t999333b/1W7/13Vx11VVXXXXVVVdd9T8Rlauuuuqqq6666qr/J6655poHv/Zrv/Z7vc7rvM57X3PNNQ8G2L/nHu7+q7/irr/6K/7yu76LF0S8YFvXXcdVV1111VVXXXXVVVf9D0Xlqquuuuqqq6666v+oa6655sGv/dqv/V4A7/RO7/TZPNP+PffwF9/5ndz913/N3X/1V7wg4gXbuu46Hvkmb8Ij3vRN2b7uOq666qqrrrrqqquuuup/KCpXXXXVVVddddVV/4dcc801D37t137t93rxF3/x136xF3ux1+aZ9u+5hyf94i/y5F/6JfbvuYcXRDx/W9ddx/Uv8zJsX3cdL/u+78sDLe+5h8V11wFwzTXXPJirrrrqqquuuuqqq676n4PKVVddddVVV1111f9y11xzzYNf+7Vf+71e53Ve572vueaaBwPs33MPd//VX3HXX/0Vf/ld38ULI56/reuu45Fv8iZc/zIvw/Uv8zI80PKee7jzV3+Vi3/zNyzvuYfX/IEf4Kqrrrrqqquuuuqqq/4HonLVVVddddVVV131v8w111zz4Nd+7dd+L4B3eqd3+myeaf+ee/iL7/xO7v7rv+buv/orXhjx/G1ddx2PfJM34RFv+qZsX3cdD7S85x7u/NVf5a5f+RWW996LuGJx7bVcddVVV1111VVXXXXV/1BUrrrqqquuuuqqq/4XuOaaax782q/92u/14i/+4q/9Yi/2Yq/NM+3fcw9P+sVf5Mm/9Evs33MPL4x4XlvXXccj3+RNAHjZ931fHmh5zz3c+au/CsBTv/d7Ec8mrrrqqquuuuqqq6666n8FKlddddVVV1111VX/Q11zzTUPfu3Xfu33ep3XeZ33vuaaax4MsH/PPdz9V3/FXX/1V/zld30X/xLxvLauu45HvsmbcP3LvAzXv8zL8EDLe+7hzl/9VS7+zd9w8W/+hvuJF2x5771cddVVV1111VVXXXXV/1BUrrrqqquuuuqqq/4Hep3XeZ33/vAP//DvAti/5x7+4ju/k7v/+q+5+6/+iheFeE5b113HI9/kTXjEm74p29ddxwMt77mHO3/1V7nrV36F1b33ctVVV1111VVXXXXVVf+HULnqqquuuuqqq676H+Z1Xud13vvDP/zDv+vuv/orfucLv5D9e+7hRSGebeu663jkm7wJAC/7vu/LAy3vuYc7f/VXWd1zD3f+6q8i/o0kntuZM2cezFVXXXXVVVddddVVV/3PQeWqq6666qqrrrrqf5gXe7EXey2Au/7qr9i/5x5eGPFsW9ddxyPf5E24/mVehutf5mV4oOU993Dnr/4qF//mb7jwN3+DuEL8K0lcddVVV1111VVXXXXV/yJUrrrqqquuuuqqq/6HebEXe7HXBji45x6eH/FsW9ddxyPf5E142fd9X57b8p57uPNXf5Wnfu/3AiCuEP9KElddddVVV1111VVXXfW/FJWrrrrqqquuuuqq/6Hu/qu/4n7iiq3rruORb/ImbF1/PY98kzfhgZb33MOdv/qrrO65hzt/9Ve5n/g3kPjXWN5zD4vrruOqq6666qqrrrrqqqv+h6Fy1VVXXXXVVVdd9T/MNddc82CA/XvuQcDWddfxyDd5E65/mZfh+pd5GR5oec893Pmrv8rFv/kbLvzN33A/8W8kcdVVV1111VVXXXXVVf+HULnqqquuuuqqq676H+R1Xud13hvg7r/6K17ufd6Hl33f9+W5Xfibv+HC3/wNT/3e7+W5iX8Diauuuuqqq6666qqrrvo/ispVV1111VVXXXXV/yAv9mIv9loA17/My3D9y7wMAMt77uHOX/1VLv7N33Dhb/6G50f8G0j8W4nn75prrnkwV1111VVXXXXVVVdd9T8Hlauuuuqqq6666qr/Qe67775bAZb33MOdv/qrXPybv+HC3/wNz4/4N5L41xJXXXXVVVddddVVV131vxKVq6666qqrrrrqqv+B7vzVX+Wp3/u9PD/i30jiX0NcddVVV1111VVXXXXV/3oEV1111VVXXXXVVf9LCBD/ShJIIPEvESBAgPjXWd17L1ddddVVV1111VVXXfU/EJWrrrrqqquuuuqq/+HEv4HEi0JcddVVV1111VVXXXXV/2lUrrrqqquuuuqqq/4HOXv27DMAFtdei/g3kPiXiKuuuuqqq6666qqrrvp/g+Cqq6666qqrrrrqfyDxbyDxwggQ//muueaaB3PVVVddddVVV1111VX/M1C56qqrrrrqqquu+h/kvvvuuxVgft11vMgkXhBx1VVXXXXVVVddddVV/69Rueqqq6666qqrrvrfSuL5Ef91xFVXXXXVVVddddVVV/2PRnDVVVddddVVV131v40EEs9NgPjPJUCAAPFsy3vv5aqrrrrqqquuuuqqq/4HonLVVVddddVVV131P8jZs2dvBVhcey3PQ+L5Ef95xFVXXXXVVVddddVVV/2vRnDVVVddddVVV131v4HEAwkQIP7jCRAg/m3OnDnzYK666qqrrrrqqquuuup/BipXXXXVVVddddVV/5NJPJD4zyGuuuqqq6666qqrrrrq/yQqV1111VVXXXXVVf+D3HfffbcCLK67DiTuJ/7jiauuuuqqq6666qqrrvo/j8pVV1111VVXXXXV/2DiP5b4z7G65x6uuuqqq6666qqrrrrqfyAqV1111VVXXXXVVf9Dif8Y4j+RBAASV1111VVXXXXVVVdd9T8QwVVXXXXVVVddddX/MPfdd9+tAItrr+XfSoAA8Z9DEpIQIK666qqrrrrqqquuuup/LIKrrrrqqquuuuqq/0MEiP94AiQhCUm8MNdcc82Dueqqq6666qqrrrrqqv8ZCK666qqrrrrqqqv+h7nvvvtuBZhfdx0vCgECxH8sAZKQBBJXXXXVVVddddVVV131vxCVq6666qqrrrrqqv+lxH8s8QAS/xqre+7hqquuuuqqq6666qqr/geictVVV1111VVXXfW/jPiPIx5A4qqrrrrqqquuuuqqq/6PIbjqqquuuuqqq676H+bs2bO3AiyuvZYHEiD+/QQIEM8kgcRVV1111VVXXXXVVVf9H0Tlqquuuuqqq6666n848e8nng+J/wgCxLOdOXPmQVx11VVXXXXVVVddddX/DFSuuuqqq6666qqr/oe57777bgVYXHst4t9HPB8S/x7iqquuuuqqq6666qqr/tegctVVV1111VVXXfV/jHgBJP4txL9see+9XHXVVVddddVVV1111f9AVK666qqrrrrqqqv+jxAvgMS/lrjqqquuuuqqq6666qr/Ewiuuuqqq6666qqr/oc5e/bsrQAnXuql+JcIECCeDwkkXlQCBIirrrrqqquuuuqqq676P4Pgqquuuuqqq6666n+Y++6779Z/+Id/+O0TL/VSvNr3fz+P/YRP4MRLvRQPJEC8ABJI/EsECBAgrrrqqquuuuqqq6666v8kKlddddVVV1111VX/w/zDP/zD7/zWb/3W97zYi73Yay+uvZbFG74hN7zhG7K89152/+ZvuPg3f8Pq3nu5+Dd/w3OQ+JeI/xzi2a655poHc9VVV1111VVXXXXVVf8zULnqqquuuuqqq676H+i3fuu3vvsf/uEffvvMmTMPfrEXe7HXevEXf/HXfrEXe7HXXrzhG3L9G74hAKt77+Xi3/wNd//qr3Lxb/+WF0b8xxJXXXXVVVddddVVV131vwJ60IMexFVXXXXVVVddddX/Btdcc82DX+zFXuy1X+zFXuy1Xud1Xue9eYDVvfdy8W/+hot/+7dc/Ju/YXXvvYj/OOKFm197La/yfd8HwG/91m9999d//de/D1ddddVVV1111VVXXfXfDz3oQQ/iqquuuuqqq6666n+ba6655sFnzpx50Iu92Iu99ou/+Iu/9ou92Iu9Ng+wuvdeLv7N33D3r/4qu3/7t/xbiBfd/NpreZXv+z4Afuu3fuu7v/7rv/59uOqqq6666qqrrrrqqv9+6EEPehBXXXXVVVddddVV/9tdc801D36xF3ux136xF3ux13qd13md9+YBVvfey8W/+Rt2//Zvufg3f8Pq3nt5fsS/3fzaa3mV7/s+AH7rt37ru7/+67/+fbjqqquuuuqqq6666qr/fuhBD3oQV1111VVXXXXVVf+XXHPNNQ8+c+bMg1/sxV7stV78xV/8tV/sxV7stXmA1b33cvFv/5a7f+VXuPS3f8u/m8T82mt5le/9XgB+5Ed+5LN/9Ed/9HO46qqrrrrqqquuuuqq/37oQQ96EFddddVVV1111VX/l505c+ZBL/7iL/46L/ZiL/Zar/M6r/PePMDq3nvZ/Zu/4eLf/i27f/M3rO69lxeZBICA+bXX8srf+70A/NZv/dZ3f/3Xf/37cNVVV1111VVXXXXVVf/90IMe9CCuuuqqq6666qqr/qNcc801D37t137t93rc4x73O3//93//2/wPc8011zz4zJkzD36xF3ux13rxF3/x136xF3ux1+YBVvfey+7f/A13/+qvsvu3f8vzkBDPa37ttbzy934vAD/yIz/y2T/6oz/6OVx11VVXXXXVVVddddV/P/SgBz2Iq6666qqrrrrqqn+ra6655sEv9mIv9tpnzpx50Du90zt9Ns909uzZZ/zIj/zIZ//Wb/3Wd/M/2DXXXPPgF3uxF3vtF3uxF3ut13md13lvHmB1773s/u3fsvs3f8Pu3/4tq3vv5YV57V/5FQC+/uu//n1+67d+67u56qqrrrrqqquuuuqq/35Urrrqqquuuuqqq/6Vrrnmmge/9mu/9nu9+Iu/+Gu/2Iu92GvzTPv33MMTf/EXedSbvilnrrvuQWfOnHkQ/8Pdd999t953333f/Vu/9Vvf/SM/8iOffc011zzkxV7sxV7rxV/8xV/7xV7sxV77ujd4A657gzcAYHXvvez+7d9yz6/+Krt/+7dcddVVV1111VVXXXXV/wJUrrrqqquuuuqqq14EL/ZiL/baL/ZiL/Zar/u6r/s+Z86ceRDPtH/PPTzxF3+RJ/3SL7F/zz0AvPz7vi8A11xzzYP5X+Ts2bPPOHv27DP+4R/+4bd/9Ed/9HOuueaaB7/Yi73Ya73Yi73Ya7/O67zOe8+vvZbr3uANuO4N3oDVvfey+7d/y+7f/A33/Nqv8UD33XffrVx11VVXXXXVVVddddX/DOhBD3oQV1111VVXXXXVVc/tmmuuefBrv/Zrv9eLv/iLv/aLvdiLvTbPtH/PPTzxF38RgL/4ru/iud3wMi/DW3zt1wLwD//wD7/9mZ/5ma/D/wHXXHPNg8+cOfPgF3uxF3utF3/xF3/tF3uxF3ttHmB1773Mr70WgA/5kA95yH333XcrV1111VVXXXXVVVdd9d+PylVXXXXVVVddddUzXXPNNQ9+7dd+7fd6ndd5nfe+5pprHswz7d9zD0/8xV/krr/+a+76q79CvGDb113H/0X33Xffrffdd9+t//AP//DbP/qjP/o511xzzYNf7MVe7LVf7MVe7LVe53Ve573n114LwD/8wz/8NlddddVVV1111VVXXfU/B5Wrrrrqqquuuur/rWuuuebBL/ZiL/baZ86cedA7vdM7fTbPtH/PPdz1V3/FXX/1V/z5d30X9xMgXrjrX+ZlALjvr/8auo7/q+67775b77vvvu/+rd/6re/+0R/90c85c+bMg6655pqH/NZv/dZ3c9VVV1111VVXXXXVVf9zULnqqquuuuqqq/5fueaaax782q/92u/14i/+4q/9Yi/2Yq/NM+3fcw9P/MVf5K6//mvu+qu/4n7iX+eGl3kZAJ7xq7/Kg977vR/M/wP33Xffrffdd9+t//AP//A7XHXVVVddddVVV1111f8sVK666qqrrrrqqv/zXuzFXuy1X+zFXuy13umd3umzeYD9e+7hib/4izzxl36J/Xvu4YHEi277uut45Ju8CY960zdl+7rrADi85x6uuuqqq6666qqrrrrqqv92VK666qqrrrrqqv9zrrnmmge/9mu/9nu9+Iu/+Gu/2Iu92GvzTPv33MMTf/EXAfjz7/ounpt40Wxfdx2PfJM3AeDl3/d9eW6H99wDEtdcc82Dueqqq6666qqrrrrqqqv+O1G56qqrrrrqqqv+T7jmmmse/Nqv/drv9Tqv8zrvfc011zyYZ9q/5x6e+Iu/yF1//dfc9Vd/xfMj/mXb113HI9/kTbjxZV+W61/6pXmg1b33ctev/Aq7f/u3vOyXfzmb113H0T33cNVVV1111VVXXXXVVVf9t6Ny1VVXXXXVVVf9r3TNNdc8+LVf+7XfC+Cd3umdPptn2r/nHu76q7/irr/6K/78u76LF0a8YNvXXcf29ddz/Uu/NC//vu/Lc7v4N3/Dxb/5G+7+1V9lde+9vCDXXHPNg++7775bueqqq6666qqrrrrqqqv+O1C56qqrrrrqqqv+17jmmmse/Nqv/drv9eIv/uKv/WIv9mKvzTPt33MPT/zFX+Suv/or7vrrv+aFES/Y9nXX8cg3eRNueJmX4YaXeRkeaHXvvdz1K7/Cxb/5G3b/9m95QVb33sv82muRxFVXXXXVVVddddVVV131347KVVddddVVV131v8I111zz4A//8A//rhd7sRd7bYD9e+7hib/4izzxl36J/Xvu4V8inr/t667jkW/yJjzqTd+U7euu44GW997L3b/yK9z9q7/K6t57eWHEFct77mF+7bVsXHstAGfOnHnwfffddytXXXXVVVddddVVV1111X8HKlddddVVV1111f8K7/iO7/hZL/ZiL/baT/ylX+K3vvALeVGI57V93XU88k3ehO3rr+dRb/ImPNDy3nu5+1d+BYCnfd/3IV404nkJOLrnHq666qqrrrrqqquuuuqq/1ZUrrrqqquuuuqq/xVe53Ve570B/vw7v5N/iXhO29ddxyPf5E244WVehhte5mV4oOW993L3r/wKF//mb7j4t38LgADxLxNXXXXVVVddddVVV1111f9wVK666qqrrrrqqv/xXud1Xue9AJ74S7/E/j338IKIK7avu44bXuZl2LruOl7+fd+XB1reey+re+7h4t/8DU/7vu/juYkXjXj+VvfeC8DGtddyeO+9XHPNNQ/+h3/4B6666qqrrrrqqquuuuqq/xZUrrrqqquuuuqq//Fe7MVe7LUB7vqrv+L5EbB93XU88k3ehBte5mW44WVehgda3nMPd//qr3Lxb/+Wi3/zN7wg4l8mXgiJ+4krzpw58yCuuuqqq6666qqrrrrqqv8uVK666qqrrrrqqv/xXuzFXuy1Ae76q7/ifgJueJmX4fqXfmle/n3fl+e2vOce7vrVX+XuX/kVVvfeCxIviHjRiBdCAmB1770AbFx3HVddddVVV1111VVXXXXVfzsqV1111VVXXXXV/2jXXHPNg6+55poH80wv/z7vww0v8zLc8DIvwwMt77mHu371V1ndcw93/eqvAiCeSeIFEf8y8S+QABDPaXnPPVx11VVXXXXVVVddddVV/62oXHXVVVddddVV/6O92Iu92GvzTO/2Yz/GAy3vuYe7fvVXufg3f8PFv/kbHki8cOJFI/4FEuLZVvfeC8DmddeBzTXXXPNgrrrqqquuuuqqq6666qr/LlSuuuqqq6666qr/0c6cOfMgnml5zz1c/Ju/YXnvvTzte7+X50c8F4nnJv5l4l8miRfm8N574eabueqqq6666qqrrrrqqqv+21C56qqrrrrqqqv+R3vxF3/x1wZ46vd+L0/73u/lhRHPReK5iX+Z+JdJ4vlZ3XMPABvXXsvRPfdwzTXXPJirrrrqqquuuuqqq6666r8LwVVXXXXVVVdd9T/afffddysvAvFcJJ6beOEEiBdOgCT+RRJH99zDVVddddVVV1111VVXXfXfispVV1111VVXXfU/2n333Xcr/wLxwol/mfiXCUDihVnfey8AG9deC8CZM2cezFVXXXXVVVddddVVV13134XKVVddddVVV131P9rZs2efAbC49lqeH/F8SNxP/MvECyeeSeIFEc9ree+9XHXVVVddddVVV1111VX/rahcddVVV1111VX/o9133323Aiyuu44HEi+AxP3ECyf+ZeKZJF4QcdVVV1111VVXXXXVVVf9D0Xlqquuuuqqq676X0e8ABL3Ey+ceOHEv0w8r9W99wKwce21HN1zD9dcc82Dueqqq6666qqrrrrqqqv+u1C56qqrrrrqqqv+Rzt79uytAPNrrwVAvHDiXyZeOPFcJB5IvGgkcdVVV1111VVXXXXVVVf9tyK46qqrrrrqqqv+1xAvhIR44QSIF0yAeC4SDyT+Zat77wVgcd11AFxzzTUP5qqrrrrqqquuuuqqq67670Bw1VVXXXXVVVf9j3bffffdCrC47jpeIAnxwokXTjwfEvcTIF44AeJ5nTlz5sFcddVVV1111VVXXXXVVf8dCK666qqrrrrqqv/x7rvvvlsB5tdey/MjXjjxwonnQ+J+4oUTIJ5tdc89AIirrrrqqquuuuqqq6666r8ZwVVXXXXVVVdd9T/efffddyvA4rrreG6SeEEEiBdMgHg+JAAEiBdOvHBH99zDVVddddVVV1111VVXXfXfhuCqq6666qqrrvpfSYAkXhDxwokXQAJAvHACxPO3uvdeADauvRaAa6655sFcddVVV1111VVXXXXVVf8dqFx11VVXXXXVVf/jnT179laA+bXXAiBeOPHCiRdMvHDiXyaebXnvvVx11VVXXXXVVVddddVV/22oXHXVVVddddVV/+Pdd999twIsrrsO8UwSz494wcQLJ4kXRrxw4orVvfcCsHHttQCcOXPmQVx11VVXXXXVVVddddVV/x2oXHXVVVddddVV//tIPD/iBRMvnCReEPHCiRdsee+9XHXVVVddddVVV1111VX/bahcddVVV1111VX/4509e/ZWgMW11/L8iBdOvGACkHhBxAsnntfq3nsB2LjuOgCuueaaB3PVVVddddVVV1111VVX/XcguOqqq6666qqr/se77777bgWYX3cdSDyQeMEEiBdMABLPjwDxggkQz4fEAx3dcw9XXXXVVVddddVVV1111X8bgquuuuqqq6666n8t8YKJF068YOKFEy+AhID1vfcCsLj2WgRcc801D+aqq6666qqrrrrqqquu+u9A5aqrrrrqqquu+h/vvvvuuxVgcd113E+8YOIFEw8g8dzECyZeCAlx1VVXXXXVVVddddVVV/0PQ3DVVVddddVVV/2vI14w8YKJB5B4IAHiBRMvmADxbOt77wVg47rrWN57L1ddddVVV1111VVXXXXVfxuCq6666qqrrrrqf7yzZ88+A2B+7bWIF0y8YOIBJB5IvGACxPMnQAASL8jy3ns5c+bMg7nqqquuuuqqq6666qqr/jsQXHXVVVddddVV/yvcd999twLMr72W5yZAPH8CxPMnQLxg4gUTzyRx1VVXXXXVVVddddVVV/2PRXDVVVddddVVV/2vcPbs2VsB5tddxwOJF0w8HxIA4gUTIJ4/AeKZJJ6bgPW99wKwuPZaAK655poHc9VVV1111VVXXXXVVVf9dyC46qqrrrrqqqv+V1lcey33Ey+YeD4kAMQLJl4w8QASz008r9U993DVVVddddVVV1111VVX/bchuOqqq6666qqr/lf4rd/6re+57777bn3MJ3wCr/r9389jP+ETuO4N35DnRzx/AsTzJ0A8fwLEA0g8kADxnFb33APA4rrrALjmmmsezFVXXXXVVVddddVVV131X43KVVddddVVV131v8Jv/dZvffeZM2ce9E7v9E6fPb/2Wq57wzfkujd8Qx7ynu8JwN2/8itc+tu/Zfdv/obnRxIviHjBxHORuJ/4l63uvZerrrrqqquuuuqqq6666r8Nlauuuuqqq6666n+NH/3RH/2cH/3RH/2ca6655sGv/dqv/V4v/uIv/tov9mIv9toAD3nP9wRgde+97P7N37D7N3/D6t572f2bv0ESL4h4/sQLJ14wAet772V+3XUsrr0WgDNnzjz4vvvuu5Wrrrrqqquuuuqqq6666r8Slauuuuqqq6666n+d++6779Yf/dEf/Zwf/dEf/ZxrrrnmwS/2Yi/22i/2Yi/2Wtdcc82DX+zFXuy1r3vDN+S6N3xDAFb33svu3/wN9/7qr7L7t3/L/cQLJl4ACfGCiedvee+9XHXVVVddddVVV1111VX/LahcddVVV1111VX/q91333233nfffd/9W7/1W98NcM011zz4xV7sxV77xV7sxV7rdV7ndd57fu21XPeGb8h1b/iGrO69l9U993Dpb/+W3b/5Gy797d/y3MQLICFeMPGc1vfdB8DiuusAOHv27K1cddVVV1111VVXXXXVVf/VqFx11VVXXXXVVf+n3Hfffbfed9993/1bv/Vb3/2jP/qjn2Pbr/M6r/PeL/7iL/7aL/ZiL/ba82uv5fhLvRQPeo/3YHXvvVz6m79h92//lvt+9Vd5QSTxgoh/2eLaa7nqqquuuuqqq6666qqr/lugBz3oQVx11VVXXXXVVf91rrnmmgffd999t/Lf4Jprrnnwi73Yi732i73Yi73WNddc8+AXe7EXe20eYHXvvVz6m7/h3l/9VS797d8CIInnR7xgAm5+j/fg5nd/dy78zd9w8qVeird7u7cTV1111VVXXXXVVVddddV/NfSgBz2Iq6666qqrrrrqP88111zz4Nd+7dd+r2uuueYhr/M6r/Ne9913362/9Vu/9d0/+qM/+jn8N7vmmmse/GIv9mKv/Tqv8zrv9WIv9mKvzQOs7r2X9b33cu+v/irre+/l0t/+LfcTL5i44ub3eA9ufvd3Z3nvvexLt37Ih3zIQ7jqqquuuuqqq6666qqr/quhBz3oQVx11VVXXXXVVf+xrrnmmge/9mu/9nu9zuu8zntfc801D+b5+JAP+ZCH3HfffbfyP8SZM2cedM011zzkxV7sxV7rxV/8xV/7xV7sxV6bB1jdey97f/u3XPqbv+G+X/s1npt4Tje/x3tw87u/OwC/9Vu/9d1f//Vf/z5cddVVV1111VVXXXXVVf/VqFx11VVXXXXVVf9u11xzzYNf+7Vf+70A3umd3umzeYD9e+7h8b/4i9z5V3/FY970TXn0m7wJAGfOnHnwfffddyv/Q5w9e/YZZ8+efcY//MM//PaP/uiPfs4111zz4Bd7sRd7rRd7sRd77dd5ndd57/m11zJ/gzfgmjd4Ax7x8R/P+t57uffXfo29v/kb9v72b3lu63vu4X7/8A//8DtcddVVV1111VVXXXXVVf8dqFx11VVXXXXVVf8m11xzzYNf+7Vf+71e/MVf/HVe7MVe7LV4pv177uHxv/iLAPzZd30XD/T6n/Zp/G9x33333Xrffffd+lu/9Vvf8/Vf//Xvc8011zz4xV7sxV77dV7ndd7rxV7sxV57du213PLu7w7v/u6s772XS3/7t+z9zd+wuvde9v/2b1nfdx9XXXXVVVddddVVV1111X87KlddddVVV1111YvkmmuuefBrv/ZrvxfAO73TO302D7B/zz08/hd/kbv++q+586/+iudHwPZ11wGwuvdeXuzFXuy1/uEf/uG3+V/ivvvuu/W+++777t/6rd/67muuuebBZ86cefDrvM7rvNc111zz4Bd7sRd77Wve4A245g3eAID1vfeyvvde7vcP//APv81VV1111VVXXXXVVVdd9d+BylVXXXXVVVdd9QJdc801D37t137t93rxF3/x136xF3ux1+aZ9u+5h8f/4i8C8Gff9V28MOKKR7/JmwBw76/+KrNrr+V/s/vuu+/W++6779Z/+Id/+G2AM2fOPOjFX/zFX+fFXuzFXut1Xud13nt27bXMrr2W+9133323ctVVV1111VVXXXXVVVf9d0APetCDuOqqq6666qqrrrjmmmse/GIv9mKvfebMmQe90zu902fzAPv33MPjf/EXueuv/5o7/+qv+JeI5/RWX/u13PgyL8MTv/zLufYN3oC/unDhu7/+67/+ffg/6Jprrnnwa7/2a78XwI/+6I9+DlddddVVV1111VVXXXXVfxcqV1111VVXXfX/3DXXXPPg137t136vF3/xF3/tF3uxF3ttnmnvnnu466/+ir277+bPvuu7eFGJ5+/Gl3kZAC79zd9w/CVfkmtuvPHB/B9133333fqjP/qjn8NVV1111VVXXXXVVVdd9d+NylVXXXXVVVf9P3PNNdc8+MyZMw9+sRd7sdd6p3d6p8/mAfbuuYcn/OIvctdf/zV3/tVf8a8hntP2ddfx6Dd5E7avv55Hv8mbAHDvr/4q63vvZXXvvXDjjVx11VVXXXXVVVddddVVV/0no3LVVVddddVV/w9cc801D37t137t93rxF3/x136xF3ux1+aZ9u65h/277+bOv/or/vS7vgvxryeebfu663j0m7wJN77sy3LDS780z21+7bUArO+9lzNnzjyYq6666qqrrrrqqquuuuqq/1xUrrrqqquuuur/oGuuuebBZ86cefCLvdiLvdY7vdM7fTYPsHfPPTzhF3+RO//6r7nzr/4KAAHiX0fA9nXX8eg3eRMAXuF935cHWt1zD8t772X3b/6Gu3/lV3jVH/gBZtddB8D6nnu46qqrrrrqqquuuuqqq676L0Dlqquuuuqqq/4PebEXe7HXfqd3eqfPerEXe7HX5pn27rmH/bvv5s6/+iv+9Lu+iwcS/3o7113Ho9/kTbjhZV6GG1/mZXig1T33cNev/ioX//qvufS3f8v95tdey/3EFddcc82Dr7nmmgffd999t3LVVVddddVVV1111VVXXfWfg8pVV1111VVX/R/xYi/2Yq/9Tu/0Tp/1Yi/2Yq+9d/fdPOGXfok7/+qvuPOv/5rnJl5029ddx6Pf5E0Q8Arv+7480Oqee1jeey8X/+ZvePr3fi/3E89pde+9AMyvvRaA1b33AnDNNdc8+L777ruVq6666qqrrrrqqquuuuqq/xxUrrrqqquuuur/iHd6p3f6rBd7sRd77V//wi/kCb/0Szw/4kWzfd11PPpN3oQbX+ZluPFlXoYHWt5zD3f/6q+y+zd/w8W/+Ruem3heAlb33MP8uuuYXXst4qqrrrrqqquuuuqqq6666r8Elauuuuqqq676P+LFXuzFXhvgzr/6K56beOG2r7uOR7/JmwDwiu/7vjy3i3/zN1z8m7/hrl/5FVb33ot4/sQLtrr3XubXXcfi2mu59Ld/C8CZM2cezFVXXXXVVVddddVVV1111X8eKlddddVVV131f8DrvM7rvDfA43/pl9i/5x7uJ16w7euu49Fv8ibc+DIvw40v8zI80PKee7jrV36F3b/5Gy7+zd+AxL9EPH/i+Vvfey9nzpx5EFddddVVV1111VVXXXXVVf95qFx11VVXXXXV/wGv8zqv814Ad/7VXwEgntf2ddfx6Dd5EwBe8X3fl+d28W/+hgt//dfc/au/yvKeexDPn3he4vkTz7a65x54qZdidt116G//ltU993DVVVddddVVV1111VVXXfWfjMpVV1111VVX/S/3Yi/2Yq/9Yi/2Yq8N8MRf+iXEs21fdx2PfpM34caXeRlufJmX4YGW99zDXb/yK1z8m7/h4t/8DS+QxP3E8xLPn3hOy3vvBWB+7bXc75prrnkIV1111VVXXXXVVVddddVV/3moXHXVVVddddX/cq/zOq/zXgBP+KVfYvu663j0m7wJAK/4vu/Lc1vecw93/cqvcNev/irLe+5BPH/ieYkXnXhe4pkkAPb+9m+55mVf9sFcddVVV1111VVXXXXVVVf956Fy1VVXXXXVVf/LvdiLvdhrA9z4Mi/De/7Yj/FAy3vu4c5f+RUu/s3fcPFv/oYXhXhe4vkTz0s8LwG7f/M3AOy85Esirrrqqquuuuqqq6666qqr/ktQueqqq6666qr/xa655poHnz179tZrrrnmwdvXXQfA8p57uPNXfoW7fvVXWd5zD+L5E89LPBeJF0Q8L/G8xHMSV6zvvZdrrrnmwVx11VVXXXXVVVddddVVV/3noXLVVVddddVV/4udOXPmwS/2Yi/22st77uHvvvRLufg3f8OLQrzoxPMSz0u8cKt77wVgdu21AKzvuYczZ848iKuuuuqqq6666qqrrrrqqv88BFddddVVV131v9jZs2dv5Zku/s3f8NzEi048L/G8xPMSz594/iQhrrjmmmsezFVXXXXVVVddddVVV1111X8Ogquuuuqqq676X+y+++67FWBx3XW8qMTzEs9LEv8e4jmt7r0XgNm11wKwvvdeAM6cOfNgrrrqqquuuuqqq6666qqr/nMQXHXVVVddddX/cvfdd9+tAIvrruOBxPMSz0u86MTzEs9LPBcJAat77wVgdu21XHXVVVddddVVV1111VVX/RcguOqqq6666qr/5c6ePXsrwOK667ifeF7iRSeel3he4nmJ5yWuWN1zDwDza69luPdeAK655poHc9VVV1111VVXXXXVVVdd9Z+D4Kqrrrrqqqv+l7vvvvtuBVhcey3/WuJ5CUDigcTzEs9LPC9JPF8Se3/zN5w5c+ZBXHXVVVddddVVV1111VVX/eegctVVV1111VX/y9133323AsyvvRYA8bzE8xLPSzwv8bzE8xLPSzyn1b33AjC79lrEVVddddVVV1111VVXXXXVfzoqV1111VVXXfW/3NmzZ58BsLjuOsTzEv/5xPMSz2t9zz0AzK67DoDh3nu55pprHsxVV1111VVXXXXVVVddddV/DoKrrrrqqquu+l/uvvvuuxVgcd11vKjE8xLPSzwv8S8TzyRxPwGre+8FYHbttQCs772Xa6655sFcddVVV1111VVXXXXVVVf956By1VVXXXXVVf/LnT179laAxXXX8dzE8xLPSzyABIB4XuJ5iX+ZuGJ1770A9Ndei7jizJkzD+aqq6666qqrrrrqqquuuuo/B8FVV1111VVX/T8nnpd4XuJ5ieclnpN4XuKK4d57ueqqq6666qqrrrrqqquu+k9EcNVVV1111VX/y91333233nfffbcurr2WxXXXcT/xvMS/jXhe4nmJB5B4but77gGgv/ZaANb33ss111zzYK666qqrrrrqqquuuuqqq/5zEFx11VVXXXXV/wFnz569FWB+7bUAiOclnpd4XuJfJp6XeF7iOYlnEyCuuOaaax7MVVddddVVV1111VVXXXXVfzyCq6666qqrrvp/SjwvSTw38S8Tz0s8JwGre+8FYHbttfTXXsv63nsBOHPmzIO56qqrrrrqqquuuuqqq676j0dw1VVXXXXVVf8H/P3f//1vA5x8qZdCPC/xLxPPSzwv8ZzE85LEC7K6914AZtdey3jvvVx11VVXXXXVVVddddVVV/0nIrjqqquuuuqq/+PE8xL/MvG8xL9MPC/xbOt77gFAXDHcey/XXHPNg7nqqquuuuqqq6666qqrrvqPR3DVVVddddVV/wf8wz/8w+8AnHzpl+ZfIp6X+JeJ5yWek3he4jmt7r0XgP7aawFY33svZ86ceRBXXXXVVVddddVVV1111VX/8ahcddVVV1111f8h82uv5YHEv0w8k8T9xL9M/MvE81rfcw8As+uuQ1x11VVXXXXVVVddddVVV/2nIrjqqquuuuqq/wPOnj17K89FPC/xLxPPSzwn8bzEM0kAiOclntdw7728+Iu/+Gtz1VVXXXXVVVddddVVV131H4/gqquuuuqqq/4PuO+++24FWFx3HS+IeF7iXyaek3he4jmJ5yWuWN17LwD9tdcCMNx7L1ddddVVV1111VVXXXXVVf9JCK666qqrrrrq/4i///u//22AEy/1Uoh/mXhe4jmJf5l4TuJ5iWdb33svALNrr0VccebMmQdz1VVXXXXVVVddddVVV131H4/gqquuuuqqq/6PEc9L/AskxL9MPCfxXCSem3hO63vuAaC/9loAhnvu4aqrrrrqqquuuuqqq6666j8JwVVXXXXVVVf9H3H27NlbAa5/ozfixEu9FPcTz0s8J/G8xHMS/zLxnMS/bLz3Xq655poHc9VVV1111VVXXXXVVVdd9R+PylVXXXXVVVf9H/Fbv/Vb33PNNdc8+MXe6I1e+4Y3eiOW99zD7t/8DRf/5m+4+Dd/w+qeewAQ/zLxnMTzEs9J/MsErO+9F4D+2muRxHDvvQBcc801D77vvvtu5aqrrrrqqquuuuqqq6666j8Olauuuuqqq676P+If/uEffvu3fuu3Hnzffffd+jqv8zrvvbjuOhbXXcf1b/RGAKzuuYeLf/M37P7N33D3r/wK9xPPSfzLxHMSz0s8J/Fs63vvZXbttfTXXgs2AGfOnHnwfffddytXXXXVVVddddVVV1111VX/cdCDHvQgrrrqqquuuur/omuuuebBL/ZiL/ZaL/ZiL/bar/M6r/PePMDqnnsA2P2bv+HuX/kVdv/2b7mfeE7iOYnnJJ5J4n7iOYnn9OJf/uUce6mX4qmf+Ikc/M3f8FK/8it85md+5uv8wz/8w29z1VVXXXXVVVddddVVV131H4fKVVddddVVV/0fdd99991633333fpbv/Vb3/OjP/qjnwPw2q/92u/14i/+4q/9Yi/2Yq8NcN1113HdG70Rq3vvZXXPPez+zd+w+zd/w+7f/A0A4l9PPCfxnMTzuu+++27lqquuuuqqq6666qqrrrrqPx6Vq6666qqrrvp/4L777rsV4Ed/9Ec/50d/9Ec/55prrnnwmTNnHvxiL/Zir/XiL/7ir/1iL/Zirz2/9lqOv9RLAbC65x52//ZvufTXf83q3nvZ/Zu/AUA8J/GcxHMSz0lcsb73XgD6a6/l5Bu+Iddcc82Dz549eytXXXXVVVddddVVV1111VX/sdCDHvQgrrrqqquuuur/uzNnzjzoxV/8xV/nxV7sxV7rmmuuefCLvdiLvTYPsLrnHi79zd+w+zd/w72/+qsAiOciIZ6TeE7iipvf4z24+T3fk3u///vpr72Wv671u7/+67/+fbjqqquuuuqqq6666qqrrvqPReWqq6666qqrruLs2bPP+K3f+q3v/q3f+q3vBrjmmmse/GIv9mKv9WIv9mKv/Tqv8zrvPb/uOubXXce1b/RGPOoTP5HVPfdw6W/+hnt/9Ve59Dd/AxLiOYnnJJ6/zZd8SXjc47jqqquuuuqqq6666qqrrvpPgB70oAdx1VVXXXXVVVe9cNdcc82DX+zFXuy1X+d1Xue9XuzFXuy1eYDVvfeyvuceLv3N33Dpb/+WS3/zN4jnJJ7TsZd6KV7sy7+cw7/9WzZf8iX5+q//+vf5rd/6re/mqquuuuqqq6666qqrrrrqPxZ60IMexFVXXXXVVVdd9aK75pprHnzmzJkHv9iLvdhrvfiLv/hrv9iLvdhr8wDre+/l0t/8DZf+5m9Y33sve3/zNzyQgJ2Xeile7Mu/nPu93du9nbjqqquuuuqqq6666qqrrvqPhx70oAdx1VVXXXXVVVf92505c+ZBL/7iL/46L/ZiL/Za11xzzYNf7MVe7LV5gPW993Lpb/6Gvb/5G/b+5m9Y33svs2uv5WW///sB+K3f+q3v/vqv//r34aqrrrrqqquuuuqqq6666j8eetCDHsRVV1111VVXXfUf55prrnnwi73Yi73Wi73Yi73267zO67w3z2V9772s77mHnZd6KQC+/uu//n1+67d+67u56qqrrrrqqquuuuqqq676j4ce9KAHcdVVV1111VVX/ee55pprHvxiL/Zir/1iL/Zir/U6r/M6781z+ZAP+ZCH3Hfffbdy1VVXXXXVVVddddVVV131Hw896EEP4qqrrrrqqquu+q9xzTXXPBjgtV/7td/rxV/8xV/7677u69777Nmzz+Cqq6666qqrrrrqqquuuuo/B3rQgx7EVVddddVVV1111VVXXXXVVVddddVVV131fxKVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4p/BIIT3Xo7Sk2cAAAAAElFTkSuQmCC) + +```js +// Color the result of a 2D pattern that was extruded. +exampleSketch = startSketchOn('XZ') + |> startProfileAt([.5, 25], %) + |> line([0, 5], %) + |> line([-1, 0], %) + |> line([0, -5], %) + |> close(%) + |> patternCircular2d({ + center = [0, 0], + instances = 13, + arcDegrees = 360, + rotateDuplicates = true + }, %) + +example = extrude(1, exampleSketch) + |> appearance({ + color = '#ff0000', + metalness = 90, + roughness = 90 + }, %) +``` + +![Rendered example of appearance 7](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAACehklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquu+j/rmmuuefCHf/iHfxcvxI/8yI98zj/8wz/8NlddddVVV1111VVX/V9E5aqrrrrqqquuuuqq/5OuueaaB3/O53zOby0yH3znX/0Vz8+NL/MyvNM7vRM/8iM/wj/8wz/8NlddddVVV1111VVX/V9D5aqrrrrqqquuuuqq/5Ne7MVe7LWvueaaBwM8+k3ehBfkxa677rWvueaa7/mHf/gHrrrqqquuuuqqq676P4fKVVddddVVV1111VX/p63uuYf1PfeAxHObXXst8+uu46qrrrrqqquuuuqq/7OoXHXVVVddddVVV131f9qlv/kbnvwlXwISz+0Rn/iJzK+7jquuuuqqq6666qqr/s+ictVVV1111VVXXXXV/30SV1111VVXXXXVVVf9v0Tlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq676P+m+++67FWB+3XVcddVVV1111VVXXfX/FpWrrrrqqquuuuqqq/7fml93HQD33XffrVx11VVXXXXVVVdd9X8Rlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqhfimmuuefBrv/Zrv9c111zz4H/4h3/4nd/6rd/6bq666qr/Vq/zOq/z3gBnzpx50G//9m9/z3333XcrV1111VVXXXXVVc8flauuuuqqq6666qoX4B3f8R0/653e6Z0+m2d6ndd5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ddW/HsFVV1111VVXXXXVv8F9991364/8yI98DsCD3uu9eEHu+ZVfYfev/5qN667jQW/8xuiuux784R/+4d/FVVf9P/SO7/iOnzVr7cE711/PseuvZ+9v/oazv/IrvCAP/8RPBODrv/7r34errrrqqquuuuqqfxuCq6666qqrrrrqqn+jf/iHf/jtf/iHf/jt+XXX8ahP+iRekCd+6ZcCsHnddTzjl3+ZF3uxF3vta6655sFcddX/I9dcc82D3+md3umz//A7v5NXe9/3BeD27/keXpCHf+InAvAP//APv/0P//APv81VV1111VVXXXXVvw3BVVddddVVV1111b/D13/9178PwPGXeimOv9RL8fys7rmHe37lV9i47jrOvPRLo7vuevA7vuM7fhZXXfX/yId/+Id/1+1/9Ve8+Ju+KQBnf+VX2Pubv+H52Xmpl+LMG70RAD/yIz/yOVx11VVXXXXVVVf92xFcddVVV1111VVX/Tvcd999t/7Wb/3Wd8+vu44Hvdd78YI843u+B4AHvfEb84xf/mVe53Ve571f7MVe7LW56qr/B17sxV7stV/sxV7stW/7q7/i5pd5GQBu/97v5QW5+b3eC4Df+q3f+u5/+Id/+G2uuuqqq6666qqr/u0Irrrqqquuuuqqq/6dfvRHf/Rz7rvvvluPv/RLc/ylXornZ3XPPTzxS74EgMe+93vzuO/+bj78wz/8u7jqqv8H3umd3umz/v4Xf5FbXuZlALj9e76H9T338PyceaM3YuelXgqAr//6r38frrrqqquuuuqqq/59CK666qqrrrrqqqv+ne67775bf/RHf/RzAB71SZ/EC7L7N3/D6p572LjuOgC2Mh/8Oq/zOu/NVVf9H/Y6r/M67/1iL/Zir337X/0VN7/My7C+5x7u+N7v5QW5+T3fE4Cv//qvfx+uuuqqq6666qqr/v0Irrrqqquuuuqqq/4D/MM//MNv/8M//MNvz6+7jge913vx/KzuuYdnfM/3APDgN35jHvfd382LvdiLvRZXXfV/2Iu92Iu91i99wRfwqu/7vgA85Uu/lBfkpvd6L2bXXcc//MM//PZv/dZvfTdXXXXVVVddddVV/34EV1111VVXXXXVVf8B7rvvvlt/5Ed+5HMArnujN2J+3XU8P/f8yq+w+9d/zcZ11/HY935vXuzFXuy1ueqq/8Ne7MVe7LVf9X3fl2PXX8/e3/wNe3/zNzw/s+uu4+b3fE8AfuRHfuRzuOqqq6666qqrrvqPQXDVVVddddVVV131H+Qf/uEffvu3fuu3vnt+3XU86L3eixfkGd/zPQBsXHcd//AP//DbXHXV/2G/9Vu/9d3Hrr8egEt//dc8XxIP/8RPBOC3fuu3vvsf/uEffpurrrrqqquuuuqq/xiU48ePc9VVV1111VVXXfUf5dZbb/2bN3/zN//orYc/nEt//des7r2X+82vu44b3+7tePQnfRIAv/Vbv/XdX//1X/8+XHXV/2Fnz559xuHh4e6Lv/iLv/axl35p5tddx+FTn0o7OOAyiZ2Xeilufs/3BOBLv/RL3+bw8HCXq6666qqrrrrqqv8YlOPHj3PVVVddddVVV131H+Xw8HD37Nmzz3jFV3zFtz7+0i/NnT/xE8yvu44b3+7tePHP+zyOv/RLA/AjP/Ijn/1d3/VdH8NVV/0fd3h4uHv27NlnHB4e7r74i7/4a28+/OGcfLVXo2xvs773XtrhIQ//xE9kdt11/MiP/Mhn/+mf/unPcNVVV1111VVXXfUfBz3oQQ/iqquuuuqqq6666j/SNddc8+DP+ZzP+a1rrrnmwff8yq9w3Ru9Eff7kR/5kc/+7d/+7e+57777buWqq/6fueaaax782q/92u/1Tu/0Tp8NsL7nHtb33svOS70U9913360f8iEf8hCuuuqqq6666qqr/mNRjh8/zlVXXXXVVVddddV/pMPDw92jo6NLr/iKr/jWWw9/OAD/8A//8Nuf9Vmf9Tp/+qd/+jOHh4e7XHXV/0OHh4e7//AP//A7v/3bv/09m5ubxx/+Ei/x0rPrrgPgS77kS97m7Nmzt3LVVVddddVVV131Hws96EEP4qqrrrrqqquuuuo/wzXXXPPg137t136vf/iHf/idf/iHf/htrrrqqudwzTXXPPi1X/u13+u3f/u3v+e+++67lauuuuqqq6666qr/eOhBD3oQV1111VVXXXXVVVddddVVV1111VVXXXXV/0lUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8VwVVXXXXVVVf9H3XNNdc8mKuuuuqqq6666qqrrrrqqv/fKMePH+eqq6666qqr/i+55pprHvzlX/7lf/U6r/M67725uXn87Nmzzzg8PNzlqquuuuqqq57LNddc8+A3e7M3+6gP//AP/+6HPOQhL314eHjp7Nmzt3LVVVddddVV/3egBz3oQVx11VVXXXXV/yWf+7mf+1sv9mIv9tp3/tVfsX3ddaxKufW3fuu3vvtHf/RHP4errrrqqquueqbXeZ3Xee8P//AP/679e+7hzr/6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+JzPYXbddQD8yI/8yGd/6Zd+6dscHh7uctVVV1111VX/e6EHPehBXHXVVVddddX/Bddcc82DX/u1X/u93umd3umzAVb33MPjvuRLuPjXf80LM7/uOq5/ozfioe/93gDs3XMPT/jFX+RPv/M72b7uOh7zpm/KK77v+/Jbv/Vb3/2jP/qjn3PffffdylVXXXXVVf9trrnmmgd/+Id/+He92Iu92Gs/4Zd+id/8wi8E4BXe5314hfd9XwDW997L2V/5Fe78vu/jgcTzml17LQ/5hE9g56VeCoB/+Id/+O3P/MzPfB2uuuqqq6666v8G9KAHPYirrrrqqquu+r/kxV7sxV77wz/8w7/rmmuuefDqnnu465d/mad/z/fwL5lfdx3Xv9Eb8dD3fm8A9u65h5/6iI9g/+672b7uOt7m676OVSm3/tZv/dZ3/+iP/ujncNVVV1111X+5d3zHd/ysd3qnd/rs/Xvu4Te+8Au566/+iu3rruN1P/VTufFlXgaAvb/5Gx7/8R/PcxPP68b3eA9ufM/3BOC+++679eu//uvf5x/+4R9+m6uuuuqqq676vwM96EEP4qqrrrrqqqv+r7nmmmse/Nqv/drv9U7v9E6fDbC65x7u+uVf5unf8z38S0689Evz2E/6JObXXcfePffwhF/8Rf70O7+T7euu4zFv+qa84vu+L/fdd9+tn/VZn/U69913361cddVVV131n+6aa6558Id/+Id/14u92Iu99p9+53fy59/1XQC8wvu8D6/wvu8LwPree3nal30Ze3/zNzw38Zy2X+qleMyXfzn3+5Ef+ZHP/tEf/dHP4aqrrrrqqqv+70EPetCDuOqqq6666qr/q6655poHf/iHf/h3vdiLvdhrA9z9y7/M077ne1jdcw8vzPy667j+jd6Ih773ewOwd889POEXf5E//c7vZPu663j9T/s0uhtvvPW3fuu3vvtHf/RHP4errrrqqqv+07zjO77jZ73TO73TZ+/fcw8//REfwf4993DDy7wMr/epn8r2ddcBcMf3fi93ft/38dzEc5pdey0P+YRPYOelXgqA++6779av//qvf59/+Id/+G2uuuqqq6666v8m9KAHPYirrrrqqquu+r/smmuuefBrv/Zrv9c7vdM7fTbA6p57uOuXf5mnf8/38C+ZX389j/3ET+TES780AI//pV/iT7/jO9i/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5ubxs7/6qzz+4z+e9b338sLMrr2WR37O53DTe74nAPfdd9+tH//xH/8yf/qnf/ozXHXVVVddddVVzw/l+PHjXHXVVVddddVVz9/h4eHub/3Wb30PwIu/+Iu/9uK66zjzaq9G3dpi92/+hhdkOjjgkR/2YdStLX7kR37ks//0T//0Z7jqqquuuuo5HB4e7h4dHV16xVd8xbeuW1vc85M/yQtz43u8B4/8nM9hdt113Hfffbf+/M///Fd/6Zd+6dscHh7uctVVV1111VVXvSCU48ePc9VVV1111VVXvXD/8A//8Du//du//T2Hh4e7L/3Kr/zaJ176pbn+jd6I/ac8hdW99/LcHvJe78WZV391/uEf/uG3v/7rv/59uOqqq6666vk6OjrafchDHvLS1z/kIQ+eXXcdF//wD3lus2uv5ZGf8zmceaM3AuAf/uEffvvjP/7jX+Yf/uEffoerrrrqqquuuupfQjl+/DhXXXXVVVddddW/7PDwcPcf/uEffucf/uEffufFXuzFXvvYtdceP/HSL03d2mL3b/6G+x1/qZfisZ/0SQB8/dd//fucPXv2Vq666qqrrnq+Dg8Pd//hH/7hd978zd/8o+vWFkdPfSrre+8FYHbttVz3tm/LIz/nc5hddx333XffrV/yJV/yNj/6oz/6OVx11VVXXXXVVS8qyvHjx7nqqquuuuqqq150Z8+evfXP/uzPfubw8HD3pV/5lV/7xEu/NNe/0RtRt7bY/Zu/4TGf9EksrruO3/qt3/ruX/iFX/garrrqqquueqEODw93AV7qlV7ptXde6qW45yd/kp2Xeile4pu/mZ2XeikAfuRHfuSzv/RLv/Rtzp49eytXXXXVVVddddW/BnrQgx7EVVddddVVV131b3PNNdc8+MM//MO/68Ve7MVeG2B1zz3Mr7uO++6779YP+ZAPeQhXXXXVVVe9SK655poHf87nfM5vXXPNNQ9e33svs2uvBeC+++679bM+67Ne57777ruVq6666qqrrrrq34Jy/Phxrrrqqquuuuqqf5vDw8Pd3/qt3/oegBd/8Rd/7bq1BcCXfMmXvM3Zs2dv5aqrrrrqqhfJ4eHh7q233vo3r/M6r/PedWuL++6779af//mf/+ov/dIvfZvDw8Ndrrrqqquuuuqqfyv0oAc9iKuuuuqqq6666t/vmmuuefCZM2ce/A//8A+/zVVXXXXVVf8m11xzzYPPnDnz4H/4h3/4ba666qqrrrrqqv8I6EEPehBXXXXVVVddddVVV1111VVXXXXVVVddddX/SVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rCK666qqrrrrqqquuuuqqq676b3PNNdc8mKuuuuqqq676z0Plqquuuuqqq/4TXHPNNQ9+x3d8x896ndd5nfe+7777bgU4e/bsrffdd9+t9913361nz559xn333XcrwD/8wz/8NlddddVVV131f9A111zzYIAzZ848+JprrnnwmTNnHgTw4i/+4q8N6MVe7MVeC+Drv/7r3+e+++679R/+4R9+m6uuuuqqq676j4Ue9KAHcdVVV1111VX/0T73cz/3t17sxV7ste/6q7/izr/6K3auv57t664D4IaXeRme23333XcrwNmzZ2+97777br3vvvtuPXv27DPuu+++WwH+4R/+4be56qqrrrrqqv9BrrnmmgcDnDlz5sHXXHPNg8+cOfOga6655sHXXHPNQwC/2Iu92GvzXPbvuQeAvbvvZv+ee9i/+25ueJmX4caXeRn+4R/+4bc/8zM/83W46qqrrrrqqv9Y6EEPehBXXXXVVVdd9R/pdV7ndd77wz/8w78L4Jte4zV4fravuw6A7euvZ/u669i+7jp2rr+e7euuA+CGl3kZntt99913K8DZs2dvve+++2697777bj179uwz7rvvvlsB/uEf/uG3ueqqq6666qr/ANdcc82DAc6cOfPga6655sFnzpx50DXXXPOQa6655kFnzpx58DXXXPNgnsv+PfcAsHf33ezfcw/7d9/N/j33sHfPPezffTf799zD87N93XW89dd9HdvXXcfXf/3Xv89v/dZvfTdXXXXVVVdd9R+HylVXXXXVVVf9B3uxF3ux1wLYv+ce3v3Hfoy7/uqvALjzr/4KgP177mH/7rvZv+ce9u+5hxdk+7rrANi+/nq2r7uO7euue/DO9ddz4rrrHnzi+HFe53Veh+d233333Qpw9uzZW++7775b77vvvlvPnj37jPvuu+9WgH/4h3/4ba666qqrrvp/7ZprrnkwwJkzZx58zTXXPPjMmTMPuuaaax58zTXXPPjMmTMPvuaaax7Mc9m/5x4A9u++m4t/8Rc84+672b/nHvbvvpv9e+5h/557+JfsXHcd29dfz/Z117F93XUA3PgyLwPA9nXXAfA6r/M67/1bv/Vb381VV1111VVX/cdBD3rQg7jqqquuuuqq/yjXXHPNg7/pm77p6byI9u+5B4D9u+9m/5572Lv7bvbvuYf9e+5h/+672b/nHl6Y7euuA2D7+uvZvu46AG58mZdh+7rrALjhZV6G53bffffdevbs2Vs/8zM/83W46qqrrrrq/40P//AP/67XeZ3XeW+ey/499wCwf/fd3PlXfwXA/j33sH/PPezffTf799zDv2T7uuvYvv56tq+7ju3rrgPgxpd5GQBueJmX4V/jQz7kQx5y33333cpVV1111VVX/cegctVVV1111VX/CZb33MOff8zHML/uOhbXXQfAyZd6KQDm113H4rrrWFx3HdvXXQfA9nXX8YLs33MPAPt3383+Pfewd/fd7N9zD/v33APAXX/1V+zfcw/3e+Iv/RIPtH3ddQBsX38929ddx6Pf5E0efObGG3nHd3zHz/rRH/3Rz+Gqq6666qr/897xHd/xs17ndV7nvffvuYc/+87vZP+ee9i/+27277mHF2b7uuvYvu46tq+/nu3rrmP7uusAuPFlXgaAG17mZXhRDffey/reexnuvZf1vfcCMNxzD8O997L/t3/LS3zv99Jfey1XXXXVVVdd9R+MylVXXXXVVVf9J1necw/Le+7hIlfc9cu/zP3EFYvrrgPgxEu/NAAnXuqlAFhcdx3z665jcd11bF93HQDb113HC7J/zz0A7N99N/v33MPe3Xezf8897N9zDwB3/dVfsX/PPWxfdx2v+6mfCvDga6655sFcddVVV131/8I111zzYJ5p/557uOuv/ort665j+7rr2L7+eravu47t664D4MaXeRmQuOGlX5oX1XDvvazvvZfh3ntZ33svAAd/8zcA7P/t33LVVVddddVV/42oXHXVVVddddV/o+U99wCw/OVfBuCuX/5lntviuusAOPHSLw3A/NprWVx3HYvrrmN+3XUsrruO7euuA2D7uut4QfbvuYft667jqquuuuqq/7+2r7uO1/3UT2X7uut4UQ333sv63nsZ7r2X9b33AnDwN38DwP7f/i3/EcRVV1111VVX/aehctVVV1111VX/wy3vuQeA5S//Mi/I4rrrAFhcdx3z665jce21zK+7jsV11zG/7joW113H9nXXcb+9v/kbrrrqqquu+v/lyX/5lzziZV+W7euu437re+9luPdehnvvZX3vvQAc/M3fgM3+3/0d/9nEVVddddVVV/2no3LVVVddddVV/w0MiP84y3vuQcDqnnt4QebXXcfLfdVXsbjuOgDuu+++W7nqqquuuur/hfvuu+/Wm44d435//kZvxP3Efw9x1VVXXXXVVf8lqFx11VVXXXXVf5LX+KEf4uJf/zUAF/7mbwBY3nMPq3vuYXnPPfxXW91zD4vrruOqq6666qr/39b33sv9xH+t/tprmV17LbNrr6W/7joAtl7yJQHor72Wq6666qqrrvpPQOWqq6666qqr/gPdd999t37mZ37m63zu537ubwEs3viNAbjhjd+Y57a85x4AVvfcw/Kee1jecw+re+9lec89rO65h+U99/CfZbjnHq666qqrrvr/5fzdd/MIYHbttQCI/1j9tdcyu/Za+muvpb/uOgC2X/IlAdh+yZfkRfFZn/VZr3PffffdylVXXXXVVVf9x6Fy1VVXXXXVVf/B/uEf/uG3P+RDPuQhZ86cefA111zzYIAXe7EXey2Aa6655sFnzpx58DXXXPPgxXXXAbC47jpO8Pwt77kHgNU997C85x6W99zD6t57Wd5zDwAX//qv+bfYfqmX4h++8Rt/h6uuuuqqq/5f+O3f/u3v+agP/uD3Bh4MIF50/bXXAjC79lr6a6+lv+46ALZf8iUB2H7Jl+RFdd9999169uzZW++7775b77vvvlsBzp49+4z77rvv1n/4h3/4ba666qqrrrrqPx6Vq6666qqrrvpPcN99991633333foP//APAPzWb/3Wd/NcrrnmmgcDvNiLvdhrA7zYi73YawFcc801Dz5z5syDr7nmmgcvrrsOgMV113GC5295zz0ArO65h+U997C65x6W997L6p57ALj413/Nc5tddx3/8A//8NtcddVVV131/8bJ66/nufXXXgvA7Npr6a+9lv6665hdey39tdcCsP2SL8mL6r777rv17Nmzt95333233nfffbcC/MM//MPvAPzDP/zDb3PVVVddddVV/z3Qgx70IK666qqrrrrqf6prrrnmwQBnzpx58DXXXPPgM2fOPOiaa6558DXXXPPgM2fOPPiaa655MC+C5T33ALC47joAvv7rv/59fuu3fuu7ueqqq6666v+N13md13nvD//wD/8ugOHee+mvvZYX1X333Xfr2bNnb73vvvtuve+++24F+Id/+IffAfwP//APv8NVV1111VVX/c+FHvSgB3HVVVddddVV/5tdc801DwY4c+bMg6+55poHnzlz5kHXXHPNg6+55poHA7zYi73Ya/MAP/IjP/LZP/qjP/o5XHXVVVdd9f/KNddc8+DXfu3Xfq/XeZ3Xee9rrrnmwQD33XffrQBnz5699b777rv1vvvuuxXgH/7hH34b0D/8wz/8NlddddVVV131vxt60IMexFVXXXXVVVf9X3fNNdc8mGe67777buWqq6666qr/t17sxV7stQH+4R/+4be56qqrrrrqqv/70IMe9CCuuuqqq6666qqrrrrqqquuuuqqq6666qr/k6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fRTl+/DhXXXXVVVddddWL7pprrnnwm73Zm33UNddc85Cjo6Pdw8PDXa666qqrrvpPc8011zz4zd7szT7qxV7sxV777Nmzzzg8PNzlqquuuuqqq656UaEHPehBXHXVVVddddVVL9w111zz4Nd+7dd+rxd/8Rd/7Rd7sRd7bYD77rvvVoDP+qzPep377rvvVq666qqrrvpP8RM/8RPmAc6ePfuMH/mRH/ns3/qt3/purrrqqquuuuqqfwnl+PHjXHXVVVddddVVz+uaa6558Ju92Zt91Du90zt99vu8z/t89Yu/+Iu/9ry1B//1j/0YO9ddx8nrrju+ubl5fHNz8/if/umf/gxXXXXVVVf9h/vwD//w73rIQx7y0jzTr33BF3Di2muPv/5bvdVbv87rvM57v9IrvdJbA7r11lv/mquuuuqqq6666vlBD3rQg7jqqquuuuqqq57tHd/xHT/rmmuuefDrvM7rvDfA3t138/hf+iX+9Du/E4AbX+ZleNuv+zoAHvclX8Lp93mfW7/+67/+ff7hH/7ht7nqqquuuuo/zDXXXPPgb/qmb3r673/Hd/Dq7/d+APzER3wEd/zVX7Fz3XXc9DIvw2Pe9E256WVehrNnzz7j7//+73/rH/7hH37nt37rt76bq6666qqrrrrqfpTjx49z1VVXXXXVVf/fvdiLvdhrv87rvM57fe7nfu5vv/iLv/hrn5rPX/qvf+zH+KmP+Aj+5sd+jDv/6q+48WVehse86ZvyBp/2aQDc/Su/wt2/8itc95IveXxx3XX86Z/+6c9w1VVXXXXVf5j3eZ/3+aqT8/lL/+SnfAoAt7zsy3LTy7wM1zzykQA87pd+icf/0i/x+F/8RYp9/CEPechLv/5bvdVbv87rvM57P+QhD3npzc3NE7feeutfc9VVV1111VX/v6EHPehBXHXVVVddddX/R9dcc82DX/u1X/u93umd3umzAfbuvpvH/9Iv8YRf/EX27rkHgJ3rruPRb/qmvNL7vi/PbXXPPfzBu74r17/RG3H6fd7n1q//+q9/n3/4h3/4ba666qqrrvp3e7EXe7HX/tzP/dzf+oUv+AL+7hd/kQ/58R/n2PXX80B7d9/NHX/1Vzz+l36JO/7qrwDYue46HvOmb8pNL/My3PQyL8N999136z/8wz/89m/91m99zz/8wz/8NlddddVVV131/w960IMexFVXXXXVVVf9f3HNNdc8+LVf+7Xf653e6Z0+G2Dv7rt5/C/9Ek/4xV9k7557ANi57joe/aZvyiu97/vyQMt77uHuX/kVnvY938PLfeVXcuKlX5qnf8/3cPev/AqP+cRP5K8vXvzur//6r38frrrqqquu+nf78A//8O962PHj7/2DH/7hvMSbvilv9mmfxsHf/i3P+Iqv4OQbvAHbL/mSbL3kS3K/vXvu4Y6//Ese/0u/xB1/9VcA7Fx3HY950zflppd5GW56mZfhvvvuu/Uf/uEffue3fuu3vvsf/uEffpurrrrqqquu+v+BylVXXXXVVVf9H3fNNdc8+LVf+7Xf653e6Z0+G2Dv7rv5k+/8Tu78q7/izr/6KwB2rruOV3zf9+WV3vd9eaDlPfdw96/8Cnf9yq+wuuce7ve07/keXu6lX5rr3+iNePr3fA+re+/lvt3dW7nqqquuuuo/zKW77wbgzT7t0wC4+/u/n+Hee7nn+7+fe4D+2ms5+QZvwPZLviQ7L/mSPPZN35THvumbsnf33dzxV3/F43/pl/iT7/xO/gTYue46HvOmb/rgl3uTN3nw67zO67zXfffdd+tv/dZvffc//MM//M4//MM//DZXXXXVVVdd9X8Xlauuuuqqq676P+iaa6558Gu/9mu/1+u8zuu89zXXXPPgvbvv5k++8zu586/+ijv/6q8A2LnuOl7xfd+Xx7zJm7Bz/fXcb3nPPdz9K7/CXb/yK6zuuYfn5+Lf/A0X//qvOfHSL81jPumTuP6N3ohrfuu3HsxVV1111VX/Ie67775bX/Y1X5NXf9/3BeDgb/+Wg7/9Wx5ouPde7vn+7+ceoL/2Wk6+wRtw6g3egJ3rr+ex11/PY9/0Tdm7+24e90u/xJ1/9Vf8yXd+J3/ynd/JznXX8Urv+74Pfqd3eqfPBjh79uwzfvM3f/O7/uEf/uF3/uEf/uG3ueqqq6666qr/W9CDHvQgrrrqqquuuur/gmuuuebBr/3ar/1er/M6r/Pe11xzzYP37r6bx//SL3HnX/0Vd/7VXwGwc911PPpN35THvMmbsHP99dxvec893P0rv8LFv/5rLv7N3/CimF93Ha/+gz/I/T7kQz7kIffdd9+tXHXVVVdd9e92zTXXPPibvumbns4zPfkTP5GDv/1bXhT9tddy8g3egFNv8Ab0117L/fbuvpvH/9Ivccdf/RV3/NVfsXPddexcfz2PeZM34bFv+qYA3Hfffbf+1m/91nf/9m//9vfcd999t3LVVVddddVV//uhBz3oQVx11VVXXXXV/1bXXHPNg1/7tV/7vV78xV/8tV/sxV7stQH+5Du/k7277+YJv/RLAOxcdx2PftM35TFv8ibsXH8991vecw93/cqvcPGv/5qLf/M3iBfd/LrruOGN3oiHvtd7cd9999169uzZWz/zMz/zdbjqqquuuuo/zOd+7uf+1ou92Iu99nDvvZz/tV/j4G//loO//VteZBL9tddy/bu9Gyff4A14oL277+Zxv/RLPP4Xf5G9e+5h57rruOllXoYbX+ZleOybvikA9913362/9Vu/9d2//du//T333XffrVx11VVXXXXV/07oQQ96EFddddVVV131v83rvM7rvPfrvM7rvNeLvdiLvTbAHX/1V9z5V3/Fn3zndwJw7LrrePSbvik3vczLcOPLvAz3W95zD3f9yq9w8a//mot/8zc8kHjh5tddxw1v9EaceKmX4sRLvzT3+4d/+Iff/szP/MzX4aqrrrrqqv9w3/RN3/T0a6655sE803DvvVz4tV/j/K/9GsO99/ICSdxPQH/ttfTXXsvJ1399Tr7BG/BAe/fcw+N+8Rf5k+/8TgB2rruOG1/mZbjpZV6Gx77pmwLwD//wD7/9W7/1W9/zW7/1W9/NVVddddVVV/3vgh70oAdx1VVXXXXVVf+bvOM7vuNnvfiLv/hr33zy5Gs//pd+iT/5zu8EYOe663jMm74pN73My3Djy7wMD/TU7/keVvfcw12/8iu8IOJ5za+7jhve6I048VIvxYmXfmnud9999936W7/1W9999uzZZ/zWb/3Wd3PVVVddddV/ijNnzjzoxV/8xV/nxV7sxV7rdV7ndd6bBxjuvZfzv/Zr3PP9389zkLifeF79tdey9ZIvydZLvAQn3+ANuN/e3Xezd889PP4Xf5HH/dIvAbB93XXc9DIvw2Pf9E2Z3XTTM37zN3/zu370R3/0c7jqqquuuuqq/z3Qgx70IK666qqrrrrqf5Of+Imf8ON/8Rf5tS/8Qnauu47HvOmbsnPddTzmTd+UB7r413/Nhb/+a572Pd8DEv8SccX8uuu44Y3eiBMv9VKceOmX5oH+4R/+4bd/67d+63t+67d+67u56qqrrrrqv9Q111zz4Bd7sRd77Rd7sRd7rdd5ndd5b55puPdehvvu4/yv/ioXfv3XuZ/4l/XXXsvWS7wEWy/5kpx8gzfgfnv33MMdf/mX3PlXf8XjfumXMPD2X/d19DfeeOuHfMiHPISrrrrqqquu+t8DPehBD+Kqq6666qqr/rd4ndd5nff+8A//8O/6k+/8TgBe6X3flwda3nMPd/3yL/O07/kenoPEC7O47jpueKM3Yn7dddzwRm/EA/3DP/zDb//93//9b//oj/7o53DVVVddddX/CNdcc82DX+zFXuy1X+zFXuy1Xud1Xue9eabh3ns5+Nu/5eDv/o4Lv/Zr/Gv0117L1ku+JCdf//XZesmX5H57d9/NHX/1VwA89k3flK//+q9/n9/6rd/6bq666qqrrrrqfwf0oAc9iKuuuuqqq6763+Kbvumbnn7NNdc8mAdY3nMPd/3yL/O07/keXiCJ5+fES70UN7zxG3PDG70RD3Tffffd+lu/9Vvf/aM/+qOfw1VXXXXVVf+jXXPNNQ9+sRd7sdd6ndd5nfd+sRd7sdfmmYZ77+Xgb/+Wg7/7Oy782q/xr9Ffey1bL/mSnHz912frJV+SB7rvvvtu/ZAP+ZCHcNVVV1111VX/O6AHPehBXHXVVVddddX/Fh/+4R/+Xa/zOq/z3st77uGuX/5lnvo934P4F0g80ImXeilOvPRL87D3ei8e6L777rv1t37rt777R3/0Rz+Hq6666qqr/le65pprHvxiL/Zir/06r/M67/ViL/Zir80zDffey8Hf/i0Hf/d3XPi1X+NFJaC/9lq2XvIlufbd3o3+2mv5rd/6re/++q//+vfhqquuuuqqq/53oHLVVVddddVV/wst77mHp37P9wBgQLxwi+uu4/o3eiMe9l7vxQPdd999t/7Wb/3Wd//oj/7o53DVVVddddX/evfdd9+t991333f/1m/91nefOXPmQS/+4i/+Oq/zOq/zXi/2Yi/22iff4A04+QZvwHXv9m4c/O3fcuHXf52Dv/1bXhBxxXDvvVz4tV/jxOu/Pv2113LVVVddddVV/8ugBz3oQVx11VVXXXXV/xbXXHPNg7/pm77p6QB/9jEfw8W//msAxPNaXHcd17/RG/Gw935vHui+++679bd+67e++7d/+7e/57777ruVq6666qqr/s+75pprHvzar/3a7/XiL/7ir/1iL/Zir80zDffey8Hf/R0Xfu3XOPjbv+V+4jltveRL8rAv+RIAPuRDPuQh9913361cddVVV1111f8O6EEPehBXXXXVVVdd9b/J67zO67z3h3/4h3/X8p57+L13eRcAxBWL667j+jd6Ix723u/NA9133323/tZv/dZ3//Zv//b33Hfffbdy1VVXXXXV/1vXXHPNg1/7tV/7vV78xV/8tV/sxV7stXmm4d57Ofjbv+XCr/86h3/7tzzQw77kS9h6yZfkR37kRz77R3/0Rz+Hq6666qqrrvrfAz3oQQ/iqquuuuqqq/43ueaaax78OZ/zOb91zTXXPPjvv+RLuPjXf80Nb/RG3PDGb8ziuuu433333Xfrb/3Wb333b//2b3/PfffddytXXXXVVVdd9VyuueaaB7/2a7/2e73O67zOe19zzTUP5pmGe+/lwq/9God/93f0117LzR/7sQC83du9nbjqqquuuuqq/13Qgx70IK666qqrrrrqf5vXeZ3Xee8P//AP/y6ey3333Xfrb/3Wb333P/zDP/zOP/zDP/w2V1111VVXXfUiuuaaax782q/92u/1Oq/zOu99zTXXPJjn8vVf//Xv81u/9VvfzVVXXXXVVVf974Ie9KAHcdVVV1111VX/21xzzTUPfu3Xfu33evEXf/HXPnPmzIN/67d+67v/4R/+4Xf+4R/+4be56qqrrrrqqn+nM2fOPOid3umdPvt1Xud13vsf/uEffvvv//7vf/tHf/RHP4errrrqqquu+t8HPehBD+Kqq6666qqr/re65pprHnzffffdylVXXXXVVVf9J7jmmmseDHDffffdylVXXXXVVVf974Qe9KAHcdVVV1111VVXXXXVVVddddVVV1111VVX/Z9E5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1GOHz/OVVddddVVV1111TXXXPPgN3uzN/uo13md13nvW2+99W8ODw93ueqqq/5Xueaaax78Zm/2Zh91zTXXPOTo6Gj38PBwl6uuuuqqq6666v879KAHPYirrrrqqquuuur/t2uuuebB3/RN3/R0num+++679bd+67e++0d/9Ec/h6uuuup/hXd8x3f8rHd6p3f6bJ7p7Nmzz/jMz/zM177vvvtu5aqrrrrqqquu+v+Mcvz4ca666qqrrrrqqv+/rrnmmgd/+Id/+Hddc801Dwa466/+itzfP/4qr//6r/3iL/7ir/0P//APv3N4eLjLVVdd9T/SNddc8+BP+qRP+qnXeZ3Xee87/uqveNwv/RI3vczLsLm5efwVX/EV3/rP/uzPfubw8HCXq6666qqrrrrq/yvK8ePHueqqq6666qqr/n+65pprHvzhH/7h37U9DK9921/9Fdc+4hH8xXd9F3//Yz/GcHDAS73RGz34FV/xFd96c3Pz+D/8wz/8DlddddX/KC/2Yi/22l/xFV/xV9dcc82D//g7v5Nf+8IvRMBj3/RN2b/nHlZ333389d7yLd/6z/7sz37m8PBwl6uuuuqqq6666v8jgquuuuqqq6666v+la6655sEf/uEf/l3bw/Dav/gFX8BLvOmbArB93XXs33MPf/Fd38UPvcM7sMh88Ou8zuu8N1ddddX/OO/0Tu/0WXt3381PfMRH8Cff+Z0A7Fx3Hff7i+/6Lqa77nrw53zO5/zWNddc82Cuuuqqq6666qr/jyjHjx/nqquuuuqqq676/+Waa6558Id/+Id/100nT772T33Kp/AuX/d1zLe3AbjhZV4GgLv/+q8ZDg44/YhHML/hht2jo6NLt956619z1VVX/Y/wOq/zOu/95m/+5h999ilP4U++8zsBeKX3fV9e66M+CoDZ1hY3vMzL8Edf93U84tVf/firv+7rvvWf/dmf/czh4eEuV1111VVXXXXV/ycEV1111VVXXXXV/zsf/uEf/l03nTz52j/0ER/Bm37ap3Hs+uvZ/Zu/4enf8z0AvNz7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b/3WAPzDP/zDb3/8x3/8y5w9e/ZWrrrqqquuuuqq/03Qgx70IK666qqrrrrqqv+d3vEd3/Gz3umd3umzeYD77rvv1g/5kA95CFddddVV/0rXXHPNgz/ncz7nt6655poH8wA/8iM/8tk/+qM/+jlcddVVV1111VX/G6EHPehBXHXVVVddddVV/3tdc801D/7wD//w77rvvvtufbEXe7HX/pAP+ZCHcNVVV131b3TNNdc8+HM+53N+6x/+4R9++5prrnnw13/917/PfffddytXXXXVVVddddX/VuhBD3oQV1111VVXXXXV/27XXHPNg++7775bueqqq676D3LNNdc8+L777ruVq6666qqrrrrqfzv0oAc9iKuuuuqqq6666qqrrrrqqquuuuqqq6666v8kyvHjx7nqqquuuuqqq6666t/mwz/8w79rc3PzxObm5vGzZ8/eylX/Ya655poHv+IrvuJbv+IrvuJbATp79uytXHXVVVddddVVV131r4Ue9KAHcdVVV1111VVXXXXVv86LvdiLvfaHf/iHf9c111zzYJ7pvvvuu/Xs2bO33nfffbf+wz/8w+/81m/91ndz1YvsmmuuefBrv/Zrv9eLv/iLv/aLvdiLvTYP8A//8A+//SM/8iOf8w//8A+/zVVXXXXVVVddddVV/xqU48ePc9VVV1111VVXXXXVv847vdM7fdaLv/iLv/adf/VX/Ol3fRfrgwM6+/jDXvIlH/yQhzzkpTc3N4//wz/8w+8cHh7uctW/6JprrnnwO77jO37Wm7/5m3/0IvPBw8EBf/OjP8qdf/VX7N9zD4991Vd98DXXXPPg3/qt3/oerrrqqquuuuqqq67616By1VVXXXXVVVddddW/2ou92Iu9NsCdf/VXPOGXfokn/NIvcb9XfJ/34RXf931f+7Vf+7Xf60d/9Ec/h6v+Ra/92q/9Xq/zOq/z3k/4pV/iN77wC3mgV3if9wHgzJkzD+aqq6666qqrrrrqqn8tgquuuuqqq6666qqr/lVe7MVe7LWuueaaBwNsX389N77My/BA29dfD8DZs2efwVUvkrNnz97K87F93XXc+DIvA8A111zz4Bd/8Rd/ba666qqrrrrqqquu+tegctVVV1111VVXXXXVv8o111zzYJ7pMW/yJjzmTd6E/XvuYe/uu9m75x52rruOq/5ttq+7jld4n/fhxpd5GW58mZfhuT32sY99rb//+7//ba666qqrrrrqqquuelFRueqqq6666qqrrrrqX+XFXuzFXptnuvdXfoX5dddx7KVeiu3rruNGnu3s2bO3ctWL5L777rsV4MaXeRlufJmX4X7re+9l/2/+htNv+IYAvPiLv/jr/OiP/ujncNVVV1111VVXXXXVi4rKVVddddVVV1111VX/Kq/zOq/z3jzTk7/sywCYXXst8+uuY3bttTzyEz8RgPvuu+9WrnqR3HfffbfyTHd+3/ex9zd/w/7f/i3366+9lp2XeimuueaaB3PVVVddddVVV1111b8GwVVXXXXVVVddddVVL7LXeZ3XeW+e6d5f+RXut773Xi79zd9wv/vuu+/W++6771auepGcPXv2Gf/wD//w2wB7f/M37P/t3/JA+3/7twCcOXPmQS/2Yi/22lx11VVXXXXVVVdd9aIiuOqqq6666qqrrrrqRfZiL/Zir8UzXfqbv+G5HXuplwLgH/7hH36bq/5V/v7v//63AXZe6qV4bnt/8zfc78Ve7MVei6uuuuqqq6666qqrXlQEV1111VVXXXXVVVe9yF7sxV7stXmm+371V3lux17qpQD4h3/4h9/hqn+Vf/iHf/gdgNNv+IY8t+Hee7nf67zO67w3V1111VVXXXXVVVe9qAiuuuqqq6666qqrrnqRXXPNNQ8GuPdXfoXnZ37ddQD81m/91ndz1b/K2bNnbwWYXXstz219333s/e3fAnDNNdc8mKuuuuqqq6666qqrXlQEV1111VVXXXXVVVe9SF7ndV7nvXmm9b338tyuecM3BOC3fuu3vpur/tXuu+++W//hH/7htwG2X/IleW77f/u33O/FXuzFXpurrrrqqquuuuqqq14UBFddddVVV1111VVXvUhe7MVe7LV4pnt/5Vd4bsde6qUA+Id/+Iff4ap/k7//+7//bYAb3+M9eBYJgL2/+Rvu907v9E6fxVVXXXXVVVddddVVLwqCq6666qqrrrrqqqteJC/2Yi/22jzT+t57eW7HXuqlAPiHf/iH3+aqf5Pf/u3f/h6A2XXX8dyGe+/lfmfOnHkwV1111VVXXXXVVVe9KAiuuuqqq6666qqrrnqRXHPNNQ8GuO9Xf5XnZ37ddQDcd999t3LVv8l9991363333Xfr7Npr2Xmpl+KB1vfey97f/A0A11xzzYNf7MVe7LW56qqrrrrqqquuuupfQnDVVVddddVVV1111b/odV7ndd6bZ9r967/muV3zhm8IwG/91m99N1f9u5w9e/ZWgO2XfEmQeKBzv/Zr3O/FXuzFXourrrrqqquuuuqqq/4lBFddddVVV1111VVX/Yte7MVe7LV4pr2//Vue27GXeikA/uEf/uF3uOrf5Ud+5Ec+B2DnpV6K57b/t3/L/V78xV/8tbnqqquuuuqqq6666l9CcNVVV1111VVXXXXVv+h1Xud13ptnWt1zD8/t2jd6IwD+4R/+4be56t/l7NmztwL0117Lc1vfey/7f/u3AJw5c+bBXHXVVVddddVVV131LyG46qqrrrrqqquuuuqFep3XeZ335pnu/ZVf4bld84ZvCMA//MM//PZ99913K1f9u9x33323/sM//MNvz669lu2XfEkeSMD63nsBuOaaax78Yi/2Yq/NVVddddVVV1111VUvDMFVV1111VVXXXXVVS/UmTNnHsQzXfqbv+G5HXuplwLgvvvuu5Wr/kP8/d///W8D7LzUS/Hczv3qr3K/F3uxF3strrrqqquuuuqqq656YQiuuuqqq6666qqrrnqhXvzFX/y1eaZLf/M3PLdjL/VSAPzWb/3W93DVf4h/+Id/+B2A02/wBjy34d57ud+Lv/iLvzZXXXXVVVddddVVV70wBFddddVVV1111VVXvVAv9mIv9toA9/7Kr7C+916e2/y66wD4h3/4h9/mqv8QZ8+evRVgdu21zK69FgBxxfree9n/278F4MyZMw/mqquuuuqqq6666qoXhuCqq6666qqrrrrqqhfodV7ndd6LF+KaN3xDAH7rt37re7jqP8x9991369///d//NkB/7bU8t72//VsArrnmmge/+Iu/+Gtz1VVXXXXVVVddddULQnDVVVddddVVV1111Qv0Yi/2Yq/NM933q7/Kczv2Ui8FwD/8wz/8Nlf9h/qHf/iH3wa48T3eA/Gc9v/mb7jfa7/2a78XV1111VVXXXXVVVe9IARXXXXVVVddddVVV71AL/ZiL/baPNOlv/kbntuxl3opAP7hH/7ht7nqP9Rv/dZvfTfA7NpreW7Dvfdyvxd/8Rd/Ha666qqrrrrqqquuekEIrrrqqquuuuqqq656ga655poHA9z7K7/Cczv2Ui/F/LrrALjvvvtu5ar/UGfPnn3GP/zDP/z27Npr2X7Jl+SB1vfey/7f/i0AZ86cedCLvdiLvTZXXXXVVVddddVVVz0/BFddddVVV1111VVXPV+v8zqv894806W/+Rue2+zaawH4rd/6re/mqv9U2y/1Ujy3vb/9W6666qqrrrrqqquu+hcRXHXVVVddddVVV131fL3Yi73Ya/FMl/7mb3hu177RGwHwD//wD7/DVf8pfuRHfuRzAHZe8iV5bud/9Ve53zu90zt9FlddddVVV1111VVXPT8EV1111VVXXXXVVVc9Xy/2Yi/22jzT+t57eW7HXuqlAPiHf/iH3+aq/xRnz569FaC/9lqe2/ree1nfey8AZ86ceTBXXXXVVVddddVVVz0/BFddddVVV1111VVXvVD3/sqv8NyuecM3BOC3fuu3vvu+++67lav+U9x33323/sM//MNvz669lu2XfEme23DvvVx11VVXXXXVVVdd9UIRXHXVVVddddVVV131fF1zzTUPBrj0N3/Dczv2Ui/FVf81/v7v//63AbZf6qV4bnd+3/cBcM011zyYq6666qqrrrrqqqueH4Krrrrqqquuuuqqq57HNddc82BeiGMv9VIA/NZv/db3cNV/qn/4h3/4HYDTb/AGPNDs2muZXXst97vmmmsezFVXXXXVVVddddVVz43KVVddddVVV1111VXP14/8yI989ju90zt99iM/8RN55Cd+Iqt77uHS3/wNl/7mb5hfdx0A//AP//DbXPWf6uzZs7cCzK69lod8/McDcPoN3oAH+q3f+q3vvu+++27lqquuuuqqq6666qrnRjl+/DhXXXXVVVddddVVVz2nw8PD3bNnzz5jc3Pz+NHR0e4111zz4Lq1xdbDH86pV3s17rvvvlv/9E//9Kf/9E//9Ge46j/V4eHh7ou/+Iu/9jXXXPPgjYc9jI2HPYz73Xfffbf+/M///Ff/6Z/+6c+cPXv2Vq666qqrrrrqqquuem7oQQ96EFddddVVV1111VVXvXDXXHPNgwFe7MVe7LVf7MVe7LV+67d+63v+4R/+4be56r/M67zO67z3mTNnHgTwD//wD7/zD//wD7/NVVddddVVV1111VX/EvSgBz2Iq6666qqrrrrqqquuuuqqq6666qqrrrrq/yQqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q/iHwFQ73yVo761OQAAAABJRU5ErkJggg==) + +```js +// Color the result of a sweep. + + +// Create a path for the sweep. +sweepPath = startSketchOn('XZ') + |> startProfileAt([0.05, 0.05], %) + |> line([0, 7], %) + |> tangentialArc({ offset = 90, radius = 5 }, %) + |> line([-3, 0], %) + |> tangentialArc({ offset = -90, radius = 5 }, %) + |> line([0, 7], %) + +pipeHole = startSketchOn('XY') + |> circle({ center = [0, 0], radius = 1.5 }, %) + +sweepSketch = startSketchOn('XY') + |> circle({ center = [0, 0], radius = 2 }, %) + |> hole(pipeHole, %) + |> sweep({ path = sweepPath }, %) + |> appearance({ + color = "#ff0000", + metalness = 50, + roughness = 50 + }, %) +``` + +![Rendered example of appearance 8](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAElpklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVS+Sa6655sE805kzZx4McM011zyYZzpz5syDeC7XXHPNg3k+rrnmmgfzAtx333238gLcd999t/JMZ8+efQbPdN99993KM509e/bW++6771auuuqqq6666qqrrrrqqqsAPehBD+Kqq6666qqr/r+55pprHgxw5syZB19zzTUPPnPmzIN4pmuuuebB11xzzYMBzpw58+BrrrnmwTyX++6779ZrrrnmwTzA3j33cOnuu7nf3j33sHPddTw/e/fcwwuyc911AOzdcw/Pbee663igm1/mZXhh7rvvvlsBzp49e+t99913K8A//MM//A7Afffdd+vZs2dvve+++27lqquuuuqqq6666qqrrvq/Cj3oQQ/iqquuuuqqq/6vueaaax585syZB19zzTUPPnPmzIMAXvzFX/y1z5w58+BrrrnmwTwft//VX7F3zz0A7N19NzvXX8/e3XcDsHP99excdx13/NVfAbBz/fXsXHcd9zt2/fUA7Fx3Hf8Z9u65h/vt3X03AHv33APApbvvZu+ee7jf3j33sHf33excfz07110HwM5113Hs+usB2LnuOm56mZfhfvfdd9+tAP/wD//w2wD/8A//8Dv/8A//8Nv33XffrVx11VVXXXXVVVddddVV/9uhBz3oQVx11VVXXXXV/1bXXHPNg8+cOfPgF3uxF3uta6655sHXXHPNg1/sxV7stXmA2//qr9i75x727r4bgNv/+q85dt11XLrnHo5ddx07110HwM0v8zLsXH89O9ddx3Pbu+ceAPbuvpubXuZleFG18+d5FhsAc4VtAAxgY8BcYZvFtdfyorjjr/4KgJ3rr2fnuuu4394997B3993s3XMPj/ulXwLgjr/6K+63c911AOxcfz07113HTS/zMuxcdx03vczLAHDffffd+g//8A+//Q//8A+/81u/9VvfzVVXXXXVVVddddVVV131vxF60IMexFVXXXXVVVf9b/FiL/Zir/1iL/Zir/XiL/7ir/1iL/Zir80z7d1zD3f81V9x6e67ueOv/xqAO/7qrwDYue46HvsmbwLAzS/zMtz0Mi/D/fbuuYe9u+/mppd5GZ7b8t57EbC67z7W993H+r77kISA8dw52rlzhESJwOfPUyR84QIlghJBSEjifmnTMmmZTJlMmYytMWUytsaYyZTJlEnLZLJpmTSb2TXX0DKxzeK660ibjWuvxcDmtdeyed11GNi67jq2rruO7euu436P+6Vf4qaXeRl2rruOO/7qr9i75x7++Du/k7177uEF2bnuOm56mZfhppd5GR77Jm/Cfffdd+tv/dZvffeP/uiPfg5XXXXVVVddddVVV1111f8m6EEPehBXXXXVVVdd9T/VNddc8+AXe7EXe+3XeZ3Xea8Xe7EXe22AvXvu4R9+8RcBeNwv/RJ799zDAx277joe+yZvwk0v8zLc9DIvA8DePfdwx1/9FY99kzcB4OieewA49zd/w/Lee5HEhb/9WwTs/t3fIYmQCImQCImQiAiKRImgSNQISgS1FGoENYISQYmgv+mmp5z8nM95OM803XXXU+/79E9/WMtkymTKZGyNKZOxNaZMxkymTFomk03LpNk0m8yk2SSQNmljmwTSJm0SSJsENq+9lq3rr2fruuu44aVfmu3rr+eWl3kZHvdLv8Rj3+RNuOOv/opf+6IvYu+ee3hhdq67jpte5mV4zBu/MX/wpCd99m//9m9/z3333XcrV1111VVXXXXVVVddddX/BlSuuuqqq6666n+ga6655sGv/dqv/V7v9E7v9Nn33XffrU/7+Z9/8I9/y7dwx1/9Fc9NXHHTy7wMb/ipn8rOddexd8897Fx3HQCH99zD+b/+a/Lee/mtj/kYzv/t3xKAJAKQREhIIgBJiGczYJ7JBon7mWeyATBgwMDJz/mch/MA9YYbHsZzEc9JgHgBJLB5Ue3fcw+X7rmHBvzdL/4iE7B53XXc+DIvw/Uv/dLs33MPN73My/D4X/olXpj9e+7h8b/0S+zdfTcv/kEf9Nr/8A//8Dv33XffrVx11VVXXXXVVVddddVV/xtQueqqq6666qr/YV7sxV7stT/3cz/3twB+9Qu/kMf90i89GECAeP5e6X3eh1d+3/dl75572L/nHp7yS7/E0T338LRf+RUCCIkAQiIkDIh/mQFxhbnCgG2QuJ8B2zyL1IDCczn2ru+6f+H7v3+b5yKJ5yAhm/uJKySBDYAA80JIYPNAl+65h/Gv/oqXvOceHvMmb8LjfumXeFHc+NIvzdt97ddy3333Pfiaa6558D/8wz9w1VVXXXXVVVddddVVV/2vQOWqq6666qqr/od5ucc85r0e90u/xK990RcBIIl/yWPf9E253w++4ztSJApQJJ6HDRLPwwaJ+xkQL5i5wjybbbBxZuH5WP3VX90FPEo8HxIvCgECzPMnntPOddexed113PgyL8OLv8mbcOz669m75x6+5x3fkb177kE8fzvXXcej3+RNeMybvAk7113H3j338OS///tbf+u3fuu7ueqqq6666qqrrrrqqqv+t6By1VVXXXXVVf+DXHPNNQ9++Eu+5INvOnWKm176pbnzr/+aF8WvfeEX8nZf+7UAvNz7vA/3/vVfc99f/zX/EgMCDIh/mQFskAAwz2auMC/Y+vGPfxTPJAAJ8QASSGADIAnZvKi2r7uOzWuv5bqXeRm2rruOR7/Jm3C/vXvu4fG/9Es84Zd+ib177uG57Vx3HTe+zMuwfd11POZN3oSd665j75572LnuOvbvuYfH/dIv8XPf931w4gRXXXXVVVddddVVV1111f8a6EEPehBXXXXVVVdd9T/JO77jO37Wg4+OPvuV3ud92LvnHv7ku76Lvbvv5s6//mtemJ3rruMxb/Im3PTSL82NL/MyHNxzDwf33MPhPfdw9m/+hqN77mF5770c3XMPIRESAkJCEgFIIiRCQhIBhERIRAQhUSQighpBkSgR1AhqKZQIagQlgpA49h7v8bjFa7/2Y8lc3vOBH7jITFomLZMpkzGTqTXGTKZMxkymTFomUybNpmXSbGbXXEPaLK69lo1rr2Xj2muxzTUv/dJsXXcdW9ddx/327rmHJ/zSLwFw51/9FXf+9V/zQNvXXceNL/My7Fx3HTe+9Etz48u8DAB799zD/t13c+PLvAwH99zDX3zXd7F3zz3c9ld/xQjcW+tvP+nEidfhqquuuuqqq6666qqrrvrfAj3oQQ/iqquuuuqqq/4nueaaax78pi//8k9/i/d7PwD27rmHneuuY++ee7jzr/6KO//6r9m7+27277mHvXvu4fnZue46bnyZl2H7uuvYue46HvMmb8IDHd1zDwBH997L8t57AVjeey+re+9FEqv77kNAAOuzZxFQIpDEePYsJYIiUSKoEdQISgS1FEoERaJEMHv0oznxCZ9AO3eOC1/2ZaSNTp0iW6PZ6NQpMpNy+jRpkzb9NdeQNrNrrmFxzTUsrr2W5+fOv/or9u65h/177gHgzr/6K+78678GYPu669i57jq2r7+eneuuA+DGl35pbnyZl+F+e/fcw/7dd3Pjy7wMAIf33MO9f/3XHNxzD3f/9V9z11/9FQlMwGQzAvfW+ttPOnHidbjqqquuuuqqq6666qqr/rdAD3rQg7jqqquuuuqq/2m277336acyH/yqb/ZmPPxlXoYHv8zLcOz663n8L/0SO9ddx40v8zIA7N1zDwB3/tVfAXDnX/81APt3383ePfewf889PND2ddexc911bF9/PQA3vvRLA7Bz3XUA3PgyLwPAvXfdxbU33MB/pTv/6q8A2L/nHvbuuYf77d9zD/t338329ddz51/9FTvXXcf29dezfd113O/Gl35pAG58mZfhgfbvuQeAO//qr3j0m7wJ9zu65x7O/s3fcHjPPdz313/NvX/91yRgmwQSaDYJNGCyGYC9iFv/5tSph3DVVVddddVVV1111VVX/W+BHvSgB3HVVVddddVV/9Mszp37rWvG8bUXEj3QSZy67joe9DIvwy0v+7LsXHcdN73My/Dc7vyrv+LGl3kZHmjvnnu43/7dd7N3zz3cb/+eewDYv+ceHmj/7ru53/b113O//bvvBmD7+ut5Ybavuw6A/Xvu4QXZvu46HmjnuusA2L7uOgB2rr8egO3rruO57d9zDwB7d9/NjS/zMjy35b33AnD+b/6Go3vuAeDc3/wNh/fcw+E992DANgkYSJsEbJNAAmnTgAZMNiOwG3Hr35469RCuuuqqq6666qqrrrrqqv8t0IMe9CCuuuqqq6666n+a2blzv3XtOL72QmIGVIkKVCAkChDAseuuIyRufJmXQcANL/MyCNi67jq2rruOreuu41+yf889AGxfdx3/1fbvuYft667jRbG+7z4AVvfey+q++1jdey+2MXDxb/8WgKN77uHo3nuxjYG0sY0B2xhIGwMG0sZA2hhImwQSSJsGNGCyGYFLEbf+zalTD+Gqq6666qqrrrrqqquu+t8CPehBD+Kqq6666qqr/qeJixe/68bV6r03JHqgk6hAAYpEAQIIICQCCCAkBISEgAC2rr+eACSxde21bF1/PQIEbF53HZLYuO46BAhAYuPaawEQIAlxxfyaa0ACQFwhAAkAcUWePw+AJB6onT8PNraZzp3DNgbSZrzvPtJmffYsmcn63ntpNqv77iMzaTZpY5u0SRvbpI0B26SNAdsYSBvbGLCNgbQxYCBtDKSNgbRJIIG0aUADJpsRGGz++JprxFVXXXXVVVddddVVV131vwWVq6666qqrrvofaCrl1gQMGDBgnsnGEs+PAQHYIAFweM89BCCJ5T33cO5v/5aQEBASkgiJkAggIgiJIlEkQqJEUCRKBDWCEkGRqBGUCGoEJYISQUhEBCEhCfFsBmyTmaRNZtJsWiYtk5ZJ2rRMWibN5n4CBJgXnQBLYPMsEtj8awgQV1111VVXXXXVVVddddX/QgRXXXXVVVdd9T/QWMozDJh/G3OFucJcYa4wz4cNADb3M8/LADYA5goDBmxzmc1lNs/B5oURDyAhXgQS9xMvhASAeCEkHkiAeE5lmh7MVVddddVVV1111VVXXfW/BcFVV1111VVX/Q8UpdyagAED5goD5grzbAbMv555JpvnYGOezYB5JhvzbOaZbADMFbZ5vmyeHwFIvKjEFeIBJP41xBXiRSNAXHXVVVddddVVV1111VX/ixBcddVVV1111f9ADTBgnsnGPC8D5jmZ589cYQCb52bAgHkmGwAD2ACYZzPPZGMbA+YKc4UB80JI/GcT/3rieQlAokzTg7nqqquuuuqqq6666qqr/rcguOqqq6666qr/gWqttyZgwIC5wlxh/mXmCvP8mWeyMc/JXGGei40BA9jY5nnYPAcbA+YFE/8Cif8q4nmJZxNXXXXVVVddddVVV1111f8iBFddddVVV131P1Ct9dZmY8BcYa4wz8Xmfrb51zLPnwFsAAyY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F8rGgAEDtjFXGDDPZANgm/sZwMaAecHEM0mI50+8YOJfJl448VwkxFVXXXXVVVddddVVV131vwjBVVddddVVV/0vMPb9bxswYP71zBXmBbABMM9mwDybbQAMmOfPNpfZmGeyATCADTb/HuL5E89F4t9DvHBlmh7MVVddddVVV1111VVXXfU/HcFVV1111VVX/S/QgOQKA7Yxz2ael3nRmOdi80Dm2WzzLDYA2Dw3c4UB899HPC/xLxOABIB4NvFs4qqrrrrqqquuuuqqq676X4Dgqquuuuqqq/4XGEp5hgHznAyYKwwYwMY8k80LYp6TeTbznMxzMmDAgAEDtjFgGwBs7meuMP92AsTzIfFCSbwoxItGgIAyTQ/mqquuuuqqq6666qqrrvqfjuCqq6666qqr/heopdyagAEDBszzZ56TucJcYRsAbJ4f8/yZK2zzojBgwFxhGwAD5j+JxHMT/zHEcxJXXXXVVVddddVVV1111f8CBFddddVVV131v4BqvTUB8/yZ58+8cOYK80w2D2TAvGC2MWAbA7YxYJ7JBhtsnocNgPmPI14IifuJZxPPSRLPTTwncdVVV1111VVXXXXVVVf9L0Fw1VVXXXXVVf9L2MY2BswVBgxg88KYK8wV5gFs7meezTybucJcYRvzQtiYZzNX2OZ+5l9B4gUR/zLxH0M82yzzwVx11VVXXXXVVVddddVV/9MRXHXVVVddddX/ArXWWwEMmCvMczLPyTwXmxeVeQAbbMwV5rnYAGADYMBcYcBcYZ6X+XeS+FeTeA4SAEi8KAQI6DMfxFVXXXXVVVddddVVV131Px3BVVddddVVV/0vMZZyq7nCPH8GDJh/mbnCXGGeD5tnsXkONgYMGDBgABsA2zw/trHNv5d4/sSLRhL/EvFMEs9NXHXVVVddddVVV1111VX/CxBcddVVV1111f8Sq1JuNWCuMGDAgHnBzBXmCvPCmWeyMWCezTYABswLZq6wDYABbJ6HDYB5Jpv/EBLPTbxg4grxopPEVVddddVVV1111VVXXfU/HsFVV1111VVX/S+RgAED5kVjXjQGsHkg82zmBbABsI0B2xjA5n62wcaA+a8h/v3EFeIK8WwCZq09mKuuuuqqq6666qqrrrrqfzqCq6666qqrrvpfYuz7307APJONeTbznMy/zDwn80w2z81cYRsAAwbM82de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xBXiqquuuuqqq6666qqrrvpfgOCqq6666qqr/pcppdyagAED5vkz/zrmOZlnM89mABtszBUGbHM/2wCYZ7LBxoAB2zyLzX8k8SKQeFEJEM/fIvPBXHXVVVddddVVV1111VX/kxFcddVVV1111f8yUeuttrHN/cyzmefPPCdzhXnhDGDzQOaZbB7IgLnCXGHAgHkuNtiYfyOJ50vihRHPn7hCPJt4LhL3E2Cuuuqqq6666qqrrrrqqv/hCK666qqrrrrqfyEDBgyYKwyY5888m3nBzBW2ATAvmLnCXGEAGwAD2LwwBsxzss39zL+deBFJvKjEs4krFq09mKuuuuqqq6666qqrrrrqfzKCq6666qqrrvpfptZ6K4ABc4V5TubZzL/MvBA2AAYMmGczgI15NvNstjHPZsA25jmZ/3iSeFGI50/8y8RVV1111VVXXXXVVVdd9T8cwVVXXXXVVVf9LzSUcqu5wgA2z82AAWzuZxsAc4V5XuYK82zmOZnnYgNgABsA80w2Bgxg84KY/3gCkHhu4rlIvFAS9xPPZq666qqrrrrqqquuuuqq/+EIrrrqqquuuup/oVUptxowz2bAgPm3Mc+fef7MFeYK82y2ATDPZIONeTbzADbPYnM/8yKSeEHEM0n8iyReGPFsAgTUaXowV1111VVXXXXVVVddddX/VARXXXXVVVdd9b/QVMqtBgwYMM/JPC/z/NkGAJvnYfNA5jmZKwxgA2CuMFcYMGCuMGAbAAPm+bDB5gWSuJ/4l4kXjXgmicskXhhx1VVXXXXVVVddddVVV/0PR3DVVVddddVV/wu1Um5NwDybecHMs5krzPMygI25wjybucI2tnl+bANgAJt/C/OfTAJAPJt4TuKFE89Wp+nBXHXVVVddddVVV1111VX/UxFcddVVV1111f9Cg425woC5woABbAwYMC+Azf3MC2eeyeZ+tsHGXGGuMM9mmwcygA0ANgDYmP984t9OPC9xhbjqqquuuuqqq6666qqr/gcjuOqqq6666qr/hWI+/x0D5l/HXGGuMC+YeS42z5eNucIANgDmCtsYMFeYKwxg819JPIDEi0JcIZ6LhABJXHXVVVddddVVV1111VX/YxFcddVVV1111f9CzSYBAwYMmGczz8u8cOYK85zMsxkwz2aeP3OFeSYbbLABMFcYMFcYMP8ySTw38UwS/xri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ADYGDBgwYMCAbQwkYCCBBNImgaNSbt3t+9852/ffPcznv81VV1111VVXXXXVfy70oAc9iKuuuuqqq6666t+u7e191qmDg8+eARWoEh1QgSJRgAKERAECCCAkAggJAQGERAACQkJASAgICQEhIUASAYSEJAKQREiERACSCImQCImQCImQCImQCImQCImQCEASISGJkBBXSEI8f+YK2xiwDYBtDNjGgG0MGLANgG0MGLANgLnCNgAGsDFXGMDGgLnCNgAGbANgrrCNucI25grbmCsMYGOusA2AucIANgDm2Qxgcz/zwpnnJf7/Mg9g80DmOZlnsgEwV5hnsjFXmCtsA2CuMICNucKAbQDMFQZsA2CuMGAbc4UBA7YxVxgwkIBtDBhIwEACadOABA5LufW2+fxzjra2vpurrrrqqquuuuqq/xzoQQ96EFddddVVV1111b/dNE0PXuzuftf2MLx2D1SgSnRAlShAAQoQEgEEEBIBBBASAQQgiQBCQkAAkghAEgJCQkBISCIASYREAJIIiZAIQBIhERIhERIhERIhUSRCQhIhERIhISAkJCFAEgKQEM/LNgAGbANgwDYGbGPANgC2MWDANgAGbANgrrANgHkmG3OFAdsAmCtsA2AAGwMGsDFgrrCNucI2AAYMYANgwAA2AOYKA9gAmOdkAJvnZv51xP9t5oUzgM39zHMygI25wgA2AOYKA9gYMFfYBsBcYRtzhQFsDJgrDNgGwIC5wjYGzBUGbGPAgAEDtjGQgIEEEkibBiRwWMqt985m33Nxe/uzueqqq6666qqrrvqPhR70oAdx1VVXXXXVVVf9++Q0PfjYffc9fQb0QJHogApUiQIUICQCKEAAIRFAACERgCQCEBASAkJCQACSCEASISEgJASEhCQCCAlJhEQAIRESIRESIRESIRESIRESIRESkgiJkBAQEpIQIAkA8bzMFbYBMGAbA7YxgI0BA7YBMGAbc4VtAMwz2ZhnM2Cb+5krbANgrrCNucI2AAZsA2CusI25wjYA5grbAJgrbANgns0ANvczL5h5/sT/TwaweW7m2Qxgcz/zbLYBMFfYBsBcYRtzhQHbAJgrbGOusI25wgA2BswVBmxjrjBgGwADBgzYxoABAwZsY8BAAgkkkDYJNOColFvv7Lrv3jt27HO46qqrrrrqqquu+o+BHvSgB3HVVVddddVV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rhAgrhBgQIABAQZkY55JApvgqquuuuqqq656ERFcddVVV1111VVXXXXVVf+p7rvvvlvP33MPAUgCQFwhAIn7iRedbQzYxoBtDNjGgG0ADBgwYBsAA9iYKwxgY64wz2ael3gACQBJICEJSUhCgCQECJCEJCQhCQECBAgQIEBcIa4QIAkB4qqrrrrqqquu+lcguOqqq6666qqrrrrqqqv+0wkIQIC4QlwhQDybuEI8J/G8DBgwz2auMGAAmwcygI25wgA25grzbObZzPMnQBICBEhCEgIkIQlJSCIAAQIESEISSEhCEgACxBUCkHigw1Ju5aqrrrrqqquuelFQueqqq6666qqrrrrqqqv+S0hCgAABAsSzCRDPn3gBbJCwjSVsIwkD4goDAmwjCQADAgzIxhICDIgrDIgrDIjnJZ6TJAAEIAGADRL3ExBAAgIEyAZAgCQMCBBgQDYCxBUhcdVVV1111VVXvUioXHXVVVddddVVV1111VX/qa655poHCxAQQAACBEhCPC/xbOKFMyCuMGBANpawjSQMCDAgGyQMCDAgwIC4woC4woB44QRIQgASAgSY5yWuECAbAZIwgI0AAQYECDDPJuBQupWrrrrqqquuuupFQXDVVVddddVVV1111VVX/ae7cPfdCBAgQDwnAeIKAUgAiH+BBIAB82zm2QxgY64wD2Dz3GyDDTa2eUEkgYQkkBCAhAAkJCEgJAKQhCQkIUCAJCQhQIAkkJCEeDYB4pkkjiJu5aqrrrrqqquuelEQXHXVVVddddVVV1111VX/JcQVAgQIECBAXCGeTTwvAQLE87KNAdsAGDBXmCtsA2AAG3OFAWxscz/zTDYviLhCABICJCFAgCQkIYkABAQgCUlIQoAkJCFAXCEJSUgCAAlJXHXVVVddddVV/ypUrrrqqquuuuqqq6666qr/NGfOnHkQwPm77wZAXCFAEgLEFeIKAeLZBAiQxAMJEM/LgAHZIGFAgAEBBgQYEGBAgAFxhQHxQkjcT1whQBICkBDPZIMEgLhCgADZSEKAbCQhQDbmASSwud+RdCtXXXXVVVddddWLguCqq6666qqrrrrqqquu+k8nQIAAAQIECBAgrhDPJkD8y8SzmedkABvzXGyeg839zPOyzQsjCSQESEKAJEJCEpKQREhIQhICJCEJAZIQIAAJAAECBIhny0yuuuqqq666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rrrqX4Xgqquuuuqqq6666qqrrvpPcc011zwYQPznM89m/vOIKyQhQBICJCEJAZIQIK4QIEAS9xP/era50Pe/zVVXXXXVVVdd9a9BcNVVV1111VVXXXXVVVf9pzl39908kADx30u8aMQVAgSIK8RzkQAQIInLJJCQxAtl89zMFeaZbK666qqrrrrqqn8zgquuuuqqq6666qqrrrrqP5X4tzHPn3nRmH8d8VwkAJB4DhICJCFAgAAkACQhQFwhCSQABCDxb7Ws9Vauuuqqq6666qp/DYKrrrrqqquuuuqqq6666j/FmTNnHnT27rsBEA8g8T+VAAHiuUggIQkBSAiQhAAkBAgQgASAuEKA+BfYvDDiqquuuuqqq676NyC46qqrrrrqqquuuuqqq/7TSOIFEf965nmZZzPPn3j+xAsnnk08m3gACQGSkAQSAiSBxHMT/zb3lvLbXHXVVVddddVV/1oEV1111VVXXXXVVVddddV/imuuuebB5+6+G/GCiX8nm38ViWeReIEkLpMQIK4QgIQASUhCgCTuJ56T+I9xEHErV1111VVXXXXVvxbBVVddddVVV1111VVXXfVfQvzrmWcz/7XEcxKAhAAknkUCQBKSQEISAgQgIQCJfyvbXHXVVVddddVV/yYEV1111VVXXXXVVVddddV/Lol/L/OvY64w/wEkkEBCXCFAEgIESEKAAAECkEBCABICJPEisQEwz3Yg3cpVV1111VVXXfWvRXDVVVddddVVV1111VVX/ae45pprHnzurrsQIJ6TeNGZ/1ziuUiIKwQIEM8miftJQoAAJJC4TEKA+HeweaCjiGdw1VVXXXXVVVf9axFcddVVV1111VVXXXXVVf8pzpw582Dxn8s8m/k3kHiBJB5IPJskxDNJICFAgCQEIAGAhPhXsHkgc8W4XnPVVVddddVVV/2rEVx11VVXXXXVVVddddVV/2nO3XMP/xOJ5ySeSUI8L3GFJMQzSUhCgAAkkBCAhABJiH8Hm/tdmM9/m6uuuuqqq6666l+L4Kqrrrrqqquuuuqqq676TyWeTfwPJAEgCfFsApAQzyQBgIQAcYUkBAgQgIQA8QASkgAQIImrrrrqqquuuuq/BJWrrrrqqquuuuqqq6666j/FNddc82DxX8+A+FeSeH4EIIGEAAECkBAgnklCEpIQzyQhrpANgAAkACTxojKw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eCABSACI5yRAABJISEISkpCEJCQBgAQSSAhA4kVhnpO5Yofu6JF0L3YH7dbv0uHXfrX2P+c3tPx5numdvfn+T2L8h6/W3md/dex/9j9o/GuAkOIM5Vquuuqqq6666qrnh8pVV1111VVXXXXVVVdd9e92zTXXPJhnEv+9xBUCzvzNkme80Q4A4tkEiOckifsJECCuECBAABKSECAJSSAhAIl/qz/g4ClL1X/4A61//Ve1+plL5MWXcvcKPNNL0r/Cp+riBz1R098D/APjX95A3HyA95fiiKuuuuqqq6666vmhctVVV1111VVXXXXVVVf9u505c+bBAOJ5iX8HGyT+rU7/7ZLHvedJ7nvJOdf/3ZrnR4C4QhKSABCAhCSQkAQS3YVDZhfPoRtOohtPAyCJy2wk8XzZYPMsNthcZvOnMf3C72n/D27V9GRzxXHiJM804uG3tPpFnulXtfyZf2D46wN5706m27jqqquuuuqqq54fKlddddVVV1111VVXXXXVv9vZs2dvBTh39938RzIgrjAg/nU27xl5IPEAEuKZJB5IEkgIECCukER37oD+SffA4++ErTk84ka48RTccAok7if+dbI1nl6mJ/MAD6U+ime6k+m2s8q7eaa/0PCHfyH+kKuuuuqqq6666oWhctVVV1111VVXXXXVVVf9hxL/tQyI509csXqJTW78q4mQCImQKApCECFKQBXUYkokXWnUAl0xfTVdTbou6etEWQ48y8EK/uqp+K+eCtsLuO4EPOw6OLXFC2SDjXkmm1tY8Arw4Ae7vvWvavXTAGHixd2/LM/0DNpTzLM9zPXRd6jdusYrrrrqqquuuuqqF4TKVVddddVVV1111VVXXfXvdt99990K8OiXeRme8Zd/ifivJ55NXLFx78SLfd8FXvcZHW96sMELZ6ABDRj5V9tfwv6SePJddJtzeMwNDNfvcJmNAfOczBWvrOO8tPTed9lP+VWtfhrg0XQveSPlFp5pV3kBYIbmr+PZm76ZF+/4e17/6o/F0Xeaq6666qqrrrrqBaBy1VVXXXXVVVddddVVV/2H+K3f+q3vfvTLvux7/8p3fAcviPj3MyDAgPiXvdj3XWTVKj+1JYpESIREURAhioISokZQolBL0JVCLYWuFPpS6bpKVzu6vmPz7j36287zfF1/El97nOnFbmJar2G9BptnsXl+rlVPoAftOBfHiZMzNH8/b33M4xn/9mXpXwVgYW3c4vLQN2fjnd4yF+/8aLqXvIX6kJ/z8keW8iFXXXXVVVddddXzQ+Wqq6666qqrrrrqqquu+g9x33333foSj340j3zZl+Xpf/VXiP9iEuJ5CbizNopESJQIikQJqBGUMF2IWkRXRFeCvhZmtdJ3HfOuY9b3uO/RbMbYdfS3nedZrj+JbjxFvPwjydbwNMEw8DxsAAwYwAYbgCM3tlQ5QZz66Nz+rBmxeGMv3vaztfuRj3H3Ugu08WJ0L/PR3vmsN/D8rbaJYxfIc7+p1S8A5qqrrrrqqquuekGoXHXVVVddddVVV1111VX/IX7rt37ru9/pnd7ps1/5Td+Up//VX/HvZUC8EDZIvCDieUnifuIKAUjcT4C4QlwhQBICvDkjrzkG158kXv4RRK0oAmwk8fyYB7B5DjZ31olHtUpAeW9vfSTA4xn/5re0+sW/9/CXr8Ds1W+hPvQW14cC3EO787t08LU/EIffvMRHXHXVVVddddVVLwiVq6666qqrrrrqqquuuuo/xNmzZ5/xD//wD7/9yJd92dc+ef317N19N+I/hgHxgplnkviXCJDEcxMgAAkkJCEJSSAhQBLenDG+3ktQ+x5JSEKAJZ6HzfNlcz8DT735BKeHzf2du87OVnj5eI1/+906/Npzynu/T4ffeK3LDTdSbtnHe3+v8S9+keVP/JSOvm+Jj7jqqquuuuqqq14YKlddddVVV1111VVXXXXVf5gf+ZEf+ZzP/dzPfe03eb/340c+//P57yCel3j+BEhCABJICBAgQIAAAUggIQkkJIHEZRKyMc/LPIDN83PpQdfz6/Pjv3Pb3U/7o5W8fDzj3/yJht8B+HWtfrai7kbKLfvkpb/X+Jd/yfBHKZKrrrrqqquuuupfQuWqq6666qqrrrrqqquu+g/zD//wD7/9D//wD7/9Sm/6pq/9tL/8S/7yF3+R/0wGxHORuJ94AIkHkgQS9xMgrhCABBJISEKAuEIAEpKQBBKXSSBxPwPYYIONeQAbbACOvcSL87hSzn/Dr+9/Ic/lSD78SR19L1ddddVVV1111b8FwVVXXXXVVVddddVVV131H+pHfuRHPgfgjd7v/Thx/fX8W5jnz7xoxPMSLxpJICFAgCQkIQlJSEISApBAQlwhQDx/5jmZZzv2Ei/BP/zDP/w2V1111VVXXXXVfzSCq6666qqrrrrqqquuuuo/1D/8wz/89o/8yI989snrr+dDvuEb+M9g/gUS9xOABIAASYgrBAiQhAABAsQVAsQVkpCEJJBAQgASSEjiRWEbbO6382Ivxvzaa/mHf/iH3+aqq6666qqrrvqPRnDVVVddddVVV1111VVX/Yf77d/+7e/5h3/4h98+cd11vOOnfzr/2QSI5yKBBBIvMon7SQIJSUjiMgkkJCEJJMQDSDw/tnkgc4WBa17v9fiHf/iH377vvvtu5aqrrrrqqquu+o9GcNVVV1111VVXXXXVVVf9h7vvvvtu/fqv//r3AXi5N31TXu/93o9/K/NvI55NPC/xbAKQECAJSQgQVwiQhABJICEJJJCQBBLPwQabZ7HB5llstl/sxTjzuq/Lb/3Wb30PV1111VVXXXXVfwaCq6666qqrrrrqqquuuuo/xX333Xfr13/917/Pfffdd+vrv9/78brv9368QDb/VubZxAsmnk1cIUASAOK5SEhCEkhIQhICBCAhCUkg8QLZvCA3vuM7AvBbv/Vb381VV1111VVXXfWfgeCqq6666qqrrrrqqquu+k/zW7/1W9/9oz/6o58D8Hrv9368zvu+L/8S869g89zEs4nnJEAAEg8krhAgQIC4QoAkBCCBhCQk8UDihTNgABtsrnuHd2D7xV+cr//6r38frrrqqquuuuqq/yyU48ePc9VVV1111VVXXXXVVVf957n11lv/+uzZs894xVd8xbd+yMu+LEjc+ld/hQABAgRIQlwhQIAAJASIK8QV4pkkBIRESISEJEIiJCQREiEREYRESJQIIoKQKBEUiVIKJYJaCjWCWiu1VrpSqLVSu45aK6VWohSiFBSBJC6zyUxymshpok0T0zTRpompNdo00TLZfvVX54b3ei/+4R/+4be/67u+62O46qqrrrrqqqv+sxBcddVVV1111VVXXXXVVf/pfuu3fuu7v/7rv/59AF7nfd+Xj/nxH+f49dfzr2Gek3nBxLOJF0yAeCYJAZIAQEKAAElIQoAkJCEJJCTx/JjnYgOw/eqvzo0f/MEA/MiP/MjncNVVV1111VVX/WciuOqqq6666qqrrrrqqqv+S/zWb/3Wd3/Ih3zIQ+67775bj19/Pe/1dV/Ha73v+/KvZf71xHMSz0mAeDYBApCQBIAkkEACCSQkcZkEEs/DBhtzxfxRj+K6D/gAAD7zMz/zdf7hH/7ht7nqqquuuuqqq/4zUY4fP85VV1111VVXXXXVVVdd9V/j8PBw90//9E9/+vDwcPeWhz70wS/2Gq9x/Pj113PfU57C+uAAAAECxBWSEFeIK8QVApAQEBIhERIhERKSCImQCImQCImQKBIhUSIIiRJBLYUaQSmFrhRqKXSlUGul1krtOmqtlK6j1IpKQREIsI0zydbIaaJNE9M00aaJqTX6V3gFTn3ohwLw9V//9e/zp3/6pz/NVVddddVVV131n41y/Phxrrrqqquuuuqqq6666qr/OkdHR5f+4R/+4Xc2NzePv/iLv/hrX/eIR/Co13xNZltb3PZXf4UAAeIKSYgrxBXiCgFICCgSkgiJkAiJkJBESEQEIRERhERIFImIoEiUCEoEpRRqBLUUulqptdLVSq2V2nXUWolaiVqJCBQBEtg4k2yNnCbaONKmiTZNzN7xHdl80zcF4Ou//uvf57d+67e+m6uuuuqqq6666r8C5fjx41x11VVXXXXVVVddddVV//X+4R/+4Xd++7d/+3sODw93X+6VX/m1H/QyL8NLvcmbMN/e5ra/+ivEFZIQV4grxLNJIoCQCAlJhERIhIQkQiIkQiIkikRIhEREUCIoEdQIagQ1glortRS6Uqi10nUdpVZK11FqpZSCSkESANg4k2yNnCbaNNG2tug+7MOoD384AJ/5mZ/5On/6p3/601x11VVXXXXVVf9VKMePH+eqq6666qqrrrrqqquu+u9xeHi4+w//8A+/8w//8A+/82Iv9mKvfeq6644/6GVehpd8kzdhvr3NbX/1V0hCXCGuEM8mICRCIiRCQhIhERIhIYmQCIkiERGERERQJCKCGkGJoEZQSqGWQlcrXa3UWqm1UruO2nVErUStqBQUARLYOBO3xrSxwfgyLwPv+I5oseC+++679Uu+5Eve5h/+4R9+m6uuuuqqq6666r8S5fjx41x11VVXXXXVVVddddVV/73Onj1765/92Z/9zK233vo3D37wg1/61HXXHb/lZV6Gl3iTN2G2tcWle+5hfXCAuEI8m4CQCImQCImQkERIhEREEBIhERIhUSIoEiFRIigR1FIopVAjqKXQlUItha5WatdRu47SdZRaiVqJCBSBANu0jQ2Wj30syzd7M3zLLQD8yI/8yGd/6Zd+6ducPXv2Vq666qqrrrrqqv9q6EEPehBXXXXVVVddddVVV1111f8c11xzzYNf7MVe7LVf53Ve571e7MVe7LUBLt1zD5fuvpt/+KVf4u9/6ZcAEFdIokgUoEgUiSJRJEKiSJQIikSRKBGUCGoENYIugloKfSl0tTKrlVnXMes6Zn3PvO+Zz2bM5nP6+Zx+NqPO59S+J2pFEbTNTQ5vuYXDl3xJ7vcP//APv/31X//173PffffdylVXXXXVVVdd9d8FPehBD+Kqq6666qqrrrrqqquu+p/pmmuuefA7vuM7ftbrvM7rvDfPdOmee9i7+27+/pd+ib177uGOv/5rikSRKECRKBJFIiSKRImgSJQIikSNoETQRVBLoYugq5W+FPpamXUds65j3vfMZzNmsxmz2YzZfE43n9PN53DiBOtHPILlQx5C29zkfvfdd9+tX//1X/8+//AP//DbXHXVVVddddVV/93Qgx70IK666qqrrrrqqquuuuqq/9muueaaB7/Yi73Ya7/O67zOe73Yi73Ya/MAe/fcwx1//dfc9dd/zcE993Dv3/wNRaJIFImIoEgUiRJBlSgR1AhqBLUUulLoS6GrlVmtzGpl1vfM+55Z3zOfzZhdey3lYQ9DJ08yPuYx5NYW97vvvvtu/a3f+q3v/q3f+q3vPnv27DO46qqrrrrqqqv+p0APetCDuOqqq6666qqrrrrqqqv+97jmmmse/GIv9mKvfebMmQe90zu902fzfBzcey8H99zD4b33ct/f/i0BLO+7j5BYnz1LSIznzlFLoYtg67rr6EqhK4WNa69l49prmV9zDaUUZo94BOWhD+W53Xfffbf+6I/+6OcA/NZv/dZ3c9VVV1111VVX/U+EHvSgB3HVVVddddVVV1111VVX/e915syZB734i7/465w5c+ZBL/7iL/7aL/ZiL/ba/Ce47777bv2Hf/iH377vvvtu/Yd/+Iff+Yd/+Iff5qqrrrrqqquu+p8OPehBD+Kqq6666qqrrrrqqquu+r/jmmuuebBtv/iLv/jrALzYi73YawFcc801DwY4c+bMgwGuueaaB/NM9913360809mzZ2+97777br3vvvtuBfiHf/iH3/mHf/iH3+aqq6666qqrrvrfCD3oQQ/iqquuuuqqq6666qqrrrrqqquuuuqqq676P4nKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X8U/AouxlNFrdjukAAAAAElFTkSuQmCC) + + diff --git a/docs/kcl/arc.md b/docs/kcl/arc.md index e17ac8a99..a8c533316 100644 --- a/docs/kcl/arc.md +++ b/docs/kcl/arc.md @@ -35,13 +35,14 @@ exampleSketch = startSketchOn('XZ') |> startProfileAt([0, 0], %) |> line([10, 0], %) |> arc({ - angleStart: 0, - angleEnd: 280, - radius: 16 + angleStart = 0, + angleEnd = 280, + radius = 16 }, %) |> close(%) +example = extrude(10, exampleSketch) ``` -![Rendered example of arc 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAB50ElEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrnumaa655MMCZM2cefM011zwY4MyZMw/iuVxzzTUP5pmuueaaBwPcd999t15zzTUP5rncd999t/Jc7rvvvluvueaaB9933323nj179hkA9913360AZ8+evRXgvvvuu5Wrrrrqqquuuuqqq/69qFx11VVXXXXVVVdd9X/eNddc8+AzZ848+JprrnnwmTNnHgRwzTXXPPiaa6558JkzZx58zTXXPJh/wcu+7Mvyn+Ev//IveWHuu+++WwHOnj1763333XfrP/zDP/wOwH333Xfr2bNnb73vvvtu5aqrrrrqqquuuuqqFwQ96EEP4qqrrrrqqquuuuqq/92uueaaBwO82Iu92GufOXPmQQAv/uIv/tpnzpx58DXXXPNgnsvLvuzL8r/VX/7lX/Lc7rvvvlvPnj1763333Xfrfffdd+vZs2efcd999936D//wD7/NVVddddVVV1111f9v6EEPehBXXXXVVVddddVVV/3vcc011zz4xV7sxV77zJkzD3rxF3/x136xF3ux1+a5vOzLviz/X/3lX/4lD3Tffffd+g//8A+/DfAP//APv3Pffffd+g//8A+/zVVXXXXVVVddddX/D+hBD3oQV1111VVXXXXVVVf9z3PNNdc8+MyZMw9+sRd7sdcCePEXf/HXfrEXe7HX5ple9mVflqv+df7yL/+S+9133323/sM//MNv/8M//MPv3Hfffbf+wz/8w29z1VVXXXXVVVdd9X8PetCDHsRVV1111VVXXXXVVf/9rrnmmge/9mu/9nsBvNM7vdNn8wAv+7Ivy1X/Of7yL/8SgPvuu+9WgH/4h3/47X/4h3/4nfvuu+/Wf/iHf/htrrrqqquuuuqqq/53Qw960IO46qqrrrrqqquuuuq/3jXXXPPg137t136vF3/xF3/tF3uxF3ttnullX/Zlueq/11/+5V8CcN9999169uzZW//+7//+t//hH/7hd/7hH/7ht7nqqquuuuqqq6763wU96EEP4qqrrrrqqquuuuqq/3zXXHPNg1/7tV/7vV78xV/8tV/sxV7stXmml33Zl+Wq/9n+8i//EoD77rvv1rNnz97693//97/9D//wD7/zD//wD7/NVVddddVVV1111f9s6EEPehBXXXXVVVddddVVV/3Hu+aaax782q/92u8F8E7v9E6fzTO97Mu+LFf97/aXf/mXANx33323/sM//MNv/8M//MPv/NZv/dZ3c9VVV1111VVXXfU/D3rQgx7EVVddddVVV1111VX/Ma655poHv/Zrv/Z7vfiLv/hrv9iLvdhrA7zsy74sV/3f9pd/+ZcA3Hfffbf+wz/8w2//1m/91vf8wz/8w29z1VVXXXXVVVdd9d8PPehBD+Kqq6666qqrrrrqqn+ba6655sGv/dqv/V4A7/RO7/TZPNPLvuzLctX/T3/5l38JwH333XfrP/zDP/z2b/3Wb33PP/zDP/w2V1111VVXXXXVVf890IMe9CCuuuqqq6666qqrrvrXecd3fMfPuuaaax78Oq/zOu8N8LIv+7JcddXz85d/+Zfcd999t/7DP/zDb//Wb/3W9/zDP/zDb3PVVVddddVVV131Xwc96EEP4qqrrrrqqquuuuqqf9mLvdiLvfaLvdiLvdY7vdM7fTbAy77sy3LVVf8af/mXf8l999136z/8wz/89j/8wz/8zm/91m99N1ddddVVV1111VX/udCDHvQgrrrqqquuuuqqq656/q655poHv/Zrv/Z7vdM7vdNnA7zsy74sV131H+Ev//Ivue+++279h3/4h9/+rd/6re/5h3/4h9/mqquuuuqqq6666j8eetCDHsRVV1111VVXXXXVVc92zTXXPPi1X/u13+ud3umdPhvgZV/2Zbnqqv9Mf/mXf8l9991362/91m9994/+6I9+DlddddVVV1111VX/cdCDHvQgrrrqqquuuuqqq66Cd3zHd/ys13md13nva6655sEv+7Ivy1VX/Vf7y7/8S+67775b/+Ef/uG3f+u3fut7/uEf/uG3ueqqq6666qqrrvr3QQ960IO46qqrrrrqqquu+v/qmmuuefBrv/Zrv9c7vdM7fTbAy77sy3LVVf8T/OVf/iX33Xffrb/1W7/13b/927/9Pffdd9+tXHXVVVddddVVV/3roQc96EFcddVVV1111VVX/X/zju/4jp/1Oq/zOu99zTXXPBjgZV/2Zbnqqv+J/vIv/5L77rvv1n/4h3/47d/6rd/6nn/4h3/4ba666qqrrrrqqqtedOhBD3oQV1111VVXXXXVVf8fXHPNNQ9+7dd+7fd6p3d6p88GeNmXfVmuuup/k7/8y7/kvvvuu/W3fuu3vvtHf/RHP4errrrqqquuuuqqfxl60IMexFVXXXXVVVddddX/Zddcc82DX/u1X/u93umd3umzAV72ZV+Wq6763+wv//Ivue+++279rd/6re/+0R/90c/hqquuuuqqq6666gVDD3rQg7jqqquuuuqqq676v+iaa6558Du+4zt+1uu8zuu898u+7Mty1VX/1/zlX/4l9913363/8A//8Nu/9Vu/9T3/8A//8NtcddVVV1111VVXPSf0oAc9iKuuuuqqq6666qr/S97xHd/xs17ndV7nva+55poHv+zLvixXXfX/wV/+5V/yW7/1W9/9W7/1W9/zD//wD7/NVVddddVVV1111RXoQQ96EFddddVVV1111VX/F7zjO77jZ73O67zOe19zzTUPftmXfVmuuur/o7/8y7/kt37rt777t37rt77nH/7hH36bq6666qqrrrrq/zv0oAc9iKuuuuqqq6666qr/zd7xHd/xs97pnd7pswFe9mVflquuugr+8i//kt/6rd/67t/6rd/6nn/4h3/4ba666qqrrrrqqv+v0IMe9CCuuuqqq6666qqr/jd6x3d8x896p3d6p88GeNmXfVmuuuqq5/WXf/mX/NZv/dZ3/9Zv/db3/MM//MNvc9VVV1111VVX/X+DHvSgB3HVVVddddVVV131v8nrvM7rvPc7vuM7ftY111zz4Jd92Zflqquu+pf95V/+Jb/1W7/13b/1W7/1Pf/wD//w21x11VVXXXXVVf9foAc96EFcddVVV1111VVX/W/wYi/2Yq/94R/+4d91zTXXPPhlX/Zlueqqq/71fvmXf/nWf/iHf/jtH/3RH/2c++6771auuuqqq6666qr/69CDHvQgrrrqqquuuuqqq/4nu+aaax784R/+4d/1Yi/2Yq/9si/7slx11VX/Pn/5l3/Jfffdd+tv/dZvffeP/uiPfg5XXXXVVVddddX/ZehBD3oQV1111VVXXXXVVf8TXXPNNQ/+8A//8O96sRd7sdd+2Zd9Wa666qr/WH/5l3/Jfffdd+tv/dZvffeP/uiPfg5XXXXVVVddddX/RehBD3oQV1111VVXXXXVVf/TvOM7vuNnvdM7vdNnv+zLvixXXXXVf66//Mu/5L777rv167/+69/nH/7hH36bq6666qqrrrrq/xLK8ePHueqqq6666qqrrvqf4nVe53Xe+yu+4iv+6sVf/MVf+2Vf9mW56qqr/vNdf/31PPzhDz/+6Ec/+r2vueaaB996661/c3h4uMtVV1111VVXXfV/AeX48eNcddVVV1111VVX/Xe75pprHvxJn/RJP/Xmb/7mH/2yL/uyXH/99Vx11VX/ta6//npe9VVf9aVvvvnmt97c3Dz+D//wD7/DVVddddVVV131vx160IMexFVXXXXVVVddddV/l2uuuebBr/3ar/1e7/RO7/TZL/uyL8tVV131P8Nf/uVfct9999369V//9e/zD//wD7/NVVddddVVV131vxXl+PHjXHXVVVddddVVV/13eMd3fMfP+qRP+qSffvEXf/HXftmXfVmuuuqq/zmuv/56Hv7whx8/efLka29ubh7/h3/4h9/hqquuuuqqq67634hy/Phxrrrqqquuuuqqq/4rXXPNNQ/+pE/6pJ96ndd5nfd+2Zd9Wa6//nquuuqq/5ke/vCHHz916tRrv87rvM57Hx0dXbr11lv/mquuuuqqq6666n8TyvHjx7nqqquuuuqqq676r/KO7/iOn/VJn/RJP/3Gb/zGD77++uu56qqr/ue7/vrrefjDH3785ptvfmuAs2fPPuPw8HCXq6666qqrrrrqfwPK8ePHueqqq6666qqrrvrPds011zz4kz7pk37qdV7ndd77ZV/2Zbnqqqv+97n++us5derUa7/iK77iW29ubh7/h3/4h9/hqquuuuqqq676nw496EEP4qqrrrrqqquuuuo/0zu+4zt+1ju90zt99su+7Mty1VVX/d/wl3/5l/zDP/zDb3/913/9+9x33323ctVVV1111VVX/U9FOX78OFddddVVV1111VX/Ga655poHf9InfdJPvc7rvM57v+zLvixXXXXV/x3XX389rbUHv+IrvuJbb25uHv+Hf/iH3+Gqq6666qqrrvqfiMpVV1111VVXXXXVf4J3fMd3/Kx3eqd3+uyXfdmX5aqrrvq/6WVf9mUBHnzNNdd8NsCP/uiPfg5XXXXVVVddddX/NOhBD3oQV1111VVXXXXVVf9Rrrnmmgd/+Id/+He92Iu92Gu/7Mu+LFddddX/D3/5l3/Jfffdd+tnfdZnvc599913K1ddddVVV1111f8UlOPHj3PVVVddddVVV131H+HFXuzFXvsrvuIr/uqN3/iNH3z99ddz1VVX/f9x/fXX8/CHP/z4zTff/Nabm5vH/+Ef/uF3uOqqq6666qqr/iegHD9+nKuuuuqqq6666qp/r3d8x3f8rI/4iI/47pd92Zflqquu+v/r4Q9/+PFTp0699jXXXPPgP/3TP/0Zrrrqqquuuuqq/27oQQ96EFddddVVV1111VX/Vtdcc82DP/zDP/y7XuzFXuy1X/ZlX5arrrrqKoC//Mu/5L777rv1sz7rs17nvvvuu5Wrrrrqqquuuuq/C+X48eNcddVVV1111VVX/Vu82Iu92Gt/xVd8xV+98Ru/8YOvv/56rrrqqqvud/311/Pwhz/8+M033/zWm5ubx//hH/7hd7jqqquuuuqqq/47UI4fP85VV1111VVXXXXVv9Y7vuM7ftZHfMRHfPfLvuzLctVVV131gjz84Q8/furUqdcG+Id/+Iff4aqrrrrqqquu+q+GHvSgB3HVVVddddVVV131orrmmmse/OEf/uHfdebMmQe/8Ru/8YO56qqrrnoR/OVf/iX33XffrZ/1WZ/1Ovfdd9+tXHXVVVddddVV/1WoXHXVVVddddVVV72Irrnmmgd/0zd909Nf9mVflquuuuqqf42XfdmXBXgw8Fuf9Vmf9Tr33XffrVx11VVXXXXVVf8VKMePH+eqq6666qqrrrrqX/JiL/Zir/0VX/EVf/WyL/uyXHXVVVf9Wz384Q8/fvPNN7/15ubm8X/4h3/4Ha666qqrrrrqqv9slOPHj3PVVVddddVVV131wrzjO77jZ33ER3zEd7/sy74sV1111VX/Xg9/+MOPnzp16rUB/uEf/uF3uOqqq6666qqr/jNRjh8/zlVXXXXVVVddddUL8rmf+7m/9Tqv8zrv/bIv+7JcddVVV/1Huf766zl16tRrv/iLv/hr/9Zv/db3cNVVV1111VVX/WehHD9+nKuuuuqqq6666qrnds011zz4kz7pk37qxV7sxV77ZV/2Zbnqqquu+o92/fXX01p78Ou8zuu895/92Z/9zOHh4S5XXXXVVVddddV/NCpXXXXVVVddddVVz+Waa6558Dd90zc9/WVf9mW56qqrrvrP9LIv+7IADwZ+67M+67Ne57777ruVq6666qqrrrrqPxLl+PHjXHXVVVddddVVV93vxV7sxV77K77iK/7qZV/2Zbnqqquu+q/y8Ic//PjNN9/81rfeeuvfnD179lauuuqqq6666qr/KJTjx49z1VVXXXXVVVddBfA6r/M67/1Jn/RJP/WyL/uyXHXVVVf9V3v4wx9+/OTJk6+9ubl5/B/+4R9+h6uuuuqqq6666j8C5fjx41x11VVXXXXVVVe94zu+42e97/u+71e/7Mu+LFddddVV/10e/vCHH2+tPXhzc/P4P/zDP/wOV1111VVXXXXVvxfl+PHjXHXVVVddddVV/799+Id/+He9+Zu/+Ue/7Mu+LFddddVV/90e/vCHHz916tRrA/zDP/zD73DVVVddddVVV/17UI4fP85VV1111VVXXfX/1+d+7uf+1iu+4iu+9cu+7Mty1VVXXfU/xfXXX8+pU6deG+Af/uEffoerrrrqqquuuurfinL8+HGuuuqqq6666qr/nz73cz/3t17sxV7stV/2ZV+Wq6666qr/aa6//npOnTr12gD/8A//8DtcddVVV1111VX/FpTjx49z1VVXXXXVVVf9/3LNNdc8+JM+6ZN+6sVe7MVe+2Vf9mW56qqrrvqf6vrrr+fUqVOvDfAP//APv8NVV1111VVXXfWvRTl+/DhXXXXVVVddddX/H9dcc82D3/Ed3/GzXvEVX/GtX/ZlX5arrrrqqv/prr/+ek6dOvXaAP/wD//wO1x11VVXXXXVVf8alOPHj3PVVVddddVVV/3/cM011zz4wz/8w7/rgz/4g9/6+uuv56qrrrrqf4vrr7+eU6dOvTbAP/zDP/wOV1111VVXXXXVi4py/Phxrrrqqquuuuqq//uuueaaB3/4h3/4d73He7zHa3PVVVdd9b/Q9ddfz6lTp14b4B/+4R9+h6uuuuqqq6666kVBOX78OFddddVVV1111f9t11xzzYM//MM//Lte7MVe7LWvv/56rrrqqqv+t7r++us5derUawP8wz/8w+9w1VVXXXXVVVf9SyjHjx/nqquuuuqqq676v+2TPumTfurFXuzFXvtlX/Zlueqqq6763+7666/n1KlTrw3wD//wD7/DVVddddVVV131wlCOHz/OVVddddVVV131f9fnfu7n/taLvdiLvfbLvuzLctVVV131f8X111/PqVOnXhvgH/7hH36Hq6666qqrrrrqBaEcP36cq6666qqrrrrq/6bP/dzP/a0Xe7EXe+2XfdmX5aqrrrrq/5rrr7+eU6dOvTbAP/zDP/wOV1111VVXXXXV80M5fvw4V1111VVXXXXV/z2f+7mf+1sv9mIv9tov+7Ivy1VXXXXV/1XXX389rbUHHx0dXbr11lv/mquuuuqqq6666rlRjh8/zlVXXXXVVVdd9X/L537u5/7Wi73Yi732y77sy3LVVVdd9X/dwx/+8OOz2eylb7311r85e/bsrVx11VVXXXXVVQ9EOX78OFddddVVV1111f8dH/7hH/5dr/iKr/jWL/uyL8tVV1111f8XD3/4w4+fPHnytf/sz/7sZw4PD3e56qqrrrrqqqvuRzl+/DhXXXXVVVddddX/De/4ju/4WW/+5m/+0S/7si/LVVddddX/Nw9/+MOP33zzzW/9Z3/2Zz9zeHi4y1VXXXXVVVddBUDlqquuuuqqq676P+HFXuzFXvud3umdPvtlX/Zlueqqq676/+qN3/iNHwz81od8yIc8hKuuuuqqq666CoDgqquuuuqqq676X+/FXuzFXvtzP/dzf+tlX/Zlueqqq676/+6aa6558Dd90zc9nauuuuqqq666CoBy/Phxrrrqqquuuuqq/71e7MVe7LU/93M/97de9mVflquuuuqqq+D6669nb2/v+DXXXPPgP/3TP/0Zrrrqqquuuur/N8rx48e56qqrrrrqqqv+d7rmmmse/BVf8RV/9bIv+7JcddVVV131bNdffz3z+fylAf7hH/7hd7jqqquuuuqq/78ox48f56qrrrrqqquu+t/pkz7pk37qjd/4jR/MVVddddVVz+P666+ntfbgW2+99W/Onj17K1ddddVVV131/xPl+PHjXHXVVVddddVV//t87ud+7m+92Iu92Gtff/31XHXVVVdd9fw9/OEPP37y5MnX/rM/+7OfOTw83OWqq6666qqr/v+hctVVV1111VVX/a/zju/4jp/1Yi/2Yq/9si/7slx11VVXXfXCvfEbv/GDgd/6kA/5kIdw1VVXXXXVVf//UI4fP85VV1111VVXXfW/x4u92Iu99kd8xEd898u+7Mty1VVXXXXVi2Zvb+/4Nddc8+A//dM//Rmuuuqqq6666v8XyvHjx7nqqquuuuqqq/53uOaaax78FV/xFX/1si/7slx11VVXXfWiu/7665nP5y8N8A//8A+/w1VXXXXVVVf9/0E5fvw4V1111VVXXXXV/w6f9Emf9FNv/MZv/GCuuuqqq676V7v++utprT341ltv/ZuzZ8/eylVXXXXVVVf9/0Bw1VVXXXXVVVf9r/C5n/u5v/ViL/Zir81VV1111VX/Zm/8xm/84A//8A//Lq666qqrrrrq/w+Cq6666qqrrrrqf7x3fMd3/KwXe7EXe+2XfdmX5aqrrrrqqn+fa6655sEf/uEf/l1cddVVV1111f8PlOPHj3PVVVddddVVV/3P9WIv9mKv/REf8RHf/bIv+7JcddVVV13173f99dczn89f+uzZs8+49dZb/5qrrrrqqquu+r+Ncvz4ca666qqrrrrqqv+5PvdzP/e3XuM1XuM4V1111VVX/Ye5/vrrmc1mL/1nf/ZnP3N4eLjLVVddddVVV/3fRTl+/DhXXXXVVVddddX/TJ/7uZ/7Ww95yENe+vrrr+eqq6666qr/WA9/+MOPz+fzl/6t3/qt7+Gqq6666qqr/u+iHD9+nKuuuuqqq6666n+eF3uxF3vtd3qnd/rsl33Zl+Wqq6666qr/HK21BwP8wz/8w+9w1VVXXXXVVf83UY4fP85VV1111VVXXfU/yzXXXPPgr/iKr/irl33Zl+Wqq6666qr/PNdffz2ttQffeuutf3P27Nlbueqqq6666qr/eyjHjx/nqquuuuqqq676n+WTPumTfuqN3/iNH8xVV1111VX/6R7+8Icfb609+Ld+67e+h6uuuuqqq676v4dy/Phxrrrqqquuuuqq/zne8R3f8bNe53Ve572vv/56rrrqqquu+q/RWnvwNddc8+A//dM//Rmuuuqqq6666v8WyvHjx7nqqquuuuqqq/5neLEXe7HX/oiP+IjvftmXfVmuuuqqq676r3P99dezt7d3/NZbb/2bs2fP3spVV1111VVX/d9BcNVVV1111VVX/Y/x4R/+4d/1si/7slx11VVXXfVf743f+I0f/OEf/uHfxVVXXXXVVVf930Jw1VVXXXXVVVf9j/CO7/iOn3XNNdc8mKuuuuqqq/7bXHPNNQ9+x3d8x8/iqquuuuqqq/7voBw/fpyrrrrqqquuuuq/14u92Iu99kd8xEd898u+7Mty1VVXXXXVf5/rr7+e1tqDn/GMZ/zNfffddytXXXXVVVdd9b8fwVVXXXXVVVdd9d/und7pnT7rZV/2Zbnqqquuuuq/3xu/8Rs/+B3f8R0/m6uuuuqqq676v4Hgqquuuuqqq676b/U6r/M67/1iL/Zir81VV1111VX/Y7zYi73Ya73O67zOe3PVVVddddVV//sRXHXVVVddddVV/22uueaaB3/4h3/4d73sy74sV1111VVX/c/xsi/7srzjO77jZ3HVVVddddVV//sRXHXVVVddddVV/20+/MM//Lte9mVflquuuuqqq/7nueaaax784R/+4d/FVVddddVVV/3vRnDVVVddddVVV/23eJ3XeZ33frEXe7HX5qqrrrrqqv+RXvZlX5YXe7EXe+0Xe7EXe22uuuqqq6666n8vyvHjx7nqqquuuuqqq/7rfcVXfMVfvezLvixXXXXVVVf9z/Xwhz/8eGvtwb/1W7/1PVx11VVXXXXV/04EV1111VVXXXXVf7kP//AP/y6uuuqqq676X+HFXuzFXvvFXuzFXpurrrrqqquu+t+J4Kqrrrrqqquu+i91zTXXPPh1Xud13vtlX/Zlueqqq6666n++l33Zl+XDP/zDv4urrrrqqquu+t+J4Kqrrrrqqquu+i/14R/+4d/1si/7slx11VVXXfW/xzXXXPPg13md13lvrrrqqquuuup/H4Krrrrqqquuuuq/zIu92Iu99ou92Iu9NlddddVVV/2v8rIv+7K80zu902dz1VVXXXXVVf/7EFx11VVXXXXVVf9l3umd3umzXvZlX5arrrrqqqv+9zlz5syDPvzDP/y7uOqqq6666qr/XQiuuuqqq6666qr/Eq/zOq/z3i/2Yi/22lx11VVXXfW/0su+7MvyYi/2Yq/9Yi/2Yq/NVVddddVVV/3vQXDVVVddddVVV/2XeMd3fMfPetmXfVmuuuqqq6763+uN3/iNH/w6r/M678VVV1111VVX/e9BcNVVV1111VVX/ad7x3d8x8+65pprHsxVV1111VX/673Yi73Ya7/Yi73Ya3PVVVddddVV/zsQXHXVVVddddVV/+ne6Z3e6bNf9mVflquuuuqqq/73u+aaax78Oq/zOu/FVVddddVVV/3vQHDVVVddddVVV/2n+vAP//Dv4qqrrrrqqv8zXvZlX5YXe7EXe+1rrrnmwVx11VVXXXXV/3wEV1111VVXXXXVf6rXeZ3Xee+XfdmX5aqrrrrqqv87rrnmmge/4zu+42dx1VVXXXXVVf/zEVx11VVXXXXVVf9pPvzDP/y7uOqqq6666v+cl33Zl+XFXuzFXvuaa655MFddddVVV131PxvBVVddddVVV131n+Z1Xud13vtlX/Zlueqqq6666v+ea6655sHv+I7v+FlcddVVV1111f9sBFddddVVV1111X+Kd3zHd/wsrrrqqquu+j/rZV/2ZXnxF3/x17nmmmsezFVXXXXVVVf9z0U5fvw4V1111VVXXXXVf7zP/dzP/e2XfdmX5aqrrrrqqv+79vb2jm9ubh7/0z/905/hqquuuuqqq/5nonLVVVddddVVV/2He8d3fMfP4qqrrrrqqv/zXvZlX5b77rvvtbnqqquuuuqq/7kIrrrqqquuuuqq/3Dv9E7v9Nkv+7Ivy1VXXXXVVf/3XXPNNQ9+ndd5nffmqquuuuqqq/5nIrjqqquuuuqqq/5DveM7vuNncdVVV1111f8bL/uyL8s7vuM7fhZXXXXVVVdd9T8TwVVXXXXVVVdd9R/qdV7ndd77ZV/2Zbnqqquuuur/j2uuuebBL/ZiL/baXHXVVVddddX/PARXXXXVVVddddV/mNd5ndd572uuuebBXHXVVVdd9f/Ky77sy/JO7/ROn8VVV1111VVX/c9DcNVVV1111VVX/Yd5ndd5nfd62Zd9Wa666qqrrvr/58yZMw++5pprHsxVV1111VVX/c9CcNVVV1111VVX/Yd4sRd7sdd+sRd7sdfmqquuuuqq/5euueaaB7/jO77jZ3HVVVddddVV/7NQueqqq6666qqr/kO8zuu8znu97Mu+LFddddVVV/3/9LIv+7Lcd999r81VV1111VVX/c9CcNVVV1111VVX/Yd4ndd5nffmqquuuuqq/9euueaaB7/4i7/4a3PVVVddddVV/3MQXHXVVVddddVV/26v8zqv895cddVVV131/97LvuzL8o7v+I6fzVVXXXXVVVf9z0Hlqquuuuqqq676d3vHd3zHz3rZl31Zrrrqqquuuuqaa655MFddddVVV131PwfBVVddddVVV1317/JiL/Zir33NNdc8mKuuuuqqq64Czpw586B3fMd3/Cyuuuqqq6666n8Ggquuuuqqq6666t/ldV7ndd7rZV/2ZbnqqquuuuoqgJd92ZfldV7ndd6bq6666qqrrvqfgeCqq6666qqrrvp3eZ3XeZ335qqrrrrqqqse4Jprrnnwi73Yi702V1111VVXXfXfj+Cqq6666qqrrvo3e53XeZ335qqrrrrqqquejxd7sRd7La666qqrrrrqvx/BVVddddVVV131b/Y6r/M67/WyL/uyXHXVVVddddUDvezLviyv8zqv895cddVVV1111X8/gquuuuqqq6666t/sxV7sxV6bq6666qqrrno+rrnmmge/2Iu92Gtz1VVXXXXVVf+9CK666qqrrrrqqn+Td3zHd/wsrrrqqquuuuoFeNmXfVle53Ve57246qqrrrrqqv9eVK666qqrrrrqqn+T13md13nvl33Zl+Wqq6666qqrXpAXe7EXe22uuuqqq6666r8XwVVXXXXVVVdd9a/2Oq/zOu99zTXXPJirrrrqqquueiGuueaaB7/Yi73Ya3PVVVddddVV/30Irrrqqquuuuqqf7UzZ8486GVf9mW56qqrrrrqqn/Ji73Yi70WV1111VVXXfXfh+Cqq6666qqrrvpXe53XeZ335qqrrrrqqqv+BS/7si/L67zO67w3V1111VVXXfXfh+Cqq6666qqrrvpXeZ3XeZ33vuaaax7MVVddddVVV70Irrnmmge/+Iu/+Gtz1VVXXXXVVf89qFx11VVXXXXVVf8qL/ZiL/ZaXHXVVVddddW/wpkzZx7MVVddddVVV/33ILjqqquuuuqqq/5VXuzFXuy1X/ZlX5arrrrqqquuelG87Mu+LK/zOq/z3lx11VVXXXXVfw8qV1111VVXXXXVv8o111zzYK666qqrrrrqX+Gaa655MFddddVVV13134Pgqquuuuqqq656kb3O67zOe3PVVVddddVV/0pnzpx50Iu92Iu9NlddddVVV131X4/gqquuuuqqq656kb3Yi73Ya73sy74sV1111VVXXfWv8bIv+7K82Iu92Gtx1VVXXXXVVf/1CK666qqrrrrqqhfZ67zO67w3V1111VVXXfVv8OIv/uKvzVVXXXXVVVf916Ny1VVXXXXVVVe9SF7sxV7stbnqqquuuuqqf6MzZ848mKuuuuqqq676r0dw1VVXXXXVVVe9SF7ndV7nvV72ZV+Wq6666qqrrvq3uOaaax78Yi/2Yq/NVVddddVVV/3XIrjqqquuuuqqq14kL/ZiL/baXHXVVVddddW/w4u92Iu9FlddddVVV131X4vgqquuuuqqq656kVxzzTUP5qqrrrrqqqv+jV72ZV+WF3/xF39trrrqqquuuuq/FpWrrrrqqquuuupf9Dqv8zrvzVVXXXXVVVf9O505c+bBXHXVVVddddV/LYKrrrrqqquuuupf9GIv9mKv9bIv+7JcddVVV1111b/HNddc8+AXe7EXe22uuuqqq6666r8OwVVXXXXVVVdd9S96sRd7sdfmqquuuuqqq/4DvNiLvdhrcdVVV1111VX/dQiuuuqqq6666qp/0TXXXPNgrrrqqquuuurf6WVf9mV58Rd/8dfmqquuuuqqq/7rULnqqquuuuqqq16o13md13lvrrrqqquuuuo/yJkzZx7MVVddddVVV/3XoXLVVVddddVVV71QL/ZiL/ZaL/uyL8tVV1111VVX/Ue45pprHsxVV1111VVX/dchuOqqq6666qqrXqgXe7EXe22uuuqqq6666j/Qi73Yi702V1111VVXXfVfg+Cqq6666qqrrrrqqquuuuqq/1LXXHPNg7nqqquuuuqq/xpUrrrqqquuuuqqF+qaa655MFddddVVV131H+RlX/ZlOXPmzIO46qqrrrrqqv8aBFddddVVV1111Qv0Oq/zOu/NVVddddVVV/0He/EXf/HX5qqrrrrqqqv+a1C56qqrrrrqqqteoDNnzjyIq6666qqrrvoPdubMmQdz1VVXXXXVVf81CK666qqrrrrqqhfommuuefDLvuzLctVVV1111VX/ka655poHX3PNNQ/mqquuuuqqq/7zEVx11VVXXXXVVS/Qi73Yi702V1111VVXXfWf4JprrnkwV1111VVXXfWfj+Cqq6666qqrrnqBrrnmmgdz1VVXXXXVVf8JHvvYx74WV1111VVXXfWfj+Cqq6666qqrrnq+Xud1Xue9ueqqq6666qr/BC/7si/LVVddddVVV/0XIbjqqquuuuqqq6666qqrrrrqv9yLv/iLvw5XXXXVVVdd9Z+PylVXXXXVVVdd9Xy92Iu92Gu97Mu+LFddddVVV1111VVXXXXVVf+LUbnqqquuuuqqq6666qqrrrrqv9w111zzYK666qqrrrrqPx+Vq6666qqrrrrq+XqxF3ux1+aqq6666qqr/pOcOXPmQVx11VVXXXXVfz6Cq6666qqrrrrq+brmmmsezFVXXXXVVVf9J3qxF3ux1+aqq6666qqr/nNRueqqq6666qqrrrrqqquuuuqqq6666qqr/q8iuOqqq6666qqrnseLvdiLvTZXXXXVVVdd9Z/sxV7sxV6Lq6666qqrrvrPRXDVVVddddVVVz2Pa6655sFcddVVV1111X+il33Zl+Wqq6666qqr/gtQueqqq6666qqrnseZM2cexFVXXXXVVVddddVVV1111f9+VK666qqrrrrqqudxzTXXPPhlX/Zlueqqq6666qr/TNdcc82Dueqqq6666qr/XFSuuuqqq6666qqrrrrqqquu+m9xzTXXPJirrrrqqquu+s9F5aqrrrrqqquueh7XXHPNg7nqqquuuuqqq6666qqrrvrfj8pVV1111VVXXfU8zpw582Cuuuqqq6666j/ZmTNnHsxVV1111VVX/eeictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquueh7XXHPNg7nqqquuuuqq/2TXXHPNg7nqqquuuuqq/1xUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6sIrrrqqquuuuqq53DNNdc8mKuuuuqqq676L3LNNdc8mKuuuuqqq676z0Plqquuuuqqq656DmfOnHkwV1111VVXXXXVVVddddVV/zdQueqqq6666qqrnsM111zzYK666qqrrrrqqquuuuqqq/5voHLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FcFVV1111VVXXXXVVVddddVV/23OnDnzYK666qqrrrrqPw+Vq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVczhz5syDuOqqq6666qqrrrrqqquu+r+BylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqqv+25w9e/ZWrrrqqquuuuo/D5Wrrrrqqquuuup5vOzLvixXXXXVVVddddVVV1111VX/BxBcddVVV1111VXP4y//8i+56qqrrrrqqquuuuqqq676P4DKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq/7b3Hfffbdy1VVXXXXVVf95qFx11VVXXXXVVc/h7Nmzz+Cqq6666qqrrrrqqquuuur/BipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquu+m9x33333cpVV1111VVX/eeictVVV1111VVXPYf77rvvVq666qqrrrrqqquuuuqqq/5voHLVVVddddVVV1111VVXXXXVf4uzZ8/eylVXXXXVVVf956Jy1VVXXXXVVVddddVVV1111X+5YRi47777buWqq6666qqr/nNRueqqq6666qqrrrrqqquuuuq/3DAMXHXVVVddddV/ASpXXXXVVVddddVzOHv27K1cddVVV1111X+y9XrNfffddytXXXXVVVdd9Z+LylVXXXXVVVddddVVV1111VX/5Z7xjGdw9uzZZ3DVVVddddVV/7moXHXVVVddddVVz+G+++67lauuuuqqq6666qqrrrrqqv8bCK666qqrrrrqqudx33333cpVV1111VVX/Sf7h3/4h9/mqquuuuqqq/5zEVx11VVXXXXVVc/j7Nmzt3LVVVddddVVV1111VVXXfW/H5Wrrrrqqquuuuqqq6666qqr/sv9wz/8w2/fd999t3LVVVddddVV/7moXHXVVVddddVVz+O+++67lauuuuqq/2S//Mu/fOvZs2dv5ar/lz7zMz/zdbjqqquuuuqq/3xUrrrqqquuuuqq53Hffffd+pd/+Ze87Mu+LFddddVV/xn+8i//kn/4h3/47a//+q9/H6666qqrrrrqqqv+81C56qqrrrrqqquuuuqqq/5b/NZv/db3cNVVV1111VVXXfWfi8pVV1111VVXXfU8/uEf/uF3uOqqq676T/YP//APv81VV1111VVXXXXVfy4qV1111VVXXXXV8zh79uytXHXVVVf9J/qt3/qt7+aqq6666qqrrrrqPx+Vq6666qqrrrrqqquuuuq/1F/+5V/yD//wD7/DVVddddVVV1111X8+gquuuuqqq6666nncd999t9533323ctVVV131n+Qf/uEffpurrrrqqquuuuqq/3wEV1111VVXXXXV83X27Nlbueqqq676T3LffffdylVXXXXVVVddddV/PoKrrrrqqquuuur5+vu///vf5qqrrrrqP8Fv/dZvfQ9XXXXVVVddddVV/zUIrrrqqquuuuqqF+gv//Ivueqqq676j/SXf/mX/MM//MNvc9VVV1111VVXXfVfg8pVV1111VVXXfV8/cM//MPvcNVVV131n+C3fuu3vpurrrrqqquuuuqq/xpUrrrqqquuuuqq5+vs2bO3ctVVV131H+y3fuu3vpurrrrqqquuuuqq/zoEV1111VVXXXXVC3TffffdylVXXXXVf5C//Mu/5B/+4R9+h6uuuuqqq6666qr/OgRXXXXVVVddddXzdd9999169uzZW7nqqquu+g/0D//wD7/NVVddddVVV1111X8dgquuuuqqq6666gX6+7//+9/mqquuuuo/0H333XcrV1111VVXXXXVVf91CK666qqrrrrqqhfoH/7hH37nL//yL7nqqquu+o/wW7/1W9/NVVddddVVV1111X8tKlddddVVV1111Qt09uzZW7nqqquu+g/wl3/5l/zDP/zD73DVVVddddVVV131X4vKVVddddVVV1111VVXXfVf4h/+4R9+m6uuuuqqq6666qr/WgRXXXXVVVddddULdN999936D//wD7/NVVddddW/02/91m9993333XcrV1111VVXXXXVVf+1CK666qqrrrrqqhfq7//+73+bq6666qp/h7/8y7/kH/7hH36Hq6666qqrrrrqqv96BFddddVVV1111Qv1D//wD7/zl3/5l1x11VVX/Xv8wz/8w29z1VVXXXXVVVdd9V+PylVXXXXVVVdd9UKdPXv2Vq666qqr/p3uu+++W7nqqquuuuqqq676r0dw1VVXXXXVVVe9UPfdd9+t9913361cddVVV/0b/dZv/dZ3c9VVV1111VVXXfXfg+Cqq6666qqrrvoXnT179lauuuqqq/4N/vIv/5J/+Id/+B2uuuqqq6666qqr/nsQXHXVVVddddVV/6Lf+q3f+p6//Mu/5Kqrrrrq3+If/uEffpurrrrqqquuuuqq/x5Urrrqqquuuuqqf9E//MM//DZXXXXVVf8G//AP//A79913361cddVVV1111VVX/fcguOqqq6666qqr/kX33Xffrffdd9+tXHXVVVf9K/zlX/4l9913361cddVVV1111VVX/fchuOqqq6666qqrXiRnz569lauuuuqqf6Xf+q3f+m6uuuqqq6666qqr/vsQXHXVVVddddVVL5If+ZEf+Zy//Mu/5KqrrrrqX+Mf/uEffpurrrrqqquuuuqq/z5UrrrqqquuuuqqF8nZs2dv5aqrrrrqX+G3fuu3vpurrrrqqquuuuqq/14EV1111VVXXXXVi+S+++679R/+4R9+m6uuuuqqF8Ff/uVf8g//8A+/w1VXXXXVVVddddV/L4KrrrrqqquuuupF9vd///e/zVVXXXXVi+gf/uEffpurrrrqqquuuuqq/14EV1111VVXXXXVi+wf/uEffucv//Ivueqqq656Udx33323ctVVV1111VVXXfXfi+Cqq6666qqrrnqR/cM//MNv/8M//MNvc9VVV131L/it3/qt7+aqq6666qqrrrrqvx+Vq6666qqrrrrqX+W+++67lauuuuqqF+Iv//Iv+Yd/+Iff4aqrrrrqqquuuuq/H8FVV1111VVXXfWv8lu/9Vvf85d/+ZdcddVVV70wv/Vbv/XdXHXVVVddddVVV/33o3LVVVddddVVV/2rnD179lauuuqqq16I3/qt3/purrrqqquuuuqqq/5nILjqqquuuuqqq/5V7rvvvlv/4R/+4be56qqrrno+/vIv/5J/+Id/+B2uuuqqq6666qqr/mcguOqqq6666qqr/tV+5Ed+5HP+8i//kquuuuqq5+cf/uEffpurrrrqqquuuuqq/xmoXHXVVVddddVV/2pnz569lauuuuqqF+C+++67lauuuuqqq6666qr/GQiuuuqqq6666qp/tfvuu+/W3/qt3/purrrqqquey2/91m99N1ddddVVV1111VX/cxBcddVVV1111VX/Jr/1W7/1PX/5l3/JVVddddX9/vIv/5J/+Id/+B2uuuqqq6666qqr/ucguOqqq6666qqr/k3+4R/+4bf/4R/+4be56qqrrnqAf/iHf/htrrrqqquuuuqqq/7nILjqqquuuuqqq/7N/v7v//63//Iv/5KrrrrqKoDf+q3f+p777rvvVq666qqrrrrqqqv+5yC46qqrrrrqqqv+zX77t3/7e7jqqquuAv7yL/+S++677+lcddVVV1111VVX/c9CcNVVV1111VVX/Zvdd999t/7DP/zDb3PVVVddBfzDP/zD73DVVVddddVVV131PwvBVVddddVVV1317/Jbv/Vb3/OXf/mXXHXVVVf9wz/8w29z1VVXXXXVVVdd9T8Llauuuuqqq6666t/lH/7hH36bq6666v+93/qt3/purrrqqquuuuqqq/7nIbjqqquuuuqqq/5d7rvvvlt/67d+67u56qqr/t/6y7/8S/7hH/7hd7jqqquuuuqqq676n4fgqquuuuqqq676d/vRH/3Rz/nLv/xLrrrqqv+//uEf/uG3ueqqq6666qqrrvqfh+Cqq6666qqrrvp3u++++279h3/4h9/mqquu+n/rvvvuu5Wrrrrqqquuuuqq/3kIrrrqqquuuuqq/xA/8iM/8jl/+Zd/yVVXXfX/z2/91m99N1ddddVVV1111VX/MxFcddVVV1111VX/If7hH/7ht//hH/7ht7nqqqv+X/nLv/xLfuu3fut7uOqqq6666qqrrvqfieCqq6666qqrrvoP81u/9Vvf85d/+ZdcddVV/7/8wz/8w29z1VVXXXXVVVdd9T8Tlauuuuqqq6666j/MP/zDP/w2V1111f8rv/Vbv/XdXHXVVVddddVVV/3PRXDVVVddddVVV/2Hue+++279rd/6re/+y7/8S6666qr/+/7yL/+Sf/iHf/gdrrrqqquuuuqqq/7nIrjqqquuuuqqq/5D/eiP/ujncNVVV/2/8Q//8A+/zVVXXXXVVVddddX/XARXXXXVVVddddV/qPvuu+/W3/qt3/ruv/zLv+Sqq676v+++++67lauuuuqqq6666qr/uQiuuuqqq6666qr/cD/6oz/6OVx11VX/5/3Wb/3Wd3PVVVddddVVV131PxvBVVddddVVV131H+6+++679bd+67e++y//8i+56qqr/m/6y7/8S/7hH/7hd7jqqquuuuqqq676n43gqquuuuqqq676T/GjP/qjn8NVV131f9pv/dZvfTdXXXXVVVddddVV/7MRXHXVVVddddVV/ynuu+++W3/rt37ru//yL/+Sq6666v+e3/qt3/oerrrqqquuuuqqq/7nI7jqqquuuuqqq/7T/OiP/ujncNVVV/2f85d/+Zf8wz/8w29z1VVXXXXVVVdd9T8fwVVXXXXVVVdd9Z/mvvvuu/W3fuu3vvsv//Ivueqqq/5v+Yd/+Iff5qqrrrrqqquuuup/PoKrrrrqqquuuuo/1Y/+6I9+DlddddX/Offdd9+tXHXVVVddddVVV/3PR3DVVVddddVVV/2nuu+++279+q//+vf5y7/8S6666qr/G37rt37ru7nqqquuuuqqq67634Hgqquuuuqqq676T/cP//APv33ffffdylVXXfW/3l/+5V/yD//wD7/DVVddddVVV1111f8OBFddddVVV1111X+6++6779Yf/dEf/Zy//Mu/5Kqrrvrf7x/+4R9+m6uuuuqqq6666qr/HQiuuuqqq6666qr/Ev/wD//w2//wD//w21x11VX/q/3Wb/3Wd9933323ctVVV1111VVXXfW/A8FVV1111VVXXfVf4r777rv1R37kRz7nL//yL7nqqqv+d/rLv/xLrrrqqquuuuqqq/6XIbjqqquuuuqqq/7L/MM//MNv/8M//MNvc9VVV/2v9Vu/9Vvfw1VXXXXVVVddddX/HgRXXXXVVVddddV/qa//+q9/n7/8y7/kqquu+t/pH/7hH36bq6666qqrrrrqqv89KMePH+eqq6666qqrrvqvc3h4uAtw6tSp177++uu56qqr/vf4wR/8we/+0z/905/hqquuuuqqq6666n8Pgquuuuqqq6666r/cb//2b3/PfffddytXXXXV/xp/+Zd/yT/8wz/8DlddddVVV1111VX/uxBcddVVV1111VX/5e67775bv/7rv/59/vIv/5Krrrrqf49/+Id/+G2uuuqqq6666qqr/nchuOqqq6666qqr/lv8wz/8w2//1m/91nf/5V/+JVddddX/Dvfdd9+tXHXVVVddddVVV/3vQnDVVVddddVVV/23+dEf/dHP4aqrrvpf4bd+67e+m6uuuuqqq6666qr/fQiuuuqqq6666qr/Nvfdd9+tX//1X/8+f/mXf8lVV131P9df/uVf8g//8A+/w1VXXXXVVVddddX/PgRXXXXVVVddddV/q9/6rd/67n/4h3/4ba666qr/0X7rt37ru7nqqquuuuqqq67634fgqquuuuqqq676b/f1X//17/OXf/mXXHXVVf8z/dZv/db3cNVVV1111VVXXfW/E8FVV1111VVXXfXf7r777rv167/+69/nL//yL7nqqqv+Z/nLv/xL/uEf/uG3ueqqq6666qqrrvrfieCqq6666qqrrvof4bd+67e++x/+4R9+m6uuuup/nH/4h3/4ba666qqrrrrqqqv+dyK46qqrrrrqqqv+x/j6r//69/nLv/xLrrrqqv9Z7rvvvlu56qqrrrrqqquu+t+J4Kqrrrrqqquu+h/jvvvuu/Xrv/7r3+cv//Ivueqqq/5n+K3f+q3v5qqrrrrqqquuuup/L8rx48e56qqrrrrqqqv+57j11lv/+pprrnnwfD5/6euvv56rrrrqv89f/uVf8gu/8Atfc+utt/41V1111VVXXXXVVf87EVx11VVXXXXVVf/j/OiP/ujn3Hfffbdy1VVX/bf7h3/4h9/mqquuuuqqq6666n8vgquuuuqqq6666n+c++6779av//qvf5+//Mu/5Kqrrvrv81u/9Vvffd99993KVVddddVVV1111f9elOPHj3PVVVddddVVV/3Pc/bs2VsBTp069drXX389V1111X+tv/zLv+RP//RPf/of/uEffoerrrrqqquuuuqq/70Irrrqqquuuuqq/7F++7d/+3v+4R/+4bf/8i//kquuuuq/3m//9m9/D1ddddVVV1111VX/uxFcddVVV1111VX/Y9133323fv3Xf/373Hfffbdy1VVX/Ze77777buWqq6666qqrrrrqfzeCq6666qqrrrrqf7T77rvv1s/8zM987b/8y7/kqquu+q/zW7/1W9/NVVddddVVV1111f9+BFddddVVV1111f94Z8+efcbXf/3Xv89f/uVfctVVV/3n+8u//Ev+4R/+4Xe46qqrrrrqqquu+t+PylVXXXXVVVdd9b/Cb/3Wb333mTNnHgR89su+7Mty1VVX/ef6h3/4h9/mqquuuuqqq6666n8/gquuuuqqq6666n+N3/7t3/6ef/iHf/htrrrqqv9U991336333XffrVx11VVXXXXVVVf970dw1VVXXXXVVVf9r3Hffffd+vVf//Xv88u//Mu3ctVVV/2n+Yd/+Iff5qqrrrrqqquuuur/BoKrrrrqqquuuup/lfvuu+/Wz/qsz3qdv/zLv+Sqq676j/eXf/mX/NZv/db3cNVVV1111VVXXfV/A8FVV1111VVXXfW/zn333Xfr13/917/PX/7lX3LVVVf9x/uHf/iH3+aqq6666qqrrrrq/wYqV1111VVXXXXV/0q/9Vu/9d1nzpx5EPDZL/uyL8tVV131H+O3fuu3voerrrrqqquuuuqq/zuoXHXVVVddddVV/2v96I/+6OdwxWe/7Mu+LFddddW/z1/+5V/yD//wD7/NVVddddVVV1111f8dBFddddVVV1111f9qv/3bv/09//AP//Dbf/mXf8lVV1317/cP//APv81VV1111VVXXXXV/x0EV1111VVXXXXV/2r33XffrV//9V//Pv/wD//w21x11VX/bvfdd9+tXHXVVVddddVVV/3fQXDVVVddddVVV/2vd99999369V//9e/zy7/8y7dy1VVX/Zv91m/91ndz1VVXXXXVVVdd9X8LwVVXXXXVVVdd9X/Cfffdd+tnfuZnvvYv//Iv38pVV131r/aXf/mX/MM//MPvcNVVV1111VVXXfV/C8FVV1111VVXXfV/xtmzZ5/xWZ/1Wa/zl3/5l1x11VX/er/1W7/13Vx11VVXXXXVVVf930Jw1VVXXXXVVVf9n3Lffffd+iEf8iEP+cu//EuuuuqqF91v/dZvfTdXXXXVVVddddVV//cQXHXVVVddddVV/+fcd999t37913/9+/zlX/4lV1111b/sL//yL/mHf/iH3+Gqq6666qqrrrrq/x4qV1111VVXXXXV/0m/9Vu/9d0AH/7hH/5dL/uyL8tVV131wv3DP/zDb3PVVVddddVVV131fw+Vq6666qqrrrrq/6zf+q3f+m6AD//wD/+ul33Zl+Wqq656we67775bueqqq6666qqrrvq/h3L8+HGuuuqqq6666qr/u2699da/Pnv27DNuvvnmt77++uu56qqrntcP/uAPfvef/umf/gxXXXXVVVddddVV//dQjh8/zlVXXXXVVVdd9X/brbfe+tdnz559xs033/zW119/PVddddWz/eVf/iW/8Au/8DW33nrrX3PVVVddddVVV131fw+Vq6666qqrrrrq/4Xf+q3f+m6AD//wD/+ul33Zl+Wqq656tn/4h3/4ba666qqrrrrqqqv+byK46qqrrrrqqqv+3/it3/qt7/7Mz/zM1/nLv/xLrrrqqit+67d+67vvu+++W7nqqquuuuqqq676v4ngqquuuuqqq676f+Uf/uEffvuDP/iDH/yXf/mXXHXV/3d/+Zd/yVVXXXXVVVddddX/cQRXXXXVVVddddX/O2fPnn3Gh3zIhzzkL//yL7nqqv/vfuu3fut7uOqqq6666qqrrvq/i+Cqq6666qqrrvp/6b777rv1Qz7kQx7yy7/8y7dy1VX/j/3DP/zDb3PVVVddddVVV131fxeVq6666qqrrrrq/6377rvv1s/6rM96HeC3rrnmmge/7Mu+LFdd9f/Jb/3Wb30PV1111VVXXXXVVf+3UY4fP85VV1111VVXXfX/1+Hh4e6f/dmf/czm5ubx+Xz+0tdffz1XXfX/wV/+5V/yC7/wC19z6623/jVXXXXVVVddddVV/3dRjh8/zlVXXXXVVVdd9f/b4eHh7tOf/vS/Pjw83D116tRrX3/99Vx11f91d999N9/1Xd/1MYeHh7tcddVVV1111VVX/d9F5aqrrrrqqquuugo4e/bsM370R3/0c7jis1/2ZV+Wq676v+6+++67lauuuuqqq6666qr/26hcddVVV1111VVXPcCP/uiPfg5XfPbLvuzLctVV/1f91m/91ndz1VVXXXXVVVdd9X8fwVVXXXXVVVddddVz+dEf/dHP+ZAP+ZCH/PIv//KtXHXV/0F/+Zd/yT/8wz/8DlddddVVV1111VX/91G56qqrrrrqqquuej7uu+++Wz/zMz/ztYHfvuaaax78si/7slx11f8lv/Vbv/XdXHXVVVddddVVV/3fRzl+/DhXXXXVVVddddVVz8/R0dGlP/uzP/uZw8PD3VOnTr329ddfz1VX/V/wgz/4g9/9p3/6pz/DVVddddVVV1111f99VK666qqrrrrqqqteiPvuu+/WH/3RH/0crvjsl33Zl+Wqq/43+8u//Ev+4R/+4Xe46qqrrrrqqquu+v+B4KqrrrrqqquuuupF8KM/+qOf85mf+Zmv85d/+ZdcddX/dv/wD//w21x11VVXXXXVVVf9/0Bw1VVXXXXVVVdd9SL6h3/4h9/+4A/+4Af/8i//8q1/+Zd/yVVX/W9133333cpVV1111VVXXXXV/w+U48ePc9VVV1111VVXXfWiOjo6uvRnf/ZnP3N4eLh76tSp177++uu56qr/TX7wB3/wu//0T//0Z7jqqquuuuqqq676/4Fy/Phxrrrqqquuuuqqq/41Dg8Pd//hH/7hd/7hH/7hd06ePPnaD3/4w49z1VX/C/zlX/4lv/ALv/A1t956619z1VVXXXXVVVdd9f8D5fjx41x11VVXXXXVVVf9W5w9e/bWP/uzP/uZ+Xz+0q21B19//fVcddX/ZHfffTff9V3f9TGHh4e7XHXVVVddddVVV/3/QDl+/DhXXXXVVVddddVV/1aHh4e7f//3f//bh4eHu6dOnXrt66+/nquu+p/qB3/wB7/7t37rt76Hq6666qqrrrrqqv8/KMePH+eqq6666qqrrrrq3+Po6OjSP/zDP/zOb//2b3/PzTff/NZ7e3vHr7/+eq666n+Sv/zLv+RP//RPf/of/uEffoerrrrqqquuuuqq/z8ox48f56qrrrrqqquuuuo/wuHh4e6f/dmf/czh4eHuqVOnXvv666/nqqv+p7j77rv5hm/4hvc5PDzc5aqrrrrqqquuuur/D/SgBz2Iq6666qqrrrrqqv9oZ86cedDnfu7n/vY111zz4Jd92Zflqqv+u/3lX/4lb/d2byeuuuqqq6666qqr/n+hHD9+nKuuuuqqq6666qr/aEdHR5f+7M/+7GcODw93T5069drXX389V1313+kHf/AHv+dP//RPf5qrrrrqqquuuuqq/18ox48f56qrrrrqqquuuuo/w+Hh4e4//MM//M5v//Zvf8/NN9/81nt7e8evv/56rrrqv9pf/uVf8gu/8Atfc+utt/41V1111VVXXXXVVf+/UI4fP85VV1111VVXXXXVf6bDw8PdP/uzP/uZw8PD3VOnTr329ddfz1VX/Ve6++67+a7v+q6POTw83OWqq6666qqrrrrq/xfK8ePHueqqq6666qqrrvrPdnh4uPsP//APv/Pbv/3b3zOfz1+6tfbg66+/nquu+q/wN3/zN7f+6I/+6Odw1VVXXXXVVVdd9f8P5fjx41x11VVXXXXVVVf9Vzk8PNz9h3/4h985PDzcPXXq1GvffffdXH/99Vx11X+Wv/zLv+RP//RPf/pP//RPf4arrrrqqquuuuqq/38ox48f56qrrrrqqquuuuq/0uHh4e4//MM//M5v//Zvf8/h4eHuqVOnXvv666/nqqv+M9x9991813d918ecPXv2Vq666qqrrrrqqqv+/0EPetCDuOqqq6666qqrrvrvdM011zz4cz7nc37rmmuuefDLvuzLctVV/5H+8i//krd7u7cTV1111VVXXXXVVf8/UY4fP85VV1111VVXXXXVf6fDw8PdP/uzP/uZw8PD3VOnTr323XffzfXXX89VV/1H+MEf/MHv/tM//dOf4aqrrrrqqquuuur/J8rx48e56qqrrrrqqquu+u92eHi4+w//8A+/89u//dvfc3h4uHvq1KnXvvvuu7n++uu56qp/q7/8y7/kF37hF77m1ltv/Wuuuuqqq6666qqr/n+iHD9+nKuuuuqqq6666qr/KQ4PD3f/4R/+4Xd++7d/+3sODw93T5069drXX389V131b3H33XfzXd/1XR9zeHi4y1VXXXXVVVddddX/T5Tjx49z1VVXXXXVVVdd9T/N4eHh7j/8wz/8zm//9m9/z97e3vH5fP7S119/PVdd9a9x9913813f9V0fw1VXXXXVVVddddX/X5Tjx49z1VVXXXXVVVdd9T/V4eHh7p/+6Z/+zG/91m9993w+f+nW2oOvv/56rrrqRfGDP/iD3/2nf/qnP8NVV1111VVXXXXV/1+U48ePc9VVV1111VVXXfU/3dHR0aXf+q3f+p6zZ88+Y29v73hr7cHXX389V131gvzlX/4lv/ALv/A1t956619z1VVXXXXVVVdd9f8XetCDHsRVV1111VVXXXXV/zbXXHPNgz/8wz/8u17sxV7stV/2ZV+Wq656bn/5l3/J273d24mrrrrqqquuuuqq/98ox48f56qrrrrqqquuuup/m8PDw93f+q3f+p7f/u3f/p75fP7SrbUHX3/99Vx11f1+8Ad/8Lv/9E//9Ge46qqrrrrqqquu+v+Ncvz4ca666qqrrrrqqqv+tzo8PNz9rd/6re/57d/+7e+Zz+cv3Vp78PXXX89V/7/95V/+Jb/wC7/wNbfeeutfc9VVV1111VVXXfX/G+X48eNcddVVV1111VVX/W93eHi4+1u/9Vvf81u/9Vvf/ZSnPGX31KlTr3333Xdz/fXXc9X/P3fffTff9V3f9TGHh4e7XHXVVVddddVVV/3/Rjl+/DhXXXXVVVddddVV/1ccHR1d+od/+Iff+e3f/u3vOTw83G2tPXhvb+/49ddfz1X/f9x9991813d918dw1VVXXXXVVVdddRXl+PHjXHXVVVddddVVV/1fc3h4uPsP//APv/Nnf/ZnP3Prrbf+9d7e3vHW2oOvv/56rvq/7wd/8Ae/50//9E9/mquuuuqqq6666qqrKMePH+eqq6666qqrrrrq/6rDw8PdW2+99W9+67d+63t++7d/+3v29vaOz+fzl7777ru5/vrruer/nr/8y7/kF37hF77m1ltv/Wuuuuqqq6666qqrrqIcP36cq6666qqrrrrqqv8PDg8Pd//0T//0Z377t3/7ew4PD3fvueceWmsPvv7667nq/467776b7/qu7/qYw8PDXa666qqrrrrqqquuQg960IO46qqrrrrqqquu+v/qmmuuefBrv/Zrv9c7vdM7fTbAy77sy3LV/25f8RVf8d1f//Vf/z5cddVVV1111VVXXQVAOX78OFddddVVV1111VX/Xx0eHu7+wz/8w+/89m//9vfceuutf723t3e8tfbgu+++m+uvv56r/nf5y7/8S2699da//tM//dOf4aqrrrrqqquuuuoqACpXXXXVVVddddVVV3Hffffdet999936W7/1W99zzTXXPPi1X/u13+sf/uEfXvvFXuzFXhvgZV/2Zbnqf4ff+q3f+h6uuuqqq6666qqrrrofetCDHsRVV1111VVXXXXVVc/fmTNnHvQ6r/M67/3iL/7ir/1iL/Zirw3wsi/7slz1P9Nf/uVf8nZv93biqquuuuqqq6666qr7UY4fP85VV1111VVXXXXVVc/f0dHRpX/4h3/4nd/6rd/6nt/+7d/+nsPDw9177rmH1tqD7777bq6//nqu+p/jB3/wB7/7T//0T3+Gq6666qqrrrrqqqvuhx70oAdx1VVXXXXVVVddddW/zjXXXPPgF3uxF3vt13md13mvF3uxF3ttgJd92Zflqv8+f/mXf8nXf/3Xv89v/dZvfTdXXXXVVVddddVVV90PPehBD+Kqq6666qqrrrrqqn+7a6655sEv9mIv9lov9mIv9tov9mIv9trXXHPNg++7775b3/iN3/jBXPVf5i//8i/5kA/5kIfcd999t3LVVVddddVVV1111f2oXHXVVVddddVVV13173Lffffdet999936W7/1W98DcM011zz4zJkzDz579uxnvdiLvdhr80wv+7Ivy1X/ue67775bueqqq6666qqrrrrqgahcddVVV1111VVXXfUf6r777rv1vvvuu/UzP/Mzf/uaa655MMCLvdiLvfbrvM7rvNeLvdiLvTbP9LIv+7Jc9R/nt37rt76bq6666qqrrrrqqqueG5Wrrrrqqquuuuqqq/7T3HfffbcC3Hfffd/9W7/1W9995syZB0nSi73Yi732i73Yi73W67zO67w3D/CyL/uyXPWv95d/+Zf8wz/8w+9w1VVXXXXVVVddddVzQw960IO46qqrrrrqqquuuuq/z5kzZx704i/+4q9z5syZB734i7/4a7/Yi73Ya/NML/uyL8tV/7K//Mu/5O3e7u3EVVddddVVV1111VXPDT3oQQ/iqquuuuqqq6666qr/Wc6cOfOgF3/xF3+dF3uxF3stgGuuuebBL/ZiL/baPMDLvuzLctUVX/EVX/HdX//1X/8+XHXVVVddddVVV1313NCDHvQgrrrqqquuuuqqq676n+/MmTMPkqQXe7EXe+0zZ8486JprrnnwNddc8+AXe7EXe22ey8u+7Mvyf9Vf/uVf8kC/9Vu/9T1f//Vf/95cddVVV1111VVXXfX8oAc96EFcddVVV1111VVXXfW/2zXXXPPgM2fOPPiaa655MOAXe7EXe+1rrrnmwQAv9mIv9tq8AC/7si/L/xR/+Zd/yfNz33333Xr27Nlb77vvvlvvu+++WwH+4R/+4XfOnj1763333XcrV1111VVXXXXVVVe9MOhBD3oQV1111VVXXXXVVVf933bmzJkHSdKZM2cefM011zwY4MyZMw+65pprHgxwzTXXPBjgzJkzD+aZrrnmmgfzH+i+++67lQc4e/bsrffdd9+t9913360809mzZ59x33333QrwD//wD7/NVVddddVVV1111VX/XuhBD3oQV1111VVXXXXVVVdd9cJcc801D+YBbFuSeADbliQe4L777ruVq6666qqrrrrqqqv+O6EHPehBXHXVVVddddVVV1111VVXXXXVVVddddVV/ydRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VfwjYTZN46URVYEAAAAASUVORK5CYII=) +![Rendered example of arc 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAADHuklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVS/ANddc82Cey5kzZx7Mczl79uytPMB99913K1ddddVVV1111VVX/U9A5aqrrrrqqquuuuqq/xeuueaaBwOcOXPmwS/2Yi/2WjzTNddc8+BrrrnmwQBnzpx58DXXXPNg/oPcd999t/JMZ8+e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7LV+7/d+D0lIQhIA7/7u787R0RG33XYb586d40VlG0n8a9gGQBL/FrYBkMS/lm0AJPFvZZv7SeLfwzb3k8R/JNs8kCT+s9nm+ZHE/2S2eUEk8f+BbR5IEv+Z7rrrLubzOQ972MN4u7d7O57ylKe8NlddddVVV1111X8mgquuuuqqq6666v+F13md13nvpz/96UhCEgAf9VEfxcmTJzk6OuIJT3gCtvnXsI1t/rVsY5t/K9vY5t/CNraxzb+HbWzzH8E2trGNbf6j2cY2trHNfyXb2MY2trHN/xa2sY1tbGMb29jm/zLb2MY2/1nuvvtuLl68yIkTJ3iDN3iDB990003fxVVXXXXVVVdd9Z+F4Kqrrrrqqquu+j/vdV7ndd7793//95GEJCTxKq/yKjziEY8A4C//8i+5n21s869hG9v8a9nGNv9WtrHNv5VtbPPvYRvb2OY/im1sY5v/DLaxjW1s81/NNraxjW1s87+NbWxjG9vYxjb/19jGNrb5j7RcLvn7v/97AF7v9V6Pxz72sa/NVVddddVVV131n4Xgqquuuuqqq676P+91Xud13uuP/uiPiAgkcerUKd793d8dgN///d/n6OiI52abfy3b2OZfyza2+beyjW1s829hG9vY5t/DNraxzX8U29jGNv9ZbGMb29jmv4NtbGMb29jGNv/b2MY2trGNbWzzf4FtbGOb/wir1Yp/+Id/AOAd3/EdH3zTTTd9F1ddddVVV1111X8Ggquuuuqqq6666v88Sa/95Cc/mfu9x3u8BwC33XYb586d4wWxjW3+tWxjm38t29jGNv9WtrHNv5VtbGObfw/b2MY2/1FsYxvb2OY/i21sYxvb/HeyjW1sYxvb/G9kG9vYxja2+d/MNrb597p48SIXL17kxIkTvNu7vdtrc9VVV1111VVX/WcguOqqq6666qqr/k97ndd5nff+oz/6IyQhiTd7szfjEY94BEdHR/zlX/4lLwrb2OZfyza2+bewjW3+rWxjm38P29jm38s2trHNfyTb2MY2/5lsYxvb2MY2/51sYxvb2MY2tvnfxja2sY1tbPO/jW1s82+1XC75h3/4BwBe8RVf8cGv/uqv/l1cddVVV1111VX/0Qiuuuqqq6666qr/017sxV7stf70T/8USTzykY/kzd7szQD4i7/4C/61bGObfy3b2Obfwja2+beyjW1s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DfCwhz2Ma6+9ludmm/9otvmPYJv/CLb5j2Cb/81s829hm38L2/xns83zc/r0aQD+4R/+4be56qqrrrrqqquu+v+D4Kqrrrrqqquu+n/n7Nmzz/j6r//69wF41Vd9Vba2tnhutvmfyjb/EWzzH8E2/x62+fewzX8H2/xXsM2/1y233MLGxgYA9913361cddVVV1111VVX/f9BcNVVV1111VVX/b/0D//wD7/9D//wD7+9tbXFq77qq/L82OY/km3+o9jmP4Jt/iewzb+Hbf6tbPNfyTb/XX7rt37ru7nqqquuuuqqq676/4Xgqquuuuqqq676f+m+++679eu//uvf57777rv12muv5aVe6qV4fmzzH8k2/1Fs8x/BNv9etvn3ss3/Nrb5r2Cbfw3bPNCDHvQgAP7hH/7hd7jqqquuuuqqq676/4Xgqquuuuqqq676f+u+++679eu//uvfB+ChD30o1157Lc+Pbf4j2eY/im3+I9jm38s2/51s829lm/9KtvmvdPr0aQD+4R/+4be56qqrrrrqqquu+v+Fcvz4ca666qqrrrrqqv+/zp49eyvAy77sy772tddeyx133MEwDDw/kviPJIn/CJL4jyCJ/wiS+PeQxL+HJP6tJPFvIYl/LUn8a0niRSUJgFtuuYUbbriB3/qt3/qe3/qt3/purrrqqquuuuqqq/5/Ibjqqquuuuqqq/7f+9Ef/dHP+fu///vf3tra4g3e4A34r2Kb/wi2+Y9gm/8JbHPVv59tAM6cOQPAfffd93Suuuqqq6666qqr/v8huOqqq6666qqrrgK+/uu//r3vu+++W7e2tnjVV31Vnh/b/EezzX8E2/xHsM2/l23+O9nm38o2/xa2+deyzX+F06dPA/AP//APv8NVV1111VVXXXXV/z8EV1111VVXXXXVVcDZs2ef8Vmf9VmvA/Cwhz2Ml3zJl+T5sc3/VLb5j2Cbfy/b/HvY5t/DNv8X2eZfa2NjA4B/+Id/+G2uuuqqq6666qqr/v8huOqqq6666qqrrnqm++6779av//qvfx+Al3qpl+KlXuqleH5s8x/JNv9RbPN/hW3+O9jm38I2/1q2+c90yy23APBbv/Vb381VV1111VVXXXXV/08EV1111VVXXXXVVQ/wW7/1W9/9Iz/yI58N8NCHPpRrr72W58c2/5Fs8z+Jbf69bPPfyTb/F9nmRXX69GkA/uEf/uF3uOqqq6666qqrrvr/iXL8+HGuuuqqq6666qqrHugf/uEffgfgZV/2ZV/72muv5Y477mAYBp4fSfxHksR/BEn8R5DEv5ck/j0k8W8liX8rSfxbSOJfSxL/GpJ4UbzUS70UXdfxXd/1XR9zeHi4y1VXXXXVVVddddX/PwRXXXXVVVddddVVz8dv//Zvf8/f//3f//bW1hZv8AZvwNbWFs+Pbf4j2eY/gm3+I9jm38s2/x62+beyzb+Vbf43e9CDHsTGxgYA9913361cddVVV1111VVX/f9EcNVVV1111VVXXfV83Hfffbd+/dd//Xv/wz/8w29vbW3xBm/wBvxXsc1/BNtcBbb5r2Sbfy3b/GvY5kX1W7/1W9/NVVddddVVV1111f9fBFddddVVV1111VUvwNmzZ5/x9V//9e9z33333bq1tcWrvuqr8vzY5n8q2/x72ebfyzb/Hrb572Cb/61uueUWAP7hH/7hd7jqqquuuuqqq676/4vgqquuuuqqq6666oW47777bv2sz/qs17nvvvtufdjDHsarvuqr8vzY5j+Sbf4nsc2/l23+PWzzb2Wb/0q2+c9mmxfmzJkzAPzWb/3Wd3PVVVddddVVV131/xfBVVddddVVV1111b/gvvvuu/WzPuuzXgfgYQ97GK/6qq/K82Ob/0i2+Y9gm/8Itvn/yDb/FWzzH+VBD3oQAL/1W7/13Vx11VVXXXXVVVf9/0Zw1VVXXXXVVVdd9SK47777bv2QD/mQhwA87GEP4yVf8iV5fmzzH8k2/xFs8z+Bbf49bPNvZZv/Srb573L69GkA7rvvvlu56qqrrrrqqquu+v+N4KqrrrrqqquuuupFdN999936wR/8wQ8GeKmXeile8iVfkufHNv+RbPMfwTb/Xrb597LNfxfb/FvY5r+Cbf41bPP8nDlzBoDf/u3f/h6uuuqqq6666qqr/n8juOqqq6666qqrrvpXOHv27DM+8zM/83UAXuqlXoqXfMmX5P8b2/x3ss3/Frb577CxsQHAfffddytXXXXVVVddddVV/79Rjh8/zlVXXXXVVVddddW/xtmzZ289e/bsMx784Ae/9MMe9rDjkrj33nt5bpL4jySJ/wiS+PeSxL+XJP49JPFvJYl/C0n8a0niX0sSLypJPNCDHvQgbrjhBn7rt37ru//0T//0Z7jqqquuuuqqq676/43gqquuuuqqq6666t/gt37rt777R3/0Rz8H4CVf8iV5yZd8SZ6bbf4j2eY/gm3+vWzz72Wbq/79bPNAp0+fBuAf/uEffoerrrrqqquuuuqqqwiuuuqqq6666qqr/o1+67d+67s/5EM+5CEAL/VSL8Wrvuqr8txs8x/JNv8RbPPvZZv/Trb5t7LNv4Vt/rVs81/pzJkzAPzDP/zDb3PVVVddddVVV111FcFVV1111VVXXXXVv8N999136wd/8Ac/GOBhD3sYb/iGb8hzs83/Vbb597DNv4dt/i+yzb/Fgx70IDY2NgC47777buWqq6666qqrrrrqKoKrrrrqqquuuuqqf6ezZ88+40M+5EMect9999167bXX8jZv8zZsbW3xn8U2/xFs8z+Bbf472Obfwjb/Wrb5z2QbgI2NDQB+67d+63u46qqrrrrqqquuugqA4Kqrrrrqqquuuuo/wH333XfrZ33WZ73Offfdd+vW1hZv8AZvwNbWFvezzX8k2/xHsM2/l23+O9nm/yLb/GudPn0agH/4h3/4ba666qqrrrrqqquuAiC46qqrrrrqqquu+g9y33333fpZn/VZr3PffffdurW1xRu8wRuwtbXF/WzzH8k2/xFs8+9lm38P2/x3sM2/hW3+tWzzn8k2Z86cAeC3fuu3vpurrrrqqquuuuqqqwAox48f56qrrrrqqquuuuo/yuHh4e6f/dmf/czm5ubxRz3qUS9988030/c99957L/eTxH8USfxHkMS/lyT+PSTx7yGJfwtJ/FtI4l9LEv8aknhRPehBD+KGG27gt37rt777T//0T3+Gq6666qqrrrrqqqsAKMePH+eqq6666qqrrrrqP9Lh4eHu05/+9L8+PDzcfdmXfdnX3traou977r33Xu4nif8okviPIIl/L0n8e0ji30oS/1aS+LeQxL+WJP41JPGieMQjHsHx48f5hV/4ha+59dZb/5qrrrrqqquuuuqqqwAox48f56qrrrrqqquuuuo/2tHR0aV/+Id/+B2Al33Zl33t6667Dknce++9AEjiP5Ik/iNI4t9LEv8ekvi3ksS/hST+LSTxryWJfw1JvChe6qVeiq7r+K7v+q6POTw83OWqq6666qqrrrrqKgCCq6666qqrrrrqqv9EP/qjP/o5X//1X/8+AC/5ki/J27zN27C1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4t9CEv9akvjXkMSL4qVe6qXo+55f+IVf+Jpbb731r7nqqquuuuqqq6666gVBD3rQg7jqqquuuuqqq676v+Caa6558Gu/9mu/1zu90zt9NsDBwQFPe9rT+Nu//VueH0n8e0ni30MS/1aS+LeSxL+FJP41JPGvIYkXxdu//dsD8HZv93biqquuuuqqq6666qoXhnL8+HGuuuqqq6666qqr/i84PDzc/Yd/+Iff+e3f/u3vechDHvLSN91004OvvfZaHvawh9H3Pffeey/PTRL/XpL495DEv5Uk/i0k8W8hiX8tSfxrSOKFedCDHsSNN97Ib/3Wb333n/7pn/4MV1111VVXXXXVVVe9MJTjx49z1VVXXXXVVVdd9X/J4eHh7m/91m99z9mzZ5+xubl5/MYbb3zwtddey0Mf+lD6vufee+/lfpL495LEv4ck/q0k8W8liX8tSfxrSeJfQxIvzCMe8QiOHz/OL/zCL3zNrbfe+tdcddVVV1111VVXXfXCUI4fP85VV1111VVXXXXV/0W33nrrX//Wb/3W95w9e/bWzc3N4zfddNODr732Wh760IfS9z333nsvAJL495LEv4ck/q0k8W8hiX8LSfxrSeJfQxIvyEu91EvR9z3f9V3f9TGHh4e7XHXVVVddddVVV131wlCOHz/OVVddddVVV1111f9lt95669/81m/91vecPXv2GZubm8dvuummB1977bU89KEPpe97Dg4OGMeRfw9J/HtI4t9KEv9WkvjXksS/liT+NSTxgrz0S780AN/1Xd/1MVx11VVXXXXVVVdd9S+hHD9+nKuuuuqqq6666qr/D2699da//q3f+q3vOXv27DM2NzeP33TTTQ++9tprufnmmzl58iTjOHJ4eMi/lST+PSTxbyWJfwtJ/FtI4l9DEv8aknh+HvSgB3HjjTfyW7/1W9/9p3/6pz/DVVddddVVV1111VX/Esrx48e56qqrrrrqqquu+v/k1ltv/evf+q3f+p7f/u3f/p7Nzc3jj3rUo176xIkTPPShD+Xaa68F4OLFi/xbSOLfShL/VpL4t5LEv5Yk/rUk8a8hief2iEc8guPHj/MLv/ALX3Prrbf+NVddddVVV1111VVX/Usox48f56qrrrrqqquuuur/o8PDw90//dM//Znf/u3f/p7Dw8PdF3/xF3/tra0tbr75Zh72sIfRdR333Xcf/xqS+PeQxL+VJP4tJPFvIYl/DUn8a0jiub3qq74qAN/1Xd/1MYeHh7tcddVVV1111VVXXfUvoRw/fpyrrrrqqquuuuqq/88ODw93/+Ef/uF3fuu3fuu7Dw8Pd6+55poHnzhx4vi1117Lwx72ME6cOME4jhweHvKikMS/hyT+rSTxbyGJfy1J/GtJ4kUliQd60IMexI033sh9991364/+6I9+DlddddVVV1111VVXvSgox48f56qrrrrqqquuuuoqODo6uvQP//APv/Nnf/ZnP3Prrbf+zeHh4e4jH/nIlz5x4gQPfehDedjDHkbXdRweHjKOIy+IJP49JPFvJYl/C0n8a0niX0sS/xqSuN8jHvEIjh8/zp/+6Z/+9J/+6Z/+DFddddVVV1111VVXvSgox48f56qrrrrqqquuuuqqZzs8PNy99dZb//pP//RPf+a3fuu3vvvw8HD3mmuuefCJEyeOX3vttTz60Y/mYQ97GMMwcPHiRZ4fSfx7SOLfQhL/VpL415LEv4Yk/jUkcb+XeqmXou97fuEXfuFrbr311r/mqquuuuqqq6666qoXBXrQgx7EVVddddVVV1111VX/shd7sRd77dd5ndd5r9d5ndd5b57p8PCQe++9l3vvvZenPe1p3E8S/x6S+LeSxL+FJP61JPGvJYkXlSTu9/Zv//YAvN3bvZ246qqrrrrqqquuuupFRTl+/DhXXXXVVVddddVVV/3Lzp49e+uf/umf/sxv/dZvffett976N5ubm8dvvPHGB584cYKbb76Zhz3sYZw4cYK+77l48SKS+PeQxL+FJP4tJPFvIYl/DUn8a0jiQQ96EDfeeCO/9Vu/9T1/+qd/+tNcddVVV1111VVXXfWiQg960IO46qqrrrrqqquuuurf5pprrnnwi73Yi73267zO67zXi73Yi702D3B4eMjTnvY07r33Xu677z7+tSTxbyWJfwtJ/GtJ4l9DEv8aknj5l395HvzgB/P1X//17/Nbv/Vb381VV1111VVXXXXVVS8q9KAHPYirrrrqqquuuuqqq/79rrnmmge/2Iu92Gu/zuu8znu92Iu92GvzAIeHh9x7773cd999PO1pT+NFJYl/C0n8W0jiX0sS/1qSeFFJ4k3e5E3Y3NzkQz7kQx5y33333cpVV1111VVXXXXVVS8q9KAHPYirrrrqqquuuuqqq/5jXXPNNQ9+sRd7sdd6sRd7sdd+ndd5nffmAQ4PDwG49957edrTnsZ9993HCyKJfytJ/FtI4l9LEv8akvjXeId3eAcA3u7t3k5cddVVV1111VVXXfWvgR70oAdx1VVXXXXVVVddddV/rmuuuebBr/3ar/1eL/7iL/7aL/ZiL/baPMDh4SEA9957L/fddx/33nsvh4eH3E8S/xaS+LeQxL+WJP61JPGiePCDH8wrvMIr8Fu/9Vvf/fVf//Xvw1VXXXXVVVddddVV/xroQQ96EFddddVVV1111VVX/de55pprHnzmzJkHv9iLvdhrvfiLv/hrv9iLvdhr81wODw+59957ue+++zg8POS+++7j30IS/xaS+NeSxL+GJF4Ur/AKr8CDH/xgvv7rv/59fuu3fuu7ueqqq6666qqrrrrqXwM96EEP4qqrrrrqqquuuuqq/z5nzpx50DXXXPOQF3uxF3utF3/xF3/tF3uxF3ttno/Dw0Puu+8+AO69914ODw+57777eGEk8W8hiX8tSfxrSOJF8Q7v8A4AfMiHfMhD7rvvvlu56qqrrrrqqquuuupfAz3oQQ/iqquuuuqqq6666qr/Wc6cOfOgF3/xF3+dF3uxF3uta6655sEv9mIv9tq8AIeHhxweHnJ4eMi9994LwOHhIffddx8Akvi3kMS/hiT+tSTx3DY3N9nY2ODMmTNsbm7y4Ac/mH/4h3/47c/8zM98Ha666qqrrrrqqquu+tdCD3rQg7jqqquuuuqqq6666n++M2fOPOjFX/zFXwfgxV7sxV7rmmuuefA111zzkDNnzjyIF+Dw8BCAw8NDDg8POTw85PDwEIDDw0MADg8POTw85LlJ4l9LEs9tc3OT+21sbLC5ucnm5iYAm5ubbG5uAnDmzBmen3/4h3/47d/6rd/6nt/6rd/6bq666qqrrrrqqquu+tdCD3rQg7jqqquuuuqqq6666n+nM2fOPEiSzpw58+BrrrnmwS/2Yi/2Wtdcc82DAV7sxV7stflXOjw85IEODw+RhG0eSBK2eSBJbGxscL/NzU3+Le67775bz549e+vf//3f/zbAP/zDP/zOP/zDP/w2V1111VVXXXXVVVf9W6AHPehBXHXVVVddddVVV131f9M111zzYIAzZ8486JprrnnImTNnHnTNNdc8GOCaa655MMCZM2cefM011zz4vvvuu/Waa655MM9033333XrNNdc8mP8A9913360AZ8+evfW+++67FeC+++67FeAf/uEffgfwP/zDP/wOV1111VVXXXXVVVf9R0MPetCDuOqqq6666qqrrrrqKoAzZ848SJJ4pjNnzjwYMCCekwHxnHz27Nln8Ez33XffrVx11VVXXXXVVVdd9d8NPehBD+Kqq6666qqrrrrqqquuuuqqq6666qqrrvo/icpVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+r+Eexy8PwjvBeIQAAAABJRU5ErkJggg==) diff --git a/docs/kcl/arcTo.md b/docs/kcl/arcTo.md new file mode 100644 index 000000000..4d7a4c6f3 --- /dev/null +++ b/docs/kcl/arcTo.md @@ -0,0 +1,41 @@ +--- +title: "arcTo" +excerpt: "Draw a 3 point arc." +layout: manual +--- + +Draw a 3 point arc. + +The arc is constructed such that the start point is the current position of the sketch and two more points defined as the end and interior point. The interior point is placed between the start point and end point. The radius of the arc will be controlled by how far the interior point is placed from the start and end. + +```js +arcTo(data: ArcToData, sketch: Sketch, tag?: TagDeclarator) -> Sketch +``` + + +### Arguments + +| Name | Type | Description | Required | +|----------|------|-------------|----------| +| `data` | [`ArcToData`](/docs/kcl/types/ArcToData) | Data to draw a three point arc (arcTo). | Yes | +| `sketch` | [`Sketch`](/docs/kcl/types/Sketch) | A sketch is a collection of paths. | Yes | +| `tag` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | | No | + +### Returns + +[`Sketch`](/docs/kcl/types/Sketch) - A sketch is a collection of paths. + + +### Examples + +```js +exampleSketch = startSketchOn('XZ') + |> startProfileAt([0, 0], %) + |> arcTo({ end = [10, 0], interior = [5, 5] }, %) + |> close(%) +example = extrude(10, exampleSketch) +``` + +![Rendered example of arcTo 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAD6bElEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqf7VrrrnmwQBnzpx5MM90zTXXPJhnOnPmzIN4Ac6ePfsMHuC+++67lWc6e/bsrQD33XffrVx11VVXXXXVVVdd9b8Vlauuuuqqq6666qqr/ke65pprHnzmzJkHX3PNNQ8+c+bMgwCuueaaB19zzTUPPnPmzIOvueaaB/Mf5L777rv1mmuueTAvwH333XcrwNmzZ2+97777bgX4h3/4h98BuO+++249e/bsrffdd9+tXHXVVVddddVVV131Pw160IMexFVXXXXVVVddddVV/z2uueaaBwO82Iu92GufOXPmQS/+4i/+2gAv9mIv9tq8iC5evMj9dnd3Abh48SL3u3jxIi/MiRMnuN/x48e534kTJwA4ceIEL4r77rvvVoCzZ8/eet999936D//wD79z33333foP//APv81VV1111VVXXXXVVf9d0IMe9CCuuuqqq6666qqrrvrPd8011zz4xV7sxV77zJkzD3rxF3/x136xF3ux177vvvtuveaaax7M83Hx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uuqqq676n+iaa6558Gu/9mu/1zu90zt9NsDTnvY0fvRHf5Td3V0eSBLPjySeH0m8MJJ4UUji30MS/91s8+9lmxeFbf4ltnlBbPP82Ob5sc1zs80D2eaBbPNAtnkg25w8eZJXeIVX4I3e6I0A+JEf+ZHP/u3f/u3vue+++27lqquuuuqqq6666n8e9KAHPYirrrrqqquuuuqq/2ne8R3f8bNe53Ve572vueaaB1+8eJEf/dEf5WlPexqSeCBJPD+SeH4k8YJI4kUhiX8LSfxPZpt/K9u8qGzzwtjmBbHN82Ob58c2D2Sb52abB7LNA9nmfra534kTJ/iwD/swTp48yX333Xfrb/3Wb333j/7oj34OV1111VVXXXXVVf+zoAc96EFcddVVV1111VVX/U9xzTXXPPjDP/zDv+vFXuzFXvvixYv8+Z//Ob/+678OgCQeSBLPjySeH0m8IJL4l0jiX0sS/xvZ5t/CNi8K27wwtnlBbPP82Oa52ea52ea52eaBbPNAtrmfbe534sQJXuEVXoE3fuM3BuC+++679bM+67Ne57777ruVq6666qqrrrrqqv8Z0IMe9CCuuuqqq6666qqr/id4x3d8x896p3d6p88G+LVf+zV+/dd/nftJ4rlJ4rlJ4vmRxAsiiRdGEv9akvi/wjb/WrZ5UdjmBbHNC2Kb58c2z802z802D2SbB7LNA9nmgWxzP9ucPHmSV3iFV+CN3/iNue+++279rd/6re/+0R/90c/hqquuuuqqq6666r8fetCDHsRVV1111VVXXXXVf6drrrnmwZ/zOZ/zW9dcc82DL168yI/+6I/ytKc9jftJ4rlJ4rlJ4rlJ4gWRxL9EEv8akvi/yjb/Wrb5l9jmhbHN82Ob58c2z802z802D2SbB7LNA9nmfra5n23ud+LECT78wz+ckydPct9999369V//9e/zD//wD7/NVVddddVVV1111X8fyvHjx7nqqquuuuqqq6767/KO7/iOn/VJn/RJP725uXn8137t1/ie7/kednd3eSBJPJAknpsknpskXhBJvDCSkMSLQhKSkMR/JElIQhKSkIQkJCEJSUhCEpKQhCQkIYn/aJKQxL+GJP4lknhhJPH8SOL5kcRzk8Rzk8QDSeKBJPFAkrifJO4nifutViv+7u/+juVyyUu91Esdf7EXe7HX3tzcPP4P//APv8NV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HvQgrrrqqquuuuqq/xxd1733yZMnv6uUQkQgiYhAEpIAkIQkJAEgCUkASAJAEgCSAJAEgCTuJwkASdxPEveTxP0k8UCSeCBJPJAkHkgSDySJ50cSz00Sz48kXhBJvCCS+JdIYmdnh5tvvpmdnR1uuukmbr75Zp7b4eEh9957L4eHh9x7773cd999XPU/n202NzfZ2tpic3OTa6+9ls3NTa699lqe26VLl7j99tu5/fbb+fu//3ts84LY5vmxzXOzzXOzzXOzzQPZ5rnZ5oFscz/bPJBt7meb+9nmfra5n23uZxsA29zPNgC2AbANgG0AbANgG9sA2MY2ALaxjW1sA2CbzMQ2trFNZpKZtNaYpomjo6PXkfTbXHXVVVddddVV/xnQgx70IK666qqrrrrqqv8cx44d+62NjY3XjggkERFIQhKSkIQkACQhCQBJSAJAEgCSAJDE/SQBIIn7SQJAEveTxANJ4n6SeCBJPJAkHkgSz00Sz00Sz00Sz48kXhBJvCCSeEF2dnY4duwYN998My/2Yi/Gzs4Oz+3w8JCnPvWp3Hfffdx77728KCRx1X8t2/xbbG5ucu2117K5ucm1117LtddeywNdunQJSdx2223cdttt/P3f/z3PzTbPj22em22em22em20eyDbPzTb3s80D2eaBbHM/29zPNvezzf1sA2Cb+9kGwDYAtgGwDYBtAGwDYBsA29gGwDa2AbCNbWxjG9vYxjaZiW0yk9YamclqtfrtaZpeh6uuuuqqq6666j8DetCDHsRVV1111VVXXfWf49prr3UphYhAEpKQhCQkIQlJSAJAEpIAkASAJAAkASAJAEkASOJ+krifJO4niftJ4n6SeCBJPJAkHkgSz00Sz00Sz00Sz48knh9JvDCSeG47Ozu82Iu9GDfffDM333wzD3R4eMjBwQH33nsv9913H/feey//mSRx1Qtnm/9Km5ubbG1tsbm5yUMf+lCuvfZaHujSpUsA/P3f/z233XYbt99+OwC2eX5s89xs89xs89xs80C2eSDbPJBtHsg297PNA9nmfra5n20AbHM/2wDY5n62AbANgG0AbANgGwDb2AbANrYBsI1tbGMb29jGNraxTWZim8yktcY0TRwdHb2OpN/mqquuuuqqq676j4Ye9KAHcdVVV1111VVX/cfb2tr6rq2trfcupSCJiEASkpCEJCQB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Jon/D2zzL5HEVVe9KGzz/51t/rexzf80trnqqquuuuqq/0WoXHXVVVddddV/MdtI4n8C2zyQJP43sM1zk8T/R7Z5UUniqv9bbHPV82eb/41s8z+Rba666qqrrrrqfykqV1111VVXXfXfwDb3k8T/FLZ5bpL438A2z48krrrCNv9akrjqP59trvq3s83/Vrb5n8g2V1111VVXXfV/BJWrrrrqqquu+i9y33333XrNNdc8+NixY1y6dIn72eaBJPE/iW0eSBL/m9jm+ZHEVf8y2/xHksT/Fba56r+Wbf63s83/VLa56qqrrrrqqv+DqFx11VVXXXXV/zC2uZ8k/qexzQNJ4n8j2zw/krjqP49trrrqX2Kb/wts8z+Zbf6rHTt2DID77rvvVq666qqrrrrqvwbBVVddddVVV/0XOXv27K0AOzs7vKhsYxvb2OZ/ItvYxja2sc3/ZraxjW1sYxvbXHXVVf+xbGMb29jGNraxzf9WtrGNbWzzP5FtbGOb/w47OzsAnD179lauuuqqq6666r8Glauuuuqqq676X8Q295PE/1S2eSBJ/G9nmxdEElddddXzss3/Vbb538A2V1111VVXXfX/HJWrrrrqqquu+l/KNg8kif+pbPPcJPF/hW1eGElcddX/Vbb5/8A2/xvY5n8a29zv2LFjANx33323ctVVV1111VX/NQiuuuqqq6666r/IfffddyvAsWPH+M9gG9vYxjb/09nGNraxjW3+r7KNbWxjG9vYxja2ueqq/8lsYxvb2MY2trGNbf4vso1tbGMb2/xPZhvb2OZ/AtvYxja2ueqqq6666qr/ZlSuuuqqq6666r/IfffddyvAsWPH+K9gmweSxP90tnlukvi/zjb/EklcddV/NNv8f2eb/21s8z+NbV4UOzs7ANx33323ctVVV1111VX/NahcddVVV1111f8TtnkgSfxvYJvnJon/b2zzopDEVVfZ5qrnZZv/jWzzP5Ft/rWOHTsGwNmzZ5/BVVddddVVV/3XoHLVVVddddVV/0X+4R/+4XcAbr75Zv4nsM0DSeJ/C9s8N0lcBbb515DEVf/z2eaqF51t/jezzf9Etrnqqquuuuqq/4WoXHXVVVddddV/A9tI4n8S2zyQJP43sc3zI4mrXjDb/FtJ4qoXnW2u+o9nm//tbPM/lW3+Ix07dgyA++6771auuuqqq6666r8Glauuuuqqq676L3L27NlbAY4dOwaAbe4nif9pbPNAkvjfyDbPjySu+vexzf8EknhhbHPV/362+b/ANv/T2eY/y7FjxwA4e/bsrVx11VVXXXXVfw0qV1111VVXXfVf5L777rsV4NixYzw32zyQJP6nsc1zk8T/VrZ5fiRx1f8utrnq/w7b/F9im//pbPNf5dixYwDcd999t3LVVVddddVV/zWoXHXVVVddddV/ofvuu+/Wa6655sFv+qZvyqVLl3hRSOKq/xkkcdVVV/372eaq/z62+e9w7Ngxrrrqqquuuuq/AZWrrrrqqquu+i/0W7/1W9/9Oq/zOu/9Ei/xEg/mqquuuuqqq/6fue+++2790R/90c/hqquuuuqqq/7roAc96EFcddVVV1111X+l13md13nvM2fOPIirrrrqqquu+n/m7Nmzz/it3/qt7+aqq6666qqr/uugBz3oQVx11VVXXXXVVVddddVVV1111VVXXXXVVf8nUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q/iHwGPX6tn2Pn4qwAAAABJRU5ErkJggg==) + + diff --git a/docs/kcl/asin.md b/docs/kcl/asin.md index 357538347..456d7b696 100644 --- a/docs/kcl/asin.md +++ b/docs/kcl/asin.md @@ -34,8 +34,8 @@ asin(num: number) -> number sketch001 = startSketchOn('XZ') |> startProfileAt([0, 0], %) |> angledLine({ - angle: toDegrees(asin(0.5)), - length: 20 + angle = toDegrees(asin(0.5)), + length = 20 }, %) |> yLineTo(0, %) |> close(%) diff --git a/docs/kcl/atan.md b/docs/kcl/atan.md index fe6a501f9..601a03769 100644 --- a/docs/kcl/atan.md +++ b/docs/kcl/atan.md @@ -34,8 +34,8 @@ atan(num: number) -> number sketch001 = startSketchOn('XZ') |> startProfileAt([0, 0], %) |> angledLine({ - angle: toDegrees(atan(1.25)), - length: 20 + angle = toDegrees(atan(1.25)), + length = 20 }, %) |> yLineTo(0, %) |> close(%) diff --git a/docs/kcl/atan2.md b/docs/kcl/atan2.md new file mode 100644 index 000000000..52f56a83b --- /dev/null +++ b/docs/kcl/atan2.md @@ -0,0 +1,49 @@ +--- +title: "atan2" +excerpt: "Compute the four quadrant arctangent of Y and X (in radians)." +layout: manual +--- + +Compute the four quadrant arctangent of Y and X (in radians). + + + +```js +atan2(y: number, x: number) -> number +``` + +### Tags + +* `math` + + +### Arguments + +| Name | Type | Description | Required | +|----------|------|-------------|----------| +| `y` | `number` | | Yes | +| `x` | `number` | | Yes | + +### Returns + +`number` + + +### Examples + +```js +sketch001 = startSketchOn('XZ') + |> startProfileAt([0, 0], %) + |> angledLine({ + angle = toDegrees(atan2(1.25, 2)), + length = 20 + }, %) + |> yLineTo(0, %) + |> close(%) + +extrude001 = extrude(5, sketch001) +``` + +![Rendered example of atan2 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAADkK0lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVf9uL/ZiL/baH/7hH/5d//AP//DbAF//9V//Plx11VVXXXXVfz8qV1111VVXXXXVVVddddVVV/2bXXPNNQ/+8A//8O96sRd7sdcGuOaaa94b4L777rv1R3/0Rz+Hq6666qqrrvrvRTl+/DhXXXXVVVddddVVV1111VVX/etcc801D36zN3uzj/qkT/qkn77mmmsevLu7yw/90A/xjGc8g0c/+tG8+Iu/+GsD/MM//MPvcNVVV1111VX/fSjHjx/nqquuuuqqq6666qqrrrrqqhfdO77jO37WJ33SJ/30i7/4i7/27u4uf/RHf8SP/MiPcOnSJe655x4AHvzgB3PNNdc8+NZbb/2bs2fP3spVV1111VVX/fegHD9+nKuuuuqqq6666qqrrrrqqqv+ZS/2Yi/22p/7uZ/7W6/0Sq/01gC/9Vu/xY/8yI/wjGc8gwe69dZbAXixF3ux4y/2Yi/22n/2Z3/2M4eHh7tcddVVV1111X899KAHPYirrrrqqquuuuqqq6666qqrXrBrrrnmwR/+4R/+XS/2Yi/22gC7u7t813d9F5cuXeIFOX78OG/91m/Ngx/8YO67775bP+RDPuQhXHXVVVddddV/PfSgBz2Iq6666qqrrrrqqquuuuqqq57XNddc8+DXfu3Xfq93eqd3+myA3d1dfuu3fou/+Zu/4UVx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+Nd6zdd8TV7jNV6D++6779bP+qzPep377rvvVq666qqrrrrqeaEHPehBXHXVVVddddVVV1111VVX/We55pprHvzar/3a7/VO7/ROnw2wu7vLb/3Wb/HXf/3XAEjiX0MS/xqS+NeSxL+GJP4tJPGvJYn7vcZrvAav8RqvwX333XfrZ33WZ73OfffddytXXXXVVVdd9ZzQgx70IK666qqrrrrqqquuuuqqq/4zvOM7vuNnvdM7vdNn80y/9Vu/xW//9m9zP0n8a0jiX0MS/xqS+NeSxL+WJP61JPHcjh07xpu/+ZvzoAc9iLNnzz7jgz/4gx/MVVddddVVVz0nyvHjx7nqqquuuuqqq6666qqrrvqPdM011zz4y7/8y//qlV7pld4a4Ld+67f47u/+bm699VYAJCGJF5UkJPGikoQkXlSSkMS/hiQk8a8hCUn8a0ni+Vmv19x222086lGP4uTJk8evueaaB//pn/7pz3DVVVddddVVz0Y5fvw4V1111VVXXXXVVVddddVV/xGuueaaB7/P+7zPV334h3/4d29ubh7f3d3lh37oh/jrv/5r7ieJF5UkJPGikoQk/jUk8a8hCUn8a0niX0sSknhh1us1T3rSk3jFV3xFHvKQh7w0wD/8wz/8DlddddVVV111BeX48eNcddVVV1111VVXXXXVVVf9e73jO77jZ33SJ33STz/kIQ956d3dXX7pl36Jn/7pn2Z3dxcASUjiRSWJfw1J/GtIQhIvKklI4l9LEpL415CEJF5U6/Wav/u7v+MVXuEVePEXf/HXBviHf/iH3+Gqq6666qqrgHL8+HGuuuqqq6666qqrrrrqqqv+rd7xHd/xsz73cz/3t1/8xV/8tQF+67d+ix/+4R/mnnvuAUASknhRSUISLypJSOJFJQlJ/GtI4l9LEpL415CEJP61JLFer7l06RKPfOQjueaaax586623/s3Zs2dv5aqrrrrqqv/vqFx11VVXXXXVVVddddVVV/0bXHPNNQ/+8A//8O96sRd7sdcG+Ou//mt+6qd+igeSxItKEv8akvjXksS/hiT+LSTxryWJfy1JPNDf/d3f8Rqv8Rpcc801D36xF3ux1/qHf/iH3+aqq6666qr/79CDHvQgrrrqqquuuuqqq6666qqrXlTXXHPNg9/xHd/xs17ndV7nvQF2d3f5qZ/6KW699VbuJ4l/DUn8a0jiX0MS/xqS+LeQxL+WJP61JPHcbrnlFt78zd+cY8eOcb+3e7u3E1ddddVVV/1/R+Wqq6666qqrrrrqqquuuupF9I7v+I6f9U7v9E6fDbC7u8tf/dVf8du//dvcTxL/GpL415DEv4Yk/rUk8a8liX8tSfxrSeK5HTt2jDd/8zfnlltuAeDg4ICtrS3uu+++W7nqqquuuuoqoHLVVVddddVVV1111VVXXfUveJ3XeZ33/vAP//Dv4pl+67d+i9/+7d/mgSTxryGJF5Uk/rUk8a8hiX8tSfxrSeJfSxLP7dixY7zGa7wGL/ESLwHAwcEBT3va0zg4OOBVX/VV+Yd/+Iff5qqrrrrqqquAylVXXXXVVVddddVVV1111QtwzTXXPPjDP/zDv+vFXuzFXhvg1ltv5ad+6qfY3d3lfpL415DEv4Yk/jUk8a8hiX8LSfxrSeJfSxIPdOzYMV7iJV6C13iN1+B+f/u3f8vf/u3fAvDQhz6Uq6666qqrrnoAKlddddVVV1111VVXXXXVVc/lmmuuefBrv/Zrv9c7vdM7fTbA7u4uP/VTP8Wtt97KA0niRSWJfw1J/GtI4l9LEv9akvjXksS/liSe26u/+qvzGq/xGtzvb//2b/nbv/1bHmhrawuA++6771auuuqqq666CqhcddVVV1111VVXXXXVVVc9wDu+4zt+1ju90zt9NsDu7i5/9Vd/xW//9m/zQJL415DEv4Yk/jUk8a8hiX8tSfxrSeJfSxLP7ZZbbuHN3/zNOXbsGACHh4f86q/+KoeHhzy3zc1NAM6ePfsMrrrqqquuugqoXHXVVVddddVVV1111VVXAS/2Yi/22h/+4R/+Xddcc82DAX7rt36L3/7t3+a5SeJFJYl/DUn8a0jiX0MS/xaS+NeQxL+WJJ7bsWPHePM3f3NuueUWAA4PD/mjP/oj7rnnHl6Qa6+9FoD77rvvVq666qqrrroKqFx11VVXXXXVVVddddVV/69dc801D/7wD//w73qxF3ux1wa49dZb+amf+il2d3d5IEn8a0jiRSWJfw1J/GtJ4l9LEv9akvjXksQDHTt2jJd4iZfgNV7jNQA4PDzkqU99Kn/3d3+HbV4UZ8+evZWrrrrqqquuAipXXXXVVVddddVVV1111f9L11xzzYNf+7Vf+73e6Z3e6bMBdnd3+amf+iluvfVWHkgS/xqS+NeQxL+GJP41JPGvJYl/LUn8a0nigY4dO8ZLvMRL8Bqv8Rrc72//9m/5u7/7OwBs8y/Z2toC4L777ruVq6666qqrrgIqV1111VVXXXXVVVddddX/O+/4ju/4We/0Tu/02QC7u7v81V/9Fb/927/Nc5PEi0oS/xqS+NeQxL+GJP4tJPGvIYl/LUk8t1d/9VfnNV7jNbjf0572NP72b/+Ww8NDAGzzL9nc3ATgvvvuu5WrrrrqqquuuoLKVVddddVVV1111VVXXfX/xou92Iu99od/+Id/1zXXXPNggN/6rd/it3/7t3lukvjXkMSLShL/GpL415LEv5Yk/rUk8a8hied2yy238OZv/uYcO3YMgMPDQ/7oj/6Ie++9l3+ta6+9FoB/+Id/+G2uuuqqq6666goqV1111VVXXXXVVVddddX/eddcc82DP/zDP/y7XuzFXuy1AW699VZ+6qd+it3dXZ6bJF5UkvjXkMS/hiT+NSTxryWJfy1J/GtJ4oGOHTvGm7/5m3PLLbcAcHh4yN/+7d/ytKc9jedmm6uuuuqqq676N6Jy1VVXXXXVVVddddVVV/2fdc011zz4tV/7td/rnd7pnT4bYHd3l5/6qZ/i1ltv5blJ4l9DEi8qSfxrSOJfQxL/WpL415LEv5YkHujYsWO8xEu8BK/xGq8BwOHhIU996lP5u7/7O54f27wobHPttdcCcN99993KVVddddVVV11B5aqrrrrqqquuuuqqq676P+kd3/EdP+ud3umdPhtgd3eXv/qrv+K3f/u3eX4k8aKSxL+GJP41JPGvIYl/LUn8a0jiX0sSz+3VX/3VeY3XeA3u97d/+7f83d/9HS+Ibf4tzp49+wyuuuqqq6666goqV1111VVXXXXVVVddddX/KS/2Yi/22h/+4R/+Xddcc82DAX7rt36L3/7t3+b5kcSLShL/GpL415DEv4Yk/rUk8a8liX8tSTzQq7/6q/Mar/Ea3O/ee+/lj/7ojzg8POQFsc2LyjYA1157LQD/8A//8NtcddVVV1111RVUrrrqqquuuuqqq6666qr/E6655poHf/iHf/h3vdiLvdhrA9x666381E/9FLu7uzw3SfxrSOJFJYl/DUn8a0jiX0sS/1qS+NeSxAPdcsstvPmbvznHjh0D4PDwkD/6oz/i3nvv5YWxzYvKNlddddVVV131QlC56qqrrrrqqquuuuqqq/5Xu+aaax782q/92u/1Tu/0Tp8NsLu7y0/91E9x66238vxI4kUliX8NSfxrSOJfQxL/WpL415DEv5YkHujYsWO8+Zu/ObfccgsAh4eH/O3f/i1Pe9rT+JfY5kVlmwfa2toC4L777ruVq6666qqrrrqCylVXXXXVVVddddVVV131v9Y7vuM7ftY7vdM7fTbA7u4uf/VXf8Vv//Zv8/xI4l9DEi8qSfxrSOJfQxL/WpL415LEv4YkHujYsWO8xEu8BK/xGq8BwOHhIU972tP427/9W14UtnlR2eaBNjc3Abjvvvtu5aqrrrrqqquejcpVV1111VVXXXXVVVdd9b/Oi73Yi732h3/4h3/XNddc82CA3/qt3+K3f/u3eUEk8aKSxL+GJF5UkvjXkMS/hST+NSTxryWJB3r1V391XuM1XoP7/d3f/R1/93d/h23+K1x33XUA/MM//MNvc9VVV1111VXPRuWqq6666qqrrrrqqquu+l/jmmuuefCHf/iHf9eLvdiLvTbA7u4u3/Vd38Xu7i7PjyT+NSTxopLEv4Yk/jUk8a8liX8NSfxrSeKBXv3VX53XeI3X4H733nsvf/zHf8zh4SG2eVHZ5kVlm6uuuuqqq656EVG56qqrrrrqqquuuuqqq/7Hu+aaax782q/92u/1Tu/0Tp8NsLu7y2/91m/x13/917wgknhRSeJfQxIvKkn8a0jiX0sS/1qS+NeQxAMdO3aMN3/zN+eWW24B4PDwkD/6oz/ivvvu41/LNi8q2zw/1157LQD33XffrVx11VVXXXXVs1G56qqrrrrqqquuuuqqq/5He8d3fMfPeqd3eqfP5pl+67d+i9/+7d/mBZHEi0oS/xqS+NeQxL+GJP61JPGvIYl/LUnc79ixY7zGa7wGL/ESLwHA4eEhT3va0/i7v/s7Hsg2LwrbvKhs8y85e/bsM7jqqquuuuqqZ6Ny1VVXXXXVVVddddVVV/2PdM011zz4cz7nc37rmmuueTDAb/3Wb/Hbv/3bvDCSeFFJ4kUliX8NSfxrSOJfSxL/GpL415LE/Y4dO8ZLvMRL8Bqv8Rrc7+/+7u/4u7/7O56bbV4UtnlR2eaFufbaawH4h3/4h9/mqquuuuqqq56NylVXXXXVVVddddVVV131P8o111zz4Hd8x3f8rNd5ndd5b4Dd3V1+6qd+iltvvZUXRBIvKkn8a0jiRSWJfw1J/GtJ4l9LEv8aknigV3/1V+c1XuM1uN/f/d3f8Xd/93c8P7Z5UdjmRWWbq6666qqrrvo3onLVVVddddVVV1111VVX/Y/xju/4jp/1Tu/0Tp8NsLu7y1/91V/x27/927wgkvjXkMSLShL/GpL415DEv5Yk/jUk8a8lifvdcsstvPmbvznHjh0D4N577+WP//iPOTw85PmxzYvCNv/Rtra2ALjvvvtu5aqrrrrqqquejcpVV1111VVXXXXVVVdd9d/uHd/xHT/rnd7pnT6bZ/qt3/otfvu3f5sXRhIvKkn8a0jiRSWJfw1J/GtJ4l9DEv9akrjfsWPHePM3f3NuueUWAA4PD/mjP/oj7rvvPl4Q27wobPOvYZt/ybXXXgvAfffddytXXXXVVVdd9ZyoXHXVVVddddVVV1111VX/ba655poHf/iHf/h3vdiLvdhrA/z1X/81P/VTP8ULI4l/DUm8qCTxryGJfw1J/GtI4l9LEv8akrjfsWPHeI3XeA1e4iVeAoDDw0Oe9rSn8Xd/93e8MLb5z2CbF8XW1hYA//AP//DbXHXVVVddddVzonLVVVddddVVV1111VVX/Ze75pprHvzar/3a7/VO7/ROnw2wu7vLT/3UT3HrrbfywkjiRSWJF5Uk/jUk8a8hiX8tSfxrSOJfSxIAx44d4yVe4iV4jdd4De73d3/3d/zd3/0d/xLbvKhs86KyzYvKNlddddVVV131AlC56qqrrrrqqquuuuqqq/5LveM7vuNnvdM7vdNnA+zu7vJXf/VX/PZv/zYvjCT+NSTxopLEv4YkXlSS+NeSxL+GJP61JHG/V3/1V+c1XuM1uN/f/d3f8Xd/93e8KGzzorLNi8o2LyrbXHfddQD8wz/8w+9w1VVXXXXVVc+JylVXXXXVVVddddVVV131X+LFXuzFXvtzP/dzf4tn+q3f+i1++7d/m3+JJF5UknhRSeJfQxL/GpL415DEv5Yk/jUkcb9bbrmFN3/zN+fYsWMAHB4e8uu//uscHh7yorDNi8o2LyrbvKhsc9VVV1111VX/AipXXXXVVVddddVVV1111X+qa6655sEf/uEf/l0v9mIv9toAt956Kz/1Uz/F7u4uL4wkXlSS+NeQxItKEv8akvjXksS/hiT+tSQBcOzYMd78zd+cW265BYDDw0P++I//mHvvvZcXlW1eVLb5z3bttdcC8A//8A+/zVVXXXXVVVc9JypXXXXVVVddddVVV1111X+Ka6655sGv/dqv/V7v9E7v9NkAu7u7/NRP/RS33nor/xJJvKgk8aKSxL+GJP41JPGvIYl/DUn8a0kC4NixY7zES7wEr/EarwHA4eEhT3va0/j7v/97bPOiss2Lyjb/GrZ5Udnmqquuuuqqq14EVK666qqrrrrqqquuuuqq/3Dv+I7v+Fnv9E7v9NkAu7u7/NVf/RW//du/zb9EEi8qSfxrSOJFJYl/DUn8a0niX0MS/xqSADh27Bgv8RIvwWu8xmtwv7/7u7/j7//+7wGwzYvKNi8q2/xr2OZFZZsH2traAuC+++67lauuuuqqq656TlSuuuqqq6666qqrrrrqqv8wL/ZiL/baH/7hH/5d11xzzYMBfuu3fovf/u3f5kUhiReVJF5UkvjXkMSLShL/WpL415DEv5YkAF791V+d13iN1+B+T3/60/m7v/s7Dg8PAbDNi8o2Lyrb/GvY5kVlmwe69tprAfiHf/iH3+Gqq6666qqrnheVq6666qqrrrrqqquuuurf7Zprrnnwh3/4h3/Xi73Yi702wK233spP/dRPsbu7y79EEi8qSfxrSOJFJYl/DUn8a0jiX0sS/xqSALjlllt48zd/c44dOwbA4eEhf/zHf8x9993H/WzzP4FtXlS2eW5bW1sA3Hfffbdy1VVXXXXVVc+LylVXXXXVVVddddVVV131b3bNNdc8+LVf+7Xf653e6Z0+G2B3d5ef+qmf4tZbb+VFIYkXlSReVJL415DEi0oS/1qS+NeQxL+GJACOHTvGm7/5m3PLLbcAcHh4yN/93d/x9Kc/nQeyzb+GbV5Utrnqqquuuuqq/0GoXHXVVVddddVVV1111VX/Ju/4ju/4We/0Tu/02QC7u7v81V/9Fb/927/Ni0ISLypJ/GtI4kUliX8NSfxrSOJfQxL/WpI4duwYL/ESL8FrvMZrAHB4eMjTnvY0/v7v/57nZpt/Ddu8qGzzr2GbF5Vtnp/rrrsOgH/4h3/4ba666qqrrrrqeVG56qqrrrrqqquuuuqqq/5VXuzFXuy1P/zDP/y7rrnmmgcD/NZv/Ra//du/zYtKEi8qSbyoJPGiksS/hiT+tSTxryGJfw1JALz6q786r/Ear8H9/u7v/o6///u/5/mxzb+GbV5UtvnXsM2LyjZXXXXVVVdd9W9E5aqrrrrqqquuuuqqq656kVxzzTUP/vAP//DverEXe7HXBnj605/OT//0T7O7u8uLQhIvKkm8qCTxryGJF5Uk/rUk8a8hiX8NSQC8+qu/Oq/xGq/B/e677z7++I//mMPDQ54f2/xr2OZFZZt/Ddu8qGzzwlx77bUA/MM//MNvc9VVV1111VXPi8pVV1111VVXXXXVVVdd9UJdc801D37t137t93qnd3qnzwbY3d3lJ3/yJ3nGM57Bi0oSLypJvKgk8aKSxL+GJP41JPGvIYl/LUnccsstvPmbvznHjh0D4PDwkD/+4z/mvvvu4z+KbV5UtvnXsM1/pK2tLa666qqrrrrqhaBy1VVXXXXVVVddddVVV71A7/iO7/hZ7/RO7/TZALu7u/zVX/0Vv/3bv82LShIvKkm8qCTxryGJF5Uk/rUk8a8hiX8NSRw7dow3f/M355ZbbgHg8PCQv/u7v+PpT386/xLbvKhs8z+FbV5U9913361cddVVV1111fOictVVV1111VVXXXXVVVc9jxd7sRd77Q//8A//rmuuuebBAL/1W7/Fb/3WbyGJF5UkXlSSeFFJ4kUliX8NSfxrSOJfQxL/GpI4duwYL/ESL8FrvMZrAHB4eMjTnvY0/v7v/54XhW1eVLb517DNv4ZtXlS2+Zdce+21APzDP/zDb3PVVVddddVVzx+Vq6666qqrrrrqqquuuupZrrnmmgd/+Id/+He92Iu92GsDPP3pT+enfuqnuHTpEpJ4UUjiRSWJF5Uk/jUk8aKSxL+WJP41JPGvIYlXf/VX5zVe4zW439/93d/x93//97yobPOiss2/hm3+NWzzorLNi2JrawuA++6771auuuqqq6666vmjctVVV1111VVXXXXVVVdxzTXXPPi1X/u13+ud3umdPhtgd3eX3/qt3+Kv/uqvkMSLShIvKkm8qCTxopLEv4Yk/jUk8a8hiX8NSbzES7wEb/7mb8797rvvPv74j/+Yw8NDXlS2eVHZ5l/DNv8atvnPsLW1xVVXXXXVVVf9C6hcddVVV1111VVXXXXV/3Pv+I7v+Fnv9E7v9NkAu7u7/NVf/RW/9Vu/hSQk8aKQxItKEi8qSfxrSOJFJYl/LUm8qCTxr3X8+HHe/M3fnFtuuQWAw8ND/uRP/oR7772Xfw3b/GexzX8m27yotra2APiHf/iH3+Gqq6666qqrnj8qV1111VVXXXXVVVdd9f/Ui73Yi732h3/4h3/XNddc82CA3/qt3+K3fuu3AJDEi0oSLypJvKgk8aKSxL+GJP41JPGvIYl/jePHj/Mar/EavMRLvAQAh4eHPP3pT+fv/u7v+Neyzb+GbV5UtvnXss2Lyjb/Gra56qqrrrrqqn8Blauuuuqqq6666qqrrvp/5pprrnnwO77jO37W67zO67w3wO7uLj/5kz/JrbfeiiReVJJ4UUniRSWJfw1JvKgk8a8hiX8NSfxrHD9+nJd4iZfgNV7jNbjf3//93/P3f//32OZfyzb/Grb5z2Sb/yy2ue666wD4h3/4h9/mqquuuuqqq54/KlddddVVV1111VVXXfX/xDXXXPPg137t136vd3qnd/psgN3dXX7rt36Lv/qrvwJAEi8qSbyoJPGiksSLShIvKkn8a0niX0MS/xqv8RqvwWu8xmtwv7//+7/n7//+7wGwzb+Wbf41bPOvYZt/Ddv8a9jmX2trawuA++6771auuuqqq6666vmjctVVV1111VVXXXXVVf8PvOM7vuNnvdM7vdNn80y/9Vu/xW/91m9xP0m8KCTxopLEi0oSLypJ/GtI4l9DEv8akvjXeNCDHsSbv/mbc+zYMQDuu+8+/uRP/oTDw0MAbPOvZZt/Ddv8a9jmX8M2/xq2+dewzVVXXXXVVVe9iKhcddVVV1111VVXXXXV/2HXXHPNgz/8wz/8u17sxV7stQH+6q/+ip/6qZ/ifpJ4UUniRSWJF5UkXlSSeFFJ4l9LEi8qSfxrHD9+nDd/8zfnlltuAeDw8JA/+ZM/4b777uN+tvnXss2/hm3+NWzzP4ltAK677joA/uEf/uG3ueqqq6666qoXjMpVV1111VVXXXXVVVf9H3TNNdc8+B3f8R0/63Ve53XeG2B3d5ef/Mmf5NZbb+V+knhRSOJFJYkXlSReVJL415DEv4Yk/jUk8aI6duwYr/mar8lLvMRLAHB4eMjTn/50/v7v/54Hss2/lm3+NWzzr2Gbfy3b/GvY5t9ia2sLgPvuu+9WrrrqqquuuuoFo3LVVVddddVVV1111VX/x7zjO77jZ73TO73TZwPs7u7yV3/1V/zWb/0W95PEi0oSLypJvKgk8aKSxItKEv9aknhRSeJFdezYMV7yJV+S13iN1+B+f//3f8/f//3f89xs869lm38N2/xns82/hm3+NWxzv83NTa666qqrrrrqRUDlqquuuuqqq6666qqr/o94ndd5nff+8A//8O/imX7rt36L3/qt3+KBJPGikMSLShIvKkm8qCTxryGJfw1J/GtI4kX1Gq/xGrzGa7wG9/v7v/97/v7v/57nxzb/Wrb5z2ab/0y2+dewzQNtbW0B8A//8A+/w1VXXXXVVVe9YFSuuuqqq6666qqrrrrqf7lrrrnmwR/+4R/+XS/2Yi/22gBPf/rT+amf+il2d3e5nyReVJJ4UUniRSWJF5UkXlSS+NeQxL+GJF5Ut9xyC2/xFm/BsWPHADg8POQ3f/M3OTw85Pmxzb+Wbf61bPOvYZt/Ldv8V9ra2uKqq6666qqrXgRUrrrqqquuuuqqq6666n+pa6655sGv/dqv/V7v9E7v9NkAu7u7/ORP/iS33norDySJF4UkXlSSeFFJ4kUliX8NSfxrSOJfQxIvimPHjvHmb/7mPOhBDwLg8PCQP/mTP+G+++7jBbHNv5Zt/rVs869hm38t2/xr2OZfwzbPbWtrC4B/+Id/+G2uuuqqq6666gWjctVVV1111VVXXXXVVf8LveM7vuNnvdM7vdNnA+zu7vJXf/VX/NZv/RYPJIkXlSReVJJ4UUniRSWJF5Uk/jUk8a8hiRfFsWPHeMmXfEle4zVeA4DDw0Oe/vSn8/d///e8MLb517LNv5Zt/jVs869lm38N2/xr2Ob52draAuC+++67lauuuuqqq656wahcddVVV1111VVXXXXV/yIv9mIv9tof/uEf/l3XXHPNgwF+67d+i9/6rd/iuUniRSWJF4UkXlSSeFFJ4l9DEv8aknhRSeJFcezYMV7yJV+S13iN1+B+f//3f8/f//3f8y+xzb+Wbf61bHPVVVddddVVV0Hlqquuuuqqq6666qqr/he45pprHvzhH/7h3/ViL/Zirw3w9Kc/nZ/6qZ9id3eXB5LEi0oSLypJvKgk8aKSxItKEv8akvjXkMSL4jVe4zV4jdd4De739Kc/nb//+7/n8PCQf4lt/ivY5l/LNv9atvnXsM2/hm2en+uuuw6Af/iHf/htrrrqqquuuuqFo3LVVVddddVVV1111VX/g11zzTUPfu3Xfu33eqd3eqfPBtjd3eUnf/InufXWW3luknhRSeJFIYkXlSReVJL415DEv4YkXlSSeFHccsstvMVbvAXHjh0D4PDwkD/5kz/hvvvu40Vhm38L2/xns82/lm3+u2xubgJw33333cpVV1111VVXvXBUrrrqqquuuuqqq6666n+od3zHd/ysd3qnd/psgN3dXf7qr/6K3/qt3+L5kcSLQhIvKkm8qCTxopLEi0oS/xqS+NeQxL/k2LFjvPmbvzkPetCDADg8POTv//7vefrTn86Lyjb/Frb517LN/0S2+dewzQuytbUFwH333XcrV1111VVXXfXCUbnqqquuuuqqq6666qr/YV7sxV7stT/8wz/8u6655poHA/zWb/0Wv/Vbv8XzI4kXlSReFJJ4UUniRSWJfw1J/GtI4kUliX/JsWPHeMmXfEle4zVeA4DDw0Oe/vSn8/d///f8a9jm38I2/1q2+deyzb+Wbf41bPOvYZsXZmtrC4CzZ88+g6uuuuqqq6564ahcddVVV1111VVXXXXV/xDXXHPNgz/8wz/8u17sxV7stQGe/vSn81M/9VPs7u7y/EjiRSGJF5UkXlSSeFFJ4kUliX8NSfxrSOJf8hqv8Rq8xmu8Bvf7+7//e/7+7/+efy3b/FvY5l/LNv9atvnXss1/t62tLa666qqrrrrqRUTlqquuuuqqq6666qqr/ptdc801D37t137t93qnd3qnzwbY3d3lJ3/yJ7n11lt5fiTxopLEi0ISLypJvKgk8a8hiX8NSbyoJPEveY3XeA1e4zVeg/vdd999/Mmf/AmHh4f8a9nm38I2/1q2+deyzX8F2/xr2OZfsrW1BcA//MM//DZXXXXVVVdd9cJRueqqq6666qqrrrrqqv9G7/iO7/hZ7/RO7/TZALu7u/zVX/0Vv/Vbv8ULIokXhSReVJJ4UUniRSWJF5Uk/jUk8a8hiRfmlltu4S3e4i04duwYAIeHh/zJn/wJ9913H/8Wtvm3sM3/ZLb517DNf4atrS0A7rvvvlu56qqrrrrqqheOylVXXXXVVVddddVVV/03eLEXe7HX/vAP//Dvuuaaax4M8Fu/9Vv81m/9Fi+IJF5UknhRSeJFIYkXlST+NSTxryGJF5UkXphjx47x5m/+5jzoQQ8C4PDwkKc//en8/d//Pf9Wtvm3sM2/hW3+tWzzr2Wb/2y2+ZdsbW1x1VVXXXXVVf8KVK666qqrrrrqqquuuuq/0DXXXPPgD//wD/+uF3uxF3ttgKc//en81E/9FLu7u7wgknhRSOJFJYkXlSReVJJ4UUniX0MS/xqSeEGOHTvGS77kS/Iar/EaABweHvL0pz+df/iHf8A2/1a2+a9km38t2/xXsM1/hq2tLQD+4R/+4be56qqrrrrqqn8Zlauuuuqqq6666qqrrvovcM011zz4tV/7td/rnd7pnT4bYHd3l5/8yZ/k1ltv5YWRxItCEi8qSbwoJPGiksS/hiT+NSTxopLEC/Mar/EavMZrvAb3+/u//3v+4R/+AQDb/FvZ5t/KNv+T2eY/m21eFFtbWwDcd999t3LVVVddddVV/zIqV1111VVXXXXVVVdd9Z/sHd/xHT/rnd7pnT4bYHd3l7/6q7/it37rt3hhJPGiksSLQhIvKkm8qCTxopLEv4YkXlSSeGFe8iVfkjd/8zfnfvfddx9/+qd/yuHhIQC2+beyzb+Vbf4tbPOvZZv/Crb5z7K5uQnAfffddytXXXXVVVdd9S+jctVVV1111VVXXXXVVf9JXuzFXuy1P/zDP/y7rrnmmgcD/NZv/Ra/9Vu/xb9EEi8KSbyoJPGiksSLQhL/GpL415DEi0oSL8ixY8d48zd/cx70oAcBcHh4yJ/+6Z9y3333AWCb/y62+bewzb+Wbf4tbPOfzTYvqq2tLQDOnj37DK666qqrrrrqX0blqquuuuqqq6666qqr/oNdc801D/7wD//w73qxF3ux1wbY3d3lO7/zO9nd3eWFkcSLShIvCkm8qCTxopLEi0oS/xqSeFFJ4gU5duwYr/Ear8FLvuRLAnB4eMjTn/50/uEf/oH72ebfyzb/Frb5t7DNfxXb/GvZ5j/T1tYWAPfdd9+tXHXVVVddddW/jMpVV1111VVXXXXVVVf9B7nmmmse/Nqv/drv9U7v9E6fDbC7u8tv/dZv8Vd/9Vf8SyTxopDEi0oSLypJvKgk8aKSxL+GJF5Uknh+jh07xku+5EvyGq/xGtzv7//+7/mHf/gHHsg2/162+d/ANv9T2eZfY2trC4CzZ8/eylVXXXXVVVf9y6hcddVVV1111VVXXXXVf4B3fMd3/Kx3eqd3+mye6bd+67f4rd/6Lf4lknhRSeJFIYkXlSReVJJ4UUniX0MSLypJvCCv8RqvwWu8xmtwv7//+7/nH/7hH3hutvn3ss2/lW3+LWzzX8U2/1q2+c+2tbUFwH333XcrV1111VVXXfUvo3LVVVddddVVV1111VX/Dtdcc82DP+dzPue3rrnmmgcD/OZv/ia//du/zYtCEi8KSbyoJPGiksSLShIvKkn8a0jiRSWJ5+eWW27hLd7iLTh27BgA9913H3/6p3/K4eEhz802/162+beyzb+Fbf4tbPM/lW3+Nba2trjqqquuuuqqfyUqV1111VVXXXXVVVdd9W9wzTXXPPgd3/EdP+t1Xud13htgd3eXn/zJn+TWW2/lRSGJF4UkXlSSeFFI4kUliReVJP41JPGiksTzc+zYMd78zd+cBz3oQQAcHh7yp3/6p9x33308P7b597LNv5Vt/ivZ5t/CNv9atvnPdu211wLwD//wD7/DVVddddVVV71oqFx11VVXXXXVVVddddW/0ju+4zt+1ju90zt9NsDu7i6/+Zu/yV//9V/zopDEi0oSLwpJvKgk8aKSxItKEv8aknhRSeK5HTt2jNd4jdfgJV/yJQE4PDzk6U9/Ov/wD//AC2Kbfy/b/Hewzf81tvm3uu+++27lqquuuuqqq140VK666qqrrrrqqquuuupF9I7v+I6f9U7v9E6fzTP95m/+Jr/1W7+FJF4UknhRSOJFJYkXhSReVJJ4UUniX0MSLypJPLdjx47xki/5krzGa7wG9/v7v/97/uEf/oEXxjb/Xrb597DNfyXb/FvY5l/LNv/ZbLO1tQXAfffd93Suuuqqq6666kVD5aqrrrrqqquuuuqqq/4F11xzzYM//MM//Lte7MVe7LUB/uqv/oqf/MmfRBKS+JdI4kUliReFJF5UknhRSeJFJYl/DUm8qCTx3F7jNV6D13iN1+B+f//3f88//MM/8C+xzX832/xb2eb/Gtv8W2xtbQFw9uzZZ3DVVVddddVVLxoqV1111VVXXXXVVVdd9QJcc801D37Hd3zHz3qd13md9wbY3d3lJ3/yJ3n605+OJF4UknhRSOJFJYkXlSReFJJ4UUniX0MSLypJPLdbbrmFt3iLt+DYsWMAHB4e8lu/9VscHh7yL7HNfwTb/Hewzb+Fbf4tbPOvZZv/KltbWwCcPXv2Vq666qqrrrrqRUPlqquuuuqqq6666qqrno93fMd3/Kx3eqd3+myA3d1d/vIv/5Lf+q3fQhKSeFFI4kUhiReFJF5UknhRSeJFJYl/DUm8qCTxQMeOHePN3/zNedCDHgTA4eEhf/qnf8p9993Hi8I2/xFs8+9hm6v+fWwDsLW1BcB99913K1ddddVVV131oqFy1VVXXXXVVVddddVVD/A6r/M67/3hH/7h38Uz/eZv/ia/9Vu/BYAkXhSSeFFJ4kUhiReVJF4UknhRSeJfQxIvKkk80LFjx3jJl3xJXuM1XgOAw8NDnv70p/MP//APvKhs8x/BNv8etvm3ss2/hW3+LWzzr2Wbfy3b/FttbW0BcN99993KVVddddVVV71oqFx11VVXXXXVVVdddRVwzTXXPPjDP/zDv+vFXuzFXhvg6U9/Oj/5kz/J7u4uAJJ4UUjiRSGJF5UkXhSSeFFJ4kUliX8NSbyoJHG/Y8eO8ZIv+ZK8xmu8Bvf7+7//e/7hH/6Bfw3b/EewzVX//WwDsLW1BcB99913K1ddddVVV131oqNy1VVXXXXVVVddddX/a9dcc82DX/u1X/u93umd3umzAXZ3d/nJn/xJnv70pwMgiReFJF5UknhRSOJFJYkXlSReFJL415DEi0oSD/Qar/EavMZrvAb3u++++/jTP/1TDg8P+dewzf8Utvm3ss2/hW3+J7PNv9V1110HwNmzZ2/lqquuuuqqq150VK666qqrrrrqqquu+n/rHd/xHT/rnd7pnT4bYHd3l7/8y7/kt37rt7ifJF4UknhRSOJFJYkXhSReVJJ4UUniX0MSLypJ3O+WW27hLd7iLTh27BgAh4eH/Omf/in33Xcf/1q2+Y9im/9PbPOvZZv/Dvfdd9+tXHXVVVddddWLjspVV1111VVXXXXVVf/vvNiLvdhrf/iHf/h3XXPNNQ8G+M3f/E1+67d+i/tJ4kUliReFJF4UknhRSeJFJYkXhST+NSTxopLE/Y4dO8abv/mb86AHPQiAw8ND/uEf/oGnP/3p/FvY5j+Kbf69bPNvZZt/C9v8X2Ob+21tbQFw33333cpVV1111VVXveioXHXVVVddddVVV131/8Y111zz4A//8A//rhd7sRd7bYCnP/3p/ORP/iS7u7vcTxIvCkm8qCTxopDEi0oSLwpJvKgk8a8hiReVJACOHTvGS77kS/Iar/EaABweHvL0pz+df/iHf+DfyjZX/dvZ5l/LNv9atvn32NraAuDs2bPP4KqrrrrqqqtedFSuuuqqq6666qqrrvo/75prrnnwa7/2a7/XO73TO302wO7uLj/5kz/J05/+dB5IEi8KSbwoJPGiksSLQhIvKkm8qCTxopLEi0oS93uN13gNXuM1XoP7/f3f/z3/8A//wL+Hbf4j2ebfyzb/Vra56vm77rrrALjvvvtu5aqrrrrqqqtedFSuuuqqq6666qqrrvo/7R3f8R0/653e6Z0+G2B3d5e//Mu/5Ld+67d4IEm8KCTxopLEi0ISLypJvCgk8aKSxL+GJF5UkgB4jdd4DV7jNV6D+91333386Z/+KYeHh/x72OY/km3+vWzz38E2/9fY5vk5e/bsrVx11VVXXXXVi47KVVddddVVV1111VX/J73Yi73Ya3/4h3/4d11zzTUPBvjN3/xNfuu3fovnJokXhSReFJJ4UUniRSGJF5UkXlSSeFFJ4kUlCYBbbrmFt3iLt+DYsWMAHB4e8qd/+qfcd999/HvZ5v8a2/xXs81/Bdv8e21tbQFw33333cpVV1111VVXveioXHXVVVddddVVV131f8o111zz4A//8A//rhd7sRd7bYCnP/3p/ORP/iS7u7s8N0m8KCTxopDEi0ISLypJvCgk8aKSxL+GJF5Ukjh27Bhv/uZvzoMe9CAADg8PefrTn84//MM/8B/BNv/RbPO/lW3+K9nmv9rW1hYA9913361cddVVV1111b8Olauuuuqqq6666qqr/k+45pprHvzar/3a7/VO7/ROnw2wu7vLT/7kT/L0pz+d5yaJF4UkXlSSeFFI4kUhiReVJF5UknhRSeJf4/jx47zkS74kr/EarwHA4eEhT3/60/mHf/gH/qPY5n8q21z1n+O6664D4B/+4R9+m6uuuuqqq67616Fy1VVXXXXVVVddddX/eu/4ju/4We/0Tu/02QC7u7v85V/+Jb/1W7/F8yOJF4UkXhSSeFFJ4kUhiReVJF4UkvjXkMSLShKv8RqvwWu8xmtwv7//+7/nH/7hH/jfwDb/3WzzX802/1PZ5qqrrrrqqqv+g1C56qqrrrrqqquuuup/rRd7sRd77Q//8A//rmuuuebBAL/5m7/Jb/3Wb/H8SOJFJYkXhSReFJJ4UUniRSGJF5Uk/jUk8aJ6qZd6KV7jNV6DY8eOAXDffffxp3/6pxweHvIfzTb/U9nm/wPb/GvZ5t9ra2sLgPvuu+9Wrrrqqquuuupfh8pVV1111VVXXXXVVf/rXHPNNQ/+8A//8O96sRd7sdcGePrTn85P/uRPsru7y/MjiReFJF4UknhRSeJFIYkXlSReVJJ4UUniRXX8+HHe/M3fnAc96EEAHB4e8qd/+qfcd999/GewzX8G2/xvZpv/D7a2tgA4e/bsM7jqqquuuuqqfx0qV1111VVXXXXVVVf9r3HNNdc8+LVf+7Xf653e6Z0+G2B3d5ef/Mmf5OlPfzoviCReFJJ4UUjiRSGJF5UkXhSSeFFJ4l9DEi+KY8eO8Zqv+Zq85Eu+JACHh4c8/elP5x/+4R/4z2Kb/8tsc9ULd9111wFw33333cpVV1111VVX/etQueqqq6666qqrrrrqf4V3fMd3/Kx3eqd3+myA3d1d/vIv/5Lf+q3f4gWRxItCEi8qSbwoJPGikMSLShIvKkm8qCTxojh27Bgv9VIvxWu8xmtwv7//+7/nH/7hH/jfyjb/EWzzv41t/jc6e/bsrVx11VVXXXXVvw6Vq6666qqrrrrqqqv+R3uxF3ux1/7wD//w77rmmmseDPCbv/mb/NZv/RYvjCReFJJ4UUjiRSWJF4UkXlSSeFFI4l9DEi+K13iN1+A1X/M1ud/f//3f8w//8A/8V7DNVf+/2Oa5bW1tAXDffffdylVXXXXVVVf961C56qqrrrrqqquuuup/pGuuuebBH/7hH/5dL/ZiL/baALu7u3zHd3wHu7u7vDCSeFFI4kUhiReFJF5UknhRSOJFJYkXlSReFA960IN4i7d4C44dOwbAfffdx5/+6Z9yeHjIfwXbXPWC2ea/km3+tWzz77W1tQXAfffddytXXXXVVVdd9a9H5aqrrrrqqquuuuqq/1GuueaaB7/2a7/2e73TO73TZwPs7u7ym7/5m/zVX/0VL4wkXhSSeFFJ4kUhiReFJF5UknhRSOJfQxL/kmPHjvEWb/EWPOhBDwLg8PCQP/3TP+W+++7j/wrbXPW/w3XXXQfAP/zDP/w2V1111VVXXfWvR+Wqq6666qqrrrrqqv8x3vEd3/Gz3umd3umzeabf/M3f5Ld+67f4l0jiRSGJF4UkXhSSeFFJ4kUhiReVJF5UkviXHDt2jNd8zdfkJV/yJQE4PDzk6U9/Ov/wD//AfzXb/G9gm38P21x11VVXXXXVVf+pqFx11VVXXXXVVVdd9d/ummuuefDnfM7n/NY111zzYIDf/M3f5Ld+67d4UUjiRSGJF4UkXhSSeFFI4kUliReVJF5Uknhhjh07xku+5Evymq/5mtzv7//+7/mHf/gHrrrqv9t1110HwH333XcrV1111VVXXfWvR+Wqq6666qqrrrrqqv8211xzzYPf8R3f8bNe53Ve570BLl68yE/91E/x9Kc/nX+JJF4UknhRSOJFJYkXhSReVJJ4UUjiX0MSL8xrvMZr8Jqv+Zrc7+///u/5h3/4B/472eaqq57b2bNnn8FVV1111VVX/etRueqqq6666qqrrrrqv8U7vuM7ftY7vdM7fTbAxYsX+au/+it+67d+ixeFJF4UknhRSOJFIYkXlSReFJJ4UUniRSWJF+ZBD3oQb/EWb8GxY8cAODw85Ld+67c4PDzk/zrbXPW/x3XXXQfAP/zDP/w2V1111VVXXfWvR+Wqq6666qqrrrrqqv9S7/iO7/hZ7/RO7/TZPNNv/uZv8pu/+ZtI4kUhiReFJF4UknhRSOJFIYkXlSReFJL415DEC3Ls2DHe4i3eggc96EEAHB4e8qd/+qfcd999/E9gm6v+c9nmfyrbXHXVVVddddV/MCpXXXXVVVddddVVV/2XuOaaax784R/+4d/1Yi/2Yq8N8Jd/+Zf85E/+JJKQxL9EEi8KSbwoJPGiksSLQhIvCkm8qCTxopLEC3Ls2DFe8iVfktd8zdcE4PDwkKc//en8wz/8A1dd9T/Z1tYWAPfdd9+tXHXVVVddddW/HpWrrrrqqquuuuqqq/5TXXPNNQ9+7dd+7fd6p3d6p88GuHjxIj/5kz/J05/+dCTxopDEi0ISLwpJvCgk8aKSxItCEi8qSbyoJPH8HDt2jJd8yZfkNV/zNbnf3//93/MP//APXHXV/3TXXXcdAPfdd9+tXHXVVVddddW/DZWrrrrqqquuuuqqq/7TvOM7vuNnvdM7vdNnA1y8eJG/+qu/4jd/8zcBkMSLQhIvCkm8KCTxopDEi0ISLypJvCgk8a8hiefnNV7jNXjN13xN7nfffffxp3/6pxweHnLVVf8bbG1tAfAP//APv81VV1111VVX/dtQueqqq6666qqrrrrqP9zrvM7rvPeHf/iHfxfP9Ju/+Zv85m/+JgCSeFFI4kUhiReFJF4UknhRSeJFIYkXlSReVJJ4fh70oAfxFm/xFhw7dgyAw8ND/vRP/5T77ruPq6666qqrrrrqqv9nqFx11VVXXXXVVVdd9R/mmmuuefCHf/iHf9eLvdiLvTbA05/+dH7iJ36C3d1dACTxopDEi0ISLwpJvCgk8aKQxItKEi8KSfxrSOK5HTt2jLd4i7fgQQ96EACHh4f8wz/8A09/+tO56qr/ja677joA/uEf/uF3uOqqq6666qp/GypXXXXVVVddddVVV/27XXPNNQ9+7dd+7fd6p3d6p88GuHjxIj/5kz/J05/+dO4niReFJF4UknhRSOJFIYkXhSReFJJ4UUniRSWJ53bs2DFe8iVfktd8zdcE4PDwkKc//en8wz/8A1ddddVVV1111VX/z1G56qqrrrrqqquuuurf5R3f8R0/653e6Z0+G+DixYv81V/9Fb/5m7/J/STxopDEi0ISLwpJvCgk8aKSxItCEi8qSbyoJPHcXuM1XoPXfM3X5H5///d/zz/8wz9w1VUviCRs87/BddddB8A//MM//DZXXXXVVVdd9W9D5aqrrrrqqquuuuqqf5MXe7EXe+0P//AP/65rrrnmwQC/+Zu/yW/+5m/yQJJ4UUjiRSGJF4UkXhSSeFFI4kUliReFJF5Uknhur/Ear8FrvuZrcr/77ruPP/3TP+Xw8JCrXjhJ2OZ/AknY5qqrrrrqqquu+k9D5aqrrrrqqquuuuqqf5VrrrnmwR/+4R/+XS/2Yi/22gBPf/rT+Ymf+Al2d3d5IEm8KCTxopDEi0ISLwpJvCgk8aKQxItKEi8qSTzQgx70IN7iLd6CY8eOAXB4eMif/umfct9993HVfz1J2Oaq/xxbW1sA3Hfffbdy1VVXXXXVVf82VK666qqrrrrqqquuepFcc801D37t137t93qnd3qnzwa4ePEiP/mTP8nTn/50npsk/iWSeFFI4kUhiReFJF5UknhRSOJFIYl/DUnc79ixY7zFW7wFD3rQgwA4PDzk6U9/Ov/wD//AVVf9X3TdddcBcPbs2Wdw1VVXXXXVVf92VK666qqrrrrqqquu+he94zu+42e90zu902cDXLx4kb/6q7/iN3/zN3luknhRSOJFIYkXhSReFJJ4UUjiRSWJF4UkXlSSuN+xY8d4yZd8SV7zNV8TgMPDQ57+9KfzD//wD/xfJAnbXPUvk4Rt/q/a2toC4O///u9/m6uuuuqqq676t6Ny1VVXXXXVVVddddUL9GIv9mKv/eEf/uHfdc011zwY4Dd/8zf5zd/8TZ4fSbwoJPGikMSLQhIvCkm8KCTxopDEi0oSLypJ3O81XuM1eM3XfE3u9/d///f8wz/8A1f9+0nCNlddddVVV1111f95VK666qqrrrrqqquueh7XXHPNgz/8wz/8u17sxV7stQGe/vSn8xM/8RPs7u7y/EjiXyKJF4UkXhSSeFFI4kUliReFJF4UkvjXkATAS77kS/Kar/maHDt2DID77ruPP/3TP+Xw8JD/DyRhm/8tJGGbfytJ2OYqkIRtAK677joA/uEf/uG3ueqqq6666qp/OypXXXXVVVddddVVVz3LNddc8+DXfu3Xfq93eqd3+myAixcv8pM/+ZM8/elP5/mRxItCEi8KSbwoJPGikMSLQhIvCkm8qCTxopIEwLFjx3iLt3gLHvSgBwFweHjIn/7pn3Lfffdx1X88Sdjm/yNJ2Oaqq6666qqr/h+gctVVV1111VVXXXXVZe/4ju/4We/0Tu/02QAXL17kr/7qr/jN3/xNXhBJvCgk8aKQxItCEi8KSbwoJPGikMSLShIvKkkcO3aM13zN1+QlX/IlATg8POTpT386//AP/8D/V5KwzVX/c0jCNv9VrrvuOgD+4R/+4be56qqrrrrqqn87KlddddVVV1111VX/z73Yi73Ya3/4h3/4d11zzTUPBvjN3/xNfvM3f5MXRhL/Ekm8KCTxopDEi0ISLwpJvKgk8aKQxItKEseOHeMlX/Ilec3XfE3u9/d///f8wz/8A1eBJGzzn0kStvn3koRt/q0kYZt/LUnY5v+ira0trrrqqquuuuo/AJWrrrrqqquuuuqq/6euueaaB3/4h3/4d73Yi73YawM8/elP5yd+4ifY3d3lBZHEi0ISLwpJvCgk8aKQxItCEi8KSbyoJPGiksRrvMZr8Jqv+Zrc7+///u/5h3/4B6666v8SSdjm3+O+++67lauuuuqqq676t6Ny1VVXXXXVVVdd9f/MNddc8+DXfu3Xfq93eqd3+myAixcv8pu/+Zv81V/9FS+MJF4UknhRSOJFIYkXhSReFJJ4UUjiRSGJf40HP/jBvMVbvAXHjh0D4L777uNP//RPOTw85KrnJQnb/GeShG3+vSRhm6v+/a677joA/uEf/uG3ueqqq6666qp/HypXXXXVVVddddVV/4+84zu+42e90zu902cDXLx4kb/6q7/iN3/zN/mXSOJfIokXhSReFJJ4UUjiRSGJF5UkXhSSeFEdP36ct3iLt+BBD3oQAIeHh/zpn/4p9913H1e9cJKwzf91krDNv5YkbPOvJQnb/GtIwjb/2ba2tgC47777buWqq6666qqr/n2oXHXVVVddddVVV/0/8GIv9mKv/eEf/uHfdc011zwY4Dd+4zf4rd/6Lf4lknhRSOJFIYkXhSReFJJ4UUjiRSGJF5UkXhTHjx/nNV/zNXnJl3xJAA4PD3n605/OP/zDP3DVi04StvnPIgnb/HtJwjZX/dtJ4qqrrrrqqqv+A1G56qqrrrrqqquu+j/smmuuefA7vuM7ftbrvM7rvDfAxYsX+Ymf+AluvfVW/iWSeFFI4kUhiReFJF4UknhRSOJFIYkXhSReFMePH+clX/Ilec3XfE3u9/d///f8/d//PQCSuOpfRxK2+c8iCdv8d5KEbf6/u+666wD4h3/4h9/hqquuuuqqq/59qFx11VVXXXXVVVf9H3TNNdc8+LVf+7Xf653e6Z0+G+DixYv85m/+Jn/1V3/Fi0ISLwpJ/Esk8aKQxItCEi8KSbyoJPGikMSL4jVf8zV5zdd8Te7393//9/z93/89V/37ScI2/5NJwjb/lSRhm38tSdjmP5MkbHPVVVddddVV/02oXHXVVVddddVVV/0f847v+I6f9U7v9E6fzTP9xm/8Br/5m7+JJF4UkviXSOJFIYkXhSReFJJ4UUjiRSGJF5Uk/iUPetCDeIu3eAuOHz8OwOHhIb/5m7/J4eEhV/3HkYRt/jNIwjb/XpKwzf9FkrDNf6brrrsOgH/4h3/4ba666qqrrrrq34fKVVddddVVV1111f8R11xzzYM//MM//Lte7MVe7LUB/vIv/5Kf+ImfAEAS/xJJvCgk8aKQxItCEi8KSbwoJPGikMSLQhL/kuPHj/MWb/EWPOhBDwLg8PCQv//7v+fpT386V/3nkASAbf6jScI2/10kYZt/LUnY5v+Cra0tAO67775bueqqq6666qp/HypXXXXVVVddddVV/8tdc801D37Hd3zHz3qd13md9wa4ePEiP/ETP8HTn/50JPGikMSLQhL/Ekm8KCTxopDEi0ISLypJvCgk8cIcP36cl3zJl+Q1X/M1ATg8POTpT386f//3f89V/zUkYZv/aJKwzb+HJGzzbyEJ2/xXkIRt/jNJwjZXXXXVVVdd9d+AylVXXXXVVVddddX/Yu/4ju/4We/0Tu/02QAXL17kL//yL/nN3/xNACTxopDEv0QSLwpJvCgk8aKQxItCEi8KSbyoJPGCHD9+nJd8yZfkNV/zNbnf3//93/P3f//3vCgkcdV/HEnY5j+aJGzzv4kkbPOfTRK2+c9w3XXXAfAP//APv81VV1111VVX/ftRueqqq6666qqrrvpf6HVe53Xe+8M//MO/i2f6jd/4DX7zN3+T+0niXyKJF4UkXhSSeFFI4kUhiReFJF4UknhRSOKFec3XfE1e8zVfk/vdd999/Mmf/AmHh4dc9d9HErb5jyYJ2/xbScI2/xaSsM1/BUnY5n+Cra0tAO67775bueqqq6666qp/PypXXXXVVVddddVV/4tcc801D/7wD//w73qxF3ux1wZ4+tOfzk/8xE9w8eJF7ieJf4kkXhSSeFFI4l8iiReFJF4UknhRSeJFIYkX5EEPehBv8RZvwfHjxwE4PDzkT/7kT7jvvvu46n8GSdjmfxpJ2Oa/iiRs87/V5uYmV1111VVXXfUfiMpVV1111VVXXXXV/wLXXHPNg1/7tV/7vd7pnd7pswEuXrzIT/zET/D0pz+d+0niRSGJF4Uk/iWSeFFI4kUhiReFJF4UknhRSeL5OX78OG/xFm/Bgx70IAAODw/5+7//e57+9Kdz1f88kgCwzX8USdjm30MStvnXkoRt/ieShG1eVJKwzb9ka2sLgH/4h3/4Ha666qqrrrrq34/KVVddddVVV1111f9w7/iO7/hZ7/RO7/TZABcvXuQv//Iv+c3f/E0eSBIvCkn8SyTxopDEi0ISLwpJvCgk8aKQxItCEs/P8ePHecmXfEle8zVfE4DDw0Oe/vSn8/d///f8e0jiqv98krDNfxRJ2OZ/C0nY5l9DEra56qqrrrrqqv9jqFx11VVXXXXVVVf9D/ViL/Zir/3hH/7h33XNNdc8GOA3fuM3+M3f/E2emyT+JZJ4UUjiRSGJF4Uk/iWSeFFJ4kUhiReFJJ6f13zN1+Q1X/M1ud/f//3f8/d///dc9b+LJGzzH0UStvm3koRt/rUkYZv/iSRhmxeVJGzzwlx33XUA/MM//MNvc9VVV1111VX/flSuuuqqq6666qqr/oe55pprHvzhH/7h3/ViL/Zirw3w9Kc/nZ/4iZ/g4sWLPJAkXhSSeFFI4l8iiReFJF4UknhRSOJFIYkXlSSe22u+5mvymq/5mtzvvvvu40/+5E84PDzk/wtJ/HvY5n8SSQDY5j+CJGzzbyUJ2/xrScI2/xqSsM2/hiRs899pa2sLgPvuu+9Wrrrqqquuuurfj8pVV1111VVXXXXV/xDXXHPNg1/7tV/7vd7pnd7pswEuXrzIT/zET/D0pz+d5yaJF4Uk/iWSeFFI4kUhiReFJF4UknhRSOJFIYnndvz4cd793d+d48ePA3B4eMif/MmfcN999/EfSRL/00jiP5Iknptt/rtJwjb/ESRhm38rSdjmqquuuuqqq676L0Hlqquuuuqqq6666n+Ad3zHd/ysd3qnd/psgIsXL/KXf/mX/OZv/ibPjyT+JZJ4UUjiRSGJF4UkXhSSeFFI4kUhiReFJB7o+PHjvMVbvAUPetCDADg8PORpT3saf//3f48k/i+SxH81STyQbf47SALANv9ekrDNfyVJ2OZfQxK2+deQhG1eVJKwzYtKErZ5fq677joA/uEf/uG3ueqqq6666qr/GFSuuuqqq6666qqr/hu92Iu92Gt/+Id/+Hddc801Dwb4jd/4DX7zN3+TF0QS/xJJvCgk8aKQxL9EEi8KSbwoJPGikMSLShL3O378OC/5ki/Ja77mawJweHjI0572NP7+7/+e/yyS+O8kif8pJPFAtvmvJAnb/HtJwjb/FpKwzb+WJGzzryEJ2/xvsLm5CcB99913K1ddddVVV131H4PKVVddddVVV1111X+Da6655sEf/uEf/l0v9mIv9toAT3/60/mJn/gJLl68yPMjiReFJF4UkviXSOJFIYkXhSReFJJ4UUjiRSGJB3rN13xNXvM1X5P7/d3f/R1///d/z/9VkvifThL3s81/BUnY5t9LErb5t5CEbf61JGGb/0ySsM2LShK2+ffa2toC4L777ruVq6666qqrrvqPQeWqq6666qqrrrrqv9A111zz4Nd+7dd+r3d6p3f6bICLFy/yEz/xEzz96U/nBZHEi0IS/xJJvCgk8aKQxItCEi8KSbwoJPGikMT9XvIlX5LXfM3X5Pjx4wDcd999/PEf/zGHh4c8N0n8R5LEfyVJ/G8lifvZ5j+TJABs8+8hCdv8W0jCNv/ZJGGbfw1J2OY/gyRs89y2trYAOHv27DO46qqrrrrqqv8YVK666qqrrrrqqqv+i7zjO77jZ73TO73TZwNcvHiRv/zLv+Q3f/M3eWEk8S+RxItCEi8KSfxLJPGikMSLQhIvCkm8qCQBcPz4cd7iLd6CBz3oQQAcHh7yx3/8x9x33338XySJ/yskAWCb/0ySsM2/hyRs828hCdv8a0jCNv+TSMI2/x5bW1tcddVVV1111X8wKlddddVVV1111VX/yV7sxV7stT/8wz/8u6655poHA/zGb/wGv/mbv8m/RBL/Ekm8KCTxL5HEi0ISLwpJvCgk8aKQxItCEgDHjx/nNV7jNXipl3opAA4PD3na057G3//93/NfSRL/FSTxf5Uk7meb/wySALDNv5UkbPNvIQnb/GtIwjYvKknY5l9DErb5zyAJ2zzQ1tYWAP/wD//w21x11VVXXXXVfwwqV1111VVXXXXVVf9Jrrnmmgd/+Id/+He92Iu92GsDPO1pT+Mnf/InuXjxIi+MJF4UkviXSOJFIYkXhSReFJJ4UUjiRSGJF4Ukjh8/zku+5Evymq/5mtzv7/7u7/j7v/97/i+SxP8nkgCwzX8GSdjm30oStvm3kIRt/jUkYZsXlSRs859FErb5t9ra2gLgvvvuu5Wrrrrqqquu+o9B5aqrrrrqqquuuuo/2DXXXPPg137t136vd3qnd/psgIsXL/LjP/7j3HrrrfxLJPGikMS/RBIvCkm8KCTxL5HEi0ISLwpJvKgk8Zqv+Zq85mu+Jvf7u7/7O/7+7/+e/y6S+M8kif+vJHE/2/xHkoRt/q0kAWCb/wskYZv/DJKwzVVXXXXVVVf9J6Jy1VVXXXXVVVdd9R/oHd/xHT/rnd7pnT4b4OLFi/zlX/4lv/mbv8mLQhL/Ekm8KCTxopDEv0QSLwpJvCgk8aKQxItCEg960IN4i7d4C44fPw7Afffdxx//8R9zeHjIv5Yk/iNI4j+LJK56NkkA2OY/iiQAbPNvJQnb/GtIwjb/GpKwzYtKErb5zyIJ2/xrXXfddQD8wz/8w29z1VVXXXXVVf9xqFx11VVXXXXVVVf9B3ixF3ux1/7wD//w77rmmmseDPAbv/Eb/MZv/AaSeFFI4l8iiReFJP4lknhRSOJFIYkXhSReFJJ4UZw4cYK3eIu34EEPehAAh4eH/PEf/zH33Xcf/1dJ4qrnTxIAtvmPIgnb/FtJwjb/GpKwzb+GJGzzopKEbV5UkrDNfwZJ2GZrawuA++6771auuuqqq6666j8Olauuuuqqq6666qp/h2uuuebBH/7hH/5dL/ZiL/baABcvXuTbv/3buXjxIpL4l0jiRSGJf4kkXhSSeFFI4kUhiReFJF4UkviXHD9+nNd8zdfkpV7qpQA4PDzkaU97Gn/3d3+HJP67SeI/miSuetFIAsA2/xEkAWCbfwtJ2OZfQxK2+deQhG3+s0jCNi8KSdjmX2NzcxOA++6771auuuqqq6666j8Olauuuuqqq6666qp/g2uuuebBr/3ar/1e7/RO7/TZABcvXuQ3fuM3+Mu//EsAJPEvkcSLQhL/Ekm8KCTxopDEv0QSLwpJvCgk8S85fvw4L/VSL8VrvuZrcr+/+7u/4+/+7u/4n0IS/9EkcdW/niQAbPMfQRK2+beQhG3+NSRhm/8skrDNfxZJ2OZFIYmtrS0Azp49+wyuuuqqq6666j8Olauuuuqqq6666qp/pXd8x3f8rHd6p3f6bJ7pN37jN/iN3/gNACTxopDEv0QSLwpJvCgk8S+RxItCEi8KSbwoJPEvec3XfE1e67Vei/v93d/9HX/3d3/HfyRJ/E8jiav+fSQBYJt/L0nY5t9CErb515CEbV5UkrDNi0oStnlRScI2/xm2trYAuO+++27lqquuuuqqq/7jULnqqquuuuqqq656EV1zzTUP/pzP+Zzfuuaaax4M8Bu/8Rv8xm/8BveTxItCEv8SSbwoJPEvkcSLQhIvCkm8KCTxopDEC/OgBz2It3zLt+T48eMAHB4e8uu//uscHh7yP40k/qNI4n8CSfxHs81/B0kA2ObfQxIAtvnXkoRt/jUkYZsXlSRs86KShG1eVJKwzYtCErZ5UWxtbQFw9uzZW7nqqquuuuqq/zhUrrrqqquuuuqqq/4F11xzzYPf8R3f8bNe53Ve570BLl68yI//+I/z9Kc/nftJ4l8iiReFJP4lknhRSOJFIYkXhST+JZJ4UUjihTl+/Dhv+ZZvyYMe9CAADg8P+bu/+zue9rSn8X+dJP47SOK/giSeH9v8V5AEgG3+PSRhm38tSdjmX0MStnlRScI2/5tsbW0BcN99993KVVddddVVV/3HoXLVVVddddVVV131AlxzzTUPfu3Xfu33eqd3eqfPBrh48SK/8Ru/wV/+5V/yQJL4l0jiRSGJf4kkXhSS+JdI4kUhiReFJF4UknhBjh8/zku+5EvyWq/1WgAcHh7ytKc9jb/7u7/jP5Mk/j0k8R9BEv9VJPE/iSQeyDb/mSQBYJt/K0kA2OZfQxIAtnlRScI2LypJ2OZFIQnbvKgkYZsXhSRs88JsbW1x1VVXXXXVVf9JqFx11VVXXXXVVVc9H+/4ju/4We/0Tu/02TzTb/zGb/Abv/EbPDdJ/Esk8S+RxItCEv8SSbwoJPGikMSLQhIvCkm8IK/5mq/Ja73Wa3G/v/u7v+Pv/u7v+J9OEv8RJPGfTRL/W0jigWzzn0ESALb5t5KEbf61JGGbF5UkbPOikoRtXhSSsM2LShK2eVFIwjYvyObmJgD/8A//8DtcddVVV1111X8sKlddddVVV1111VUPcM011zz4wz/8w7/rxV7sxV4b4C//8i/58R//cZ6bJF4UkviXSOJFIYl/iSReFJJ4UUjiRSGJF4Uknp/XfM3X5LVe67W437333ssf//Efc3h4yL+GJP4tJPHfTRL/WSTxf4Ek7meb/2iSALDNv4UkbPOvJQnbvKgkYZsXlSRs86KQhG3+q21tbQFw33333cpVV1111VVX/ceictVVV1111VVXXQVcc801D37Hd3zHz3qd13md9wa4ePEiP/7jP87Tn/50npsk/iWSeFFI4l8iiReFJF4UkviXSOJFIYkXhSSenwc96EG81Vu9FceOHQPg8PCQP/qjP+Lee+9FEv8bSOLfSxL/GSTxf5UkHsg2/1EkYZt/C0kA2OZfQxK2eVFJwjb/3SRhmxeFJGzz/GxtbQFw3333PZ2rrrrqqquu+o9F5aqrrrrqqquu+n/vHd/xHT/rnd7pnT4b4OLFi/zlX/4lv/Ebv8HzI4l/iSReFJL4l0jiRSGJf4kkXhSSeFFI4kUhied2/Phx3vIt35IHPehBABweHvK3f/u3PO1pT+N/E0n8e0jiP5ok/j+SBIBt/iNIAsA2/xaSsM2/hiRs86KShG1eFJKwzYtCErZ5UUnCNv8eW1tbAJw9e/YZXHXVVVddddV/LCpXXXXVVVddddX/W6/zOq/z3h/+4R/+XTzTb/zGb/Abv/EbvCCS+JdI4l8iiReFJP4lknhRSOJFIYkXhSReFJJ4oOPHj/OSL/mSvNZrvRYAh4eHPPWpT+Xv/u7v+O8iiX8LSfx7SOI/kiSuAknczzb/XpIAsM2/liRs868hCdu8qCRhmxeFJGzzopCEbf6jScI2z21zcxOAs2fP3spVV1111VVX/ceictVVV1111VVX/b9zzTXXPPjDP/zDv+vFXuzFXhvgaU97Gj/xEz/BxYsXeX4k8aKQxL9EEi8KSfxLJPGikMSLQhL/Ekm8KCTx3F7zNV+T13qt1+J+f/u3f8vf/d3f8f+RJP6jSOKq508S97PNv4ckAGzzryEJANu8qCRhmxeVJGzzopCEbV4UkrDNi0IStnlRSMI2D7S1tQXAfffddytXXXXVVVdd9R+LylVXXXXVVVdd9f/GNddc8+DXfu3Xfq93eqd3+myAixcv8uM//uM8/elP5wWRxL9EEi8KSfxLJPGikMSLQhL/Ekm8KCTxopDEA73ma74mr/Var8X97r33Xv7oj/6Iw8ND/iNJ4l9LEv8Wkvi3ksR/FElc9aKRBIBt/j0kYZt/LUnY5kUlCQDbvCgkYZsXhSRs86KQhG1eFJKwzb/F1tYWAPfdd9+tXHXVVVddddV/LCpXXXXVVVddddX/C+/4ju/4We/0Tu/02QAXL17kL//yL/mN3/gNXhhJ/Esk8aKQxL9EEi8KSfxLJPGikMSLQhIvCknc7/jx47zHe7wHx48fB+Dw8JA/+qM/4t577+VfIon/qSTxbyWJ/wiS+O8gif8MtvmvIgkA2/xbSQLANv8akgCwzYtKErZ5UUjCNi8KSdjmP5okbPMvkYRtALa2tgC47777buWqq6666qqr/uNRueqqq6666qqr/k97sRd7sdf+8A//8O+65pprHgzwG7/xG/zGb/wG/xJJ/Esk8S+RxItCEv8SSbwoJPGikMSLQhIvCkkAHD9+nLd8y7fkQQ96EAAHBwc87WlP4+/+7u/4n0QS/5Uk8e8lif8KkvivJInnxzb/WSRxP9v8W0gCwDb/GpKwzYtKErZ5UUjCNi8KSdjmXyIJ2/xHk4Rtrr32WgDOnj17K1ddddVVV131H4/KVVddddVVV131f9I111zz4A//8A//rhd7sRd7bYCnPe1p/MRP/AQXL17khZHEi0IS/xJJvCgk8S+RxItCEi8KSfxLJPGikATA8ePHecmXfEle67VeC4CDgwOe9rSn8bd/+7dI4j+TJP4rSOLfQhL/HpL4zySJ/4kk8dxs8x9NEgC2+beQhG3+NSRhmxeVJGzzopCEbV4UkrDNv0QStnlRSMI2LwpJ3O++++67lauuuuqqq676j0flqquuuuqqq676P+Waa6558Gu/9mu/1zu90zt9NsDFixf58R//cZ7+9KfzL5HEi0IS/xJJ/Esk8aKQxItCEv8SSbwoJPGikATAa77ma/Jar/Va3O9v//Zv+du//Vv+L5HEv4Uk/j0k8Z9BEv8bSeKBbPMfRRIAtvnXkgSAbV5UkgCwzYtCErZ5UUjCNi8KSdjmXyIJ27woJGGbF8XW1hYA9913361cddVVV1111X88KlddddVVV1111f8Z7/iO7/hZ7/RO7/TZABcvXuQv/uIv+I3f+A0k8S+RxL9EEi8KSfxLJPGikMS/RBIvCkm8KCTxopDES73US/Gar/maHD9+HIB7772XP/zDP+Tw8JD/ySTxX0ES/1aS+I8mif9rJPFAtvn3kgSAbf61JGGbfw1J2OZFIQnbvCgkYZsXhSRs8y+RhG1eFJKwzb9ka2sLgLNnzz6Dq6666qqrrvqPR+Wqq6666qqrrvpf78Ve7MVe+8M//MO/65prrnkwwK//+q/zG7/xGwBI4l8iiX+JJP4lknhRSOJFIYl/iSReFJJ4UUjiRXHixAne8i3fkgc96EEAHBwc8Ed/9Efce++9/F8kiX8tSfxbSeI/iiT+P5HE/Wzz7yEJANv8a0gCwDYvKknY5kUhCdu8KCRhm/9IkrDNf5StrS0A7rvvvlu56qqrrrrqqv94VK666qqrrrrqqv+1rrnmmgd/+Id/+He92Iu92GsDPO1pT+PHf/zHuXjxIpJ4UUjiXyKJf4kkXhSS+JdI4kUhiReFJP4lknhRnDhxgtd8zdfkpV7qpQA4ODjgaU97Gn/7t3/LfxRJ/GtI4l9DEv8akvjXksS/lST+I0ji/ztJ3M82/1aSALDNv4YkAGzzopCEbV4UkgCwzb9EErb5l0jCNv+RJGGbF2ZzcxOAs2fP3spVV1111VVX/cejctVVV1111VVX/a9zzTXXPPi1X/u13+ud3umdPhvg4sWL/PiP/zhPe9rTAJDEv0QSLwpJ/Esk8S+RxItCEi8KSfxLJPGikMS/5Pjx47zUS70Ur/Var8X9/vZv/5a//du/5arnJIl/C0n8e0niqudPEgC2+beSBIBt/jUkYZsXhSQAbPOikIRt/iWSsM2/RBK2+ZdIwjYvCknY5gXZ2toC4L777ruVq6666qqrrvqPR+Wqq6666qqrrvpf5R3f8R0/653e6Z0+G+DixYv8xV/8Bb/xG7/B/STxL5HEv0QSLwpJ/Esk8aKQxL9EEi8KSbwoJPEvea3Xei1e67Vei/v97d/+LX/7t3/L/0aS+NeQxL+GJP4tJPHvIYn/SpL4z2Kb/0ySuJ9t/i0kAWCbF5UkAGzzopCEbV4UkrDNv0QStvmXSMI2/xJJ2OZFIQnbPLetrS0A7rvvvlu56qqrrrrqqv8cVK666qqrrrrqqv8VXuzFXuy1P/zDP/y7rrnmmgcD/Pqv/zq/8Ru/wQNJ4l8iiX+JJF4UkviXSOJFIYl/iSReFJJ4UUjihXnQgx7EW7/1W3Ps2DEA7r33Xv7wD/+Qw8ND/jUk8Z9FEv9ZJPGvIYl/C0n8W0niP5Mk/qtJ4vmxzX80SdzPNv9akgCwzYtKErZ5UUjCNi8KSdjmXyIJ2/xLJGGbf4kkbPOikIRtHujaa68F4B/+4R9+m6uuuuqqq676z0Hlqquuuuqqq676H+2aa6558Id/+Id/14u92Iu9NsDTnvY0fvzHf5yLFy9yP0m8KCTxL5HEv0QSLwpJ/Esk8aKQxItCEv8SSbwwx48f5y3f8i158IMfDMDBwQF/+Id/yL333guAJP43ksSLShL/GpL415LEv5Uk/jNI4n8qSTw32/xHkQSAbf61JGGbF5UkAGzzL5EEgG3+JZKwzb9EErb5l0jCNv8SSdjmqquuuuqqq/6HonLVVVddddVVV/2PdM011zz4tV/7td/rnd7pnT4b4OLFi/z4j/84T3va03ggSfxLJPGikMS/RBIvCkn8SyTxopDEv0QSLwpJvCDHjx/ntV7rtXipl3opAA4ODnjqU5/K3/7t3/JfRRIvKkn8byWJfytJ/EeRxP9mkngg2/x7SQLANv8akgCwzYtKErZ5UUjCNv8SSdjmXyIJ2/xLJGGbf4kkbPMvkYRt7re5uQnAfffddytXXXXVVVdd9Z+DylVXXXXVVVdd9T/OO77jO37WO73TO302wMWLF/mLv/gLfuM3foPnJol/iSReFJL4l0jiXyKJF4Uk/iWSeFFI4kUhiefn+PHjvNRLvRSv9Vqvxf3+5m/+hr/927/l/wpJvKgk8a8hiX8NSfxbSOI/giT+r5LEA9nm30oSALb515AEgG1eFJKwzYtCErb5l0jCNv8SSdjmXyIJ2/xLJGGbf4kkbAOwtbUFwNmzZ5/BVVddddVVV/3noHLVVVddddVVV/2P8WIv9mKv/eEf/uHfdc011zwY4Nd//df5jd/4DZ4fSfxLJPEvkcSLQhL/Ekm8KCTxL5HEi0ISLwpJPD+v9VqvxWu91mtxv7/5m7/hb//2b/m/RBIvKkn8a0jiX0MS/1qS+PeSxP9Hkrifbf4tJHE/27yoJGGbF4UkAGzzL5GEbf4lkrDNv0QStvmXSMI2/xJJ2OZfIgnbXHvttQDcd999t3LVVVddddVV/zmoXHXVVVddddVV/+2uueaaB3/4h3/4d73Yi73YawNcvHiRb/u2b+PixYs8P5L4l0jiXyKJF4Uk/iWS+JdI4kUhiReFJP4lknh+HvSgB/FWb/VWHD9+HICDgwP+8A//kHvvvZf/DSTx300S/xqS+NeSxL+HJK66QhL3s82/hSQAbPOikASAbV4UkrDNv0QSALZ5YSQBYJsXRhK2+ZdIwjb/USRxv7Nnz97KVVddddVVV/3noHLVVVddddVVV/23ueaaax782q/92u/1Tu/0Tp8NcPHiRX7jN36Dv/iLv+D5kcSLQhL/Ekn8SyTxopDEv0QSLwpJ/Esk8aKQxHM7fvw4b/mWb8mDH/xgAA4ODvibv/kbnva0p/HfTRL/0STxopLEi0oS/xqS+NeQxL+HJP6zSeI/m23+M0jifrb515IEgG1eFJIAsM2/RBIAtvmXSMI2/xJJ2OaFkYRt/iWSsM0LIwnbvCi2trYAuO+++27lqquuuuqqq/5zULnqqquuuuqqq/5bvOM7vuNnvdM7vdNn80y//uu/zm/8xm/wgkjiXyKJF4Uk/iWS+JdI4kUhiReFJP4lknhRSOKBjh8/zku91EvxWq/1WgAcHBzw1Kc+lb/5m78BQBL/GSTxH00S/9Ek8aKSxItKEv9akvi3kMR/Bkn8d5HE82Ob/yiSALDNv5YkAGzzopCEbV4UkrDNv0QStvmXSMI2L4wkbPMvkYRtXhhJ2OaF2dzcBOC+++67lauuuuqqq676z0Plqquuuuqqq676L3XNNdc8+HM+53N+65prrnkwwK//+q/zG7/xG7wwkviXSOJFIYl/iST+JZJ4UUjiXyKJF4UkXhSSeKDXeq3X4rVe67W439/8zd/wN3/zN/xfJ4n/aJJ4UUniX0MS/xaS+I8iif8NJPHcbPPvIYn72eZfQxK2eVFIAsA2/xJJ2OZfIgnb/EskYZsXRhK2+ZdIwjYvjCRs84Jce+21APzDP/zDb3PVVVddddVV/3moXHXVVVddddVV/yWuueaaB7/jO77jZ73O67zOewNcvHiRH//xH+dpT3saL4wk/iWS+JdI4kUhiX+JJF4UkviXSOJFIYl/iSQe6LVe67V4rdd6Le53zz338Id/+IccHBzwP40k/rtI4kUhiReVJP41JPGvJYn/CJL4v0ASD2SbfytJANjmRSUJANu8KCQBYJsXRhIAtnlhJAFgmxdGErZ5YSRhm3+JJGzzwkjCNlddddVVV13134jKVVddddVVV131n+4d3/EdP+ud3umdPhvg4sWL/MVf/AW/8Ru/wb9EEv8SSfxLJPEvkcSLQhL/Ekm8KCTxopDEv0QS93vQgx7EW73VW3H8+HEADg4O+IM/+APuvfde/reTxItCEi8KSfxHk8S/hiT+tSTx7yGJ/+sk8UC2+deSxP1s86KQBIBtXhSSsM2/RBK2+ZdIwjYvjCRs88JIwjb/EknY5oWRhG2e27XXXgvAfffddytXXXXVVVdd9Z+HylVXXXXVVVdd9Z/mHd/xHT/rnd7pnT6bZ/r1X/91fuM3foN/iSReFJL4l0jiXyKJF4Uk/iWSeFFI4l8iiReFJACOHz/OW77lW/LgBz8YgIODA/7mb/6Gpz71qfxHkcT/R5J4UUjiRSWJfy1J/FtJ4v8zSdzPNv9akgCwzYtCEgC2+ZdIAsA2L4wkAGzzwkjCNi+MJGzzwkjCNv8SSdjmhZGEbZ6fs2fPPoOrrrrqqquu+s9D5aqrrrrqqquu+g93zTXXPPjDP/zDv+vFXuzFXhvgL/7iL/ixH/sxJPEvkcS/RBIvCkn8SyTxL5HEi0IS/xJJvCgk8aKQxPHjx3mpl3opXuu1XguAg4MDnvKUp/C3f/u3/HeSxItCEi8KSbwoJPGikMSLQhIvCkm8qCTxryGJfytJ/GeRxH8F2/xHksT9bPOvIQkA27woJAFgm3+JJGzzL5GEbV4YSdjmhZGEbV4YSdjmXyIJ27wwkrDN/a699loA/uEf/uG3ueqqq6666qr/PFSuuuqqq6666qr/MNdcc82DX/u1X/u93umd3umzAS5evMiP/diP8bSnPQ1J/Esk8S+RxItCEv8SSfxLJPGikMS/RBIvCkm8KCTxWq/1WrzWa70W9/vrv/5r/uZv/gYASVz1/EniRSGJF4UkXlSSeFFJ4t9CEv+RJPHfSRLPj23+vSRxP9u8qCQBYJsXhSRs8y+RBIBtXhhJ2OaFkYRtXhhJANjmBZEEgG3+vSRhm6uuuuqqq676L0Tlqquuuuqqq676D/GO7/iOn/VO7/ROnw1w8eJF/uIv/oJf//VfB0AS/xJJ/Esk8S+RxItCEv8SSfxLJPGikMSLQhL/Ekm81mu9Fq/1Wq/F/e655x7+4A/+gIODA/4vksSLQhL/USTxopDEi0oSLypJ/GtJ4j+CJP43kMRzs82/lSQAbPOikgSAbf4lkgCwzb9EErZ5YSQBYJsXRBIAtnlhJGGbF0YStnlBJGGbF9XW1hYA9913361cddVVV1111X8eKlddddVVV1111b/L67zO67z3h3/4h38Xz/Trv/7r/Pqv/zr3k8S/RBL/Ekn8SyTxL5HEi0IS/xJJvCgk8S+RxIvixIkTvOd7vifHjx8H4ODggD/4gz/gnnvu4d9KEv9dJPFfTRL/Ekm8KCTxopDEi0oS/1qS+PeQxP8Vkngg2/xrSeJ+tnlRSALANv8SSQDY5oWRBIBtXhhJ2OaFkYRtXhhJ2OaFkYRtXhBJ2OaFkcTGxgYA9913361cddVVV1111X8uKlddddVVV1111b/JNddc8+AP//AP/64Xe7EXe22Apz3tafzYj/0YFy9eBEASLwpJ/Esk8S+RxL9EEi8KSfxLJPGikMS/RBL/kuPHj/NWb/VWPPjBDwbg4OCApzzlKfzN3/wN/xNJ4r+aJP4lkviPIokXhSReVJL415DEv5Uk/j+QxP1s868lCQDbvCgkAWCbf4kkbPMvkYRtXhhJ2OaFkYRtXhhJ2OaFkYRtXhBJ2OaFue666wD4h3/4h9/mqquuuuqqq/5zUbnqqquuuuqqq/5Vrrnmmge/9mu/9nu90zu902cDXLx4kR/7sR/jaU97GveTxL9EEv8SSbwoJPEvkcS/RBIvCkn8SyTxopDEC3P8+HFe6qVeitd+7dcG4ODggKc85Sn8zd/8Df9fSOJfIon/KJL4l0jiRSGJF4Uk/jUk8W8hif9skviPYJv/aJJ4INu8qCQBYJsXhSQAbPPCSALANi+MJGzzwkjCNi+MJGzzwkjCNi+MJGzzgkjCNlddddVVV131PwCVq6666qqrrrrqRfaO7/iOn/VO7/ROnw1w8eJF/uIv/oJf//Vf54Ek8S+RxL9EEi8KSfxLJPEvkcSLQhL/Ekm8KCTxwrzWa70Wr/3ar839/vqv/5q/+Zu/4b+LJP4jSeK/kiT+JZL4l0jiRSGJF4UkXlSS+LeQxH8kSfxnk8QLY5t/L0nczzYvCknczzb/EkkA2OaFkQSAbV4QSQDY5gWRBIBtXhBJ2OaFkYRtXhhJ2OYFkYRtnp9rr70WgH/4h3/4Ha666qqrrrrqPxeVq6666qqrrrrqX/RiL/Zir/3hH/7h33XNNdc8GODXf/3X+fVf/3WemyT+JZL4l0jiXyKJF4Uk/iWS+JdI4kUhiReFJF6Ql37pl+a1Xuu1OH78OAD33HMPv//7v8/BwQGS+P9EEv8SSfxLJPEvkcS/RBIvCkm8KCTxopLEv4Yk/iNI4n8iSTw32/xbSQLANi8qSQDY5l8iCdv8SyRhmxdGErZ5YSRhmxdEEgC2eUEkYZsXRhK2eUEkYZurrrrqqquu+m9E5aqrrrrqqquueoGuueaaB3/4h3/4d73Yi73YawM87WlP48d+7Me4ePEiz00S/xJJ/Esk8S+RxL9EEi8KSfxLJPGikMS/RBIvyPHjx3mrt3orHvzgBwNwcHDA7//+73PPPffwv4kk/j+TxL9EEi8qSfxrSOLfQxL/W0nigWzzryWJ+9nmRSEJANu8MJIAsM0LIwkA27wgkgCwzQsiCdu8MJKwzQsiCdu8MJKwzQsiCds80LXXXgvAP/zDP/w2V1111VVXXfWfi8pVV1111VVXXfU8rrnmmge/9mu/9nu90zu902cDXLx4kR/7sR/jaU97Gs9NEi8KSfxLJPEvkcS/RBIvCkn8SyTxopDEv0QSz8/x48d5rdd6LV76pV8agIODA57ylKfw13/91/xfJYl/iST+JZL4l0jiXyKJf4kk/iWS+JdI4kUhiX8NSfxbSOL/Kkk8kG3+NSQBYJsXhSQAbPPCSALANi+MJGzzwkjCNi+IJABs84JIwjYviCRs88JIwjYviCRsc9VVV1111VX/DahcddVVV1111VXP4R3f8R0/653e6Z0+G+DixYv8xV/8Bb/+67/O8yOJf4kkXhSS+JdI4l8iiX+JJF4UkviXSOJFIYnndvz4cV7qpV6K137t1+Z+f/3Xf81f//Vfc9V/DEn8SyTxL5HEv0QS/xJJvCgk8aKSxL+WJP4zSeI/gm3+I0nifrZ5UUnifrb5l0gCwDYvjCQAbPOCSALANi+IJGzzwkjCNi+IJGzzgkjCNi+MJGzzgkjCNgCbm5sA3Hfffbdy1VVXXXXVVf+5qFx11VVXXXXVVZe92Iu92Gt/+Id/+Hddc801Dwb49V//dX7913+dF0QS/xJJ/Esk8aKQxL9EEv8SSbwoJPEvkcSLQhLP7bVe67V47dd+be7313/91/z1X/81/1Ek8R9JEi8KSfxHkMS/RBL/XpL4l0jiXyKJf4kk/iWSeFFJ4l9LEv9RJPGfTRIvjG3+rSTxQLZ5UUgCwDb/EkkA2OaFkYRtXhhJ2OYFkQSAbV4QSdjmBZGEbV4QSQDY5gWRhG1eEElcc801AJw9e/YZXHXVVVddddV/PipXXXXVVVdd9f/cNddc8+AP//AP/64Xe7EXe22Apz3tafzYj/0YFy9e5AWRxL9EEv8SSfxLJPGikMS/RBL/Ekm8KCTxopDEAz34wQ/mrd7qrTh+/DgA99xzD7//+7/PwcEB/x0k8V9NEv8VJPHvJYl/iSReGEm8KCTxopDEv4Yk/r0k8T+RJJ6bbf4tJAFgmxeFJABs8y+RBIBtXhBJANjmBZEEgG1eEEnY5gWRhG1eEEnY5oWRhG1eEEnY5gXZ2toC4O///u9/m6uuuuqqq676z0flqquuuuqqq/6fuuaaax782q/92u/1Tu/0Tp8NcPHiRX7sx36Mpz3tabwwkviXSOJfIol/iSReFJL4l0jiXyKJF4Uk/iWSeKDjx4/zVm/1Vjz4wQ8G4ODggN/7vd/jnnvuQRJXPZsk/iWSeGEk8S+RxAsjiX+JJF4YSfxLJPGikMS/hiT+rSTxv5UkHsg2/xqSuJ9t/iWSALDNv0QStnlhJGGbF0YStnlBJGGbF0QStnlBJAFgmxdEErZ5QSRhm6uuuuqqq676H4DKVVddddVVV/0/9I7v+I6f9U7v9E6fDXDx4kX+/M//nN/4jd/gXyKJf4kk/iWS+JdI4l8iiReFJP4lknhRSOJfIon7HT9+nJd6qZfitV/7tQE4ODjgyU9+Mn/913/N/zWS+JdI4t9LEv9eknhhJPEvkcQLI4l/iSReFJJ4UUniX0sS/1dJ4oFs86KSxP1s88JI4n62eUEkAWCbF0QSALZ5QSRhmxdEEgC2eX4kAWCbF0QStnlBJGGbF0QStnlu11xzDQD/8A//8NtcddVVV1111X8+KlddddVVV131/8zrvM7rvPc7vdM7fTbAr/3ar/Ebv/Eb/Esk8aKQxL9EEv8SSfxLJPEvkcSLQhL/Ekm8KCQBcPz4cV7qpV6K137t1+Z+f/VXf8Vf//Vf87+NJP43kcQLI4kXRhL/Ekm8MJL4l0jiXyKJF5Uk/jUk8R9NEv+ZbPPvJYkHss2LQhIAtvmXSALANi+IJABs84JIAsA2z48kAGzzgkjCNi+IJGzzgkjCNi+IJGzzgkjCNlddddVVV13134jKVVddddVVV/0/8jqv8zrv/eEf/uHf9bSnPY0f/dEfZXd3l3+JJP4lkviXSOJFIYl/iST+JZJ4UUjiXyKJF4UkAF7rtV6L137t1+Z+T3nKU/i93/s9rvqXSeKFkcR/N0m8MJL4l0jiXyKJF4UkXlSS+PeSxH8XSbwgtvm3kMT9bPMvkQSAbf4lkrDNCyMJANu8IJKwzQsiCdu8IJKwzQsiCdu8IJKwzQsiCdu8IJKwzf2uvfZaAP7hH/7ht7nqqquuuuqq/3xUrrrqqquuuur/kdd5ndd5L4A///M/Z3d3l3+JJP4lkviXSOJFIYl/iST+JZJ4UUjiXyKJF4UkHvzgB/NWb/VWHD9+HICDgwN+7/d+j3vuuYf/6yTxL5HEfzZJvDCSeGEk8cJI4oWRxAsjiX+JJF4UknhRSeLfShL/G0jiudnmX0MS97PNCyOJ+9nmBZEEgG1eGEnY5gWRBIBtnh9JANjm+ZEEgG2eH0nY5gWRhG1eEEnY5gWRhG0ANjc3ueqqq6666qr/QlSuuuqqq6666v+JF3uxF3vtF3uxF3ttgL/8y7/kXyKJf4kk/iWS+JdI4kUhiX+JJP4lknhRSOJfIonjx4/zVm/1Vjz4wQ8G4ODggL/6q7/iKU95Cv+TSeJ/Ekm8MJJ4YSTxwkjihZHECyOJF0YSL4wk/iWS+JdI4kUliX8tSfxfIYkHss2LShIAtvmXSALANi+IJABs84JIAsA2L4gkbPOCSMI2L4gkbPP8SALANs+PJGzzgkjCNi+IJGxzv/vuu+9Wrrrqqquuuuo/H5Wrrrrqqquu+n/idV7ndd4L4C/+4i/4l0jiXyKJf4kk/iWS+JdI4kUhiX+JJF4UkviXnDhxgpd6qZfitV/7tQE4ODjgyU9+Mn/1V3+FJP4vkMR/BEn8d5LECyOJF0YSL4wkXhhJvDCS+JdI4kUhiX8tSfxHk8R/FNv8R5DE/WzzopDE/WzzwkgCwDYviCQAbPOCSMI2L4gkAGzz/EjCNi+IJGzzgkjCNs+PJGzzgkjCNi/ItddeC8A//MM//DZXXXXVVVdd9V+DylVXXXXVVVf9P/E6r/M67w3w67/+67wwkviXSOJfIol/iST+JZJ4UUjiXyKJf4kkXhSv/dqvzWu/9mtzv7/6q7/ir/7qr/j/SBL/XpJ4YSTxwkji30oSL4wkXhhJvDCSeGEk8S+RxL9EEv8akvj3ksR/BUm8MLb515LEA9nmXyIJANu8MJIAsM0LIgkA2zw/kgCwzQsiCds8P5IAsM3zIwnbvCCSsM3zIwkA2zw/krDN87O5uQnAfffddytXXXXVVVdd9V+DylVXXXXVVVf9P/A6r/M67w3wtKc9jYsXL/L8SOJFIYl/iST+JZL4l0jiXyKJF4Uk/iWS+Je89mu/Nq/92q/N/e6++25+7/d+j4ODAx7INpL47yCJ/08k8cJI4t9KEi+MJF4QSfxLJPHCSOJfIokXlST+rSTxP5Uknptt/jUkcT/bvDCSuJ9tXhBJANjmBZEEgG2eH0kA2Ob5kYRtXhBJ2Ob5kQSAbZ4fSdjmBZGEbZ4fSdjmqquuuuqqq/4HoHLVVVddddVV/w+8zuu8znsB/MVf/AXPjyT+JZL4l0jiRSGJf4kk/iWSeFFI4l8iiRfmwQ9+MG/91m/N8ePHATg4OOB3f/d3ueeee/ivIon/jSTxwkjihZHEv5UkXhhJvCCSeGEk8YJI4oWRxL9EEv8SSbwoJPGvJYn/zSTxQLZ5UUkCwDb/EkkA2OYFkQSAbV4QSdjmBZGEbZ4fSQDY5vmRhG1eEEnY5vmRhG1eEEnY5vmRhG0e6NprrwXgH/7hH36Hq6666qqrrvqvQeWqq6666qqr/o+75pprHvxiL/Zirw3wF3/xFzw3SfxLJPEvkcS/RBIvCkn8SyTxL5HEi0ISL8jx48d567d+ax784AcDcHBwwF/91V/x5Cc/mf/NJPEvkcS/RBL/nSTxbyWJF0QSL4wkXhBJvDCSeGEk8S+RxItCEv8akvjPJol/iW3+o0nigWzzL5HE/WzzwkgCwDYviCQAbPP8SALANs+PJABs8/xIwjbPjyQAbPP8SMI2z48kbPOCSMI2z48kbHPVVVddddVV/42oXHXVVVddddX/ce/4ju/4WQB/8Rd/wXOTxL9EEv8SSfxLJPGikMS/RBL/Ekm8KCTx/Bw/fpyXfumX5rVf+7UBODg44ElPehJ//dd/zVUvOkm8MJJ4YSTxbyWJF0QSL4gkXhhJvCCSeGEk8cJI4oWRxL9EEv8akviPIIn/KJJ4Udjm30oS97PNv0QS97PNCyIJANu8IJIAsM3zIwkA2zw/krDN8yMJANs8P5KwzfMjCds8P5IAsM3zIwnbPD+SsA3ANddcA8A//MM//DZXXXXVVVdd9V+DylVXXXXVVVf9H/diL/Zirw3wF3/xFzyQJP4lkviXSOJfIol/iSReFJL4l0jiRSGJ5+e1X/u1ee3Xfm3u95d/+Zf81V/9FQCSuOq/hiReGEm8IJJ4QSTxbyWJF0QSL4gkXhhJvDCS+JdI4kUliX8rSfxPIYnnxzb/GpK4n23+JZIAsM0LIgkA27wgkrDNCyIJ2zw/kgCwzfMjCds8P5KwzfMjCQDbPD+SsM3zIwnbPD+SANjc3OSqq6666qqr/otRueqqq6666qr/w17ndV7nva+55poHP+1pT+NpT3sa95PEv0QS/xJJ/Esk8S+RxItCEv8SSfxLJPH8vPZrvzav/dqvzf3uvvtufvd3f5eDgwP+v5HEv0QSL4wkXhhJ/FtJ4j+DJF4QSbwgknhBJPHCSOKFkcQLI4kXhST+LSTxv40knpttXhSSuJ9tXhhJANjmBZEEgG2eH0kA2Ob5kQSAbZ4fSdjm+ZGEbZ4fSQDY5vmRhG2eH0nY5vmRhG3+Jffdd9+tXHXVVVddddV/DSpXXXXVVVdd9X/Y67zO67wXwF/8xV8AIIkXhST+JZL4l0jiXyKJf4kkXhSS+JdI4rkdP36c937v9+b48eMAHBwc8Lu/+7vcfffd/G8jiX+JJP6nk8S/lSReEEm8IJJ4QSTxgkjiBZHECyOJF0QS/xJJ/Esk8a8hif8Mkvi3sM1/BEnczzYvCknczzYviCQAbPOCSALANs+PJABs8/xIwjbPjyQAbPPcJAFgm+dHErZ5fiRhm+dHErZ5fiRhm+d2zTXXAPAP//APv81VV1111VVX/dehctVVV1111VX/h73Yi73YawP8xV/8BZL4l0jiXyKJF4Uk/iWS+JdI4kUhiX+JJB7o+PHjvPVbvzUPfvCDATg4OOBJT3oSf/VXf8VV/7kk8W8liRdEEi+IJF4QSbwgknhBJPGCSOIFkcQLI4kXRhL/Ekm8qCTx7yGJ/yyS+JfY5l9DEg9km3+JJABs84JI4n62eX4kAWCb50cStnl+JAFgm+dHErZ5fiRhm+dHErZ5fiRhm+dHErZ5fiRhmwfa3NwE4L777ruVq6666qqrrvqvQ+Wqq6666qqr/o/68A//8O8C+Iu/+Ask8S+RxL9EEi8KSfxLJPEvkcS/RBIvCknc7/jx47z0S780r/3arw3AwcEBT3rSk/irv/orrnrRSOKFkcS/lSReEEn8W0jiBZHECyKJF0QSL4gkXhBJvCCSeGEk8S+RxItCEv8WkvifRhLPzTYvKknczzYvjCTuZ5sXRBIAtnl+JAFgm+cmCQDbPD+SsM3zIwnbPD+SsM3zIwnbPD+SsM3zIwnbPD+SsM39Njc3ueqqq6666qr/BlSuuuqqq6666v+oF3uxF3ttgL/8y7/kXyKJf4kk/iWSeFFI4l8iiX+JJF4Ukrjfa7/2a/Par/3a3O8v//Iv+au/+iuuejZJ/GeSxH8GSfxrSeIFkcQLIokXRBIviCReEEm8MJJ4YSTxopDEv4Yk/jeSxHOzzb9EEvezzQsjCQDbvCCSALDN8yMJ2zw/kgCwzXOTBIBtnpskAGzz3CQBYJvnJgkA2zw3SQDY5rlJwjbPjyQAbLO5uQnAP/zDP/wOV1111VVXXfVfh8pVV1111VVX/R/0Oq/zOu99zTXXPPjixYs87WlP44WRxL9EEv8SSfxLJPGikMS/RBL/Eknc76Vf+qV57dd+bY4fPw7A3Xffze/8zu9wcHCAJP6nk8R/BEn8Z5PEv5UkXhBJvCCSeEEk8a8liRdEEi+IJF4QSbwgknhBJPHCSOJfIokXlST+I0jiP4Nt/q0k8UC2eWEkcT/bvCCSALDNCyIJANs8N0kA2Ob5kYRtnh9J2Ob5kYRtnh9J2Ob5kYRtnh9J2Oa5SQLANs+PJK666qqrrrrqvwmVq6666qqrrvo/6HVe53XeC+A3fuM3eGEk8S+RxL9EEv8SSbwoJPEvkcS/RBIAx48f563f+q158IMfDMD+/j6/+7u/y913383/NZL4ryCJfytJ/FeSxAsiiedHEi+IJF4QSTw/knhBJPGCSOKFkcS/RBIvCkn8W0niv5IkXhDb/GtI4n62eWEkAWCbF0QS97PN8yMJ2zw/kgCwzXOTBIBtnpskAGzz3CQBYJvnJgnbPD+SsM3zIwnbPD+SsM3zc8011wDwD//wD7/NVVddddVVV/3XoXLVVVddddVV/we92Iu92GsDPO1pT+MFkcS/RBL/Ekn8SyTxL5HEi0IS/xJJHD9+nNd+7dfmpV/6pQHY39/nyU9+Mn/5l3/JVS+YJP49JPFvJYkXRBIviCT+tSTxryWJF0QSz48kXhBJvCCSeEEk8S+RxItCEv8akvifTBLPzTYvCknczzYviCTuZ5sXRBIAtnlukgCwzfMjCds8P5KwzfMjCds8P5KwzXOTBIBtnpskbPP8SMI2z48kbPPcNjc3Abjvvvtu5aqrrrrqqqv+61C56qqrrrrqqv9jXud1Xue9Af7iL/6Cixcv8twk8aKQxL9EEv8SSfxLJPGikMS/5MSJE7z0S780r/3ar839/vIv/5K//Mu/5H8iSfxvIol/K0n8W0jiBZHECyKJ50cSL4gknh9JvCCSeH4k8YJI4gWRxAsiiRdGEv8SSbyoJPGfQRIvCtv8e0niudnmhZHE/WzzgkgCwDYviCQAbPPcJAFgm+cmCQDbPDdJANjmuUkCwDbPTRK2eX4kYZvnJgkA2zw3Sdjm+ZGEba666qqrrrrqfwAqV1111VVXXfV/zDu+4zt+FsBf/uVf8twk8S+RxItCEv8SSfxLJPEvkcSL4nVe53V47dd+be73l3/5l/zlX/4l/x0k8T+NJP6nksR/JEn8a0ni+ZHECyKJ50cSz48kXhBJvCCSeGEk8S+RxItCEv9WkviPJIkXhW3+NSRxP9u8MJK4n22eH0kA2OYFkQSAbZ6bJABs89wkAWCb5yYJ2zw/krDNc5MEgG2emyRs8/xIwjbPTRK2eX4kYRuAa665BoB/+Id/+G2uuuqqq6666r8Wlauuuuqqq676P+R1Xud13vuaa655MMDTnvY0HkgS/xJJ/Esk8aKQxL9EEv8SSfxLHvzgB/M2b/M2HD9+HIC7776b3/md3+Hg4ICrXnSS+PeQxAsiiRdEEi+IJF4QSTw/knhBJPH8SOL5kcQLIonnRxLPjyReEEm8IJJ4QSTxL5HEv0QS/1qS+J9CEs+Pbf4lkngg27wgkgCwzfMjCQDbvCCSsM3zIwkA2zw3SdjmuUkCwDbPTRK2eX4kYZvnJgnbPD+SsM1zkwSAbZ6bJGyzsbEBwH333XcrV1111VVXXfVfi8pVV1111VVX/R/yYi/2Yq8F8OM//uM8kCT+JZL4l0jiXyKJF4Uk/iWSeGGOHz/O27zN2/DgBz8YgP39fX7nd36Hu+++G0n8XyGJf4kk/rNJ4n8KSfxrSeL5kcTzI4kXRBLPjySeH0k8P5J4QSTxwkjiBZHEv0QS/xqS+N9GEg9km3+JJO5nm+dHEvezzXOTxP1s89wkAWCb50cStnlukgCwzXOThG2emyQAbPPcJGGb5yYJANs8N0nY5vmRhG2emyQ2NzcBuO+++27lqquuuuqqq/5rUbnqqquuuuqq/0Ne53Ve570Bnva0p3E/SfxLJPEvkcS/RBIvCkn8SyTxghw/fpyXfumX5nVe53UA2N/f50lPehJ/+Zd/yVX/PSTxgkjiBZHECyKJfy1JPD+SeH4k8a8liedHEs+PJJ4fSbwgknhBJPHCSOKFkcSLQhL/HpL4z2abfw1JPJBtXhhJANjmBZEEgG2eH0kA2Oa5SQLANs9NEgC2eW6SsM1zkwSAbZ6bJGzz3CQBYJvnJgnbPDdJ2Ob5kYRtntvW1hYAZ8+efQZXXXXVVVdd9V+LylVXXXXVVVf9H/E6r/M67w3wF3/xF1y8eBEASfxLJPEvkcS/RBL/Ekm8KCTx/Bw/fpyXfumX5nVe53W431/8xV/wl3/5l/x72EYS/5dJ4oWRxAsjif8pJPH8SOI/iiSeH0k8P5J4fiTx/Eji+ZHECyKJF0YSL4wk/iWS+NeSxH8XSTw/tnlRSOJ+tnlBJHE/2zw/kgCwzfMjCds8P5IAsM1zk4RtnpskAGzz3CRhm+cmCQDbPDdJ2Oa5ScI2z00SALZ5bpKwzQNtbGxw1VVXXXXVVf9NqFx11VVXXXXV/xHv+I7v+FkAf/mXfwmAJP4lkviXSOJfIol/iSReFJJ4fl77tV+b13md1+F+T3rSk/id3/kdXhDbSOKq/3yS+LeQxAsiiedHEv9aknh+JPH8SOL5kcTzI4nnRxLPjySeH0m8IJJ4QSTxgkjiXyKJF5Uk/jeQxHOzzQsjifvZ5gWRBIBtnh9JANjmuUkCwDbPjyQAbPNAkgCwzXOThG2emyQAbPPcJGGb5yYJ2zw3Sdjm+ZGEbZ6bJGxzv83NTQD+4R/+4be56qqrrrrqqv9aVK666qqrrrrq/4DXeZ3Xee9rrrnmwQBPf/rTkcS/RBL/Ekn8SyTxL5HEv0QSz8+DH/xg3uZt3objx48DsL+/z+/8zu9w9913c9UVkvifShL/WpL415LE8yOJ50cSz48knh9JPD+SeH4k8fxI4vmRxPMjiRdEEi+IJP4lknhRSOLfQxL/GWzzryGJB7LNCyKJ+9nm+ZHE/Wzz3CQBYJvnJgkA2zw/krDNc5MEgG0eSBIAtnlukrDNc5OEbZ6bJGzz3CQBYJvnJgnbPDdJ2AZgc3MTgPvuu+9Wrrrqqquuuuq/FpWrrrrqqquu+j/gxV7sxV4L4C//8i/5l0jiRSGJf4kk/iWS+JdI4rkdP36ct3mbt+HBD34wAPv7+/zlX/4lT3rSk/i/QhL/Ekn8e0nihZHECyOJ/2iS+NeSxPMjiedHEs+PJJ4fSTw/knh+JPHcJPH8SOL5kcQLIonnRxIvjCReEEm8KCTxryGJ/2qSeEFs8y+RxAPZ5vmRxP1s8/xIAsA2z00SALZ5bpIAsM1zkwSAbZ6bJGzz3CRhm+cmCds8N0kA2OaBJAFgm+cmCds8N0nY5rlJwjZXXXXVVVdd9d+IylVXXXXVVVf9H/A6r/M67w3wG7/xG7wwkviXSOJFIYl/iST+JZJ4oOPHj/PSL/3SvM7rvA4A+/v7POlJT+Iv/uIvAJDEVf9zSOIFkcS/liT+M0ni+ZHE8yOJ50cSz00Sz48knh9JvCCSeH4k8YJI4gWRxL9EEi8qSfxPJonnZpsXRhL3s83zI4n72ea5SQLANs9NEgC2eW6SALDNc5MEgG0eSBIAtnkgSQDY5oEkAWCb5yYJ2zw3SdjmuUnCNs9NErZ5btdccw0A//AP//DbXHXVVVddddV/PSpXXXXVVVdd9b/c67zO67w3wF/+5V9y8eJFXhBJ/Esk8S+RxItCEv8SSTzQa7/2a/M6r/M63O8v/uIv+Iu/+Auu+r9FEv9aknh+JPH8SOJFJYnnRxLPjySemySeH0k8P5J4fiTx/EjiBZHECyKJF0YSLwpJ/HtI4j+Sbf61JPFAtnlBJHE/2zw/kgCwzXOTBIBtnpskAGzz3CQBYJvnJgnbPDdJ2Oa5ScI2z00StnlukrDNc5OEbZ6bJGzz3CRhmwfa3NwE4L777ruVq6666qqrrvqvR+Wqq6666qqr/pd7x3d8x88CeNrTnsYLIol/iST+JZJ4UUjiXyKJ+732a782r/M6r8P97rrrLn7nd36H/f19rnrhJPHCSOKFkcQLI4kXRBIviCT+tSTx/Eji+ZHE8yOJ50cSLypJPD+SeG6SeH4k8fxI4vmRxPMjiedHEi+IJF4YSfxLJPGvIYn/KpJ4QWzzopDE/WzzgkgCwDbPjyQAbPPcJAFgm+cmCQDbPDdJ2Oa5SQLANg8kCQDbPJAkAGzzQJKwzXOThG2emyRs89wkYZvnJgkA2wBsbGwAcN99993KVVddddVVV/3Xo3LVVVddddVV/4u92Iu92Gtfc801Dwb4y7/8S54fSfxLJPEvkcS/RBIvCkkAPPjBD+Zt3uZtOH78OAD7+/v89m//NnfffTf/m0niqudPEv+ZJPH8SOL5kcRzk8TzI4nnJonnRxLPjySeH0k8N0m8IJJ4fiTxgkjiXyKJF4Uk/qeSxHOzzQsjifvZ5vmRxP1s89wkAWCb5yYJANs8N0kA2OaBJAFgm+cmCds8N0nY5rlJwjYPJAkA2zyQJABs80CSALDNA0kCwDbPTRK22dzcBODs2bPP4Kqrrrrqqqv+61G56qqrrrrqqv/FXud1Xue9AP7yL/+S50cS/xJJ/Esk8S+RxItCEsePH+dt3uZtePCDHwzA/v4+f/EXf8GTnvQkrno2Sfx3ksQLIokXRBL/WpJ4fiTx/EjiRSWJ50cSLypJPDdJPD+SeG6SeH4k8fxI4vmRxPMjiRdEEi+MJF4Ukvi3ksR/NNu8qCTx3Gzz/EjifrZ5fiQBYJvnJon72eaBJAFgm+cmCds8N0nY5rlJAsA2DyQJANs8kCRs89wkYZvnJgnbPDdJ2Oa5ScI2z00Sm5ubXHXVVVddddV/IypXXXXVVVdd9b/Y67zO67w3wG/8xm/w3CTxL5HEv0QS/xJJ/Eskcfz4cV76pV+a13md1wFgf3+fJz7xifzlX/4l/50k8V9NEv9eknhhJPHCSOK/kiSeH0k8P5J4fiTx/EjiRSWJ50cSz00Sz00Sz48knpsknh9JPD+SeH4k8fxI4vmRxAsjiRdGEv8akvivJIkXxDb/EknczzbPjyTuZ5vnJon72ea5SQLANg8kCQDbPJAkAGzzQJIAsM1zk4RtnpskbPNAkgCwzQNJwjbPTRK2eW6SsM1zk4RtntvGxgYA//AP//DbXHXVVVddddV/PSpXXXXVVVdd9b/U67zO67w3wF/+5V9y8eJF7ieJF4Uk/iWS+JdI4l8iidd+7dfmdV7ndbjfn//5n/MXf/EXAEjifwNJXAWSeEEk8d9BEs+PJJ6bJJ4fSTw3STw3STw/knhuknh+JPHcJPH8SOL5kcTzI4kXRBIvjCReVJL4n0oSz802L4gk7meb50cS97PNc5MEgG2emyQAbPNAkgCwzQNJAsA2DyQJANs8kCQAbPNAkrDNc5OEbR5IEgC2eSBJ2Oa5ScI2z00Stnmgzc1NAO67775bueqqq6666qr/elSuuuqqq6666n+p13md13kvgKc97WncTxL/Ekm8KCTxL5HEv+R1Xud1eJ3XeR3ud9ddd/Hbv/3b7O/vc9V/H0m8MJL4jySJ50cSz48knh9JvKgk8aKSxHOTxItKEs9NEs+PJJ6bJJ4fSTw3Sbwgknh+JPHCSOJfIol/C0n8Z7HNi0oSD2Sb50cS97PN8yMJANs8N0kA2Oa5SQLANg8kCQDbPJAkbPPcJGGb5yYJ2zyQJABs80CSsM1zk4RtHkgSALZ5IEnY5rlJwjYAGxsbXHXVVVddddV/MypXXXXVVVdd9b/Qi73Yi732i73Yi702wF/+5V8CIIl/iST+JZJ4UUjihTl+/Djv+77vy/HjxwHY39/nt3/7t7nrrru46l8mif9tJPGfSRLPjyReVJJ4bpJ4bpJ4fiTx3CTx3CTx/EjiuUniuUni+ZHE8yOJ50cSL4gk/iWSeFFJ4r+aJF4Q27wwkngg2zw3SdzPNs9NEvezzQNJAsA2z00StnlukrDNA0kCwDYPJAkA2zyQJABs80CSsM0DSQLANg8kCds8N0nY5oEkAWCbB5KEbTY3NwH4h3/4h9/hqquuuuqqq/57ULnqqquuuuqq/4Ve53Ve570A/vIv/xIASfxLJPEvkcSLQhIvyPHjx3mbt3kbHvKQhwCwv7/PE5/4RP7iL/6Cq/7jSOKFkcS/lSReEEn8a0ni+ZHE8yOJF5Uknh9JPDdJPDdJvKgk8dwk8dwk8dwk8fxI4rlJ4rlJ4vmRxPMjiRdEEi+MJF4UkvifTBLPzTYviCTuZ5vnJon72ea5SQLANg8kCQDbPJAkAGzzQJIAsM0DSQLANg8kCds8N0nY5oEkAWCbB5KEbR5IEgC2eSBJ2Oa5ScI2DySJzc1NAO67775bueqqq6666qr/HlSuuuqqq6666n+h13md13lvgN/4jd9AEv8SSfxLJPEvkcQLcvz4cV7mZV6G13md1wFgf3+fJz7xifzFX/wF/59I4l8iif9OkviPJon/CJJ4fiTxopLEc5PEi0oSz00Sz00Sz00Sz00Sz00Sz48knpsknh9JPD+SeH4k8YJI4l8iiX8tSfxXsM2LQhIPZJvnRxL3s81zkwSAbZ6bJABs80CSALDNA0kCwDYPJAkA2zyQJGzzQJIAsM0DScI2z00StnkgSdjmuUnCNg8kCds8N0nY5oE2NjYAuO+++57OVVddddVVV/33oHLVVVddddVV/8u8zuu8znsDPO1pT2N3d5d/iST+JZL4l0jiBXmd13kdXud1Xof7/fmf/zl/8Rd/wVX/+0jiBZHEv5Yknh9J/HtJ4rlJ4kUliecmiecmiecmiecmiecmiecmiecmiedHEs9NEs+PJJ4fSbwgknhhJPGiksR/F0k8P7Z5YSRxP9s8P5IAsM1zk8T9bPNAkgCwzQNJAsA2DyQJANs8kCRs80CSALDNA0nCNg8kCQDbPJAkbPNAkgCwzQNJwjYPJAkA2zyQJGxzv83NTQDOnj37DK666qqrrrrqvweVq6666qqrrvpf5nVe53XeC+Cv/uqv+JdI4l8iiX+JJJ6fBz/4wbzt274tx48fB+Cuu+7it37rt9jf30cSV/3bSOKFkcQLI4n/SpJ4fiTxryGJ50cSz00SLypJPDdJPDdJPDdJPDdJPDdJPDdJPDdJPDdJPDdJPD+SeG6SeH4k8YJI4gWRxL9EEv9ekvjXss2/hiSem22eH0nczzbPTRL3s81zkwSAbR5IEgC2eSBJANjmgSRhmweSBIBtHkgStnkgSQDY5oEkYZsHkgSAbR5IErZ5IEnY5rlJwjYPJAnbAGxsbABw9uzZW7nqqquuuuqq/x5Urrrqqquuuup/kWuuuebBL/ZiL/baAH/5l3/JCyOJf4kk/iWSeG7Hjx/nbd7mbXjIQx4CwP7+Pr/1W7/FXXfdxVX/s0ni30IS/1Ek8aKSxItKEs9NEs9NEs9NEs9NEs9NEs9NEs9NEs9NEs9NEs9NEs9NEs+PJJ6bJF4QSTw/kviXSOJfQxL/0STxL7HNCyOJB7LNc5PE/Wzz3CQBYJvnJgkA2zyQJABs80CSALDN/SQBYJsHkoRtHkgSALZ5IEnY5oEkAWCbB5KEbR5IErZ5IEkA2OaBJGGbB5IEwObmJgD33XffrVx11VVXXXXVfw8qV1111VVXXfW/yDu+4zt+FsBf/uVf8sJI4l8iiX+JJB7o+PHjvM7rvA4v8zIvA8D+/j5PfOIT+fM//3OuetFI4n8qSfxrSeL5kcTzI4nnRxIvKkk8N0k8N0m8KCTx3CTx3CTx3CTx3CTx3CTx3CTx3CTx3CTx3CTx/Eji+ZHE8yOJF0YSLwpJ/E8hiedmmxdEEvezzXOTxP1s80CSuJ9tHkgSALZ5IEkA2OaBJGGbB5IEgG3uJwkA2zyQJGzzQJKwzXOThG0eSBK2eSBJ2Oa5ScI2DyQJ2zy3jY0NAO67775bueqqq6666qr/HlSuuuqqq6666n+RF3uxF3ttgL/8y7/k+ZHEi0IS/xJJ3O/48eO8zMu8DK/zOq/D/f78z/+cP//zP+f/C0n8byCJF0QS/xaS+O8giecmiX8PSfxLJPHcJPHcJPHcJPHcJPHcJPFAknhuknh+JPHcJPH8SOL5kcQLIol/iST+tSTxH802LwpJPJBtnh9J3M82z00S97PNA0kCwDYPJAkA2zyQJABscz9JANjmgSRhmweSBIBt7icJANvcTxIAtnkgSdjmgSRhmweSBIBtHkgStnkgSdjmfhsbGwDcd999t3LVVVddddVV/32oXHXVVVddddX/Eq/zOq/z3tdcc82Dn/70p/P0pz+d5yaJf4kkXhSSuN/rvM7r8Dqv8zrc78///M/58z//c/4j2UYS/9tJ4t9LEi+MJP4zSOJfSxLPjySeH0k8P5J4bpJ4UUniuUniuUniuUniXyKJ5yaJ5yaJ5yaJB5LEc5PEc5PEc5PEc5PE8yOJ50cSz48kXhhJvKgk8V9FEi+IbV4QSTyQbZ6bJO5nm+cmCQDbPJAkAGzzQJIAsM0DScI2DyQJANvcTxIAtnkgSdjmgSRhmweShG0eSBIAtrmfJABs80CSsM0DScI2DyQJANucOXMGgLNnz97KVVddddVVV/33oXLVVVddddVV/0u8zuu8znsB/OVf/iXPTRL/Ekm8KCQB8OAHP5i3fdu35fjx4wDcdddd/NZv/Rb7+/tc9T+TJP63kcSLShLPTRLPTRLPTRLPTRLPTRL/Ekk8N0k8N0k8kCSemySemySemySemySemySeH0k8P5J4QSTxL5HEfwRJvDC2+deSxHOzzfMjifvZ5rlJ4n62eSBJANjmgSQBYJsHkgSAbe4nCQDbPJAkbPNAkrDNA0kCwDb3kwSAbe4nCQDbPJAkbPNAkrDNA0nCNg8kCds8N0nc77777ruVq6666qqrrvrvQ+Wqq6666qqr/pd4sRd7sdcGePrTn84DSeJfIol/iSQAjh8/ztu8zdvwkIc8BID9/X1+8zd/k7vuugtJ/F8jif8PJPFvIYnnRxLPjySeH0m8qCTxn00Sz00Sz00SDySJ5yaJ5yaJB5LEc5PEc5PEA0niuUniuUni+ZHE8yOJF0QSL4wkXlSS+I8giReFbV4YSTyQbZ6bJO5nm+cmCQDbPJAkAGzzQJIAsM0DSQLANveTBIBt7icJANvcTxIAtnkgSdjmgSRhmweShG0eSBK2eSBJ2OaBJGGbB5IEgG0eaGNjA4D77rvvVq666qqrrrrqvw+Vq6666qqrrvpf4B3f8R0/C+Av//IvuXjxIveTxL9EEv8SSRw/fpyXeZmX4XVe53UA2N/f5wlPeAJ//ud/zr+FbSRx1bNJ4oWRxAsjif8MkvjvIIkXlSSemySemySemyT+JZJ4bpJ4IEk8N0k8N0k8kCSemyQeSBLPTRLPTRLPTRLPTRLPjySeH0m8IJJ4UUjiv5sknh/bPD+SuJ9tnpsk7mebB5LE/WxzP0kA2OaBJAFgmweShG0eSBIAtrmfJABscz9J2OaBJGGbB5KEbR5IErZ5IEnY5oEkAWCb+0kCwDYPJAnb3G9zcxOAs2fPPoOrrrrqqquu+u9D5aqrrrrqqqv+F3id13md9wb4y7/8S+4niX+JJP4lJ06c4GVe5mV4ndd5He73Z3/2Z/z5n/85/5tJ4v8TSbwgkvi3kMTzI4nnRxLPjyReVJJ4bpJ4bpJ4bpJ4bpJ4bpJ4IEk8N0k8kCSemySemyQeSBLPTRIPJInnJokHksRzk8Rzk8TzI4nnRxIviCReGEn8a0niP5pt/iWSeCDbPDdJPJBtHkgS97PNA0kCwDb3k8T9bHM/SQDY5n6SALDNA0nCNg8kCdvcTxIAtrmfJABscz9JANjmfpIAsM39JAFgmweShG0eSBK2eSBJ2AZgY2MDgPvuu+9Wrrrqqquuuuq/D5Wrrrrqqquu+h/udV7ndd7rmmuuefDFixd5+tOfDoAk/iWS+Je87uu+Lq/zOq/D/Z74xCfyZ3/2Z+zv73PVs0niXyKJ/40k8d9BEs9NEv+RJPHcJPEvkcS/RBLPTRIPJIkHksRzk8QDSeK5SeK5SeK5SeK5SeL5kcTzI4kXRhIvCkn8V5HE82ObF0QSD2Sb5yYJANs8N0kA2OaBJAFgmweShG0eSBIAtrmfJABscz9JANjmfpIAsM39JGGbB5KEbR5IErZ5IEnY5oEkYZsHkoRtHkgStnkgSdhmY2MDgLNnz97KVVddddVVV/33oXLVVVddddVV/8O92Iu92GsD/OZv/iYAkviXSOKFechDHsLbvu3bcvz4cQD29/f5zd/8Te666y6u+p9JEv+VJPH8SOL5kcTzI4l/D0k8N0k8N0n8SyTx3CTxQJJ4bpJ4IEk8N0k8kCQeSBLPTRIPJInnJokHksRzk8Rzk8TzI4nnRxIviCReGEn8e0jiRWWbF5Uknpttnh9J3M82DySJ+9nmgSQBYJsHkgSAbe4nCQDbPJAkAGxzP0nY5oEkYZsHkoRt7icJANvcTxIAtrmfJGzzQJKwzQNJwjYPJAnbPJAkbPNAktjY2ADgvvvuu5Wrrrrqqquu+u9D5aqrrrrqqqv+h3ud13md9wZ4+tOfjiT+JZJ4QY4fP87bvu3b8pCHPASA/f19/uzP/ownPvGJXPWfSxIvjCT+rSTxgkjiBZHEfwdJPDdJPDdJPDdJPDdJPDdJ/Esk8UCSeG6SeCBJPDdJPJAkHkgSz00SDySJB5LEc5PEc5PEc5PEc5PE8yOJ50cSL4gkXlSS+I8kiX+JbV4QSTyQbZ6bJO5nmweSxP1scz9J3M8295MEgG3uJwkA2zyQJGxzP0kA2OZ+kgCwzf0kAWCb+0nCNg8kCdvcTxIAtrmfJGzzQJIAsM39JGGbB5KEbe63sbEBwH333XcrV1111VVXXfXfi8pVV1111VVX/Q/2Oq/zOu8N8Jd/+Zfs7u7yL5HE83P8+HFe5mVehtd93dcFYH9/nyc84Qn82Z/9GZJ4UdlGElf93yaJ50cSz48knh9JPDdJ/GeTxHOTxANJ4l8iiX+JJB5IEg8kiecmiQeSxANJ4rlJ4oEk8dwk8dwk8dwk8fxI4gWRxL9EEv8TSOL5sc1zk8QD2eaBJHE/2zyQJABs80CSALDN/SQBYJv7SQLANveTBIBt7icJANvcTxK2eSBJ2OZ+kgCwzf0kYZsHkoRt7icJANs8kCRscz9JANjmfpIAsM3p06cB+Id/+Iff5qqrrrrqqqv+e1G56qqrrrrqqv/B3vEd3/GzAP7qr/6KF0YSL8jrvM7r8Lqv+7rc78/+7M/4sz/7M676jyOJ/0yS+N9GEi8qSTw3STw3STw3SfxLJPEvkcQDSeK5SeKBJPFAknggSTw3STyQJB5IEg8kiecmiQeSxHOTxPMjiecmiRdEEi+IJP41JPGfyTYvjCQeyDbPTRL3s80DSQLANg8kCQDbPJAkAGxzP0kA2OZ+kgCwzf0kAWCb+0nCNveTBIBt7icJ2zyQJGxzP0kA2OZ+krDNA0nCNg8kCds8kCRs80CSuOqqq6666qr/QahcddVVV1111f9Qr/M6r/Pe11xzzYMBnv70p/OCSOL5eZ3XeR1e93Vfl/vdeeed/OZv/ib7+/tcdYUk/itI4oWRxL+VJF4QSbwgknh+JPGvIYkXlST+rSTx3CTx3CTxQJJ4bpJ4IEk8kCSemyQeSBIPJIkHksQDSeK5SeKBJPFAknggSTw3STw3STw3STw3STw/knhBJPEvkcR/B0k8P7Z5fiRxP9s8N0nczzb3k8T9bHM/SQDY5oEkAWCb+0kCwDb3k4RtHkgStrmfJABscz9J2OZ+kgCwzf0kYZsHkoRt7icJANvcTxK2eSBJ2OaBJGGbB9rY2ADgvvvuu5Wrrrrqqquu+u9F5aqrrrrqqqv+h3qxF3ux1wL4zd/8TV4QSTy3hzzkIbzt274tx48fB2B/f5/f+I3f4K677uKqfz1JXAWSeFFJ4kUliecmiX8LSfxLJPFAkviXSOKBJPFAknggSTyQJJ6bJB5IEg8kiQeSxHOTxANJ4rlJ4rlJ4vmRxPMjiRdGEv8Wkvj3ss2/RBLPzTYPJIkHss0DSQLANg8kCQDb3E8S97PN/SQBYJv7ScI295MEgG3uJwkA29xPEra5nyQAbHM/SdjmfpIAsM39JGGbB5KEbe4nCQDb3E8StnkgSdjmfhsbGwCcPXv2GVx11VVXXXXVfy8qV1111VVXXfU/1Ou8zuu8N8Bf/dVf8fxI4oGOHz/O277t2/KQhzwEgP39ff7sz/6MJzzhCVz1v5ckXhBJvCCSeEEk8R9BEi8qSTw3STw3STw3STw3STyQJJ6bJB5IEv8SSTyQJB5IEg8kiQeSxANJ4oEk8dwk8UCSeCBJPJAknpskHkgSz00Sz48knpskXhBJvKgk8Z9JEi+IbV4QSdzPNs9NEvezzf0kcT/b3E8SALZ5IEkA2OZ+krDN/SQBYJv7SQLANveThG3uJwkA29xPEra5nyQAbHM/SdjmfpIAsM39JGGbB5KEbe4nCQDb3E8StgE4ffo0APfdd9+tXHXVVVddddV/LypXXXXVVVdd9T/Q67zO67w3wF/+5V9y8eJFnpsk7nf8+HFe5mVehtd93dcFYH9/nyc84Qn82Z/9GS8K20jiqn8bSfx7SOJ/Ckk8P5J4UUniP5sk/iWS+JdI4oEk8UCSeCBJPJAkHkgSDySJB5LEA0nigSTx3CTxQJJ4IEk8N0k8kCSemySeH0k8P5L4l0ji30oSLyrbvCgk8dxs89wk8UC2eSBJANjmgSQBYJv7SQLANg8kCdvcTxIAtrmfJABscz9J2OZ+kgCwzf0kYZv7SQLANveThG3uJwnbPJAkbHM/SdjmgSRhmweShG3uJ4kHOnv27K1cddVVV1111X8vKlddddVVV131P9A7vuM7fhbA05/+dJ6bJO73Oq/zOrzu674u9/vTP/1T/uzP/gxJ/H8mif8pJPE/iST+I0jiRSWJ5yaJ5yaJ5yaJf4kk/iWSeCBJPJAk/j0k8UCSeCBJPJAkHkgSDySJB5LEc5PEA0niuUniuUniuUni+ZHECyKJF4Uk/iNJ4l9im+dHEg9km+cmifvZ5n6SuJ9t7icJANvcTxIAtrmfJABscz9JANjmfpIAsA2AJABscz9J2OZ+kgCwzf0kYZv7ScI295MEgG3uJwnb3E8SALa5nyRs80CSsM0DbWxsAHDffffdylVXXXXVVVf996Jy1VVXXXXVVf/DvNiLvdhrX3PNNQ8G+Ku/+iseSBIAr/M6r8Prvu7rcr8777yT3/iN32B/f5+r/uNI4r+TJF4QSbwgkvjXksTzI4kXlST+I0niuUnigSTx3CTxQJJ4IEk8kCSemyQeSBIPJIkXRBIPJIkHksQDSeKBJPFAknggSTw3STyQJJ6bJJ6bJJ6bJF4QSbwwkvifQBLPzTbPTRL3s81zkwSAbR5IEgC2uZ8kAGxzP0kA2OZ+kgCwzf0kAWCb+0nCNveTBIBtACQBYJv7ScI295OEbe4nCQDb3E8StrmfJGzzQJKwzf0kYZsHkoRtADY2NgC47777buWqq6666qqr/vtRueqqq6666qr/YV7ndV7nvQD+8i//kgeSxPHjx3m/93s/jh8/DsD+/j6/8Ru/wZ133sn/ZpL4ryaJq/5tJPGiksRzk8Rzk8S/RBL/Ekk8kCT+tSTxQJJ4IEk8kCReEEk8kCQeSBIPJIkHksQDSeKBJPFAknhuknhuknhuknh+JPHCSOJFIYn/CrZ5fiTxQLZ5IEnczzYPJIn72eZ+kgCwzf0kcT/bAEgCwDb3kwSAbe4nCdvcTxIAtrmfJGxzP0nY5n6SALANgCQAbHM/SdjmfpKwzf0kAWCb+0nCNveTBIBt7icJgFOnTgHwD//wD7/NVVddddVVV/33o3LVVVddddVV/8O8zuu8znsD/OZv/ib3O3HiBG/7tm/LQx7yEAD29/d5/OMfz5/92Z/x/4kk/ieRxL+HJP6jSeIFkcTzI4nnRxIvKkk8N0m8KCTx3CTxL5HEA0niXyKJB5LEA0nigSTxQJJ4IEk8kCTuJ4kHksQDSeKBJPFAknggSTyQJB5IEg8kiecmiecmiedHEs+PJP4lkvjvIonnZpvnJokHss39JHE/2zyQJABscz9J3M8295MEgG0AJAFgm/tJAsA2AJIAsM39JGGb+0kCwDYAkgCwzf0kYZv7ScI295OEbe4nCQDb3E8StrmfJGzzQJKwzQNJ4qqrrrrqqqv+B6Fy1VVXXXXVVf+DvM7rvM57AfzlX/4lu7u7nDhxgpd5mZfhdV/3dQHY39/n8Y9/PH/2Z3/GC2MbSVz130sS/1aSeEEk8d9FEv8ekvi3kMS/liQeSBIPJIkHksQDSeKBJPFAknggSdxPEg8kiQeSxANJ4oEkcT9JPJAkHkgSz00SDySJ5yaJ5yaJ50cSL4wkXhSS+M9km+dHEg9km+cmifvZ5n6SuJ9t7ieJ+9nmfpIAsM39JGGb+0kCwDb3k4Rt7icJANsASALANveThG3uJwnb3E8StrmfJGxzP0kA2OZ+krDN/SRhm/tJAsA295OEbe536tQpAO67775bueqqq6666qr/flSuuuqqq6666n+Q13md13lvgKc//em87uu+Lq/7uq/L/f70T/+UP/uzP+Oqq14QSbwgknh+JPH8SOJFJYnnJonnJonnJonnJokHksRzk8QDSeKBJPFAknggSbwwknggSTyQJB5IEveTxANJ4oEk8UCSuJ8kHkgSDySJB5LEA0niuUnigSTx3CTx/Eji+ZHEv0QS/9Uk8fzY5oEk8UC2eSBJ3M8295MEgG0eSBIAtrmfJABsAyAJANvcTxIAtgGQBIBt7icJ29xPEra5nyRscz9JANgGQBIAtgGQBIBt7icJ29xPEra5nyRs80CSsM39JGGbBzp79uwzuOqqq6666qr/flSuuuqqq6666n+IF3uxF3vtF3uxF3ttgNd7vdfj+PHjANx55538+q//OgcHB1z1X0cS/5kk8YJI4gWRxH8XSfxnk8S/RBIPJIl/L0m8IJJ4IEk8kCReEEk8kCQeSBL3k8QDSeKBJPFAknggSTyQJB5IEs9NEs9NEs+PJF4QSbyoJPGfwTYviCQeyDYPJIn72eaBJAFgm/tJ4n62uZ8kAGxzP0kA2AZAEgC2uZ8kbHM/SQDYBkASALYBkASAbQAkAWCb+0nCNveThG3uJwnb3E8StrmfJGxzP0kA2OZ+krDN/SRhm1OnTgHwD//wD7/NVVddddVVV/33o3LVVVddddVV/0O8zuu8znvxTMePHwfg8Y9/PHfeeSc33ngjkvjXkMR/Bkm8qCTxH0kS/xEk8S+RxL+HJF4YSfxbSOJfSxLPjyT+NSTx3CTxopDEi0ISDySJf4kkHkgSL4wkXhhJPJAkXhBJPJAkXhBJvCCSeCBJvCCSeCBJ/Esk8S+RxPMjiX8LSfxPYJt/K9s8P7Z5UdjmX2KbB7LNC2ObB7LNC2ObF8Y2z802L4xtHsg2V1111VVXXfU/GJWrrrrqqquu+h/iH/7hH37ndV7ndd6bB3jMYx7DYx7zGK666qqrrrrqf5Pf+q3f+u777rvvVq666qqrrrrqvx+Vq6666qqrrvof4rd+67e++8Ve7MVei6uuuuqqq676X+7rv/7r34errrrqqquu+p8BPehBD+Kqq6666qqrrrrqqquuuuqqq6666qqrrvo/icpVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V/FPwKrQAemRTQA1wAAAABJRU5ErkJggg==) + + diff --git a/docs/kcl/bezierCurve.md b/docs/kcl/bezierCurve.md index 8538a75fc..0ef880ec7 100644 --- a/docs/kcl/bezierCurve.md +++ b/docs/kcl/bezierCurve.md @@ -33,9 +33,9 @@ exampleSketch = startSketchOn('XZ') |> startProfileAt([0, 0], %) |> line([0, 10], %) |> bezierCurve({ - to: [10, 10], - control1: [5, 0], - control2: [5, 10] + to = [10, 10], + control1 = [5, 0], + control2 = [5, 10] }, %) |> lineTo([10, 0], %) |> close(%) diff --git a/docs/kcl/chamfer.md b/docs/kcl/chamfer.md index ef12d78f9..3a8e244ee 100644 --- a/docs/kcl/chamfer.md +++ b/docs/kcl/chamfer.md @@ -44,8 +44,8 @@ mountingPlateSketch = startSketchOn("XY") mountingPlate = extrude(thickness, mountingPlateSketch) |> chamfer({ - length: chamferLength, - tags: [ + length = chamferLength, + tags = [ getNextAdjacentEdge(edge1), getNextAdjacentEdge(edge2), getNextAdjacentEdge(edge3), @@ -58,7 +58,7 @@ mountingPlate = extrude(thickness, mountingPlateSketch) ```js // Sketch on the face of a chamfer. -fn cube = (pos, scale) => { +fn cube(pos, scale) { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) @@ -72,8 +72,8 @@ part001 = cube([0, 0], 20) |> close(%, $line1) |> extrude(20, %) |> chamfer({ - length: 10, - tags: [getOppositeEdge(line1)] + length = 10, + tags = [getOppositeEdge(line1)] }, %, $chamfer1) // We tag the chamfer to reference it later. sketch001 = startSketchOn(part001, chamfer1) diff --git a/docs/kcl/circle.md b/docs/kcl/circle.md index 90849740a..6f019fc7b 100644 --- a/docs/kcl/circle.md +++ b/docs/kcl/circle.md @@ -30,7 +30,7 @@ circle(data: CircleData, sketch_surface_or_group: SketchOrSurface, tag?: TagDecl ```js exampleSketch = startSketchOn("-XZ") - |> circle({ center: [0, 0], radius: 10 }, %) + |> circle({ center = [0, 0], radius = 10 }, %) example = extrude(5, exampleSketch) ``` @@ -44,7 +44,7 @@ exampleSketch = startSketchOn("XZ") |> line([0, 30], %) |> line([-30, 0], %) |> close(%) - |> hole(circle({ center: [0, 15], radius: 5 }, %), %) + |> hole(circle({ center = [0, 15], radius = 5 }, %), %) example = extrude(5, exampleSketch) ``` diff --git a/docs/kcl/circleThreePoint.md b/docs/kcl/circleThreePoint.md new file mode 100644 index 000000000..ee573a9c0 --- /dev/null +++ b/docs/kcl/circleThreePoint.md @@ -0,0 +1,42 @@ +--- +title: "circleThreePoint" +excerpt: "Construct a circle derived from 3 points." +layout: manual +--- + +Construct a circle derived from 3 points. + + + +```js +circleThreePoint(p1: [number], p2: [number], p3: [number], sketch_surface_or_group: SketchOrSurface, tag?: TagDeclarator) -> Sketch +``` + + +### Arguments + +| Name | Type | Description | Required | +|----------|------|-------------|----------| +| `p1` | `[number]` | 1st point to derive the circle. | Yes | +| `p2` | `[number]` | 2nd point to derive the circle. | Yes | +| `p3` | `[number]` | 3rd point to derive the circle. | Yes | +| `sketch_surface_or_group` | [`SketchOrSurface`](/docs/kcl/types/SketchOrSurface) | Plane or surface to sketch on. | Yes | +| `tag` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | Identifier for the circle to reference elsewhere. | No | + +### Returns + +[`Sketch`](/docs/kcl/types/Sketch) - A sketch is a collection of paths. + + +### Examples + +```js +exampleSketch = startSketchOn("XY") + |> circleThreePoint(p1 = [10, 10], p2 = [20, 8], p3 = [15, 5]) + +example = extrude(5, exampleSketch) +``` + +![Rendered example of circleThreePoint 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAD45ElEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq/7LXHPNNQ/mmc6cOfNggGuuuebBAGfOnHkQD3DNNdc8GOCaa655MM/lzJkzD+YBrrnmmgfzH+y+++67lefj7Nmzt/IA9913360803333XcrwNmzZ5/BM91333238kxnz569FeC+++67lauuuuqqq6666qqr/iugBz3oQVx11VVXXXXVVVdd9a9zzTXXPBjgzJkzDwa45pprHnzmzJkHAVxzzTUPvuaaax7MM505c+bB11xzzYO56jncd999t/JMZ8+evfW+++67lWe67777bj179uwz7rvvvlsBzp49e+t99913K1ddddVVV1111VVX/WuhBz3oQVx11VVXXXXVVVdddcU111zzYIAzZ848+JprrnnwmTNnHgTw4i/+4q8NcObMmQdfc801D+bf6MKFC9zvwoULAFy4cAGACxcu8EAXL14E4MKFCzy3Cxcu8EAXLlzgP9rJkyd5fk6ePMn9Tp48yQOdOHECgJMnT3K/kydPcr+TJ09y8uRJ/q3uu+++WwHOnj17K8B9991363333Xfr2bNnn3HffffdCnD27Nlb77vvvlu56qqrrrrqqquuugoAPehBD+Kqq6666qqrrrrq/4NrrrnmwQBnzpx58Iu92Iu9FsA111zz4GuuuebBZ86cefA111zzYP4VLly4wIULFwC4cOECFy5cAODixYsAXLhwAYALFy5w4cIFrnpOJ0+e5H4nT57k5MmT3O9hD3sYACdPngTg5MmTnDx5khfVfffddyvA2bNnb73vvvtuBfiHf/iH37nvvvtuBfiHf/iH3+aqq6666qqrrrrq/wf0oAc9iKuuuuqqq6666qr/K6655poHnzlz5sHXXHPNg8+cOfOga6655sHXXHPNg1/sxV7stXkRXLhwAYALFy5w8eJFLly4AMBTnvIUAC5evMiFCxf4j2abq/5lJ0+eBODkyZOcPHkSgBMnTnDy5ElOnjwJwMMf/nBeFPfdd9+tZ8+evfW+++67FeAf/uEffue+++679ezZs7fed999t3LVVVddddVVV131fwN60IMexFVXXXXVVVddddX/Jtdcc82DAV7sxV7stc+cOfOga6655sHXXHPNg1/sxV7stfkXXLhwgQsXLnDx4kUuXLjAhQsXuHDhAhcvXuTChQv8f2Cb/+tOnjwJwMmTJzl58iQAD3vYwzh58iQAD3/4w3lh7rvvvlsB/uEf/uG377vvvlvPnj37jPvuu+/Wf/iHf/htrrrqqquuuuqqq/53QQ960IO46qqrrrrqqquu+p/ommuuefCZM2ce/GIv9mKvBfDiL/7ir/1iL/Zir80LceHCBQCe+tSncuHCBS5cuMCFCxd46lOfylX/+Wzzv8XJkyc5efIkJ0+eBOBhD3sYJ0+e5OEPfzgvzH333Xfr2bNnb73vvvtu/Yd/+Iffue+++279h3/4h9/mqquuuuqqq6666n8m9KAHPYirrrrqqquuuuqq/27XXHPNg1/sxV7stc+cOfOgF3/xF3/tF3uxF3vt++6779ZrrrnmwTyXCxcuAPDUpz6VCxcucOHCBS5cuMBTn/pUrvq/xTb/HU6ePAnAwx/+cAAe9rCHcfLkSR7+8Ifzgtx33323nj179tb77rvv1n/4h3/4nfvuu+/Wf/iHf/htrrrqqquuuuqqq/57oQc96EFcddVVV1111VVX/Ve65pprHvzar/3a7wXw4i/+4q/9Yi/2Yq/N83HhwgUAnvrUp3LhwgWe8pSn8NSnPpWrrvrXss1/lJMnT3Ly5ElOnjzJwx72ME6ePMnDH/5wnp/77rvvVoB/+Id/+O1/+Id/+J377rvv1n/4h3/4ba666qqrrrrqqqv+66AHPehBXHXVVVddddVVV/1nueaaax782q/92u8F8OIv/uKv/WIv9mKvzfNx4cIFnvrUp3LhwgWe+tSn8tSnPpUXlW2uuuo/m21emJMnT/Lwhz8cgIc97GGcPHmShz/84Ty3++6771aAf/iHf/jtf/iHf/id++6779Z/+Id/+G2uuuqqq6666qqr/nOgBz3oQVx11VVXXXXVVVf9R7jmmmsefObMmQe/2Iu92Gu9+Iu/+Gu/2Iu92GvzfFy4cIGnPvWpXLhwgac+9ak89alP5f8y21z1/9PJkyc5ceIEJ0+e5GEPexgnT57k4Q9/OM/tvvvuu/Xs2bO33nfffbf+wz/8w+/81m/91ndz1VVXXXXVVVdd9R8DPehBD+Kqq6666qqrrrrq3+Kaa6558Gu/9mu/F8DrvM7rvPc111zzYJ7LhQsXeOpTn8qFCxd46lOfylOf+lSu+s9nm6v+Zzp58iQnTpzg5MmTPPzhD+fEiRM8/OEP57ndd999t/7DP/zDb//DP/zD79x33323/sM//MNvc9VVV1111VVXXfWvhx70oAdx1VVXXXXVVVdd9aK45pprHvzar/3a7wXwTu/0Tp/Nc7lw4QIAf/Znf8ZTn/pUnvrUp3LV/022ueo/zsmTJzlx4gQPf/jDedjDHsbDH/5wntt999136z/8wz/89j/8wz/8zn333XfrP/zDP/w2V1111VVXXXXVVf8y9KAHPYirrrrqqquuuuqq5+eaa6558Gu/9mu/F8A7vdM7fTbP5cKFC1y8eJGnPOUpPPWpT+WpT30qV131b2Wbq644efIkAA972MN4+MMfziu8wivw3O67775b/+Ef/uG3/+Ef/uF3fuu3fuu7ueqqq6666qqrrnr+0IMe9CCuuuqqq6666qqr7vdiL/Zir/1iL/Zir/U6r/M6733NNdc8mAe4cOECT33qU7lw4QJ//ud/zoULF7jqqv+JbPN/zcmTJ3nYwx7Gwx/+cF7hFV6B53bffffd+lu/9Vvf/Q//8A+/8w//8A+/zVVXXXXVVVddddUV6EEPehBXXXXVVVddddX/X9dcc82DX/u1X/u9XvzFX/y1X+zFXuy1eYALFy5w8eJFnvrUp/Jnf/ZnXLx4kX8P21x11f8Wtvmf7OTJkzzsYQ/j4Q9/OK/wCq/AA9133323nj179tbf+q3f+p777rvv1n/4h3/4ba666qqrrrrqqv+v0IMe9CCuuuqqq6666qr/X6655poHv/Zrv/Z7vc7rvM57X3PNNQ/mAS5cuMCf//mf89SnPpWnPvWpXPWC2eaqq14Q2/xXOXnyJCdOnODhD384D3vYw3j4wx/OA9133323/tZv/dZ3/8M//MPv/MM//MNvc9VVV1111VVX/X+CHvSgB3HVVVddddVVV/3fd8011zz4tV/7td/rnd7pnT6bB7hw4QJPfepTuXjxIr/6q7/KVf972Oaq/5ts8+9x8uRJHvawh/Hwhz+cV3iFV+CB7rvvvlv/4R/+4bd/67d+63v+4R/+4be56qqrrrrqqqv+r0MPetCDuOqqq6666qqr/m+65pprHvzar/3a7/VO7/ROn80DXLhwgT//8z/nqU99Kk996lO56qoXxjZX/c9nm+fn5MmTnDhxgoc//OG8wiu8AidPnuR+9913363/8A//8Nu/9Vu/9T3/8A//8NtcddVVV1111VX/F6EHPehBXHXVVVddddVV/3dcc801D37t137t93qnd3qnz+YBLly4wJ//+Z/zZ3/2Z1y8eJGrrvrvZJur/nucPHmSl3/5l+fhD384D3vYw7jffffdd+s//MM//PZv/dZvfc8//MM//DZXXXXVVVddddX/FehBD3oQV1111VVXXXXV/27XXHPNg1/7tV/7vd7pnd7ps3mACxcu8Od//uf82Z/9GRcvXuSqq/6vss1V/3onT57k5V/+5Xn4wx/Owx72MO5333333fpbv/Vb3/0P//APv/MP//APv81VV1111VVXXfW/GXrQgx7EVVddddVVV131v88111zz4Nd+7dd+r9d5ndd572uuuebBPNOFCxf48z//c/7sz/6MixcvctVVV71obPP/2cmTJ3n5l395XuEVXoGTJ09yv/vuu+/W3/qt3/ruH/3RH/0crrrqqquuuuqq/43Qgx70IK666qqrrrrqqv89rrnmmge/9mu/9nu90zu902fzTBcvXuTP/uzPeNrTnsZTn/pU/r+wzVVX/U9hm/8rTp48yRu+4RvyCq/wCtzvvvvuu/Uf/uEffvu3fuu3vucf/uEffpurrrrqqquuuup/C/SgBz2Iq6666qqrrrrqf7Zrrrnmwa/92q/9Xq/zOq/z3tdcc82DeaaLFy/yZ3/2Z/zar/0aV/3vYJurrnputvmf6OTJkzzsYQ/jFV7hFXjYwx7G/e67775bf+u3fuu7f/RHf/RzuOqqq6666qqr/qdDD3rQg7jqqquuuuqqq/5nuuaaax782q/92u/1Tu/0Tp/NM128eJE/+7M/48///M+5ePEiV131L7HNVf832ea/ysmTJ3n5l395XuEVXoGTJ08CcN999936D//wD7/9W7/1W9/zD//wD7/NVVddddVVV131PxF60IMexFVXXXXVVVdd9T/LNddc8+B3fMd3/KzXeZ3XeW+e6eLFi/zqr/4qf/7nf85VV/1PYpur/vewzb/HyZMnedjDHsYrvMIr8LCHPYz7/cM//MNv/8iP/Mjn/MM//MNvc9VVV1111VVX/U+CHvSgB3HVVVddddVVV/3P8I7v+I6f9Tqv8zrvfc011zyYZ/rVX/1V/vzP/5yLFy9y1VX/X9jmqv85bPP8nDx5kpd/+Zfnjd7ojbjffffdd+uP/uiPfs5v/dZvfTdXXXXVVVddddX/BOhBD3oQV1111VVXXXXVf693fMd3/KzXeZ3Xee9rrrnmwQAXL17kz/7sz/i1X/s1rrrqqn8f21z1n+vEiRO8wiu8Ai//8i/PyZMnAbjvvvtu/a3f+q3v/tEf/dHP4aqrrrrqqquu+u+EHvSgB3HVVVddddVVV/33eMd3fMfPeqd3eqfP5pkuXrzIn//5n/Nrv/Zr/G9lm6uu+r/ENle9aE6cOMHDHvYw3vAN35CTJ08CcN999936oz/6o5/zW7/1W9/NVVddddVVV1313wE96EEP4qqrrrrqqquu+q/1ju/4jp/1Tu/0Tp/NM128eJFf+7Vf48///M+56n8n21x11fNjm/+PXv7lX55XeIVX4GEPexgA9913362/9Vu/9d0/+qM/+jlcddVVV1111VX/ldCDHvQgrrrqqquuuuqq/xov9mIv9trv9E7v9Fkv9mIv9toAFy9e5Nd+7df48z//c6666t/LNlf932Gb/wte/uVfnld4hVfgYQ97GAD33XffrT/6oz/6Ob/1W7/13Vx11VVXXXXVVf8V0IMe9CCuuuqqq6666qr/XNdcc82DP/zDP/y7XuzFXuy1AS5evMif//mf82u/9mtcddX/Nra56n8u2/xP9PIv//K84Ru+ISdPnuTChQtM03Tr13/917/PP/zDP/w2V1111VVXXXXVfyb0oAc9iKuuuuqqq6666j/HNddc8+DXfu3Xfq93eqd3+myAixcv8ud//uf82q/9GlddddWz2eaq/z62+a9w4sQJXuEVXoGXf/mX5+TJkwD8yI/8yGf/9m//9vfcd999t3LVVVddddVVV/1nQA960IO46qqrrrrqqqv+473jO77jZ73TO73TZ/NMv/Zrv8av/dqvcdVVV/3nss1V/7ls8+9x4sQJXuEVXoE3fMM3BOC+++679bd+67e++0d/9Ec/h6uuuuqqq6666j8aetCDHsRVV1111VVXXfUf55prrnnwh3/4h3/Xi73Yi702wFOf+lR+9Ed/lIsXL3LVVVf972Cbq/7j2Ob5OXHiBG/4hm/IK7zCKwBw33333fpZn/VZr3PffffdylVXXXXVVVdd9R8FPehBD+Kqq6666qqrrvqP8Tqv8zrv/eEf/uHfBXDx4kV+9Ed/lKc97Wlc9b+Xba666l/LNle96F7+5V+eN3zDN+TEiRPcd999t/7Wb/3Wd//oj/7o53DVVVddddVVV/1HQA960IO46qqrrrrqqqv+fa655poHf/iHf/h3vdiLvdhrA/zar/0av/7rv85VV/1nsM1V/zfZ5v+rEydO8PIv//K84Ru+IQD33XffrZ/1WZ/1Ovfdd9+tXHXVVVddddVV/x7o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TGyTmdim1kqtlc3NTbquo+97tra2eH7uu+++W//hH/7ht++7775b/+Ef/uF3/uEf/uG3ueqqq6666qqrrvq/CT3oQQ/iqquuuuqqq6666v+La6655sFnzpx58DXXXPOgF3uxF3vta6655sEv9mIv9to8H+M4Ionlcsk0TbTWaK0xjiOSiAgigohAEhFBRBARRAQRgSQigoggIogIIoKIQBIRQUQgiYggIpBERCAJSUQEkpCEJCQhCUlIQhIAkgCQxP0k8cLYBsA2ALYBsI1tbGMb29jGNraxjW0yE9tkJrbJTDIT22QmmUlmkpnYJjPJTDKTzCQzyUwyk8zENplJZpKZ2CYzyUxsExFkJvP5nFortVa6rmNjY4MX5L777rv1H/7hH377vvvuu/Uf/uEffucf/uEffpurrrrqqquuuuqq/z/Qgx70IK666qqrrrrqqqv+P7vmmmseDPBiL/Zir/ViL/Zir33NNdc8+MyZMw++5pprHswL0FqjtUZrjczENpnJ/SKCiCAiiAgkERFEBBFBRBARSCIiiAgkERFEBJKQREQgCUlIQhKSkIQkJCEJAElI4n6S+JfY5n62AbCNbQBsYxvb2MY2mYltbJOZ2CYzsU1mYpvMJDPJTDIT22QmmUlmkplkJplJZmKbzCQzkYQkJFFKISIopTCfz3lh7rvvvlvPnj1769///d//NsA//MM//M4//MM//DZXXXXVVVddddVV/7+hBz3oQVx11VVXXXXVVVdd9byuueaaB585c+ZB11xzzUNe7MVe7LUArrnmmge/2Iu92GvzL8hMAGwjCdtEBAARQUQQEUQEkogIIgJJRASSiAgkIQlJRASSkIQkJAEgCUkASAJAEs9NEgC2eSDbANgGwDYAtrGNbWxjG9vYJjOxjW0yE9tkJpmJbTKTzCQzsU1mkplkJra5n20kIYmIICL4l9x33323nj179ta///u//22Af/iHf/jtf/iHf/gdrrrqqquuuuqqq656ftCDHvQgrrrqqquuuuqqq67617nmmmsefObMmQdfc801D36xF3ux1wK45pprHnzmzJkHX3PNNQ/mRSCJ+0kiIpBERFBrBUAStVYAaq1IotaKJCQhCQBJSAJAEg8kiefHNvezDYBtAGxjG9vYxja2sc00TdjGNq01MpPMpLWGbWxjm8wEwDb/Gvfdd9+tAP/wD//w2/fdd9+tAP/wD//wO//wD//w21x11VVXXXXVVVdd9a+FHvSgB3HVVVddddVVV1111X+ca6655sEAZ86cedA111zzEIAXe7EXey2Aa6655sFnzpx58DXXXPNg/gOUUpDE/UopSOJfyzYPNE0TD9Ra49/rvvvuuxXg7Nmzt95333233nfffbcCnD179hn33Xff08+ePfuM++6771auuuqqq6666qqrrvqPhB70oAdx1VVXXXXVVVddddV/vWuuuebBALZ9zTXXPOSaa655MMCZM2cedM011zwY4Jprrnkwz3TmzJkHA1xzzTUP5r/RfffddyvPdPbs2VsB7rvvvlvvu+++W3mms2fPPuO+++679b777nu6JN133323ctVVV1111VVXXXXVfwf0oAc9iKuuuuqqq6666qqr/nc6c+bMgySJZzpz5syDAQPiORkQz8mAeE4GdPbs2Vt5pvvuu+9Wrrrqqquuuuqqq6763wo96EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/Vfwj+jyv8KfCwZQAAAAASUVORK5CYII=) + + diff --git a/docs/kcl/cos.md b/docs/kcl/cos.md index 5f7fb806b..c2bf5adc8 100644 --- a/docs/kcl/cos.md +++ b/docs/kcl/cos.md @@ -34,8 +34,8 @@ cos(num: number) -> number exampleSketch = startSketchOn("XZ") |> startProfileAt([0, 0], %) |> angledLine({ - angle: 30, - length: 3 / cos(toRadians(30)) + angle = 30, + length = 3 / cos(toRadians(30)) }, %) |> yLineTo(0, %) |> close(%) diff --git a/docs/kcl/e.md b/docs/kcl/e.md index 30f835010..75333bdaf 100644 --- a/docs/kcl/e.md +++ b/docs/kcl/e.md @@ -28,7 +28,7 @@ e() -> number ```js exampleSketch = startSketchOn("XZ") |> startProfileAt([0, 0], %) - |> angledLine({ angle: 30, length: 2 * e() ^ 2 }, %) + |> angledLine({ angle = 30, length = 2 * e() ^ 2 }, %) |> yLineTo(0, %) |> close(%) diff --git a/docs/kcl/extrude.md b/docs/kcl/extrude.md index 2c075e704..65a3e9dc0 100644 --- a/docs/kcl/extrude.md +++ b/docs/kcl/extrude.md @@ -32,16 +32,16 @@ example = startSketchOn('XZ') |> startProfileAt([0, 0], %) |> line([10, 0], %) |> arc({ - angleStart: 120, - angleEnd: 0, - radius: 5 + angleStart = 120, + angleEnd = 0, + radius = 5 }, %) |> line([5, 0], %) |> line([0, 10], %) |> bezierCurve({ - control1: [-10, 0], - control2: [2, 10], - to: [-5, 10] + control1 = [-10, 0], + control2 = [2, 10], + to = [-5, 10] }, %) |> line([-5, -2], %) |> close(%) @@ -54,16 +54,16 @@ example = startSketchOn('XZ') exampleSketch = startSketchOn('XZ') |> startProfileAt([-10, 0], %) |> arc({ - angleStart: 120, - angleEnd: -60, - radius: 5 + angleStart = 120, + angleEnd = -60, + radius = 5 }, %) |> line([10, 0], %) |> line([5, 0], %) |> bezierCurve({ - control1: [-3, 0], - control2: [2, 10], - to: [-5, 10] + control1 = [-3, 0], + control2 = [2, 10], + to = [-5, 10] }, %) |> line([-4, 10], %) |> line([-5, -2], %) diff --git a/docs/kcl/fillet.md b/docs/kcl/fillet.md index 53af83c94..09fc99dc8 100644 --- a/docs/kcl/fillet.md +++ b/docs/kcl/fillet.md @@ -43,8 +43,8 @@ mountingPlateSketch = startSketchOn("XY") mountingPlate = extrude(thickness, mountingPlateSketch) |> fillet({ - radius: filletRadius, - tags: [ + radius = filletRadius, + tags = [ getNextAdjacentEdge(edge1), getNextAdjacentEdge(edge2), getNextAdjacentEdge(edge3), @@ -70,9 +70,9 @@ mountingPlateSketch = startSketchOn("XY") mountingPlate = extrude(thickness, mountingPlateSketch) |> fillet({ - radius: filletRadius, - tolerance: 0.000001, - tags: [ + radius = filletRadius, + tolerance = 0.000001, + tags = [ getNextAdjacentEdge(edge1), getNextAdjacentEdge(edge2), getNextAdjacentEdge(edge3), diff --git a/docs/kcl/getNextAdjacentEdge.md b/docs/kcl/getNextAdjacentEdge.md index ef4ba0877..39adf5832 100644 --- a/docs/kcl/getNextAdjacentEdge.md +++ b/docs/kcl/getNextAdjacentEdge.md @@ -30,16 +30,16 @@ getNextAdjacentEdge(tag: TagIdentifier) -> Uuid exampleSketch = startSketchOn('XZ') |> startProfileAt([0, 0], %) |> line([10, 0], %) - |> angledLine({ angle: 60, length: 10 }, %) - |> angledLine({ angle: 120, length: 10 }, %) + |> angledLine({ angle = 60, length = 10 }, %) + |> angledLine({ angle = 120, length = 10 }, %) |> line([-10, 0], %) - |> angledLine({ angle: 240, length: 10 }, %, $referenceEdge) + |> angledLine({ angle = 240, length = 10 }, %, $referenceEdge) |> close(%) example = extrude(5, exampleSketch) |> fillet({ - radius: 3, - tags: [getNextAdjacentEdge(referenceEdge)] + radius = 3, + tags = [getNextAdjacentEdge(referenceEdge)] }, %) ``` diff --git a/docs/kcl/getOppositeEdge.md b/docs/kcl/getOppositeEdge.md index 4b292161b..7f947af13 100644 --- a/docs/kcl/getOppositeEdge.md +++ b/docs/kcl/getOppositeEdge.md @@ -30,16 +30,16 @@ getOppositeEdge(tag: TagIdentifier) -> Uuid exampleSketch = startSketchOn('XZ') |> startProfileAt([0, 0], %) |> line([10, 0], %) - |> angledLine({ angle: 60, length: 10 }, %) - |> angledLine({ angle: 120, length: 10 }, %) + |> angledLine({ angle = 60, length = 10 }, %) + |> angledLine({ angle = 120, length = 10 }, %) |> line([-10, 0], %) - |> angledLine({ angle: 240, length: 10 }, %, $referenceEdge) + |> angledLine({ angle = 240, length = 10 }, %, $referenceEdge) |> close(%) example = extrude(5, exampleSketch) |> fillet({ - radius: 3, - tags: [getOppositeEdge(referenceEdge)] + radius = 3, + tags = [getOppositeEdge(referenceEdge)] }, %) ``` diff --git a/docs/kcl/getPreviousAdjacentEdge.md b/docs/kcl/getPreviousAdjacentEdge.md index ef5914f80..e06c2f4da 100644 --- a/docs/kcl/getPreviousAdjacentEdge.md +++ b/docs/kcl/getPreviousAdjacentEdge.md @@ -30,16 +30,16 @@ getPreviousAdjacentEdge(tag: TagIdentifier) -> Uuid exampleSketch = startSketchOn('XZ') |> startProfileAt([0, 0], %) |> line([10, 0], %) - |> angledLine({ angle: 60, length: 10 }, %) - |> angledLine({ angle: 120, length: 10 }, %) + |> angledLine({ angle = 60, length = 10 }, %) + |> angledLine({ angle = 120, length = 10 }, %) |> line([-10, 0], %) - |> angledLine({ angle: 240, length: 10 }, %, $referenceEdge) + |> angledLine({ angle = 240, length = 10 }, %, $referenceEdge) |> close(%) example = extrude(5, exampleSketch) |> fillet({ - radius: 3, - tags: [getPreviousAdjacentEdge(referenceEdge)] + radius = 3, + tags = [getPreviousAdjacentEdge(referenceEdge)] }, %) ``` diff --git a/docs/kcl/helix.md b/docs/kcl/helix.md index a39c6472f..bc8584eb9 100644 --- a/docs/kcl/helix.md +++ b/docs/kcl/helix.md @@ -29,15 +29,15 @@ helix(data: HelixData, solid: Solid) -> Solid ```js part001 = startSketchOn('XY') - |> circle({ center: [5, 5], radius: 10 }, %) + |> circle({ center = [5, 5], radius = 10 }, %) |> extrude(10, %) |> helix({ - angleStart: 0, - ccw: true, - revolutions: 16 + angleStart = 0, + ccw = true, + revolutions = 16 }, %) ``` -![Rendered example of helix 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAHoYUlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrq3+yaa655MM905syZB/NM11xzzYN5pjNnzjyIB7jmmmsezPNxzTXXPJh/o/vuu+9WXoD77rvvVp7p7Nmzz+CZ7rvvvlt5gLNnz94KcN99993KVVddddVVV1111VX/V6AHPehBXHXVVVddddVVV/1/d8011zwY4MyZMw++5pprHnzmzJkH8UzXXHPNg6+55poHA5w5c+bBANdcc82D+T/uvvvuuxXg7NmztwLcd999twLcd999t549e/YZAPfdd9+tAGfPnr31vvvuu5Wrrrrqqquuuuqqq/6nQQ960IO46qqrrrrqqquu+r/ommuueTDAmTNnHnzNNdc8+MyZMw8CePEXf/HXBjhz5syDr7nmmgfzr3Tx4kXud+HCBQAuXrwIwIULF3igixcvcr+LFy/yQBcuXOCFuXjxIs/PiRMn+JecPHmS53bixAke6MSJEwCcPHmS+504cQKAEydOAHDy5En+Ne67775bAc6ePXvrfffddyvAfffdd+vZs2efcd99990KcPbs2Vvvu+++W7nqqquuuuqqq6666r8CetCDHsRVV1111VVXXXXV/zbXXHPNgwHOnDnz4Bd7sRd7LYBrrrnmwddcc82Dz5w58+BrrrnmwfwLLl68CMCFCxcAuHjxIhcuXADg4sWLXLx4EYALFy4AcPHiRf6/OnHiBAAnT54E4MSJEwCcOHGCkydPAnDixAlOnjzJiRMn+Jfcd999twL8wz/8w2/zTP/wD//wO/fdd9+tZ8+evfW+++67lauuuuqqq6666qqr/iOgBz3oQVx11VVXXXXVVVf9T3TNNdc8+MyZMw++5pprHnzmzJkHXXPNNQ++5pprHvxiL/Zir80LcfHiRQAuXLjAxYsXuXDhAgAXL17k4sWLXLhwgYsXL3LVf54TJ04AcPLkSU6cOAHAiRMnOHnyJCdOnADgYQ97GC/Mfffdd+vZs2dvve+++2697777bj179uwz7rvvvlv/4R/+4be56qqrrrrqqquuuupFhR70oAdx1VVXXXXVVVdd9d/lmmuueTDAi73Yi732mTNnHnTNNdc8+Jprrnnwi73Yi702L8DFixcBeOpTn8rFixcBeOpTnwrA0572NP63sc3/VydOnADgYQ97GAAPe9jDADhx4gQPe9jDeEH+4R/+4bcB7rvvvlv/4R/+4Xfuu+++W8+ePXvrfffddytXXXXVVVddddVVVz0QetCDHsRVV1111VVXXXXVf4VrrrnmwS/2Yi/22mfOnHnQi7/4i7/2i73Yi702L8DFixe5cOECT3va0wB46lOfCsDTnvY0rvr3s83/BidOnADgYQ97GAAPe9jDOHHiBA972MN4fu67775bAf7hH/7ht//hH/7hd+67775bz549e+t99913K1ddddVVV1111VX/P6EHPehBXHXVVVddddVVV/1Huuaaax585syZB7/Yi73Ya11zzTUPfrEXe7HXvuaaax7Mc7l48SIAT33qU7l48SIXL17kwoULPO1pT+Oq/31s81/pxIkTnDx5khMnTvCwhz2MEydOcPLkSU6cOMFzu++++249e/bsrffdd9+t//AP//A79913363/8A//8NtcddVVV1111VVX/d+HHvSgB3HVVVddddVVV131b3XNNdc8+MyZMw9+sRd7sdd68Rd/8dd+sRd7sdfm+bh48SJPfepTuXjxIk996lN52tOexlVXvSC2+bc6ceIEAA972MN42MMexokTJ3jYwx7Gc7vvvvtuPXv27K333Xffrf/wD//wO/fdd9+t//AP//DbXHXVVVddddVVV/3fgh70oAdx1VVXXXXVVVdd9aK45pprHnzmzJkHv9iLvdhrvfiLv/hrv9iLvdhr81wuXrzIxYsXeepTnwrA0572NJ72tKfx/41trvrvZZsHOnHiBA972MMAeNjDHsbDHvYwTpw4wQPdd999t549e/bW++6779bf+q3f+p5/+Id/+G2uuuqqq6666qqr/ndDD3rQg7jqqquuuuqqq656fq655poHv/Zrv/Z7Abz4i7/4a7/Yi73Ya/MA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SOJ+kgCQBIAkACRxP0kASAJAEgCSAJAEgCQkASAJAElIAkASkgCQhCQAJCEJSQBIQhKSkASAJCQhCUlIAkASkpCEJCQxn8+59tprmc/nHDt2jNlsxotivV6zv7/Per1mGAb29/dZr9e8ILa5n20AbANgGwDb2AbANrYBsA2AbWxjGwDb2AbANrYBsI1tFosFN9xwAw9/+MN5oOVyye23386TnvQkAGwDYBsA2wDYBsA297MNgG3uZ5szZ87w8i//8mxubgJw66238qd/+qcA2OZ+trmfbQBs8xIv8RK8xEu8BACHh4c89alP5W//9m+xDYBtAK699lre6I3eCIC//uu/5i//8i+xjW1s84hHPILXfu3X5h/+4R9++zM/8zNfh6uuuuqqq6666v8a9KAHPYirrrrqqquuuupF82Iv9mKv9bmf+7m/zTOdP3+er/mar2F3dxdJnDp1ind913fl4Q9/OBcuXOALvuALkIQkACQhCYCXf/mX5/Vf//U5ceIEFy9e5C//8i/5zd/8TQAkASCJ+0kC4MSJE7zO67wOL/3SL839dnd3+eu//mv+5m/+hkuXLnE/SdxPEveTxP0k8UCSOHbsGLfccgsv+ZIvyS233ML9Ll26xO23385tt93GpUuXuP3223luknggSTw3STw3STw3STw/knhukgCQxM7ODpIA2N7eZmdnBwBJbG9vs7Ozw/7+Pvv7+9x1110AHBwcACCJ+0kCQBL3kwSAJO4nCQBJAEjifpIAkASAJO4nCQBJAEgCQBIAkgCQBIAkJAEgCQBJSAJAEpIAkIQkJAEgCUlIAkASkpCEJCQBIAlJSEISkpjP5ywWC44fP861117LfD7nBVmv1wCs12v29/cB2N/fZ39/HwBJ/Ets80C2AbANgG0AbANgG9sA2MY2ALaxDYBtbGMbANvYBmA+n3P99dfzsIc9jAdaLpfccccd3HHHHSyXS2xjGwDbANjmfrYBsA2Abe5nGwDbbGxs8PIv//KcOXMGgMPDQ/7sz/6Ms2fPYpv72eZ+trnfmTNneOVXfmU2NzcB+Lu/+zv+9m//FgDbANgG4JprruGN3uiNAHjKU57C7/3e72EbANtcd911vNmbvRkAn/mZn/k6//AP//DbXHXVVVddddVV/9egBz3oQVx11VVXXXXVVS+6z/3cz/2tF3uxF3ttnunChQt81md9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trENgG1sA2AbANsA2AbANgC2AZjP57zkS74kJ0+e5IF+67d+67u//uu//n246qqrrrrqqquu+o+HHvSgB3HVVVddddVVV/3Pd8011zz4tV/7td/rnd7pnT4bYHd3l6c//ek8/elP52Ve5mV4yEMeAsDu7i633norT3/60/mbv/kb7ieJ+0nifpJ4IEnc7/jx47zma74mL/mSL8n9Ll26xDOe8Qz+9m//lttvv53nJokHksRzk8Rzk8TzI4nnRxIAOzs7HDt2jJ2dHW6++WZ2dnY4duwYOzs7PD97e3vceeedPP7xj+euu+4CQBIAkgCQBIAkACQBIAkASQBIAkASAJIAkASAJAAkASAJAEkASAJAEpIAkASAJCQBIAlJSAJAEpKQhCQAJCEJSUhCEpKQhCQkIQlJSEISEYEkJCEJSUQEkpBERCAJSUgiIpjNZsxmM7a2trjuuut4UUzTBMD+/j4Aq9WK1WqFJF4Y29zPNgC2sQ2AbWxjG9vYxja2sQ2AbWxjG9vYxja2sU3f95w6dYrTp08zm82433q95t577+UZz3gGALaxjW0AbGMbANsA2AbANra5n20WiwU33HADD3/4w3mg++6779av//qvf59/+Id/+G2uuuqqq6666qqr/nOgBz3oQVx11VVXXXXVVf97XHPNNQ/+8A//8O96sRd7sdcG2N3d5Sd/8ifZ3d3ldV7ndXiZl3kZ7re7u8tf//Vf89d//ddcunSJ+0nifpJ4IEk8kCSOHTvGgx70IF7yJV+SBz3oQVy6dIljx44BcOnSJW677Tae8YxncOnSJW6//XaemySemySemySemySeH0k8P5IAkMSxY8cAkMTOzg47OzsASGJ7extJ3HnnnUjizjvvRBIAkgCQBIAkACQBIAkASQBIAkASAJIAkASAJAAkASAJAEkASEISAJKQBIAkJAEgCUkASEISkpAEgCQkIQlJSEISkpCEJCQhCUlEBJKQhCQiAklIQhIRgSQkMZ/POX36NNvb22xvb/PcxnHkgcZxZLlcMk0T+/v7SEISkgCQxP0k8fzY5n62AbANgG1sA2Ab29jGNraxjW1sYxvb2MY2tum6jpMnT7K9vc329jb3W6/X3Hfffdx3332s12tsYxvb2AbANrYBsI1tAGxjGwDbAMznc2644QZuuOEGFosFD3Tffffd+lu/9Vvf/aM/+qOf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sY1tbGMb29jGNraxjW1sYxvb2CYzsY1tbGObvu+54YYbOHPmDPdbr9dcunSJ2WzGsWPHuN99991364/+6I9+zm/91m99N1ddddVVV1111VX/M6EHPehBXHXVVVddddVV/z9cc801D36xF3ux136d13md93qxF3ux1wbY3d3lGc94Bn/913/NbbfdBsDx48d50IMexEu91EvxoAc9iPtdunSJ3/3d3+Vv//ZvAZDEA0niuUniuUniuUniuUniuR07doybb76Zm2++mWPHjnHzzTfzguzt7QGwt7cHwOMf/3ge97jHIQkASUgCQBIAkgCQBIAkACQBIAkASQBIAkASAJIAkASAJCQBIAkASQBIQhIAkgCQhCQkASAJSQBIQhKSkIQkACQhCUlIQhKSkIQkIgJJSEISkogIJCEJSUQEkogIJCGJiEASEYEkIgJJSCIikEREIIm+7wGICLquY7FYMJ/Pmc/nvCCtNYZhYJomhmFgGAaem20AbANgGwDb2MY2trGNbWxjG9vYxja2sY1tMhPb2MY2trFN13WcPHmSG264gednvV4zm82434/8yI989m/91m9999mzZ5/BVVddddVVV1111f9s6EEPehBXXXXVVVddddX/P9dcc82D3/Ed3/GzXud1Xue9eabd3V3+5m/+ht/93d8FQBLHjx/nJV/yJXnN13xN7nfp0iWe8YxncNttt7G7u8ttt93G/STxQJJ4bpJ4bpJ4fiTx/EgCYGdnB4Cbb76Zm2++mWPHjnHzzTfzguzt7XHnnXfyuMc9jrvuugsASQBIQhIAkgCQBIAkACQBIAkASQBIAkASAJIAkIQkACQBIAkASUgCQBKSAJCEJAAkIQlJAEhCEpKQhCQAJCEJSUhCEpKICCQhCUlIQhIRgSQkERFIQhIRgSQiAklEBJKICCQREfR9z4kTJ9jc3GRjY4N/yTRNABwdHSGJ9XrNOI7cTxIviG0AbANgG9sA2MY2trGNbWxjG9vYxja2yUxsYxvb2KbrOo4fP87Jkyfp+577rddrhmFgvV5z+vRp7nfffffd+lu/9Vvf/aM/+qOfw1VXXXXVVVddddX/HuhBD3oQV1111VVXXXXV/1/XXHPNg1/7tV/7vV7ndV7nva+55poHA+zu7vKMZzyDZzzjGfzt3/4tAMePH+eWW27hpV7qpTh+/DjHjh3jfpcuXWJ3d5fbbruN2267jdtuu40HksRzk8Rzk8TzI4nnRxLPTRIAktjZ2UESx44dA+DYsWMA7OzssLOzw97eHgB33XUXe3t7HBwcACAJAElIAkASAJIAkASAJAAkASAJAEkASEISAJIAkASAJCQBIAlJAEhCEgCSkIQkACQhCUlIQhKSkASAJCQREUhCEpKQhCQkERFIQhIRgSQkERFIIiKQREQgifl8zsmTJ9ne3mZzc5PnZxxHJAEwTROr1YrWGq01hmFAEpIAkIQk7ieJ58c297MNgG1sYxsA29jGNraxjW1sY5vMxDa2sY1tNjY2OHbsGCdOnOB+wzCwv78PwKlTp3ig3/qt3/ruf/iHf/jt3/qt3/oerrrqqquuuuqqq/73QQ960IO46qqrrrrqqquuOnPmzINe/MVf/HVe7MVe7LVe53Ve5715pt3dXZ7xjGfwt3/7tzzjGc9AEseOHeNBD3oQD3rQg3jJl3xJnp9Lly5x22238YxnPIO9vT1uu+02HkgSz48knpsknh9JPDdJAEgCQBIAkpAEgCQAJAEgCQBJAEgCQBIAkpAEgCQAJAEgCQBJAEgCQBIAkpAEgCQAJCEJAEkASEISAJKQBIAkJCEJAElIQhKSkIQkJCEJSUhCEpKQhCQkIYmIQBKSiAgkIYmIQBIRgSQkERHccMMNjOOIJMZxRBKSmKaJiGCaJiICSUhCEhGBJCQhCUlIAkASkgCQxP0k8UC2uZ9tAGwDYBvb2AbANraxjW1sk5nYptbKfD6n1srGxgYbGxs8t2EYAOj7nvvdd999t/7Wb/3Wd//oj/7o53DVVVddddVVV131vxt60IMexFVXXXXVVVddddUDXXPNNQ9+7dd+7fd68Rd/8dd+sRd7sdfmmXZ3d/m7v/s7nvGMZ/CMZzyD+x0/fpwHPehB3HLLLRw7dowHPehBPLdLly5x6dIlLl26xG233cZtt93G3t4ez00Sz48knh9JPDdJSAJAEgCSkASAJAAkASAJAEkASAJAEgCSAJCEJAAkASAJAEkASAJAEgCSkASAJAAkIQmAra0ttra2uPbaawG49tprATg6OuK+++7j8PCQc+fOIQlJAEhCEpKQhCQkIQlJSEISkpCEJCQREUhCEpKICCQREUhCEhGBJCICSUQEkogIJBERSCIikEREIImIQBKSkIQkJCEJSUhCEpKQBIAkHkgSALZ5INsA2AbANraxjW0AbFNKYWNjA9ssFgvm8zkvzDAM9H3P/e67775bf+u3fuu7f+u3fuu7z549+wyuuuqqq6666qqr/m9AD3rQg7jqqquuuuqqq656Qa655poHv/Zrv/Z7vc7rvM57X3PNNQ/mmS5dusTf/M3fcNttt3HbbbfxQMeOHUMSt9xyCw960IM4duwYt9xyC8/t0qVL3H777dx2221cunSJ2267DQBJPD+SeH4k8UCSkASAJAAkASAJSQBIAkASAJIAkASAJAAkASAJAElIAkASAJIAkASAJAAkIQkASQBIQhIAktjc3EQSktjc3EQSR0dHSOLw8BBJSEISAJKQhCQkIQlJSEISkpCEJCQhiYhAEpKQREQgCUlEBJKICCQREUgiIpBERCCJiEASEYEkIgJJRASSkEREIAlJSEISkpCEJCQBIAkASfxLbANgG4CIwDaLxQLbzGYzZrMZz880TYzjyDiO1Frpuo6u67jffffdd+tv/dZvffc//MM//M4//MM//DZXXXXVVVddddVV//egBz3oQVx11VVXXXXVVVe9KF7sxV7stV/ndV7nvV7ndV7nvXmAS5cu8YxnPIO//du/5bbbbgNAEg907Ngxjh07xoMe9CBuueUWbrnlFp6fS5cucfvtt3Pbbbdx6dIlbr/9du4niRdEEveTBIAkJAEgCQBJAEhCEgCSAJAEgCQAJAEgCQBJAEhCEgCSAJAEgCQAJAEgCUkASAJAEpIAkASAJCQBIAlJSAJAEpKQhCQAJCEJSUhCEpKQhCQkIQlJRASSkIQkIgJJSCIikEREIImIQBIRgSQiAklEBJKICCQREUgiIpBERCAJSUQEkpCEJCQhCUkASEISAJJ4YSKCiKDrOkopRAR93/P8TNPEer1mHEdWqxXjOLK1tcWJEyd4oPvuu+/W3/qt3/rus2fPPuO3fuu3vpurrrrqqquuuuqq/9vQgx70IK666qqrrrrqqqv+Na655poHnzlz5sGv8zqv814v9mIv9trXXHPNg3mmS5cu8YxnPIPbbruNv/u7v+OBJPFAx44d45ZbbuGWW27h2LFj3HLLLTy3S5cucenSJfb29rjtttv4h3/4B54fSdxPEgCSAJCEJAAkASAJAElIAkASAJIAkASAJAAkASAJAElIAkASAJIAkASAJCQBIAkASUgCQBIAkpAEgCQkIQkASUhCEpIAkIQkJCEJSUhCEpKQhCQiAklIQhIRgSQkERFIQhIRgSQiAklEBJKICCICSUQEkogIJBERSCIikEREIAlJSEISEYEkJAEgCUkASAJAEgARQSmFWitd19F1HS9Ia43lcolt1us16/WaiGBjY4PZbMZ8PueB7rvvvlt/67d+67v/4R/+4Xf+4R/+4be56qqrrrrqqquu+v8DPehBD+Kqq6666qqrrrrq3+PMmTMPep3XeZ33fvEXf/HXfrEXe7HX5gEuXbrE3/7t33Lbbbdx2223IYnnJgmAY8eOcezYMXZ2dnjQgx7Ezs4Ot9xyC8/t0qVL3H777dx+++1cunSJ22+/HQBJAEgCQBIAkpAEgCQAJAEgCQBJSAJAEgCSAJAEgCQAJAEgCUkASAJAEgCSAJCEJAAkASAJSQBIAkASkpAEgCQkASAJSUhCEpIAkIQkJCEJSUhCEpKICCQhCUlIIiKQhCQiAklEBJKICCQREUgiIpBERBARSCIikEREIImIQBIRgSQiAklIQhKSkIQkJCEJSUQEfd8TEXRdR9d1PD+ZCcBqtQJgGAaGYQAgIogIuq5jY2ODUgoPdN999936W7/1W9/9D//wD7/zD//wD7/NVVddddVVV1111f9P6EEPehBXXXXVVVddddVV/1GuueaaB7/Yi73Ya7/O67zOe73Yi73Ya/MAly5d4tKlS/zd3/0dly5d4rbbbgNAEs+PJI4dO8bNN9/MsWPHuPnmm7nlllt4bpcuXQLg9ttv5/bbb2dvb4+9vT329/cBkASAJCQBIAkASQBIAkASkgCQBIAkACQBIAkASUgCQBIAkgCQBIAkJAEgCQBJSAJAEpIAkIQkACQhCUkASEISkpCEJAAkIQlJSEISkogIJCEJSUgiIpCEJCICSUgiIpBERCCJiCAikEREIImIICKQREQgiYhAEhGBJCICSUgiIpCEJGqt9H1PKYW+7+m6jucnM8lMxnEEYBxHpmkCwDYRQURQa6Xve7qu44Huu+++W//hH/7ht++7775bf/RHf/RzuOqqq6666qqrrroKAD3oQQ/iqquuuuqqq6666j/DNddc8+AzZ848+MVe7MVe68Vf/MVf+8Ve7MVemwe4dOkSt912G5cuXeL222/ntttu47lJ4rkdO3aMW265hZtvvpljx45x880384Ls7e0BsLe3xx133MGdd97JHXfcgSQAJAEgCQBJAEhCEgCSAJAEgCQAJAEgCUkASAJAEgCSkASAJAAkIQkASUgCQBKSAJCEJCQBIAlJSEISkpCEJCQBIImIQBKSkIQkJBERSEISEYEkJBERSCIikEREIImIICKQREQgiYggIpBERCCJiKDveyQhia7rmM1mSGI2m9H3Pc9PZtJaY5ompmlimiYk8UCSiAhqrdRa6bqO53bffffd+lu/9Vvf/Q//8A+/8w//8A+/zVVXXXXVVVddddVVzw096EEP4qqrrrrqqquuuuq/wpkzZx704i/+4q/zYi/2Yq8F8Dqv8zrvzQNcunSJS5cusbe3x2233cbf/d3fIYnnRxL3O3bsGDs7Oxw7doybb76ZY8eOcfPNN/OC7O3t8fjHP57HP/7x7O/vAyAJAEkASEISAJIAkASAJAAkASAJSQBIAkASAJKQBIAkACQhCQBJSAJAEpIAkIQkJAEgCUlIQhKSkIQkJCEJSUhCEpKQhCQiAklIQhIRgSQiAklEBJKICCQREUgiIogIJBERRAR937O5uUnXdZw6dYoXRWuNcRzJTKZpYpomJAEgiftFBH3fAzCfz3l+7rvvvlt/67d+67v/4R/+4Xf+4R/+4be56qqrrrrqqquuuupfgh70oAdx1VVXXXXVVVdd9d/hmmuuefCLvdiLvdaLvdiLvfY111zz4Bd7sRd7bZ7LpUuXuP3227l06RK33XYbt99+O/eTxPMjCUkAHDt2DEns7OwgiZ2dHSSxvb3NsWPH2NvbY39/nzvvvBOAg4MDACQBIAlJAEgCQBIAkgCQhCQAJAEgCQBJSAJAEgCSkASAJCQBIAlJAEhCEpKQBIAkJCEJSUhCEpKQhCQkIQlJSEISEYEkJBERSEISEYEkIgJJRASSiAgiAklEBLPZjBMnTrC1tcXGxgbPbZom7jcMAwCZyTiOjOOIJCQhCUlIIiKYzWYA1FqptfLc7rvvvlvPnj1769///d//9j/8wz/8zj/8wz/8NlddddVVV1111VVX/WuhBz3oQVx11VVXXXXVVVf9T3DNNdc8+MyZMw9+sRd7sdd68Rd/8dd+sRd7sdfm+bh06RKXLl1ib2+P22+/nUuXLnH77bdzP0lIAkASAJKQBIAkACQhCQBJAEgCQBIAkpAEgCQAJAEgCQBJSAJAEgCSAJCEJAAkASAJSQBIQhIAkpCEJAAkIQlJAEhCEpKQhCQkIQlJSEISkpCEJCICSUgiIpCEJCICSUQEkogIJBERSCIiiAhOnjyJJKZpQhIRQWsNgMwkIpBERCCJiEASkogIaq2UUui6Dkl0XUetlefnvvvuu/W3fuu3vhvgH/7hH37nH/7hH36bq6666qqrrrrqqqv+vdCDHvQgrrrqqquuuuqqq/6nuuaaax78Yi/2Yq/9Yi/2Yq91zTXXPPjFXuzFXpvn49KlSwDcfvvtANxxxx3s7e1xxx13ACAJSQBIAkASAJKQBIAkACQBIAkASUgCQBIAkgCQhCQAJAEgCQBJSAJAEpIAkATAddddB8DW1habm5tce+21ABwdHXHfffdxdHTE0dERy+USAElIQhKSkIQkJCEJSUhCEhGBJCQhiYhAEpKICCQREUgiIogIJBERSCIiiAgkERFEBBGBJCKCiEASEUHXdXRdx2w2QxJ939P3PS/Ifffdd+s//MM//PZ999136z/8wz/8zj/8wz/8NlddddVVV1111VVX/WdAD3rQg7jqqquuuuqqq6763+Saa6558Iu92Iu99ou92Iu9FsA111zz4Bd7sRd7bV6Avb099vb22Nvb44477kASe3t77O/vs7e3hyQkASAJAEkASAJAEpIAkASAJAAkIQkASQBIAkASkgCQhCQAJAEgCUlsbm4iCUlsbW1xeHiIJI6OjpCEJAAkIQlJSEISkpCEJCQhiYhAEpKQREQgCUlEBJKICCQREUgiIpBERBARSCIiiAhmsxmS2NzcpO97ADY2Nqi1UmvlBbnvvvtuPXv27K1///d//9sA//AP//A7//AP//DbXHXVVVddddVVV131XwU96EEP4qqrrrrqqquuuup/u2uuuebBAC/2Yi/2Wi/2Yi/22gDXXHPNg1/sxV7stXkh9vb2ANjf32d/fx+AO++8E0ns7e1xcHDA/v4+kpAEgCQAJAEgCUkASAJAEgCSkASAJCQBIAkASUhCEgCSkASAJCQhCUlIAkASkpCEJCQhCUlIIiKQhCQkIYmIQBIRgSQkERFIYrFYEBHMZjN2dnaQxGw2o+97+r6n73v+Jffdd9+tZ8+evfXv//7vfxvgH/7hH37nH/7hH36bq6666qqrrrrqqqv+u6EHPehBXHXVVVddddVVV/1fdubMmQddc801D7nmmmse/GIv9mKvBXDNNdc8+MVe7MVemxfR/v4+APv7+0hif38fgP39fQ4ODpDEwcEB9zs8PARAEoeHhwBIQhIAkgCQhCQkASAJSUgCQBKSkIQkJAEgCUlIYnNzEwBJbG5uIglJLBYLFosFkpDEYrFgPp8DMJ/Pmc/nvKjuu+++WwHOnj1769///d//NsA//MM//A7AP/zDP/w2V1111VVXXXXVVVf9T4Ue9KAHcdVVV1111VVXXfX/1TXXXPNggDNnzjz4mmuuedCZM2ceDPDiL/7irw1w5syZB19zzTUP5j/IwcEB95PEi0oS99vY2OA/0n333XcrwNmzZ2+97777br3vvvtuBfiHf/iH3wH4h3/4h9/mqquuuuqqq6666qr/rdCDHvQgrrrqqquuuuqqq6564a655poHA5w5c+bBgK+55pqHAJw5c+ZB11xzzYMBrrnmmgfzAGfOnHkwwDXXXPNg/o3uu+++W6+55poH80Lcd999t/IAZ8+evRXgvvvuu/W+++67lWc6e/bsM+67775bAc6ePXvrfffddytXXXXVVVddddVVV/1fhx70oAdx1VVXXXXVVVddddV/jTNnzjxIkngA25YkHsC2JYkHsG1Juu+++27lqquuuuqqq6666qqrXjToQQ96EFddddVVV1111VVXXXXVVVddddVVV1111f9JVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r+IfAYz1ofCCp0+pAAAAAElFTkSuQmCC) +![Rendered example of helix 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAIOaklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666n+Na6655sE8lzNnzjyY/0Rnz569ledy33333cpVV1111VVXXXXVVf8bULnqqquuuuqqq6666j/NNddc82CAM2fOPBjgmmuueTDAmTNnHsQzXXPNNQ8GuOaaax7MM505c+bBANdcc82D+R/uvvvuu5UHOHv27K0A9913360803333XcrwNmzZ58BcN99993KM509e/bW++6771auuuqqq6666qqrrvrPgB70oAdx1VVXXXXVVVddddW/7JprrnkwwJkzZx58zTXXPPjMmTMPArjmmmseDHDNNdc8+MyZMw8GuOaaax7Mv9OFCxd4oIsXL/JAFy5c4Pm5ePEi/1YnTpzgBTl58iQPdOLECe538uRJ/iPcd999twKcPXv21vvuu+9WgPvuu+/Ws2fPPgPgvvvuuxXg7Nmzt9533323ctVVV1111VVXXXXVvwQ96EEP4qqrrrrqqquuuur/s2uuuebBAGfOnHnwNddc8+AzZ848CODFX/zFXxvgxV7sxV6bZ7rvvvtuveaaax7MC3HhwgUALl68CMCFCxcAuHjxIgAXLlwA4OLFi9zvwoULAFy8eJH/7U6cOMEDnTx5EoATJ04AcPLkSQBOnDgBwMmTJwE4ceIEJ0+e5F/jvvvuuxXg7Nmzt95333233nfffbeePXv2Gffdd9+tAP/wD//w21x11VVXXXXVVVf9/4Ye9KAHcdVVV1111VVXXfV/2TXXXPNggBd7sRd77TNnzjwI4MVf/MVf+8yZMw++5pprHsy/4MKFCwBcvHiRCxcucPHiRQAuXLjAxYsXAbhw4QIXL17kqv8YJ06cAODkyZOcOHECgJMnT3LixAkATp48yYkTJzh58iT/kvvuu+9WgLNnz95633333Xrffffdevbs2Wfcd999t549e/bW++6771auuuqqq6666qqr/u9CD3rQg7jqqquuuuqqq6763+6aa6558JkzZx78Yi/2Yq8F8OIv/uKvfebMmQdfc801D+aFuHjxIhcuXODixYtcuHABgIsXL3Lx4kUuXLjAxYsX+ZfY5qr/PidOnADg5MmTnDhxAoCHPexhAJw8eZITJ05w8uRJXpD77rvvVoCzZ8/eet999936D//wD79z33333QrwD//wD7/NVVddddVVV1111f9u6EEPehBXXXXVVVddddVV/xtcc801Dz5z5syDX+zFXuy1AF78xV/8tc+cOfPga6655sG8ABcvXuTChQtcvHiRCxcucPHiRS5evMiFCxe4ePEi/5fZ5qpnO3HiBCdPnuTEiRMAPOxhD+PkyZOcOHGCkydP8oLcd999t549e/bW++6779Z/+Id/+J377rvv1n/4h3/4ba666qqrrrrqqqv+d0APetCDuOqqq6666qqrrvqf5JprrnnwmTNnHvxiL/ZirwXw4i/+4q/9Yi/2Yq/NC3Dx4kUuXLjAU5/6VACe9rSnceHCBS5evMhV//ls87/diRMnADh58iQnTpzgYQ97GCdPngTgYQ97GM/Pfffdd+vZs2dvve+++279h3/4h9+57777bv2Hf/iH3+aqq6666qqrrrrqfxb0oAc9iKuuuuqqq6666qr/Ltdcc82DX+zFXuy1z5w586AXf/EXf+0Xe7EXe22ej4sXLwLw1Kc+lQsXLvC0pz2NCxcucPHiRa76v8c2/5OcOHGCkydPcuLECR72sIdx8uRJHvawh/H83HfffbeePXv21vvuu+/Wf/iHf/id++6779Z/+Id/+G2uuuqqq6666qqr/nugBz3oQVx11VVXXXXVVVf9V7jmmmse/Nqv/drvBfDiL/7ir/1iL/Zir81zuXjxIgB//ud/DsBTn/pUnva0p/EfyTZX/f9hm/8sJ06c4OTJk5w4cYKHPexhnDx5koc97GE8t/vuu+9WgH/4h3/47X/4h3/4nfvuu+/Wf/iHf/htrrrqqquuuuqqq/7zoQc96EFcddVVV1111VVX/Ue75pprHvxiL/Zir33mzJkHvfiLv/hrv9iLvdhr81wuXrzIhQsXeNrTnsbFixd56lOfysWLF7nqBbPNVf+1bPOvdeLECR72sIfxsIc9jJMnT3LixAlOnjzJA9133323AvzDP/zDb//DP/zD79x33323/sM//MNvc9VVV1111VVXXfUfCz3oQQ/iqquuuuqqq6666t/rmmuuefBrv/Zrv9eLv/iLv/aLvdiLvTbP5eLFi1y4cIGnPe1pPPWpT+VpT3saV/3PZ5ur/n1sA3DixAlOnjzJiRMneNjDHsYrvMIr8Nzuu+++W//hH/7ht++7775b/+Ef/uF3/uEf/uG3ueqqq6666qqrrvr3QQ960IO46qqrrrrqqquu+te45pprHnzmzJkHv9iLvdhrvfiLv/hrv9iLvdhr8wAXL14E4M///M956lOfytOe9jSuuuqBbHMVnDhxgoc97GE87GEP48SJEzzsYQ/jge67775bAf7hH/7ht//hH/7hd37rt37ru7nqqquuuuqqq67610EPetCDuOqqq6666qqrrnphrrnmmgefOXPmwS/2Yi/2Wi/+4i/+2i/2Yi/22jzAxYsXeepTn8rFixd56lOfytOe9jSuuuq/km3+Lzhx4gQAD3vYw3jYwx7GiRMneNjDHsYD3Xfffbf+wz/8w2//wz/8w+/81m/91ndz1VVXXXXVVVdd9cKhBz3oQVx11VVXXXXVVVc9t2uuuebBr/3ar/1eL/7iL/7aL/ZiL/baPMDFixf58z//cwB+/dd/nav+9Wxz1f8stvmf6MSJEzzsYQ/jYQ97GCdOnOBhD3sY97vvvvtuBfiHf/iH3/6t3/qt7/mHf/iH3+aqq6666qqrrrrqOaEHPehBXHXVVVddddVVV11zzTUPfu3Xfu33evEXf/HXfrEXe7HX5gEuXrzIn//5nwPw67/+61z1v59trvqPY5v/KidOnOBhD3sYD3vYwzhx4gQPe9jDuN99991369mzZ2/9rd/6re+57777bv2Hf/iH3+aqq6666qqrrvr/Dj3oQQ/iqquuuuqqq676/+maa6558Gu/9mu/1+u8zuu89zXXXPNgnunixYs87WlP48KFC/z6r/86V131r2Wbq/5ltvn3OnHiBA972MN42MMexsu//Mtzv/vuu+9WgH/4h3/47d/6rd/6nn/4h3/4ba666qqrrrrqqv+P0IMe9CCuuuqqq6666qr/H6655poHv/Zrv/Z7AbzTO73TZ/MAFy9e5M///M952tOextOe9jSuuup/EttcdYVtXpATJ04A8PIv//I87GEP42EPexj3u++++279h3/4h9/+h3/4h9/5rd/6re/mqquuuuqqq676/wI96EEP4qqrrrrqqquu+r/rmmuuefBrv/Zrv9c111zz4Nd5ndd5b57p4sWLXLx4kac97Wn8+q//Ole96Gxz1f8+tvn/5sSJEzzsYQ/joQ99KC//8i/P/e67775bz549e+tv/dZvfc9v/dZvfTdXXXXVVVddddX/ZehBD3oQV1111VVXXXXV/y3XXHPNg1/7tV/7vV78xV/8tV/sxV7stXmmixcv8hd/8Rc87WlP42lPexpX/d9hm6v+c9nmf7MTJ05w4sQJXv7lX56Xf/mX53733XffrWfPnr31t37rt77nt37rt76bq6666qqrrrrq/xr0oAc9iKuuuuqqq6666n+/a6655sGv/dqv/V4v/uIv/tov9mIv9to808WLF/mLv/gLnva0p/G0pz2Nq67697DNVf86tvmf6MSJE7z8y788L//yL8+JEycAuO+++249e/bsrb/1W7/1Pb/1W7/13Vx11VVXXXXVVf8XoAc96EFcddVVV1111VX/e11zzTUPfu3Xfu33eqd3eqfP5pkuXrzIX/zFX/C0pz2Npz3taVx11f9ktrnqednmv8qJEyd4+Zd/eV7+5V+eEydOAHDffffd+g//8A+//Vu/9Vvf8w//8A+/zVVXXXXVVVdd9b8VetCDHsRVV1111VVXXfW/yzXXXPPg137t136vd3qnd/psnunixYv8xV/8BU972tN42tOexr+HJP6ns81VVz2Qbf4/s82/14kTJzhx4gQv//Ivz8u//Mtzv/vuu+/W3/qt3/ruf/iHf/idf/iHf/htrrrqqquuuuqq/03Qgx70IK666qqrrrrqqv8d3vEd3/GzXvzFX/y1X+zFXuy1eaaLFy/yF3/xF/zGb/wGV/3vZ5ur/nvY5v8T27wwJ06c4GEPexgv93Ivx8Me9jDud9999936oz/6o5/zW7/1W9/NVVddddVVV131vwF60IMexFVXXXXVVVdd9T/XNddc8+DXfu3Xfq93eqd3+mye6eLFi/zFX/wFv/Ebv8FVV/172eaqfx/b/F924sQJXu7lXo6Xf/mX58SJEwDcd999t/7Wb/3Wd//2b//299x33323ctVVV1111VVX/U+FHvSgB3HVVVddddVVV/3Pc8011zz4Hd/xHT/rdV7ndd6bZ7p48SK/8Ru/wV/8xV9w1VX/09nmqhfONv+bnDhxgoc+9KE87GEP4+Ve7uUAuO+++279h3/4h9/+rd/6re/5h3/4h9/mqquuuuqqq676nwY96EEP4qqrrrrqqquu+p/jHd/xHT/rdV7ndd77mmuueTDAxYsX+Yu/+At+4zd+g6uu+v/KNlddYZv/CU6cOMHLvdzL8QZv8Abc77777rv1R3/0Rz/nt37rt76bq6666qqrrrrqfwr0oAc9iKuuuuqqq6666r/fO77jO37W67zO67z3Nddc82CAixcv8pd/+Zf8xm/8Blf9z2ebq/5ns83/R7b5z3TixAke+tCH8vIv//I89KEPBeC+++679bd+67e++0d/9Ec/h6uuuuqqq6666r8betCDHsRVV1111VVXXfXf5x3f8R0/653e6Z0+m2e6ePEiv/Ebv8Ff/uVfctVV/1q2ueo/nm3+P7DNv8fLvdzL8fIv//I89KEPBeC+++679bd+67e++0d/9Ec/h6uuuuqqq6666r8LetCDHsRVV1111VVXXfVf7x3f8R0/653e6Z0+m2d62tOexk/8xE9w8eJFrrrqfzLbXPWisc3/VbZ5QU6cOMEbvMEb8HIv93IA3Hfffbf+1m/91nf/6I/+6Odw1VVXXXXVVVf9V0MPetCDuOqqq6666qqr/uu84zu+42e90zu902fzTE972tP4iZ/4CS5evMhVV/1/ZJurns02/1ecOHGC13/91+flXu7lALjvvvtu/a3f+q3v/tEf/dHP4aqrrrrqqquu+q+CHvSgB3HVVVddddVVV/3ne7EXe7HX/vAP//Dvuuaaax4M8LSnPY2f+Imf4OLFi/xXk8T/Zba56v8X2/x/Zpv/yU6cOMHrv/7r83Iv93IA3Hfffbf+1m/91nf/6I/+6Odw1VVXXXXVVVf9Z0MPetCDuOqqq6666qqr/vNcc801D/7wD//w73qxF3ux1wa4ePEiP/ETP8HTn/50rrrq+bHNVf+1bPP/hW3+u5w4cYJ3eId34KEPfSgA9913361f//Vf/z7/8A//8NtcddVVV1111VX/WdCDHvQgrrrqqquuuuqq/3jXXHPNg1/7tV/7vd7pnd7pswEuXrzIb/7mb/KXf/mXXHXV/yS2uerfxjb/l9nmP8PLvdzL8fqv//qcOHGC++6779bf+q3f+u7f/u3f/p777rvvVq666qqrrrrqqv9o6EEPehBXXXXVVVddddV/rNd5ndd57w//8A//Lp7pN37jN/jN3/xNrrrq/wvbXPWC2eb/Gtv8a5w4cYKXe7mX4/Vf//UBuO+++279rd/6re/+0R/90c/hqquuuuqqq676j4Qe9KAHcdVVV1111VVX/cf53M/93N96sRd7sdcGePrTn85P/MRPcPHiRa666qp/G9v8f2eb/yts80AnTpzg5V7u5Xj91399AO67775bP+uzPut17rvvvlu56qqrrrrqqqv+I6AHPehBXHXVVVddddVV/37v+I7v+Fnv9E7v9NkAFy9e5Cd+4id4+tOfzotCElf972Wbq/7nss3/N7b53+blXu7leL3Xez1OnDjBfffdd+tv/dZvffeP/uiPfg5XXXXVVVddddW/F3rQgx7EVVddddVVV131b3fNNdc8+MM//MO/68Ve7MVeG+Av//Iv+cmf/Emuuuq/mm2u+o9lm//rbPM/xYkTJ3jZl31ZXv/1Xx+Af/iHf/jtr//6r3+f++6771auuuqqq6666qp/K8rx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JCGJ+61WK/7hH/6BF3/xF+fEiRM89rGP5e6772Z3dxcASUgCQBKSAJAEgCQA1us1t912G3/7t3/LarXi0Y9+NNdddx0v+ZIvyfHjx1mtVly6dAlJ3E8S6/Wa++67j7//+7/n7//+71mv1wBce+21XHPNNbz4i784L/7iL84111zDer1mb2+Pq/5vk4QkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhif9PJCEJSUhCEpKQhCQkIQlJ/G8hCUlIQhKSkIQkjh8/zsu//Mvzru/6rrzCK7wCt9xyCwD7+/v87d/+Lb/5m7/Jn/3Zn3HnnXfyb7Gzs8Nrv/Zr80Zv9EbcfPPNANx+++38yI/8CH/0R3/Efffdx4vi+PHjvOM7viMPfvCDAfju7/5uHv/4x3M/25w4cYIP+IAPAOA7v/M7eY3XeA3uvvvun7n11lv/mquuuuqqq666inL8+HGuuuqqq6666iq49dZb/+bN3/zNP3pjY4M/+qM/YrVa8chHPpKbbrqJkydP8nd/93dIQhKSkIQkVqsVj3vc41itVrzYi70YD33oQ5nP5zz96U9HEpIAkASAJCQBIAkASQCs12ue8Yxn8Hd/93esVise9KAHce211/KSL/mSvORLviT33nsvly5dAkASAJIAWK/X3H777fz93/89f//3f896vebYsWMcO3aMa665hhd/8RfnxV/8xbnmmmtYr9fs7e1x1VX/EklIQhKSkIQkJCEJSUhCEpKQhCQkIQlJ/F8kCUlIQhKSkIQkJCEJSUjif5JbbrmFF3/xF+dd3/VdefmXf3luueUWAPb39/nbv/1bfuu3fos///M/584772QYBv4tbrrpJt7wDd+Q137t1+bMmTMA/NEf/RG/8iu/wl/+5V+yXq95UR07doz3eI/34Nprr2V3d5cf+ZEf4dZbb+WBbPNu7/ZunDhxgh/5kR/hjjvu4G3f9m259957//of/uEffoerrrrqqquuuorKVVddddVVV1112X333XfrP/zDP/z2i73Yi732ox71KJ7ylKfwC7/wC5w6dYpHPOIRvOIrviJ//ud/zvNz8eJF/uIv/gKA13/91+f1Xu/1APit3/otbCOJf43d3V1+93d/l7/927/lJV/yJXnN13xNjh07xru927tx6dIlfv7nf57bb78dANtI4oEuXbrEH/7hH/KHf/iHHDt2jBd/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2MY2tgGwjW1sYxvb2MY2tslMbGMb29jGNraxjW1sc/3117O9vc329jb3W6/X7O3tsVqtuPnmm7nffffdd+tv/dZvffdv//Zvf8999913K1ddddVVV1111VUvOvSgBz2Iq6666qqrrrrqqn+La6655sEv9mIv9tqv8zqv814v9mIv9to80+7uLn/7t3/L7/zO7yAJgOPHj3PLLbfwoAc9iJd6qZfigS5dusTu7i633XYbz3jGM7jtttuQxHOTxHOTxPMjiRdEEi+IJB5IEgDHjh0D4NixYwAcO3YMgJ2dHXZ2dpDE9vY2+/v77O3tcdddd3HnnXciCQBJAEjifpIAkASAJAAkASAJAEkASAJAEgCSkASAJAAkASAJAElIAkASkgCQhCQAJCEJSQBIQhKSkIQkJCEJSUhCEpKQhCQkIQlJRASSkIQkIgJJSCIikIQkIgJJRASSkERE0Pc9J06cYGtri42NDf4l0zTRWmO9XrNerxmGAUkASOJ+knhutrmfbQBsA2AbANvYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2Xddx4sQJrr/+eh7o3Llz9H3PbDZjNptxv/vuu+/W3/qt3/ruH/3RH/0crrrqqquuuuqqq/5t0IMe9CCuuuqqq6666qqr/r2uueaaB7/2a7/2e73TO73TZ/NMu7u7POMZz+AZz3gGf/u3f8v9jh8/zvHjx3nJl3xJXvIlX5Ln59KlS9x222084xnP4NKlS9x2220ASOK5SeL5kcTzI4kXRBLPTRIAkpAEgCQAJAEgCQBJAEgCQBL3kwSAJAAkASAJAEkASAJAEgCSAJAEgCQAJCEJAEkASAJAEgCSkASAJCQBIAlJSAJAEpKQBIAkJCEJSUhCEpKQhCQkIQlJSEISEYEkJCGJiEASkogIJCGJiEASEYEkJDGfz7n22msZxxFJALTWAJimCUlIorWGJFprSEISkgCQhCQkcT9JvChsA2AbANvYBsA2trGNbWxjG9vYxja2sY1tbGObWisbGxt0XceJEyfo+577DcOAbfb39zl9+jT3u++++279rd/6re/+7d/+7e+57777buWqq6666qqrrrrq3wc96EEP4qqrrrrqqquuuuo/yjXXXPPgF3uxF3vtF3uxF3ut13md13lvnml3d5fbbruNv/mbv+G2227jgY4dO8aDH/xgbrnlFo4dO8aDHvQgntulS5cAuO2227jtttu4dOkSt912G/eTxHOTxAsiiRdEEg8kCQBJAEgCQBIAkpAEgCQAJHE/SQBIAkASAJIAkASAJAAkASAJAEkASAJAEgCSkASAJAAkASAJSQBIAmBra4trr70WgKOjI86ePYskACQhCUlIAkASkpCEJCQhCUlIQhKSkIQkIgJJSEISEYEkJBERSEISEYEkIgJJSCIikEREIAlJRASSkEREIAlJSCIikIQkACQhCUlIAkASAJL4l9jmfraxDYBtbANgG9vYxja2sY1tbFNrZT6fU2tlY2ODjY0NHmgYBgAODg4AOHnyJA9033333fqjP/qjn/Nbv/Vb381VV1111VVXXXXVfxz0oAc9iKuuuuqqq6666qr/DNdcc82DX+zFXuy1X+d1Xue9XuzFXuy1eabd3V1uu+02/vZv/5ZnPOMZAEjifseOHQPgQQ96EA960IM4duwYt9xyC8/t0qVL3HbbbVy6dInbb7+d2267jecmiRdEEi+IJO4nCQBJAEgCQBIAkgCQBIAkACQBIAkASQBIAkASAJIAkASAJAAkASAJAEkASAJAEpIAkASAJAAkIQmAhz3sYQBsbm6ytbUFwOHhIZI4Ojri7NmzHB0dIQlJSAJAEpKQhCQkIQlJSEISkogIJCEJSUgiIpCEJCICSUgiIpCEJCICSUQEkogIJBERSEISEYEkJBERSEISkpCEJCQhCUlIAkASkrifJF4Y2wDYBsA2ALaxjW0AbGObUgqbm5vYZj6fs1gseH7GcWQYBoZhoO97Njc3eaD77rvv1t/6rd/67h/90R/9HK666qqrrrrqqqv+c6AHPehBXHXVVVddddVVV/1nu+aaax782q/92u/14i/+4q/9Yi/2Yq/NM126dIlnPOMZPOMZz+Dv/u7veG6SADh27BjHjh3j2LFjvORLviS33HILz8+lS5e47bbbuP3227l06RK33XYbknh+JPHCSAJAEgCSAJAEgCQAJAEgCQBJAEgCQBIAkgCQBIAkACQBIAkASQBIAkASAJIAkASAJCQBIAkASQBIQhIAkgCQhCQkASAJSQBIQhKSkIQkACQhCUlIQhKSkIQkIgJJSEISkogIJCEJSUQEkogIJCGJiEASEYEkIgJJRASSkEREIImIQBKSkEREIAlJSEISkpAEgCQkASCJ+0ni+bHN/WwDYBvb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7Ngxjh07BsDOzg7PbW9vj8c97nHceeed3HnnnUgCQBIAkgCQBIAkJAEgCQBJAEgCQBIAkgCQBIAkACQhCQBJAEhCEgCSAJCEJAAkIQlJAEhCEpKQBIAkJCEJSUhCEpKQhCQkIYmIQBKSkEREIAlJRASSkEREIImIQBIRQUQgiYhAEhGBJCICSfR9z8bGBl3XceLECV4UrTUyk3EckcQ4jrTWAJDEA0UEEUGtlVortVae23333Xfr2bNnb/37v//73/6Hf/iH3/mHf/iH3+aqq6666qqrrrrqfxf0oAc9iKuuuuqqq6666qr/7a655poHv9iLvdhrv9iLvdhrvdiLvdhrX3PNNQ/muVy6dInbbruN22+/nUuXLnH77bfz/EjigSQBIAlJABw7dgyAY8eOAbCzs4MkdnZ2ALjzzjvZ399nf38fAEkASAJAEgCSkASAJAAkASAJAEkASAJAEgCSkASAJAAkIQkASQBIQhKSAJCEJAAkIQlJSEISAJKQhCQkIQlJSEISkogIJCEJSUQEkpBERCAJSUQEkogIJBERSCIikEREEBFIYjabcezYMTY3N1ksFjy3aZqQBEBrDYBxHMlM1us1AJKQhCQAJBERAPR9D0CtlVorz+2+++679R/+4R9++7777rv1H/7hH37nH/7hH36bq6666qqrrrrqqv/d0IMe9CCuuuqqq6666qqr/q+55pprHvxiL/Zir/1iL/Zir3XNNdc8+MVe7MVem+fj0qVL3H777dx2221cunSJvb099vb2eCBJAEgCQBKSAJAEgCQAJAEgCQBJAEgCQBIAkgCQBIAkJAEgCQBJAEgCQBIAkgCQhCQAJAEgCUkASEISAJKQBIAkJCEJAElIQhKSkASAJCQhCUlIQhKSiAgkIQlJRASSkIQkIgJJRASSiAgkERFIIiKQREQgiYjgxIkTSGKaJiTRWkMSmYkkIgJJRASSkIQkJCEJSUiilEIphVorpRQiglorz899991362/91m9999mzZ5/xW7/1W9/NVVddddVVV1111f896EEPehBXXXXVVVddddVV/9ddc801DwZ4sRd7sdd+sRd7sde65pprHvxiL/Zir83zcenSJfb29rh06RK33347e3t7XLp0if39fQAkASAJSQBIAkASAJIAkASAJAAkASAJAEkASEISAJIAkASAJAAkASAJAElIAkASAJKQBIAktra2ANja2uLaa68FYHNzk7Nnz3J0dMTR0RFHR0dIQhKSkIQkJAEgCUlIIiKQhCQkIQlJRASSkEREIAlJRASSiAgkERFIIiKICCQREUgiIogIJBERSCIikEREIImIQBKS6LqOUgp93yOJruvouo4X5L777rv1t37rt74b4B/+4R9+5x/+4R9+m6uuuuqqq6666qr/+9CDHvQgrrrqqquuuuqqq/4/uuaaax4M8GIv9mKv/WIv9mKvdc011zz4xV7sxV6bF2Bvbw+A22+/HYA77riDvb099vf32d/fB0ASAJIAkASAJAAkASAJAEkASAJAEpIAkASAJAAkASAJSQBIAkASAJKQBIAktra2ANja2kISm5ubSALg6OgIgHPnziEJSUhCEpKQhCQkIQlJSEISkpCEJCICSUgiIpCEJCICSUQEkogIJBERSCIiiAgkERFIIiKICCQREXRdR9/31Frpuo5aK7VW+r7nBbnvvvtuPXv27K1///d//9sA//AP//A7//AP//DbXHXVVVddddVVV/3/hB70oAdx1VVXXXXVVVddddWzXXPNNQ8+c+bMg6+55poHv9iLvdhrXXPNNQ8+c+bMg6+55poH8wLs7e0BsLe3x/7+Pnt7e+zv77O/vw/AXXfdBYAkACQBIAkASQBIQhIAkgCQBIAkACQhCQBJAEgCQBKSAJCEJAAkIQkASUhCEpIAkIQkJCEJSUhCEpKQhCQkIQlJSCIikIQkJBERSEISEYEkIgJJRAQRgSQigtlsRkQwm83o+56+75HExsYGXddRa+WFue+++249e/bsrX//93//2wD/8A//8Dv/8A//8NtcddVVV1111VVXXfVA6EEPehBXXXXVVVddddVVV/3LrrnmmgcDvNiLvdhrAXqxF3ux17rmmmsefObMmQdfc801D+ZfsL+/D8De3h4HBwcA7O/vs7+/jyT29/c5ODhAEvv7+0gCQBIAkgCQhCQAJAEgCUkASAJAEpIAkIQkJAEgCUlIAkASkpCEJCQhCUlIQhKSkIQkJBERSEISkogIFosFklgsFkhiPp8zn8+RxGw2YzabMZvN6PueF8V99913K8A//MM//PZ9991369mzZ2+97777nvEP//APv81VV1111VVXXXXVVS8K9KAHPYirrrrqqquuuuqqq/59zpw58yBJOnPmzIOvueaaB585c+ZB11xzzYOvueaaB585c+bB11xzzYP5V9rf3wdAEvv7+0hif38fSdzv4OAAgMPDQyTxQJI4PDwEQBKSkMT9JCEJSWxsbCAJAElIYmNjAwBJAGxsbCAJgI2NDQDm8zmSmM/n/Fvcd999t549e/bW++6779b77rvvVoB/+Id/+B2Af/iHf/htrrrqqquuuuqqq67690IPetCDuOqqq6666qqrrrrqP98111zzYNu+5pprHnLNNdc8GODMmTMPuuaaax4McM011zz4zJkzDwa45pprHswLcN999916zTXXPJj/ge67775bAc6ePXsrwH333XfrfffddyvA2bNnn3Hffffdet999z397Nmzz+Cqq6666qqrrrrqqv8K6EEPehBXXXXVVVddddVVV/3Pc8011zyYZzpz5syDAV9zzTUP4ZnOnDnzIJ7pmmuueTDPxzXXXPNgXgT33XffrTyX++6771Ye4OzZs8/gme67776nAzp79uytAPfdd9+tXHXVVVddddVVV131PxF60IMexFVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Slauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/Ff8IHrNRArOlV2UAAAAASUVORK5CYII=) diff --git a/docs/kcl/hole.md b/docs/kcl/hole.md index 639a156cc..f616abe7f 100644 --- a/docs/kcl/hole.md +++ b/docs/kcl/hole.md @@ -34,8 +34,8 @@ exampleSketch = startSketchOn('XY') |> line([5, 0], %) |> line([0, -5], %) |> close(%) - |> hole(circle({ center: [1, 1], radius: .25 }, %), %) - |> hole(circle({ center: [1, 4], radius: .25 }, %), %) + |> hole(circle({ center = [1, 1], radius = .25 }, %), %) + |> hole(circle({ center = [1, 4], radius = .25 }, %), %) example = extrude(1, exampleSketch) ``` @@ -43,7 +43,7 @@ example = extrude(1, exampleSketch) ![Rendered example of hole 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAFGDklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVbzO67zOe3PVVVddddX/Of/wD//w2/fdd9+tXHXVVVddddX/X1Suuuqqq6666v+xF3uxF3vtd3qnd/qsF3uxF3ttrrrqqquu+j/nt37rt777vvvuu/VHf/RHP4errrrqqquu+v+JylVXXXXVVVf9P3XNNdc8+HM/93N/C+C7vuu7OH/+PFddddX/HLa56l9mm//rbPNv8ehHP5q3equ3eu/77rvv1t/+7d/+nvvuu+9Wrrrqqquuuur/HypXXXXVVVdd9f/Uh3/4h38XwBOf+ET+6I/+iKuu+vewzVX/s9jmqudlm/+rbPNAT3ziEzl9+jSv9mqv9uAP//AP/67P/MzPfB2uuuqqq6666v8fgquuuuqqq676f+h1Xud13vvFXuzFXhvgK77iK7jqqn8vSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQxFUvnCQkIQlJSEISkpCEJCQhCUlIQhKS+L9MEpKQhCQkIQlJSEISkpDE/zaSkIQkJCGJn/3ZnwXgxV7sxV77dV7ndd6bq6666qqrrvr/h3L8+HGuuuqqq6666v+br/iKr/grgC//8i/n/PnzXHXV/0aSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlI4v87SUhCEpKQhCQkIQlJSEISkpCEJP6vkYQkJCEJSUhCEpKQhCQk8T/V0dER58+f52Ve5mV48IMf/NJ/9md/9jOHh4e7XHXVVVddddX/HwRXXXXVVVdd9f/M537u5/4WwBOf+ESe9KQncdVVVz0vSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhL/n0hCEpKQhCQkIQlJSEISkpCEJP6vkIQkJCEJSUhCEpKQhCQk8V/tD/7gD3jiE5/INddc8+B3fMd3/Cyuuuqqq6666v8Xgquuuuqqq676f+TFXuzFXvvFXuzFXhvgu7/7u/n3kIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCSu+u8nCUlIQhKSkIQkJCEJSUhCEpKQhCQkIYn/yyQhCUlIQhKSkIQkJCEJSUji/wJJSEISkpCEJCQhCUlI4j/Sd37ndwLwOq/zOu/9Oq/zOu/NVVddddVVV/3/QXDVVVddddVV/498+Id/+HcBfPd3fzcXLlxAEpKQhCQkIQlJSEISkpCEJCQhCUlc9b+DJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUjiqn89SUhCEpKQhCQkIQlJSEISkpCEJCTxf40kJCEJSUhCEpKQhCQkIQlJ/G8mCUlIQhKSkIQkJCEJSbwozp07x3d+53cC8I7v+I6fxVVXXXXVVVf9/0Fw1VVXXXXVVf9PfO7nfu5vXXPNNQ9+0pOexB/90R9x1VX/XSQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCRx1bNJQhKSkIQkJCEJSUhCEpKQhCQkIYn/CyQhCUlIQhKSkIQkJCEJSfxvJQlJSEISkpCEJCQhCYA/+IM/4AlPeALXXHPNgz/8wz/8u7jqqquuuuqq/x8Irrrqqquuuur/gRd7sRd77Rd7sRd7bYCf+7mf46qr/q+ThCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSfx/JAlJSEISkpCEJCQhCUlIQhKS+N9MEpKQhCQkIQlJSEISkpDE/zaSkMR3fdd3AfA6r/M67/1iL/Zir81VV1111VVX/d9HcNVVV1111VX/D3z4h3/4dwH83M/9HE960pP4v0wSkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISV/3/JAlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSfxfJwlJSEISkpCEJCQhCUlIQhKS+N9IEpKQhCQkIQlJSEISkvif5vz583znd34nAB/+4R/+XVx11VVXXXXV/30EV1111VVXXfV/3Id/+Id/1zXXXPPgJz3pSfzCL/wCkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhL/FSQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUjiqv9YkpCEJCQhCUlIQhKSkIQkJCEJSUhCEv8XSUISkpCEJCQhCUlIQhKSkMT/JpKQhCQkIQlJSEISkpDEf6UnPvGJPPGJT+Saa6558Id/+Id/F1ddddVVV131fxvBVVddddVVV/0f9mIv9mKv/Tqv8zrvDfDzP//zXHXVv4UkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUjiqhdMEpKQhCQkIQlJSEISkpCEJCQhCUn8XyEJSUhCEpKQhCQkIQlJSOJ/C0lIQhKSkIQkJCEJSUjiP8L58+f5zu/8TgBe7MVe7LVf/MVf/LW56qqrrrrqqv+7CK666qqrrrrq/7B3eqd3+iyAn//5n+dJT3oSV131v4UkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKS+P9MEpKQhCQkIQlJSEISkpCEJCQhif/NJCEJSUhCEpKQhCQkIQlJ/G8gCUlIQhKSkIQkJCGJF8X58+f52Z/9Wa655poHf/iHf/h3c9VVV1111VX/d1GOHz/OVVddddVVV/1f9I7v+I6f9Tqv8zrvff78eb75m7+Zq6666gpJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEv9fSEISkpCEJCQhCUlIQhKSkMT/VpKQhCQkIQlJSEISkpDE/3SSkIQkJCEJSUhCEpIAOHfuHLfccgu33HLLcYB/+Id/+B2uuuqqq6666v8egquuuuqqq676P+jFXuzFXvud3umdPhvge77ne/iPIAlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCRx1X8PSUhCEpKQhCQkIQlJSEISkpCEJCQhCUn8XyQJSUhCEpKQhCQkIQlJSEISkvjfRBKSkIQkJCEJSUhCEpL4n0wSFy5c4Lu+67sAeJ3XeZ33frEXe7HX5qqrrrrqqqv+7yG46qqrrrrqqv+D3umd3umzAP7oj/6IJz/5yUhCEpKQhCQkIQlJSEISkpCEJCQhCUlI4qr/2SQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUjiqhedJCQhCUlIQhKSkIQkJCEJSUhCEpL4v0QSkpCEJCQhCUlIQhKSkMT/FpKQhCQkIQlJSEISkpDEf6fz58/zsz/7s1xzzTUP/vAP//Dv4qqrrrrqqqv+76EcP36cq6666qqrrvq/5B3f8R0/63Ve53Xe+/z583zVV30VV71wp06dYmNjg5tvvplTp05x6tQpTp06xalTpzh16hQAGxsbLJdLrnrRSUISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSOIqkIQkJCEJSUhCEpKQhCQkIQlJSOJ/O0lIQhKSkIQkJCEJSUhCEv8bSEISkpCEJCQhCUlIQhL/Wc6fP8/LvMzLcObMmeMA//AP//A7XHXVVVddddX/HVSuuuqqq6666v+Qa6655sHv9E7v9NkA3/u938tVV5w6dYpXfuVXBuCRj3wkAI985CP5l5w/f55Tp05xv/Pnz3P+/HnOnz/Pk5/8ZM6fP8+TnvQkrvrvIYn/SLb5/0IS/1q2+d9IEi8q2/xPJol/iW3+tc6fP893fdd38fEf//G8zuu8znv/wz/8w+/8wz/8w29z1VVXXXXVVf83oAc96EFcddVVV1111f8Vn/u5n/tbL/ZiL/baf/RHf8T3fu/38n+JJF5Up06d4pVf+ZV5xCMewSMf+UhemGmaiAgAWmu01pimiWmamKaJxWLB5uYmL8j58+c5f/48f/zHf8wf/dEfcdVVtrnqCtv8X2Sb/81s8/y8z/u8D6/6qq/KP/zDP/z2Z37mZ74OV1111VVXXfV/A5Wrrrrqqquu+j/idV7ndd77xV7sxV4b4Pu+7/uQxP8np06d4hGPeARv9mZvxqlTp3igvb097r77bo6Ojliv17TWGMeR48ePc/LkSba3t+m6jnEc2d/f5+LFi1y8eJG9vT0ODw9Zr9fMZjPGcWRzc5OtrS1uvPFGdnZ2uOWWWzh16hSPfOQjeeVXfmWe/OQn8wu/8Av8b2Wbq/59JPHvYZv/KyTxr2Gb/w0k8aKwzf9Eknh+fu7nfo5HPepRvNiLvdhrv9M7vdNn/8iP/Mhnc9VVV1111VX/+1G56qqrrrrqqv8Drrnmmgd/+Id/+HcBfNVXfRX/nzziEY/gPd/zPTl16hT3u3TpEn/3d3/HnXfeyV133UWtla7r6Pue+XzO5uYmOzs7ANgGQBIRQUQgCUlIQhIA+/v7jOPI7u4urTX+7u/+jsxka2uLm2++mZd4iZfgkY98JI985CN5xCMewR//8R/zx3/8x/xvI4n/Sra56jlJ4t/CNv/bSeJFZZv/6STxL7HN/xTnz5/n537u53jv935vXud1Xue9f+u3fuu777vvvlu56qqrrrrqqv/dqFx11VVXXXXV/wEf/uEf/l0AT3rSk3jyk5/M/wenTp3iPd7jPXjkIx8JwO7uLn/913/N3//937O/v09EUEqhlMID2cY2trHNA0lCEpKQhCQkcT9JPLdLly5x8eJF/uqv/ort7W3e+q3fmkc+8pGcOnWKJz/5yZw/f56rXjBJ/Gewzf83kvi3sM3/RpJ4UdjmfzJJ/Ets81/lD//wD3nkIx/Jq77qqz7owz/8w7/rMz/zM1+Hq6666qqrrvrfjXL8+HGuuuqqq6666n+z13md13nvN3/zN/9ogK/+6q9muVzyf92pU6d4j/d4D06dOsV6veYP//AP+eEf/mFuu+02hmFAEhFBRBARRAQRQSmFWitd1zGbzZjP5ywWC+bzObVWbDMMA+v1mtVqxXq9ZhxHWmtkJplJZmIb29jGNraxzXK55M///M/JTF78xV+cm266iT/+4z/mqv96kpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCT+r5OEJCQhCUlIQhKSkIQkJCGJ/20kIQlJSEISkpCEJCQhCUn8TyUJSUhCEpKQhCQkIYn/SLfffjuv//qvzzXXXPPgs2fPPuPWW2/9a6666qqrrrrqfy+Cq6666qqrrvpf7sM//MO/C+CrvuqrOH/+PP8ekpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQxJu92ZvxyEc+Ekl80Rd9Eb/xG7/BC2Ob+9kGwDa2sY1tACQREUhCEpKQxPMjCQBJPLc///M/B+DJT34ykpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSOKq/xqSkIQkJCEJSUhCEpKQhCQkIQlJSEIS/9dIQhKSkIQkJCEJSUhCEpKQxP8mkpCEJCQhCUlIQhKSkMT/RJKQhCQkIQlJSEISknhRnT9/nu/+7u8G4B3f8R0/65prrnkwV1111VVXXfW/F8FVV1111VVX/S/2uZ/7ub8F8OQnP5mnPOUpSEISkpCEJCQhCUlIQhKSkIQkJCEJSfxv8cqv/MoAfO7nfi7PzTb3s80D2QbANraxjW0eSBIRQUQgCQBJ3E8Sz48kACTxsIc9DIBHPvKR/GeShCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJK564SQhCUlIQhKSkIQkJCEJSUhCEpKQxP8FkpCEJCQhCUlIQhKSkIQkJPG/gSQkIQlJSEISkpCEJP4nkoQkJCEJSUhCEpKQxP3+8A//kCc+8Ylcc801D37Hd3zHz+Kqq6666qqr/vciuOqqq6666qr/pV7sxV7stV/sxV7stQG+7/u+j/8vTp06xZOf/GSe+MQnYhvbANjGNs/NNgC2AbCNbWxjG9vcTxKSkIQkJCEJAElIAkASz48kXuZlXoZ3fMd3BOAXfuEX+P9AEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUji/zNJSEISkpCEJCQhCUlIQhKSkIQk/jeThCQkIQlJSEISkpCEJCTxP5kkJCEJSUhCEpKQhCQk8T+NJCQhie/5nu8B4HVe53Xe+8Ve7MVem6uuuuqqq67634ngqquuuuqqq/6X+vAP//DvAvi+7/s+zp8/z/8nJ0+e5FGPehRv/MZvDIBtnptt/iW2AbCNJCQREUQEkpCEJCTxwkji+PHjvPd7vzdv93Zvx/nz5/m+7/s+nvzkJ3PVv58kJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUn8fyAJSUhCEpKQhCQkIQlJSEISkvjfSBKSkIQkJCEJSUhCEpL4n0wSkpCEJCQhCUlIQhL/Xc6fP893f/d3A/DhH/7h38VVV1111VVX/e9EOX78OFddddVVV131v82Hf/iHf9eLv/iLv/aTn/xkfvzHf5z/6SQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJLJdLVqsVi8WCV3qlVwLg0qVLDMNARBARRASSiAgiAkmUUogISil0XUff98zncxaLBYvFgq7rkMQ0TaxWK1arFavVimEYmKaJ1hqZSWZiG9scO3aMl3u5l+MlXuIleMu3fEuOHz/O+fPn+b7v+z7+9m//lqv+Z5KEJCQhCUlIQhKSkIQkJCEJSUhCEpKQxP9FkpCEJCQhCUlIQhKSkIQkJPG/iSQkIQlJSEISkpCEJCTxP5UkJCEJSUhCEpKQxH+mO+64g0c96lHccsstx6+55poH/+mf/unPcNVVV1111VX/u1C56qqrrrrqqv9lXuzFXuy1X+d1Xue9AX7xF38RSfx/88d//Mc86UlP4qM+6qN4uZd7OV7hFV6BW2+9lWc84xn83d/9HbZ5bra5n21sYxvb2AZAEpKICCQhCUlIQhIAOzs7POpRj+LGG2/k5ptv5n7nz5/n+7//+3nyk58MgCT+t7DNVf86kvj3sM3/dpL417DN/3SSeFHY5n8SSfxLbPNv9d3f/d184Rd+Ia/zOq/z3r/1W7/1Pf/wD//w21x11VVXXXXV/x7oQQ96EFddddVVV131v8k3fdM3Pf2aa6558C/+4i/yi7/4i/x/dvLkSR75yEfy8Ic/nFd+5VfmfpcuXeK2227jjjvuYH9/n1IK99xzD13XMZvN2NjYYGtri+PHj3Pq1ClOnjzJ5uYmklitVuzv73Px4kWGYWBzc5NxHDlz5gzXX389D3T+/Hn+5E/+hF/8xV/kqheNba76t7PN/we2+d/ONv+b2OaFeZVXeRXe+73fm/vuu+/WD/mQD3kIV1111VVXXfW/B3rQgx7EVVddddVVV/1v8Y7v+I6f9U7v9E6f/eQnP5mv+Zqv4apnO3nyJI985CM5efIkr/RKr8SpU6d4fg4ODpBERBARRAQRQUQgiRfk/PnzXLhwgSc/+ck8+clP5slPfjJX/c9gm6teMNv8X2Wb/81s87/FyZMnea/3ei8e9ahH8Vu/9Vvf/fVf//Xvw1VXXXXVVVf974Ae9KAHcdVVV1111VX/G7zYi73Ya3/u537ubwF8zdd8DU9+8pO56gU7efIkp06d4tSpU5w8eZKTJ08CcOrUKQBOnjzJA124cAGA8+fPc+HCBQAuXLjA+fPnefKTn8xV//fZ5qorbPN/jW3+N7LN/xSnTp3iC77gC7jvvvtu/fqv//r3+Yd/+Iff5qqrrrrqqqv+50MPetCDuOqqq6666qr/DT73cz/3t17sxV7stX/xF3+RX/zFX+RFJYmr/m+yzVX/c9jm/yPb/F9hm/9tbPNf6c3f/M158zd/c+67775bP+RDPuQhXHXVVVddddX/fJTjx49z1VVXXXXVVf/TveM7vuNnvc7rvM57X7hwgW/7tm9DEpKQhCQkIQlJSEISkpDEVf93SUISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhiauelyQkIQlJSEISkpCEJCQhCUlIQhKS+N9MEpKQhCQkIQlJSEISkpCEJP4nk4QkJCEJSUhCEpKQhCT+J5GEJCQhCUlIQhKSkMR/pPPnz3PzzTdzyy23HAf4h3/4h9/hqquuuuqqq/5noxw/fpyrrrrqqquu+p/sxV7sxV77Iz7iI74b4Nu+7du4cOECV131300SkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJ/H8kCUlIQhKSkIQkJCEJSUhCEpKQxP9GkpCEJCQhCUlIQhKSkMT/ZJKQhCQkIQlJSEISkvifRBKSkIQkJCEJSUjiX2O5XHL+/Hle5VVehWuuuebBz3jGM/7mvvvuu5Wrrrrqqquu+p+L4Kqrrrrqqqv+h3und3qnzwL4kz/5E5785Cdz1VX/10lCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKS+L9OEpKQhCQkIQlJSEISkpCEJP43kYQkJCEJSUhCEpKQhCT+p5KEJCQhCUlIQhKSkMT/FJKQhCQkIQlJSEISz+1JT3oSP//zP88111zz4A//8A//bq666qqrrrrqfzbK8ePHueqqq6666qr/qd7xHd/xs17ndV7nvS9cuMDXfu3X8t9FEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSOKq/z6SkIQkJCEJSUhCEpKQhCQkIQlJSEISkvi/RBKSkIQkJCEJSUhCEpKQhCT+N5CEJCQhCUlIQhKSkIQk/ieShCQkIQlJSEISkvifQhKSkIQkJHHhwgVe6qVeitOnTx8H+Id/+Iff4aqrrrrqqqv+ZyK46qqrrrrqqv+hrrnmmge/0zu902cDfP/3fz+SkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUjiqn8fSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCRx1b9MEpKQhCQkIQlJSEISkpCEJCQhCUn8bycJSUhCEpKQhCQkIQlJSOJ/OklIQhKSkIQkJCEJSUjifxJJSEISkpCEJCQhCUn8dzl//jzf+73fC8DrvM7rvPc111zzYK666qqrrrrqfyaCq6666qqrrvof6sM//MO/C+BP/uRPeMpTnsJVV/1nkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkMT/Z5KQhCQkIQlJSEISkpCEJCQhCUn8byQJSUhCEpKQhCQkIQlJSOJ/MklIQhKSkIQkJCEJSfxPIglJSEISkpCEJCTxn+lJT3oSf/RHf8Q111zz4A//8A//Lq666qqrrrrqfyaCq6666qqrrvof6HVe53Xe+8Ve7MVeG+AHfuAHuOqq/80kIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUji/wNJSEISkpCEJCQhCUlIQhKSkMT/JpKQhCQkIQlJSEISkpDE/1SSkIQkJCEJSUhCEpL4n0ISkpCEJCQhCUlI4t/rF37hFzh//jwv9mIv9tqv8zqv895cddVVV1111f88lOPHj3PVVVddddVV/5Ncc801D/7cz/3c3wL42q/9Wi5cuMBVV131bJKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkMT/NZKQhCQkIQlJSEISkpCEJCTxv4EkJCEJSUhCEpKQhCQk8T+RJCQhCUlIQhKSkMT/FJKQhCQkIQlJSEIS/5LlcslyueSlXuqlePCDH/zSf/Znf/Yzh4eHu1x11VVXXXXV/xxUrrrqqquuuup/mA//8A//LoAnP/nJPOUpT+H5kcRVVwHY5qp/G0n8W9nmfztJvKhs8z+ZJF4UtvmfQhL/Etv8d5PEC2IbgD/6oz/iEY94BK/yKq/y4A//8A//rs/8zM98Ha666qqrrrrqfw6Cq6666qqrrvof5HVe53Xe+8Ve7MVeG+AHf/AHkYQkJCEJSUjiqqvuJwlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISV10hCUlIQhKSkIQkJCEJSUhCEpKQhCT+N5KEJCQhCUlIQhKSkIQkJPE/mSQkIQlJSEISkpCEJP4nkYQkJCEJSUhCEpL47yYJSUjiF3/xFwF4sRd7sdd+ndd5nffmqquuuuqqq/7noBw/fpyrrrrqqquu+p/iK77iK/4K4Ou+7uu48847ueqq/2kkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpL4/0QSkpCEJCQhCUlIQhKSkIQkJPG/iSQkIQlJSEISkpCEJCQhif+JJCEJSUhCEpKQhCQk8T+FJCQhCUlIQhKSkMR/peVyyfnz53mpl3opHvKQh7zMn/7pn/704eHhLlddddVVV13134/gqquuuuqqq/6H+NzP/dzfAnjKU57CU57yFK666v8TSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlI4v8qSUhCEpKQhCQkIQlJSEISkvjfQhKSkIQkJCEJSUhCEpL4n0YSkpCEJCQhCUlIQhL/E0hCEpKQhCQkIQlJ/Ef74z/+Y570pCdx5syZB73jO77jZ3HVVVddddVV/zMQXHXVVVddddX/AC/2Yi/22i/2Yi/22gA/8AM/wH8GSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpK46j+HJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCT+L5CEJCQhCUlIQhKSkIQkJCGJ/+kkIQlJSEISkpCEJCTxP40kJCEJSUhCEpKQxP8EkpCEJCQhCUlIQhL/Ft/3fd8HwOu8zuu894u92Iu9NlddddVVV13134/gqquuuuqqq/4H+PAP//DvAvjBH/xBLl68iCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUjiqv9ZJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkcdXzJwlJSEISkpCEJCQhCUlIQhKSkMT/ZpKQhCQkIQlJSEISkpCEJP6nkoQkJCEJSUhCEpKQhCT+p5CEJCQhCUlIQhKSkMR/N0lIQhKSkIQkJPGCnD9/nu/93u8F4MM//MO/i6uuuuqqq67670dw1VVXXXXVVf/NPvzDP/y7rrnmmgc/5SlP4U//9E+56qr/KpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEv/fSEISkpCEJCQhCUlIQhKSkIQkJPG/jSQkIQlJSEISkpCEJCTxP5UkJCEJSUhCEpKQhCT+p5CEJCQhCUlIQhKS+O8kCUlIQhKSkIQknvzkJ/OkJz2Ja6655sEf/uEf/l1cddVVV1111X8vgquuuuqqq676b/RiL/Zir/06r/M67w3wy7/8y1x11f8lkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCT+L5OEJCQhCUlIQhKSkIQkJCGJ/y0kIQlJSEISkpCEJCQhif+JJCEJSUhCEpKQhCT+p5CEJCQhCUlIQhL/nS5cuMD3f//3A/A6r/M67/1iL/Zir81VV1111VVX/fchuOqqq6666qr/Rh/+4R/+XQC//Mu/zFOe8hT+N5GEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhJX/c8jCUlIQhKSkIQkJCEJSUhCEpKQhCQkIYn/KyQhCUlIQhKSkIQkJCEJSUjifzpJSEISkpCEJCQhCUlI4n8SSUhCEpKQhCQkIQlJ/HeThCQkIQlJSEISkvjPdv78eX7hF34BgA//8A//Lq666qqrrrrqvw/BVVddddVVV/03ecd3fMfPuuaaax78lKc8hV/+5V9GEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQk/i+ThCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCGJq140kpCEJCQhCUlIQhKSkIQkJCEJSUjifzNJSEISkpCEJCQhCUlIQhL/k0lCEpKQhCQkIQlJSOJ/EklIQhKSkIQkJCGJ/26SkIQkJCEJSUhCEv8R/uRP/oQnP/nJXHPNNQ/+8A//8O/iqquuuuqqq/57EFx11VVXXXXVf4MXe7EXe+13eqd3+myAX/mVX0ESV131byUJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSfx/JglJSEISkpCEJCQhCUlIQhKSkMT/NpKQhCQkIQlJSEISkpCEJP4nkoQkJCEJSUhCEpKQxP8UkpCEJCQhCUlIQhL/3SQhCUlIQhKSkMSL6vz583zf930fAC/+4i/+Oi/2Yi/22lx11VVXXXXVfz2Cq6666qqrrvpv8E7v9E6fBfDLv/zLPOUpT+Gqq/43kIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUn8XycJSUhCEpKQhCQkIQlJSEIS/5tIQhKSkIQkJCEJSUhCEv/TSEISkpCEJCQhCUlI4n8CSUhCEpKQhCQkIYn/TpKQhCQkIQlJSOK5nT9/nl/4hV/gzJkzD/rwD//w7+Kqq6666qqr/utRjh8/zlVXXXXVVVf9V3rHd3zHz3qd13md975w4QLf+Z3fyVVX/X8mCUlIQhKSkIQkJCEJSUhCEpKQhCQkIYn/SyQhCUlIQhKSkIQkJCEJSUjifwNJSEISkpCEJCQhCUlI4n8SSUhCEpKQhCQkIQlJ/HeThCQkIQlJSEISkvjvIglJSEISkrhw4QI33XQTt9xyy3GAf/iHf/gdrrrqqquuuuq/DsFVV1111VVX/Re65pprHvxO7/ROnw3wQz/0Q/xbSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCSu+veRhCQkIQlJSEISkpCEJCQhCUlIQhKS+N9MEpKQhCQkIQlJSEISkpCEJP4nk4QkJCEJSUhCEpKQxP8kkpCEJCQhCUlIQhL/3SQhCUlIQhKSkMR/tQsXLvCLv/iLALzO67zOe7/Yi73Ya3PVVVddddVV/3UIrrrqqquuuuq/0Id/+Id/F8Cf/dmf8dSnPhVJSEISkpCEJCQhCUlIQhKSkMRV//dIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJHHVFZKQhCQkIQlJSEISkpCEJCQhCUn8byQJSUhCEpKQhCQkIQlJSOJ/IklIQhKSkIQkJCEJSfxPIQlJSEISkpCEJCTx30kSkpCEJCQhCUlI4j/Dk5/8ZH7xF3+Ra6655sEf/uEf/l1cddVVV1111X8dyvHjx7nqqquuuuqq/wrv+I7v+Fmv8zqv894XLlzgG7/xG7nqqv9ukpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJ/H8hCUlIQhKSkIQkJCEJSUhCEpL430QSkpCEJCQhCUlIQhKS+J9GEpKQhCQkIQlJSEIS/xNIQhKSkIQkJCEJSfx3koQkJCEJSUhCEv8e58+f5yVf8iU5c+bMcYB/+Id/+B2uuuqqq6666j8fwVVXXXXVVVf9F7jmmmse/E7v9E6fDfBDP/RDXHXV/2WSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpDE/0WSkIQkJCEJSUhCEpKQhCQk8b+BJCQhCUlIQhKSkIQkJPE/iSQkIQlJSEISkpCEJP67SUISkpCEJCQhCUn8d5GEJCQhCUlIQhL/kgsXLvD93//9ALzO67zOe19zzTUP5qqrrrrqqqv+8xFcddVVV1111X+BD//wD/8ugD/7sz/jqU99Kv8dJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISV/3nkoQkJCEJSUhCEpKQhCQkIQlJSEISkvi/QBKSkIQkJCEJSUhCEpKQxP90kpCEJCQhCUlIQhKS+J9EEpKQhCQkIQlJSOK/myQkIQlJSEISkvjvIglJSEISkpCEJO735Cc/mT/+4z/mmmuuefCHf/iHfzdXXXXVVVdd9Z+P4Kqrrrrqqqv+k73O67zOe7/Yi73YawP88A//MJKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJXPUfTxKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQxFXPSxKSkIQkJCEJSUhCEpKQhCQkIQlJ/G8kCUlIQhKSkIQkJCEJSUjifypJSEISkpCEJCQhCUn8TyEJSUhCEpKQhCQk8d9JEpKQhCQkIQlJSOK/gyQkIYlf+qVf4sKFC7zYi73Ya73O67zOe3PVVVddddVV/7kox48f56qrrrrqqqv+s1xzzTUP/tzP/dzfAvjGb/xGLl68yFVX/WeQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpL4/0YSkpCEJCQhCUlIQhKSkIQkJPG/iSQkIQlJSEISkpCEJCQhif9pJCEJSUhCEpKQhCQk8T+BJCQhCUlIQhKSkMR/J0lIQhKSkIQkJPFfYblcslwuecmXfEke/OAHv/Sf/dmf/czh4eEuV1111VVXXfWfg+Cqq6666qqr/hN9+Id/+HcBPPWpT+WpT30qV131v5UkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhif+rJCEJSUhCEpKQhCQkIQlJSEIS/xtIQhKSkIQkJCEJSUhCEv+TSEISkpCEJCQhCUlI4r+bJCQhCUlIQhKSkMR/F0lIQhKSkIQkJPEf6U/+5E948pOfzDXXXPPgD//wD/8urrrqqquuuuo/D8FVV1111VVX/Sd5sRd7sdd+sRd7sdcG+OEf/mH+v5CEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCRx1f9OkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpL4v0ISkpCEJCQhCUlIQhKSkMT/dJKQhCQkIQlJSEISkvifRBKSkIQkJCEJSUjiv5skJCEJSUhCEpL47yIJSUhCEpKQhCT+Lb7/+78fgBd7sRd77dd5ndd5b6666qqrrrrqPwd60IMexFVXXXXVVVf9Z/iJn/gJA/zwD/8wf/Znf8YLIomrrrqfba76z2Wb/+ts87+Vbf43sM3/VLb5n8Q2L8grvdIr8e7v/u7cd999t37WZ33W69x33323ctVVV1111VX/sQiuuuqqq6666j/B537u5/4WwFOf+lT+/M//HElIQhKSkIQkJHHVVQ8kCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlI4v8rSUhCEpKQhCQkIQlJSEISkpCEJP43kYQkJCEJSUhCEpKQhCQk8T+NJCQhCUlIQhKSkIQk/ieQhCQkIQlJSEISkvjvJAlJSEISkpCEJP47SEISkpCEJCQhiT/5kz/hyU9+Mtdcc82D3/Ed3/GzuOqqq6666qr/eARXXXXVVVdd9R/sxV7sxV77xV7sxV4b4Id/+Ie56qr/qSQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSOL/OklIQhKSkIQkJCEJSUhCEpL430ISkpCEJCQhCUlIQhKS+J9EEpKQhCQkIQlJSEIS/90kIQlJSEISkpCEJP67SEISkpCEJCQhif8OkviBH/gBAF7ndV7nvV/8xV/8tbnqqquuuuqq/1gEV1111VVXXfUf7MM//MO/C+BXf/VXuXjxIldd9f+FJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQk8X+FJCQhCUlIQhKSkIQkJCEJSfxPJwlJSEISkpCEJCQhif9JJCEJSUhCEpKQhCT+u0lCEpKQhCQkIQlJ/HeQhCQkIQlJSEIS/5kuXLjAD/zADwDw4R/+4d/NVVddddVVV/3HIrjqqquuuuqq/0Af/uEf/l3XXHPNg5/61Kfyq7/6q/x3k4QkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQxFX/9SQhCUlIQhKSkIQkJCEJSUhCEpKQxP9mkpCEJCQhCUlIQhKSkIQk/qeShCQkIQlJSEISkpCEJP4nkIQkJCEJSUhCEpKQxH8nSUhCEpKQhCQk8d9BEpKQhCQkIQlJ/Ed48pOfzJOf/GTOnDnzoA//8A//Lq666qqrrrrqPw7BVVddddVVV/0HebEXe7HXfp3XeZ33Bvi1X/s1JCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkcdW/nyQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhiav+ZZKQhCQkIQlJSEISkpCEJCQhCUn8byMJSUhCEpKQhCQkIQlJSOJ/IklIQhKSkIQkJCEJSfxPIAlJSEISkpCEJCTx30USkpCEJCQhCUn8d5CEJCQhCUlIQhIvqgsXLvADP/ADALzO67zOe7/Yi73Ya3PVVVddddVV/zEIrrrqqquuuuo/yDu90zt9FsCv/uqv8tSnPpWrrvqPJglJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQk8f+ZJCQhCUlIQhKSkIQkJCEJSUjifwtJSEISkpCEJCQhCUlI4n8aSUhCEpKQhCQkIYn/CSQhCUlIQhKSkMR/F0lIQhKSkIQkJPHfQRKSkIQkJCGJ5+fChQv80i/9EgAf/uEf/l1cddVVV1111X8MyvHjx7nqqquuuuqqf693fMd3/KzXeZ3Xee+nPvWp/OiP/ihXXfW/kSQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCGJ/w8kIQlJSEISkpCEJCQhCUlI4n86SUhCEpKQhCQkIQlJSOJ/CklIQhKSkIQkJCEJSfx3koQkJCEJSUhCEpL47yAJSUhCEpKQhCT+q0lCEpKQhCQkceHCBW688UZuueWW49dcc82D//RP//RnuOqqq6666qp/H4Krrrrqqquu+nd6sRd7sdd+p3d6p88G+LVf+zWuAklIQhKSkIQkJCEJSUhCEpKQhCQkcdX/DZKQhCQkIQlJSEISkpCEJCQhCUlIQhKS+L9GEpKQhCQkIQlJSEISkpDE/2SSkIQkJCEJSUhCEpL4n0ISkpCEJCQhCUlI4r+TJCQhCUlIQhKS+O8gCUlIQhKSkIQk/itduHCBH/zBHwTgxV7sxV77xV7sxV6bq6666qqrrvr3Ibjqqquuuuqqf6d3eqd3+iyAX/3VX+WpT30qLwpJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhiX8PSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJXPWikYQkJCEJSUhCEpKQhCQkIQlJSOL/AklIQhKSkIQkJCEJSUhCEv8TSUISkpCEJCQhCUlI4n8CSUhCEpKQhCQkIYn/LpKQhCQkIQlJSEIS/9UkIQlJSEISkpDEf4YLFy7wS7/0S1xzzTUP/vAP//Dv4qqrrrrqqqv+fSjHjx/nqquuuuqqq/6t3vEd3/GzXud1Xue9L168yPd+7/ciCUlIQhKSkIQkJCEJSVz1/5skJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJPH/lSQkIQlJSEISkpCEJCQhCUlIQhL/W0lCEpKQhCQkIQlJSEIS/9NIQhKSkIQkJCEJSUjiv5skJCEJSUhCEpKQxH8XSUhCEpKQhCQk8V9NEpKQhCQkIYl/rwsXLvCSL/mSnD59+rgk/cM//MNvc9VVV1111VX/NpTjx49z1VVXXXXVVf8W11xzzYM/6ZM+6acBvud7voeLFy9y1VX/k0hCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQk/i+ThCQkIQlJSEISkpCEJCQhif9tJCEJSUhCEpKQhCQkIYn/SSQhCUlIQhKSkIQk/rtJQhKSkIQkJCGJ/y6SkIQkJCEJSUjiv5IkJCEJSUhCEpJ4USyXS+68805e6ZVeiWuuueYhT3/60//67Nmzt3LVVVddddVV/3oEV1111VVXXfVv9OEf/uHfBfDnf/7nPO1pT+Oqq/4/kIQkJCEJSUhCEpKQhCQkIQlJSEISkpDE/xWSkIQkJCEJSUhCEpKQhCQk8b+FJCQhCUlIQhKSkIQk/qeQhCQkIQlJSEISkpDEfxdJSEISkpCEJCQhif8OkpCEJCQhCUn8V5OEJCQhCUlI4rk95SlP4U//9E85c+bMgz78wz/8u7jqqquuuuqqfxvK8ePHueqqq6666qp/rdd5ndd57zd/8zf/6IsXL/It3/It/GeShCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJXPXvIwlJSEISkpCEJCQhCUlIQhKSkIQk/jeThCQkIQlJSEISkpCEJCTxP50kJCEJSUhCEpKQhCQk8T+BJCQhCUlIQhKSkMR/F0lIQhKSkIQkJPFfTRKSkIQkJCEJSfxXkoQkJCEJSdx55528xEu8BKdPnz4O8A//8A+/w1VXXXXVVVf96xBcddVVV1111b/SNddc8+AP//AP/y6AH/3RH0USkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSOKq/3kkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkrgKJCEJSUhCEpKQhCQkIQlJSEISkvjfRhKSkIQkJCEJSUhCEpL4n04SkpCEJCQhCUlI4n8CSUhCEpKQhCQk8d9FEpKQhCQkIQlJ/FeThCQkIQlJSEIS/xUuXLjAD/7gDwLwOq/zOu99zTXXPJirrrrqqquu+tchuOqqq6666qp/pQ//8A//LoC/+Iu/4GlPexpXXfVfRRKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhif8PJCEJSUhCEpKQhCQkIQlJSEIS/xtIQhKSkIQkJCEJSUhCEv9TSUISkpCEJCQhCUlI4r+TJCQhCUlIQhKSkMR/B0lIQhKSkIQkJPFfTRKSkIQkJCGJ/2hPecpT+NM//VOuueaaB3/4h3/4d3HVVVddddVV/zoEV1111VVXXfWv8Dqv8zrv/WIv9mKvDfCjP/qjXHXV/wWSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJP4vkYQkJCEJSUhCEpKQhCQkIYn/ySQhCUlIQhKSkIQkJCGJ/4kkIQlJSEISkpCEJP47SUISkpCEJCQhif8OkpCEJCQhCUlI4r+SJCQhCUlIQhKS+Lf65V/+ZS5cuMCLvdiLvfbrvM7rvDdXXXXVVVdd9aKjHD9+nKuuuuqqq656UVxzzTUP/tzP/dzfAviWb/kWLl68yP8WkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSVz1X08SkpCEJCQhCUlIQhKSkIQkJCEJSfxvJwlJSEISkpCEJCQhCUlI4n8qSUhCEpKQhCQkIQlJ/E8jCUlIQhKSkIQkJPHfRRKSkIQkJCEJSUjiv5okJCEJSUhCEpL4ryQJSUhCEpKQxL9kuVyyXC55iZd4CR784Ae/9J/92Z/9zOHh4S5XXXXVVVdd9S8juOqqq6666qoX0Yd/+Id/F8DTnvY0nva0p/HcJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpDE/1eSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSOKq5yUJSUhCEpKQhCQkIQlJSEISkpCEJP63kYQkJCEJSUhCEpKQhCQk8T+NJCQhCUlIQhKSkIQk/ieRhCQkIQlJSEISkvjvIglJSEISkpCEJP6rSUISkpCEJCTxX0kSkpCEJCQhiQf60z/9U57ylKdwzTXXPPgd3/EdP4urrrrqqquuetEQXHXVVVddddWL4MVe7MVe+8Ve7MVeG+DHfuzHkIQkJCEJSVx11b+GJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpDE/zeSkIQkJCEJSUhCEpKQhCQkIYn/LSQhCUlIQhKSkIQkJCGJ/0kkIQlJSEISkpCEJCTxP4UkJCEJSUhCEpKQxH8HSUhCEpKQhCQk8V9JEpKQhCQkIQlJ/FeRhCQkIYkf+qEfAuB1Xud13vt1Xud13purrrrqqquu+pehBz3oQVx11VVXXXXVv+QnfuInDPBjP/Zj/MVf/AVXXfX/jW3+v7PN/wW2+d/ANv/T2eZ/Etv8d7PNf7ZXfMVX5F3e5V247777bv2QD/mQh3DVVVddddVVLxzBVVddddVVV/0LPvdzP/e3AJ72tKfxF3/xF1x11f9HkpCEJCQhCUlIQhKSkIQkJCEJSUhCEv8XSEISkpCEJCQhCUlIQhKS+J9MEpKQhCQkIQlJSEIS/xNIQhKSkIQkJCEJSfxPIAlJSEISkpCEJP47SEISkpCEJCTxX0kSkpCEJCQhCUn8R/nTP/1TnvKUp3DNNdc8+MM//MO/i6uuuuqqq6564Qiuuuqqq6666oV4sRd7sdd+sRd7sdcG+LEf+zH+I0hCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSuOpFJwlJSEISkpCEJCQhCUlIQhKSkIQk/jeShCQkIQlJSEISkpCEJCTxP5EkJCEJSUhCEpKQhCT+u0lCEpKQhCQkIQlJ/HeThCQkIQlJSEIS/9UkIQlJSEISkpDEfyVJSEISkpCEJP4tfuiHfgiA13md13nvF3uxF3ttrrrqqquuuuoFI7jqqquuuuqqF+LDP/zDvwvg13/919nd3UUSkpCEJCQhCUlIQhKSkIQkJCEJSUhCElf93yEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUji/zNJSEISkpCEJCQhCUlIQhKSkMT/JpKQhCQkIQlJSEISkpDE/zSSkIQkJCEJSUhCEv/dJCEJSUhCEpKQhCT+O0lCEpKQhCQkIYn/apKQhCQkIQlJ/FeShCQkIQlJSOKFuXDhAj/0Qz8EwId/+Id/F1ddddVVV131ghFcddVVV1111Qvw4R/+4d91zTXXPPhpT3sav/Ebv8FVV/13koQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUn8XyYJSUhCEpKQhCQkIQlJSEISkvifThKSkIQkJCEJSUhCEpL4n0ISkpCEJCQhCUlIQhL/nSQhCUlIQhKSkMR/J0lIQhKSkIQkJPFfSRKSkIQkJCEJSfxXkYQkJCEJSUjifk95ylN4ylOewjXXXPPgD//wD/8urrrqqquuuur5I7jqqquuuuqq5+PFXuzFXvt1Xud13hvgN37jN7jqqv+LJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhif8rJCEJSUhCEpKQhCQkIQlJ/E8mCUlIQhKSkIQkJCGJ/ykkIQlJSEISkpCEJP67SEISkpCEJCQhCUn8d5GEJCQhCUlIQhL/lSQhCUlIQhKS+K8iCUlcvHiRH/7hHwbgdV7ndd77xV/8xV+bq6666qqrrnpeBFddddVVV131fLzTO73TZwH8+q//Ok972tP4n0ASkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSuOo/niQkIQlJSEISkpCEJCQhCUlIQhKS+N9KEpKQhCQkIQlJSEISkpDE/0SSkIQkJCEJSUhCEpL4n0ASkpCEJCQhCUlI4r+LJCQhCUlIQhKS+O8iCUlIQhKSkIQk/qtIQhKSkIQkJPGf6cKFC/zKr/wKAB/+4R/+3Vx11VVXXXXV8yK46qqrrrrqqufyju/4jp/1Yi/2Yq998eJFfuM3fgMASUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJXPUfQxKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpK46gpJSEISkpCEJCQhCUlIQhKSkIQk/jeRhCQkIQlJSEISkpCEJP6nkYQkJCEJSUhCEpKQxH83SUhCEpKQhCQkIYn/DpKQhCQkIQlJSOK/iyQkIQlJSEIS/1UkIQlJSEISkviP8md/9mc85SlP4cyZMw/68A//8O/iqquuuuqqq54TwVVXXXXVVVc9wIu92Iu99ju90zt9NsCP//iPIwlJXHXVfzRJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCT+v5CEJCQhCUlIQhKSkIQkJCGJ/w0kIQlJSEISkpCEJCQhif9JJCEJSUhCEpKQhCQk8d9JEpKQhCQkIQlJ/HeQhCQkIQlJSEIS/x0kIQlJSEISkpDEfwVJSEISkpCEJP61Lly4wA//8A8D8GIv9mKv/WIv9mKvzVVXXXXVVVc9G8FVV1111VVXPcA7vdM7fRbAb/zGb/D0pz+dq67630YSkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQxP8lkpCEJCQhCUlIQhKSkIQkJPE/mSQkIQlJSEISkpCEJCTxP4UkJCEJSUhCEpKQxH8XSUhCEpKQhCQkIYn/apKQhCQkIQlJSOK/gyQkIQlJSEIS/xUkIQlJSEISknhhLly4wK/8yq9wzTXXPPjDP/zDv4urrrrqqquuejbK8ePHueqqq6666iqAd3zHd/ys13md13nvixcv8v3f//1c9ZwkIQlJSEISkpCEJCQhCUlIQhKSuOp/L0lIQhKSkIQkJCEJSUhCEpKQhCQkIYn/zSQhCUlIQhKSkIQkJCEJSfxPJQlJSEISkpCEJCQhif8JJCEJSUhCEpKQhCT+u0hCEpKQhCQkIYn/apKQhCQkIQlJ/HeQhCQkIQlJSOK/giQkIQlJSEIS97tw4QIv8RIvwenTp48D/MM//MPvcNVVV1111VVAOX78OFddddVVV111zTXXPPiTPumTfhrg+7//+9nd3eXfQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSfxbSUISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhiateOElIQhKSkIQkJCEJSUhCEpKQhCT+t5GEJCQhCUlIQhKSkIQkJPE/jSQkIQlJSEISkpCEJP67SUISkpCEJCQhCUn8d5CEJCQhCUlIQhL/lSQhCUlIQhKSkMR/NUlIQhKSkIQk/itIQhKr1Yq77rqLV3iFV+Caa6558K233vo3Z8+evZWrrrrqqqv+vyO46qqrrrrqKuDDP/zDvwvgL//yL7n11luRhCQkIQlJSEISkpCEJCQhCUlI4qr/XyQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCTx/5EkJCEJSUhCEpKQhCQkIQlJSOJ/C0lIQhKSkIQkJCEJSUjifxJJSEISkpCEJCQhif9ukpCEJCQhCUlI4r+DJCQhCUlIQhKS+K8kCUlIQhKSkMR/NUlIQhKSkIQk/rM89alP5c/+7M+45pprHvzhH/7h38VVV1111VVXAeX48eNcddVVV131/9vrvM7rvPebv/mbf/TFixf5ju/4Dq666n8SSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKS+L9KEpKQhCQkIQlJSEISkpCEJP6nk4QkJCEJSUhCEpKQxP8UkpCEJCQhCUlIQhKS+O8iCUlIQhKSkIQk/jtIQhKSkIQkJCGJ/yqSkIQkJCEJSUjiv5IkJCEJSUhCEv8R7rrrLl78xV+c06dPH5ekf/iHf/htrrrqqquu+v+M4Kqrrrrqqv/Xrrnmmgd/+Id/+HcB/MRP/ARXXfV/nSQkIQlJSEISkpCEJCQhCUlIQhKSkIQk/i+QhCQkIQlJSEISkpCEJCTxP5UkJCEJSUhCEpKQhCQk8T+BJCQhCUlIQhKSkMR/B0lIQhKSkIQkJCGJ/2qSkIQkJCEJSfxXkoQkJCEJSUjiv5IkJCEJSUhCEv8aFy5c4Id/+IcBeJ3XeZ33vuaaax7MVVddddVV/58RXHXVVVdd9f/ah3/4h38XwNOf/nSe/vSn899BEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJHHVv48kJCEJSUhCEpKQhCQkIQlJSEISkvjfSBKSkIQkJCEJSUhCEpKQxP9EkpCEJCQhCUlIQhL/E0hCEpKQhCQkIYn/LpKQhCQkIQlJSOK/kiQkIQlJSEISkvivIglJSEISkpDEfyVJSEISkpCEJF6Qpz71qfzZn/0ZZ86cedCHf/iHfxdXXXXVVVf9f0Zw1VVXXXXV/1uv8zqv894v9mIv9toA3/7t344kJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCElf915OEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlI4iqQhCQkIQlJSEISkpCEJCQhCUn8byIJSUhCEpKQhCQkIQlJ/E8iCUlIQhKSkIQkJCGJ/06SkIQkJCEJSUhCEv8dJCEJSUhCEpKQxH8lSUhCEpKQhCT+q0hCEpKQhCQk8V9JEpKQhCQkcb9f/dVf5cKFC7zYi73Ya7/O67zOe3PVVVddddX/V5Tjx49z1VVXXXXV/09f8RVf8VcA3/Ed38Hu7i5XXfWfTRKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhif/rJCEJSUhCEpKQhCQkIQlJSOJ/A0lIQhKSkIQkJCEJSUjifwpJSEISkpCEJCQhif9OkpCEJCQhCUlI4r+DJCQhCUlIQhL/lSQhCUlIQhKS+K8iCUlIQhKSkMR/FUlIYrVasVwuefEXf3Ee/OAHv/Sf/dmf/czh4eEuV1111VVX/X9DcNVVV1111f9Ln/u5n/tbAE9/+tN5+tOfzlVX/W8mCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJ/F8hCUlIQhKSkIQkJCEJSUhCEv+TSUISkpCEJCQhCUlI4n8CSUhCEpKQhCQkIYn/LpKQhCQkIQlJSEIS/5UkIQlJSEISkpDEfxVJSEISkpCEJCTxX0ESkpCEJCQhif9Mf/7nf85Tn/pUrrnmmge/4zu+42dx1VVXXXXV/0cEV1111VVX/b/zYi/2Yq/9Yi/2Yq8N8BM/8RP8XyUJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhJX/feThCQkIQlJSEISkpCEJCQhCUlIQhL/m0lCEpKQhCQkIQlJSEISkvifSBKSkIQkJCEJSUhCEv/dJCEJSUhCEpKQhCT+u0hCEpKQhCQkIYn/SpKQhCQkIQlJSOK/iiQkIQlJSEIS/xUkIQlJSEISkviP8sM//MMAvM7rvM57v87rvM57c9VVV1111f836EEPehBXXXXVVVf9//JN3/RNT7/mmmse/BM/8RP81V/9Ff9akrjq/zfbXPUfwzb/F9nmfxvb/E9lm/9JbPPfzTb/nWzz38E2/xYv//Ivzzu/8ztz33333fohH/IhD+Gqq6666qr/Twiuuuqqq676f+VzP/dzf+uaa6558NOf/nT++q//GklIQhKSkIQkJCEJSUhCEpKQxFVXSUISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJ/H8iCUlIQhKSkIQkJCEJSUhCEpL430ASkpCEJCQhCUlIQhKS+J9EEpKQhCQkIQlJSOK/kyQkIQlJSEISkvjvIAlJSEISkpDEfyVJSEISkpCEJP6rSEISkpCEJCTxn00SkpCEJCQhiX/Jn//5n/PUpz6Va6655sEf/uEf/l1cddVVV131/wnBVVddddVV/2+82Iu92Gu/2Iu92GsD/NZv/RZXXfU/lSQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCGJ/4skIQlJSEISkpCEJCQhCUlI4n8ySUhCEpKQhCQkIQlJ/E8hCUlIQhKSkIQkJPHfRRKSkIQkJCEJSfxXk4QkJCEJSUhCEv9VJCEJSUhCEpKQxH8FSUhCEpKQhCT+s0lCEpKQhCSe2w//8A8D8Dqv8zrv/WIv9mKvzVVXXXXVVf9fEFx11VVXXfX/xod/+Id/F8Bv/uZv8vSnP52rrvr/QBKSkIQkJCEJSUhCEpKQhCQkIQlJSOL/AklIQhKSkIQkJCEJSUhCEv8TSUISkpCEJCQhCUlI4n8CSUhCEpKQhCQkIYn/DpKQhCQkIQlJSEIS/5UkIQlJSEISkpDEfxVJSEISkpCEJP4rSEISkpCEJP6zSUISkpDE7u4uP/IjPwLAh3/4h38XV1111VVX/X9BcNVVV1111f8LH/7hH/5d11xzzYOf/vSn81u/9Vv8V5OEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJK7615OEJCQhCUlIQhKSkIQkJCEJSUhCEv8bSUISkpCEJCQhCUlIQhL/00hCEpKQhCQkIQlJSOK/myQkIQlJSEISkpDEfwdJSEISkpCEJCTxX0kSkpCEJCQhif8qkpCEJCQhCUn8Z5OEJCQhCUlI4j/TU5/6VJ761KdyzTXXPPjDP/zDv4urrrrqqqv+PyC46qqrrrrq/7wXe7EXe+3XeZ3XeW+A3/qt30ISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCRx1f8MkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhif/PJCEJSUhCEpKQhCQkIQlJSEIS/1tIQhKSkIQkJCEJSUhCEv+TSEISkpCEJCQhCUlI4r+TJCQhCUlIQhKS+O8gCUlIQhKSkMR/JUlIQhKSkIQk/qtIQhKSkIQkJPGfTRKSkIQkJCGJ/wgXL17kR37kRwB4sRd7sdd+sRd7sdfmqquuuuqq/+sIrrrqqquu+j/vnd7pnT4L4Ld+67e49dZbueqq/0qSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhif/LJCEJSUhCEpKQhCQkIQlJSOJ/OklIQhKSkIQkJCEJSUjifwpJSEISkpCEJCQhif8ukpCEJCQhCUlI4r+aJCQhCUlIQhKS+K8iCUlIQhKSkIQk/itIQhKSkIQk/itIQhKSkIQk/i0uXrzIr/7qr3LNNdc8+MM//MO/i6uuuuqqq/6vI7jqqquuuur/tHd8x3f8rBd7sRd77d3dXX7rt36Lq676v0ASkpCEJCQhCUlIQhKSkIQkJCEJSUhCEv9XSEISkpCEJCQhCUlIQhKS+J9MEpKQhCQkIQlJSEIS/xNIQhKSkIQkJCEJSfx3kIQkJCEJSUhCEv/VJCEJSUhCEpKQxH8VSUhCEpKQhCT+s0lCEpKQhCQk8Z9NEpKQhCQkIYl/yZ//+Z/z1Kc+lWuuuebBH/7hH/5dXHXVVVdd9X8ZwVVXXXXVVf9nvdiLvdhrv9M7vdNnA/zkT/4k/9dIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSuOq/niQkIQlJSEISkpCEJCQhCUlIQhKS+N9KEpKQhCQkIQlJSEISkpDE/0SSkIQkJCEJSUhCEpL47yYJSUhCEpKQhCT+O0hCEpKQhCQkIYn/apKQhCQkIQlJ/FeRhCQkIQlJSOI/myQkIQlJSEIS/9kkIQlJSEISD3Tx4kV+5Ed+BIAXe7EXe+0Xf/EXf22uuuqqq676v4rgqquuuuqq/7Pe6Z3e6bMA/uqv/opbb72VfwtJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJPF/iSQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkMRVz0kSkpCEJCQhCUlIQhKSkIQkJCGJ/00kIQlJSEISkpCEJCQhif9pJCEJSUhCEpKQhCT+O0lCEpKQhCQkIQlJ/FeThCQkIQlJSEIS/5UkIQlJSEISkvivIglJSEISkpDEfzZJSEISkpCEJP4zSUISkpDE7u4uv/Zrv8Y111zz4A//8A//bq666qqrrvq/inL8+HGuuuqqq676v+cd3/EdP+t1Xud13nt3d5fv/u7vRhKSkIQkJCEJSUhCEpKQhCQkIYmrrgKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEv+fSEISkpCEJCQhCUlIQhKSkMT/BpKQhCQkIQlJSEISkpDE/xSSkIQkJCEJSUhCEv+dJCEJSUhCEpKQxH81SUhCEpKQhCQk8V9FEpKQhCQkIQlJ/FeQhCQkIQlJ/FeQhCQkIQlJ/Ge6ePEiL/7iL86pU6eOA/zDP/zD73DVVVddddX/NZTjx49z1VVXXXXV/y3XXHPNgz/pkz7ppwF+6Id+iN3dXa666n8qSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhL/10hCEpKQhCQkIQlJSEISkpDE/2SSkIQkJCEJSUhCEpL4n0ASkpCEJCQhCUlI4r+LJCQhCUlIQhKS+K8mCUlIQhKSkIQk/qtIQhKSkIQkJPGfTRKSkIQkJCGJ/2ySkIQkJCEJSfxHWK1W3HXXXbz8y78811xzzYNvvfXWvzl79uytXHXVVVdd9X8JwVVXXXXVVf/nfPiHf/h3Afz1X/81t956K1dd9f+FJCQhCUlIQhKSkIQkJCEJSUhCEpKQxP92kpCEJCQhCUlIQhKSkIQk/ieShCQkIQlJSEISkpDEfzdJSEISkpCEJCQhif8OkpCEJCQhCUlI4r+aJCQhCUlIQhL/VSQhCUlIQhKS+M8mCUlIQhKSkMR/NklIQhKSkMS/xdOe9jT+/M//nGuuuebB7/RO7/RZXHXVVVdd9X8N5fjx41x11VVXXfV/x+u8zuu895u/+Zt/9O7uLt/1Xd/FfxdJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJXPWvJwlJSEISkpCEJCQhCUlIQhKSkMT/RpKQhCQkIQlJSEISkpDE/zSSkIQkJCEJSUhCEpL47yQJSUhCEpKQhCQk8V9NEpKQhCQkIQlJ/FeShCQkIQlJSOK/iiQkIQlJSEIS/9kkIQlJSEISkvjPJAlJSEISknhR3HXXXbz4i784t9xyy4MB/uEf/uF3uOqqq6666v8Kgquuuuqqq/7PuOaaax784R/+4d8F8FM/9VM8kCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJXPXfTxKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJPH/lSQkIQlJSEISkpCEJCQhCUlI4n8LSUhCEpKQhCQkIQlJSOJ/EklIQhKSkIQkJCGJ/06SkIQkJCEJSUjiv5okJCEJSUhCEpL4ryIJSUhCEpKQhCT+K0hCEpKQhCT+K0hCEpKQhCT+M0lCEpKQhCQk8UAXL17k137t1wB4ndd5nfe+5pprHsxVV1111VX/VxBcddVVV131f8aHf/iHfxfArbfeyjOe8QwkIQlJXHXVfwVJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpL4v0wSkpCEJCQhCUlIQhKSkIQk/qeThCQkIQlJSEISkpDE/xSSkIQkJCEJSUhCEv9dJCEJSUhCEpKQxH81SUhCEpKQhCQk8V9FEpKQhCQkIYn/bJKQhCQkIQlJ/GeThCQkIQlJSOI/kyQkIQlJ/MVf/AV//ud/zjXXXPPgD//wD/8urrrqqquu+r+CylVXXXXVVf8nvM7rvM57v9iLvdhrA3z3d383V/3Pcfz4ce53/Phxntvu7i67u7tc9bwk8e9lm/8LJPGiss3/RJL4l9jmv5skXhjb/FeTxAtim/9Kknh+bPNfQRLPj23+M0ni+bHNfyZJPDfb/Gf59V//dV7+5V+eF3uxF3vt13md13nv3/qt3/purrrqqquu+t8OPehBD+Kqq6666qr//X7iJ37CAN/93d/Nrbfeyv9lkvif5Pjx4xw/fpwHPehBADz4wQ/m+PHjABw/fpwXZnd3l+PHjwOwu7sLwO7uLru7u9x6663s7u5y6623ctV/D9v8X2eb/21s8z+Vbf4nsc1/N9v8d7LNfzXb/FezzX+Ul3u5l+Md3/EdOXv27DM+8zM/87Xvu+++W7nqqquuuup/MypXXXXVVVf9r/e5n/u5vwVw6623cuutt/LvJYmrXrDjx4/z4Ac/mAc96EG89Eu/NP+SaZqwzTAMZCa2sU1mYpvlcsliseD48eMAHD9+HICXfumXBmB3d5fd3V1uvfVWnvGMZ3Drrbfyn8U2Vz2bJP4tbPO/hSReFLb5n0ISL4xt/rtI4oWxzX8lSbwgtvmvIIkXxDb/2STx3Gzzn0kSz49t/rNI4vmxzb/WX/zFX/DyL//yPPShD33QO77jO37W13/9178PV1111VVX/W+GHvSgB3HVVVddddX/Xi/2Yi/22p/7uZ/7WwBf8zVfw+7uLlf9xzt+/Dgv9VIvxWu/9mvz3NbrNQC7u7uUUliv10QEwzBgm8xkmibGcWQYBoZhYBgGxnFkmiamaWKaJmazGa01FosFi8WCa665hs3NTa699loeaHd3l7/+67/md37nd/jfxDZXPX+2+b/ANv9b2OZ/Gtv8T2Cb/262+e9gm/8OtvmvZJt/yYkTJ/jkT/5kAD7zMz/zdf7hH/7ht7nqqquuuup/K/SgBz2Iq6666qqr/vf6pm/6pqdfc801D/6Zn/kZ/vqv/5qr/uMcP36cl3qpl+K1X/u1eaCjoyPuuOMOSins7+9zeHjIbDaj73v6vqfrOkopRAS2yUymaWIcR4ZhYBgGhmFgHEfGcWSaJqZporVGa43MJDPJTDKTjY0NrrnmGq699loe8YhHcL/d3V3++q//mt/5nd/h/xvb/H9mm//NbPM/mW3+p7HN/wS2+e9km/8OtvmvZpv/SrZ5bi/3ci/HO77jO3Lffffd+iEf8iEP4aqrrrrqqv+tKMePH+eqq6666qr/nT73cz/3tx7ykIe89K233sqv/MqvcNV/jAc/+MG81Vu9FW/8xm/Mgx/8YAAODw958pOfzF/8xV/w5Cc/md3dXS5dusQwDJRSqLVSSqGUQimFiEASkgCwTWaSmWQmmUlmkpnYxja2sY1tbGMb26zXa86fP88znvEMnvjEJ3Lu3Dn6vufMmTM8+MEP5qVf+qV54hOfyGq14v8LSUhCEpKQhCQkIQlJSEISkpCEJCQhif/tJCEJSUhCEpKQhCQkIYn/qSQhCUlIQhKSkIQk/rtJQhKSkIQkJCEJSfx3kIQkJCEJSUhCEv+VJCEJSUhCEpL4ryIJSUhCEpKQxH82SUhCEpKQhCT+M0lCEpKQhCT+M0lCEpKQhCTuuusuHvawh3HTTTcdv+aaax78p3/6pz/DVVddddVV/xuhBz3oQVx11VVXXfW/z4u92Iu99ud+7uf+FsD3fM/3cOutt/I/hST+Nzp+/Djv+Z7vyfHjxwE4ODjgKU95Ck9/+tNZrVaUUiilUGul1krXdXRdR9/39H3PbDaj73u6rqPWSkQAkJlM08Q4jgzDwDAMDMPAMAyM48g0TUzTRGuN1hqtNTKTzCQzyUwyk8wkM8lMMpONjQ3e+q3fmp2dHXZ3d/nrv/5rfud3foer/vPY5v8q2/xvYpv/qWzzP4Vt/rvZ5r+Dbf472Oa/mm3+s5w4cYJP+qRPAuAzP/MzX+cf/uEffpurrrrqqqv+t6EcP36cq6666qqr/vf53M/93N/a3Nw8/tu//dv8zd/8DS+IJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlI4n+b48eP80Zv9Ea81Vu9FfP5nP39ff7hH/6B3/zN3+S+++5jmiYkIYmIQBKlFCKCUgqlFEop1FoppVBKISKICCQBYJvMJDPJTDKTzCQzsY1tMhPbANjGNraxjW1sYxvb2Ga1WvHUpz6V5XLJIx7xCI4fP869997LpUuXkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlI4v87SUhCEpKQhCQkIQlJSEISkpDE/xaSkIQkJCEJSUhCEpL4n0QSkpCEJCQhCUlI4r+TJCQhCUlIQhKS+K8mCUlIQhKSkMR/JUlIQhKSkIQk/rNJQhKSkIQkJPGfTRKSkIQkJCGJ/0ySkIQkJCGJ/yir1YqLFy/yYi/2YrzYi73Ya//CL/zC13DVVVddddX/NpTjx49z1VVXXXXV/y4f/uEf/l0v/uIv/tq33norP/uzP4skJCEJSUhCEpK46oU7fvw4b/mWb8mjH/1oAP7sz/6MX/u1X+Oee+4hIpBERCCJiCAiiAgiglIKpRRKKZRSqLVSSqHWSikFSdzPNplJZpKZZCaZSWaSmWQmtrGNbe5nm+dmG9vYZrVacfvtt5OZPPKRj+TBD34wf/Inf8J/FklIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpDE/3WSkIQkJCEJSUhCEpKQhCT+p5OEJCQhCUlIQhKSkIQk/ieQhCQkIQlJSEISkvjvIglJSEISkpCEJP4rSUISkpCEJCQhif8qkpCEJCQhCUn8Z5OEJCQhCUlI4j+bJCQhCUlI4j+TJCQhCUlI4t9qtVpxww03cNNNNx2/5pprHvynf/qnP8NVV1111VX/mxBcddVVV131v8qLvdiLvfbrvM7rvDfA7/zO73DVv91LvdRL8Z7v+Z48+MEP5o477uB7v/d7+fM//3NeGNs8kG1s8/xIQhKSkIQkJCEJSUgCQBKSeH4k8dwkASAJSQD8wR/8Ac94xjMAeK3Xei3+N5GEJCQhCUlIQhKSkIQkJCEJSUhCEpKQxP8VkpCEJCQhCUlIQhKSkIQk/ieThCQkIQlJSEISkvifQBKSkIQkJCEJSUjiv4MkJCEJSUhCEpL4ryQJSUhCEpKQxH8VSUhCEpKQhCT+s0lCEpKQhCQk8Z9JEpKQhCQk8Z9JEpKQhCQk8aK4ePEiP/ZjPwbAi7/4i7/Oi73Yi702V1111VVX/W9CcNVVV1111f8q7/RO7/RZAL/zO7/DM57xDK56wSQhCUlIQhKSkMSDH/xgXuu1Xovjx4/zR3/0R/zkT/4ke3t7PD+2+deSBIAkJCEJSUhCEveTxP0kASCJf4kkHkgSv/d7v8fx48c5fvw4/99IQhKSkIQkJCEJSUhCEpKQhCQkIYn/rSQhCUlIQhKSkIQkJCEJSfxPIwlJSEISkpCEJCQhif9ukpCEJCQhCUlI4r+DJCQhCUlIQhKS+K8iCUlIQhKSkIQk/itIQhKSkIQkJPGfTRKSkIQkJPGfSRKSkIQkJCGJ/yySkIQkJCGJ5+fixYv8+q//OmfOnHnQh3/4h38XV1111VVX/W9CcNVVV1111f8a7/iO7/hZL/ZiL/bau7u7/M7v/A7/WSQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhiRfkQQ96EO/5nu/J8ePH+cVf/EX+6I/+CNs8N9v8e0hCEpKQhCQkIQlJSEISkpAEgCQAJPGikgTA7u4uAMePH0cSkpCEJCRx1fMnCUlIQhKSkIQkJCEJSUhCEpKQxP8mkpCEJCQhCUlIQhKSkMT/JJKQhCQkIQlJSEIS/50kIQlJSEISkpCEJP6rSUISkpCEJCTxX0kSkpCEJCQhif8KkpCEJCQhif9skpCEJCQhCUn8Z5KEJCQhCUn8Z5GEJCQhCUkA/MVf/AVPe9rTuOaaax78ju/4jp/FVVddddVV/1sQXHXVVVdd9b/Ci73Yi732O73TO302wM/+7M8iCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJP6ve63Xei0Afu/3fo+///u/57nZ5kVhm+dHEpKQhCQkIYmIICKQhCQk8cJI4n6SkIQkHkgSAJLY29vjhZGEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkvj/RhKSkIQkJCEJSUhCEpKQhCT+N5CEJCQhCUlIQhKSkMT/FJKQhCQkIQlJSEIS/50kIQlJSEISkpDEfyVJSEISkpCEJCTxX0USkpCEJCQhif9skpCEJCQhCUn8Z5OEJCQhCUn8Z5KEJCQhCUn8Z5HE7u4uP/7jPw7A67zO67z3i73Yi702V1111VVX/W9AcNVVV1111f8K7/RO7/RZAH/zN3/DM57xDK76t3nQgx7Egx70IHZ3d/nd3/1dbGObfw3b2OaBbGOb5yYJSUQEkpCEJCQhCUlIQhKSkIQk7icJSTyQJAAkASAJgJd8yZfkv5MkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhif+LJCEJSUhCEpKQhCQkIQlJ/E8mCUlIQhKSkIQkJCGJ/wkkIQlJSEISkpCEJP67SEISkpCEJCQhif9KkpCEJCQhCUn8V5GEJCQhCUlI4j+bJCQhCUlIQhL/mSQhCUlIQhL/mSQhCUlIQhL/kS5evMiv//qvc8011zz4wz/8w7+Lq6666qqr/jcguOqqq6666n+8d3zHd/ysF3uxF3vt3d1dfvZnf5ar/u0e9KAHAfBbv/VbvChscz/bPDfb2Ob5kQSAJCQhCUlIQhKSkIQk/rUk8UCSeI3XeA12d3f5m7/5G/63k4QkJCEJSUhCEpKQhCQkIQlJSEISkvjfThKSkIQkJCEJSUhCEpKQxP9EkpCEJCQhCUlIQhKS+O8mCUlIQhKSkIQkJPHfQRKSkIQkJCGJ/0qSkIQkJCEJSfxXkYQkJCEJSUjiP5skJCEJSUjiP5MkJCEJSUhCEv9ZJCEJSUhCEv8ef/mXf8nFixe55pprHvyO7/iOn8VVV1111VX/0xFcddVVV131P9o111zz4Hd6p3f6bICf/dmf5X8bSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISknjwgx8MwMWLF7HN/WwDYBsA2zyQbQBs86KQBIAkJCEJSUhCEpKQhCQAJCGJ+0niX+ON3/iNOXbsGJcuXeJv/uZv+P9OEpKQhCQkIQlJSEISkpCEJCQhif+NJCEJSUhCEpKQhCQkIYn/aSQhCUlIQhKSkIQk/rtJQhKSkIQkJCGJ/2qSkIQkJCEJSUjiv4okJCEJSUhCEpL4ryAJSUhCEpL4zyYJSUhCEpKQxH8mSUhCEpKQxH8WSUhCEpKQxIvq4sWL/PiP/zgAr/M6r/PeL/7iL/7aXHXVVVdd9T8Zlauuuuqqq/5H+/AP//DvAvibv/kbnvGMZ/BvIYmrXjDbANjmP5IkJAEgCUlIQhKSkIQkJHE/SUgCQBIvjCQk8YZv+IY85jGPYXd3l9/93d9FEv8Wtvn/ThL/Wrb530ASLwrb/E8giX+Jbf47SOIFsc1/JUm8ILb5ryCJ58c2/5kk8fzY5j+TJJ6bbf6zSOK52eY/gySem22en6c97Wn8xV/8BS/3ci/34Hd8x3f87L//+79/ba666qqrrvqfiuCqq6666qr/sV7ndV7nvV/sxV7stQF+7ud+DklIQhKSkIQkJCEJSUhCEpKQhCSuerZnPOMZ7O7u8jIv8zIA2ObfyjYvjCQkIQlJRAQRQUQQEUgCQBKSkMRzk4QkJCEJSUjifq/3eq/HYx7zGAC+//u/n2c84xn8W0lCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQk/j+QhCQkIQlJSEISkpCEJCQhif/pJCEJSUhCEpKQhCQk8T+FJCQhCUlIQhKS+O8iCUlIQhKSkIQk/qtJQhKSkIQkJPFfRRKSkIQkJCGJ/2ySkIQkJCEJSfxnkoQkJCEJSfxnkoQkJCEJSfxnkYQkJCEJSdzvN37jN7h48SIv9mIv9lrv+I7v+FlcddVVV131PxXBVVddddVV/yNdc801D/7wD//w7wL4vu/7Pq76j/GMZzyD48eP8+AHP5hjx47xorDNC2IbANs8kCQAJCEJSUhCEpKQhCQkIQlJAEhCEpJ4YXZ2dni3d3s3Hv3oR7O7u8v3fd/3sbu7y/80kpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQxP8lkpCEJCQhCUlIQhKSkIQk/qeShCQkIQlJSEISkpDEfzdJSEISkpCEJCQhif8OkpCEJCQhCUlI4r+SJCQhCUlIQhL/VSQhCUlIQhKS+M8mCUlIQhKS+M8kCUlIQhKSkMR/FklIQhKSkMR/FklIYnd3l9/4jd8A4HVe53Xe+5prrnkwV1111VVX/U9EOX78OFddddVVV/3P80mf9Ek/dc011zz4Gc94Br/7u7/LVf8xLl26xLFjx3jwgx/Mox71KJ785CczjiOSiAgiAklEBJKICCQREUQEEYEkIoJSCqUUSinUWqm1Umul6zpKKZRSkMT9bJOZtNZordFao7VGa43MxDaZiW1sA2Ab29jGNpubmzz2sY/lDd7gDZjNZvzu7/4uP/ZjP8alS5f4v0wSkpCEJCQhCUlIQhKSkIQkJCEJSfxvJglJSEISkpCEJCQhCUn8TyQJSUhCEpKQhCQk8d9NEpKQhCQkIQlJSOK/miQkIQlJSEISkvivIglJSEISkpCEJP4rSEISkpCEJP6zSUISkpCEJCTxn0kSkpCEJCTxn0USkpCEJCTxH+3uu+/m+PHjPOIRjzj+kIc85KV/67d+63u46qqrrrrqfxoqV1111VVX/Y/zOq/zOu/9Yi/2Yq8N8HM/93P8byGJ/w1+7/d+jwc/+MEcP36cd33Xd+WXfumXuPvuu/n3ss1zkwSAJCQhCUlIQhKSkIQkACTxQJIA2Nra4iEPeQgv/dIvDcAznvEMfvd3f5dnPOMZXPXCSeJfyzb/m0jiRWGb/ykk8S+xzX8XSbwgtvmvJInnxzb/VSTx/NjmP5Mknh/b/GeSxHOzzX8WSTw32/xnkMRzs82/x2/8xm/wci/3crzYi73Ya7/O67zOe//Wb/3Wd3PVVVddddX/JJTjx49z1VVXXXXV/yxf8RVf8VcA3/d938e9997Lv5YkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEv9brNdrnvjEJ7JarXjUox7FzTffzGw2Y39/n2EYiAgiAklEBJKICCQREUQEEUFEUEqhlEKtlVortVZqrZRSqLUSEUhCEpmJbTKT1hqtNVprZCatNWyTmdjGNhsbGzzykY/kJV7iJXj5l395rrvuOi5dusSf/umf8vM///NcunQJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlI4qrnJAlJSEISkpCEJCQhCUlIQhKS+N9AEpKQhCQkIQlJSEIS/5NIQhKSkIQkJCEJSfx3kYQkJCEJSUhCEv+VJCEJSUhCEpKQxH8VSUhCEpKQhCT+s0lCEpKQhCQk8Z9JEpKQhCQk8Z9JEpKQhCQk8Z9FEpKQhCQk8a+xWq24ePEij33sY3nwgx/80n/2Z3/2M4eHh7tcddVVV131PwXl+PHjXHXVVVdd9T/H537u5/7WNddc8+BnPOMZ/N7v/R6SkIQkJCEJSUhCEpKQhCQkIYmr/mXr9ZrbbruN2267jUc96lE8/OEP56EPfShnzpxhGAYODw+RREQgiYhAEpKICCKCiKCUQimFUgq1Vmqt1FqptVJKISKQBIBtMpPWGq01Wmu01shMMpPMZD6f89CHPpQHPehBvMIrvALXXHMNW1tbXLp0iV/7tV/j537u57jtttv4jyYJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKS+P9GEpKQhCQkIQlJSEISkpDE/2SSkIQkJCEJSUhCEpKQxP8EkpCEJCQhCUlI4r+LJCQhCUlIQhKS+K8kCUlIQhKSkMR/FUlIQhKSkIQk/rNJQhKSkIQk/jNJQhKSkIQkJPGfRRKSkIQkJPGfRRKSkIQkJPHC3H333TzkIQ/hpptuOr65uXn8T//0T3+Gq6666qqr/qdAD3rQg7jqqquuuup/hhd7sRd77c/93M/9LYCv//qv59KlS1z1n+/YsWM86EEP4iVf8iV50IMeBMD+/j733HMP99xzD09/+tOJCEoplFKotVJrpdZK13X0fc9sNmM+nzOfz5nP58xmM7quo9aKJGwzTRPDMLBer1mtVqzXawAWiwVd13H99dezWCy436VLl/ibv/kbfu/3fo//r2zz/51t/jeyzf9ktvmfxDb/nWzz38U2/x1s81/JNv9VbPNfwTYPdOLECT7hEz4BgM/6rM96nb//+7//ba666qqrrvqfAD3oQQ/iqquuuuqq/xm+6Zu+6enXXHPNg3/u536Ov/3bv+Wq/3rHjh3jJV/yJXnQgx7Egx70IO53cHDA2bNnkcT58+dZrVaUUpimidYas9mM+XzOfD5nPp8zm82Yz+fUWpGEJGxzv4hgY2ODB7p06RLPeMYz2N3d5fd+7/e46t/HNv+f2OZ/G9v8T2Sb/yls89/NNv8dbPNfzTb/lWzzX8U2/xVe5mVehrd/+7fn7Nmzz/jgD/7gB3PVVVddddX/BOhBD3oQV1111VVX/ff78A//8O96ndd5nfd+xjOewfd///fz300S/98dO3aMBz3oQdxyyy0cO3aMBz3oQfxHuXTpEru7u9x2221cunSJv/3bv+VFZZur/nPY5v862/xvYZv/aWzzP4Vt/jvZ5r+Dbf4r2ea/km3+q9jmP9qJEyd4u7d7Ox7ykIfwW7/1W9/99V//9e/DVVddddVV/93Qgx70IK666qqrrvrv9WIv9mKv/bmf+7m/BfD93//9POMZz+AFkcRV/z2OHTsGwLFjxzh+/DjHjh3j2LFj3O/SpUscO3aMB7p06RIAly5dYnd3l0uXLnHp0iX+N7DNVS+cbf4vss3/dLb5n8Y2/xPY5r+Lbf472Oa/mm3+q9jmv4pt/r1OnDjBx3/8xwPwmZ/5ma/zD//wD7/NVVddddVV/53Qgx70IK666qqrrvrv9U3f9E1Pv+aaax78e7/3e/ze7/0eV131f41trgLb/F9hm//JbPM/iW3+u9nmv4tt/jvY5r+Sbf6r2Oa/gm3+LV72ZV+Wt3u7t+O+++679UM+5EMewlVXXXXVVf+dCK666qqrrvpv9Y7v+I6fdc011zz4Gc94Br/3e7/HVVf9XyQJSUhCEpKQhCQkIQlJSEISkpCEJCQhif8LJCEJSUhCEpKQhCQkIYn/DSQhCUlIQhKSkIQk/rtJQhKSkIQkJCGJ/w6SkIQkJCEJSUjiv4okJCEJSUhCEv8VJCEJSUhCEpL4zyYJSUhCEpL4zyQJSUhCEpL4zyIJSUhCEpL4zyAJSUhCEpJ4UTztaU/j6U9/Otdcc82DP/zDP/y7uOqqq6666r8TwVVXXXXVVf9tXuzFXuy13+md3umzAX7v936P/+8kIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkrvrvJQlJSEISkpCEJCQhCUlIQhKSkMT/RpKQhCQkIQlJSEISkpDE/2SSkIQkJCEJSUhCEv+dJCEJSUhCEpKQhCT+q0lCEpKQhCQk8V9FEpKQhCQkIYn/CpKQhCQkIQlJ/GeShCQkIQlJ/GeShCQkIQlJ/GeRhCQkIQlJ/GeQhCQkIQlJPLfd3V1+4id+AoAXe7EXe+0Xe7EXe22uuuqqq67670Jw1VVXXXXVf5t3eqd3+iyA3/u93+O2227jP5skJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpDE/3SSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkrjqeUlCEpKQhCQkIQlJSEISkpCEJP63kIQkJCEJSUhCEpKQhCT+J5KEJCQhCUlIQhKS+O8kCUlIQhKSkIQk/itJQhKSkIQkJCGJ/wqSkIQkJCEJSfxXkIQkJCEJSfxnkoQkJCEJSUjiP4skJCEJSUjiP4skJCEJSUjiP4MkJCEJSUji4sWL/MZv/AbXXHPNgz/8wz/8u7jqqquuuuq/C+X48eNcddVVV131X+8d3/EdP+t1Xud13vvSpUv8+I//OA8kCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpDEVf/3SUISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIYn/TyQhCUlIQhKSkIQkJCEJSfxvIAlJSEISkpCEJCQhif9pJCEJSUhCEpKQhCT+u0hCEpKQhCQkIYn/SpKQhCQkIQlJ/FeQhCQkIQlJSOI/myQkIQlJSEIS/5kkIQlJSEIS/1kkIQlJSEIS/1kkIQlJSOI/iyR2d3e5/vrruemmm45L0j/8wz/8NlddddVVV/1Xoxw/fpyrrrrqqqv+a73Yi73Ya3/ER3zEdwP8xE/8BHt7e0hCEpK46qr/iSQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIYn/ayQhCUlIQhKSkIQkJCEJSfxPJglJSEISkpCEJCQhif9JJCEJSUhCEpKQhCT+O0hCEpKQhCQk8V9JEpKQhCQkIYn/CpKQhCQkIQlJ/GeThCQkIQlJ/GeShCQkIQlJ/GeRhCQkIQlJ/GeQhCQkIQlJ/EdZrVbs7u7ysi/7slxzzTUPefrTn/7XZ8+evZWrrrrqqqv+KxFcddVVV131X+6d3umdPgvg7/7u77jtttu46qr/TyQhCUlIQhKSkIQkJCEJSUhCEpKQxP92kpCEJCQhCUlIQhKSkIQk/ieShCQkIQlJSEISkvifRBKSkIQkJCEJSfxXk4QkJCEJSUhCEv9VJCEJSUhCEpL4ryAJSUhCEpKQxH8mSUhCEpKQxH8mSUhCEpKQxH8WSUhCEpKQxH8GSUhCEpKQxL/V05/+dH7zN3+TM2fOPOjDP/zDv4urrrrqqqv+q1GOHz/OVVddddVV/3Xe8R3f8bNe53Ve570vXbrED/zAD/B/hSQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpK46j+OJCQhCUlIQhKSkIQkJCEJSUhCEv8bSUISkpCEJCQhCUlIQhL/k0hCEpKQhCQkIQlJ/E8hCUlIQhKSkIQk/qtJQhKSkIQkJPFfRRKSkIQkJCGJ/wqSkIQkJCGJ/0ySkIQkJCEJSfxnkYQkJCEJSfxnkYQkJCEJSfxnkIQkJCEJSbyoLl68yGMe8xhOnz59HOAf/uEffoerrrrqqqv+qxBcddVVV131X+aaa6558Du90zt9NsDP//zP8x9NEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJXPWCSUISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhiauukIQkJCEJSUhCEpKQhCQkIYn/TSQhCUlIQhKSkIQkJPE/hSQkIQlJSEISkpDE/wSSkIQkJCEJSUjiv5IkJCEJSUhCEpL4ryAJSUhCEpKQxH82SUhCEpKQhCT+M0lCEpKQhCT+s0hCEpKQhCT+s0hCEpKQxH8WSUhCEpJ4QXZ3d/nJn/xJAF7ndV7nva+55poHc9VVV1111X8Vgquuuuqqq/7LfPiHf/h3Afzd3/0dt912G5KQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJHHVVc9NEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJPH/gSQkIQlJSEISkpCEJCQhCUn8TycJSUhCEpKQhCQkIYn/CSQhCUlIQhKSkIQk/rtJQhKSkIQkJCGJ/0qSkIQkJCEJSfxXkIQkJCEJSUjiP5skJCEJSUjiP5MkJCEJSUjiP4skJCEJSUjiP4MkJCEJSUjiP4MkJCEJSUjifk9/+tP5y7/8S6655poHf/iHf/h3cdVVV1111X8Vgquuuuqqq/5LvM7rvM57v9iLvdhrA/zCL/wCkrjqqv+NJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhif9LJCEJSUhCEpKQhCQkIQlJ/E8lCUlIQhKSkIQkJCGJ/26SkIQkJCEJSUjiv5skJCEJSUhCEv+VJCEJSUhCEpL4ryAJSUhCEpL4zyYJSUhCEpL4zyQJSUhCEpL4zyIJSUhCEpL4zyAJSUhCEpL4zyAJSUjit37rt7h48SIv9mIv9tqv8zqv895cddVVV131X4Fy/Phxrrrqqquu+s91zTXXPPhzP/dzfwvgB3/wB7l06RJXXfX/nSQkIQlJSEISkpCEJCQhCUlIQhL/20lCEpKQhCQkIQlJSEIS/xNJQhKSkIQkJCEJSfx3koQkJCEJSUhCEpL47yIJSUhCEpKQhCT+q0hCEpKQhCQk8Z9NEpKQhCQkIYn/TJKQhCQkIQlJ/GeRhCQkIQlJ/GeRhCQkIQlJ/GeQhCQkIQlJ/EdarVasVise85jH8OAHP/il/+zP/uxnDg8Pd7nqqquuuuo/E8FVV1111VX/6T78wz/8uwBuu+02brvtNv63kIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpDEVf96kpCEJCQhCUlIQhKSkIQkJCEJSfxvIwlJSEISkpCEJCQhif9pJCEJSUhCEpKQhCT+O0lCEpKQhCQkIYn/LpKQhCQkIQlJ/FeRhCQkIQlJSOI/myQkIQlJSEIS/5kkIQlJSEIS/1kkIQlJSEIS/1kkIQlJSEIS/xkkIQlJSOLf66/+6q94+tOfzjXXXPPgD//wD/9urrrqqquu+s9GcNVVV1111X+q13md13nvF3uxF3ttgF/4hV/g30sSkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpDEVf/5JCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSfx/JwlJSEISkpCEJCQhCUlIQhL/G0hCEpKQhCQkIQlJSEIS/1NIQhKSkIQkJCEJSfx3kYQkJCEJSUhCEv8dJCEJSUhCEpL4ryIJSUhCEpKQxH82SUhCEpKQxH8mSUhCEpKQxH8WSUhCEpKQxH8WSUhCEpL4zyAJSUhCEpL41/rJn/xJAF7sxV7stV7ndV7nvbnqqquuuuo/E+X48eNcddVVV131n+crvuIr/grgh37oh7jvvvuQhCQkIQlJSEISkpCEJCQhCUlIQhKSuOqqfytJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpL4v04SkpCEJCQhCUlIQhKSkMT/dJKQhCQkIQlJSEIS/1NIQhKSkIQkJCGJ/y6SkIQkJCEJSfx3kIQkJCEJSUjiv4okJCEJSUjiP5skJCEJSUjiP5MkJCEJSUjiP4skJCEJSUjiP4MkJCEJSUjiP4MkJCEJSfxLVqsVu7u7POYxj+HBD37wS//Zn/3ZzxweHu5y1VVXXXXVfwaCq6666qqr/tN87ud+7m8B3Hbbbdx2221cddX/JZKQhCQkIQlJSEISkpCEJCQhCUlIQhKS+L9CEpKQhCQkIQlJSEISkpDE/0SSkIQkJCEJSUhCEpL47yYJSUhCEpKQhCQk8V9NEpKQhCQkIQlJ/FeThCQkIQlJSOK/giQkIQlJSEIS/5kkIQlJSEISkvjPIglJSEISkvjPIglJSEISkvjPIAlJSEISkviPJglJSEISknhuf/VXf8XTn/50rrnmmge/4zu+42dx1VVXXXXVfxaCq6666qqr/lO82Iu92Gu/2Iu92GsD/OIv/iJXXXXV85KEJCQhCUlIQhKSkIQkJCEJSUjifzNJSEISkpCEJCQhCUn8TyQJSUhCEpKQhCQk8d9NEpKQhCQkIQlJ/FeThCQkIQlJSOK/miQkIQlJSEIS/xUkIQlJSEIS/9kkIQlJSEIS/1kkIQlJSEIS/1kkIQlJSEIS/xkkIQlJSOI/gyQkIQlJAPzkT/4kAK/zOq/z3i/2Yi/22lx11VVXXfWfAT3oQQ/iqquuuuqq/3jf9E3f9PRrrrnmwb/4i7/I3/3d3/E/kSSu+p/FNlf957DN/zW2+d/CNv8T2eZ/Atv8d7PNfwfb/FeyzX8V2/xXsM1/Bdv8Z3iZl3kZ3uZt3ob77rvv1g/5kA95CFddddVVV/1HI7jqqquuuuo/3Id/+Id/1zXXXPPg2267jb/7u7/j30oSkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSOKq/3kkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQk8f+VJCQhCUlIQhKSkIQkJCEJSfxvIAlJSEISkpCEJCQhif8pJCEJSUhCEpKQhCT+u0hCEpKQhCQk8V9NEpKQhCQkIYn/SpKQhCQkIQlJ/GeThCQkIQlJ/GeShCQkIQlJ/GeRhCQkIQlJ/GeQhCQkIQlJ/GeQhCQkIYn/KE9/+tN5+tOfzjXXXPPgD//wD/8urrrqqquu+o9GcNVVV1111X+oF3uxF3vt13md13lvgD/4gz9AEpKQhCQkIQlJSEISkpCEJCQhCUlcddV/BklIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEIS/5dJQhKSkIQkJCEJSUhCEpL4n0wSkpCEJCQhCUlIQhL/E0hCEpKQhCQkIYn/DpKQhCQkIQlJSOK/kiQkIQlJSEIS/5UkIQlJSEISkvjPJAlJSEISkpDEfxZJSEISkpDEfxZJSEISkpDEfwZJSEISkpDEfzRJSEISkpDEv8Xu7i4/9VM/BcDrvM7rvPeLv/iLvzZXXXXVVVf9RyK46qqrrrrqP9SHf/iHfxfAH/zBH3D77bdz1VX/l0lCEpKQhCQkIQlJSEISkpCEJCQhCUn8XyEJSUhCEpKQhCQkIQlJ/E8lCUlIQhKSkIQkJPHfTRKSkIQkJCEJSfx3kIQkJCEJSUhCEv9VJCEJSUhCEpL4ryQJSUhCEpL4zyYJSUhCEpL4zyIJSUhCEpL4zyIJSUhCEpL4zyAJSUhCEv8ZJCEJSUjiRbW7u8tv/dZvAfDhH/7h381VV1111VX/kQiuuuqqq676D/OO7/iOn3XNNdc8+LbbbuMP/uAPuOqqq144SUhCEpKQhCQkIQlJSEISkpCEJP63koQkJCEJSUhCEpKQhCT+p5GEJCQhCUlIQhKS+O8kCUlIQhKSkIQk/jtIQhKSkIQkJPFfRRKSkIQkJCGJ/yqSkIQkJCEJSfxnkoQkJCEJSfxnkYQkJCEJSfxnkYQkJCGJ/wySkIQkJCGJ/2iSkIQkJCGJF+Sv/uqvePrTn86ZM2ce9OEf/uHfxVVXXXXVVf9RCK666qqrrvoP8WIv9mKv/U7v9E6fDfAHf/AH/E8iCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpK46oWThCQkIQlJSEISkpCEJCQhif9tJCEJSUhCEpKQhCQk8T+JJCQhCUlIQhKSkMR/F0lIQhKSkIQkJPFfTRKSkIQkJCGJ/yqSkIQkJCEJSfxXkYQkJCEJSfxnkoQkJCEJSfxnkYQkJCEJSfxnkIQkJCEJSfxnkIQkJCGJ/wySkIQkJHG/3d1dfuqnfgqAF3uxF3vtF3uxF3ttrrrqqquu+o9AcNVVV1111X+Id3qnd/osgD/4gz/g9ttv519LEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSVz1v48kJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkMT/N5KQhCQkIQlJSEISkpCEJCTxv4EkJCEJSUhCEpKQhCT+p5CEJCQhCUlIQhL/XSQhCUlIQhKSkMR/JUlIQhKSkIQk/qtIQhKSkIQk/qtIQhKSkIQk/jNJQhKSkIQk/rNIQhKSkIQk/jNIQhKSkIQk/qNJQhKSkIQk/qNJQhKSuHTpEr/1W7/FNddc8+AP//AP/y6uuuqqq676j0A5fvw4V1111VVX/fu84zu+42e9zuu8zntfunSJn/7pn0YSkpCEJCQhCUlIQhKSkIQkJHHVVf+VJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhif+rJCEJSUhCEpKQhCQkIQlJ/E8mCUlIQhKSkIQkJCGJ/26SkIQkJCEJSUhCEv8dJCEJSUhCEpKQxH8VSUhCEpKQhCT+K0hCEpKQhCQk8V9BEpKQhCQkIYn/LJKQhCQkIYn/LJKQhCQkIYn/DJKQhCQk8Z9BEpKQhCT+o+3u7nL99ddz4403Hgf4h3/4h9/hqquuuuqqfw/K8ePHueqqq6666t/ummuuefAnfdIn/TTAT//0T7O3t8dVV/1/IQlJSEISkpCEJCQhCUlIQhKSkIQkJPF/gSQkIQlJSEISkpCEJCTxP5UkJCEJSUhCEpKQxH83SUhCEpKQhCQk8d9BEpKQhCQkIYn/KpKQhCQkIQlJ/FeQhCQkIQlJ/FeRhCQkIQlJ/GeRhCQkIQlJ/GeRhCQkIYn/DJKQhCQkIYn/aJKQhCQk8e+1Wq3Y3d3lZV7mZbjmmmsefOutt/7N2bNnb+Wqq6666qp/K4Krrrrqqqv+XT78wz/8uwD+/u//nttvv52rXnSSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCGJq/5nkYQkJCEJSUhCEpKQhCQkIQlJ/G8lCUlIQhKSkIQkJCEJSfxPIwlJSEISkpCEJCTx30kSkpCEJCQhCUn8V5OEJCQhCUlI4r+KJCQhCUlIQhL/2SQhCUlIQhKS+K8gCUlIQhKS+M8iCUlIQhKS+M8gCUlIQhKS+M8gCUlIQhL/0SQhCUlIQhL/Wrfeeiu/9Vu/xTXXXPPgD//wD/8urrrqqquu+vegHD9+nKuuuuqqq/5t3vEd3/GzXud1Xue9L126xI/8yI/wP4UkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCTx30ESkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQxFXPnyQkIQlJSEISkpCEJCQhCUlI4n8TSUhCEpKQhCQkIQlJ/E8iCUlIQhKSkIQkJPHfRRKSkIQkJCEJSfxXkoQkJCEJSUhCEv8VJCEJSUhCEpL4zyYJSUhCEpL4ryAJSUhCEpL4zyIJSUhCEpL4zyAJSUhCEpL4jyYJSUhCEpL4jyYJSUhCEi+K3d1dHvOYx3Dq1KnjkvQP//APv81VV1111VX/FgRXXXXVVVf9m1xzzTUPfqd3eqfPBvilX/ol/i0kIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpK46v8GSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJPH/jSQkIQlJSEISkpCEJCQhif8NJCEJSUhCEpKQhCQk8T+FJCQhCUlIQhKS+O8iCUlIQhKSkMR/NUlIQhKSkIQk/itIQhKSkIQk/rNJQhKSkIQkJPGfTRKSkIQkJPGfRRKSkIQkJPGfQRKSkIQk/jNIQhKSkMR/NElIQhKSeH52d3f5qZ/6KQBe53Ve572vueaaB3PVVVddddW/BcFVV1111VX/Jh/+4R/+XQB///d/zx133IEkJCEJSUhCEpKQhCQkIQlJSOKqq/67SEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEv8XSUISkpCEJCQhCUlIQhKS+J9MEpKQhCQkIQlJSOJ/AklIQhKSkIQkJPHfQRKSkIQkJCEJSfxXkoQkJCEJSUjiP5skJCEJSUhCEv/ZJCEJSUhCEv/ZJCEJSUhCEv9ZJCEJSUjiP4MkJCEJSUjiP5okJCEJSfxHk4QkJCEJSQDceuut/PVf/zVnzpx50Id/+Id/F1ddddVVV/1bEFx11VVXXfWv9jqv8zrv/WIv9mKvDfDLv/zLXHXV/1eSkIQkJCEJSUhCEpKQhCQkIQlJSOL/AklIQhKSkIQkJCEJSUjifyJJSEISkpCEJCQhif9ukpCEJCQhCUlI4r+DJCQhCUlIQhL/lSQhCUlIQhL/FSQhCUlIQhL/2SQhCUlIQhL/2SQhCUlIQhL/GSQhCUlIQhL/GSQhCUlI4j+aJCQhCUlI4j+aJCTx27/92+zu7vJiL/Zir/06r/M6781VV1111VX/WpTjx49z1VVXXXXVi+6aa6558Od+7uf+FsCP/MiPsLe3x1UvmCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSuOq/lyQkIQlJSEISkpCEJCQhCUlI4n8rSUhCEpKQhCQkIQlJ/E8jCUlIQhKSkIQkJPHfSRKSkIQkJCEJSfxXk4QkJCEJSUhCEv8VJCEJSUhCEpL4zyYJSUhCEpKQxH8mSUhCEpKQxH82SUhCEpKQxH8GSUhCEpKQxH80SUhCEpKQxH80SUhCEpL4j7JarVitVjz60Y/mwQ9+8Ev/2Z/92c8cHh7uctVVV1111YuK4Kqrrrrqqn+VD//wD/8ugNtvv53bb7+d/ykkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKS+J9MEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlc9fxJQhKSkIQkJCEJSUhCEpKQxP8mkpCEJCQhCUlIQhKS+J9EEpKQhCQkIQlJSOK/iyQkIQlJSEISkvivJglJSEISkpDEfwVJSEISkpCEJP6zSUISkpCEJP4zSUISkpCEJP6zSUISkpDEfxZJSEISkvjPIAlJSEIS/9EkIQlJSOLf46//+q+59dZbueaaax784R/+4d/FVVddddVV/xoEV1111VVXvche7MVe7LVf7MVe7LUBfumXfol/C0lIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJK76v0USkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJ/H8iCUlIQhKSkIQkJCEJSUhCEv/TSUISkpCEJCQhCUlI4n8KSUhCEpKQhCQk8d9FEpKQhCQkIQlJ/FeShCQkIQlJSOK/giQkIQlJSOI/myQkIQlJSOI/kyQkIQlJSOI/kyQkIQlJSOI/gyQkIQlJSOI/miQkIQlJ/EeThCQkIQlJ/Gv89E//NAAv9mIv9tqv8zqv895cddVVV131oqIcP36cq6666qqrXjTf/M3f/HSAX/7lX+aOO+5AEpKQhCQkIQlJSEISkpCEJCRx1VX/3SQhCUlIQhKSkIQkJCEJSUhCEpKQhCQk8X+VJCQhCUlIQhKSkIQkJPE/mSQkIQlJSEISkpCEJP67SUISkpCEJCQhCUn8d5CEJCQhCUlI4r+SJCQhCUlIQhL/2SQhCUlIQhKS+M8kCUlIQhKSkMR/FklIQhKSkMR/JklIQhKSkMR/BklIQhKS+I8mCUlIQhKS+I8mCUlIQhIvzGq1Ynd3l0c/+tE8+MEPfuk/+7M/+5nDw8Ndrrrqqquu+pcQXHXVVVdd9SL53M/93N8CuP322/mHf/gHrrrq/zNJSEISkpCEJCQhCUlIQhKSkIQkJPF/gSQkIQlJSEISkpCEJCTxP5UkJCEJSUhCEpKQxH83SUhCEpKQhCQk8V9NEpKQhCQkIYn/SpKQhCQkIYn/CpKQhCQkIYn/bJKQhCQkIYn/LJKQhCQkIYn/TJKQhCQk8Z9BEpKQhCQk8R9NEpKQhCT+o0lCEpKQxHP767/+a2699VauueaaB7/jO77jZ3HVVVddddWLguCqq6666qp/0Yu92Iu99ou92Iu9NsAv//Ivc9ULJwlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSVz130MSkpCEJCQhCUlIQhKSkIQkJCGJ/40kIQlJSEISkpCEJCQhif9pJCEJSUhCEpKQxH83SUhCEpKQhCT+q0lCEpKQhCQkIYn/CpKQhCQkIQlJ/GeThCQkIQlJSOI/kyQkIQlJSOI/iyQkIQlJSOI/iyQkIQlJSOI/gyQkIQlJ/EeThCQkIYn/aJKQhCQkAfDTP/3TALzO67zOe7/Yi73Ya3PVVVddddW/BD3oQQ/iqquuuuqqF+6bvumbnn7NNdc8+A//8A/5oz/6I/4nkcRV/7fY5qp/P9v8X2Kb/w1s8z+Nbf4nsM1/F9v8V7PNfyXb/FewzX8l2/xnss1/Ntv8R3vpl35p3uqt3or77rvv1g/5kA95CFddddVVV70wBFddddVVV71QH/7hH/5d11xzzYNvv/12/uiP/oh/D0lIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpDEVf/3SEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQk8f+NJCQhCUlIQhKSkIQkJCGJ/w0kIQlJSEISkpCEJP6nkIQkJCEJSUhCEv9dJCEJSUhCEpKQxH8lSUhCEpKQhCT+K0hCEpKQhCT+s0lCEpKQhCT+M0lCEpKQhCT+M0hCEpKQhCT+M0lCEpKQxH80SUhCEpKQxH80SUhCEpL4j3Drrbdy6623cs011zz4wz/8w7+Lq6666qqrXhiCq6666qqrXqAXe7EXe+3XeZ3XeW+AP/qjP0ISkpCEJCQhCUlIQhKSkIQkJCEJSUjiqqv+O0lCEpKQhCQkIQlJSEISkpCEJCQhCUlI4v8qSUhCEpKQhCQkIQlJSOJ/MklIQhKSkIQkJCEJSfx3k4QkJCEJSUhCEpL47yAJSUhCEpKQxH8lSUhCEpKQhCT+s0lCEpKQhCQk8Z9JEpKQhCQk8Z9JEpKQhCQk8Z9BEpKQhCQk8Z9FEpKQhCQk8R9NEpKQhCT+o0lCEpKQxL/F7u4uP/MzPwPA67zO67z3i73Yi702V1111VVXvSDoQQ96EFddddVVVz1/n/u5n/tbL/ZiL/bae3t7XLp0iauu+r9CErZ5IEnY5oEkYZsHkoRtHkgStnkgSdjmgSRhmweShG0eSBK2eSBJ2OaBJGGbB5KEbR5IErZ5IEnY5oEkYZsHkoRtHkgStnkgSdjmqv8ctgGQhG0eSBK2eSBJ2OaBJGGbB5KEbR5IErZ5IEnY5oEkYZsHkoRtHkgStnkgSdjmgSRhmweShG3+v7HN/SRhmweShG0eSBK2eSBJ2OaBJGGbB5KEbR5IErZ5IEnY5oEkYZsHkoRt/q+yzQNJwjYPJAnbPJAkbPNAkrDNA0nCNg8kCds8kCQe9KAHAXDffffd+iEf8iEP4aqrrrrqqueHylVXXXXVVf+inZ0ddnZ2uOqqq6666qqrrrrqf56zZ8/ees011zz4vvvuu5WrrrrqqqueG5Wrrrrqqquer2uuuebBL/ZiL/baAL/2a7+GJP6jSeJFIYkXhST+I0niXyKJF0YS/16SeEEk8cJI4t9CEi+IJJ4fSfxrSeIFkcTzI4l/C0m8IJJ4YSRxP9tI4oFsI4n/TWwjiQeyjSTuZ5sXxjYviG1eVLaRhG1eENs8P7Z5UdhGErZ5fmzzgtjmRWEbSQDY5gWxzQtjmxfENpJ4INtI4n62eWFs8y+xzb/ENpJ4INtI4oFs86KwzYvKNv8WtpHEA9lGEgC2+dewzb+Gbf61bCOJB7KNJB7INv9atvnXss2/hW0k8UC2kcQD2ebfwjb/Wrb517KNJB7INpJ4INtI4n62+deyzYvird7qrXixF3ux177vvvtu5aqrrrrqqueHylVXXXXVVc/Xfffdd+s//MM//PaLvdiLvTbAvffey4tKEi8KSbyoJPEvkcSLQhL/Ekn8SyTxL5HECyOJF0YSL4wkXhBJvCCSeEEk8YJI4gWRxPMjiedHEi+IJJ4fSTw/knhBJPGCSOKFkcSLQhL/ESTxorLNv5dtXhS2eWFs84LY5vmxzfNjm+fHNs+PbZ4f2zw/tnlBbPP82OYFsc3zY5sXxDYvjG1eENu8MLb5l9jmX2Kbf4lt/iW2eVHZ5kVhmxeVbV5UtvnXsM2/hm3+NWzzr2Gbfw3b/GvZ5l/LNv8atvnXss2/lm3+tWzzr2WbfwvbvChuuOEGAO67775bueqqq6666gWhctVVV1111f8ZtpHE/xeS+J9CEs+PJJ4fSTw/knhBJPH8SOL5kcQLIokXRhL/Ekn8a0niP4okXhDbvCgkcT/bvCCSALDN8yMJ2zw/krDNc5OEbZ6bJGzz3CRhm+cmCds8N0nY5rlJwjb/GpKwzb+GJGzzP41t/iW2+ZfY5j+SbV4UtnlR2eZFZZt/Ddv8a9jmX8M2/xq2+dewzb+Wbf41bPOvZZt/Ldv8a9nmX8s2/1q2+bewzYtqe3sbgH/4h3/4ba666qqrrnpBCK666qqrrnqB/v7v//63Aa699lps8x/NNlf955DECyKJF0QSL4gknh9JPD+SeH4k8fxI4vmRhCSeH0k8P5J4QSTxgkhCEi+IJCQhiX+JJCQhCUlI4r+KJCQhCUlI4l8iCUlI4gWRhCSeH0lI4vmRxPMjiedHEs+PJJ4fSfxvIon/D2zzorDNfzTbvKhs869hm38N2/xr2OZfwzb/Grb517LNv4Zt/rVs869lm38t2/xr2eZfyzb/Frb517jxxhsBuO+++27lqquuuuqqF4TgqquuuuqqF+gf/uEffgfg2muv5V/DNleBJF4YSbwwkvivJIkXRBLPjySeH0k8P5J4fiTx/Eji+ZGEJJ4fSTw/kpDE8yMJSbwgkpDECyMJSUhCEv/TSEISkviXSEISL4gkXhBJPD+SeH4k8fxI4vmRxItKEs+PJJ4fSVz1P5dt/rexzb+Gbf41bPOvYZt/Ldv8a9jmX8s2/1q2+deyzb+Wbf61bPOvZRvb/GvZBuDs2bPP4KqrrrrqqheEylVXXXXVVS/Q2bNnbwXY3Nzkqv9ZJPGCSOIFkcS/liT+I0ji+ZHE8yOJ50cSz48knh9JvCCSeEEk8S+RxL+WJP6z2OZFIYn72eYFkQSAbZ6bJABs89wkYZvnJgkA2zyQJGzz3CRhmxeFJGzz3CRhm/8skrDN/xW2+ZfY5l9imxeFbV4UtnlR2eZFZZt/Ddu8qGzzr2Gbfw3b/GvY5l/LNv8atvnXss2/lm3+tWzzr2Wbfy3b/GvZ5t/CNjfeeCMA//AP//DbXHXVVVdd9YJQueqqq6666gW67777bgXY2toCwDaSuOo/nyT+o0niBZHEv5Yknh9JvKgk8fxI4vmRxPMjiedHEs+PJF4QSbwwknhRSeK/kiSem21eGEnczzbPjyQAbPPcJAFgmweSBIBtnpskbPNAkrDNc5OEbR5IErZ5bpKwzYtCErZ5bpKwzXOThG2u+p/NNi8q2/xr2OZFZZt/Ddv8a9jmX8M2/1q2+dewzb+Wbf61bPOvZZt/Ldv8a9nmX8s2/xa2Adje3gbgvvvuu5WrrrrqqqteEIKrrrrqqqteqH/4h3/4bYBrr72Wq55NEv8ekvi3ksQLIol/LUm8IJJ4fiTx/Eji+ZHEc5PE8yOJ50cSz00SknhukpDEc5OEJJ4fSUjiBZGEJF4YSUhCEpL4n0ASkpCEJF4YSUjiBZGEJJ4fSTw/knh+JPHcJPH8SOK5SeJFJYn/D2zzwtjm38s2/1Fs86KwzX802/xr2OZFZZt/Ddv8a9jmX8M2/1q2+dewzb+Wbf61bPOvZZt/Ldv8a9nmX8s2/1q2sQ3ADTfcAMA//MM//DZXXXXVVVe9MARXXXXVVVe9UPfdd9+tAJubm1z1opPE/ySS+NeSxPMjiedHEs+PJJ6bJJ4fSTw3SUjiuUni+ZHE8yOJ50cSknh+JCEJSbwgkpCEJF4UkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSOJFIQlJSOIFkYQkXhBJPD+SkMRzk8TzI4nnJokXlSSemyReVJL4zySJ/01s8x/BNv8dbPOfwTb/WWzzr2Gbfw3b/GvZ5l/DNv9atvnXsI1t/jVsY5t/DdvY5l/LNv9atvnXss0D7ezsAHDffffdylVXXXXVVS8Mlauuuuqqq16o++6771aAra0t/jVsI4l/iW0kcdWzSeIFkcQLIol/LUk8P5J4fiTx/Eji+ZHEc5PE8yOJ5yaJ50cSz00Sz48knh9JvCCSeGEk8aKQxH8lSTw327wgkrifbZ6bJABs89wkAWCb5yYJ2zyQJGzz3CRhmweShG0eSBK2eVFIwjYPJAnbvCgkYZvnJgnbPDdJ2OaqF51tXhS2eVHY5kVlmxeVbf41bPOiss2/hm3+NWzzr2Wbfw3b/GvZ5l/DNv9atvnXss2/hW3+tWzzr2Wb53bDDTcA8A//8A+/w1VXXXXVVS8Mlauuuuqqq16of/iHf/gdgGuvvRYA20ji/zJJ/GeSxH8lSTw/kviPIInnRxLPTRLPjySemySemySeH0k8P5J4bpJ4QSTxgkjiXyKJ/0iSsM2/hyQeyDbPjyQAbPPcJAFgm+cmCQDbPJAkbPNAkgCwzQNJwjYPJAnbPJAkbPNAkrDNv5UkbHPVv8w2/xLb/EexzX802/xnsc2Lyjb/Grb517DNv5Zt/jVs869lm38N2/xr2eZfyzb/Wrb5t7DNv5Ztrrrqqquu+nehctVVV1111Qt19uzZWwE2Nze56gpJvDCS+LeSxAsiiRdEEs+PJP61JPH8SOK5SeL5kcRzk8TzI4nnJonnJonnRxLPTRLPjySeH0m8IJJ4YSTxopLEv5YkXlS2+ZdI4n62eW6SuJ9tHkgSALZ5bpKwzQNJAsA2DyQJ2zyQJGzzQJKwzQNJwjYPJAnbPJAkbPNAkrDNi0IStnlukrDNVf92tvmPZJsXhW3+NWzzorLNfxbb/GvY5l/LNv8atvnXss2/hm3+tWzzr2Wbfy3b/FvY5l/LNi/IjTfeCMA//MM//DZXXXXVVVe9MARXXXXVVVe9UPfdd9+tAFtbW2xubvK/nST+r5HEv5Yknh9JPD+SeFFJ4rlJ4vmRxHOTxHOTxHOThCQeSBKSeG6SkMRzk4QknpskJCGJ50cSkpDECyIJSUhCEpL4zyYJSUhCEpJ4YSQhCUk8P5KQxHOThCSemySeH0k8N0k8N0k8N0k8N0k8N0k8N0k8N0k8N0n8e0niX0MS/5PY5n8S27wobPOfwTYvKtv8a9jmRWWbfw3b/GvZ5l/DNv8atrHNv4Zt/rVs869lm38t2/xb2OZfyzYvzPb2NgD33XffrVx11VVXXfXCEFx11VVXXfUv+od/+IffBtja2uKqfx9JvCCSeEEk8a8liedHEv8aknh+JPHcJPHcJPHcJCGJ5yaJ5yaJ5yaJ5yaJ5yYJSTw3SUjiuUlCEs+PJCQhiedHEpKQhCReVJKQhCQkIQlJSEISkpCEJCQhCUm8qCQhCUlI4gWRhCSeH0lI4rlJ4rlJQhLPTRLPTRLPTRLPTRL/W0nifwLb/Gezzb/ENv8dbPOiss1/Ftv8Z7HNv5Zt/jVs869hm38t2/xr2eZfyzb/Wrb517KNbf61bPPCPPrRjwbgH/7hH36bq6666qqr/iUEV1111VVX/Yvuu+++WwGuvfZaAGzzP5Ek/rtJ4r+SJP6jSOK5SeL5kcRzk8Rzk8Rzk8Rzk4QkHkgSknhuknhuknhuknhukpDEc5OEJJ6bJCQhiedHEpKQxAsjCUlIQhKSkIQk/q0kIQlJSEISkpDECyMJSUji+ZGEJJ4fSTw3SUjiuUniuUniuUniuUniXyKJ5yaJ5yaJ5yaJ5yaJ5yaJ50cS/9/Y5r+KbV4UtnlR2OY/i21eVLb517DNfybb/GvY5l/DNv9atvnXss2/lm3+tWzzr2WbfwvbvKjuu+++W7nqqquuuupfQuWqq6666qp/0X333XcrwObmJv8atpHE/yaSeGEk8W8liX8LSfxrSeL5kcTzI4kXlSSemySemySemySemySemySemySemySemySeH0k8N0k8P5J4QSTxL5HEfydJPJBtnh9J3M82DyQJANs8kCQAbPNAkrDNA0nCNg8kCds8kCRs80CSsM39JGGbB5KEbR5IEra56n8e2/xPZ5sXlW1eVLb517DNv4Zt/jVs869hm38N2/xr2eZfyzb/Wrb517LNv5Zt/i1s86K44YYbAPiHf/iH3+Gqq6666qp/CZWrrrrqqqv+Rf/wD//wOwBbW1tc9Z9DEv9aknh+JPH8SOL5kcTzI4nnJonnJonnJonnJonnJonnJonnJonnJonnJonnJonnJonnRxLPjyReGEn8a0niP4Jt/iWSeCDbPDdJANjmgSQBYJsHkgSAbe4nCQDb3E8SALa5nyRs80CSsM0DScI295OEbR5IErZ5YSRhmweShG0eSBK2eSBJ2OZFIQnb/HtJwjb/m9jmP4JtXhS2eVHY5kVlmxeVbV5UtvnXsM2/hm3+NWzzr2Gbfw3b/GvZ5l/LNv9atvnXss2/lm3+tWzzr3HjjTcCcN99993KVVddddVV/xIqV1111VVX/YvOnj17K8Dm5iZXvWCS+I8mif8Oknhukvi3ksRzk8Rzk8Rzk8Rzk8QDSeK5SeK5SeL5kcTzI4kXRBIvCkn8Z5LE82ObF0QSALZ5bpIAsM0DSQLANg8kCds8kCRs80CSsM39JAFgm/tJwjYvjCRs88JIwjYPJAnb/EeRhG1eFJKwzVX/N9jmP4tt/jVs869hm38N2/xr2OZfyzb/Wrb517LNv5Zt/rVs869lm3+rs2fP3spVV1111VX/EoKrrrrqqqv+Rffdd9+t9913361bW1tsbm5y1b+eJF4QSfxrSeL5kcTzI4nnRxLPTRIvKkk8N0k8kCSemySemySemyQeSBKSeCBJPDdJPDdJPDdJSOK5SUISz00SkpDE8yMJSUhCEpJ4UUlCEpKQhCQkIQlJSEISLypJSEISknh+JCEJSTw3SUjiuUlCEg8kCUk8kCQk8UCSeG6SeCBJPJAknpskHkgSz00S/xJJPDdJPDdJ/GeQxP8EtnlhbPPvZZt/iW1eFLZ5UdjmRWWb/wy2eVHZ5l/DNv8atvnXsM2/hm3+tWzzr2Wbfy3b/GvZ5l/LNv9atvm32N7eBuC+++67lauuuuqqq/4lBFddddVVV71Izp49eyvA1tYW/1tJ4oWRxAsjif9KkviPIInnRxIvKkk8N0k8N0k8kCSemySemyQeSBKSeCBJPDdJPJAkJPFAkpDEA0lCEg8kCUlI4oEkIQlJPD+SkIQkXhhJSEISkpCEJCQhiReVJCQhCUlIQhKSkMQLIglJSOL5kYQknpskJPHcJPHcJPHcJPFAknhuknggSTyQJJ6bJB5IEv8SSfxnk8T/N7b5n8Y2LyrbvKhs86KyzYvKNv8atvnXsM2/hm3+NWzzr2Wbfy3b/GvZ5l/LNv9atvnXss2/xaMe9SgAfuu3fut7uOqqq6666kVBcNVVV1111Yvk7//+738b4NprrwXANlc9myReEEm8IJL415LE8yOJfy9JPDdJPDdJPDdJPJAknpsknpskHkgSz00SDyQJSTyQJB5IEpJ4IElI4oEkIYnnJglJPD+SkIQknh9JSEISkpDEfxVJSEISknh+JCEJSTw3SUhCEg8kCUk8kCQk8UCSkMQDSeKBJPHcJPFAknggSfxLJPFAkviXSOK5SeJFIYmr/mvZ5r+LbV5UtvnPYpt/Ddv8a9jmX8M2/1q2+deyzb+GbWzzr2Wbfy3b/GvZ5t/CNlddddVVV/2rUbnqqquuuupFcvbs2WcAXHvttVz1n08Sz48knh9JPD+SeH4k8dwk8dwk8dwk8dwk8UCSeG6SeG6SeCBJPJAknpskHkgSz00Sz00Sz00Sz00Sz48kXhBJvCgk8Z/FNs+PJB7INg8kCQDbPDdJANjmfpIAsM39JGGbB5KEbe4nCdvcTxK2eSBJ2OZ+krDN/SRhm/tJwjYvjCRscz9J2OZfSxK2+beShG3+P7LNv8Q2/1Fs86KyzX8327yobPOvYZt/Ddv8a9jmX8s2/1q2+dewzb+Wbf4tbPOvZZt/Ldvc78YbbwTgH/7hH36bq6666qqrXhRUrrrqqquuepHcd999twJsbm7y/5Ek/qNJ4j+TJJ4fSTw3STw3STw3STw3SfxLJPFAknhuknggSTw3STyQJB5IEs9NEs9NEs9NEs+PJJ4fSbwwkvivJInnZpvnJon72eZ+krifbR5IErZ5IEnY5n6SALDN/SRhm/tJwjb3k4RtHkgStrmfJGxzP0nY5n6SsM39JGGbF0YStrmfJGzzQJKwzb+FJGxz1X8s2/xHss2LyjYvKtu8qGzzorLNv4Zt/jVs869hm38t2/xr2eZfwzb/Wrb5t7DNv5Zt/rVs80A33ngjAP/wD//w21x11VVXXfWioHLVVVddddWL5OzZs7fyP5gk/j0k8W8liRdEEv9aknh+JPH8SOJFJYl/K0k8N0k8N0k8kCQeSBLPTRIPJIkHksRzk8QDSeKBJPHcJPHcJPHcJPH8SOIFkcSLShL/UWzzgkjifrZ5bpIAsM0DSQLANveTBIBt7icJANvcTxK2uZ8kbHM/SdjmfpIAsM39JGGbF0QStrmfJGxzP0nY5n6SsM2/lyRs80CSsM2/lSRs86KShG3+q9jmhbHNv5dt/qPY5j+abV5UtnlR2eY/i23+NWzzr2Gbfy3b/GvZ5l/DNv9atvnXss2/hW3+tWzz3La3twG47777buWqq6666qoXBcFVV1111VUvkvvuu+/W++6779atrS2uvfZa/reRxP8kkviPIInnRxIvKkk8N0k8kCSemySemyQeSBIPJInnJokHksQDSeKBJCGJ+0lCEg8kiQeShCQeSBKSeCBJSOKBJCEJSTw3SUhCEs+PJCQhCUlIQhL/kSQhCUlIQhLPjyQkIYnnJglJSOKBJCGJB5KEJB5IEg8kiQeShCTuJwlJPJAkXhBJ/EeTxANJ4n8SSfxfYJv/CLb5j2Sb/2i2eVHZ5l/DNi8q2/xr2OY/m23+tWzzr2Gbfy3b/GvZ5t/CNv9atnlu29vbXHXVVVdd9a9GcNVVV1111Yvs7Nmzt/L/kCReEEm8IJL415LE8yOJF5Uknh9JPDdJPDdJ/Esk8dwk8UCSeCBJPDdJPJAkHkgSDySJB5LEA0lCEg8kiQeShCQeSBKSeCBJSOK5SUISknhukpCEJCTxgkhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhIviCQkIQlJPDdJSEISz00SknggSUjigSTxQJKQxP0kIYkHksQDSeIFkcQDSeKBJPFAknggSTyQJP4lknggSTw3STw3STw3STw3SVz1n8c2/9Fs89/NNv9ZbPOvZZt/Ddv8a9jGNv8atvnXss2/lm3+LWzzr2Wb5+fGG28E4Ld+67e+m6uuuuqqq15UBFddddVVV73I/v7v//63Aa699lr+L5HEfyVJPD+SeH4k8fxI4kUliecmiecmiecmiQeSxHOTxANJ4oEk8UCSkMQDSeKBJPFAknggSTyQJB5IEpK4nyQk8UCSkMQDSUISDyQJSUjigSQhCUlI4rlJQhKSkIQkJPEfRRKSkIQkJCGJ5yYJSUhCEg8kCUlI4oEkIYkHksQDSUISDySJB5LEA0nigSRxP0k8kCQeSBIPJIkHksQDSeKBJPFAkrjqv5dt/iW2+Y9kmxeFbV5UtnlR2eZFZZt/Ddv8Z7LNv4Zt/jVs869lm38t2/xr2ebfwjb/WrZ5Qba3twG47777buWqq6666qoXFZWrrrrqqqteZP/wD//wOwDXXnst/5Uk8b+NJP4zSeL5kcRzk8Rzk8Rzk8Rzk8QDSeK5SeKBJPFAknggSTyQJB5IEg8kiQeSxANJ4oEk8dwk8UCSeG6SeG6SeG6SeEEk8aKSxL+HbV4QSTyQbR5IEgC2eSBJANjmfpIAsA2AJABscz9J2OZ+krDN/SRhm/tJwjb3k4RtACRhm/tJwjb3k4Rt7icJ2/xHkYRt7icJ2/xnkoRtrvq3s81/F9u8qGzzorLNv4Zt/jVs869hm38N2/xr2OZfyzb/Wrb517LNv5Zt/i1s88Ls7OwAcPbs2Wdw1VVXXXXVi4rKVVddddVVL7KzZ8/eCrC5ucn/JJJ4YSTxbyWJF0QS/1qSeH4k8fxI4kUliX8rSTw3SfxLJPFAknggSTyQJB5IEg8kiQeSxANJ4oEk8UCSeCBJPJAknpskHkgSz48knh9JvCCS+M8iiefHNs9NEvezzf0kcT/b3E8SALa5nyRscz9JANgGQBIAtgGQBIBtACRhm/tJwjb3k4RtACRhm/tJwjb3k4Rtnh9J2OZ+krDN/SRhm/tJwjb/GpKwzQNJwjb/EknY5v8C27wwtvmfxjYvCtv8R7PNfxbb/GvY5l/DNv8atvnXsM2/lm3+tWzzr2Wbfy3b/FvY5l9y4403AvAP//APv81VV1111VUvKipXXXXVVVf9q21tbXHVCyaJ/0ySeFFJ4rlJ4l8iiecmiQeSxANJ4oEk8UCSeCBJPJAkHkgSDySJB5LE/STxQJJ4bpJ4IEk8kCSemySeH0k8P5J4UUjiP4JtnpskHsg2DySJ+9nmfpIAsM39JAFgGwBJANjmfpKwzf0kYZv7ScI2AJKwzf0kYZv7ScI2AJKwzf0kYZvnRxK2uZ8kbHM/SdjmRSUJ29xPErb515KEbf6tJGGb/6ts8y+xzb/ENv9dbPOfwTYvKtv8a9jmX8M2/xq2+c9mm38t2/xr2eZfyzb/FrZ5UWxvbwNw33333cpVV1111VUvKoKrrrrqqqteZPfdd9+t//AP//DbANdeey3/F0jiBZHECyKJfy1JPD+SeH4k8aKSxHOTxHOTxHOTxANJ4rlJ4oEk8UCSeCBJPJAkHkgSDySJB5LE/SQhiftJQhL3k8QDSeKBJCGJ+0lCEveThCQeSBKSeCBJSEISDyQJSUjiuUlCEpKQhCQk8R9FEpKQhCQk8dwkIQlJSOKBJCGJB5KEJB5IEg8kCUncTxIPJIkHksT9JCGJ+0nigSRxP0k8kCTuJ4kHksSLShIPJIl/LUn8X2Cb/y9s86KwzYvCNi8q27yobPOiss2/hm3+NWzzr2Gbfy3b/GvY5l/LNv9atvnXss2/hW1eFDfeeCMA9913361cddVVV131r0Hlqquuuuqq/9Mk8V9JEv8RJPH8SOK5SeJFIYnnJol/iSQeSBIPJIkHksQDSeKBJPFAknggSdxPEg8kiQeSxP0k8UCSeCBJPJAknpskHkgSz48knh9J/Esk8R/FNs9NEg9kmweSBIBt7icJANvcTxIAtgGQBIBt7icJ2wBIAsA2AJIAsA2AJGxzP0nYBkAStrmfJGwDIAnbPD+SsM3zIwnb3E8StrmfJGxzP0nY5n6SsM39JGGbF0YStvnPJgnbPDdJ2OY/im3+O9nmv5pt/qPZ5kVlm/8stvnXsM2/hm3+tWzzr2Gbfy3b/GvZ5l/LNv8WtnlRbW9vA/AP//APv81VV1111VX/GgRXXXXVVVf9q/z93//9bwNce+21/H8liX8tSTw/knhRSeJFJYl/iSSemyQeSBIPJIkHksQDSeKBJPFAknggSdxPEpK4nyQeSBL3k4Qk7ieJB5LEA0nigSTxQJKQxP0kIYkHkoQkJHE/SUhCEpJ4bpKQhCQkIYn/SJKQhCQkIQlJPJAkJCGJB5KEJCRxP0lIQhL3k4Qk7icJSdxPEg8kiQeSxP0k8UCSuJ8kXhBJ3E8SDySJ+0nigSTx300Sz00Sz00S/5fY5r+CbV4UtvmPZJv/brZ5UdnmX8M2/xq2+deyzb+Gbf61bPOvZZt/Ldv8a9nGNv8aN954IwD33XffrVx11VVXXfWvQXDVVVddddW/yj/8wz/8DsC1117LfwRJ/HtI4t9KEi+IJP61JPEfQRIvKkk8N0k8N0n8SyTxQJJ4IEk8kCQeSBIPJIkHksQDSeJ+knggSdxPEpK4nyQeSBL3k4Qk7icJSdxPEpK4nyQkcT9JSOJ+kpCEJO4nCUlI4oEkIQlJSEISz00SkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQk8fxIQhKSeCBJSEISDyQJSTyQJB5IEg8kiftJQhL3k8QDSeJ+knggSdxPEveTxANJ4n6SeEEk8YJI4oEk8UCSeCBJPJAkHkgSz00SV/3LbPM/jW1eFLZ5UdnmRWWbF5Vt/rPY5l/DNv9atvnXsM2/lm3+tWzzr2Wbfy3b/FvYBuDs2bPP4Kqrrrrqqn8NKlddddVVV/2rnD179laAzc1N/itI4n87STw/knhRSeK5SeK5SeK5SeK5SeKBJPFAkvjXkMQDSeKBJPFAkrifJB5IEveTxANJ4n6SeCBJPJAk7ieJB5LEA0nigSTx3CTx3CTxgkjiX0sSz802L4wknptt7ieJB7INgCTuZxsASQDYBkASALYBkASAbQAkAWAbAEnYBkASALYBkIRtACRhm/tJwjYAkrANgCRs8/xIwjYAkrDN/SRhGwBJ2OZ+krDNVf8+tvnvZpsXhW3+O9jmRWWbF5Vt/jVs86Kyzb+Gbf61bPOvYZt/Ldv8a9nmX8s2/1q2+bewzY033gjAP/zDP/w2V1111VVX/WtQueqqq6666l/lvvvuuxVga2uL/+kk8W8hiRdEEs+PJP41JPH8SOK5SeK5SeJFIYnnJokHksS/RBIPJIn7SeKBJPFAkrifJB5IEveTxANJ4n6SeCBJ3E8SDySJB5LE/STxQJJ4IEk8kCSemySeH0m8MJL4t5DEv8Q2DySJB7LN/SQBYJv7SQLANgCSALANgCQAbAMgCQDbAEjCNgCSsM39JGEbAEnYBkAStrmfJGwDIAnbAEjCNgCSsM39JGEbAEnY5vmRhG2eH0nY5n6SsM2LShK2eWEkYZsHkoRt/iWSsM3/N7b5r2SbF4Vt/qPZ5kVlm38N2/xPYpt/Ddv8a9nmX8s2/1q2+deyzb+FbQB2dnYAuO+++27lqquuuuqqfw2Cq6666qqr/tX+4R/+4bcBrr32Wv63ksR/BUm8qCTx7yGJf4kk/iWSeCBJPJAkXhBJPJAk7ieJB5LE/STxQJK4nyQeSBL3k8QDSeJ+kpDE/SRxP0lI4n6SkMT9JCGJB5KEJB5IEpKQxANJQhKSkIQknh9JSEISkpCEJCQhCUlIQhKSkMTzIwlJSEISknggSUhCEveThCQkcT9JSOJ+kpDE/SQhiftJ4n6SuJ8kJHE/SdxPEveTxANJ4n6SuJ8k7ieJF0QS95PECyKJF5UkHkgS/xJJ/FtI4qr/WLb572Cb/262+dewzb+Gbf41bPOvYZt/Ldv8a9nmX8s2/1q2+bewDcCNN94IwD/8wz/8NlddddVVV/1rEVx11VVXXfWvdt99990KsLm5yX8nSfxXksTzI4nnRxLPjyReVJJ4bpJ4bpJ4bpJ4IEk8N0k8kCQeSBIPJIkHksT9JPFAkrifJB5IEveTxANJ4n6SuJ8kJHE/SdxPEpIAkIQk7icJSQBIQhL3k4Qk7icJSdxPEpKQxP0kIQlJ3E8SkpCEJB5IEpKQhCQkIQlJ/FtIQhKSkIQkJPHcJCEJSTyQJCTxQJKQxP0kIYn7SUIS95PE/SRxP0lI4n6SuJ8k7ieJ+0niBZHE/SRxP0ncTxIviCTuJ4kXRBIPJIn/6STxv5Vt/r1s8x/FNi8K27wobPOiss2LyjYvKtv8a9jmX8M2/xq2+dewzb+Wbf61bPOvZZt/Ldv8a9nGNvfb3t4G4L777ruVq6666qqr/rWoXHXVVVdd9a9233333QqwubnJ/1SSeEEk8YJI4r+DJJ6bJJ6bJF4UkviXSOKBJPFAknggSTyQJO4niQeSxP0k8UCSuJ8k7ieJB5LE/SRxP0k8kCTuJ4n7SeKBJHE/STyQJB5IEg8kiecmiedHEi+MJP4j2OaBJPHcbAMgifvZBkAS97MNgCQAbAMgCQDbAEjCNgCSALCNJABsAyAJ2wBIwjYAkrANgCRsAyAJ2wBIwjb/EknYBkAStgGQhG2eH0nYBkAStrmfJGzz/EjCNveThG3uJwnbvDCSsM3/NJKwzX8k2/x72OY/gm3+J7PNi8o2Lyrb/GvY5l/DNv8atvnXsM2/lm3+tWzzr2Wbfy3b/GvZ5rndeOONAPzDP/zD73DVVVddddW/FsFVV1111VX/av/wD//wOwDXXnst/5kk8T+FJJ4fSTw/knh+JPEfTRIPJInnJokHksQDSeKBJPFAknggSdxPEg8kiftJ4oEkcT9J3E8SDySJ+0nifpK4nyQkcT9J3E8S95OEJO4niftJQhL3k4Qk7icJSdxPEpKQxP0kIQlJSOJ+kpCEJCQhCUn8SyQhiX+JJCQhCUlIQhIPJAlJSOJ+kpCEJO4nCUncTxKSuJ8k7icJSdxPEveTxP0kcT9J3E8S95PE/SRxP0ncTxL3k8SLQhL3k8QLIokXRBL/HpL4l0jiuUniuUniqv8ctnlR2OZFYZv/TWzzr2Gbfw3b/GvY5l/LNv9atvnXss2/lm3+tWzz/Ozs7HDVVVddddW/GZWrrrrqqqv+1c6ePXsrwNbWFi+MJF4YSfxPIon/TJJ4fiTx3CTx3CTx3CTxL5HEA0nigSTxQJJ4IEk8kCTuJ4kHksT9JPFAkrifJO4niftJ4oEkcT9J3E8S95PE/STxQJK4nyTuJ4kHksQDSeKBJPFAknhuknhhJPGvIYkXhW0eSBL3s839JHE/2wBIAsA2AJIAsA2AJABsIwkA2wBIwjYAkrANgCRsAyAJ2wBIwjYAkrANgCRsAyAJ2wBIwjYAkrANgCRsAyAJ2wBIwjb/EknY5vmRhG2eH0nY5n6SsM39JGGb/26SsM3/Zbb53842LyrbvKhs86Kyzb+Gbf41bPOvYZt/Ldv8a9nmX8s2/1q2+deyzQuyvb0NwD/8wz/8NlddddVVV/1rUbnqqquuuupf7b777rsVYHNzk83NTQ4PD/mvJokXRBIviCT+tSTx/Eji+ZHEi0oSz00Sz00Sz00Sz00SDySJfw9JPJAkXhBJ3E8SDySJ+0nifpK4nyTuJ4kHksT9JHE/SdxPEveTxP0kcT9JPJAk7ieJB5LEA0niuUni+ZHEv0QS/xa2eSBJPDfbAEjigWwDIAkA2wBIAsA2AJIAsA2AJGwDIAnbAEgCwDaSALCNJABsIwnbAEjCNgCSsA2AJGwDIAnbAEjCNgCSsA2AJGwDIAnbAEjCNgCSsA2AJGzz/EjCNs+PJGzzH0UStvnvIAnb/H9hm/8otnlR2OZFYZsXlW1eVLb5z2Kbfw3b/GvY5l/LNv9atvnXss2/lm3+tWzzwuzs7ABw33333cpVV1111VX/WgRXXXXVVVf9m/zDP/zDbwNsbW3xf4Ek/jNJ4j+bJP4lknggSTyQJO4niQeSxANJ4n6SuJ8kHkgS95PE/SRxP0ncTxL3k4QkACQhCQBJSAJAEpK4nyTuJ4n7SeJ+kpAEgCQkcT9JSOJ+kpDE/SQhCUncTxKSkIQk7icJSUhCEpKQhCT+rSQhCUlIQhKSeCBJSEISDyQJSdxPEpK4nyQkcT9JSAJAEpIAkIQk7ieJ+0nifpIAkIQkACRxP0ncTxL3k8T9JHE/SdxPEveTxP0kcT9J3E8S95PECyKJF0QSDySJF0YS/xJJ/H9imxfGNv9VbPM/mW1eVLb517DNi8o2/xq2+c9mm38t2/xr2eZfyzb/WrZ5YR796EcD8A//8A+/zVVXXXXVVf8WBFddddVVV/2b3HfffbcCXHPNNfxnkMT/BJJ4fiTx/EjiRSWJ5yaJ5yaJ5yaJf4kkHkgSDySJB5LECyKJB5LE/SRxP0k8kCTuJ4n7SeJ+krifJO4niftJ4n6SuJ8k7icJSQBIQhIAkpAEgCQkcT9J3E8SkrifJCRxP0lI4n6SkIQk7icJSUhCEg8kCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISknggSUhCEpK4nyQkIYn7SUISkgCQhCTuJwlJ3E8S95PE/SRxP0ncTxL3k8T9JAEgiftJ4n6SuJ8k7ieJ/2iSuJ8kXhBJvKgk8R9BEi8KSfx/Y5v/SrZ5UdjmRWGb/262+c9im38t2/xr2OZfyzb/Wrb517LNv5ZtXlT33XffrVx11VVXXfVvQeWqq6666qp/k/vuu+9WgK2tLf6rSeIFkcQLIon/DpJ4bpJ4bpJ4bpJ4bpJ4bpJ4IEk8kCQeSBIPJIkHksT9JPFAkrifJO4niQeSxP0kcT9J3E8S95PE/SRxP0ncTxL3k8T9JHE/SdxPEveTxP0kcT9JPJAk7ieJB5LEc5PEc5PEv0QS/1q2eSBJPDfbAEjigWwjifvZBkASALaRBIBtACQBYBtJANhGEgC2kQSAbSRhGwBJ2AZAErYBkIRtJGEbAEnYBkAStgGQhG0eSBK2AZCEbQAkYRsASdgGQBK2AZCEbf4lkrDN8yMJ27yoJGGb+0nCNv9akrDNVf8y2/xLbPMfxTb/0WzzorLNi8o2/xq2+c9km38N2/xr2eZfyzb/Wrb517LNi+LGG28E4B/+4R9+h6uuuuqqq/4tqFx11VVXXfVv8g//8A+/A7C5ucn/dpJ4fiTx/Eji+ZHEfwdJPJAkHkgSDySJB5LEA0nifpJ4IEncTxL3k8QDSeJ+krifJO4niftJ4n6SuJ8k7icJAEncTxL3k8T9JHE/SdxPEveTxANJ4n6SeCBJPJAkHkgSL4gk/qNI4gWxDYAkHsg2AJIAsA2AJABsAyAJANtIAsA2AJKwDYAkbAMgCdsASMI2kgCwjSRsAyAJ2wBIwjaSsA2AJGwDIAnbAEjCNpKwDYAkbAMgCdsASMI2AJKwzXOThG0AJGEbAEnY5vmRhG2eH0nY5n6SsM2/hiRsc9X/LLb5j2SbF4VtXlS2eVHZ5l/DNv8atvnXsM2/hm3+tWzzr2Wbfy3b/GvZ5kV14403AnDffffdylVXXXXVVf8WVK666qqrrvo3OXv27K0AW1tb/FtI4r+SJP4zSeL5kcRzk8Rzk8Rzk8Rzk8QDSeLfQxIPJIkXRBL3k8QLIon7SeJ+krifJO4niftJ4n6SAJDE/SRxP0ncTxL3k8T9JHE/SdxPEveTxP0kcT9JPJAkHkgSz00SL4wk/qPY5oEk8UC2AZDE/WwjifvZRhIAtgGQBIBtJAFgG0kA2EYSALaRhG0AJGEbAEnYRhK2AZCEbQAkYRtJ2AZAErYBkIRtHkgStgGQhG1eFJKwzb+GJGzz/EjCNv9TScI2Vz1/tvmPYpsXhW3+N7HNv4Zt/jVs869hm38t2/xr2eZfyzb/Wrb519jZ2QHg7Nmzt3LVVVddddW/BcFVV1111VX/Jvfdd9+t9913362bm5tsbm7yH0kSL4gkXhBJ/GtJ4vmRxPMjiReVJP6tJPHcJPEvkcQDSeKBJPGCSOKBJHE/SdxPEg8kiftJ4n6SuJ8k7ieJ+0nifpIAkIQkACRxP0ncTxIAkpAEgCQkASAJSQBIQhIAkpAEgCQkASAJSQBIQhL3k4Qk7icJSdxPEpKQxP0kIQlJSEISknggSUhCEpKQhCQkIQlJSEISkpDEA0lCEpKQhCQeSBKSkMT9JCGJ+0lCEgCSkMT9JHE/SdxPEveTBIAkJAEgiftJAkAS95PE/SQBIIn7SeK5SeJ+knhukrifJO4niftJ4n6SuJ8k7ieJF0QSL4gkXhhJPJAk/iWS+P/GNi+Mbf4ltvmPYJv/DrZ5UdnmRWWbF5Vt/jVs869hm38N2/xr2eZfyzb/Wrb517LNv9V99913K1ddddVVV/1bEFx11VVXXfVvdvbs2VsBtra2eG6S+P9CEi8qSTw3SfxLJPHcJPFAknggSTyQJB5IEveTxANJ4n6SuJ8kHkgS95PE/SRxP0ncTxL3kwSAJCQBIIn7SeJ+kgCQhCQAJHE/SdxPEgCSkASAJCQBIAlJAEhCEgCSkASAJCQhCQBJSEISAJKQhCTuJwlJSOJ+kpCEJCQhCUlI4t9CEpKQhCQkIYn7SUISkpDE/SQhCUkASEIS95OEJAAkIQkASUgCQBKSAJCEJAAkcT9JAEjifpIAkIQkACRxP0kASOJ+kgCQxP0kcT9JAEjifpK4nyT+I0jiBZHECyKJ/wySeG6S+J/ENv9f2OZFYZv/aLZ5UdnmRWWbfw3b/GvY5l/DNv9atvnXss2/lm3+tWzzr/XoRz8agN/6rd/6Hq666qqrrvq3Irjqqquuuurf7O///u9/G+Caa67hfzJJPD+SeH4k8fxI4kUliecmiecmiecmiX+JJB5IEg8kiQeSxANJ4n6SeCBJ3E8SL4gk7ieJ+0nifpK4nyQAJCEJAEncTxL3k8T9JAEgiftJ4n6SAJCEJAAkcT9JAEhCEgCSkASAJCQBIAlJ3E8SkgCQhCQkcT9JSEISAJKQhCQk8UCSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhiftJQhKSkMT9JCEJSdxPEpIAkIQk7icJSQBIQhIAkrifJO4nCQBJ3E8SAJKQBIAk7icJAEk8N0k8N0ncTxLPTRL3k8Rzk8T9JHE/SdxPEveTxAsiiRdEEv8ekrjqP59t/iW2+e9gm/9otvnPYpt/Ddv8a9jmX8s2/1q2+deyzb+Wba666qqrrvpvQ3DVVVddddW/2dmzZ58BcO211/KvIYn/aJL47yCJ/0iSeG6SeCBJ/GtI4oEk8YJI4n6SeCBJ3E8S95PE/SRxP0ncTxIAkrifJO4niftJAkASkgCQxP0kASAJSQBIAkASkgCQhCQAJHE/SQBIQhIAkpDE/SQhCQBJSOJ+kpCEJAAkIQlJ3E8SkpCEJCRxP0lIQhKSkIQkJCEJSUhCEpKQhCQkIYkHkoQkJCEJSQBIQhKSuJ8kJHE/SUgCQBKSuJ8k7icJAElIAkASkgCQBIAkJAEgiftJAkASz00SAJK4nyQAJHE/STw3SdxPEs9NEveTxP0k8a8hiX8LSTyQJB5IEv/VJPHfyTb/mWzzX8U2LwrbvChs86KyzX8G27yobPOvYZt/Ddv8a9nmX8s2/xq2sc2/lm3+LWxz4403AvAP//APv81VV1111VX/VlSuuuqqq676N7vvvvtuBdja2uI/iiReEEn8a0ni+ZHE8yOJ50cSLypJPDdJPDdJ/Esk8S+RxANJ4gWRxANJ4n6SeEEkcT9J3E8S95PE/SRxP0kASOJ+krifJO4nCQBJ3E8SAJK4nyTuJwkASdxPEgCSuJ8k7ieJ+0nifpK4nyTuJ4kHksQDSeK5SeJFIYl/iW3uJ4nnxzYAkrifbSRxP9tI4n62kQSAbSQBYBtJANhGEgC2kYRtACRhG0nYBkAStpGEbQAkYRtJ2EYStgGQhG0kYRsASdhGErYBkIRtJGEbAEnY5oEkYRsASdjmBZGEbQAkYRsASdjmXyIJ2/xnkYRtrgLbXAW2eVHZ5kVlm/8stvnPZpt/Ldv8a9jm38I2/xa2AbjxxhsB+Id/+Iff5qqrrrrqqn8rKlddddVVV/2bnT179lb+B5DEfwdJPDdJPDdJPDdJPDdJ/Esk8UCSeCBJPJAk7ieJB5LE/STxQJK4nyTuJ4n7SeJ+krifJO4nCQBJ3E8S95MEgCTuJ4n7SQJAEveTBIAk7icJAEncTxIAkrifJO4niftJ4n6SuJ8k7ieJB5LEA0ni+ZHEv5ckXhDbAEjigWwjifvZRhIAtgGQBIBtJAFgG0kA2EYSALaRhG0kAWAbSdhGEgC2kYRtJGEbAEnYRhK2kYRtACRhG0nY5oEkYZsHkoRtHkgStgGQhG0eSBK2AZCEbQAkYZvnJgnbAEjCNgCSsM3zIwnbvCCSsM39JGGb+0nCNi+MJGzzL5GEbV4UkrDN/3W2+ZfY5l9imxeFbV4UtvmPZpsXlW3+NWzzn8k2/xq2+deyzb+Gbf4tbPNvYZv77ezsAHDffffdylVXXXXVVf9WBFddddVVV/2b3Xfffbfed999t25ubnLttdfyP40k/jUk8fxI4rlJ4j+SJJ6bJB5IEg8kiQeSxANJ4gWRxAsiiftJ4n6SuJ8k7ieJ+0nifpIAkMT9JHE/SQBI4n6SAJCEJAAkASAJSQBIAkASkgCQBIAkJAEgiftJAkASkgCQhCQAJCEJAElIAkASkgCQhCQkASAJSUjifpKQhCQkcT9JSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpK4nyQkIQlJ3E8SkpAEgCQkASAJSUgCQBKSAJCEJAAkcT9JAEhCEgCSAJDE/SQBIAkASdxPEgCSAJDE/SQBIAkASdxPEgCSuJ8kACRxP0k8N0m8qCTxryWJF0QS/xUk8Z9BEv9VbHPVC2eb/262+dewzb+Gbf41bPOvZZt/Ddv8W9jm38I299vZ2eGqq6666qr/EARXXXXVVVf9u5w9e/ZWnosk/i0k8YJI4j+KJF5UknhRSeK5SeK5SeJfIokHksQLI4kHksQDSeJ+knggSdxPEveTxP0kcT9J3E8S95PE/SQBIIn7SeJ+kgCQxP0kASCJ+0kCQBL3kwSAJO4nCQBJAEhCEgCSkASAJAAkIQkASUgCQBKSAJCEJAAkIQkASUhCEgCSkIQkJAEgCUlIQhKSuJ8kJCEJSUhCEpKQhCQkIQlJSEISkpDE/SQhCUlIQhIAkpCEJO4nCUkASEISkgCQhCQAJHE/SQBIQhIAkrifJAAkASAJSQBIAkASAJK4nyQAJAEgiecmCQBJPDdJPDdJPDdJPDdJ3E8S95PE/SRxP0ncTxL3k8QLIon/SJK46l9mm38v2/xHsc2LwjYvCtu8qGzzorLNi8o2/xq2+dewzb+Gbf61bPOvYZt/C9v8W9jmgW688UYAfuu3fuu7ueqqq6666t+D4Kqrrrrqqn+Xv//7v/9tgGuuuYYXhST+I0niP4IkXlSSeFFI4rlJ4rlJ4l9LEi+IJB5IEi+IJO4niftJ4n6SuJ8k7ieJ+0nifpIAkMT9JHE/SQBI4n6SAJDE/SQBIAkASUgCQBIAkpAEgCQAJHE/SQBIQhIAkgCQhCQAJCEJAElIAkASkgCQhCQAJCEJSQBIQhKSkASAJCQhCUlIQhIPJAlJSEISkpCEJCQhCUk8kCQkIQlJSOJ+kpCEJAAkIQlJAEhCEveThCQAJAEgCUkASEISAJIAkIQkACQBIIn7SQJAEgCSAJDE/SQBIAkASQBI4n6SAJAEgCTuJwkASTw3STw3SdxPEv/RJPGCSOKBJPFAknggSVz1H882/xFs8x/FNv/RbPOiss2Lyjb/Grb517DNv4Zt/rVs869hm38L2/xb2Oa5bW9vA3DffffdylVXXXXVVf8eBFddddVVV/27/MM//MPvAFx77bX8TyKJ50cSLypJvKgk8W8hiecmiQeSxANJ4oEk8YJI4oEkcT9J3E8S95PE/SRxP0ncTxL3k8T9JAEgiftJ4n6SAJDE/SQBIIn7SQJAEgCSuJ8kACQBIAlJAEgCQBKSkIQkACQhCUlIAkASkgCQhCQAJCEJAElIAkASkgCQhCQkASAJSUhCEveThCQkIQlJSEISLypJSEISkpCEJCQBIAlJSEISAJKQhCQAJCEJAElIQhIAkgCQhCQAJCEJAEkASEISAJIAkASAJCQBIAkASQBIAkASz00SAJIAkMRzkwSAJJ6bJAAkcT9JAEjifpJ4bpK4nyTuJ4n7SeJ+krifJP67SOLfShJX/eeyzX8k2/xHs81/Ftv8a9jmX8M2/1q2+dewzb+WbWzzb2Gb52dnZweAs2fPPoOrrrrqqqv+PahcddVVV13173L27NlbAba2tvjPIon/TJJ4UUniuUniuUniuUnigSTx3CTxQJJ4IEk8kCQeSBL3k8QDSeJ+krifJP41JHE/SdxPEgCSuJ8k7icJAEncTxIAkgCQxP0kASAJAEncTxIAkgCQxP0kASAJAEncTxIAkrifJO4nCQBJ3E8SDySJ+0nigSTx/EjiP5ptACTxQLaRxP1sIwkA20jifraRhG0kAWAbSQDYRhK2kQSAbSRhG0nYRhK2AZCEbSRhG0nYRhK2kYRtJGEbAEnYRhK2kYRtJGGbB5KEbSRhmweShG0eSBK2eSBJ2OY/iyRs819JErZ5IEnY5n872/xns82/xDb/UWzzorDNi8o2/xls86Kyzb+Gbf41bPOvZZt/Ddv8a9nm38o2L8iNN94IwD/8wz/8NlddddVVV/17ULnqqquuuuo/xObmJv8ekvjXksTzI4nnRxIvKkn8R5LEv0QS/xqSeCBJvCCSuJ8kXhBJ3E8S95MEgCTuJ4n7SeK5SeJ+kgCQxP0kASAJAEncTxIAkgCQxP0kASAJAEkASOJ+kgCQBIAk7icJAEncTxIAkrifJO4niftJ4oEk8UCSeH4k8R/FNpJ4braRxP1sI4nnxzaSeCDbSALANpKwjSQAbCMJ20jCNpKwjSQAbCMJ20jCNpKwjSRsIwnbSMI2DyQJ20jCNpKwjSRs80CSsI0kbPNAkrDNA0nCNg8kCdsASMI2AJKwzQsjCdsASMI2z48kbHM/SdjmfpKwzf0kYZv7ScI2Vz1/tvmfwjb/HWzzorLNi8o2/1ls869hm38t2/xns82/hW3+JTs7OwDcd999t3LVVVddddW/B8FVV1111VX/Lvfdd9+t//AP//DbANdeey2SeEEk8a8lif9MknhRSeK5SeK5SeJfIol/iSQeSBIviCQeSBL3k8QLIon7SeJ+krifJJ6bJO4niftJAkAS95MEgCTuJwkASQBI4n6SAJAEgCQAJCEJAEkASAJAEgCSkASAJAAkASAJSQBIAkASkgCQBIAkJAEgCUkASEISAJKQhCQAJCEJSQBIQhKSkIQk7icJSUhCEpKQhCQkIQlJSEISkpCEJO4nCUlIQhKSAJCEJCQBIAlJSAJAEpIAkIQkACQBIAlJAEgCQBKSAJAEgCQAJAEgCUkASAJAEgCSAJAEgCQAJAEgCQBJvCCSAJAEgCSemyQAJPHcJPHcJHE/SbwwkrifJF4Ukrjqfwbb/E9imxeFbf6j2eZFZZt/Ddv8T2Kbfy3b/GvY5t/CNv+SG2+8EYD77rvvVq666qqrrvr3onLVVVddddX/SpJ4fiTx/EjiRSWJ5yaJ5yaJ5yaJ5yaJB5LEc5PEA0nigSTxQJJ4QSTxgkjifpK4nyTuJ4n7SeJ+kgCQxP0kcT9JAEjifpIAkMT9JAEgCQBJAEjifpIAkASAJAAkcT9JAEgCQBIAkgCQxP0kASAJAEncTxIAkrifJO4niftJ4n6SeCBJPJAkXhhJvKhsAyCJ58c2krifbSRxP9tIAsA2kgCwjSQeyDaSsI0kAGwjCdtIwjaSsI0kAGwjCdtIwjaSsI0kbCMJ20jCNpKwjSRsIwnbSMI2krDN8yMJ20jCNg8kCdtIwjYPJAnbvCCSsA2AJGzzwkjCNgCSsM3zIwnb/EeRhG3+o0jCNv8f2eZfYpt/iW3+O9jmv5tt/jVs869hm38N2/xr2eZfwzb/FrZ5Uezs7ADwD//wD7/NVVddddVV/14EV1111VVX/bv9/d///W8DXHPNNfxbSOK/gyT+s0niXyKJB5LEA0nigSTxQJK4nyQeSBL3k8T9JHE/SdxPEveTxP0k8dwkcT9JAEjifpIAkMT9JAEgCQBJAEjifpIAkASAJAAkASAJSUhCEgCSAJAEgCQAJCEJAEkASAJAEpIAkASAJCQBIAlJSEISkpCEJCQBIAlJSEISkpCEJAAkIQlJSEISkpDE/SQhCUlIQhKSkMT9JCEJSUhCEpK4nyQkIQkASUhCEgCSkASAJCQBIAlJAEgCQBKSkIQkACQBIAkASQBIQhIAkgCQBIAkACQBIAkASQBIAkASAJIAkASAJAAkASAJAEk8N0kASOK5SQJAEs9NEveTxAsjiftJ4t9LEg8kiRdGEv8SSVz1P5ttXhS2eVHY5kVlmxeVbV5UtvnXsM2/hm3+NWzzr2Wbfw3b/FvY5kV14403AnDffffdylVXXXXVVf9eBFddddVVV/27/cM//MPvAFx77bW8IJL415LEv4Yknh9JvKgk8dwk8dwk8dwk8S+RxL+HJB5IEi+IJO4niftJ4n6SuJ8k7ieJ+0nifpIAkMT9JAEgiftJAkAS95MEgCQAJAEgiftJAkASAJIAkASAJAAkASAJSUhCEgCSAJAEgCQkIQlJSEISAJKQhCQkASAJSUhCEgCSkASAJCQhCUlIQhIAkpCEJCQBIAlJSEISkpCEJCTxwkhCEpKQhCQkIQkASUhCEpIAkIQkJAEgCUkASEISAJKQBIAkACQhCQBJAEgCQBIAkpCEJCQBIAkASQBIAkASAJIAkASAJAAkASAJAEkASAJAEgCSAJAEgCQAJPHcJAEgiecmCQBJ3E8Sz00S95PEv4Yk7ieJfytJ/EeQxHOTxFUvOtv8S2zzP5ltXlS2eVHZ5l/DNv8atvnXsM2/lm3+NWzzb2Gbf4uzZ88+g6uuuuqqq/69qFx11VVXXfXvdvbs2VsBtra2+K8giX8vSfxHksRzk8QDSeK5SeKBJPFAknhBJPFAkrifJO4niX8NSdxPEveTBIAk7ieJ5yYJAEncTxIAkgCQBIAk7icJAEkASAJAEgCSAJAEgCQAJAEgiftJAkASAJIAkASAJAAkcT9JAEjifpK4nyTuJ4n7SeKBJPHcJPEfyTaSeGFsI4kXxjaSeCDbSMI2knh+bCMJ20jCNpKwjSRsIwnbSMI2krCNJGzz7yUJ20jCNpKwzfMjCds8kCRs80CSsM0LIgnbAEjCNgCSsM2/RBK2+Y8iCdv8b2ebfyvbvDC2+Z/CNi8K27wobPMfzTb/WWzzr2Gbfw3b/GvZ5l/DNv8WtvnXuvHGGwH4h3/4h9/mqquuuuqqfy8qV1111VVX/bvdd999twJsbm7yryWJ/0ySeFFJ4rlJ4rlJ4l8iiX+JJB5IEg8kiQeSxAsiiftJ4gWRxP0kcT9JPDdJ3E8Sz00S95MEgCQAJHE/SQBIAkASAJIAkMT9JAEgCQBJAEgCQBIAkgCQBIAkACQBIAkASQBI4n6SAJAEgCQAJHE/SQBI4n6SuJ8kHkgSDySJ5yaJ/wi2kcRzs40knh/bSALANpJ4INtIwjaSeCDbSMI2krCNJGwjCdtIwjaSsI0kbCMJ20jCNpKwDYAkbCMJ20jCNpKwjSRsIwnbSMI2krDN8yMJ20jCNpKwzQNJwjYPJAnbPJAkbPPvJQnbPD+SsM39JGGbF0QStvmvJAnb/HexzX8m2/xfZ5v/DLZ5UdnmX8M2/xq2+deyzb+Gbf4tbPNvsbOzA8B99913K1ddddVVV/17EVx11VVXXfUf4h/+4R9+G+Caa67hP4Iknh9JPD+SeFFJ4rlJ4kUhiecmiX+JJP41JPFAknggSdxPEi+IJO4niftJ4n6SuJ8kACRxP0ncTxIAkrifJAAkASCJ+0kCQBIAkgCQBIAk7icJAEkASAJAEgCSAJAEgCQAJAEgCQBJAEgCQBIAkpCEJCQhCUkASAJAEpKQhCQAJCEJAElIAkASkpCEJCQhCUlIQhKSkIQkACQhCUlIQhKSkIQkJCEJSUhCEpKQhCQAJCEJSUhCEgCSkIQkACQhCQBJSAJAEpIAkASAJCQhCUkASAJAEgCSAJAEgCQAJAEgCQBJAEgCQBIAkrifJAAkASAJAEkASAJAEgCSAJAEgCQAJAEgiRdEEgCSeG6SeG6SeG6SuJ8k7ieJ+0nifpL4jyCJq/572eZfYpt/iW1eFLZ5UdjmRWGbF5VtXlS2+c9im38N2/xr2eZfwzb/Frb5t7jhhhsA+Id/+Iff5qqrrrrqqv8IBFddddVVV/2HuO+++24F2Nra4rlJ4r+DJP49JPFvIYkHksRzk8QDSeIFkcQDSeJ+knggSdxPEveTxP0kcT9J3E8Sz00S95MEgCTuJwkASTw3SQBIAkASAJIAkMT9JAEgCQBJAEgCQBIAkgCQBIAkACQBIAkASQBIAkASAJIAkASAJCQhCUlIQhIAkpCEJCQhCUlIQhKSkIQkACQhCUkASEISkpCEJAAkIQlJSEISkpCEJCQhCUlIQhKSAJCEJCQhCUkASEISkgCQhCQkIQlJSEISkgCQhCQkIQkASQBIAkASAJIAkASAJAAkASAJAEkASAJAEgCSuJ8kACQBIAkASQBIAkASAJJ4UUgCQBIAknhBJPHcJPHcJPEfTRIPJIn/SJK46v822/xHs82Lyjb/GrZ5UdnmP5tt/ivY5t/CNjs7OwDcd999t3LVVVddddV/BCpXXXXVVVf9h7jvvvtuBdjc3ORFJYl/DUk8P5J4UUniuUniuUniuUniuUnigSTxL5HEA0nigSTxgkjiBZHE/SRxP0ncTxL3k8T9JHE/SQBI4n6SAJDE/SQBIIn7SQJAEgCSAJAEgCQAJHE/SQBIAkASAJKQBIAkACQBIAkASQBIAkASAJIAkASAJAAkASAJAEncTxIAkgCQxP0kcT9J3E8S95PEc5PE8yOJfw3bSOK52UYSL4htJAFgG0k8kG0kYRtJ/FvZRhK2kYRtJGEbSdhGEgC2kYRtJGEbSdhGErZ5fiRhG0nYRhK2kYRtnh9J2EYStpGEbR5IErZ5IEnY5oEkYRsASdgGQBK2AZCEbQAkYRsASdjmRSEJ27yoJGGbF0YStvmXSMI2LwpJ2OZ/Mtu8MLb597LNfxTb/EeyzX832/xnss2/hm3+tWzzr2Wbfy3b3O+mm24C4B/+4R9+h6uuuuqqq/4jULnqqquuuuo/xD/8wz/8DsA111zDv5ck/r0k8Z9NEv8SSTyQJB5IEg8kiQeSxAsiiftJ4n6S+JdI4n6SuJ8kACRxP0k8N0kASOJ+kgCQBIAkACQBIAkASdxPEgCSkASAJAAkASAJAEkASAJAEgCSAJAEgCQAJAEgCQBJAEgCQBIAkgCQBIAk7icJAEncTxL3k8QDSeKBJPGCSOJFYRtJvChsI4nnZhtJANhGEs+PbSRhG0nYRhK2kYRtJGEbSdhGEgC2kYRtJGEbSdhGErYBkIRtJGEbSdhGErYBkIRtJGEbSdhGEraRhG0kYRtJ2EYStpGEbZ4fSdhGErZ5IEnY5oEkYZv/SJKwzYtCEra5nyRs8+8lCdv8R5OEbf4vsM1/BNv8R7HNi8I2LyrbvKhs86Kyzb+Gbf41bPOvYZt/Ldv8a9nmX8s2D7S9vc1VV1111VX/oahcddVVV131H+Ls2bO3AmxtbfFfSRIvKkk8N0k8N0k8N0n8SyTxQJL495DEA0nifpK4nyReEEncTxLPTRL3k8Rzk8T9JAEgiecmCQBJAEgCQBIAkgCQxP0kASAJSQBIAkASAJIAkASAJAAkASAJAEkASAJAEpIAkASAJAAkASAJAEncTxIAkgCQxP0kASCJB5LE/STxQJJ4YSTxgtgGQBLPj20kcT/bSOJ+tpHEC2IbSdhGEraRxHOzjSRsIwnbSMI2krCNJABsIwnbSMI2krCNJABsIwnbSMI2krANgCRsIwnbSMI2krDNi0oStpGEbSRhm+dHErZ5IEnY5oEkYRsASdjmRSUJ2zw/krDNVf9/2ea/g21eVLZ5UdnmX8M2/xq2+dewzb+Wbf61bPOvZZvntrOzA8A//MM//DZXXXXVVVf9R6By1VVXXXXVf4j77rvvVoDNzU02Nzc5PDwEQBLPjySeH0k8P5J4UUniP5IknpskHkgS/xJJPJAkHkgS95PEA0nifpJ4QSRxP0ncTxL3k8Rzk8T9JAEgiftJAkAS95MEgCQAJAEgCQBJAEjiuUkCQBKSAJAEgCQAJAEgCQBJAEgCQBIAkpAEgCQAJAEgCQBJAEgCQBIAkgCQBIAkACRxP0kASOJ+krifJO4niecmiX+JJB7INpJ4QWwjiRfENpIAsI0kAGwjiRfGNpKwjSSeH9tIwjaSsI0kAGwjCdtIwjaSsA2AJGwjCdtIwjYAkrCNJGwjCds8kCRsIwnbSMI2krCNJGzzwkjCNpKwzQNJwjYPJAnbvCCSsA2AJGwDIAnb/GtJwjb/VpKwzf91tvnvZJt/iW3+o9jmRWGb/2i2+c9im38N2/xr2OZfyzb/Wrb517LN87OzswPAfffddytXXXXVVVf9RyC46qqrrrrqP8w//MM//DbA5uYm/xUk8aKSxHOTxHOTxL9EEv8SSTyQJB5IEg8kiRdEEi+IJO4niftJ4n6SuJ8k7icJAEncTxLPTRIAkrifJAAkASAJAEm8IJIAkASAJCQBIAkASQBIAkASAJIAkASAJCQhCUkASAJAEgCSkIQkJCEJSUhCEpKQhCQkIQlJSAJAEpKQhCQAJCEJSUhCEpKQhCQAJCEJSUhCEpKQhCQkIQlJSEISz00SkpCEJCQhCUlIQhKSkIQkACQhCUlIQhKSkIQkACQhCQBJAEgCQBIAkgCQBIAkACQBIAlJSEISAJIAkIQkACQBIAkASUgCQBIAkrifJAAkASCJ+0kCQBIAkgCQBIAkACQBIAkASQBIAkASL4gknpsknpsk/iNI4kUliQeSxANJ4l8iiauezTb/U9jmv4Nt/jPY5kVlm38N2/xr2OZfyzb/Wrb517LN8/OYxzwGgH/4h3/4ba666qqrrvqPQnDVVVddddV/mPvuu+9WgGuvvZb/SJJ4UUni30oSz00S/xJJPJAk/jUk8UCSeEEkcT9J3E8S95PE/SRxP0ncTxLPTRL3kwSAJJ6bJAAkASCJ5yYJAEkASAJAEgCSkASAJAAkASAJAEkASAJAEpKQhCQAJAEgCQBJSEISkgCQBIAkACQBIAkASQBIAkASkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQAJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUkASEISkpCEJCQhCQBJSAJAEpKQhCQAJCEJSUhCEpKQhCQkIQlJSEISAJIAkASAJCQBIAkASUgCQBIAkrifJAAkcT9JAEjiuUkCQBIAkviPIAkASTw3STw3STw3SdxPEveTxP0kcT9JvCCS+J9KEv/f2Obfyzb/UWzzorDNi8I2LyrbvKhs85/FNv8atvnXss2/lm3+tWzzL7nvvvtu5aqrrrrqqv8oVK666qqrrvoPc999990KsLm5CYAknh9JPD+S+M8giecmiX8LSTyQJP4lknggSbwgknggSdxPEveTxL+GJO4niftJAkAS95MEgCTuJwkASQBIAkAS95MEgCQAJAEgCQBJAEjifpIAkASAJAAkASAJAElIAkASAJIAkIQkACQBIAkASUgCQBIAkgCQBIAkACQBIAkASdxPEgCSuJ8k7ieJ+0niuUnifxrbSMI2krCNJGwjCdtIwjaSeCDbSMI2kgCwjSRsIwkA20jCNgCSsI0kbAMgCdtIwjYAkrCNJGwjCds8kCRsIwnbSMI2krCNJGwjCdtIwjaSsM3zIwnb/EskYZv/TJKwzX8mSdjmgSRhm//tbPOfyTb/EWzzP5ltXlS2+dewzYvKNv8atvnXss2/lm3+tWzzwtx0000A/MM//MPvcNVVV1111X8UKlddddVVV/2H+Yd/+IffAdjc3OQ/mySemyReFJJ4bpJ4bpJ4IEn8SyTxQJJ4IEk8kCReEEncTxIviCTuJ4n7SeK5SeJ+knhukgCQxP0kASAJAEk8N0kASAJAEgCSAJAEgCQAJCEJAEkASAJAEgCSkASAJAAkASAJSQBIAkASAJKQBIAkACQBIAkASUgCQBIAkgCQxP0kASAJAEncTxL3k8T9JPHcJPGfxTaSeGFsI4l/K9tIwjaSALCNJGwjCQDbSMI2AJKwjSQAbCMJ20gCwDaSsI0kAGwjCdtIwjYAkrCNJGwjCdv8a0nCNpKwjSRs80CSsI0kbPOCSMI2AJKwzQsjCdsASMI2LwpJ2OYFkYRt7icJ21z1v59tXhS2eVHY5r+bbf4nsc2/lm3+tWzzL7nxxhsBuO+++27lqquuuuqq/yhUrrrqqquu+g9z9uzZWwG2trb4jyKJfw9J/FtI4l8iiQeSxAsjiQeSxANJ4n6SeEEkcT9J3E8S95PE/STx3CRxP0kASOK5SQJAEs9NEgCSAJAEgCQAJAEgCQBJAEhCEgCSAJAEgCQAJCEJAEkASAJAEpIAkASAJCQBIAkASQBIQhIAkgCQBIAkACQBIAkASQBIAkAS95MEgCTuJ4kHksQDSeI/gm0k8YLYRhIAtpHEA9lGEraRhG0kYRtJ2EYStpGEbSQBYBtJ2EYSALaRhG0kAWAbSQDYRhK2AZCEbSRhGwBJ2EYStgGQhG0kYRsASdhGErZ5IEnYRhK2kYRtJGEbSdhGErZ5YSRhm+dHErYBkIRtXhBJ2AZAErb5l0jCNi8KSdjmqv94tvn3ss2/xDb/UWzzH802LyrbvKhs869hm38N2/xr2OZfyzb/WrZ5Uezs7ABw9uzZW7nqqquuuuo/CpWrrrrqqqv+w9x333233nfffbdec801D97a2uLw8JDnJonnRxIvKkk8N0k8N0k8N0k8N0n8SyTxQJL4l0jiBZHEA0niBZHE/SRxP0ncTxL3k8T9JHE/SQBI4n6SAJDE/SQBIInnJgkASQBIAkASAJIAkASAJAAkASCJ+0kCQBIAkgCQhCQAJAEgCUkASAJAEgCSkASAJAAkIQkASQBIQhIAkgCQBIAkACQBIAkASQBI4n6SAJDE/STxQJJ4IEn8b2UbSTyQbSQBYBtJ2EYSALaRBIBtJAFgG0nYRhIAtpGEbQAkYRtJ2AZAEraRhG0AJGEbSdhGEraRhG3+JZKwjSRsIwnbPD+SsM0LIgnb/EeThG3+o0jCNv9RJGGb/21s8+9hm/8qtvmPZJsXhW1eVLZ5UdnmX8M2/xq2+dewzb+Wbf61bPOvdd99993KVVddddVV/1EIrrrqqquu+g919uzZWwE2Nzf595LEfwdJ/GtJ4oEk8UCSeEEk8UCSuJ8k7ieJ+0nifpK4nyTuJ4n7SeK5SeK5SQJAEveTBIAkACQBIAkASQBIAkASAJIAkASAJAAkIQkASQBIAkASkgCQBIAkJAEgCQBJSEISkgCQhCQkIQkASUhCEpIAkASAJCQhCUlIQhKSkIQkJCEJAElIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQBIAkJCEJSUhCEpKQBIAkJCEJSUhCEpKQhCQAJAEgCQBJSAJAEgCSkASAJCQBIIn7SeJ+kgCQhCQAJHE/SdxPEgCSuJ8kACRxP0kASOIFkQSAJAAkASCJf4kkACTx3CTxwkjifpK4nyTuJ4n7SeJFJYl/DUlc9T+Tbf6j2OZFYZv/aLb5z2Kbfw3b/GvY5l/LNv9atnlRPeYxjwHgt37rt76Hq6666qqr/iMRXHXVVVdd9R/q7//+738b4JprruFFJYkXlSSemySemySemySemyT+JZJ4IEk8kCReGEk8kCReEEncTxL/VpK4nyTuJwkASdxPEgCSeG6SAJAEgCQAJAEgCQBJAEgCQBIAkgCQBIAkJAEgCQBJAEhCEgCSAJCEJAAkASAJSQBIQhKSkASAJCQhCUkASEISkpCEJCQBIAkASUhCEpKQhCQkIQlJSEISkgCQhCQkIQlJSEISkpCEJAAkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJAEhCEpKQBIAkACQBIAkASUhCEpKQhCQAJCEJSUgCQBKSAJCEJAAkIQkASUgCQBL3k8T9JAEgCUkASOJ+knhuknhukgCQBIAkXhSSAJAEgCReEEk8N0n8R5PEi0oSDySJfy1JXPUfyzb/EWzz38E2/xls86Kyzb+Gbf41bPNfwTZXXXXVVVf9j0Bw1VVXXXXVf6izZ88+A+Daa6/luUniRSWJ/2ySeG6SeCBJ/GtJ4gWRxANJ4n6SeEEkcT9J3E8S95PEc5PE/SQBIIn7SQJAEveTBIAkACQBIAkASQBIAkASAJIAkASAJAAkASCJ+0kCQBIAkpAEgCQAJCEJAEkASEISAJKQBIAkACQhCQBJSEISkgCQhCQkIQlJSEISkgCQBIAkACQhCUlIQhKSkIQkJAEgCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQBIAlJSEISkpCEJAAkIQlJSEISkpCEJCQhCUlIQhKSkIQkACQBIAlJSEISAJKQBIAkJAEgCUkASEISAJKQBIAkJAEgCUkASOJ+krifJO4nCQBJ3E8SAJIAkMRzkwSAJAAkASCJf4kkACTx3CTx3CRxP0n8a0jiBZHEfzVJPDdJ/FezzVUvnG1eFLZ5UdjmRWWbF5VtXlS2+dewzb+Gbf4tbPOvYZt/rRtvvBGAf/iHf/htrrrqqquu+o9E5aqrrrrqqv9Q9913360Am5ub/EeTxHOTxHOTxHOTxL9EEv8SSTyQJB5IEg8kiRdEEi+IJO4niftJ4n6SuJ8k7ieJ5yaJ5yaJ5yYJAEkASOJfQxIAkgCQBIAkACQhCQBJAEhCEgCSAJCEJAAkASAJSQBIQhIAkpAEgCQAJCEJAElIAkASAJKQBIAkACQBIAkASQBIAkASAJK4nyTuJ4n7SeKBJPHfwTaS+JfYRhIPZBtJ2EYSALaRBIBtJAFgG0kA2EYSALYBkIRtACRhGwBJ2AZAErYBkIRtJAFgG0nYBkAStpGEbR5IEraRhG0kYZv7ScI295OEbSRhG0nY5vmRhG0eSBK2eUEkYRsASdgGQBK2+a8mCdv8b2ebF8Q2/1a2eWFs8+9lm3+Jbf4ns82Lyjb/WWzzr2Gbfwvb/GvY5l/LNjfddBMA//AP//DbXHXVVVdd9R+JylVXXXXVVf+hzp49eyv/CpL47yCJf4kkHkgSDySJB5LEA0nigSRxP0k8kCTuJ4n7SeJ+krifJO4niftJ4n6SAJDE/SQBIIn7SQJAEgCSeG6SAJAEgCQAJAEgiftJAkASAJIAkIQkACQBIIn7SQJAEpIAkIQkACQBIAlJAEhCEgCSkASAJCQBIAkASUgCQBIAkpAEgCQAJAEgCQBJAEgCQBL3k8T9JHE/STyQJP472UYStpGEbSRhG0k8kG0k8UC2kQSAbSQBYBtJANhGEgC2AZAEgG0kAWAbSQDYRhIAtpEEgG0kYRsASdgGQBK2kYRtACRhG0nY5vmRhG3uJwnbvCgkYZsHkoRtHkgStvn3koRtnh9J2OZ+krDNCyIJ2/xXkoRt/j+yzX8V27wobPOisM1/N9v8T2Obfw3b/GvZBmBnZweA++6771auuuqqq676j0Rw1VVXXXXVf6j77rvv1vvuu+/Wzc1NrrnmGu4niReVJJ6bJJ6bJJ6bJJ6bJP4lknggSfxHksQLIon7SeLfShL3k8Rzk8RzkwSAJJ6bJAAkASAJAEkASAJAEgCSuJ8kACQBIIn7SQJAEgCSkASAJCQBIAlJAEgCQBKSAJCEJAAkIQkASUgCQBKSkIQkACQhCUlIAkASkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEgCSkIQkJAEgCUkASEISAJKQBIAkJHE/SUgCQBKSuJ8k7ieJ+0nifpK4nyTuJwkASdxPEs9NEgCSAJDEA0nigSQBIAkASQBI4rlJ4rlJ4rlJ4n6SuJ8k7ieJ+0niBZHEi0oS/1qS+P/CNv+dbPMvsc1/FNv8R7PNi8o2Lyrb/GvY5l/DNv9atvnXsM2/lm0AdnZ2uOqqq6666j8Nlauuuuqqq/7DnT179tZrrrnmwfwLJPHfQRL/WpJ4IEk8kCQeSBIviCTuJ4kXRBL3k8T9JHE/STw3SdxPEgCSuJ8kACTx3CQBIAkASQBIAkASAJIAkASAJAAkIQkASQBIAkASkgCQBIAkJAEgCUkASOJ+kgCQhCQAJCEJAElIAkASkgCQhCQAJCEJAElIAkASAJKQBIAkACQBIAkASQBI4n6SuJ8k7ieJ5yaJ/0i2kcRzs40kXlS2kcQD2UYSALaRBIBtJAFgG0kA2AZAEgC2kQSAbQAkAWAbSQDYBkAStgGQhG0AJGEbAEnYRhK2AZCEbQAkYRtJ2Ob5kYRt7icJ27woJGGbf4kkbHPV/z22+Z/CNv+RbPOisM2LyjYvKtv8a9jmX8M2/1q2+dewzb+Wbe530003AfBbv/Vb381VV1111VX/0Qiuuuqqq676D/f3f//3vw1wzTXX8K8liReFJJ6bJJ6bJP4lknggSTyQJB5IEg8kiQeSxANJ4n6SeEEkcT9J3E8S95PE/SRxP0kASOJ+knhukgCQxP0kASAJAEkASAJAEgCSAJAEgCQAJAEgiftJAkASAJKQBIAkACQhCQBJSAJAEgCSkASAJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJAEhCEpKQBIAkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhIRgSQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpIAkIQkJCEJSUhCEpKQhCQkIQkASUhCEpIAkIQkACQhCQBJSAJAEpIAkIQkJAEgCUncTxKSAJCEJO4nCUkASEISAJKQxP0kASCJ+0nifpIAkMT9JAEgCQBJvCgkASAJAEm8IJJ4YSTxbyWJF0QS/x6S+JdI4kUhif8rbPPvYZv/SWzzorDNfzTb/Gexzb+Gbf61bPOvYZt/Lds80Pb2NgD33XffrVx11VVXXfUfjeCqq6666qr/cP/wD//wOwDXXnstAJL495DEv4UknpskHkgS/5kk8YJI4n6SuJ8k7ieJ+0nifpK4nySemyTuJwkASTw3SQBIAkASAJJ4fiQBIAkASQBIAkAS95MEgCTuJwkASUgCQBL3kwSAJCQBIAlJSAJAEpIAkIQkACQhCQBJSAJAEpIAkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkASAJAEkASAJAEpKQhCQAJCEJSUhCEpKQhCQAJCEJAElI4n6SkMT9JCEJAElI4n6SkMT9JHE/SdxPEpIAkMT9JHE/STw3SQBI4rlJAkASAJIAkMS/RBIAknhuknhhJHE/SdxPEveTxAsiiRdEEg8kiQeSxH8ESfx7SOL/M9v8S2zzL7HNfwfb/GewzYvKNv8atvnXss1/Nts8t52dHQDOnj37DK666qqrrvqPRuWqq6666qr/cGfPnr0VYHNzkxdEEv+RJPEvkcS/RBIPJIkHksQDSeKBJHE/STyQJO4niX8rSdxPEveTxHOTBIAk7icJAEkASOIFkQSAJJ6bJAAkASAJAElIAkASAJKQBIAk7icJAElIAkASkgCQhCQkASAJSQBIQhIAkpAEgCQkIQkASUgCQBKSAJAEgCQkASAJAElIAkASAJIAkMT9JHE/SdxPEg8kif8tbCMJANtI4n62kQSAbSRxP9tI4n62kQSAbQAkAWAbAEkA2AZAErYBkIRtACRhGwBJ2AZAErYBkIRtJGGbB5KEbSRhmxeVJGwjCds8P5KwzQNJwjb/XpKwzVVX/WvZ5kVhmxeFbV5UtnlR2eZFZZt/Ddv8a9nmX8s2/xq2eX5uuukmAP7hH/7ht7nqqquuuuo/GpWrrrrqqqv+02xubvKvIYnnJonnJol/iST+JZJ4IEk8kCQeSBIPJIkHksQLIokXRBL3k8T9JHE/STw3SdxPEveTBIAknpskACTx3CQBIAkASQBIAkASAJK4nyQAJAEgiftJAkASkgCQBIAkJAEgCUkASEISAJKQhCQAJCEJAElIAkASkpAEgCQkASAJSQBIQhIAkpAEgCQkASAJAElIAkASAJK4nyQAJHE/SdxPEg8kif+JbCMJANtIAsA2kgCwjSTuZxtJANhGEvezDYAkAGwDIAkA2wBIAsA2AJIAsA2AJGwDIAnbAEjCNgCSsA2AJGwjCdsASMI2krDNA0nCNpKwjSRsIwnbSMI2L4wkbPNAkrDNA0nCNgCSsM1/BEnY5j+KJGxz1fNnmxfGNv9etvmX2OZ/Mtu8qGzzn8U2/1q2+deyzb+GbV6QnZ0dAO67775bueqqq6666j8awVVXXXXVVf/h7rvvvlv/4R/+4bcBrr32Wv6zSeJfIon/TJJ4IEncTxIPJIn7SeJ+krifJO4niftJ4rlJ4n6SAJDE/SQBIInnJgkASQBIAkASAJIAkASAJAAkcT9JAEgCQBKSAJDE/SQBIAlJAEhCEgCSkASAJCRxP0lIAkASkpCEJCQhCQBJSAJAEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQREQgCUlIQhKSkEREIAlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhIAkpCEJCQhCUlIQhKSkIQkACQhCUkASEIS95OEJCQBIAlJSOJ+kpDE/SQhiftJQhIAkpDE/SRxP0ncTxLPTRLPTRIAkvi3kASAJJ6bJJ6bJF4YSdxPEveTxAsiiRdEEv8akrjqv45t/qvY5kVhmxeFbf672eZFZZt/Ldv8a9nmX8M2L8hNN90EwH333XcrV1111VVX/WegctVVV1111X85STw3STw3STw3SfxLJPEvkcQDSeKBJPFAknggSbwgknhBJHE/SdxPEveTxP0kcT9J3E8Sz00Sz00SAJK4nyQAJAEgCQBJAEgCQBIAkgCQBIAkACRxP0kASOJ+kgCQhCQAJCEJAElIAkASkgCQhCQAJCEJSQBIQhKSAJCEJAAkIQlJAEhCEgCSkIQkACQhCQBJSAJAEgCSAJCEJAAkcT9JAEgCQBL3k8QDSeK/im0k8YLYRhIPZBtJANhGEgC2kcT9bCOJ+9lGEvezDYAkAGwDIIn72QZAEgC2AZAEgG0AJGEbAEkA2AZAErYBkIRtACRhG0nYBkAStpGEbR5IEraRhG0kYRtJ2EYStpGEbZ4fSdjmXyIJ2/xbSMI2/1qSsM39JGGbfw1J2OY/myRs85/NNv+b2eY/im1eFLZ5UdnmRWWbF5Vt/jPZ5l/LNv8atnlhdnZ2APiHf/iH3+aqq6666qr/DARXXXXVVVf9p/j7v//73wa45ppr+M8kiX+JJB5IEv8aknggSTyQJF4QSdxPEv9WkrifJO4nCQBJ3E8SAJJ4bpIAkASAJF4YSQBIAkASAJIAkIQkACQBIAlJAEjifpK4nyTuJwlJAEhCEgCSkIQkACQhCUkASEISAJKQhCQAJCEJSUhCEpIAkIQkACQhCQBJSEISkpCEJCQhCUlIIiKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJBERRASSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIAkASkpCEJCQhCUlIQhKSkIQkJAEgCUlIAkASkpDE/SQhCUncTxKSuJ8kJCGJ+0lCEveThCTuJ4n7SUIS95PE/STx3CTx3CQBIIl/D0m8IJJ4YSRxP0k8P5J4UUjiv5okXhSS+N/ENv+dbPMfwTb/HWzzorLNi8o2/xq2+dewzb+Wbf41bPMvufHGGwG47777buWqq6666qr/DFSuuuqqq676T/EP//APvwNwzTXX8ECSeG6SeG6SeG6S+JdI4l9LEg8kiReVJB5IEveTxAsiiftJ4n6SuJ8knpsk7ieJ5yaJ5yYJAEm8IJIAkASAJJ6bJAAkASCJ+0kCQBL3kwSAJCQBIAlJAEhCEveThCQAJCEJSQBIQhKSAJCEJAAkIQlJAEhCEpIAkIQkJAEgCUkASEISAJKQBIAkACQhCQBJAEjifpIAkMT9JPFAknhBJHE/SdjmP4JtJGEbSTw/tpEEgG0kAWAbSdzPNpK4n20AJHE/2wBI4n62AZAEgG3uJwkA2wBIAsA295OEbQAkYZv7ScI2AJKwDYAkbCMJ2wBIwjbPjyRsIwnbSMI2krCNJGwjCdtIwjbPjyRs80CSsM2LQhK2+ZdIwjbPjyRs828lCdv8a0nCNv8T2Oa/mm1eGNv8T2KbF4Vt/qPZ5kVlm38N2/xns81/prNnzz6Dq6666qqr/jNQueqqq6666j/F2bNnbwXY3NzkP4sk/iWSeCBJPJAkHkgSDySJB5LECyKJF0QS95PE/SRxP0ncTxL3k8Rzk8T9JAEgiftJAkASz00SAJIAkASAJAAkASAJAEncTxIAkgCQhCQAJAEgCUkASEISAJKQBIAkJAEgCUlIAkASkrifJCQhCQBJSAJAEpKQhCQAJCEJSQBIQhKSAJCEJAAkIQkASUgCQBIAkpAEgCQAJHE/SQBI4n6SuJ8kXhBJPDdJ2OY/k20k8cLYRhL3s40kHsg2kngg20jigWwDIIn72QZAEgC2uZ8kAGwDIAnbAEgCwDYAkrANgCRs80CSsA2AJGwjCdv8e0nCNpKwzQNJwjYPJAnb/FtIwjb/WpKwzQsiCdv8TyUJ2/x3s81/Jtv8S2zzL7HNfwfb/Hezzb+Wbf41bPOvZZsXxU033QTAP/zDP/w2V1111VVX/WegctVVV1111X+K++6771aAzc1N/rUk8dwk8S+RxH8lSbwgkrifJO4niX+JJO4niftJ4rlJ4rlJAkAS95MEgCQAJAEgCQBJAEgCQBIAkgCQxP0kASCJ+0kCQBKSAJDE/SRxP0lIAkASkrifJCQBIAlJSOJ+kpAEgCQkIQlJAEhCEpIAkIQkJAEgCUlIAkASkgCQhCQAJAEgCUkASAJAEgCSuJ8k7ieJ+0ni+ZHE/wS2kQSAbSRxP9tI4n62AZDE/WwDIIn72eZ+krifbQAkcT/b3E8SALYBkASAbQAkYRsASQDYBkAStgGQhG0kYRsASdjmgSRhG0nYRhK2kYRtJGEbSdhGEraRhG2eH0nY5oEkYZsHkoRtACRhGwBJ2AZAErb5l0jCNi8KSdjmqv+/bPOisM2LwjYvKtu8qGzzorLNv5Zt/jVs869lmxfVzs4OAPfdd9+tXHXVVVdd9Z+B4Kqrrrrqqv80//AP//DbANdccw0Aknhukvi3kMS/RBIPJIkHksQDSeKBJPFAkrifJB5IEveTxItCEveTxAsjiftJAkAS95MEgCSemyQAJAEgCQBJAEgCQBIAkgCQBIAkACRxP0kASOJ+krifJAAkIQkASUjifpKQBIAkJCEJAElIQhIAkpCEJAAkIQlJSAJAEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKICCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSAJCEJCQBIAlJSEISAJKQhCQkcT9JSEISkrifJCQhiQeShCQkcT9JSOJ+kpDE/STxQJK4nySemyTuJwkASfxHksR/JUn8V5HEVf92tvn3ss2/xDb/UWzzH802Lyrb/Geyzb+Gbf61bPOiuummmwD4h3/4h9/mqquuuuqq/ywEV1111VVX/ae57777bgXY3Nzk30MS/xJJPJAk/jUk8UCSeCBJvCCSeEEkcT9J3E8S95PE/SRxP0k8N0k8N0k8N0kASAJAEv8akgCQBIAkACQhCQBJAEhCEgCSuJ8kJAEgCUkASEIS95OEJO4nCUlIAkASkpAEgCQkIQlJAEhCEpKQBIAkJCEJAElIQhIAkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIYmIQBKSkIQkJCEJSUgiIpCEJCQhCUlIQhKSkIQkJCEJSUQEkpCEJCQhCUlIQhKSkIQkJCEJSUgCQBKSAJCEJAAkIQlJSEISkpAEgCQkIQlJ3E8SkpCEJB5IEpKQxANJQhKSeCBJSOKBJPFAkrifJCRxP0ncTxLPTRLPTRIAkgCQxItCEgCSeEEk8dwkcT9J/GtI4kUhiX8PSVz1orPNv4dt/qvY5j+Sbf6j2eZfwzb/Grb517DNv5Zt/jW2t7cBuO+++27lqquuuuqq/yxUrrrqqquu+k9z33333QqwubnJ8yOJ5yaJf4kk/rUk8UCS+LeSxAsiiftJ4n6SuJ8k7ieJ+0nifpK4nyQAJHE/SQBI4n6SAJDECyIJAEkASAJAEgCSuJ8kACQBIIn7SQJAEveTBIAkJHE/SdxPEpIAkIQkJAEgCUlI4n6SkIQkACQhCUlIAkASkpCEJAAkIQlJSAJAEpKQBIAkJAEgCUkASEISAJKQBIAkACQBIIn7SQJAEveTxPMjiX+JJGzz38E2kngg2wBI4oFsAyCJ52YbAEk8kG3uJ4n72eZ+kgCwDYAkAGwDIAnb3E8StgGQhG0AJGEbSdgGQBK2kYRtnh9J2EYStpGEbSRhmxdGErZ5IEnY5gWRhG0AJGEbAEnY5l8iCds8P5Kwzf0kYZv7ScI2/xqSsM2/hSRsc9V/HNv8R7HNi8I2Lyrb/Gewzb+Gbf41bPOvZZt/rZtuugmAf/iHf/gdrrrqqquu+s9C5aqrrrrqqv80//AP//A7ANdccw2S+LeQxL9EEg8kiQeSxANJ4oEk8UCSeCBJ3E8SDySJ+0nifpL4t5LE/STx3CTx3CQBIIn7SQJAEgCSAJAEgCQAJAEgCQBJPDdJAEjifpIAkIQkACQhCQBJSAJAEpK4nyQkcT9JSEISAJKQhCQkASAJSUhCEgCSkIQkJAEgCUlIQhIAkpCEJCQBIAlJAEhCEgCSkASAJCQBIAkASQBIAkAS95PE/STx3CTxX802knhhbCOJ+9lGEs/NNpJ4bra5nyQeyDYPJIn72eZ+krifbQAkAWAbAEkA2AZAEgC2AZCEbQAkYZsHkoRtHkgStvm3koRtJGGbB5KEbR5IErb5v0YStvnfyDYviG3+O9nmP4Jt/jvY5kVlmxeVbf41bPOvYZt/Ldv8a9lmZ2eHq6666qqr/tNRueqqq6666j/N2bNnbwXY3NzkRSGJf4kk/jNJ4oEk8YJI4kUhiftJ4n6SuJ8knpsk7icJAEncTxIAknhukgCQBIAkACQBIAkASQBIAkASAJIAkIQkACQBIAlJAEjifpK4nyTuJwlJAEhCEpIAkIQkJHE/SUhCEveThCQkIQkASUhCEpKQBIAkJCEJSQBIQhKSAJCEJCQBIAlJAEhCEgCSkASAJAAkASAJAEncTxL3k8Rzk8R/NNtI4kVhG0kA2EYS97ONJO5nGwBJPJBt7ieJ52abB5LEA9nmfpK4n23uJwkA29xPEra5nyRscz9J2AZAErYBkIRtHkgStnkgSdhGEraRhG0kYRtJ2EYStpGEbZ4fSdjmXyIJ27yoJGEbAEnY5vmRhG3+o0jCNv9akrDN/1e2eWFs8z+JbV4UtnlR2OZFZZsXlW3+p7HNv5ZtAHZ2dgD4h3/4h9/mqquuuuqq/yxUrrrqqquu+k9z33333QqwubnJ5uYmh4eH3E8S/xJJ/Esk8UCSeCBJPJAkHkgSLypJvCCSuJ8k7ieJ+0nifpK4nyTuJ4nnJonnJonnJgkASQBI4l9DEgCSAJDE/SQBIIn7SQJAEpIAkIQkACQhiftJQhL3k4QkJAEgCUlIQhIAkpCEJCRxP0lIQhKSkASAJCQhCUkASEISkpAEgCQkIQkASUgCQBKSAJCEJAAkASAJAEkASOJ+krifJJ6bJP6r2EYS/xq2kcQD2UYSz49t7ieJ58c295PEA9nmgSQBYJv7SQLANgCSALANgCQAbAMgCdsASMI2AJKwzQNJwjaSsM2/lyRs8/xIwjYviCRsAyAJ2wBIwjb/HpKwzf9ntvmPZpv/TLb5l9jmX2Kb/8ls85/JNv8atvnXsM2/lm3ut7OzA8B99913K1ddddVVV/1noXLVVVddddV/qn/4h3/47Rd7sRd77Vd8xVfkgSRhm/tJ4kUlCds8kCRsI4kXRhK2eSBJ2EYSL4wkbPNAknhRSMI295PEi0ISLwpJ/Esk8YJI4oWRxPMjiedHEs9NEs9NEs9NEs9NEs9NEs9NEs9NEs9NEs9NEs+PJJ4f2zw32/xXs81zk4QkAGzzgtjmudnmudnmudnmfrZ5INs8N9s8kG2em22em22em22em22eH9u8MLZ5fmzzgthGErZ5QWwDIAnbvCC2AZCEbV4UtnkgSdjmhbGNJGzzQJKwzYvCNg8kCdv8a9lGErZ5IEnY5t/DNveThG0eSBK2+Y9gG0nY5oEkYZsHkoRt/qPZ5n6SsM0DScI2DyQJ2/xns80DScI2DyQJ2zyQJGzzQJKwzX822zyQJGzzQJKwzQNJwjYPJAnbPJAkbHO/nZ0dAP7hH/7ht7nqqquuuuo/E5Wrrrrqqqv+U/3Ij/zI57zjO74jL/7iL/7aXHXV/0G2+Z9MEi+IJK666qqrrvrv8w//8A+//SM/8iOfw1VXXXXVVf+Z0IMe9CCuuuqqq676z3XmzJkHXXPNNQ/hORkQz8mAeE4GxHMyIJ6TAfGcDIjnZEA8JwPiORkQz8mAeE4GxHMyIJ6TAfGcDIjnZEA8JwPiORkQz8mAeE4GxHMyIJ6TAfGcDIjnZEA8JwPiORkQz8mAeE4GxHMyIJ6TAfGcDIjnZEA8JwPiORkQz8mAeE4GxHMyIJ6TAfGcDIjnZEA8JwPiORkQz8mAeE4GxHMyIJ6TAfGcDIjnZEA8JwPiORkQz8mAeE4GxHMyIJ6TAfGcDIjnZEA8JwPiORkQz8mAeE4GxHMyIJ6TAfGcDIjnZEA8JwPiORkQz8mAeE4GxHMyIJ6TAfGcDIjnZEA8JwPiORkQz8mAeE4GxHMyIJ6TAfGcDIjnZEA8JwPiORkQz8mAeE4GxHMyIJ6TAfGcDIjnZEA8JwPiORkQz8mAeE4GxHMyIJ6TAfGcDIjnZEA8JwPiORkQz8mAeE4GxHMyIJ6TAfGcDIjnZEA8JwPiORkQz8mAeE4GxHMyIJ6TAfGcDIjnZEA8JwPiORkQz8mAeE4GxHMyIB7gvvvue/rZs2efwVVXXXXVVf+Z0IMe9CCuuuqqq6666qqrrrrqqquuuuqqq6666qr/k6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8V/whj937j0lyp7AAAAABJRU5ErkJggg==) ```js -fn squareHoleSketch = () => { +fn squareHoleSketch() { squareSketch = startSketchOn('-XZ') |> startProfileAt([-1, -1], %) |> line([2, 0], %) @@ -54,7 +54,7 @@ fn squareHoleSketch = () => { } exampleSketch = startSketchOn('-XZ') - |> circle({ center: [0, 0], radius: 3 }, %) + |> circle({ center = [0, 0], radius = 3 }, %) |> hole(squareHoleSketch(), %) example = extrude(1, exampleSketch) ``` diff --git a/docs/kcl/hollow.md b/docs/kcl/hollow.md index 45949f7e1..585812dfe 100644 --- a/docs/kcl/hollow.md +++ b/docs/kcl/hollow.md @@ -68,15 +68,15 @@ case = startSketchOn('-XZ') thing1 = startSketchOn(case, 'end') |> circle({ - center: [-size / 2, -size / 2], - radius: 25 + center = [-size / 2, -size / 2], + radius = 25 }, %) |> extrude(50, %) thing2 = startSketchOn(case, 'end') |> circle({ - center: [size / 2, -size / 2], - radius: 25 + center = [size / 2, -size / 2], + radius = 25 }, %) |> extrude(50, %) diff --git a/docs/kcl/import.md b/docs/kcl/import.md index 8c8a2f70b..3dfde0358 100644 --- a/docs/kcl/import.md +++ b/docs/kcl/import.md @@ -10,6 +10,8 @@ For formats lacking unit data (such as STL, OBJ, or PLY files), the default unit Note: The import command currently only works when using the native Modeling App. +For importing KCL functions using the `import` statement, see the docs on [KCL modules](/docs/kcl/modules). + ```js import(file_path: String, options?: ImportFormat) -> ImportedGeometry ``` @@ -36,7 +38,7 @@ model = import("tests/inputs/cube.obj") ![Rendered example of import 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAD7r0lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VX/bjs7w2s/9rEXf4t/JYmrrvp/x+a/ifn/yuZ/nfW63Hr27OK777xz63O46qqrrrrqqqv+PahcddVVV1111VX/Ljs7w2u/2Itd/C2uuuqqF4nEfxPx/Nj8JzL/E0j8h7P5TzWbtQefObN8b4A779z6HK666qqrrrrqqn8ryvHjx7nqqquuuuqqq/5tdnaG136xF7v4W1x11VX/a0kggQQSSCCBBBJIIIEEEkgggQQSSCCBBBJIIIEEkpCEJCQhCRAgQIAAAQIECBAgQIAAAQIECBAgQPx3kkACCSSQQAIJJJBAAgkkkEACCSSQQAKJF6hWH5/N2oOPjrq/Wa/LrVx11VVXXXXVVf8W6EEPehBXXXXVVVddddW/3s7O8Nov9mIXf4v/RBJXXfW/hs1V/81s/gOY/2nW63LrU5967H329vrf5qqrrrrqqquu+tdCD3rQg7jqqquuuuqqq/51dnaG137xF7/4W1x11VX/49lc9e9g8+9g/qOs1+XWpz712Pvs7fW/zVVXXXXVVVdd9a9BOX78OFddddVVV1111YtuZ2d47Rd/8Yu/xVVXXfW/ggQSSCCBBBJIIIEEEkgggQQSSCCBBBJIIIEEEkgggQQSSCCBxP8pEkgggQQSSCCBBBJIIIEEEkgggSQkIQlJSAIECBAgQIAAAQIECBAgQADU6uM7O8NrHx11f7Nel1u56qqrrrrqqqteVOhBD3oQV1111VVXXXXVi2Y2aw9+uZc793T+B5K46qr/cDZX/Q9k8//Wel1ufcpTdt5nb6//ba666qqrrrrqqhcFetCDHsRVV1111VVXXfUvm83ag1/+5c89nauuuup/DJur/oPY/K+xXpdb/+EfTrzOel1u5aqrrrrqqquu+pegBz3oQVx11VVXXXXVVS/cbNYe/PIvf+7pXHXVVVcBNle9EDb/6dbrcus//MOJ11mvy61cddVVV1111VUvDHrQgx7EVVddddVVV131gs1m7cEv//Lnns7/URJX/R9nc9X/Qjb/79m8UOt1ufUf/uHE66zX5Vauuuqq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bLD5VzBgwIAB89/NBhtssMEGm6v+FWywwQYbbLDBBhtssMEGG2ywweaq/yFssMEGG2ywwQYbbLDBBhtssMHmqheRDTbYYIMNNv+DGTBgwIB5bjbYYIMNNlddddVVV131/xmVq6666qqrrvo/zOY5SPwrmOcl/rvZvEASV/0HsflPIfF/ks1V/8PZ/C9kXhQ2/y0uXux/h6uuuuqqq676n4/KVVddddVVV/0vcPFi9zt33TX/bv4TSPw7if/pJK666qr/B2z+FzMvCpv/MVaruJWrrrrqqquu+p8PPehBD+Kqq6666qqrrrrqqquuuuqqq6666qqrrvo/icpVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r+IfAaaXRTh4fyFaAAAAAElFTkSuQmCC) ```js -model = import("tests/inputs/cube.obj", { type: "obj", units: "m" }) +model = import("tests/inputs/cube.obj", { format = "obj", units = "m" }) ``` ![Rendered example of import 1](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAD7sklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VX/bjs7w2s/9rEXf4t/JYmrrvp/x+a/ifn/yuZ/nfW63Hr27OK777xz63O46qqrrrrqqqv+PahcddVVV1111VX/Ljs7w2u/2Itd/C2uuuqqF4nEfxPx/Nj8JzL/E0j8h7P5TzWbtQefObN8b4A779z6HK666qqrrrrqqn8ryvHjx7nqqquuuuqqq/5tdnaG136xF7v4W1x11VX/a0kggQQSSCCBBBJIIIEEEkgggQQSSCCBBBJIIIEEkpCEJCQhCRAgQIAAAQIECBAgQIAAAQIECBAgQPx3kkACCSSQQAIJJJBAAgkkkEACCSSQQAKJF6hWH5/N2oOPjrq/Wa/LrVx11VVXXXXVVf8W6EEPehBXXXXVVVddddW/3s7O8Nov9mIXf4v/RBJXXfW/hs1V/81s/gOY/2nW63LrU5967H329vrf5qqrrrrqqquu+tdCD3rQg7jqqquuuuqqq/51dnaG137xF7/4W1x11VX/49lc9e9g8+9g/qOs1+XWpz712Pvs7fW/zVVXXXXVVVdd9a9BOX78OFddddVVV1111YtuZ2d47Rd/8Yu/xVVXXfW/ggQSSCCBBBJIIIEEEkgggQQSSCCBBBJIIIEEEkgggQQSSCCBxP8pEkgggQQSSCCBBBJIIIEEEkgggSQkIQlJSAIECBAgQIAAAQIECBAgQADU6uM7O8NrHx11f7Nel1u56qqrrrrqqqteVOhBD3oQV1111VVXXXXVi2Y2aw9+uZc793T+B5K46qr/cDZX/Q9k8//Wel1ufcpTdt5nb6//ba666qqrrrrqqhcFetCDHsRVV1111VVXXfUvm83ag1/+5c89nauuuup/DJur/oPY/K+xXpdb/+EfTrzOel1u5aqrrrrqqquu+pegBz3oQVx11VVXXXXVVS/cbNYe/PIvf+7pXHXVVVcBNle9EDb/6dbrcus//MOJ11mvy61cddVVV1111VUvDHrQgx7EVVddddVVV131gs1m7cEv//Lnns7/URJX/R9nc9X/Qjb/79m8UOt1ufUf/uHE66zX5Vauuuqq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BhtssMHmX8GAAQMGzH83G2ywwQYbbK76V7DBBhtssMEGG2ywwQYbbLDBBpur/oewwQYbbLDBBhtssMEGG2ywwQabq15ENthggw022PwPZsCAAQPmudlggw022Fx11VVXXXXV/2dUrrrqqquuuur/MJvnIPGvYJ6X+O9m8wJJXPUfxOY/hcT/STZX/Q9n87+QeVHY/Le4eLH/Ha666qqrrrrqfz4qV1111VVXXfW/wMWL3e/cddf8u/lPIPHvJP6nk7jqqqv+H7D5X8y8KGz+x1it4lauuuqqq6666n8+9KAHPYirrrrqqquuuuqqq6666qqrrrrqqquuuur/JCpXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4p/BPITSDgyc0QAAAAAAElFTkSuQmCC) @@ -59,4 +61,15 @@ model = import("tests/inputs/cube.step") ![Rendered example of import 4](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAEqe0lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispV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hCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCElf960hCEpKQhCQkIQlJSEISkpCEJCQhif8Oq9WK2267jWuvvZYbb7zx+Cu+4iu+9Z/92Z/9zOHh4S5XXXXVVVdd9aKhHD9+nKuuuuqqq656Ub3jO77jZ735m7/5RwN8//d/P7fddhuSkIQkJCEJSUhCEpKQhCQkIQlJSEISkrjqqquuuurfRhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCRx1fMnCUlIQhKSkIQkJCEJSUhCEpKQhCT+PVarFbfddhvXXnstN9544/FXfMVXfOs/+7M/+5nDw8Ndrrrqqquuuupfhh70oAdx1VVXXXXVVS+K13md13nvD//wD/8ugO///u/ntttu46r/2yRx1VX/EttcddULYpur/u1sc7/jx4/zFm/xFjzoQQ/ivvvuu/WzPuuzXue+++67lauuuuqqq6564dCDHvQgrrrqqquuuupf8jqv8zrv/eEf/uHfBfD93//93HbbbVz1byeJq6666r+Oba763802V8GxY8d4j/d4D44dO8Z9991362d91me9zn333XcrV1111VVXXfWCoQc96EFcddVVV1111QvzYi/2Yq/9uZ/7ub8F8PM///P87d/+Lf9XSOKqq6666j+Lba76n8E2/1ccO3aM93iP9+DYsWPcd999t37Ih3zIQ7jqqquuuuqqFww96EEP4qqrrrrqqqtekBd7sRd77c/93M/9LYCf//mf52//9m/5ryKJq6666qqrXjDbXPWfzzb/0xw7doz3eI/34NixY9x33323fsiHfMhDuOqqq6666qrnDz3oQQ/iqquuuuqqq56fF3uxF3vtz/3cz/0tgJ//+Z/nb//2b3lBJHHVVVddddX/fra56j+Obf6zHDt2jPd4j/fg2LFj3Hfffbd+yId8yEO46qqrrrrqqueFHvSgB3HVVVddddVVz+3FXuzFXvtzP/dzfwvg937v9/j93/99rrpKEldd9dxsc9VVz49trvrXs82L6tixY7zHe7wHx44d47777rv1Qz7kQx7CVVddddVVVz0nyvHjx7nqqquuuuqqB3qxF3ux1/7cz/3c3wL4u7/7O37913+dq/7zSUISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJ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rvqfi+Cqq6666qqr/pfY2dnhX8s2/9ls85/JNv+ZbGOb/yy2+c9im/8MtvmPZpv/CLb538w2/1q2+dewzYvKNi8K2/x3s81V/3OcPHkSgLNnzz6Dq6666qqrrvqfjeCqq6666qqr/of7h3/4h98G2NnZ4d/CNrb5z2Sb/0y2sc1/Jtv8Z7HNfxbb/Gewzf9Utvn3ss2/h22u+tezzX8G2/x/JYl/C0n8eywWCwD+/u///re56qqrrrrqqv/ZCK666qqrrrrqf7j77rvvVoBjx47x72Gb/0y2sc1/Jtv8Z7LNfxbb/GexzX8G2/xHss1/FNv8e9nmv4Nt/rVs8/+Bbf6vk8R/FUlcddVVV1111VVQueqqq6666qr/JXZ2dniHd3gHHve4x/E/nST+M0nifzNJ/G8iif9IkvifQhL/HpL4ryKJ/wySeFFI4j+CJF4YSfxbSOJfQxLPjyReVJJ4IEn8SyTxL5HEA0niBZHEA0niBZHE8yOJ+0niBZEEwGKx4OEPfzgA//AP//DbXHXVVVddddX/bFSuuuqqq6666n+4s2fPPuNHfuRHPvud3umdPvvmm2/m5ptv5qqrrrrqqqv+u/3DP/zDb9933323ctVVV1111VX/s1G56qqrrrrqqv8FfvRHf/RzAK655poHc9VVV1111VX/A/zoj/7o59x33323ctVVV1111VX/s6EHPehBXHXVVVddddVVV1111VVXXXXVVVddddVV/ydRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8q/hFQenDrm8dOUAAAAABJRU5ErkJggg==) +```js +import height, buildSketch from "common.kcl" + +plane = 'XZ' +margin = 2 +s1 = buildSketch(plane, [0, 0]) +s2 = buildSketch(plane, [0, height() + margin]) +``` + +![Rendered example of import 5](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAABjeElEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVf4trrrnmwZ/zOZ/zW1x11VVX/T/w9V//9e/zD//wD7/NVVddddVVV131X43KVVddddVVV131X+6aa6558Bd/8Rf/1qu92qs9mKuuuuqq/x++6+u//uvf5x/+4R9+m6uuuuqqq6666r8Slauuuuqqq6666r/FmTNnHtz3PVddddVV/x9cc801Dz579uytXHXVVVddddVV/9WoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqr/svdd999tw7DwFVXXXXV/yf33XffrVx11VVXXXXVVf/VqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XEVx11VVXXXXVVf8t7rvvvluHYeCqq6666v+6YRi47777buWqq6666qqrrvrvQHDVVVddddVVV/23OHv27K3r9Zqrrrrqqv/r1us1Z8+evZWrrrrqqquuuuq/A5Wrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddV/i/vuu+/WYRi46qqrrvq/bhgG7rvvvlu56qqrrrrqqqv+O1C56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVf9t7jvvvtuHYaBq6666qr/64Zh4L777ruVq6666qqrrrrqvwOVq6666qqrrrrqqquuuuqq/0R33303Z8+efQZXXXXVVVddddV/BypXXXXVVVddddV/i7Nnzz5jGAauuuqqq6666qqrrrrqqqv+E1G56qqrrrrqqqv+W9x33323rtdrrrrqqquuuuqqq6666qqr/hNRueqqq6666qqrrrrqqquu+k9233333cpVV1111VVXXfXfgcpVV1111VVXXfXf4uzZs7cOw8BVV1111f8HZ8+evZWrrrrqqquuuuq/A5Wrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddV/i/vuu+/WYRi46qqrrvr/4L777ruVq6666qqrrrrqvwOVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yqCq6666qqrrrrqv81999136zAMXHXVVVf9XzUMA/fdd9+tXHXVVVddddVV/10Irrrqqquuuuqq/zZnz569db1ec9VVV131f9V6vebs2bO3ctVVV1111VVX/XehctVVV1111VVXXXXVVVdd9Z9kGAauuuqqq6666qr/VlSuuuqqq6666qr/Nvfdd9+twzBw1VVXXfV/2X333XcrV1111VVXXXXVfxcqV1111VVXXXXVf6thGLjqqquuuuqqq6666qqrrvpPQuWqq6666qqrrvpvc999993KVVddddX/YcMwcN99993KVVddddVVV13134XKVVddddVVV1111VVXXXXVf5K7776bs2fPPoOrrrrqqquuuuq/C5Wrrrrqqquuuuq/zdmzZ58xDANXXXXVVVddddVVV1111VX/SahcddVVV1111VX/be67775b1+s1V1111VX/l9133323ctVVV1111VVX/XehctVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquu+m9z9uzZW4dh4Kqrrrrq/7KzZ8/eylVXXXXVVVdd9d+FylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666r/Nfffdd+swDFx11VVX/V9233333cpVV1111VVXXfXfheCqq6666qqrrvpvdd999906DANXXXXVVVddddVVV1111VX/CahcddVVV1111VVXXXXVVVf9JxiGgfvuu+9Wrrrqqquuuuqq/04EV1111VVXXXXVf6uzZ8/eul6vueqqq676v2a9XnP27Nlbueqqq6666qqr/jtRueqqq6666qqrrrrqqquu+k8wDAP33XffrVx11VVXXXXVVf+dqFx11VVXXXXVVf+t7rvvvluHYeCqq6666qqrrrrqqquuuuo/AZWrrrrqqquuuuq/1X333XfrMAxcddVVV1111VVXXXXVVVf9J6By1VVXXXXVVVddddVVV131n+AZz3gG9913361cddVVV1111VX/nahcddVVV1111VX/rc6ePfuMYRi46qqrrvq/6OzZs8/gqquuuuqqq67670Tlqquuuuqqq676b7der7nqqquuuuqqq6666qqrrvpPQOWqq6666qqrrvpvdd99993KVVddddX/Uffdd9+tXHXVVVddddVV/52oXHXVVVddddVVV1111VVX/Sc5e/bsrVx11VVXXXXVVf+dqFx11VVXXXXVVf+tzp49e+swDFx11VVXXXXVVVddddVVV/0noHLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrvpvdd999906DANXXXXVVf8X3Xfffbdy1VVXXXXVVVf9dyK46qqrrrrqqqv+29133323DsPAVVddddVVV1111VVXXXXVfzAqV1111VVXXXXVVVddddVV/8GGYeC+++67lauuuuqqq6666r8bwVVXXXXVVVdd9d/u7Nmzt67Xa6666qqr/q9Yr9ecPXv2Vq666qqrrrrqqv9uVK666qqrrrrqqquuuuqqq/6DDcPAfffddytXXXXVVVddddV/NypXXXXVVVddddV/u/vuu+/WYRi46qqrrrrqqquuuuqqq676D0blqquuuuqqq676b3fffffdOgwDV1111VVXXXXVVVddddVV/8GoXHXVVVddddVVV1111VVX/Qd7xjOewX333XcrV1111VVXXXXVfzcqV1111VVXXXXVf7uzZ88+YxgGrrrqqqv+Lzl79uwzuOqqq6666qqr/rtRueqqq6666qqr/tvdd999t67Xa6666qqrrrrqqquuuuqqq/6DUbnqqquuuuqqq6666qqrrvpPcN99993KVVddddVVV131343KVVddddVVV1313+7s2bO3DsPAVVddddX/JWfPnr2Vq6666qqrrrrqvxuVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVV/wnuu+++W7nqqquuuuqqq/67Ubnqqquuuuqqq/7b3XfffbcOw8BVV1111VVXXXXVVVddddV/MIKrrrrqqquuuup/hPvuu+/WYRi46qqrrvrfbhgG7rvvvlu56qqrrrrqqqv+JyC46qqrrrrqqqv+Rzh79uyt6/Waq6666qqrrrrqqquuuuqq/0BUrrrqqquuuuqqq6666qqr/gOt12vOnj17K1ddddVVV1111f8EVK666qqrrrrqqquuuuqqq/4DDcPAfffddytXXXXVVVddddX/BFSuuuqqq6666qr/Ee67775bh2Hgqquuuuqqq6666qqrrrrqPxCVq6666qqrrrrqf4T77rvv1mEYuOqqq676324YBu67775bueqqq6666qqr/iegctVVV1111VVXXXXVVVdd9R/o7rvv5qqrrrrqqquu+h+DylVXXXXVVVdd9T/C2bNnnzEMA1ddddVV/xecPXv2GVx11VVXXXXVVf8TULnqqquuuuqqq/5HuO+++25dr9dcddVVV1111VVXXXXVVVf9B6Jy1VVXXXXVVVddddVVV131H+y+++67lauuuuqqq6666n8CKlddddVVV1111f8IZ8+evXUYBq666qqr/i84e/bsrVx11VVXXXXVVf8TULnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXfUf7L777ruVq6666qqrrrrqfwIqV1111VVXXXXV/wj33XffrcMwcNVVV1111VVXXXXVVVdd9R+I4Kqrrrrqqquu+h/jvvvuu3UYBq666qqr/rcahoH77rvvVq666qqrrrrqqv8pCK666qqrrrrqqv8xzp49e+t6veaqq6666n+r9XrNVVddddVVV131PwqVq6666qqrrrrqqquuuuqq/0Bnz569lauuuuqqq6666n8KKlddddVVV1111VVXXXXVVf9BhmHgvvvuu5Wrrrrqqquuuup/CipXXXXVVVddddX/GPfdd9+twzBw1VVXXXXVVVddddVVV131H4TKVVddddVVV131P8Z999136zAMXHXVVVf9bzUMA/fdd9+tXHXVVVddddVV/1NQueqqq6666qqrrrrqqquu+g9y9913c9VVV1111VVX/Y9C5aqrrrrqqquu+h/j7NmzzxiGgauuuuqq/83Onj37DK666qqrrrrqqv8pqFx11VVXXXXVVf9j3Hfffbeu12uuuuqqq6666qqrrrrqqqv+g1C56qqrrrrqqquuuuqqq676D3TffffdylVXXXXVVVdd9T8Flauuuuqqq6666n+Ms2fP3joMA1ddddVV/5udPXv2Vq666qqrrrrqqv8pqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq/7HuO+++24dhoGrrrrqqv/N7rvvvlu56qqrrrrqqqv+p6By1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Vw1VVXXXXVVVf9j3LffffdOgwDV1111VX/2wzDwH333XcrV1111VVXXXXV/yQEV1111VVXXXXV/yhnz569db1ec9VVV131v816vebs2bO3ctVVV1111VVX/U9C5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVdd9T/Kfffdd+swDFx11VVX/W8zDAP33XffrVx11VVXXXXVVf+TULnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV/2Pct999906DANXXXXVVf/bDMPAfffddytXXXXVVVddddX/JFSuuuqqq6666qqrrrrqqqv+A9x9992cPXv2GVx11VVXXXXVVf+TULnqqquuuuqqq/5HOXv27DOGYeCqq6666qqrrrrqqquuuuo/AJWrrrrqqquuuup/lPvuu+/W9XrNVVddddVVV1111VVXXXXVfwAqV1111VVXXXXVVVddddVV/0Huu+++W7nqqquuuuqqq/4noXLVVVddddVVV/2Pcvbs2VuHYeCqq6666n+js2fP3spVV1111VVXXfU/CZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddX/KPfdd9+twzBw1VVXXfW/0X333XcrV1111VVXXXXV/yRUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6sIrrrqqquuuuqq/3Huu+++W4dh4Kqrrrrqf4thGLjvvvtu5aqrrrrqqquu+p+G4Kqrrrrqqquu+h/n7Nmzt67Xa6666qqr/rdYr9ecPXv2Vq666qqrrrrqqv9pqFx11VVXXXXVVVddddVVV/07DcPAVVddddVVV131PxKVq6666qqrrrrqf5z77rvv1mEYuOqqq6763+S+++67lauuuuqqq6666n8aKlddddVVV1111f9IwzBw1VVXXXXVVVddddVVV13170Tlqquuuuqqq676H+e+++67lauuuuqq/0We8YxncN99993KVVddddVVV131Pw2Vq6666qqrrrrqqquuuuqq/wBnz559BlddddVVV1111f80VK666qqrrrrqqv9xzp49+4xhGLjqqquuuuqqq6666qqrrvp3onLVVVddddVVV/2Pc9999926Xq+56qqrrvrf5L777ruVq6666qqrrrrqfxoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqq/3HOnj176zAMXHXVVVf9b3L27Nlbueqqq6666qqr/qehctVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquu+h/nvvvuu3UYBq666qqr/je57777buWqq6666qqrrvqfhuCqq6666qqrrvof6b777rt1GAauuuqqq6666qqrrrrqqqv+HahcddVVV1111VVXXXXVVVf9OwzDwH333XcrV1111VVXXXXV/0QEV1111VVXXXXV/0hnz569db1ec9VVV131P916vebs2bO3ctVVV1111VVX/U9E5aqrrrrqqquuuuqqq6666t9hGAbuu+++W7nqqquuuuqqq/4nonLVVVddddVVV/2PdN999906DANXXXXVVVddddVVV1111VX/DlSuuuqqq6666qr/ke67775bh2Hgqquuuuqqq6666qqrrrrq34HKVVddddVVV1111VVXXXXVv8MznvEM7rvvvlu56qqrrrrqqqv+J6Jy1VVXXXXVVVf9j3T27NlnDMPAVVddddX/BmfPnn0GV1111VVXXXXV/0RUrrrqqquuuuqq/7HW6zVXXXXVVVddddVVV1111VX/DlSuuuqqq6666qr/ke67775bueqqq676X+K+++67lauuuuqqq6666n8iKlddddVVV1111VVXXXXVVf9OZ8+evZWrrrrqqquuuup/IipXXXXVVVddddX/SGfPnr11GAauuuqqq6666qqrrrrqqqv+HahcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqqv+R7rvvvtuHYaBq6666qr/De67775bueqqq6666qqr/iciuOqqq6666qqr/se67777bh2Ggauuuuqqq6666qqrrrrqqn8jKlddddVVV1111VVXXXXVVf9GwzBw33333cpVV1111VVXXfU/FcFVV1111VVXXfU/1tmzZ29dr9dcddVVV/1PtV6vOXv27K1cddVVV1111VX/U1G56qqrrrrqqquuuuqqq676NxqGgfvuu+9Wrrrqqquuuuqq/6moXHXVVVddddVV/2Pdd999tw7DwFVXXXXVVVddddVVV1111b8Rlauuuuqqq6666n+s++6779ZhGLjqqquu+p9qGAauuuqqq6666qr/0ahcddVVV1111VVXXXXVVVf9G919993cd999t3LVVVddddVVV/1PReWqq6666qqrrvof6+zZs88YhoGrrrrqqv/Jzp49+wyuuuqqq6666qr/qahcddVVV1111VX/Y9133323rtdrrrrqqquuuuqqq6666qqr/o2oXHXVVVddddVVV1111VVX/Tvcd999t3LVVVddddVVV/1PReWqq6666qqrrvof6+zZs7cOw8BVV1111f9kZ8+evZWrrrrqqquuuup/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqqv+He67775bueqqq6666qqr/qeictVVV1111VVX/Y9133333ToMA1ddddVVV1111VVXXXXVVf9GBFddddVVV1111f9o9913363DMHDVVVdd9T/NMAzcd999t3LVVVddddVVV/1PRnDVVVddddVVV/2Pdvbs2VvX6zVXXXXVVVddddVVV1111VX/BlSuuuqqq6666qqrrrrqqqv+DdbrNWfPnr2Vq6666qqrrrrqfzIqV1111VVXXXXVVVddddVV/wbDMHDffffdylVXXXXVVVdd9T8Zlauuuuqqq6666n+0++6779ZhGLjqqquuuuqqq6666qqrrvo3oHLVVVddddVVV/2Pdt999906DANXXXXVVf/TDMPAfffddytXXXXVVVddddX/ZFSuuuqqq6666qqrrrrqqqv+De6++26uuuqqq6666qr/8ahcddVVV1111VX/o509e/YZwzBw1VVXXfU/0dmzZ5/BVVddddVVV131PxmVq6666qqrrrrqf7T77rvv1vV6zVVXXXXVVVddddVVV1111b8Blauuuuqqq6666qqrrrrqqn+j++6771auuuqqq6666qr/yahcddVVV1111VX/o509e/bWYRi46qqrrvqf6OzZs7dy1VVXXXXVVVf9T0blqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV131P94wDFx11VVX/U9033333cpVV1111VVXXfU/GZWrrrrqqquuuup/tPvuu+9Wrrrqqquuuuqqq6666qqr/m0Irrrqqquuuuqq//Huu+++W4dh4Kqrrrrqf4phGLjvvvtu5aqrrrrqqquu+p+O4Kqrrrrqqquu+h/v7Nmzt67Xa6666qqr/qdYr9ecPXv2Vq666qqrrrrqqv/pqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrvpXGoaB++6771auuuqqq6666qr/6ahcddVVV1111VX/49133323DsPAVVddddVVV1111VVXXXXVvxKVq6666qqrrrrqf7z77rvv1mEYuOqqq676n2IYBu67775bueqqq6666qqr/qejctVVV1111VVXXXXVVVdd9a909913c9VVV1111VVX/a9A5aqrrrrqqquu+h/v7NmzzxiGgauuuuqq/0nOnj37DK666qqrrrrqqv/pqFx11VVXXXXVVf/j3Xfffbeu12uuuuqqq6666qqrrrrqqqv+lahcddVVV1111VVXXXXVVVf9G9x33323ctVVV1111VVX/U9H5aqrrrrqqquu+h/v7Nmztw7DwFVXXXXV/yRnz569lauuuuqqq6666n86KlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqv/x7rvvvluHYeCqq6666n+S++6771auuuqqq6666qr/6ahcddVVV1111VVXXXXVVVddddVVV1111VX/VxFcddVVV1111VX/K9x33323DsPAVVddddV/t2EYuO+++27lqquuuuqqq67634Dgqquuuuqqq676X+Hs2bO3rtdrrrrqqqv+u63Xa86ePXsrV1111VVXXXXV/wZUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVV/yvcd999tw7DwFVXXXXVf7dhGLjvvvtu5aqrrrrqqquu+t+AylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666n+F++6779ZhGLjqqquu+u82DAP33XffrVx11VVXXXXVVf8bULnqqquuuuqqq6666qqrrvpXuPvuuzl79uwzuOqqq6666qqr/jegctVVV1111VVX/a9w9uzZZwzDwFVXXXXVVVddddVVV1111b8Clauuuuqqq6666n+F++6779b1es1VV1111VVXXXXVVVddddW/ApWrrrrqqquuuuqqq6666qp/pfvuu+9Wrrrqqquuuuqq/w2oXHXVVVddddVV/yucPXv21mEYuOqqq676n+Ds2bO3ctVVV1111VVX/W9A5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVdd9b/Cfffdd+swDFx11VVX/U9w33333cpVV1111VVXXfW/AZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KoKrrrrqqquuuup/jfvuu+/WYRi46qqrrvrvMgwD9913361cddVVV1111VX/WxBcddVVV1111VX/a5w9e/bW9XrNVVddddV/l/V6zdmzZ2/lqquuuuqqq67634LKVVddddVVV1111VVXXXXVi2gYBq666qqrrrrqqv9VqFx11VVXXXXVVf9r3HfffbcOw8BVV1111X+n++6771auuuqqq6666qr/LahcddVVV1111VX/a9x33323DsPAVVddddVVV1111VVXXXXVi4jKVVddddVVV1111VVXXXXVi2gYBu67775bueqqq6666qqr/regctVVV1111VVXXXXVVVdd9SK6++67OXv27DO46qqrrrrqqqv+t6By1VVXXXXVVVf9r3H27NlnDMPAVVddddVVV1111VVXXXXVi4jKVVddddVVV131v8Z9991363q95qqrrrrqv9N99913K1ddddVVV1111f8WVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVf9rnD179tZhGLjqqquu+u909uzZW7nqqquuuuqqq/63oHLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrvpf47777rt1GAauuuqqq/473Xfffbdy1VVXXXXVVVf9b0Fw1VVXXXXVVVf9r3LffffdOgwDV1111VVXXXXVVVddddVVLwIqV1111VVXXXXVVVddddVVL4JhGLjvvvtu5aqrrrrqqquu+t+E4Kqrrrrqqquu+l/l7Nmzt67Xa6666qqr/qut12vOnj17K1ddddVVV1111f8mVK666qqrrrrqqquuuuqqq14EwzBw33333cpVV1111VVXXfW/CZWrrrrqqquuuup/lfvuu+/WYRi46qqrrrrqqquuuuqqq656EVC56qqrrrrqqqv+V7nvvvtuHYaBq6666qqrrrrqqquuuuqqFwGVq6666qqrrrrqqquuuuqqF8EznvEM7rvvvlu56qqrrrrqqqv+N6Fy1VVXXXXVVVf9r3L27NlnDMPAVVddddV/h7Nnzz6Dq6666qqrrrrqfxMqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqq/1Xuu+++W9frNVddddVV/x3uu+++W7nqqquuuuqqq/43oXLVVVddddVVV1111VVXXfUiOnv27K1cddVVV1111VX/m1C56qqrrrrqqqv+Vzl79uytwzBw1VVXXXXVVVddddVVV131IqBy1VVXXXXVVVddddVVV131Irrvvvtu5aqrrrrqqquu+t+EylVXXXXVVVdd9b/Kfffdd+swDFx11VVXXXXVVVddddVVV70ICK666qqrrrrqqv917rvvvluHYeCqq6666qqrrrrqqquuuupfQOWqq6666qqrrrrqqquuuupfMAwD9913361cddVVV1111VX/2xBcddVVV1111VX/65w9e/bW9XrNVVddddV/lfV6zdmzZ2/lqquuuuqqq67634bKVVddddVVV1111VVXXXXVv2AYBu67775bueqqq6666qqr/rehctVVV1111VVX/a9z33333ToMA1ddddVVV1111VVXXXXVVf8CKlddddVVV1111f869913363DMHDVVVdd9V9lGAauuuqqq6666qr/lahcddVVV1111VVXXXXVVVf9C+6++27uu+++W7nqqquuuuqqq/63oXLVVVddddVVV/2vc/bs2WcMw8BVV1111X+ls2fPPoOrrrrqqquuuup/GypXXXXVVVddddX/Ovfdd9+t6/Waq6666qqrrrrqqquuuuqqfwGVq6666qqrrrrqqquuuuqqF8F99913K1ddddVVV1111f82VK666qqrrrrqqv91zp49e+swDFx11VVX/Vc6e/bsrVx11VVXXXXVVf/bULnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXfUiuO+++27lqquuuuqqq67634bKVVddddVVV131v85999136zAMXHXVVVddddVVV1111VVX/QsIrrrqqquuuuqq/5Xuu+++W4dh4KqrrrrqP9swDNx33323ctVVV1111VVX/W9EcNVVV1111VVX/a909uzZW9frNVddddVVV1111VVXXXXVVS8Elauuuuqqq6666qqrrrrqqhdivV5z9uzZW7nqqquuuuqqq/43onLVVVddddVVV1111VVXXfVCDMPAfffddytXXXXVVVddddX/RlSuuuqqq6666qr/le67775bh2Hgqquuuuqqq6666qqrrrrqhaBy1VVXXXXVVVf9r3TffffdOgwDV1111VX/2YZh4L777ruVq6666qqrrrrqfyMqV1111VVXXXXVVVddddVVL8Tdd9/NVVddddVVV131vxaVq6666qqrrrrqf6WzZ88+YxgGrrrqqqv+K5w9e/YZXHXVVVddddVV/xtRueqqq6666qqr/le67777bl2v11x11VVXXXXVVVddddVVV70QVK666qqrrrrqqquuuuqqq/4F9913361cddVVV1111VX/G1G56qqrrrrqqqv+Vzp79uytwzBw1VVXXfVf4ezZs7dy1VVXXXXVVVf9b0Tlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV131v9YwDFx11VVX/Ve47777buWqq6666qqrrvrfiMpVV1111VVXXfW/0n333XcrV1111VVXXXXVVVddddVVLxzBVVddddVVV131v9Z999136zAMXHXVVVf9ZxmGgfvuu+9Wrrrqqquuuuqq/60Irrrqqquuuuqq/7XOnj1763q95qqrrrrqP8t6vebs2bO3ctVVV1111VVX/W9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111QswDAP33XffrVx11VVXXXXVVf9bUbnqqquuuuqqq/7Xuu+++24dhoGrrrrqqquuuuqqq6666qoXgMpVV1111VVXXfW/1n333XfrMAxcddVVV/1nGYaB++6771auuuqqq6666qr/rahcddVVV1111VVXXXXVVVe9AHfffTdXXXXVVVddddX/alSuuuqqq6666qr/tc6ePfuMYRi46qqrrvrPdPbs2Wdw1VVXXXXVVVf9b0Xlqquuuuqqq676X+u+++67db1ec9VVV1111VVXXXXVVVdd9QJQueqqq6666qqrrrrqqquueiHuu+++W7nqqquuuuqqq/63onLVVVddddVVV/2vdfbs2VuHYeCqq6666j/T2bNnb+Wqq6666qqrrvrfispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuup/rfvuu+/WYRi46qqrrvrPdN99993KVVddddVVV131vxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yqCq6666qqrrrrqf7X77rvv1mEYuOqqq676jzYMA/fdd9+tXHXVVVddddVV/5sRXHXVVVddddVV/6udPXv21vV6zVVXXXXVf7T1es3Zs2dv5aqrrrrqqquu+t+MylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666n+1++6779ZhGLjqqquu+o82DAP33XffrVx11VVXXXXVVf+bUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV/2vdt999906DANXXXXVVf/RhmHgvvvuu5Wrrrrqqquuuup/MypXXXXVVVddddVVV1111VXPx913383Zs2efwVVXXXXVVVdd9b8Zlauuuuqqq6666n+1s2fPPmMYBq666qqrrrrqqquuuuqqq54PKlddddVVV1111f9q9913363r9Zqrrrrqqquuuuqqq6666qrng8pVV1111VVXXXXVVVddddULcN99993KVVddddVVV131vxmVq6666qqrrrrqf7WzZ8/eOgwDV1111VX/Gc6ePXsrV1111VVXXXXV/2ZUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVV/6vdd999tw7DwFVXXXXVf4b77rvvVq666qqrrrrqqv/NqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XEVx11VVXXXXVVf/r3XfffbcOw8BVV1111X+UYRi47777buWqq6666qqrrvrfjuCqq6666qqrrvpf7+zZs7eu12uuuuqqq/6jrNdrzp49eytXXXXVVVddddX/dlSuuuqqq6666qqrrrrqqqueyzAM3Hfffbdy1VVXXXXVVVf9b0flqquuuuqqq676X+++++67dRgGrrrqqquuuuqqq6666qqrnguVq6666qqrrrrqf7377rvv1mEYuOqqq6666qqrrrrqqquuei5Urrrqqquuuuqqq6666qqrnssznvEM7rvvvlu56qqrrrrqqqv+t6Ny1VVXXXXVVVddddVVV131fJw9e/YZXHXVVVddddVV/9tRueqqq6666qqr/tc7e/bsM4Zh4Kqrrrrqqquuuuqqq6666rlQueqqq6666qqr/te77777bl2v11x11VVX/Ue67777buWqq6666qqrrvrfjspVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuup/vbNnz946DANXXXXVVf+Rzp49eytXXXXVVVddddX/dlSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VX/69133323DsPAVVddddV/pPvuu+9Wrrrqqquuuuqq/+0Irrrqqquuuuqq/xPuu+++W4dh4Kqrrrrqqquuuuqqq6666gGoXHXVVVddddVVV1111VVXPcAwDNx33323ctVVV1111VVX/V9AcNVVV1111VVX/Z9w9uzZW9frNVddddVV/17DMHD27Nlbueqqq6666qqr/i+gctVVV1111VVXXXXVVVdd9QDr9Zr77rvvVq666qqrrrrqqv8LqFx11VVXXXXVVf8n3HfffbcOw8BVV1111VVXXXXVVVddddUDULnqqquuuuqqq/5PuO+++24dhoGrrrrqqquuuuqqq6666qoHoHLVVVddddVVV1111VVXXfUAz3jGM7jvvvtu5aqrrrrqqquu+r+AylVXXXXVVVdd9X/C2bNnnzEMA1ddddVV/xHOnj37DK666qqrrrrqqv8LCK666qqrrrrqqv8zzp8/z1VXXXXVVVddddVVV1111QNQueqqq6666qqr/k+47777buWqq6666j/IfffddytXXXXVVVddddX/BehBD3oQV1111VVXXXXV/37XXHPNg8+cOfPgz/3cz/0trrrqqqv+Hb7+67/+fX7rt37ru7nqqquuuuqqq/4vQA960IO46qqrrrrqqqv+b7jmmmsezFVX/R9h25LEA9i2JPEAti1JPIBtSxIPYNuSxAPYtiTxALYtSTyAbUsSD2DbksQD2LYk8QC2LUk8gG1LEg9g25LEA9i2JPEAti1JPIBtSxIPYNuSxAPYtiTxALYtSTzAfffddytXXXXVVVddddX/FehBD3oQV1111VVXXXXVVVddddVVV1111VVXXXXV/0lUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV131f9Y7vuM7ftaLv/iLvzZX/XcRYJ6TAPOcBJjnJMA8JwHmOQkwz0mAeU4CzHMSYJ6TAPOcBJjnJMA8JwHmOQkwz0mAeU4CzHMSYJ6TAPOcBJjnJMA8JwHmOQkwz0mAeU4CzHMSYJ6TAPOcBJjnJMA8JwHmOQkwz0mAeU4CzHMSYJ6TAPOc9Pd///e/9aM/+qOfw1VXXXXVVVdd9X8Rlauuuuqqq6666v+kd3zHd/ysd33Xd33vhz70oQ/mqv90krDNA0nCNg8kCds8kCRs80CSsM0DScI2DyQJ2zyQJGzzQJKwzQNJwjYPJAnbPJAkbPNAkrDNA0nCNg8kCds8kCRs80CSsM0DScI2DyQJ2zyQJGzzQJKwzQNJwjYPJAnbPJAkbPNAkrDNA0nCNg8kCds8kCRs80CSsM0DScI2DyQJ2zyQJGzzQJKwzQNJwjYPJAnbPJAkXvIlX/JBZ8+efcZv/dZvfTdXXXXVVVddddX/NVSuuuqqq6666qr/k6655poH33TTTQ/e3t7mqquuuuqFuemmmx78Yi/2Yq/1W7/1W9/NVVddddVVV131fw2Vq6666qqrrrrq/6T77rvv1mEYuOqqq676lwzDwH333XcrV1111VVXXXXV/0VUrrrqqquuuuqqq6666qr/1+6++27Onj37DK666qqrrrrqqv+LqFx11VVXXXXVVf8nnT179hnDMHDVVVddddVVV1111VVX/b9G5aqrrrrqqquu+j/pvvvuu3W9XnPVVVddddVVV1111VVX/b9G5aqrrrrqqquuuuqqq676f+++++67lauuuuqqq6666v8iKlddddVVV1111f9JZ8+evXUYBq666qqrXhRnz569lauuuuqqq6666v8iKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqv+T7rvvvluHYeCqq6666kVx33333cpVV1111VVXXfV/EcFVV1111VVXXfV/2jAMXHXVVVddddVVV1111VX/bxFcddVVV1111VX/Z9133323ctVVV131QgzDwH333XcrV1111VVXXXXV/1UEV1111VVXXXXV/1lnz569db1ec9VVV131ggzDwNmzZ2/lqquuuuqqq676v4rKVVddddVVV1111VVXXfX/1nq95r777ruVq6666qqrrrrq/yoqV1111VVXXXXV/1n33XffrcMwcNVVV1111VVXXXXVVVf9v0Xlqquuuuqqq676P+u+++67dRgGrrrqqquuuuqqq6666qr/t6hcddVVV1111VVXXXXVVf9vPeMZz+C+++67lauuuuqqq6666v8qKlddddVVV1111VVXXXXV/2tnz559BlddddVVV1111f9VVK666qqrrrrqqv+zzp49+4xhGLjqqquuuuqqq6666qqr/t+ictVVV1111VVX/Z9133333bper7nqqquuemHuu+++W7nqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrvo/6+zZs7cOw8BVV1111Qtz9uzZW7nqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrvo/67777rt1GAauuuqqq16Y++6771auuuqqq6666qr/qwiuuuqqq6666qr/0+67775bh2Hgqquuuuqqq6666qqrrvp/icpVV1111VVXXXXVVVdd9f/SMAycPXv2GVx11VVXXXXVVf+XEVx11VVXXXXVVf+nnT179tb1es1VV1111XNbr9fcd999t3LVVVddddVVV/1fRuWqq6666qqrrrrqqquu+n9pGAbuu+++W7nqqquuuuqqq/4vo3LVVVddddVVV/2fdt999906DANXXXXVVVddddVVV1111f9LVK666qqrrrrqqv/T7rvvvluHYeCqq6666qqrrrrqqquu+n+JylVXXXXVVVddddVVV131/9IznvEM7rvvvqdz1VVXXXXVVVf9X0blqquuuuqqq676P+3s2bPPGIaBq6666qrn5+zZs8/gqquuuuqqq676v4zKVVddddVVV131f9p9991363q95qqrrrrqqquuuuqqq676f4nKVVddddVVV1111VVXXfX/1tmzZ2/lqquuuuqqq676v4zKVVddddVVV1111VVXXfX/1n333XcrV1111VVXXXXV/2VUrrrqqquuuuqq/9POnj176zAMXHXVVVddddVVV1111VX/L1G56qqrrrrqqquuuuqqq/7fuu+++27lqquuuuqqq676v4zKVVddddVVV131f9p999136zAMXHXVVVddddVVV1111VX/LxFcddVVV1111VX/59133323DsPAVVddddVVV1111VVXXfX/DpWrrrrqqquuuuqqq6666v+dYRi47777buWqq6666qqrrvq/juCqq6666qqrrvo/7+zZs7eu12uuuuqqq+63Xq85e/bsrVx11VVXXXXVVf/XUbnqqquuuuqqq6666qqr/t8ZhoH77rvvVq666qqrrrrqqv/rqFx11VVXXXXVVf/n3XfffbcOw8BVV1111VVXXXXVVVdd9f8Olauuuuqqq6666v+8++6779ZhGLjqqquuut8wDNx33323ctVVV1111VVX/V9H5aqrrrrqqquuuuqqq676f+fuu+/mqquuuuqqq676f4HKVVddddVVV131f97Zs2efMQwDV1111VUPdPbs2Wdw1VVXXXXVVVf9X0flqquuuuqqq676P+++++67db1ec9VVV1111VVXXXXVVVf9v0Plqquuuuqqq6666qqrrvp/6b777ruVq6666qqrrrrq/zoqV1111VVXXXXV/3lnz569dRgGrrrqqqse6OzZs7dy1VVXXXXVVVf9X0flqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXfX/0n333XcrV1111VVXXXXV/3VUrrrqqquuuuqq//Puu+++W4dh4Kqrrrrqqquuuuqqq676f4fgqquuuuqqq676f+G+++67dRgGrrrqqquGYeC+++67lauuuuqqq6666v8Dgquuuuqqq6666v+Fs2fP3rper7nqqquuuuqqq6666qqr/l+hctVVV1111VVXXXXVVVf9v7Jerzl79uytXHXVVVddddVV/x9Queqqq6666qqrrrrqqqv+XxmGgfvuu+9Wrrrqqquuuuqq/w+oXHXVVVddddVV/y/cd999tw7DwFVXXXXVVVddddVVV131/wqVq6666qqrrrrq/4X77rvv1mEYuOqqq64ahoH77rvvVq666qqrrrrqqv8PqFx11VVXXXXVVVddddVV/6/cfffdXHXVVVddddVV/29Queqqq6666qqr/l84e/bsM4Zh4KqrrroK4OzZs8/gqquuuuqqq676/4DKVVddddVVV131/8J9991363q95qqrrrrqqquuuuqqq676f4XKVVddddVVV1111VVXXfX/zn333XcrV1111VVXXXXV/wdUrrrqqquuuuqq/xfOnj176zAMXHXVVVcBnD179lauuuqqq6666qr/D6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqqv+X7jvvvtuHYaBq6666iqA++6771auuuqqq6666qr/D6hcddVVV1111VVXXXXVVVddddVVV1111VX/VxFcddVVV1111VX/b9x33323DsPAVVdd9f/XMAzcd999t3LVVVddddVVV/1/QXDVVVddddVVV/2/cfbs2VvX6zVXXXXV/1/r9ZqzZ8/eylVXXXXVVVdd9f8Flauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXV/xvDMHDffffdylVXXXXVVVdd9f8Flauuuuqqq6666v+N++6779ZhGLjqqquuuuqqq6666qqr/t+gctVVV1111VVX/b9x33333ToMA1ddddX/X8MwcN99993KVVddddVVV131/wWVq6666qqrrrrqqquuuur/jbvvvpurrrrqqquuuur/FSpXXXXVVVddddX/G2fPnn3GMAxcddVV/7+dPXv2GVx11VVXXXXVVf9fULnqqquuuuqqq/7fuO+++25dr9dcddVVV1111VVXXXXVVf9vULnqqquuuuqqq6666qqr/l+57777buWqq6666qqrrvr/gspVV1111VVXXfX/xtmzZ28dhoGrrrrq/7ezZ8/eylVXXXXVVVdd9f8Flauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111f8b9913363DMHDVVVf9/3bffffdylVXXXXVVVdd9f8Flauuuuqqq6666qqrrrrqqquuuuqqq6666v8qgquuuuqqq6666v+V++6779ZhGLjqqqv+/xmGgfvuu+9Wrrrqqquuuuqq/08Irrrqqquuuuqq/1fOnj1763q95qqrrvr/ZxgGzp49eytXXXXVVVddddX/J1Suuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VX/r9x33323DsPAVVdd9f/Per3mvvvuu5Wrrrrqqquuuur/EypXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qr/V+67775bh2Hgqquu+v9nGAbuu+++W7nqqquuuuqqq/4/oXLVVVddddVVV1111VVX/b9w9913c/bs2Wdw1VVXXXXVVVf9f0Llqquuuuqqq676f+Xs2bPPGIaBq6666qqrrrrqqquuuur/BSpXXXXVVVddddX/K/fdd9+t6/Waq6666qqrrrrqqquuuur/BSpXXXXVVVddddVVV1111f8b9913361cddVVV1111VX/n1C56qqrrrrqqqv+Xzl79uytwzBw1VVX/f909uzZW7nqqquuuuqqq/4/oXLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrvp/5b777rt1GAauuuqq/5/uu+++W7nqqquuuuqqq/4/Ibjqqquuuuqqq/5fGoaBq6666qqrrrrqqquuuur/PIKrrrrqqquuuur/nfvuu+9Wrrrqqv9XhmHg7Nmzz+Cqq6666qqrrvr/huCqq6666qqrrvp/57777rt1vV5z1VVX/f+xXq+57777buWqq6666qqrrvr/hspVV1111VVXXXXVVVdd9X/eMAzcd999t3LVVVddddVVV/1/Q+Wqq6666qqrrvp/5+zZs7cOw8BVV1111VVXXXXVVVdd9X8elauuuuqqq6666v+d++6779ZhGLjqqquuuuqqq6666qqr/s+jctVVV1111VVXXXXVVVf9n/eMZzyD++677+lcddVVV1111VX/31C56qqrrrrqqquuuuqqq/5fOHv27DO46qqrrrrqqqv+v6Fy1VVXXXXVVVf9v3P27Nlbh2Hgqquuuuqqq6666qqrrvo/j8pVV1111VVXXfX/zn333Xfrer3mqquu+v/l7Nmzt3LVVVddddVVV/1/Q+Wqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXfX/zn333XfrMAxcddVV/7/cd999t3LVVVddddVVV/1/Q+Wqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXfX/ztmzZ58xDANXXXXV/y/33XffrVx11VVXXXXVVf/fEFx11VVXXXXVVf8v3XfffbcOw8BVV1111VVXXXXVVVdd9X8alauuuuqqq6666qqrrrrq/7RhGLjvvvtu5aqrrrrqqquu+v+I4Kqrrrrqqquu+n/p7Nmzt67Xa6666qr/+9brNWfPnr2Vq6666qqrrrrq/yMqV1111VVXXXXVVVddddX/acMwcN99993KVVddddVVV131/xGVq6666qqrrrrq/6X77rvv1mEYuOqqq6666qqrrrrqqqv+T6Ny1VVXXXXVVVf9v3TffffdOgwDV1111VVXXXXVVVddddX/aVSuuuqqq6666qqrrrrqqv/TnvGMZ3DffffdylVXXXXVVVdd9f8Rlauuuuqqq6666v+ls2fPPmMYBq666qr/H86ePfsMrrrqqquuuuqq/4+oXHXVVVddddVV/y/dd999t67Xa6666qqrrrrqqquuuuqq/9OoXHXVVVddddVVV1111VX/59133323ctVVV1111VVX/X9E5aqrrrrqqquuuuqqq676P+/s2bO3ctVVV1111VVX/X9E5aqrrrrqqquu+n/p7Nmztw7DwFVXXXXVVVddddVVV131fxqVq6666qqrrrrqqquuuur/vPvuu+9Wrrrqqquuuuqq/4+oXHXVVVddddVV/y/dd999tw7DwFVXXXXVVVddddVVV131fxrBVVddddVVV131/9Z999136zAMXHXVVVddddVVV1111VX/ZxFcddVVV1111VX/r63Xa6666qr/u4Zh4L777ruVq6666qqrrrrq/yuCq6666qqrrrrq/62zZ8/eylVXXfV/2nq95uzZs7dy1VVXXXXVVVf9f0Xlqquuuuqqq6666qqrrvo/axgG7rvvvlu56qqrrrrqqqv+v6Jy1VVXXXXVVVf9v3XffffdOgwDV1111VVXXXXVVVddddX/WVSuuuqqq6666qr/t+67775bh2Hgqquu+r9rGAbuu+++W7nqqquuuuqqq/6/onLVVVddddVVV1111VVX/Z919913c9VVV1111VVX/b9G5aqrrrrqqquu+n/r7NmzzxiGgauuuur/trNnzz6Dq6666qqrrrrq/ysqV1111VVXXXXV/1v33Xffrev1mquuuuqqq6666qqrrrrq/ywqV1111VVXXXXVVVddddX/affdd9+tXHXVVVddddVV/19Rueqqq6666qqr/t86e/bsrcMwcNVVV/3fdvbs2Vu56qqrrrrqqqv+v6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrvo/7b777ruVq6666qqrrrrq/ysqV1111VVXXXXV/1v33XffrcMwcNVVV1111VVXXXXVVVf9n0Vw1VVXXXXVVVf9v3bffffdOgwDV1111f89wzBw33333cpVV1111VVXXfX/GcFVV1111VVXXfX/2tmzZ29dr9dcddVVV1111VVXXXXVVf8nUbnqqquuuuqqq6666qqr/k9ar9ecPXv2Vq666qqrrrrqqv/PqFx11VVXXXXVVVddddVV/ycNw8B99913K1ddddVVV1111f9nVK666qqrrrrqqv/X7rvvvluHYeCqq6666qqrrrrqqquu+j+JylVXXXXVVVdd9f/afffdd+swDFx11VX/9wzDwH333XcrV1111VVXXXXV/2dUrrrqqquuuuqqq6666qr/k+6++26uuuqqq6666qr/96hcddVVV1111VX/r509e/YZwzBw1VVX/d909uzZZ3DVVVddddVVV/1/RuWqq6666qqrrvp/7b777rt1vV5z1VVXXXXVVVddddVVV/2fROWqq6666qqrrrrqqquu+j/rvvvuu5Wrrrrqqquuuur/MypXXXXVVVddddX/a2fPnr11GAauuuqq/5vOnj17K1ddddVVV1111f9nVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVf+v3XfffbcOw8BVV131f9N99913K1ddddVVV1111f9nVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rCK666qqrrrrqqv/37rvvvluHYeCqq676v2MYBu67775bueqqq6666qqr/r8juOqqq6666qqr/t87e/bsrev1mquuuur/jmEYOHv27K1cddVVV1111VX/31G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddBQzDwFVXXfV/x3q95r777ruVq6666qqrrrrq/zsqV1111VVXXXXV/3v33XffrVx11VVXXXXVVVddddVV/xdRueqqq6666qqr/t+77777bh2Ggauuuur/jmEYuO+++27lqquuuuqqq676/47KVVddddVVV1111VVXXfV/zt13381VV1111VVXXXUVQOWqq6666qqrrvp/7+zZs88YhoGrrrrq/5azZ88+g6uuuuqqq6666v87KlddddVVV1111f979913363r9Zqrrrrqqquuuuqqq6666v8cKlddddVVV1111VVXXXXV/0n33XffrVx11VVXXXXVVf/fUbnqqquuuuqqq/7fO3v27K3DMHDVVVf933L27Nlbueqqq6666qqr/r+jctVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquu+n/vvvvuu3UYBq666qr/W+67775bueqqq6666qqr/r+jctVVV1111VVXXXXVVVddddVVV1111VVX/V9FcNVVV1111VVXXQXcd999tw7DwFVXXfW/3zAMnD179hlcddVVV1111VVXAcFVV1111VVXXXUVcN999926Xq+56qqr/vdbr9fcd999t3LVVVddddVVV10FVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVcBZ8+evXUYBq666qr//YZh4L777ruVq6666qqrrrrqKqBy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq666CrjvvvtuHYaBq6666n+/YRi47777ns5VV1111VVXXXUVULnqqquuuuqqq6666qqr/k+5++67OXv27DO46qqrrrrqqquuAipXXXXVVVddddVVwNmzZ28dhoGrrrrqqquuuuqqq6666v8UKlddddVVV1111VXAfffdd+t6veaqq6666qqrrrrqqquu+j+FylVXXXXVVVddddVVV131f87Zs2dv5aqrrrrqqquuugqoXHXVVVddddVVVwH33XffrcMwcNVVV/3fcN99993KVVddddVVV111FVC56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddBZw9e/YZwzBw1VVX/d9w33333cpVV1111VVXXXUVEFx11VVXXXXVVVc9wDAMXHXVVVddddVVV1111VX/ZxBcddVVV1111VVXPdN99913K1ddddX/asMwcN99993KVVddddVVV1111RUEV1111VVXXXXVVc909uzZW9frNVddddX/Xuv1mrNnz97KVVddddVVV1111RVUrrrqqquuuuqqq6666qr/M4Zh4L777ruVq6666qqrrrrqqiuoXHXVVVddddVVVz3Tfffdd+swDFx11VVXXXXVVVddddVV/2dQueqqq6666qqrrnqm++6779ZhGLjqqquuuuqqq6666qqr/s+gctVVV1111VVXXXXVVVf9n/GMZzyD++6771auuuqqq6666qqrrqBy1VVXXXXVVVddddVVV/2fcvbs2Wdw1VVXXXXVVVdddQWVq6666qqrrrrqqmc6e/bsM4Zh4Kqrrrrqqquuuuqqq676P4PKVVddddVVV1111TPdd999t67Xa6666qr/3e67775bueqqq6666qqrrrqCylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qpnOnv27K3DMHDVVVf973b27Nlbueqqq6666qqrrrqCylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qpnuu+++24dhoGrrrrqf7f77rvvVq666qqrrrrqqquuILjqqquuuuqqq656gPvuu+/WYRi46qqrrrrqqquuuuqqq/5PoHLVVVddddVVV1111VVX/Z8wDAP33XffrVx11VVXXXXVVVc9G8FVV1111VVXXXXVA5w9e/bW9XrNVVdd9b/Per3m7Nmzt3LVVVddddVVV131bFSuuuqqq6666qqrrrrqqv8ThmHgvvvuu5WrrrrqqquuuuqqZ6Ny1VVXXXXVVVdd9QD33XffrcMwcNVVV1111VVXXXXVVVf9n0Dlqquuuuqqq6666gHuu+++W4dh4Kqrrrrqqquuuuqqq676P4HKVVddddVVV1111VVXXfV/wjOe8Qzuu+++W7nqqquuuuqqq656NipXXXXVVVddddVVD3D27NlnDMPAVVdd9b/T2bNnn8FVV1111VVXXXXVs1G56qqrrrrqqquueoD77rvv1vV6zVVXXXXVVVddddVVV131fwKVq6666qqrrrrqqquuuur/jPvuu+9Wrrrqqquuuuqqq56NylVXXXXVVVddddVVV131f8bZs2dv5aqrrrrqqquuuurZqFx11VVXXXXVVVc9wNmzZ28dhoGrrrrqqquuuuqqq6666v8EKlddddVVV1111VVXXXXV/xn33XffrVx11VVXXXXVVVc9G5WrrrrqqquuuuqqB7jvvvtuHYaBq6666qqrrrrqqquuuur/BIKrrrrqqquuuuqq53LffffdOgwDV1111VVXXXXVVVddddX/egRXXXXVVVddddVVz8d6veaqq67632MYBu67775bueqqq6666qqrrnpOBFddddVVV1111VXP5ezZs7dy1VVX/a+yXq85e/bsrVx11VVXXXXVVVc9JypXXXXVVVddddVVV1111f96wzBw33333cpVV1111VVXXXXVc6Jy1VVXXXXVVVdd9Vzuu+++W4dh4Kqrrrrqqquuuuqqq676X4/KVVddddVVV1111XO57777bh2Ggauuuup/j2EYuO+++27lqquuuuqqq6666jlRueqqq6666qqrrrrqqqv+17v77ru56qqrrrrqqquuej4Irrrqqquuuuqqq57L2bNnn3H33Xdz1VVX/e9y9uzZZ3DVVVddddVVV131nKhcddVVV1111VVXPZd/+Id/+O0f+ZEf+Wzgs7nqqqv+V/iRH/mRz/6Hf/iH3+aqq6666qqrrrrqOaEHPehBXHXVVVddddVVVz23a6655sG2LUk8gG1LEg9g25LEA9i2JPEAti1JPIBtSxIPYNuSxAPYtiTxALYtSTyAbUsSD2DbksQD2LYk8QC2LUk8gG1LEg9g25LEA9i2JPEAti1JPIBtSxIPYNuSxAPYtiTxALYtSTyAbUsSD2DbksQD2LYk8QC2LUk8gG1LEg9g25LEA9i2JPEAti1JPIBtSxIPYNuSxAPYtiTxALYtSTyAbUsSD2DbksQD2LYk8QC2LUk8gG1LEg9g25LEA9i2JPEAti1JPIBtSxIPYNuSxAPYtiTxALYtSTyAbUsSD2DbksQD2PbZs2efwVVXXXXVVVddddXzQg960IO46qqrrrrqqquuuuqqq6666qqrrrrqqqv+T6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X8U/ApI1TtC683z4AAAAAElFTkSuQmCC) + diff --git a/docs/kcl/index.md b/docs/kcl/index.md index da2243646..bf91b8cf4 100644 --- a/docs/kcl/index.md +++ b/docs/kcl/index.md @@ -7,6 +7,7 @@ layout: manual ## Table of Contents * [Types](kcl/types) +* [Modules](kcl/modules) * [Known Issues](kcl/KNOWN-ISSUES) * [`abs`](kcl/abs) * [`acos`](kcl/acos) @@ -18,7 +19,9 @@ layout: manual * [`angledLineThatIntersects`](kcl/angledLineThatIntersects) * [`angledLineToX`](kcl/angledLineToX) * [`angledLineToY`](kcl/angledLineToY) +* [`appearance`](kcl/appearance) * [`arc`](kcl/arc) +* [`arcTo`](kcl/arcTo) * [`asin`](kcl/asin) * [`assert`](kcl/assert) * [`assertEqual`](kcl/assertEqual) @@ -27,10 +30,12 @@ layout: manual * [`assertLessThan`](kcl/assertLessThan) * [`assertLessThanOrEq`](kcl/assertLessThanOrEq) * [`atan`](kcl/atan) +* [`atan2`](kcl/atan2) * [`bezierCurve`](kcl/bezierCurve) * [`ceil`](kcl/ceil) * [`chamfer`](kcl/chamfer) * [`circle`](kcl/circle) +* [`circleThreePoint`](kcl/circleThreePoint) * [`close`](kcl/close) * [`cm`](kcl/cm) * [`cos`](kcl/cos) @@ -72,26 +77,36 @@ layout: manual * [`patternLinear2d`](kcl/patternLinear2d) * [`patternLinear3d`](kcl/patternLinear3d) * [`patternTransform`](kcl/patternTransform) +* [`patternTransform2d`](kcl/patternTransform2d) * [`pi`](kcl/pi) * [`polar`](kcl/polar) +* [`polygon`](kcl/polygon) +* [`pop`](kcl/pop) * [`pow`](kcl/pow) * [`profileStart`](kcl/profileStart) * [`profileStartX`](kcl/profileStartX) * [`profileStartY`](kcl/profileStartY) +* [`push`](kcl/push) * [`reduce`](kcl/reduce) * [`rem`](kcl/rem) * [`revolve`](kcl/revolve) +* [`round`](kcl/round) * [`segAng`](kcl/segAng) +* [`segEnd`](kcl/segEnd) * [`segEndX`](kcl/segEndX) * [`segEndY`](kcl/segEndY) * [`segLen`](kcl/segLen) +* [`segStart`](kcl/segStart) +* [`segStartX`](kcl/segStartX) +* [`segStartY`](kcl/segStartY) * [`shell`](kcl/shell) * [`sin`](kcl/sin) * [`sqrt`](kcl/sqrt) * [`startProfileAt`](kcl/startProfileAt) -* [`startSketchAt`](kcl/startSketchAt) * [`startSketchOn`](kcl/startSketchOn) +* [`sweep`](kcl/sweep) * [`tan`](kcl/tan) +* [`tangentToEnd`](kcl/tangentToEnd) * [`tangentialArc`](kcl/tangentialArc) * [`tangentialArcTo`](kcl/tangentialArcTo) * [`tangentialArcToRelative`](kcl/tangentialArcToRelative) diff --git a/docs/kcl/int.md b/docs/kcl/int.md index 6bb051920..a2bbb37c6 100644 --- a/docs/kcl/int.md +++ b/docs/kcl/int.md @@ -6,12 +6,10 @@ layout: manual Convert a number to an integer. -Callers should use floor(), ceil(), or other rounding function first if they care about how numbers with fractional parts are converted. If the number has a fractional part, it's truncated, moving the number towards zero. - -If the number is NaN or has a magnitude, either positive or negative, that is too large to fit into the internal integer representation, the result is a runtime error. +DEPRECATED use floor(), ceil(), or round(). ```js -int(num: number) -> i64 +int(num: number) -> number ``` ### Tags @@ -27,7 +25,7 @@ int(num: number) -> i64 ### Returns -`i64` +`number` ### Examples @@ -37,11 +35,11 @@ n = int(ceil(5 / 2)) assertEqual(n, 3, 0.0001, "5/2 = 2.5, rounded up makes 3") // Draw n cylinders. startSketchOn('XZ') - |> circle({ center: [0, 0], radius: 2 }, %) + |> circle({ center = [0, 0], radius = 2 }, %) |> extrude(5, %) - |> patternTransform(n, (id) => { - return { translate: [4 * id, 0, 0] } -}, %) + |> patternTransform(n, fn(id) { + return { translate = [4 * id, 0, 0] } + }, %) ``` ![Rendered example of int 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAFeQ0lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquu+g9zzTXXPJgHOHPmzIN5prNnz97KM9133323ctVV/wWuueaaB/MAZ86ceTDPdPbs2Vt5pvvuu+9Wrrrqv8A111zzYB7gzJkzD+aZzp49eyvPdN99993KVVddddVVV131H4HKVVddddVVV131IrnmmmsefObMmQe/2Iu92GsBXHPNNQ++5pprHnzmzJkHX3PNNQ/mRXDffffdes011zwY4L777rsV4OzZs7fed999twL8wz/8w+8A3Hfffbf+wz/8w29z1VUvxDXXXPPgM2fOPPiaa6558JkzZx50zTXXPPiaa6558JkzZx58zTXXPJh/pfvuu+9WgLNnz95633333QrwD//wD79z33333QrwD//wD7/NVVe9ENdcc82Dz5w58+AXe7EXey2AF3/xF39tgDNnzjz4mmuueTD/Cvfdd9+tPNPZs2dvve+++24F+Id/+Iffue+++249e/bsrffdd9+tXHXVVVddddVV/xL0oAc9iKuuuuqqq6666jldc801D36xF3ux1z5z5syDXvzFX/y1X+zFXuy1AS5evMjFixfZ3d3l4sWL7O7ucvHiRQB2d3e5ePEi/5ITJ05wv+PHj3PixAmOHz/OiRMnOHHiBMePH+fEiRP8wz/8w2+fOXPmwf/wD//w2//wD//wO/fdd9+t//AP//DbXPX/0jXXXPPg137t134vgBd/8Rd/7Rd7sRd7bYCLFy+yu7vLxYsXuXjxIru7u1y8eBGA3d1dLl68yL/kxIkT3O/48eOcOHGC48ePc+LE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SOL5kcTzI4nnRxLPjyQk8fxIQhLPjyQk8YJIQhKSeGEkIQlJSOJFJQlJSEISkpDEv8apU6d41KMeRSmFf/iHf/jtj//4j3+Zs2fP3spVV1111VX/l1COHz/OVVddddVV/7ccHh7u/sIv/MLXALzsy77sa994440A3HXXXfxrSOLfQxL/XpL495DEv4ck/j0k8W8liX8rSbww1113HW/1Vm8FwD/8wz/89pd8yZe8Df/H/MM//MPv/PZv//b3vOIrvuJbX3vttccf9rCHcccddzCOI/9akvjXkMS/hiReVJJ4UUniRSGJf4kk/iWS+JdI4oWRxAsjiRdGEi+IJO63sbHBK77iK3L69Gnuu+++W7/kS77kbf70T//0p/k/5Ojo6NKf/dmf/czm5ubxRzziES995swZpmlif38fSTw3STw/knhuknhuknh+JPHcJPHcJPH8SOL5kcRzk4QknpskJPH8SOL5kYQknh9JSOIFkYQkXhhJSEISLwpJSEISkpDEv9cjH/lIrr32WgB+5Ed+5LO//uu//n246qqrrrrq/yLK8ePHueqqq6666v+mf/iHf/idf/iHf/idF3uxF3vtRz7ykccf/ehHc+7cOfb393lRSOLfSxL/HpL495LEv4ck/q0k8e8hiX8rSTw/D3/4w3m913s9AP7hH/7htz/zMz/zdfg/6vDwcPfP/uzPfuYVX/EV3/rEiRPHb775Zvq+59577+VfSxL/GpJ4UUniRSWJF5UkXhSS+JdI4l8iiX+JJF4YSbwwknhhJPGCSALg9OnTvPZrvzYbGxvcd999t37WZ33W69x6661/zf9Bh4eHu7feeuvfHB4e7r70S7/0a29vb1NrZXd3l+cmiecmiecmiedHEs9NEs9NEs9NEs+PJJ4fSTw3STw/knh+JCGJ5yYJSTw/kpDECyIJSbwgkpCEJP4lkpCEJCTxryUJSUhCEpKQhCRmsxmPfexj2djY4L777rv1S77kS97mt3/7t7+Hq6666qqr/q+iHD9+nKuuuuqqq/7vOnv27K1/9md/9jMPechDXrrvex75yEce7/ueu+66ixeFJP69JPHvIYl/D0n8e0ji30MS/x6S+LeSxAO9xmu8Bi/zMi8DwI/8yI989td//de/D//HHR4e7v7pn/7pTx8eHu6+7Mu+7Gtfe+21ANx77738a0jiX0MSLypJvKgk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K/eTxANJ4rlJ4rlJ4rlJ4oEk8dwk8dwk8dwk8fxI4rlJ4vmRxPMjiRdEEi+MJF6Yvu85efIk1113Hfe77777bv36r//69/mHf/iH3+aqq6666qqrXjToQQ96EFddddVVV131r3XNNdc8+LVf+7Xf653e6Z0+G2B/f5+77rqLu+66iyc+8Yn8a0ji30MS/x6S+PeQxL+VJF6Qra0tHvGIR/CyL/uy3O++++679eu//uvf5x/+4R9+m6v+25w5c+ZB7/RO7/TZr/M6r/PeAIeHh9x777087WlP49577+W5SeJFIYkXlSReFJL4l0jiXyKJf4kkXhhJvDCSuN/GxgYPetCDeMxjHsP9/uEf/uG3v+7rvu69z549+wyu+m9zzTXXPPjDP/zDv+vFXuzFXhtgtVpxzz33cNttt/FAknhuknhuknhuknggSTw3STw3STw3STw3STw/knhuknh+JPGCSOIFkcS/ZDabce2113Ly5Enu9yM/8iOf/du//dvfc999993KVVddddVVV/3roAc96EFcddVVV1111b/VNddc8+DXfu3Xfq/XeZ3Xee9rrrnmwQD7+/s88YlP5K677uKuu+7iRSGJfw9J/HtI4t9DEv9Wknigra0tHvGIR/CyL/uy3O8f/uEffvvrv/7r3+e+++67lav+x7jmmmse/Nqv/drv9U7v9E6fzTMdHh7yt3/7tzztaU/jfpJ4UUniRSGJF4Uk/iWS+JdI4l8iiRdGEi+IJAAe85jHcPr0ac6cOQPAfffdd+tv/dZvffdv//Zvf8999913K1f9j3HNNdc8+B3f8R0/63Ve53XeG2C1WnHp0iXuueceLl26hCSemyQeSBLPTRLPTRIPJInnJonnJonnJonnJonnRxLPjySeH0m8IJJ4YWazGSdOnOC6667jfvfdd9+tv/Vbv/XdP/qjP/o5XHXVVVddddW/HXrQgx7EVVddddVVV/17XXPNNQ9+sRd7sdd+sRd7sdd6ndd5nffmmfb393niE5/IE5/4RPb393lhJPHvIYl/D0n8W0ni32N7e5tHPOIRPPKRj2RrawuA++6779bf+q3f+u7f/u3f/p777rvvVq76H+uaa6558Iu92Iu91uu8zuu894u92Iu9NsDh4SH33nsvT3va07jvvvt4UUniRSGJF4Uk/iWS+JdI4oWRxL9EEs/PxsYGD37wg3nMYx7D/e67775bf+u3fuu7f/RHf/RzuOp/tGuuuebBr/3ar/1e7/RO7/TZPNNqteLee+/ltttu436SeCBJPDdJPDdJPJAknpsknpsknpsknpsknpsknh9JPD+SeEEk8YLMZjNOnDjByZMn6fue+/3DP/zDb//Wb/3W9/zWb/3Wd3PVVVddddVV/37oQQ96EFddddVVV131H+maa6558Iu92Iu99uu8zuu814u92Iu9Ns+0v7/PE5/4RO666y7uuusunpsk/j0k8e8hiX8PSfxrbG1t8chHPpKtrS0e+chHcr/77rvv1t/6rd/67h/90R/9HK76X+eaa6558Gu/9mu/1zu90zt9Ns90eHjIvffey9Oe9jTuu+8+XhhJvCgk8aKQxL9EEv8SSbwwknhhJPFAGxsbPOhBD+Kxj30s97vvvvtu/a3f+q3v/u3f/u3vue+++27lqv9Vrrnmmge/2Iu92Gu/zuu8znu92Iu92GsDrFYrLl26xKVLl7jvvvt4IEk8kCSemyQeSBLPTRLPTRLPTRLPTRLPTRLPTRLPjyReEEk8P33fc/LkSba2ttja2uJ+9913362/9Vu/9d0/+qM/+jlcddVVV1111X8s9KAHPYirrrrqqquu+s9yzTXXPPi1X/u13+vFX/zFX/vFXuzFXptn2t/f56677uKJT3wid911F/eTxL+HJP49JPFvJYl/ydbWFo985CO5/vrruf766wG47777bgX4rd/6re/+7d/+7e+57777buWq//WuueaaB7/Yi73Ya73Yi73Ya7/O67zOe/NMh4eH3Hvvvdx333087WlP47lJ4kUhiReFJP4lkviXSOKFkcQLs7m5yYMe9CAAHvvYx/JA//AP//Dbv/Vbv/Xdv/Vbv/U9XPV/wjXXXPPg137t136v13md13nva6655sEAq9WK9XrNvffeyzAMXLp0iftJ4rlJ4oEk8dwk8dwk8UCSeG6SeH4k8dwk8fxI4vmRxAP1fU/f92xtbXHy5En6vud+9913362/9Vu/9d2//du//T333XffrVx11VVXXXXVfw70oAc9iKuuuuqqq676r3DNNdc8+MVe7MVe+3Ve53Xe68Ve7MVem2fa399nf3+fu+66i7vuuou7776bfw9J/HtI4t9KEg+0tbXF9vY2119/PY985CPZ2trifvfdd9+tv/Vbv/Xd//AP//A7//AP//DbXPV/1jXXXPPgF3uxF3vtF3uxF3ut13md13lvHuDw8JB7772Xpz3tadx3331I4kUhiReFJP4lkviXSOKFkcQDbWxssLm5yZkzZzhz5gxnzpzhfvfdd9+tv/Vbv/XdAD/6oz/6OVz1f9o111zz4Nd+7dd+rxd/8Rd/7Rd7sRd7bZ5pvV5z6dIl9vb2uO+++3ggSTyQJJ6bJJ6bJB5IEs9NEs9NEs9NEs+PJJ4fSQD0fQ/AyZMn2draYmtriwe67777bv2t3/qt7/7t3/7t77nvvvtu5aqrrrrqqqv+86EHPehBXHXVVVddddV/tWuuuebBL/ZiL/ZaL/ZiL/ba11xzzYNf7MVe7LV5pv39fQDuuusu7r77bvb397nrrrt4UUni30MS/1bb29s88pGPBOD666/n+uuv54Huu+++W3/rt37ru3/7t3/7e+67775buer/nTNnzjzommuueciLvdiLvdaLv/iLv/aLvdiLvTYPcHh4yH333ce9997L4eEh9913H8+PJF4UkviXSOJfIokXZnNzkwc/+MEAnDlzhjNnzvBA9913362/9Vu/9d3/8A//8Dv/8A//8Ntc9f/SNddc8+AXe7EXe+3XeZ3Xea8Xe7EXe20eYL1ec+nSJfb29liv1+zt7XE/STyQJJ6bJB5IEs9NEs9NEs9NEs9NEs/PbDbj5MmTAGxtbbG1tcUD3Xfffbf+1m/91nefPXv21t/6rd/6Hq666qqrrrrqvx560IMexFVXXXXVVVf9d7vmmmse/GIv9mKv/WIv9mKvdc011zz4xV7sxV6bB9jf3wfgrrvu4u677wZgf3+fu+66i+dHEv8eknhhtre32dra4vrrrwfghhtu4Prrr+e53Xfffbf+1m/91nf/wz/8w+/8wz/8w29z1VXP5Zprrnnwi73Yi73Wi73Yi732Nddc8+AXe7EXe20e4PDwEID77ruPe++9F4DDw0POnj3Li0IS/xJJ/EskAbC5ucnGxgZnzpwB4JprruHMmTM8t/vuu+/W3/qt3/pugB/90R/9HK666rmcOXPmQS/+4i/+Oi/2Yi/2Wtdcc82DX+zFXuy1eYD1eg3A3t4ee3t7rNdrAPb393luknggSTw3STw3STw3STy32WwGQN/3bG1tMZvN6Puera0tntt9991362/91m99N8CP/uiPfg5XXXXVVVdd9d8PPehBD+Kqq6666qqr/qe55pprHnzmzJkHX3PNNQ9+sRd7sde65pprHvxiL/Zir83zsb+/D8Ddd9+Nbfb39zk4OABgf3+f+x0cHPAv2draAmBnZweAra0tALa3t9ne3ub666/nBbnvvvtu/Yd/+Iffvu+++279h3/4h9/+h3/4h9/hqqv+la655poHnzlz5sHXXHPNg17sxV7sta+55poHv9iLvdhr83wcHh4CcN999wFweHjI4eEhAIeHhwAcHR3xL5HExsYGAJubm2xubnK/zc1NNjc3OXPmDC/Ifffdd+s//MM//PZ999136z/8wz/8zj/8wz/8Nldd9a90zTXXPPjMmTMPuuaaax7yYi/2Yq91zTXXPPjFXuzFXpvnY71es16vWa/XSGK9XrNerwEYhgGAYRh4QSRxv9lsBsBsNqPve+63vb0NwNbWFi/Ifffdd+s//MM//PZ999136z/8wz/8zj/8wz/8NlddddVVV131Pw960IMexFVXXXXVVVf9b3DNNdc8GODFXuzFXhvwi73Yi732Nddc8+AzZ848+Jprrnkw/wXuu+++WwH+4R/+4bfvu+++W8+ePfuM++677+n/8A//8DtcddV/kmuuuebBAC/2Yi/2WoBe7MVe7LWuueaaB585c+bB11xzzYP5L3DffffdCvAP//APv33ffffdevbs2Vvvu+++Z/zDP/zDb3PVVf9Jrrnmmgfb9ou/+Iu/zou92Iu9FsA111zz4DNnzjz4mmuueTD/Ae67775br7nmmgfzAtx33323nj179tb77rvv1vvuu+/Ws2fPPuO+++679R/+4R9+m6uuuuqqq6763wE96EEP4qqrrrrqqqv+Lzhz5syDJOnMmTMPvuaaax4McObMmQddc801D+aZ7rvvvluvueaaB19zzTUP5pnuu+++W3mA++6771aAs2fP3grovvvuu/Xs2bO33nfffbdy1VX/w5w5c+ZBknTmzJkHX3PNNQ/mCp85c+bB11xzzYN5gGuuuebBPMB99913K89033333coznT179hn33XffrQBnz5699b777ruVq676H+aaa655MMCZM2cefM011zwY8JkzZx4McM011zyYB7jmmmsezAPcd999t/JM9913360809mzZ59x33333QrwD//wD7/NVVddddVVV/3fgB70oAdx1VVXXXXVVVddddVVV1111VVXXXXVVVf9n0Tlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6v4R9GlYY0BAayGAAAAAElFTkSuQmCC) diff --git a/docs/kcl/loft.md b/docs/kcl/loft.md index ca6117270..e73aa69cf 100644 --- a/docs/kcl/loft.md +++ b/docs/kcl/loft.md @@ -9,7 +9,7 @@ Create a 3D surface or solid by interpolating between two or more sketches. The sketches need to closed and on the same plane. ```js -loft(sketches: [Sketch], data?: LoftData) -> Solid +loft(sketches: [Sketch], v_degree: NonZeroU32, bez_approximate_rational: bool, base_curve_index?: integer, tolerance?: number) -> Solid ``` @@ -17,8 +17,11 @@ loft(sketches: [Sketch], data?: LoftData) -> Solid | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketches` | [`[Sketch]`](/docs/kcl/types/Sketch) | | Yes | -| `data` | [`LoftData`](/docs/kcl/types/LoftData) | Data for a loft. | No | +| `sketches` | [`[Sketch]`](/docs/kcl/types/Sketch) | Which sketches to loft. Must include at least 2 sketches. | Yes | +| `v_degree` | `NonZeroU32` | Degree of the interpolation. Must be greater than zero. For example, use 2 for quadratic, or 3 for cubic interpolation in the V direction. This defaults to 2, if not specified. | Yes | +| `bez_approximate_rational` | `bool` | Attempt to approximate rational curves (such as arcs) using a bezier. This will remove banding around interpolations between arcs and non-arcs. It may produce errors in other scenarios Over time, this field won't be necessary. | Yes | +| `base_curve_index` | `integer` | This can be set to override the automatically determined topological base curve, which is usually the first section encountered. | No | +| `tolerance` | `number` | Tolerance for the loft operation. | No | ### Returns @@ -60,10 +63,10 @@ squareSketch = startSketchOn('XY') |> close(%) circleSketch0 = startSketchOn(offsetPlane('XY', 75)) - |> circle({ center: [0, 100], radius: 50 }, %) + |> circle({ center = [0, 100], radius = 50 }, %) circleSketch1 = startSketchOn(offsetPlane('XY', 150)) - |> circle({ center: [0, 100], radius: 20 }, %) + |> circle({ center = [0, 100], radius = 20 }, %) loft([ squareSketch, @@ -85,30 +88,16 @@ squareSketch = startSketchOn('XY') |> close(%) circleSketch0 = startSketchOn(offsetPlane('XY', 75)) - |> circle({ center: [0, 100], radius: 50 }, %) + |> circle({ center = [0, 100], radius = 50 }, %) circleSketch1 = startSketchOn(offsetPlane('XY', 150)) - |> circle({ center: [0, 100], radius: 20 }, %) + |> circle({ center = [0, 100], radius = 20 }, %) loft([ squareSketch, circleSketch0, circleSketch1 -], { - // This can be set to override the automatically determined - // topological base curve, which is usually the first section encountered. - baseCurveIndex: 0, - // Attempt to approximate rational curves (such as arcs) using a bezier. - // This will remove banding around interpolations between arcs and non-arcs. - // It may produce errors in other scenarios Over time, this field won't be necessary. - bezApproximateRational: false, - // Tolerance for the loft operation. - tolerance: 0.000001, - // Degree of the interpolation. Must be greater than zero. - // For example, use 2 for quadratic, or 3 for cubic interpolation in - // the V direction. This defaults to 2, if not specified. - vDegree: 2 -}) +], baseCurveIndex = 0, bezApproximateRational = false, tolerance = 0.000001, vDegree = 2) ``` ![Rendered example of loft 2](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAISeUlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVdd9b/eNddc82Ce6cyZMw/mma655poH8yK47777buUBzp49e+t99913K1ddddVVV1111VVX/W9H5aqrrrrqqquuuuqq/7GuueaaBwO82Iu92GufOXPmQQDXXHPNg6+55poHnzlz5sHXXHPNg3ku9913363XXHPNg/kPct99990KcPbs2Vvvu+++WwH+4R/+4XcA7rvvvlv/4R/+4be56qqrrrrqqquuuup/KvSgBz2Iq6666qqrrrrqqqv+e11zzTUPPnPmzINf7MVe7LUAXvzFX/y1X+zFXuy1+RdcvHgRgIsXLwJw8eJF7nfx4kX+NU6cOMH9Tpw4AcCJEyc4ceIE/5L77rvv1rNnz95633333foP//APv3Pffffd+g//8A+/zVVXXXXVVVddddVV/93Qgx70IK666qqrrrrqqquu+q91zTXXPPi1X/u13wvgnd7pnT6b5+PixYsAPO1pT+PixYsAPP3pTwfg4sWLXLx4kf9KJ06cAOChD30oAA95yEMAOHHiBA996EN5fu67775b/+Ef/uG3/+Ef/uF37rvvvlv/4R/+4be56qqrrrrqqquuuuq/EnrQgx7EVVddddVVV1111VX/ua655poHv/Zrv/Z7XXPNNQ9+ndd5nffmuVy8eJGnP/3pXLx4kac97Wk8/elP5z+bbf4jnThxghMnTnDixAke8pCHcOLECR760IfyQPfdd9+t//AP//Db//AP//A7v/Vbv/XdXHXVVVddddVVV131nw096EEP4qqrrrrqqquuuuqq/xzv+I7v+Fkv/uIv/tov9mIv9to8wMWLF/nLv/xLnva0p/H0pz+d/6tOnDjB8ePHOXHiBC/7si/LQx/6UO5333333Xr27Nlbf+u3fut7fuu3fuu7ueqqq6666qqrrrrqPwN60IMexFVXXXXVVVddddVV/3GuueaaB7/Yi73Ya3/4h3/4d/FMFy9e5C//8i952tOextOf/nT+vzpx4gTHjx/n5V7u5XjZl31Z7nfffffd+lu/9Vvf/du//dvfc999993KVVddddVVV1111VX/UdCDHvQgrrrqqquuuuqqq67697vmmmse/GIv9mKv/eEf/uHfxTM97WlP4y//8i/5y7/8S656TidO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SEISEYEkJCEJSUhCEpKQhCQAJCEJSUgCQBKSAJCEJAAkASAJSQBIAkASL/uyL8s111zDH/3RH3HHHXcAIAkASQBIAkASAJIAkASAJAAkASAJSQBIQhKSAJCEJCQhCUlIQhKSkEREIImIQBIRgSQigoggIogIIgJJRASSiAgigoggIiilEBGUUogISimUUiilUEqhlEJEUEqhlEIphYggIogIIoKIQBKSkIQkJPH82AbANraxjW1sk5lkJplJZpKZ2MY2trFNZpKZ2MY2mYltbANgm+fHNrYBsM0D2ea5SeK5SeJ+knhuknhuknhukgCQxAOt12tmsxk33XQTOzs7PO5xj+PfShLPTRIPZJsHss1zsw2AbWxzP9u01ogIAG6//Xb+6q/+iqOjIx70oAcdf+3Xfu23ft3Xfd332djYOPYP//APv8NVV1111VVXXfX/BeX48eNcddVVV1111VX/t11zzTUPfrM3e7OP+tzP/dzffvEXf/HXXq1Wx3/913+db/iGb+CJT3witrGNbVpr1FoppVBKISKICCICSUQEkogIJCEJSUhCEpKQhCQkIQlJSEISAJKQBIAkJAEgCUkASEISAJIAkIQkAN7qrd4KgF/91V9lvV4jiftJAkASAJIAkASAJAAkIQkASQBIQhKSAJCEJCQhCQBJSEISEYEkJCGJiEASEYEkIoKIQBKSiAgigoggIogIIoKIICKICCKCUgoRQSmFUgqlFCKCiCAiiAgigoggIogISilEBJKICCQhCUlIQhLPj23uZxvb2MY2mYltbGMb29jGNraxjW1sY5vMxDa2sY1tAGxjG9vYxja2AbANgG3+NSRxP0ncTxLPTRLPTRIAknhukrjf/v4+L/3SLw3A2bNn2dvb44WRxItCEi+Ibe5nG9vczzb3sw2Abe43TRMRAcByueSJT3wif/VXf8VyuWRzc/P4a73Wa73267zO67z35ubm8bNnzz7j8PBwl6uuuuqqq6666v8yKlddddVVV1111f9Z11xzzYPf8R3f8bNe53Ve570Bzp8/zx/8wR/wcz/3c9gGwDa2sc00TdRaiQgkIQlJSEISkpCEJAAkIQlJSEISkpCEJCTx3CRxP0ncTxL3k8Rzk8T93viN3xiAxz3ucezt7fFAkgCQBIAkACQBIAkASdxPEgCSeCBJPDdJSEISknggSQBIAkAS95OE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71viI6666qqrrrrqqquuem7oQQ96EFddddVVV1111VVX/f/wKq/yKg8B+KM/+qOn8z9UmHhd5m/2KHcvsZKXj2f8mz/R8DsNtw1r8429eLsbKbfsk5f+XuNf/iXDH6VIrrrqqquuuuqqq656ftCDHvQgrrrqqquuuuqqq6666qqrrrrqqquuuuqq/5OoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4p/BFYte2aQ3ueAAAAAAElFTkSuQmCC) diff --git a/docs/kcl/map.md b/docs/kcl/map.md index 52e90cee3..4292efec0 100644 --- a/docs/kcl/map.md +++ b/docs/kcl/map.md @@ -29,9 +29,9 @@ map(array: [KclValue], map_fn: FunctionParam) -> [KclValue] ```js r = 10 // radius -fn drawCircle = (id) => { +fn drawCircle(id) { return startSketchOn("XY") - |> circle({ center: [id * 2 * r, 0], radius: r }, %) + |> circle({ center = [id * 2 * r, 0], radius = r }, %) } // Call `drawCircle`, passing in each element of the array. @@ -45,9 +45,9 @@ circles = map([1..3], drawCircle) ```js r = 10 // radius // Call `map`, using an anonymous function instead of a named one. -circles = map([1..3], (id) => { +circles = map([1..3], fn(id) { return startSketchOn("XY") - |> circle({ center: [id * 2 * r, 0], radius: r }, %) + |> circle({ center = [id * 2 * r, 0], radius = r }, %) }) ``` diff --git a/docs/kcl/max.md b/docs/kcl/max.md index a780a16fe..940d14d75 100644 --- a/docs/kcl/max.md +++ b/docs/kcl/max.md @@ -34,8 +34,8 @@ max(args: [number]) -> number exampleSketch = startSketchOn("XZ") |> startProfileAt([0, 0], %) |> angledLine({ - angle: 70, - length: max(15, 31, 4, 13, 22) + angle = 70, + length = max(15, 31, 4, 13, 22) }, %) |> line([20, 0], %) |> close(%) diff --git a/docs/kcl/min.md b/docs/kcl/min.md index 9abd7265c..51406de56 100644 --- a/docs/kcl/min.md +++ b/docs/kcl/min.md @@ -34,8 +34,8 @@ min(args: [number]) -> number exampleSketch = startSketchOn("XZ") |> startProfileAt([0, 0], %) |> angledLine({ - angle: 70, - length: min(15, 31, 4, 13, 22) + angle = 70, + length = min(15, 31, 4, 13, 22) }, %) |> line([20, 0], %) |> close(%) diff --git a/docs/kcl/mirror2d.md b/docs/kcl/mirror2d.md index aa7bcd9a8..5152b0582 100644 --- a/docs/kcl/mirror2d.md +++ b/docs/kcl/mirror2d.md @@ -41,12 +41,12 @@ sketch001 = startSketchOn('XZ') |> line([-8, -3], %) |> line([9, -1], %) |> line([-19, -0], %) - |> mirror2d({ axis: 'Y' }, %) + |> mirror2d({ axis = 'Y' }, %) example = extrude(10, sketch001) ``` -![Rendered example of mirror2d 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAADj/UlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqudwzTXXPPgd3/EdP+uaa655MFddddVVV/2v8vVf//Xvc999993KVVddddVVV111P/SgBz2Iq6666qqrrrrqihd7sRd77Q//8A//rr7vH3zrrbdy1VVXXfU/gW3+v7LNi2pra+vWRz7ykQ/+zM/8zNf5h3/4h9/mqquuuuqqq64CQA960IO46qqrrrrqqquu+KZv+qanX3PNNQ/+ru/6Lm699VbuJ4n/KyRx1VX/1Wzzf4lt/ieyzX8n2/xXs839HvKQh/B+7/d+3Hfffbd+yId8yEO46qqrrrrqqqsACK666qqrrrrqqss+/MM//LuuueaaB//1X/81z3jGM5CEJCTxP4UkJCEJSUhCEpKQhCQkIQlJSEISkpCEJK666r+DJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQk8T+FJCQhCUlIQhKSkIQkJCEJSfxXkYQkJCEJSUhCEpKQhCT+s0hCEpKQhCQkIQlJ/GeQhCQkceutt/JXf/VXXHPNNQ/+8A//8O/iqquuuuqqq64CoHLVVVddddVVV/FiL/Zir/06r/M67727u8tP//RP859JElc9mySu+o9lm/+rJPFvZZv/LpJ4Udjmv4IkXhjb/GeQxAtjm3+v3/zN3+Qh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9KAHccstt/BAFy9e5K/+6q/4zd/8TZ4f2/xbvezLvixv93Zvxz/8wz/89md+5me+DlddddVVV131n4/KVVddddVVV/0XeLEXe7HXfrEXe7HXBvirv/ornh9J/Fvt7u7yV3/1V/zVX/0Vx48f5yEPeQgPfvCDeZmXeRmOHTvGa7zGawBw6dIl/vZv/5bbb7+d2267jf9stnkgSfx3sc0DSeJ/Otu8IJK46qp/C9v8b2Wb/yls81/NNv8ex44d4yVe4iV4yZd8SY4dO8YDPf3pT+fpT386v/mbv8m/RBL3s82/xtOf/nQAXuzFXuy1X/zFX/y1//7v//63ueqqq6666qr/XFSuuuqqq6666r/A67zO67wXwF/91V+xu7vL/STxH+3SpUv89V//NX/913/Nb//2b/PgBz+YhzzkIbz0S780x44d4zVe4zUAuHTpErfddht/93d/x2233cZ/Bds8kCT+u9jmuUnifwvbvDCSuOr/J9v8X2Gb/yls89/BNv8ex44d4yVe4iV4jdd4DR5od3eXv/zLv+TixYv81V/9Ff9Wkrifbf4lFy9e5C//8i952Zd9WV77tV/7vf7+7//+t7nqqquuuuqq/1zoQQ96EFddddVVV131n+0nfuInDPAVX/EVXLp0if9okviXHD9+nOPHj/PgBz+Yl3mZl+H48ePc79KlS9x222084xnP4O///u/57yKJ/2kk8X+ZJK7638M2/1fZ5n8S2/x3sc2/1bFjxzh27Bi33HILr/Ear8ED7e7u8pd/+ZfceuutPP3pT+e52eY/gm1emBMnTvDxH//xnD179hmf+Zmf+dr33XffrVx11VVXXXXVfx70oAc9iKuuuuqqq676z/ThH/7h3/U6r/M67/1Xf/VX/NRP/RT/USTx73H8+HFe+qVfmoc85CE8+MEP5n6XLl3itttu4xnPeAZ///d/z38nSfxPJYn/jyRx1X8c2/x/Y5v/iWzz38k2/1bHjh3jJV7iJXjQgx7ELbfcwgPt7u7yl3/5l/zVX/0Vu7u7vChs8x/FNs/P+7//+/OQhzyE3/qt3/rur//6r38frrrqqquuuuo/D3rQgx7EVVddddVVV/1n+omf+AkDfOd3fie33nor/x6S+I8miePHj/PgBz+Yl37pl+bBD34wD3Tp0iX+9m//lttvv53bbruN/06S+J9MEle9cJL4v8I2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ALu7uwDceuutvCCSuJ9tntvu7i5Pf/rTechDHvLgd3zHd/ysr//6r38frrrqqquuuupFhx70oAdx1VVXXXXVVf8aP/ETP2GA7/me7+HWW2/luR0/fhyA48ePc/z4cY4dOwbA8ePHOX78OMePH+f48eP8a+zu7gJw6dIldnd3uXTpEgC7u7tcunSJS5cusbu7y38kSfxPIon/rSRx1VX/l9nmfyPb/E9hm/9utrnfsWPHkMSxY8c4fvw4AMeOHeP48eMcP34cgGPHjnH8+HFeVLu7uwDs7u6yu7sLwMWLF9nd3WV3dxeA3d1ddnd3sc0DHT9+nI/92I/lvvvuu/VDPuRDHsJVV1111VVXveioXHXVVVddddW/wuu8zuu8N8Du7i4PetCDeKmXeimOHz8OwIMf/GD+rXZ3d7l06RIAu7u77O7uAvCMZzwDSfxLjh07xrFjx/jPJImr/uNJ4qqr/jewzVX/sWzz3802/5Ld3V0Adnd3ecYznsFzO378OADHjh3j+PHjADzoQQ8C4Pjx49zv+PHjABw/fpx/ye7uLgAXL15kd3cXgN3dXa655poHv+M7vuNn/eiP/ujncNVVV1111VUvGipXXXXVVVdd9a9w5syZBwEcP36c137t1+Y/yvHjxzl+/DgAD3rQg7jqqquuuuqq/8+OHz8OwPHjx3luZ8+efQZXXXXVVVdd9aKjctVVV1111VX/Cj/6oz/6Oddcc82Dr7nmmgdz1VVXXXXVVVf9l7rvvvtu/a3f+q3v5qqrrrrqqqtedOhBD3oQV1111VVXXXXVVVddddVVV1111VVXXXXV/0lUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yr+ESz75LC0z1WPAAAAAElFTkSuQmCC) +![Rendered example of mirror2d 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAADkAUlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqudwzTXXPPgd3/EdP+uaa655MFddddVVV/2v8vVf//Xvc999993KVVddddVVV111P/SgBz2Iq6666qqrrrrqihd7sRd77Q//8A//rr7vH3zrrbdy1VVXXfU/gW3+v7LNi2pra+vWRz7ykQ/+zM/8zNf5h3/4h9/mqquuuuqqq64CQA960IO46qqrrrrqqquu+KZv+qanX3PNNQ/+ru/6Lm699VbuJ4n/KyRx1VX/1Wzzf4lt/ieyzX8n2/xXs839HvKQh/B+7/d+3Hfffbd+yId8yEO46qqrrrrqqqsACK666qqrrrrqqss+/MM//LuuueaaB//1X/81z3jGM5CEJCTxP4UkJCEJSUhCEpKQhCQkIQlJSEISkpCEJK666r+DJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQk8T+FJCQhCUlIQhKSkIQkJCEJSfxXkYQkJCEJSUhCEpKQhCT+s0hCEpKQhCQkIQlJ/GeQhCQkceutt/JXf/VXXHPNNQ/+8A//8O/iqquuuuqqq64CoHLVVVddddVVV/FiL/Zir/06r/M67727u8tP//RP859JElc9mySu+o9lm/+rJPFvZZv/LpJ4Udjmv4IkXhjb/GeQxAtjm3+v3/zN3+Qh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9KAHccstt/BAFy9e5K/+6q/4zd/8TZ4f2/xbvezLvixv93Zvxz/8wz/89md+5me+DlddddVVV131n4/KVVddddVVV/0XeLEXe7HXfrEXe7HXBvirv/ornh9J/Fvt7u7yV3/1V/zVX/0Vx48f5yEPeQgPfvCDeZmXeRmOHTvGa7zGawBw6dIl/vZv/5bbb7+d2267jf9stnkgSfx3sc0DSeJ/Otu8IJK46qp/C9v8b2Wb/yls81/NNv8ex44d4yVe4iV4yZd8SY4dO8YDPf3pT+fpT386v/mbv8m/RBL3s82/xtOf/nQAXuzFXuy1X/zFX/y1//7v//63ueqqq6666qr/XFSuuuqqq6666r/A67zO67wXwF/91V+xu7vL/STxH+3SpUv89V//NX/913/Nb//2b/PgBz+YhzzkIbz0S780x44d4zVe4zUAuHTpErfddht/93d/x2233cZ/Bds8kCT+u9jmuUnifwvbvDCSuOr/J9v8X2Gb/yls89/BNv8ex44d4yVe4iV4jdd4DR5od3eXv/zLv+TixYv81V/9Ff9Wkrifbf4lFy9e5C//8i952Zd9WV77tV/7vf7+7//+t7nqqquuuuqq/1zoQQ96EFddddVVV131n+0nfuInDPAVX/EVXLp0if9okviXHD9+nOPHj/PgBz+Yl3mZl+H48ePc79KlS9x222084xnP4O///u/57yKJ/2kk8X+ZJK7638M2/1fZ5n8S2/x3sc2/1bFjxzh27Bi33HILr/Ear8ED7e7u8pd/+ZfceuutPP3pT+e52eY/gm1emBMnTvDxH//xnD179hmf+Zmf+dr33XffrVx11VVXXXXVfx70oAc9iKuuuuqqq676z/ThH/7h3/U6r/M67/1Xf/VX/NRP/RT/USTx73H8+HFe+qVfmoc85CE8+MEP5n6XLl3itttu4xnPeAZ///d/z38nSfxPJYn/jyRx1X8c2/x/Y5v/iWzz38k2/1bHjh3jJV7iJXjQgx7ELbfcwgPt7u7yl3/5l/zVX/0Vu7u7vChs8x/FNs/P+7//+/OQhzyE3/qt3/rur//6r38frrrqqquuuuo/D3rQgx7EVVddddVVV/1n+omf+AkDfOd3fie33nor/x6S+I8miePHj/PgBz+Yl37pl+bBD34wD3Tp0iX+9m//lttvv53bbruN/06S+J9MEle9cJL4v8I2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/elPB2B3dxeAW2+9lRdEEvezzXPb3d3l6U9/Og95yEMe/I7v+I6f9fVf//Xvw1VXXXXVVVe96NCDHvQgrrrqqquuuupf4yd+4icM8D3f8z3ceuutPLfjx48DcPz4cY4fP86xY8cAOH78OMePH+f48eMcP36cf43d3V0ALl26xO7uLpcuXQJgd3eXS5cucenSJXZ3d/mPJIn/SSTxv5Ukrrrq/zLb/G9km/8pbPPfzTb3O3bsGJI4duwYx48fB+DYsWMcP36c48ePA3Ds2DGOHz/Oi2p3dxeA3d1ddnd3Abh48SK7u7vs7u4CsLu7y+7uLrZ5oOPHj/OxH/ux3Hfffbd+yId8yEO46qqrrrrqqhcdlauuuuqqq676V3id13md9wbY3d3lQQ96EC/1Ui/F8ePHAXjwgx/Mv9Xu7i6XLl0CYHd3l93dXQCe8YxnIIl/ybFjxzh27Bj/mSRx1X88SVx11f8GtrnqP5Zt/rvZ5l+yu7sLwO7uLs94xjN4bsePHwfg2LFjHD9+HIAHPehBABw/fpz7HT9+HIDjx4/zL9nd3QXg4sWL7O7uArC7u8s111zz4Hd8x3f8rB/90R/9HK666qqrrrrqRUPlqquuuuqqq/4Vzpw58yCA48eP89qv/dr8Rzl+/DjHjx8H4EEPehBXXXXVVVdd9f/Z8ePHATh+/DjP7ezZs8/gqquuuuqqq150VK666qqrrrrqX+FHf/RHP+eaa6558DXXXPNgrrrqqquuuuqq/1L33Xffrb/1W7/13Vx11VVXXXXViw496EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V/FPwKzXOeDGHRRWQAAAABJRU5ErkJggg==) ```js // Mirror a un-closed sketch across the Y axis. @@ -54,7 +54,7 @@ sketch001 = startSketchOn('XZ') |> startProfileAt([0, 8.5], %) |> line([20, -8.5], %) |> line([-20, -8.5], %) - |> mirror2d({ axis: 'Y' }, %) + |> mirror2d({ axis = 'Y' }, %) example = extrude(10, sketch001) ``` @@ -71,7 +71,7 @@ sketch001 = startSketchOn('XZ') |> startProfileAt([0, 8.5], %) |> line([20, -8.5], %) |> line([-20, -8.5], %) - |> mirror2d({ axis: edge001 }, %) + |> mirror2d({ axis = edge001 }, %) example = extrude(10, sketch001) ``` @@ -85,8 +85,11 @@ sketch001 = startSketchOn('XZ') |> line([20, -8.5], %) |> line([-20, -8.5], %) |> mirror2d({ - axis: { - custom: { axis: [0.0, 1.0], origin: [0.0, 0.0] } + axis = { + custom = { + axis = [0.0, 1.0], + origin = [0.0, 0.0] + } } }, %) diff --git a/docs/kcl/modules.md b/docs/kcl/modules.md new file mode 100644 index 000000000..5cc34b605 --- /dev/null +++ b/docs/kcl/modules.md @@ -0,0 +1,59 @@ +--- +title: "KCL Modules" +excerpt: "Documentation of modules for the KCL language for the Zoo Modeling App." +layout: manual +--- + +`KCL` allows splitting code up into multiple files. Each file is somewhat +isolated from other files as a separate module. + +When you define a function, you can use `export` before it to make it available +to other modules. + +``` +// util.kcl +export fn increment(x) { + return x + 1 +} +``` + +Other files in the project can now import functions that have been exported. +This makes them available to use in another file. + +``` +// main.kcl +import increment from "util.kcl" + +answer = increment(41) +``` + +Imported files _must_ be in the same project so that units are uniform across +modules. This means that it must be in the same directory. + +Import statements must be at the top-level of a file. It is not allowed to have +an `import` statement inside a function or in the body of an if-else. + +Multiple functions can be exported in a file. + +``` +// util.kcl +export fn increment(x) { + return x + 1 +} + +export fn decrement(x) { + return x - 1 +} +``` + +When importing, you can import multiple functions at once. + +``` +import increment, decrement from "util.kcl" +``` + +Imported symbols can be renamed for convenience or to avoid name collisions. + +``` +import increment as inc, decrement as dec from "util.kcl" +``` diff --git a/docs/kcl/offsetPlane.md b/docs/kcl/offsetPlane.md index 4e45792b7..07b71c15c 100644 --- a/docs/kcl/offsetPlane.md +++ b/docs/kcl/offsetPlane.md @@ -9,7 +9,7 @@ Offset a plane by a distance along its normal. For example, if you offset the 'XZ' plane by 10, the new plane will be parallel to the 'XZ' plane and 10 units away from it. ```js -offsetPlane(std_plane: StandardPlane, offset: number) -> PlaneData +offsetPlane(std_plane: StandardPlane, offset: number) -> Plane ``` @@ -22,7 +22,7 @@ offsetPlane(std_plane: StandardPlane, offset: number) -> PlaneData ### Returns -[`PlaneData`](/docs/kcl/types/PlaneData) - Data for a plane. +[`Plane`](/docs/kcl/types/Plane) - A plane. ### Examples @@ -38,7 +38,7 @@ squareSketch = startSketchOn('XY') |> close(%) circleSketch = startSketchOn(offsetPlane('XY', 150)) - |> circle({ center: [0, 100], radius: 50 }, %) + |> circle({ center = [0, 100], radius = 50 }, %) loft([squareSketch, circleSketch]) ``` @@ -56,7 +56,7 @@ squareSketch = startSketchOn('XZ') |> close(%) circleSketch = startSketchOn(offsetPlane('XZ', 150)) - |> circle({ center: [0, 100], radius: 50 }, %) + |> circle({ center = [0, 100], radius = 50 }, %) loft([squareSketch, circleSketch]) ``` @@ -74,7 +74,7 @@ squareSketch = startSketchOn('YZ') |> close(%) circleSketch = startSketchOn(offsetPlane('YZ', 150)) - |> circle({ center: [0, 100], radius: 50 }, %) + |> circle({ center = [0, 100], radius = 50 }, %) loft([squareSketch, circleSketch]) ``` @@ -92,11 +92,27 @@ squareSketch = startSketchOn('-XZ') |> close(%) circleSketch = startSketchOn(offsetPlane('-XZ', -150)) - |> circle({ center: [0, 100], radius: 50 }, %) + |> circle({ center = [0, 100], radius = 50 }, %) loft([squareSketch, circleSketch]) ``` ![Rendered example of offsetPlane 3](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAECy0lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV131/8zrvM7rvPeLvdiLvRZXXXXVVVf9v/MP//APv/Nbv/Vb381VV1111VVX/f9B5aqrrrrqqqv+H3md13md9/7wD//w7+Kqq6666qr/l17sxV7stQF+67d+67u56qqrrrrqqv8fqFx11VVXXXXV/yMv9mIv9lo80w/90A/xH0US/50k8e8hif8JJPHvJYn/iSTxv4Ek/jNJ4v8DSfxv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Z8+evfW3fuu3vufMmTMP+od/+IffOXv27K333XffrVx11VVXXXXVVVdd9T8NetCDHsRVV1111VVXXXXVVf+7XHPNNQ8GOHPmzIOuueaahwCcOXPmQddcc82DeaZrrrnmwfwr3HfffbcC3HfffbfyTGfPnn3Gfffd9/SzZ88+47777ruVq6666qqrrrrqqqv+t0EPetCDuOqqq6666qqrrrrqqquuuuqqq6666qqr/k+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/Vfwj2y9Vb9P7xIsAAAAASUVORK5CYII=) +```js +// A circle on the XY plane +startSketchOn("XY") + |> startProfileAt([0, 0], %) + |> circle({ radius = 10, center = [0, 0] }, %) + +// Triangle on the plane 4 units above +startSketchOn(offsetPlane("XY", 4)) + |> startProfileAt([0, 0], %) + |> line([10, 0], %) + |> line([0, 10], %) + |> close(%) +``` + +![Rendered example of offsetPlane 4](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAACDrUlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rCK666qqrrrrqqquuuuqqq/4Puuaaax7MVVddddVVV11F5aqrrrrqqquuuuqqq6666v+Ia6655sGv/dqv/V6v8zqv897XXHPNg3/rt37ru++7775bf/RHf/RzuOqqq6666qr/n9CDHvQgrrrqqquuuuqqq6666qqr/je75pprHvyO7/iOn/U6r/M67w3wu7/7u98FMJ/Ptx784Ae/wmd91me9zn333XcrV1111VVXXfX/D3rQgx7EVVddddVVV1111VVXXXXV/zbXXHPNg1/7tV/7vd7pnd7pswF+93d/97t4Pq699tqHT9PUPvMzP/N1uOqqq6666qr/f6hcddVVV1111VVXXXXVVVf9L3HNNdc8+LVf+7Xf63Ve53Xe+5prrnkwwO/+7u9+Fy/EpUuX7nnFV3zFd3id13md9/6t3/qt7+aqq6666qqr/n9BD3rQg7jqqquuuuqqq6666qqrrvqf7JprrnnwO77jO37W67zO67w3wO/+7u9+F/8K8/l868EPfvArfNZnfdbr3Hfffbdy1VVXXXXVVf9/oAc96EFcddVVV1111VVXXXXVVVf9T3PNNdc8+LVf+7Xf653e6Z0+G+B3f/d3v4t/h9d8zdd8n9/6rd/67q//+q9/H6666qqrrrrq/w8qV1111VVXXXXVVVddddVV/0Ncc801D37t137t93qd13md977mmmseDPC7v/u738V/gD/90z/9sdd5ndd573/4h3/4nd/6rd/6bq666qqrrrrq/wf0oAc9iKuuuuqqq6666qqrrrrqqv9O11xzzYNf+7Vf+73e6Z3e6bMBfvd3f/e7+E8wn8+3HvzgB7/Ch3zIhzyEq6666qqrrvr/AT3oQQ/iqquuuuqqq6666qqrrrrqv9o111zz4Nd+7dd+r3d6p3f6bIDf/d3f/S7+C7zma77m+/zWb/3Wd3/913/9+3DVVVddddVV//ehBz3oQVx11VVXXXXVVVddddVVV/1XuOaaax782q/92u/14i/+4q/9Yi/2Yq8N8Lu/+7vfxX+h+Xy+9Yqv+Irv8Jmf+Zmv8w//8A+/zVVXXXXVVVf934Ye9KAHcdVVV1111VVXXXXVVVdd9Z/pmmuuefBrv/Zrv9c7vdM7fTbA7/7u734X/42OHTt23fXXX/+YD/mQD3kIV1111VVXXfV/G3rQgx7EVVddddVVV1111VVXXXXVf7Rrrrnmwa/92q/9Xu/0Tu/02QC/+7u/+138D/Kar/ma7/Nbv/Vb3/31X//178NVV1111VVX/d9F5aqrrrrqqquuuuqqq6666j/INddc8+DXfu3Xfq8Xf/EXf+0Xe7EXe22A3/3d3/0u/gf60z/90x97sRd7sdd+8Rd/8df++7//+9/mqquuuuqqq/5vQg960IO46qqrrrrqqquuuuqqq67697jmmmse/Nqv/drv9U7v9E6fDfC7v/u738X/Atdee+3DT548ecsHf/AHP5irrrrqqquu+r+Jcvz4ca666qqrrrrqqquuuuqqq/61rrnmmge/2Zu92Ud9+Id/+He/0zu902dfuHDh6c94xjP++hnPeMZf87/E4eHhhcc+9rGvDfAP//APv8NVV1111VVX/d+DHvSgB3HVVVddddVVV1111VVXXfWiuOaaax782q/92u/14i/+4q/9Yi/2Yq8N8Lu/+7vfxf9i8/l868EPfvArfP3Xf/37/MM//MNvc9VVV1111VX/t6AHPehBXHXVVVddddVVV1111VVXvTDXXHPNg1/7tV/7vd7pnd7pswF+93d/97v4P+Taa699+IkTJ27+kA/5kIdw1VVXXXXVVf+3UI4fP85VV1111VVXXXXVVVddddVzu+aaax78Zm/2Zh/14R/+4d/9Tu/0Tp994cKFpz/jGc/462c84xl/zf8xh4eHFx772Me+DsA//MM//A5XXXXVVVdd9X8HetCDHsRVV1111VVXXXXVVVddddX93vEd3/GzXvzFX/y1X+zFXuy1AX73d3/3u/h/YD6fbz34wQ9+ha//+q9/n3/4h3/4ba666qqrrrrq/wb0oAc9iKuuuuqqq6666qqrrrrq/7drrrnmwa/92q/9Xu/0Tu/02QC/+7u/+138P3Tttdc+fJqm9pmf+Zmvw1VXXXXVVVf930A5fvw4V1111VVXXXXVVVddddX/P9dcc82D3+zN3uyjPvzDP/y73+md3umzL1y48PRnPOMZf/2MZzzjr/l/qrU2vMzLvMybSdI//MM//DZXXXXVVVdd9b8fetCDHsRVV1111VVXXXXVVVdd9f/HO77jO37WNddc8+DXeZ3XeW+A3/3d3/0urnqW+Xy+9ZCHPOQVP/MzP/O177vvvlu56qqrrrrqqv/d0IMe9CCuuuqqq6666qqrrrrqqv/brrnmmge/9mu/9nu90zu902cD/O7v/u53cdULdO211z58mqb2mZ/5ma/DVVddddVVV/3vRjl+/DhXXXXVVVddddVVV1111f8911xzzYPf7M3e7KM+/MM//Lvf6Z3e6bMvXLjw9Gc84xl//YxnPOOvueqFaq0NL/MyL/NmZ8+efcatt97611x11VVXXXXV/17oQQ96EFddddVVV1111VVXXXXV/x2v8zqv894v9mIv9lqv8zqv894Av/u7v/tdXPWvNp/Ptx784Ae/wmd91me9zn333XcrV1111VVXXfW/E+X48eNcddVVV1111VVXXXXVVf+7XXPNNQ9+szd7s4/63M/93N9+xVd8xbe+/fbb/+oZz3jGXz/jGc/4a676N5mmaXjsYx/7Opubm8f/9E//9Ge46qqrrrrqqv+d0IMe9CCuuuqqq6666qqrrrrqqv99rrnmmge/9mu/9nu9zuu8zntfc801D/7d3/3d7+Kq/1Dz+XzrFV/xFd/hMz/zM1/nH/7hH36bq6666qqrrvrfBz3oQQ/iqquuuuqqq6666qqrrvrf43Ve53Xe+8Ve7MVe63Ve53XeG+B3f/d3v4ur/tMcO3bsuuuvv/4xH/IhH/IQrrrqqquuuup/H/SgBz2Iq6666qqrrrrqqquuuup/tmuuuebBr/3ar/1e7/RO7/TZAL/7u7/7XVz1X+Y1X/M13+e3fuu3vvvrv/7r34errrrqqquu+t8FPehBD+Kqq6666qqrrrrqqquu+p/nmmuuefBrv/Zrv9frvM7rvPc111zzYIDf/d3f/S6u+i83n8+3XvEVX/EdPvMzP/N1/uEf/uG3ueqqq6666qr/PdCDHvQgrrrqqquuuuqqq6666qr/OV7sxV7stV/ndV7nvV7ndV7nvQF+93d/97u46r/dsWPHrrv++usf8yEf8iEP4aqrrrrqqqv+90APetCDuOqqq6666qqrrrrqqqv+e11zzTUPfu3Xfu33eqd3eqfPBvjd3/3d7+Kq/3Fe8zVf831+67d+67u//uu//n246qqrrrrqqv8dqFx11VVXXXXVVVddddVV/y2uueaaB7/2a7/2e73O67zOe19zzTUPBvjd3/3d7+Kq/7H+9E//9Mde7MVe7LVf7MVe7LX/4R/+4be56qqrrrrqqv/50IMe9CCuuuqqq6666qqrrrrqqv8611xzzYPf8R3f8bNe53Ve570Bfvd3f/e7uOp/jWuvvfbhJ06cuPlDPuRDHsJVV1111VVX/c9HOX78OFddddVVV1111VVXXXXVf65rrrnmwW/2Zm/2UZ/7uZ/722/+5m/+0bfffvtfPeMZz/jrZzzjGX/NVf+rHB4eXnjsYx/7OgD/8A//8DtcddVVV1111f9s6EEPehBXXXXVVVddddVVV1111X+8a6655sGv/dqv/V6v8zqv897XXHPNgwF+93d/97u46n+9+Xy+9eAHP/gVvuEbvuF9/v7v//63ueqqq6666qr/udCDHvQgrrrqqquuuuqqq6666qr/ONdcc82DX/u1X/u93umd3umzAX73d3/3u7jq/5xrr7324SdPnrzlgz/4gx/MVVddddVVV/3PRTl+/DhXXXXVVVddddVVV1111b/PNddc8+A3e7M3+6jP/dzP/e03f/M3/+gLFy48/RnPeMZfP+MZz/hrrvo/6fDw8MJjH/vY1wb4h3/4h9/hqquuuuqqq/5nQg960IO46qqrrrrqqquuuuqqq/71rrnmmge/9mu/9nu9zuu8zntfc801Dwb43d/93e/iqv835vP51oMf/OBX+KzP+qzXue++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fcatt97611x11VVXXXXVfx70oAc9iKuuuuqqq6666qqrrvr3uuaaax782q/92u/1Oq/zOu99zTXXPBjgd3/3d7+Lq6666vmaz+dbD37wg1/hsz7rs17nvvvuu5Wrrrrqqquu+s+BHvSgB3HVVVddddVVV1111VX/Vtdcc82D3/Ed3/GzXud1Xue9AX73d3/3u7jqqqteJA960INe+uDg4NJnfuZnvg5XXXXVVVdd9Z8DPehBD+Kqq6666qqrrrrqqqv+Na655poHv/Zrv/Z7vdM7vdNnA/zu7/7ud3HVVVf9q83n861XfMVXfIev//qvf5/f+q3f+m6uuuqqq6666j8eetCDHsRVV1111VVXXXXVVVf9S6655poHv/Zrv/Z7vc7rvM57X3PNNQ8G+N3f/d3v4qqrrvp3mc/nWw9+8INf4bM+67Ne57777ruVq6666qqrrvqPReWqq6666qqrrrrqqqteiGuuuebB7/iO7/hZr/M6r/PeAL/7u7/7XU94whO46qqr/mOsVquDa6655sHv+I7v+Flf//Vf/z5cddVVV1111X8s9KAHPYirrrrqqquuuuqqq656oGuuuebBr/3ar/1e7/RO7/TZAL/7u7/7XVx11VX/aebz+dYrvuIrvsNnfdZnvc7f//3f/zZXXXXVVVdd9R8HPehBD+Kqq6666qqrrrrqqquuueaaB7/2a7/2e73O67zOe19zzTUPBvjd3/3d7+Kqq676L3Hs2LHrbrjhhsd+8Ad/8IO56qqrrrrqqv846EEPehBXXXXVVVddddVVV/3/dc011zz4tV/7td/rnd7pnT4b4Hd/93e/i6uuuuq/xWu+5mu+z2/91m9999d//de/D1ddddVVV131HwM96EEP4qqrrrrqqquuuuqq/5muueaaB/MAZ86ceTAPcM011zyY5+PMmTMP4kXwTu/0Tp8N8Lu/+7vfxVVXXfXfbj6fb73iK77iO3zmZ37m6/zDP/zDb3PVVVddddVV/37oQQ96EFddddVVV1111VVX/ee45pprHgxw5syZB19zzTUPBjhz5syDAK655poHA1xzzTUP5pnOnDnzYIBrrrnmwfwX+N3f/d3v4qqrrvof5dixY9ddf/31j/mQD/mQh3DVVVddddVV/37oQQ96EFddddVVV1111VVXveiuueaaB585c+bB11xzzYPPnDnzIIBrrrnmwddcc82DAc6cOfPga6655sG8EL/7u7/7Xfw3mM/nW6/4iq/4Dlx11VX/o/3Wb/3Wd3/913/9+3DVVVddddVV/37oQQ96EFddddVVV1111VVXXXHNNdc8+MyZMw++5pprHnzmzJkHAbz4i7/4awO82Iu92GvzfPzu7/7ud/G/yIMe9KCX5n+RBz3oQS/DC3Dffffdes011zwY4L777rv17Nmzt95333233nfffbdy1VX/i/3DP/zD7/zDP/zDb3PVVVddddVV/37oQQ96EFddddVVV1111VX/X1xzzTUPPnPmzIOvueaaB585c+ZB11xzzYOvueaaB7/Yi73Ya/N8/O7v/u53cdX/eK/5mq/5PjyX++6779azZ8/eet99990K8A//8A+/c99999169uzZW++7775bueqqq6666qqrrvr/AT3oQQ/iqquuuuqqq6666v+Sa6655sEAL/ZiL/baZ86cedCLv/iLvzbAi73Yi702D/C7v/u738VV/2+85mu+5vvwTPfdd9+tAP/wD//w2wD/8A//8Dv33Xffrf/wD//w21x11VVXXXXVVVf934Ie9KAHcdVVV1111VVXXfW/0TXXXPPgM2fOPPjFXuzFXgvgxV/8xV/7xV7sxV6bB/jd3/3d7+Kqq/4Fr/mar/k+PNPZs2efcd999z39vvvuu/Uf/uEffue+++679ezZs7fed999t3LVVVddddVVV131vw960IMexFVXXXXVVVddddX/ZNdcc82DAV77tV/7vQBe/MVf/LVf7MVe7LV5gN/93d/9Lq666j/Ya77ma74Pz3Tffffdevbs2Vvvu+++W//hH/7hd+67775b/+Ef/uG3ueqqq6666qqrrvqfDT3oQQ/iqquuuuqqq6666n+Ka6655sFnzpx58Iu92Iu91jXXXPPg13md13lvHuB3f/d3v4urrvpv9pqv+ZrvwzPdd999t/7DP/zDb9933323/sM//MPv/MM//MNvc9VVV1111VVXXfU/B3rQgx7EVVddddVVV1111X+Ha6655sFnzpx58Iu92Iu91ou/+Iu/9ou92Iu9Ng/wu7/7u9/FVVf9L/Gar/ma78Mz3Xfffbf+wz/8w2/fd999t/7DP/zD7/zDP/zDb3PVVVddddVVV1313wM96EEP4qqrrrrqqquuuuq/wjXXXPPg137t134vgNd5ndd572uuuebBPNPv/u7vfhdXXfV/zGu+5mu+D89033333foP//APv/0P//APv3Pffffd+g//8A+/zVVXXXXVVVddddV/PvSgBz2Iq6666qqrrrrqqv9o11xzzYPPnDnz4Bd7sRd7rRd/8Rd/7Rd7sRd7bZ7pd3/3d7+Lq676f+o1X/M13wfgvvvuu/Xs2bO33nfffbf+1m/91vf8wz/8w29z1VVXXXXVVVdd9R8PPehBD+Kqq6666qqrrrrq3+uaa6558Iu92Iu99pkzZx704i/+4q/9Yi/2Yq/NM/3u7/7ud3HVVVe9QK/5mq/5PgD33Xffrf/wD//w2//wD//wO7/1W7/13Vx11VVXXXXVVVf9+6EHPehBXHXVVVddddVVV/1rXXPNNQ9+sRd7sdc+c+bMg17ndV7nva+55poHA/zu7/7ud3HVVVf9u7zma77m+wCcPXv2GX//93//W//wD//wO7/1W7/13Vx11VVXXXXVVVf966EHPehBXHXVVVddddVVV/1LrrnmmgefOXPmwS/2Yi/2Wi/+4i/+2i/2Yi/22gC/+7u/+11cddVV/6le8zVf830A7rvvvlv/4R/+4Xd+67d+67v/4R/+4be56qqrrrrqqquu+pehBz3oQVx11VVXXXXVVVc9P9dcc82DX/u1X/u9XvzFX/y1X+zFXuy1AX73d3/3u7jqqqv+W73ma77m+9x33323nj179ta///u//+1/+Id/+J1/+Id/+G2uuuqqq6666qqrnhd60IMexFVXXXXVVVdddRXANddc8+AzZ848+MVe7MVe653e6Z0+m2f63d/93e/iqquu+h/pNV/zNd8H4L777rv1H/7hH377H/7hH37nt37rt76bq6666qqrrrrqqivQgx70IK666qqrrrrqqv+/rrnmmge/9mu/9nu9+Iu/+Gu/2Iu92GsD/O7v/u53cdVVV/2v9Jqv+Zrvc99999169uzZZ/zWb/3Wd9933323/sM//MNvc9VVV1111VVX/X+FHvSgB3HVVVddddVVV/3/cs011zz4tV/7td/rdV7ndd77mmuueTDA7/7u734XV1111f8pr/mar/k+APfdd9+tv/Vbv/Xd//AP//A7//AP//DbXHXVVVddddVV/5+gBz3oQVx11VVXXXXVVf/3XXPNNQ9+7dd+7fd6p3d6p8/mmX73d3/3u7jqqqv+X3jN13zN9wG47777bv2Hf/iH3/6t3/qt7/mHf/iH3+aqq6666qqrrvq/Dj3oQQ/iqquuuuqqq676v+maa6558Gu/9mu/1zu90zt9NsDv/u7vfhdXXXXVVcBrvuZrvs9999136z/8wz/8zm/91m999z/8wz/8NlddddVVV1111f9F6EEPehBXXXXVVVddddX/Hddcc82DX/u1X/u93umd3umzAX73d3/3u7jqqquueiFe8zVf833uu+++W//hH/7ht3/rt37re/7hH/7ht7nqqquuuuqqq/6vQA960IO46qqrrrrqqqv+d7vmmmse/Nqv/drv9Tqv8zrvfc011zwY4Hd/93e/i6uuuuqqf6XXfM3XfJ+zZ88+4zd/8ze/6x/+4R9+5x/+4R9+m6uuuuqqq6666n8z9KAHPYirrrrqqquuuup/n2uuuebBr/3ar/1er/M6r/Pe11xzzYMBfvd3f/e7uOqqq676D/Car/ma7wNw33333fpbv/Vb3/2jP/qjn8NVV1111VVXXfW/EXrQgx7EVVddddVVV131v8c111zz4Hd8x3f8rNd5ndd5b4Df/d3f/S6uuuqqq/4TveZrvub7nD179hl///d//1v/8A//8Du/9Vu/9d1cddVVV1111VX/W6AHPehBXHXVVVddddVV/7Ndc801D37t137t93qnd3qnzwb43d/93e/iqquuuuq/wWu+5mu+z3333Xfrb/3Wb333b//2b3/PfffddytXXXXVVVddddX/ZOhBD3oQV1111VVXXXXV/0yv8zqv894v9mIv9lqv8zqv894Av/u7v/tdXHXVVVf9D/Car/ma7wPwD//wD7/9W7/1W9/zW7/1W9/NVVddddVVV131PxF60IMexFVXXXXVVVdd9T/HNddc8+DXfu3Xfq93eqd3+myA3/3d3/0urrrqqqv+B3vN13zN97nvvvtu/a3f+q3v/u3f/u3vue+++27lqquuuuqqq676nwI96EEP4qqrrrrqqquu+u93zTXXPPgd3/EdP+t1Xud13hvgd3/3d7+Lq6666qr/RV7zNV/zfc6ePfuMv//7v/+t3/qt3/qef/iHf/htrrrqqquuuuqq/27oQQ96EFddddVVV1111X+fd3zHd/ys13md13nva6655sG/+7u/+11cddVVV/0f8Jqv+Zrvc9999936W7/1W9/9oz/6o5/DVVddddVVV1313wU96EEP4qqrrrrqqquu+q91zTXXPPi1X/u13+ud3umdPhvgd3/3d7+Lq6666qr/g17zNV/zfc6ePfuM3/zN3/yuH/3RH/0crrrqqquuuuqq/2roQQ96EFddddVVV1111X+Na6655sGv/dqv/V7v9E7v9NkAv/u7v/tdXHXVVVf9P/Car/ma73Pffffd+lu/9Vvf/du//dvfc999993KVVddddVVV131XwE96EEP4qqrrrrqqquu+s91zTXXPPgd3/EdP+t1Xud13hvgd3/3d7+Lq6666qr/h17zNV/zfe67775b/+Ef/uF3fuu3fuu7/+Ef/uG3ueqqq6666qqr/jOhBz3oQVx11VVXXXXVVf85rrnmmge/4zu+42e9zuu8znv/7u/+7ndx1VVXXXXVs7zma77m+/zDP/zDb//Ij/zI5/zDP/zDb3PVVVddddVVV/1nQA960IO46qqrrrrqqqv+Y11zzTUPfsd3fMfPep3XeZ33/t3f/d3v4qqrrrrqqhfoNV/zNd/nvvvuu/Xrv/7r3+cf/uEffpurrrrqqquuuuo/EuX48eNcddVVV1111VX/Ma655poHf9InfdJPvc/7vM9X33777X/1jGc846+56qqrrrrqhXrGM57x1+fOnbv1vd/7vb/6mmuuefDh4eGls2fP3spVV1111VVXXfUfgXL8+HGuuuqqq6666qp/n2uuuebB7/M+7/NVH/7hH/7dT3jCE37rGc94xl9z1VVXXXXVv8oznvGMv44I3vu93/urr7nmmgcfHh5eOnv27K1cddVVV1111VX/HpTjx49z1VVXXXXVVVf921xzzTUPfrM3e7OP+qRP+qSfvv322//qGc94xl9z1VVXXXXVv8sznvGMv44I3vu93/urr7nmmofceuutf314eLjLVVddddVVV131b4Ee9KAHcdVVV1111VVX/etcc801D37t137t93qnd3qnzwb43d/93e/iqquuuuqq/xSPfvSjX+e3fuu3vvtHf/RHP4errrrqqquuuupfCz3oQQ/iqquuuuqqq6560b3jO77jZ73TO73TZwP87u/+7ndx1VVXXXXVf7rXfM3XfJ/77rvv1t/6rd/67h/90R/9HK666qqrrrrqqhcVetCDHsRVV1111VVXXfUve7EXe7HX/vAP//Dvuuaaax78u7/7u9/FVVddddVV/+Ve8zVf833Onj37jB/5kR/57N/6rd/6bq666qqrrrrqqn8JetCDHsRVV1111VVXXfWCXXPNNQ/+8A//8O96sRd7sdf+3d/93e/iqquuuuqq/3av+Zqv+T7/8A//8Ntf//Vf/z733XffrVx11VVXXXXVVS8I5fjx41x11VVXXXXVVc/fO77jO37WJ33SJ/30E57whN96xjOe8ddcddVVV131P8IznvGMv14ul7vv8A7v8Nmbm5vH/+Ef/uF3uOqqq6666qqrnh/0oAc9iKuuuuqqq6666jm92Iu92Gt/+Id/+Hddc801D/7d3/3d7+Kqq6666qr/sV7zNV/zfc6ePfuM3/zN3/yuH/3RH/0crrrqqquuuuqqB6IcP36cq6666qqrrrrqimuuuebB7/M+7/NV7/u+7/vVf/EXf/FTz3jGM/6aq6666qqr/kd7xjOe8dfnzp17+pu92Zt9zDXXXPPgW2+99W8ODw93ueqqq6666qqrANCDHvQgrrrqqquuuuoqeMd3fMfPeqd3eqfPBvjd3/3d7+Kqq6666qr/dV7zNV/zfe67775bf+u3fuu7f/RHf/RzuOqqq6666qqr0IMe9CCuuuqqq6666v+za6655sEf/uEf/l0v9mIv9tq/+7u/+11cddVVV131v95rvuZrvs8//MM//PbXf/3Xv8999913K1ddddVVV131/xfl+PHjXHXVVVddddX/V6/zOq/z3p/7uZ/7W094whN+6xnPeMZfc9VVV1111f8Jz3jGM/56uVzuvsM7vMNnb25uHv+Hf/iH3+Gqq6666qqr/n+iHD9+nKuuuuqqq676/+aaa6558Cd90if91Ju/+Zt/9O/+7u9+F1ddddVVV/2fdO7cuVvf7M3e7GOuueaaB996661/c3h4uMtVV1111VVX/f9COX78OFddddVVV131/8mLvdiLvfZXfMVX/NU111zz4N/93d/9Lq666qqrrvo/7RnPeMZfv/Zrv/b7vOIrvuJbb21tnfiHf/iH3+aqq6666qqr/v+gHD9+nKuuuuqqq676/+Id3/EdP+ud3umdPvsv/uIvfuoZz3jGX3PVVVddddX/C894xjP++ty5c7e+6Zu+6UcD/MM//MPvcNVVV1111VX/P6AHPehBXHXVVVddddX/dddcc82DP/zDP/y7XuzFXuy1f/d3f/e7uOqqq6666v+t13zN13yf++6779bP+qzPep377rvvVq666qqrrrrq/zbK8ePHueqqq6666qr/y17sxV7stb/iK77ir57whCf81jOe8Yy/5qqrrrrqqv/XnvGMZ/z1uXPnbn2Hd3iHz97c3Dz+D//wD7/DVVddddVVV/3fRTl+/DhXXXXVVVdd9X/VO77jO37WR3zER3z37/7u734XV1111VVXXfUA586du/XN3uzNPkaS/uEf/uG3ueqqq6666qr/m9CDHvQgrrrqqquuuur/mmuuuebBH/7hH/5dL/ZiL/bav/u7v/tdXHXVVVddddUL8Jqv+Zrvc9999936WZ/1Wa9z33333cpVV1111VVX/d9COX78OFddddVVV131f8k111zz4M/5nM/5rYc85CEv/bu/+7vfxVVXXXXVVVe9EM94xjP++rGPfezrvOIrvuJb/9mf/dnPHB4e7nLVVVddddVV/3dQjh8/zlVXXXXVVVf9X/FiL/Zir/0VX/EVf/UXf/EXP/WMZzzjr7nqqquuuuqqF8EznvGMvz537tyt7/AO7/DZm5ubx//hH/7hd7jqqquuuuqq/xsox48f56qrrrrqqqv+L3id13md9/6kT/qkn/rd3/3d7+Kqq6666qqr/g3OnTt365u92Zt9jCT9wz/8w29z1VVXXXXVVf/7UY4fP85VV1111VVX/W/34R/+4d/1Tu/0Tp/9u7/7u9/FVVddddVVV/07POMZz/jrN33TN/1ogH/4h3/4Ha666qqrrrrqfzfK8ePHueqqq6666qr/zT73cz/3t17xFV/xrX/3d3/3u7jqqquuuuqq/wDPeMYz/vrN3uzNPuaaa6558J/+6Z/+DFddddVVV131vxd60IMexFVXXXXVVVf9b/W5n/u5v/ViL/Zir/27v/u738VVV1111VVX/Qd7zdd8zfe57777bv2QD/mQh3DVVVddddVV/zsRXHXVVVddddX/Up/7uZ/7Wy/2Yi/22r/7u7/7XVx11VVXXXXVf4Lf/d3f/a5rrrnmwd/0Td/0dK666qqrrrrqfyeCq6666qqrrvpf5pprrnnw537u5/7Wi73Yi7327/7u734XV1111VVXXfWf6Hd/93e/65prrnnwN3/zN9/KVVddddVVV/3vQ3DVVVddddVV/4tcc801D37t137t93qxF3ux1/7d3/3d7+Kqq6666qqr/gv87u/+7nedOXPmQd/0Td/09GuuuebBXHXVVVddddX/HpTjx49z1VVXXXXVVf9bfNInfdJPvc7rvM57/+7v/u53cdVVV1111VX/hZ7xjGf89WMf+9jXecVXfMW3/rM/+7OfOTw83OWqq6666qqr/udDD3rQg7jqqquuuuqq/w0+93M/97de7MVe7LV/93d/97u46qqrrrrqqv8mr/mar/k+9913360f8iEf8hCuuuqqq6666n8+gquuuuqqq676X+BzP/dzf+vFXuzFXvt3f/d3v4urrrrqqquu+m/0u7/7u991zTXXPPibvumbns5VV1111VVX/c9HOX78OFddddVVV131P9nnfu7n/taLvdiLvfbv/u7vfhdXXXXVVVdd9T/AM57xjL9+7GMf+zrXXHPNg//0T//0Z7jqqquuuuqq/7kox48f56qrrrrqqqv+p/rwD//w73rFV3zFt/7d3/3d7+Kqq6666qqr/gd5xjOe8dev/dqv/T4A//AP//A7XHXVVVddddX/TJTjx49z1VVXXXXVVf8Tvc7rvM57v9M7vdNn/+7v/u53cdVVV1111VX/Az3jGc/46zd7szf7GIB/+Id/+B2uuuqqq6666n8eyvHjx7nqqquuuuqq/2le7MVe7LU/6ZM+6ad+93d/97u46qqrrrrqqv/BnvGMZ/z1K7zCK7zN0dHRpVtvvfWvueqqq6666qr/WSjHjx/nqquuuuqqq/4nueaaax78FV/xFX/1u7/7u9/FVVddddVVV/0vcO7cuVtf67Ve673/7M/+7GcODw93ueqqq6666qr/OdCDHvQgrrrqqquuuup/ks/93M/9rfPnzz+dq6666qqrrvpf5tGPfvTrfMiHfMhDuOqqq6666qr/OQiuuuqqq6666n+Qz/3cz/2tF3uxF3ttrrrqqquuuup/oWuuuebBH/7hH/5dXHXVVVddddX/HJTjx49z1VVXXXXVVf8TvNiLvdhrv9M7vdNn/+7v/u53cdVVV1111VX/Cz3jGc/469d+7dd+H4B/+Id/+B2uuuqqq6666r8f5fjx41x11VVXXXXVf7drrrnmwV/xFV/xV7/7u7/7XVx11VVXXXXV/2LPeMYz/voVXuEV3ubWW2/9m7Nnz97KVVddddVVV/33Qg960IO46qqrrrrqqv9un/u5n/tb58+ffzpXXXXVVVdd9X/Eox/96Nf5kA/5kIdw1VVXXXXVVf+9CK666qqrrrrqv9k7vuM7ftaLvdiLvTZXXXXVVVdd9X/INddc8+B3fMd3/Cyuuuqqq6666r8X5fjx41x11VVXXXXVf5cXe7EXe+2P+IiP+O7f/d3f/S6uuuqqq6666v+QZzzjGX/9Cq/wCm9z6623/s3Zs2dv5aqrrrrqqqv+e6AHPehBXHXVVVddddV/l8/93M/9rfPnzz+dq6666qqrrvo/aD6fbz34wQ9+hQ/5kA95CFddddVVV13134Pgqquuuuqqq/6bvM7rvM57v9iLvdhrc9VVV1111VX/R61Wq4Nrrrnmwa/zOq/z3lx11VVXXXXVfw/0oAc9iKuuuuqqq6767/ATP/ET/t3f/d3v4qqrrrrqqqv+D5vP51sPechDXvGDP/iDH8xVV1111VVX/dcjuOqqq6666qr/Bu/4ju/4WVx11VVXXXXV/wOr1ergzJkzD/rwD//w7+Kqq6666qqr/usRXHXVVVddddV/sWuuuebB7/RO7/TZv/u7v/tdXHXVVVddddX/A3/6p3/6Yy/2Yi/22tdcc82Dueqqq6666qr/WpTjx49z1VVXXXXVVf+V3ud93uerhmHYPzw8vMBVV1111VVX/T8wTdNQSqm33HLLS/7pn/7pz3DVVVddddVV/3UIrrrqqquuuuq/0DXXXPPg13md13nve++99ylcddVVV1111f8jly5duud1Xud13vvFXuzFXpurrrrqqquu+q9DOX78OFddddVVV131X+V93ud9vmoYhv3Dw8MLXHXVVVddddX/I9M0DavV6uD06dO3/Omf/unPcNVVV1111VX/NQiuuuqqq6666r/INddc8+DXeZ3Xee977733KVx11VVXXXXV/0OXLl2658Ve7MVe+5prrnkwV1111VVXXfVfg+Cqq6666qqr/ou84zu+42dx1VVXXXXVVf+PrVarg2uuuebB7/iO7/hZXHXVVVddddV/DSpXXXXVVVdd9V/kdV7ndd77d3/3d7+Lq6666qqrrvp/7E//9E9/7MVe7MVem6uuuuqqq676r0Fw1VVXXXXVVf8FXud1Xue9ueqqq6666qqrWK1WB9dcc82DX+d1Xue9ueqqq6666qr/fARXXXXVVVdd9V/gdV7ndd7rd3/3d7+Lq6666qqrrrqKP/3TP/2x13md13lvrrrqqquuuuo/H8FVV1111VVX/Sd7sRd7sdd+sRd7sdfmqquuuuqqq666bLVaHbzYi73Ya73Yi73Ya3PVVVddddVV/7kIrrrqqquuuuo/2eu8zuu8F1ddddVVV1111fN4sRd7sdfiqquuuuqqq/5zEVx11VVXXXXVf7IXe7EXe+3f/d3f/S6uuuqqq6666qpn+d3f/d3vep3XeZ335qqrrrrqqqv+cxFcddVVV1111X+ya6655sFcddVVV1111VXP45prrnnwi73Yi702V1111VVXXfWfh+Cqq6666qqr/hO9zuu8zntz1VVXXXXVVVe9QC/2Yi/2Wlx11VVXXXXVfx6Cq6666qqrrvpP9GIv9mKv9bu/+7vfxVVXXXXVVVdd9Tx+93d/97te/MVf/LW56qqrrrrqqv88BFddddVVV131n+h1Xud13purrrrqqquuuuoFOnPmzIO56qqrrrrqqv88BFddddVVV131n+TFXuzFXpurrrrqqquuuuqFuuaaax78Yi/2Yq/NVVddddVVV/3nILjqqquuuuqq/yTXXHPNg7nqqquuuuqqq/5FL/ZiL/ZaXHXVVVddddV/DoKrrrrqqquu+k/yYi/2Yq/1u7/7u9/FVVddddVVV131Av3u7/7ud734i7/4a3PVVVddddVV/zkIrrrqqquuuuo/yYu92Iu9NlddddVVV1111VVXXXXVVVf9dyK46qqrrrrqqv8k11xzzYO56qqrrrrqqqv+RWfOnHkwV1111VVXXfWfg8pVV1111VVXXXXVVVddddVV/62uueaaB3PVVVddddVV/zkIrrrqqquuuuo/wYu92Iu9NlddddVVV1111YvsxV7sxV6bq6666qqrrvqPR+Wqq6666qqrrrrqqquuuuqqq6666qqrrvq/iuCqq6666qqr/hNcc801D+aqq6666qqrrnqRXXPNNQ/mqquuuuqqq/7jUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVV/wnOnDnzIK666qqrrrrqqhfZmTNnHsRVV1111VVX/cejctVVV1111VVXXXXVVVddddV/q9/93d/9Lq666qqrrrrqPweVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yqCq6666qqrrrrqqquuuuqqq/5bveZrvub7nD179hlcddVVV1111X88KlddddVVV131n+R3f/d3v4urrrrqqquuuupFcubMmQdx1VVXXXXVVf/xCK666qqrrrrqP8HZs2ef8Zqv+Zrvw1VXXXXVVVdd9SI5e/bsM7jqqquuuuqq/3hUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddV/gvvuu+9WrrrqqquuuuqqF9l99913K1ddddVVV131H4/KVVddddVVV/0nOHv27K1cddVVV1111VUvsrNnz97KVVddddVVV/3Ho3LVVVddddVVV1111VVXXXXVf7v77rvvVq666qqrrrrqPx6Vq6666qqrrvpPcN99991633333cpVV1111VVXXXXVVVddddVV/52oXHXVVVddddV/krNnz97KVVddddVVV131L/qt3/qt7+aqq6666qqr/nMQXHXVVVddddV/kr//+7//ba666qqrrrrqqn/RfffddytXXXXVVVdd9Z+D4Kqrrrrqqqv+k/zDP/zD77zma77m+3DVVVddddVVV71Ar/mar/k+Z8+efQZXXXXVVVdd9Z+DylVXXXXVVVf9Jzl79uytXHXVVVddddVV/6J/+Id/+G2uuuqqq6666j8Hlauuuuqqq676T3Lffffd+g//8A+/zVVXXXXVVVdd9ULdd999t3LVVVddddVV/zmoXHXVVVddddVVV1111VVXXfXf5rd+67e+m6uuuuqqq676z0Nw1VVXXXXVVf+JfuRHfuRzXvM1X/N9uOqqq6666qqrnsdrvuZrvs8//MM//A5XXXXVVVdd9Z+HylVXXXXVVVf9J/qHf/iH3+aqq6666qqrrnqBfuu3fuu7ueqqq6666qr/PFSuuuqqq6666j/ZP/zDP/w2V1111VVXXXXV8/it3/qt7+aqq6666qqr/nMRXHXVVVddddV/st/6rd/6ntd8zdd8H6666qqrrrrqqmd5zdd8zff5h3/4h9/hqquuuuqqq/5zUbnqqquuuuqq/2T/8A//8NtcddVVV1111VXP4x/+4R9+m6uuuuqqq676z0Xlqquuuuqqq/6T3Xfffbf+wz/8w29z1VVXXXXVVVc9y2/91m99z3333XcrV1111VVXXfWfi+Cqq6666qqr/gv8yI/8yOecOnXqIVx11VVXXXXVVbzma77m+/zWb/3Wd3PVVVddddVV//moXHXVVVddddV/gbNnz97KVVddddVVV1112X333XfrP/zDP/w2V1111VVXXfWfj+Cqq6666qqr/gvcd999t/7Wb/3W97zma77m+3DVVVddddVV/4+95mu+5vv86I/+6Odw1VVXXXXVVf81qFx11VVXXXXVf5F/+Id/+O377rvvVq666qqrrrrq/7nf+q3f+m6uuuqqq6666r8GwVVXXXXVVVf9F7nvvvtu/dEf/dHPec3XfM334aqrrrrqqqv+H3rN13zN9/mRH/mRz+aqq6666qqr/utQueqqq6666qr/Qv/wD//w21x11VVXXXXV/2M/+qM/+jlcddVVV1111X8dgquuuuqqq676L3Tffffd+lu/9Vvf/Zqv+Zrvw1VXXXXVVVf9P/Kar/ma7/MjP/Ijn81VV1111VVX/dciuOqqq6666qr/Yj/6oz/6Offdd9+tXHXVVVddddX/Mz/6oz/6OVx11VVXXXXVfy2Cq6666qqrrvovdt999936oz/6o5/zmq/5mu/DVVddddVVV/0/8Jqv+Zrv8/Vf//Xvw1VXXXXVVVf91yO46qqrrrrqqv8Gv/Vbv/Xd//AP//DbXHXVVVddddX/A/fdd9+tv/Vbv/XdXHXVVVddddV/PYKrrrrqqquu+m/y9V//9e/zmq/5mu/DVVddddVVV/0f9pqv+Zrv8/Vf//Xvw1VXXXXVVVf99yC46qqrrrrqqv8m9913362/9Vu/9d2v+Zqv+T5cddVVV1111f9Br/mar/k+v/Vbv/Xd//AP//DbXHXVVVddddV/D4Krrrrqqquu+m/0oz/6o59z33333cpVV1111VVX/R9033333fr1X//178NVV1111VVX/fchuOqqq6666qr/Rvfdd9+tP/qjP/o5r/mar/k+XHXVVVddddX/Ia/5mq/5Pl//9V//Plx11VVXXXXVfy/K8ePHueqqq6666qr/TrfeeutfA7zZm73ZxzzjGc/4a6666qqrrrrqf7nXfM3XfJ/f+q3f+u5f+IVf+Bquuuqqq6666r8X5fjx41x11VVXXXXVf7ezZ88+4yEPechLL5fLXa666qqrrrrqf7nFYnHisz7rs16Hq6666qqrrvrvR3DVVVddddVV/wPcd999t37913/9+7zma77m+3DVVVddddVV/4u95mu+5vt8/dd//ftw1VVXXXXVVf8zUI4fP85VV1111VVX/U9weHi4e/bs2We8wzu8w2c/4xnP+Guuuuqq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/fVf//Xvw1VXXXXVVVf9/4Me9KAHcdVVV1111VX/X11zzTUP/vAP//DverEXe7HX/t3f/d3v4qqrrrrqqv8zXvM1X/N97rvvvlu//uu//n3+4R/+4be56qqrrrrqqv+fKMePH+eqq6666qqr/r86PDzc/Yd/+IffOTw83H2zN3uzj3nGM57x11x11VVXXfW/3mu+5mu+z4/8yI989pd+6Ze+zdmzZ2/lqquuuuqqq/7/Qg960IO46qqrrrrqqqvgmmuuefA7vuM7ftbrvM7rvPfv/u7vfhdXXXXVVVf9r/Oar/ma7/MP//APv/31X//173PffffdylVXXXXVVVddRTl+/DhXXXXVVVdddRUcHh7u3nrrrX9zeHi4+2Zv9mYf86AHPehlnvGMZ/w1V1111VVX/Y/3mq/5mu+zWCxO/PzP//xXf/3Xf/37HB4e7nLVVVddddVVVwGgBz3oQVx11VVXXXXVVc/pmmuuefBrv/Zrv9c7vdM7ffbv/u7vfhdXXXXVVVf9j/War/ma7/MP//APv/2Zn/mZr8NVV1111VVXXfXc0IMe9CCuuuqqq6666qrn75prrnnw53zO5/zWNddc8+Df/d3f/S6uuuqqq676H+M1X/M13+e+++679eu//uvf5x/+4R9+m6uuuuqqq6666vmhHD9+nKuuuuqqq6666vk7PDzc/bM/+7OfOTw83H2zN3uzj3nQgx70Ms94xjP+mquuuuqqq/7bvOZrvub7LBaLEz//8z//1V/6pV/6NmfPnr2Vq6666qqrrrrqBUEPetCDuOqqq6666qqr/mXXXHPNg1/7tV/7vd7pnd7ps3/3d3/3u7jqqquuuuq/3Gu+5mu+z4/8yI989o/+6I9+DlddddVVV1111YsCPehBD+Kqq6666qqrrnrRXXPNNQ/+8A//8O96sRd7sdf+3d/93e/iqquuuuqq/3Sv+Zqv+T7/8A//8Ntf//Vf/z733XffrVx11VVXXXXVVS8q9KAHPYirrrrqqquuuupf75prrnnwh3/4h3/Xi73Yi7327/7u734XV1111VVX/Yd7zdd8zfe57777bv36r//69/mHf/iH3+aqq6666qqrrvrXQg960IO46qqrrrrqqqv+7V7ndV7nvd7xHd/xs6+55poH/+7v/u53cdVVV1111b/ba77ma77Pfffdd+tv/dZvffeP/uiPfg5XXXXVVVddddW/FXrQgx7EVVddddVVV13173PNNdc8+LVf+7Xf63Ve53Xe+5prrnnw7/7u734XV1111VVX/au95mu+5vvcd999t/7Wb/3Wd//oj/7o53DVVVddddVVV/17oQc96EFcddVVV1111VX/Ma655poHv9iLvdhrf/iHf/h3Afzu7/7ud3HVVVddddW/6DVf8zXf57777rv1t37rt777R3/0Rz+Hq6666qqrrrrqPwp60IMexFVXXXXVVVdd9R/rzJkzD3qd13md936d13md977mmmse/Lu/+7vfxVVXXXXVVc/jNV/zNd/nvvvuu/W3fuu3vvtHf/RHP4errrrqqquuuuo/GnrQgx7EVVddddVVV131n+Oaa6558Iu92Iu99ju+4zt+1jXXXPPg3/3d3/0urrrqqquu4jVf8zXf57777rv1t37rt777R3/0Rz+Hq6666qqrrrrqPwt60IMexFVXXXXVVVdd9Z/rmmuuefCLvdiLvdbrvM7rvPeLvdiLvfbv/u7vfhdXXXXVVf8PveZrvub73Hfffbf+1m/91nf/6I/+6Odw1VVXXXXVVVf9Z0MPetCDuOqqq6666qqr/uu8zuu8znu/zuu8znudOXPmwU94whN+i6uuuuqq/wde8zVf833uu+++W3/0R3/0c37rt37ru7nqqquuuuqqq/6roAc96EFcddVVV1111VX/9a655poHv+M7vuNnvc7rvM57A/zu7/7ud3HVVVdd9X/Ia77ma74PwI/8yI989m//9m9/z3333XcrV1111VVXXXXVfzX0oAc9iKuuuuqqq6666r/PNddc8+DXfu3Xfq93eqd3+myA3/3d3/0urrrqqqv+F3vN13zN97nvvvtu/a3f+q3v/tEf/dHP4aqrrrrqqquu+u+EHvSgB3HVVVddddVVV/33u+aaax78Yi/2Yq/9Oq/zOu/1Yi/2Yq/9u7/7u9/FVVddddX/Iq/5mq/5Pvfdd9+tv/Vbv/XdP/qjP/o5XHXVVVddddVV/xOgBz3oQVx11VVXXXXVVf+zXHPNNQ9+x3d8x896ndd5nfcG+N3f/d3v4qqrrrrqf6DXfM3XfB+AH/mRH/nsf/iHf/idf/iHf/htrrrqqquuuuqq/0nQgx70IK666qqrrrrqqv+Zrrnmmge/9mu/9nu9zuu8zntfc801D/7d3/3d7+Kqq6666n+A13zN13yf++6779bf+q3f+u4f/dEf/Ryuuuqqq6666qr/qdCDHvQgrrrqqquuuuqq//le7MVe7LVf53Ve571e53Ve570Bfvd3f/e7uOqqq676L/Sar/ma7wPwIz/yI5/9D//wD7/zD//wD7/NVVddddVVV131Px160IMexFVXXXXVVVdd9b/HNddc8+AXe7EXe+3XeZ3Xea8Xe7EXe22A3/3d3/0urrrqqqv+E7zma77m+wDcd999t/7Wb/3Wd//oj/7o53DVVVddddVVV/1vgh70oAdx1VVXXXXVVVf973TNNdc8+LVf+7Xf63Ve53Xe+5prrnnw7/7u734XV1111VX/AV7zNV/zfe67775bf+u3fuu7f/u3f/t77rvvvlu56qqrrrrqqqv+N0IPetCDuOqqq6666qqr/ve75pprHvyO7/iOn/U6r/M67w3wu7/7u9/FVVddddW/wmu+5mu+z3333Xfrb/3Wb333P/zDP/zOP/zDP/w2V1111VVXXXXV/3boQQ96EFddddVVV1111f8d11xzzYNf7MVe7LVf7MVe7LVe53Ve570Bfvd3f/e7uOqqq656Pl7zNV/zfe67775bf+u3fuu7/+Ef/uF3/uEf/uG3ueqqq6666qqr/i9BD3rQg7jqqquuuuqqq/5vuuaaax585syZB73O67zOe7/O67zOewP87u/+7ndx1VVX/b/2mq/5mu9z33333foP//APv/0P//APv/1bv/Vb38NVV1111VVXXfV/FXrQgx7EVVddddVVV131f98111zz4DNnzjz4dV7ndd7rdV7ndd6bZ/rd3/3d7+Kqq676P+81X/M13+e+++679bd+67e++x/+4R9+5x/+4R9+m6uuuuqqq6666v8D9KAHPYirrrrqqquuuur/lzNnzjzommuuecjrvM7rvNc111zz4Bd7sRd7bYDf/d3f/S6uuuqq/xNe8zVf830A7rvvvlt/67d+67v/4R/+4Xf+4R/+4be56qqrrrrqqqv+v0EPetCDuOqqq6666qqr/n+75pprHvxiL/Zir/U6r/M67/1iL/Zirw3wu7/7u9/FVVdd9b/Ka77ma74PwH333Xfrb/3Wb333b//2b3/PfffddytXXXXVVVddddX/Z+hBD3oQV1111VVXXXXVVfe75pprHvxiL/Zir/1iL/Zir/ViL/Zir33NNdc8GOB3f/d3v4urrrrqf5TXfM3XfB+A++6779Z/+Id/+O377rvv1h/90R/9HK666qqrrrrqqqueDT3oQQ/iqquuuuqqq6666gW55pprHvzar/3a7/XiL/7ir/1iL/Zirw3wu7/7u9/FVVdd9V/uNV/zNd+HZ/qHf/iH3/77v//73/6Hf/iH3/mHf/iH3+aqq6666qqrrrrq+UMPetCDuOqqq6666qqrrnpRXHPNNQ9+sRd7sdd6sRd7sde+5pprHvxiL/Zirw3wu7/7u9/FVVdd9Z/iNV/zNd8H4L777rv1t37rt777H/7hH377H/7hH36Hq6666qqrrrrqqhcNetCDHsRVV1111VVXXXXVv8U111zz4Bd7sRd77Rd7sRd7rWuuuebBL/ZiL/baAL/7u7/7XVx11VX/Jq/5mq/5PgD33Xffrb/1W7/13QA/+qM/+jlcddVVV1111VVX/dugBz3oQVx11VVXXXXVVVf9R7jmmmse/GIv9mKv/WIv9mKvdc011zz4xV7sxV6bZ/rd3/3d7+Kqq656Dq/5mq/5PjzTfffdd+tv/dZvffc//MM//M4//MM//DZXXXXVVVddddVV/zHQgx70IK666qqrrrrqqqv+M1xzzTUPPnPmzINf7MVe7LVe/MVf/LVf7MVe7LV5pt/93d/9Lq666v+Z13zN13wfgPvuu+/Ws2fP3vr3f//3v/0P//APv/MP//APv81VV1111VVXXXXVfw70oAc9iKuuuuqqq6666qr/Ktdcc82DX+zFXuy1X+zFXuy1rrnmmge/2Iu92GvzTL/7u7/7XVx11f8Rr/mar/k+PNN9991362/91m99N8Bv//Zvf8999913K1ddddVVV1111VX/NdCDHvQgrrrqqquuuuqqq/67nDlz5kGS9GIv9mKv/WIv9mKvdc011zz4xV7sxV6bZ/rd3/3d7+Kqq/6He83XfM334Znuu+++W3/rt37ruwH+4R/+4Xf+4R/+4be56qqrrrrqqquu+u+DHvSgB3HVVVddddVVV131P8mZM2cedM011zzkmmuuefCLvdiLvdY111zz4Bd7sRd7bR7gd3/3d7+Lq676L/aar/ma78MD3Hfffbf+1m/91ncD/MM//MPv/MM//MNvc9VVV1111VVXXfU/C3rQgx7EVVddddVVV1111f8G11xzzYPPnDnz4GuuuebBL/ZiL/Za11xzzYNf7MVe7LV5gN/93d/9Lq666t/pNV/zNd+HB7jvvvtu/Yd/+Iffvu+++249e/bsM/7hH/7ht++7775bueqqq6666qqrrvqfDz3oQQ/iqquuuuqqq6666n+ra6655sEAL/ZiL/baZ86cedA111zz4GuuuebBL/ZiL/baPMDv/u7vfhdXXfVcXvM1X/N9eKb77rvvVoB/+Id/+O377rvv1n/4h3/4nbNnz95633333cpVV1111VVXXXXV/17oQQ96EFddddVVV1111VX/F11zzTUPPnPmzIOvueaaB73Yi73YawNcc801D36xF3ux1+a5/O7v/u53cdX/Oa/5mq/5PjyX++6779azZ8/e+vd///e/DfAP//APv/MP//APv81VV1111VVXXXXV/03oQQ96EFddddVVV1111VX/35w5c+ZB11xzzUOuueaaB585c+ZB11xzzYOvueaaB585c+bB11xzzYN5Lr/7u7/7XVz1P85rvuZrvg/P5b777rv17Nmzt95333233nfffbeePXv2Gffdd9+t//AP//DbXHXVVVddddVVV/3/gx70oAdx1VVXXXXVVVddddVzuuaaax4M8GIv9mKvBejFXuzFXgvgmmuuefCZM2ceDHDNNdc8mOfyu7/7u9/FVf9ur/mar/k+PJf77rvvVoCzZ8/eet99991633333Qpw9uzZW++7775nnD179tb77rvvVq666qqrrrrqqquueiD0oAc9iKuuuuqqq6666qqr/vWuueaaBwOcOXPmwddcc82DAJ05c+ZB11xzzYMBrrnmmgcDnDlz5sHXXHPNg/kX/O7v/u538X/Ia77ma74P/4L77rvvVoCzZ8/eCnDffffdet99990KcPbs2Vvvu+++Z5w9e/bW++6771auuuqqq6666qqrrvq3QA960IO46qqrrrrqqquuuuo/3zXXXPNg277mmmseAnDNNdc8mCt85syZBwNcc801D+aZrrnmmgcDnDlz5sE80zXXXPNg/pvdd999t/IAZ8+evZVnuu+++24F+Id/+IffOXPmzIMAzp49+4z77rvvVoCzZ8/eattnz559BlddddVVV1111VVX/VdAD3rQg7jqqquuuuqqq6666n+va6655sE8gG1L0pkzZx7MsxkQz8mAzp49eyvPZNuSxAPcd999t3LVVVddddVVV1111f9W6EEPehBXXXXVVVddddVVV1111VVXXXXVVVddddX/SVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KfwS1lbqCz04iTwAAAABJRU5ErkJggg==) + diff --git a/docs/kcl/patternCircular2d.md b/docs/kcl/patternCircular2d.md index d18a25e1e..ee1129dea 100644 --- a/docs/kcl/patternCircular2d.md +++ b/docs/kcl/patternCircular2d.md @@ -35,10 +35,10 @@ exampleSketch = startSketchOn('XZ') |> line([0, -5], %) |> close(%) |> patternCircular2d({ - center: [0, 0], - instances: 13, - arcDegrees: 360, - rotateDuplicates: true + center = [0, 0], + instances = 13, + arcDegrees = 360, + rotateDuplicates = true }, %) example = extrude(1, exampleSketch) diff --git a/docs/kcl/patternCircular3d.md b/docs/kcl/patternCircular3d.md index fcba7c0d3..4144b1297 100644 --- a/docs/kcl/patternCircular3d.md +++ b/docs/kcl/patternCircular3d.md @@ -29,15 +29,15 @@ patternCircular3d(data: CircularPattern3dData, solid_set: SolidSet) -> [Solid] ```js exampleSketch = startSketchOn('XZ') - |> circle({ center: [0, 0], radius: 1 }, %) + |> circle({ center = [0, 0], radius = 1 }, %) example = extrude(-5, exampleSketch) |> patternCircular3d({ - axis: [1, -1, 0], - center: [10, -20, 0], - instances: 11, - arcDegrees: 360, - rotateDuplicates: true + axis = [1, -1, 0], + center = [10, -20, 0], + instances = 11, + arcDegrees = 360, + rotateDuplicates = true }, %) ``` diff --git a/docs/kcl/patternLinear2d.md b/docs/kcl/patternLinear2d.md index 0301965e7..b4289c807 100644 --- a/docs/kcl/patternLinear2d.md +++ b/docs/kcl/patternLinear2d.md @@ -29,11 +29,11 @@ patternLinear2d(data: LinearPattern2dData, sketch_set: SketchSet) -> [Sketch] ```js exampleSketch = startSketchOn('XZ') - |> circle({ center: [0, 0], radius: 1 }, %) + |> circle({ center = [0, 0], radius = 1 }, %) |> patternLinear2d({ - axis: [1, 0], - instances: 7, - distance: 4 + axis = [1, 0], + instances = 7, + distance = 4 }, %) example = extrude(1, exampleSketch) diff --git a/docs/kcl/patternLinear3d.md b/docs/kcl/patternLinear3d.md index d89134dea..f445eb0a7 100644 --- a/docs/kcl/patternLinear3d.md +++ b/docs/kcl/patternLinear3d.md @@ -37,9 +37,9 @@ exampleSketch = startSketchOn('XZ') example = extrude(1, exampleSketch) |> patternLinear3d({ - axis: [1, 0, 1], - instances: 7, - distance: 6 + axis = [1, 0, 1], + instances = 7, + distance = 6 }, %) ``` diff --git a/docs/kcl/patternTransform.md b/docs/kcl/patternTransform.md index 2f97a689f..308fec983 100644 --- a/docs/kcl/patternTransform.md +++ b/docs/kcl/patternTransform.md @@ -35,7 +35,7 @@ The transform function returns a transform object. All properties of the object - `rotation.origin` (either "local" i.e. rotate around its own center, "global" i.e. rotate around the scene's center, or a 3D point, defaults to "local") ```js -patternTransform(total_instances: u32, transform_function: FunctionParam, solid_set: SolidSet) -> [Solid] +patternTransform(total_instances: integer, transform_function: FunctionParam, solid_set: SolidSet) -> [Solid] ``` @@ -43,7 +43,7 @@ patternTransform(total_instances: u32, transform_function: FunctionParam, solid_ | Name | Type | Description | Required | |----------|------|-------------|----------| -| `total_instances` | `u32` | | Yes | +| `total_instances` | `integer` | | Yes | | `transform_function` | `FunctionParam` | | Yes | | `solid_set` | [`SolidSet`](/docs/kcl/types/SolidSet) | A solid or a group of solids. | Yes | @@ -56,13 +56,13 @@ patternTransform(total_instances: u32, transform_function: FunctionParam, solid_ ```js // Each instance will be shifted along the X axis. -fn transform = (id) => { - return { translate: [4 * id, 0, 0] } +fn transform(id) { + return { translate = [4 * id, 0, 0] } } // Sketch 4 cylinders. sketch001 = startSketchOn('XZ') - |> circle({ center: [0, 0], radius: 2 }, %) + |> circle({ center = [0, 0], radius = 2 }, %) |> extrude(5, %) |> patternTransform(4, transform, %) ``` @@ -73,12 +73,12 @@ sketch001 = startSketchOn('XZ') // Each instance will be shifted along the X axis, // with a gap between the original (at x = 0) and the first replica // (at x = 8). This is because `id` starts at 1. -fn transform = (id) => { - return { translate: [4 * (1 + id), 0, 0] } +fn transform(id) { + return { translate = [4 * (1 + id), 0, 0] } } sketch001 = startSketchOn('XZ') - |> circle({ center: [0, 0], radius: 2 }, %) + |> circle({ center = [0, 0], radius = 2 }, %) |> extrude(5, %) |> patternTransform(4, transform, %) ``` @@ -86,7 +86,7 @@ sketch001 = startSketchOn('XZ') ![Rendered example of patternTransform 1](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAEwoUlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqv8g11xzzYMBXuzFXuy1z5w58yCAa6655sEA11xzzYN5pvvuu+/Wa6655sH33XffrTzTfffdd+vZs2efcd9999169uzZW++7775bueqqq/7VrrnmmgefOXPmwddcc82Dz5w58yCAa6655sHXXHPNgwHuu+++W6+55poH80z33XffrQD33XffrWfPnn3GfffddyvAP/zDP/w2V/2Xu+aaax4M8GIv9mKvfebMmQcBXHPNNQ++7777bn3xF3/x1+a53HfffbfyTPfdd9+tZ8+efcZ9991369mzZ2+97777buWq/3LXXHPNg8+cOfPga6655sFnzpx5EMA111zz4GuuueYhgHlOuu+++57OM/3DP/zD7wDcd999t/7DP/zDb3PVVVddddVV/zHQgx70IK666qqrrrrqX+uaa6558JkzZx78Yi/2Yq/14i/+4q/9Yi/2Yq/Nf6D77rvvVoB/+Id/+O1/+Id/+J377rvv1n/4h3/4ba666qpnueaaax782q/92u91zTXXPPiaa6558Iu92Iu9Nv8O9913363XXHPNgwHuu+++WwH+4R/+4bf/4R/+4Xfuu+++W//hH/7ht7nqP8w111zz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ey+3334797PNc7PNc7PN82Ob52ab52ab58c2z802z49t5vM5N9xwA9dffz2LxYL73Xfffbf+6I/+6Of81m/91ndz1VVXXXXV/zToQQ96EFddddVVV/3P9o7v+I6f9U7v9E6fzQPs7+/zhCc8gbvuuou7776bfw1JvKgk8a8hiefn+uuv5/rrr+flXu7luN99991362/91m9994/+6I9+Dldd9f/UNddc8+DXfu3Xfq93eqd3+myeablcslwuuf3227njjjsAkMRzk8Rzk8Rzk8Rzk8QDSeK5SeK5SeKBJDGfz7n++uuZz+dcf/313O++++679bd+67e++7d/+7e/57777ruVqy57ndd5nfd+ndd5nfd6sRd7sdfmmYZh4MKFC+zv73NwcMALIol/K0n8R+n7nhMnTnDdddfxQPfdd9+tv/Vbv/XdP/qjP/o5XHXZNddc8+DXfu3Xfq/XeZ3Xee9rrrnmwQDr9ZpLly5x6dIl7rvvPmzz3Gzz/Njmudnm+bHNc7PNc7PN82MbgPl8zvXXX8+JEyc4ceIE97vvvvtu/a3f+q3v/q3f+q3vPnv27DO46qqrrrrqfyr0oAc9iKuuuuqqq/7nu+aaax78Yi/2Yq/9Yi/2Yq/1Oq/zOu/NA+zv73PXXXdx11138cQnPpF/iST+NSTxopIEwPb2No94xCO44YYbuP7663mg++6779bf+q3f+u4f/dEf/Ryuuuqqy6655poHv9iLvdhrv9iLvdhrvc7rvM5780zL5RKAO+64g/Pnz3PhwgUAJPHcJPHcJPHcJPHcJPFAknhukrjffD7nhhtu4Pjx45w4cYIHuu+++2790R/90c/5rd/6re/mqhfommuuefBrv/Zrv9frvM7rvPc111zzYJ5pGAYODg7Y39/n4sWLvKgk8Z+l73tOnDgBwHXXXccD/cM//MNv//3f//1v//Zv//b33Hfffbdy1fN15syZB734i7/467zO67zOe73Yi73Ya/NM6/WaS5cucenSJVarFZcuXeKBbPP82Oa52ea52ea52eb5sQ3AfD5nPp9z4sQJrr/+eubzOQ/0D//wD7/9W7/1W9/zW7/1W9/NVVddddVV/xugBz3oQVx11VVXXfW/yzXXXPPgF3uxF3vtF3uxF3ut13md13lvgP39fba3twHY39/nrrvu4q677mJ/f5+77rqLB5LEv4YkXpjt7W0AHvnIRwLwci/3cjy3f/iHf/jtv//7v//tH/3RH/0crrrqqhfqmmuuefCLvdiLvdbrvM7rvPeLvdiLvTYPsFwuOTo6YrVacf78eZbLJRcuXABAEs9NEg8kiecmiecmifvN53M2NjY4fvw4J06c4MSJEzy3f/iHf/jtv//7v//tH/3RH/0crvpXe7EXe7HXfp3XeZ33erEXe7HXvuaaax7MAwzDwMHBAQcHBwzDwMHBAZL495LE89P3PV3XsbW1Rd/3nDhxAoBhGOj7HoB/+Id/+O2///u//+3f+q3f+u6zZ88+g6v+Va655poHv9iLvdhrv87rvM57vdiLvdhr8wDr9Zrd3V0uXbrEer3m0qVLANjmudnmudnm+bHNc7PNfD4H4LrrrgPg+PHjnDhxgge67777bv2t3/qt7wb40R/90c/hqquuuuqq/23Qgx70IK666qqrrvrf65prrnkwwGu/9mu/14u/+Iu/9ou92Iu9Ns/H/v4++/v77O/vs7+/z8HBAfv7+wDs7+8DsL+/z3Pb3t5GEgBbW1tsb2+zvb0NwPXXX88NN9zA83Pffffd+g//8A+/fd999936oz/6o5/DVVdd9W9yzTXXPPjFXuzFXvvFXuzFXuuaa6558Iu92Iu9Ns9luVwCcOHCBQAuXLgAwGq1YrlcArBcLgGQxP0WiwWSAJjP5wCcOHECSczncxaLBSdOnOD5ue+++279rd/6re/+h3/4h9/5h3/4h9/mqv8w11xzzYNf+7Vf+71e/MVf/LVf7MVe7LV5LsMwAHBwcADA4eEhAMMwADAMA+M48vz0fQ9A13UA9H1P3/f0fU/XdWxtbfH83Hfffbf+wz/8w2/fd999t/72b//299x33323ctV/iGuuuebBL/ZiL/baL/ZiL/Zar/M6r/PePB/r9ZrVasVqteLSpUsArFYrANbrNbZZrVY8kG3m8zn3m8/nzGYz5vM5AMePH+f48eO8IPfdd9+tv/Vbv/Xd//AP//A7//AP//DbXHXVVVdd9b8ZetCDHsRVV1111VX/d1xzzTUPBnixF3ux136xF3ux17rmmmse/GIv9mKvzX+y++6779bf+q3f+u6zZ88+47777rv1H/7hH36bq6666j/cNddc8+AXe7EXe+0zZ8486MVf/MVf+8yZMw++5pprHsx/ovvuu+/Ws2fP3vr3f//3v/0P//APv/MP//APv81V/yXOnDnzoGuuueYh11xzzYNf7MVe7LWuueaaB7/Yi73Ya/Of6L777rsV4Ld+67e+G+C3f/u3v+e+++67lav+S5w5c+ZBL/7iL/46L/ZiL/Za11xzzYNf7MVe7LX5T3bffffd+lu/9VvfDfAP//APv/MP//APv81VV1111VX/l6AHPehBXHXVVVdd9X/fNddc8+AzZ848+Jprrnnwi73Yi70WwDXXXPNggDNnzjwY4Jprrnkwz+W+++67lWc6e/bsrffdd9+t9913360A//AP//A7Z8+evfW+++67lauuuuq/zTXXXPPgM2fOPPiaa655MMCLvdiLvRbANddc8+AzZ848GOCaa655MM/lvvvuu5VnOnv27K0A991336333XffrWfPnn3Gfffdd+s//MM//DZX/Y9y5syZB0nSi73Yi702wIu92Iu9FsA111zzYIAzZ848+Jprrnkwz8d99913K8DZs2dvBbjvvvtuve+++24F+Id/+Iff+Yd/+Iff5qr/cc6cOfOga6655iHXXHPNg1/sxV7stQCuueaaBwOcOXPmwWfPnr31xV7sxV6bB7jvvvtu5QHOnj1763333XfrfffddyvAP/zDP/zO2bNnb73vvvtu5aqrrrrqqv/r0IMe9CCuuuqqq6666qqrrrrqqquuuuqqq6666qr/k6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxX/CF0+uOYuu40cAAAAAElFTkSuQmCC) ```js -fn cube = (length, center) => { +fn cube(length, center) { l = length / 2 x = center[0] y = center[1] @@ -95,25 +95,26 @@ fn cube = (length, center) => { p2 = [l + x, l + y] p3 = [l + x, -l + y] - return startSketchAt(p0) - |> lineTo(p1, %) - |> lineTo(p2, %) - |> lineTo(p3, %) - |> lineTo(p0, %) - |> close(%) - |> extrude(length, %) + return startSketchOn('XY') + |> startProfileAt(p0, %) + |> lineTo(p1, %) + |> lineTo(p2, %) + |> lineTo(p3, %) + |> lineTo(p0, %) + |> close(%) + |> extrude(length, %) } width = 20 -fn transform = (i) => { +fn transform(i) { return { - // Move down each time. - translate: [0, 0, -i * width], - // Make the cube longer, wider and flatter each time. - scale: [pow(1.1, i), pow(1.1, i), pow(0.9, i)], - // Turn by 15 degrees each time. - rotation: { angle: 15 * i, origin: "local" } -} + // Move down each time. + translate = [0, 0, -i * width], + // Make the cube longer, wider and flatter each time. + scale = [pow(1.1, i), pow(1.1, i), pow(0.9, i)], + // Turn by 15 degrees each time. + rotation = { angle = 15 * i, origin = "local" } + } } myCubes = cube(width, [100, 0]) @@ -123,7 +124,7 @@ myCubes = cube(width, [100, 0]) ![Rendered example of patternTransform 2](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAFMv0lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV131v9bnfu7n/taLvdiLvTb/if7hH/7ht7/+67/+fe67775bueqqq6666qqrrrrqfxv0oAc9iKuuuuqqq6666qqr/vf5pm/6pqdfc801D/7RH/1RLl68yH+WD/qgD+K+++679UM+5EMewlVXXXXVVVddddVV/9tQueqqq6666qqrrrrqf6VrrrnmwQB/8Rd/wX+WEydOcNVVV1111VVXXXXV/2pUrrrqqquuuuqqq676X+2TP/mT+c92zTXXPPiaa6558H333XcrV1111VVXXXXVVVf9b0Llqquuuuqqq6666qr/1U6cOMF/tvvuu+9Wrrrqqquuuuqqq67634jKVVddddVVV1111VX/61xzzTUP5pkyk/9MEcE111zzYK666qqrrrrqqquu+t+IylVXXXXVVVddddVV/6vZ5oEk8R/FNlddddVVV1111VVX/a9G5aqrrrrqqquuuuqq/1Nsc9VVV1111VVXXXXVVc9E5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVV/2vZxjYvCkm8ILZ5QWwjiauuuuqqq6666qqr/leictVVV1111VVXXXXV/wu2ueqqq6666qqrrrrq/x0qV1111VVXXXXVVVf9r2YbAElcddVVV1111VVXXXXVc6Fy1VVXXXXVVVddddX/Cba56qqrrrrqqquuuuqq50Llqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VX/q9nmBZHEv4Vtrrrqqquuuuqqq676P4HKVVddddVVV1111VX/Z9nmqquuuuqqq6666qr/1wiuuuqqq6666qqrrvpfzTb/mSQBcN99993KVVddddVVV1111VX/21C56qqrrrrqqquuuup/nfvuu+9WAEkA2Oaqq6666qqrrrrqqqueDypXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrvpfzTbPjyT+PWxz1VVXXXXVVVddddX/elSuuuqqq6666qqrrvo/yTZXXXXVVVddddVVV/2/R3DVVVddddVVV1111f9qtrnqqquuuuqqq6666qoXgMpVV1111VVXXXXVVf/r2eaqq6666qqrrrrqqqueDypXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrvpfzTYviCT+LWxz1VVXXXXVVVddddX/CVSuuuqqq6666qqrrvo/yzZXXXXVVVddddVVV/2/RnDVVVddddVVV1111f9qtrnqqquuuuqqq6666qoXgMpVV1111VVXXXXVVf/r2eaqq6666qqrrrrqqqueDypXXXXVVVddddVVV/2v8bmf+7m/debMmQdz1VVXXXXVVVddddVVLxrK8ePHueqqq6666qqrrrrqf77P/dzP/a0Xe7EXe+3Nzc3jwzAcXywWAAzDwL9EEi8q2zxQ3/fc7x/+4R9+h6uuuuqqq6666qqr/jdBD3rQg7jqqquuuuqqq6666n++n/iJn/CTnvQkHvnIR/JArTX+M5VSALh48SLjON76W7/1W9/9oz/6o5/DVVddddVVV1111VX/GxBcddVVV1111VVXXfW/xh//8R/z1V/91Zw/f577lVIopVBKoZRCKYVSCqUUSimUUiilUEqhlEIphVIKpRRKKZRSKKVQSqGUQimFUgqlFEopAFy8eBGAa6655sHv9E7v9Nkf/uEf/l1cddVVV1111VVXXfW/AcFVV1111VVXXXXVVf+rPPnJT+ZrvuZr+IVf+AX+q5w4cYITJ05wvxd7sRd77dd5ndd5b6666qqrrrrqqquu+p+OylVXXXXVVVddddVV/+ucP3+eX/zFX+RP/uRPeKVXeiXe7M3ejH/JOI7czzbjOHK/YRgAGMeRBxqGgfsNwwDAtddeyzXXXPNgrrrqqquuuuqqq67634DKVVddddVVV1111VX/a50/f54/+ZM/4c3e7M0AuPXWWwEYhgGAcRx5fmzzr2Gb+w3DwObmJlddddVVV1111VVX/a9A5aqrrrrqqquuuuqq/xPGceTw8JCrrrrqqquuuuqqq656AIKrrrrqqquuuuqqq/5Xsc2/lyT+NSRx1VVXXXXVVVddddX/SlSuuuqqq6666qqrrrrqqquuuuqqq6666qr/qwiuuuqqq6666qqrrrrqRSCJq6666qqrrrrqqqv+16Fy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Vw1VVXXXXVVVddddX/S5L415LEVVddddVVV1111VX/q1C56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rgqquuuuqqq6666qr/Fe67775b+Q8miX+tvu8BuO+++27lqquuuuqqq6666qr/6ahcddVVV1111VVXXfW/xqlTp7jqqquuuuqqq6666qp/BYKrrrrqqquuuuqqq/7PkMS/liSuuuqqq6666qqrrvo/i8pVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq/5XO3/+PABd13HVVVddddVVV1111VXPheCqq6666qqrrrrqqv/3JHHVVVddddVVV1111f9JVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rCK666qqrrrrqqquuugqQxFVXXXXVVVddddVV/+cQXHXVVVddddVVV131v8KP/uiPfs4rv/Ir84hHPIL/LJK46qqrrrrqqquuuur/FIKrrrrqqquuuuqqq/5X+Id/+Iffbq3d+jEf8zG86Zu+KS+IJK666qqrrrrqqquuuuqZCK666qqrrrrqqquu+l/hvvvuu/WzPuuzXudHfuRHPvvN3uzN+NzP/VxOnTrFfzRJXHXVVVddddVVV131fwaVq6666qqrrrrqqqv+x7rmmmseDHDmzJkHX3PNNQ8+c+bMg3imU6dO8VEf9VH88R//MS9I13U8UN/3AHRdB0DXdTxQ3/cAdF3H/bquA6Dve+5333333cpVV1111VVXXXXVVf8boAc96EFcddVVV1111VVXXfU/0+d+7uf+1ou92Iu9NsDFixcBuHjxIhcvXuTixYucOHGCl3u5l+N+4zgC0HUd/5m+/uu//n1+67d+67u56qqrrrrqqquuuup/OvSgBz2Iq6666qqrrrrqqqv+5/ncz/3c33qxF3ux1+aZLl68CMBf/MVf8Jd/+ZdcvHgRgNd7vdfjoQ99KA996EN5fi5evMj9Ll68CMDFixcBuHjxIg+0u7sLwMWLF7nfxYsXAXjoQx/KQx7yEB760Idy4sQJ7rvvvlv/4R/+4bd/67d+63v+4R/+4be56qqrrrrqqquuuup/IvSgBz2Iq6666qqrrrrqqqv+5/ncz/3c33qxF3ux1/71X/91HvrQh/LQhz6UB7p48SJ/8Rd/wdOf/nSe9rSn8dCHPpSLFy8CcPHiRf4jnDhxAoATJ05w4sQJjh8/DsDLvdzLceLECe73IR/yIQ+57777buWqq6666qqrrrrqqv9pqFx11VVXXXXVVVdd9T/aX/7lX/Ibv/EbnDhxgoc+9KE85CEP4eVe7uU4ceIEr//6rw/AxYsX+Yu/+AsAnva0p/GiOHHiBCdOnODEiRMcP34cgBMnTnDixAlOnDjBiRMneFF90zd909Pf7u3eTlx11VVXXXXVVVdd9T8Nlauuuuqqq6666qqr/le4ePEif/EXf8Ff/MVf8Bu/8Rs89KEP5aEPfSgv+7Ivy4kTJ3j91399AC5evMjTnvY0/vIv/5KHPOQhAJw4cYITJ04A8NCHPpQX1TiOAIzjyDiODMMAwOHhIQBHR0c89rGP5aqrrrrqqquuuuqq/7GoXHXVVVddddVVV131v87Fixf5i7/4C/7iL/6C3/iN3+D48eM89KEP5WVf9mU5ceIEL/dyL8fLvdzL8cKM48g4jozjyDiO2GYcR8ZxZBxHxnHkqquuuuqqq6666qr/9ahcddVVV1111VVXXfW/2sWLF7l48SJPf/rT+Y3f+A1OnDjB273d2/HQhz6Uo6Mjjo6OADg6OgLg6OiIf4ltXhSSuOqqq6666qqrrrrqfzQqV1111VVXXXXVVVf9j3Tffffd+mIv9mL8a128eJH7nT9/nqOjI2zzryEJANtcddVVV1111VVXXfW/GpWrrrrqqquuuuqqq/7Pk8T9bPOiksT9bHPVVVddddVVV1111f86VK666qqrrrrqqquu+n9FEvezzYtKEgC2uV/XdQDcd999t3LVVVddddVVV1111f9EVK666qqrrrrqqquu+h/NNv9ZJHE/27woJHHVVVddddVVV1111f8aVK666qqrrrrqqquuugqQBIBtXlSSuOqqq6666qqrrrrqfzQqV1111VVXXXXVVVf9nyYJ27yoJHE/21x11VVXXXXVVVdd9b8alauuuuqqq6666qqr/s+TxP1s86KSxP1sc9VVV1111VVXXXXV/zoEV1111VVXXXXVVVf9j3bixAleGNv8a0hCEpL415CEJK666qqrrrrqqquu+l+FylVXXXXVVVddddVV/29J4n62eVFI4qqrrrrqqquuuuqq/zWoXHXVVVddddVVV111FSCJ+9nmRSGJq6666qqrrrrqqqv+RyO46qqrrrrqqquuuur/nN3dXQD6vkcSkvjXkIQkrrrqqquuuuqqq676X4/KVVddddVVV1111VX/49lGEv8ekrifbV4Ukrifba666qqrrrrqqquu+l+HylVXXXXVVVddddVV/+9I4n62eVFI4n62ueqqq6666qqrrrrqfwUqV1111VVXXXXVVVf9j3TffffdCnDixAn+M0kCwDYvKklcddVVV1111VVXXfW/ApWrrrrqqquuuuqqq/5H+od/+Iffue+++259h3d4hwe//uu/Pn/xF3/BX/7lX3Lx4kX+M0jifrZ5UXRdB8DZs2dv5aqrrrrqqquuuuqq/4kIrrrqqquuuuqqq676H+kf/uEffvu3fuu3vhvgxIkTvP7rvz6f+ImfyCd+4ifyeq/3ejyQbV4QSUhCEi8qSUhCEi9M13VcddVVV1111VVXXfU/GpWrrrrqqquuuuqqq/7H+tEf/dHP+e3f/u3vOXPmzINf53Ve571e53Ve571PnDjB67/+6/NyL/dyPO1pT+PpT386f/EXf8GLQhIAtvmXdF0HwGKxoNYKwGKxAGBjY4MH+vu///vf5qqrrrrqqquuuuqq/4nQgx70IK666qqrrrrqqquu+t/hmmuuefCLvdiLvfbrvM7rvNeLvdiLvTbPdPHiRZ7+9KfzF3/xFzz96U/n7d/+7XnZl31Z7r33Xvb393lutVYAuq6j1kqtla7r6LqOWitd1/GiuO+++279h3/4h9/++q//+vfhqquuuuqqq6666qr/iahcddVVV1111VVXXfW/xn333Xcr8Ntnzpx50H333Xfr67zO67w3wIkTJzhx4gQv+7Ivy8WLF7nfYrGg6zoAFosFAIvFgn+L++6779Z/+Id/+O3f+q3f+p5/+Id/+G2uuuqqq6666qqrrvrfAD3oQQ/iqquuuuqqq6666qr/ma655poHv/Zrv/Z7Abz4i7/4a7/Yi73YawNcvHiRixcv8vSnP52LFy/y9Kc/nZd92ZflIQ95CA996EN5UVy8eJGLFy+yu7vLxYsXuXjxIhcvXmR3d5eLFy9y4sQJHvKQh/DQhz6U48eP89CHPhSA++6771aAf/iHf/jtf/iHf/id++6779Z/+Id/+G2uuuqqq6666qqrrvqfCD3oQQ/iqquuuuqqq6666qr/OV7ndV7nvV/ndV7nvV7sxV7stQEuXrzIxYsXefrTn87Fixf5y7/8S16YEydO8LIv+7IAnDhxgosXLwLwtKc9DYCnP/3p/FudOHGChzzkITz0oQ/l+PHjPPShDwXgvvvuuxXgR3/0Rz/nt37rt76bq6666qqrrrrqqqv+p6By1VVXXXXVVVddddX/GC/2Yi/22u/4ju/4Wddcc82DAS5evAjA7u4uFy9e5OLFi/xLLl68yG/8xm/wn+HixYvc78SJEwA89KEP5ZprrnkwwOu8zuu8F8Bv/dZvfTdXXXXVVVddddVVV/1PQOWqq6666qqrrrrqqv8xXuzFXuy1rrnmmgfv7u5y6dIlHvSgBwFw4sQJXvZlXxaAixcvcvHiRXZ3d3na057G05/+dC5evMh/hhMnTnD8+HEe+tCH8pCHPISHPvShPD/r9ZrVasWLvdiLvfbf//3f/zZXXXXVVVddddVVV/1PQeWqq6666qqrrrrqqv9x/uZv/obf/d3f5fjx4xw7dozjx4/zoAc9iAc96EGcOHGCEydOAPCyL/uyAFy8eJGnP/3pXLx4kac97Wk8/elP51/rxIkTHD9+nIc+9KE85CEP4aEPfSjPz3q95tKlS6xWK/b29rh06RIAN998M8eOHeOqq6666qqrrrrqqv9RqFx11VVXXXXVVVdd9T/G2bNnnwFw/PhxAHZ3d9nd3eUZz3gGf/M3fwPAiRMnuOWWWzh+/DgPetCDeNCDHsSJEyc4ceIEAK/3eq8HwMWLF3n605/O0572NC5evMjTn/50HujEiRO87Mu+LAAPechDeOhDH8pzW6/XrFYrLl26xN7eHpcuXeIFmc/nAJw9e/YZXHXVVVddddVVV131PwWVq6666qqrrrrqqqv+V9nd3WV3d5cHOn78OLfccgsPetCDOH78OA960IM4ceIEJ06c4GVf9mUBuHjxIgC7u7s85CEP4flZr9fcd999ANx+++08kG2uuuqqq6666qqrrvpfh8pVV1111VVXXXXVVf/r7e7usru7y9/+7d8CcPz4cQAe9KAH8aAHPYhjx47xoAc9CIATJ04AsF6vue+++wC4dOkSe3t7vDCSsM1VV1111VVXXXXVVf+rULnqqquuuuqqq6666n8V20jihdnd3QXg0qVL/O3f/i0Ax44d48M//MMB+KM/+iPuZ5sXlSRsc9VVV1111VVXXXXV/xoEV1111VVXXXXVVVf9n2Wb+126dInnRxKSeFFJ4qqrrrrqqquuuuqq/zUIrrrqqquuuuqqq666CpDEi0oSV1111VVXXXXVVVf9r0Bw1VVXXXXVVVddddVVzySJF5Ukrrrqqquuuuqqq676H4/gqquuuuqqq6666qr/dWzzn0USLypJXHXVVVddddVVV131PxrBVVddddVVV1111VX/p9nmX0sSLypJXHXVVVddddVVV131PxbBVVddddVVV1111VVXPR+SeFFJ4qqrrrrqqquuuuqq/5EIrrrqqquuuuqqq6666gWQxFVXXXXVVVddddVV/6sRXHXVVVddddVVV131P8Z99913K8Dx48f5zySJF5UkXhSz2QyA++6771auuuqqq6666qqrrvqfguCqq6666qqrrrrqqv+VbPOiss1zk8SLShJXXXXVVVddddVVV/2vRHDVVVddddVVV1111f9bknhRSeKqq6666qqrrrrqqv91CK666qqrrrrqqquu+n9NEi8qSTw/s9mM+XzOVVddddVVV1111VX/41C56qqrrrrqqquuuup/jLNnz976D//wD7/9Yi/2Yq/9GZ/xGezu7vKMZzyDZzzjGezu7vKMZzyD/wySsM2LQhJ933PNNdcAcM011zCbzQD4rd/6re8+e/bsrVx11VVXXXXVVVdd9T8Flauuuuqqq6666qqr/se47777bv2t3/qt7wF4sRd7sdc+fvw4x48f56Ve6qUA2N3d5RnPeAa7u7s84xnP4BnPeAaSeFHY5oWRhG2en9lsxpkzZzh27Bg7Ozs8t/vuu+9WgN/6rd/6nvvuu+9Wrrrqqquuuuqqq676n4LKVVddddVVV1111VX/o/zWb/3Wd//Wb/3Wd19zzTUPBnixF3ux136xF3ux13qxF3ux177mmmsefPz4ce63u7sLwDOe8Qye8Yxn8Ld/+7f8e0ii73tmsxk7OzscO3aMnZ0dntt999136z/8wz/89n333XfrP/zDP/zOP/zDP/w2V1111VVXXXXVVVf9T4Qe9KAHcdVVV1111VVXXXXV/w7XXHPNg1/sxV7stV/sxV7sta655poHv9iLvdhr81x2d3d5xjOewTOe8QwuXbrEM57xDO736Z/+6QD88R//MfebzWacOXMGgJtuuonn57777rv1t37rt74b4Ed/9Ec/h6uuuuqqq6666qqr/regHD9+nKuuuuqqq6666qqr/nc4PDzcPTo62j1z5syDX+zFXuy1Nzc3j1+8eJHHP/7xLJdLTpw4wXw+57rrruNRj3oUL/VSL8VLvuRL8qhHPYrjx4/zoAc9iPvddNNNPOxhD+P6669nZ2eHnZ0dAC5evMhiseB+9913360AW1tbxwE2NzdPPOQhD3npzc3N42fPnr2Vq6666qqrrrrqqqv+J0MPetCDuOqqq6666qqrrrrqf75rrrnmwa/92q/9Xu/0Tu/02QAXL17kN37jN/jLv/xL7nfixAkAHvKQh/DQhz6U48eP89CHPpQX5uLFizz96U/n4sWLPO1pT+PpT386J06cAOD48eOcOHGChz70oQAcP36chz70oTzQfffddyvAP/zDP/w2wG/91m99zz/8wz/8NlddddVVV1111VVX/U+AHvSgB3HVVVddddVVV1111f9M11xzzYNf+7Vf+71e53Ve572vueaaB1+8eJG//Mu/5Dd/8zd5UZ04cYKHPOQhPOQhD+HEiRNcvHiRixcvAvCbv/mb/FucOHECgIc85CEAvOzLviwPechDAPit3/qt7/6t3/qt7/mHf/iH3+aqq6666qqrrrrqqv9uVK666qqrrrrqqquu+h/ndV7ndd77xV7sxV7rdV7ndd4b4Dd+4zd4+tOfztOf/nT+tS5evMjFixf5y7/8S/6jXLx4kRMnTnD8+HFe9mVflhMnTnC/13md13nv++6779Z/+Id/+G2uuuqqq6666qqrrvrvRuWqq6666qqrrrrqqv8x3vEd3/Gz3umd3umzAS5evMhv/MZv8Ju/+Zv8T3LixAle5mVehtd7vdfjfsvlkjvuuIPlcslLvuRLcvbs2Wdw1VVXXXXVVVddddX/BFSuuuqqq6666qqrrvof4cVe7MVe+3Ve53Xemwd46EMfyokTJ7h48SK7u7tcvHiR3d1dLl68yH+1133d1+VlX/ZlOXHiBPdbLpc8+clP5s477wTgxhtv5Kqrrrrqqquuuuqq/1GoXHXVVVddddVVV131P8I7vdM7fdY111zz4L29PXZ2djhx4gQnTpzgIQ95CM/t4sWLADz96U8H4OlPfzoXL15kd3eXixcv8h/lxIkTvMzLvAyv93qvx/2WyyV33nknd955J0dHR1x11VVXXXXVVVdd9T8alauuuuqqq6666qqr/kf55V/+ZW6//XZ2dnY4duwYOzs77OzscOzYMXZ2drj55ps5ceIEACdOnADgZV/2ZbnfxYsXAdjd3eXixYs8/elPB+DixYs8/elP50Vx4sQJXvd1X5eXfdmX5X7L5ZI777yTpzzlKdxPEra56qqrrrrqqquuuup/LCpXXXXVVVddddVVV/2PtLe3x97eHs/Pzs4Okrj55psBuOmmm9jZ2eHYsWOcOHECgBMnTvCQhzyEl33Zl+WBLl68yO7uLhcvXmR3d5eLFy+yu7vLxYsXedmXfVle5mVehhMnTnC/pzzlKdx5550sl0ueH0nY5qqrrrrqqquuuuqq/5GoXHXVVVddddVVV131v87e3h6S+Id/+AcA/uEf/oH77ezsALCzs8OxY8e46aabOHbsGAA33XQTJ06c4MSJEzzkIQ/hBVkul9x555085SlP4aqrrrrqqquuuuqq/9WoXHXVVVddddVVV131v5JtJPHc9vb2ANjb2+OOO+7gH/7hHwCQBMDOzg47Ozvs7Oxw8803A7Czs8NNN90EwN/93d9x55138q8hCdssFguuuuqqq6666qqrrvofhcpVV1111VVXXXXVVf+v7O3tsbe3B8DjHvc4AG666Sbe4R3egQsXLnDnnXfybyGJq6666qqrrrrqqqv+xyG46qqrrrrqqquuuup/FNu8qGzzP4kkrrrqqquuuuqqq676H4Xgqquuuuqqq6666qr/F2xz1VVXXXXVVVddddX/OwRXXXXVVVddddVVV/2PY5sXlW2uuuqqq6666qqrrrrqBSC46qqrrrrqqquuuup/hPvuu+9WgJ2dHf6z2Oa/wn333XcrV1111VVXXXXVVVf9T0Bw1VVXXXXVVVddddVVDyCJq6666qqrrrrqqqv+zyC46qqrrrrqqquuuup/JNu8qGzzorLNVVddddVVV1111VX/b1C56qqrrrrqqquuuuqq5yIJ27yoHv7wh3PjjTeyWCz4rd/6re8+e/bsrVx11VVXXXXVVVdd9T8Blauuuuqqq6666qqr/seyjSReFLaRxH8USdjmBVksFtx44408/OEP53733Xffrf/wD//wO/fdd9+tXHXVVVddddVVV131PwGVq6666qqrrrrqqqv+Rzl27Bj/2WwjiX+JJGzzQIvFghtvvJGHP/zh3O++++679Ud/9Ec/57d+67e+m6uuuuqqq6666qqr/iehctVVV1111VVXXXXV/wj33Xffrffdd9+tr/qqr/rgV33VV+XSpUvs7e1x6dIl7rjjDvb29rh06RJ7e3u8ILaRxH+GxWLBwx/+cG688Ubu91u/9Vvf/aM/+qOfc999993KVVddddVVV1111VX/E1G56qqrrrrqqquuuup/hB/90R/9HIDXeZ3Xee9rrrnmwceOHePYsWPcfPPNvPiLvzj329vbA+D2228H4Pbbb2dvb49Lly6xt7fHi8o2kviXPPzhD+fGG29ksVgAcN999936W7/1W9/927/9299z33333cpVV1111VVXXXXVVf+ToQc96EFcddVVV1111VVXXfU/yzXXXPNggBd7sRd7bYAXe7EXe61rrrnmwWfOnHnwNddc82BegL29PQBuv/12AO644w4uXbrEHXfcwfMjCYCbbrqJd3iHd+DChQv82Z/9GYvFghtuuIGHP/zh3O++++679bd+67e++0d/9Ec/h6uuuuqqq6666qqr/rdAD3rQg7jqqquuuuqqq6666n+HD//wD/+u13md13nvpz/96fzlX/4lAA95yEM4ceIED3nIQ3hh9vb2uHTpEnt7e+zt7bG3t8elS5e48847uemmm3iHd3gHLly4wIULF3j4wx/OC3LffffdCnD27NlbAe67775bAe67775bz549+4zf+q3f+m6uuuqqq6666qqrrvqfAj3oQQ/iqquuuuqqq6666qr/+T73cz/3t17sxV7stf/yL/+Sn/iJn+D5OXHiBAAPechDOH78OCdOnODEiRM85CEP4V/r6U9/Or/xG78BwIkTJ7jf8ePHOXHiBAAnTpwA4Pjx45w4cYJ/+Id/+O0f+ZEf+Zx/+Id/+G2uuuqqq6666qqrrvqfgMpVV1111VVXXXXVVf+jXXPNNQ/+8A//8O96sRd7sdf+jd/4DX7zN3+TF+TixYsAXLx4ked24sQJjh8/zokTJ3jIQx4CwIkTJ3jIQx4CwNOf/nQe8pCH8Bu/8Rv81V/9FRcvXuR+T3/603lh3v/9358TJ07wYi/2Yq/9Oq/zOrf+wz/8w29z1VVXXXXVVVddddX/BFSuuuqqq6666qqrrvof65prrnnwh3/4h3/Xi73Yi732T/zET/CXf/mX/FtdvHiRixcv8vSnP52//Mu/5IFOnDgBwMWLF/nXeru3ezse8pCHAHB0dMRVV1111VVXXXXVVf+jULnqqquuuuqqq6666n+ka6655sHf9E3f9HSA7/iO7+DpT386kvjPsLu7C4Ak/jXe9m3flpd92ZcF4Pd+7/d4zGMew1VXXXXVVVddddVV/6MQXHXVVVddddVVV131P86LvdiLvfY3fdM3Pf3ixYt8x3d8B09/+tP5n+Z1X/d1edmXfVkAfu/3fo9z585x1VVXXXXVVVddddX/OFSuuuqqq6666qqrrvof5XVe53Xe+8M//MO/6+LFi3zHd3wHu7u7/E/zMi/zMrzu674uAL/3e7/HuXPnuOqqq6666qqrrrrqfyQqV1111VVXXXXVVVf9j/GO7/iOn/VO7/ROnw3wHd/xHezu7vI/zcu8zMvwdm/3dgD83u/9HufOneOqq6666qqrrrrqqv+xqFx11VVXXXXVVVdd9T/CNddc8+AXf/EXf22e6eM//uMBuHjxIgC7u7sAXLx4EYDd3V0uXrwIwO7uLgAXL14EYHd3l/8MD3nIQ3i7t3s7AP7iL/6Cc+fOcdVVV1111VVXXXXV/2hUrrrqqquuuuqqq676H+HFXuzFXvvFXuzFXvvw8BCAzc1NAE6cOAHAiRMnAHjIQx7Ci+LixYvcb3d3l4sXLwKwu7vLxYsXud/u7i4AFy9eZHd3lxfkIQ95CO/3fu8HwF/8xV9w22238fzcd999t3LVVVddddVVV1111f8UVK666qqrrrrqqquu+h/l7Nmz/Nmf/Rn329zcBGBjYwNJbGxsALC5ucnGxgYAm5ubAGxubgKwsbHBiRMnuN+JEyd4yEMewovi4sWL3G93d5eLFy8C8LIv+7IAPP7xj+e2227j+dnY2OCqq6666qqrrrrqqv9RqFx11VVXXXXVVVdd9T/CfffddyvA5uYmD3R4eAjA4eEhAJJ4QSRxv42NDe63ubnJxsYGktjY2GBjYwOAjY0NADY3NwHY2NjgxIkT3O/EiRM85CEP4X633XYbT3jCE7jqqquuuuqqq6666n8NKlddddVVV1111VVX/Y9im38r20gC4OjoiPsdHR0BIIkXRhIbGxvcb2Njg42NDR70oAdx+vRpnvGMZ3DVVVddddVVV1111f8qVK666qqrrrrqqquu+l/FNpJ4QWwjiefHNpJ4YY6Ojrjf0dERAA960IO46qqrrrrqqquuuup/JYKrrrrqqquuuuqqq/7Hsc0LY5sXxjYviG1eENs8PxsbGwAsl0uuuuqqq6666qqrrvpfheCqq6666qqrrrrqqv+RbPPC2ObfyjYviG3+LU6fPs3BwcGtv/3bv/09XHXVVVddddVVV131PwXBVVddddVVV1111VX/Y9nmhbHNC2KbF8Y2L4htXhBJPLeNjQ1e4zVeg7Nnz95633333cpVV1111VVXXXXVVf9TEFx11VVXXXXVVVdd9X+Wbf6tbPOi2NjY4I3e6I247777bv3Mz/zM1+Gqq6666qqrrrrqqv9JCK666qqrrrrqqquu+h/NNi+MbV4Y27wgtnlhbPP8SOJ+L/dyL8d9991369d//de/D1ddddVVV1111VVX/U9DcNVVV1111VVXXXXV/3i2eWFs88LY5gWxzQtjmxfkNV7jNTh9+jRf//Vf/z7/8A//8NtcddVVV1111VVXXfU/DcFVV1111VVXXXXVVf8r2OaFsc2/lW3+tV7jNV6D06dP85mf+Zmv8w//8A+/zVVXXXXVVVddddVV/xMRXHXVVVddddVVV131/4JtXhjbvKhe/dVfndOnT/OZn/mZr/MP//APv81VV1111VVXXXXVVf9TUbnqqquuuuqqq6666n+Es2fP3nrffffdes011zz4zd7szbjf4eEhR0dHABweHnJ0dATA4eEhAEdHRxweHgJgG0m8ILaRxAtiG0m8MI9+9KM5ffo09913360v9mIv9lov9mIv9lo/+qM/+jlcddVVV1111VVXXfU/EXrQgx7EVVddddVVV1111VX/M7zYi73Ya3/u537ub/FvdHh4CMDR0RGHh4fc7+joiMPDQwCOjo6QxOHhIUdHRzw/knigN37jN2ZjY4MnPOEJPPrRj+aB7rvvvlt/67d+67t/9Ed/9HO46qqrrrrqqquuuup/GvSgBz2Iq6666qqrrrrqqqv+Z7nmmmse/Dmf8zm/dc011zz4J37iJ7jfiRMnOH78OAAnTpwA4Pjx45w4cYJ/q6OjIwAODw8BODo6AuDo6IijoyMAHvOYx7CxsQHA05/+dL7jO74DgOPHj/PxH//x3Hfffbd+yId8yEO46qqrrrrqqquuuup/GipXXXXVVVddddVVV/2Pc9999916zTXXPBjgr/7qr3hRHT9+HIATJ05w/Phx7veQhzyE+504cYLjx48DcOLECTY2NgDY2NjgX/L0pz+d7/iO7+B+u7u7AFxzzTUP5qqrrrrqqquuuuqq/4moXHXVVVddddVVV131f8bu7i4Au7u7PNBf/dVf8YIcP34cgBMnTgBw/PhxAE6cOMHx48cBOHHiBD/xEz/B7u4uV1111VVXXXXVVVf9r0Llqquuuuqqq6666qr/ca655poHA1y8eJH/bLu7uwDs7u7yb3Hx4kVOnDjBNddc8+D77rvvVq666qqrrrrqqquu+p+E4Kqrrrrqqquuuuqq/3HOnDnzYIDd3V3+p9vd3QXgzJkzD+aqq6666qqrrrrqqv9pqFx11VVXXXXVVVdd9T/ONddc82CAixcvctVVV1111VVXXXXVVf8OBFddddVVV1111VVX/Y8lCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIYnd3V0Arrnmmgdz1VVXXXXVVVddddX/NFSuuuqqq6666qqrrvof58yZMw/if4mLFy8CcObMmQdx1VVXXXXVVVddddX/NFSuuuqqq6666qqrrvof6+LFi1x11VVXXXXVVVddddW/A5Wrrrrqqquuuuqqq/7Hueaaax4MsLu7y/90u7u7AFxzzTUP5qqrrrrqqquuuuqq/2moXHXVVVddddVVV131P9ZDHvIQ/qd7yEMeAsA111zzYK666qqrrrrqqquu+p+GylVXXXXVVVddddVV/2O9zMu8DC/zMi/DVVddddVVV1111VVX/RtRueqqq6666qqrrrrqf5xrrrnmwQCXLl1ivV7zQJL4n+bMmTNcddVVV1111VVXXfU/EpWrrrrqqquuuuqqq/7Huv3229nb2+OFkcR/Fkn8S3Z2djhz5gxXXXXVVVddddVVV/2PROWqq6666qqrrrrqqv/VbPNAkviPYpvnRxJXXXXVVVddddVVV/2vQOWqq6666qqrrrrqqv9TbPNAkviPZpv72eaqq6666qqrrrrqqv+xqFx11VVXXXXVVVdd9X+abR5IElddddVVV1111VVX/b9B5aqrrrrqqquuuuqq/9Fs80CS+PewzXOTxFVXXXXVVVddddVV/ydRueqqq6666qqrrrrqfxXb3E8S/xFs89wkcdVVV1111VVXXXXV/3pUrrrqqquuuuqqq676X8s2DySJ/yi2eW6SeG6z2QyA++6771auuuqqq6666qqrrvqfhuCqq6666qqrrrrqqv9x7rvvvlsBZrMZ/xq2sY1tbPMfzTa2sY1tbHPVVVddddVVV1111f9oVK666qqrrrrqqquu+j/LNg8kiauuuuqqq6666qqr/l+hctVVV1111VVXXXXV/wjXXHPNgwHOnDnz4GuuuebBALaxDYAk/r1s80CSuOqqq6666qqrrrrq/zQqV1111VVXXXXVVVf9t/qmb/qmp19zzTUP5vm45ZZbuOWWW3h+JPE/wWw246qrrrrqqquuuuqq/7GoXHXVVVddddVVV1313+ZzP/dzf+uaa6558MWLF/mrv/orLl68yO7uLgAv8zIvw8u+7Mvyv8E//MM//PbXf/3Xvw9XXXXVVVddddVVV/1PQ+Wqq6666qqrrrrqqv82Z86ceTDAiRMnAPjrv/5r7re7u8tv/dZv8T/Zy7zMy/C6r/u6nDlz5sHXXHPNg++7775bueqqq6666qqrrrrqfxIqV1111VVXXXXVVVf9t3rSk57EIx/5SF72ZV+WW2+9lac//ekA7O7u8j/db/3WbwHwuq/7ug/+nM/5nN/6kA/5kIdw1VVXXXXVVVddddX/JARXXXXVVVddddVVV/23euITn8jP/dzPcfz4cd72bd+W48eP87/Jb/3Wb/Gbv/mbXHPNNQ/+pm/6pqdz1VVXXXXVVVddddX/JARXXXXVVVddddVVV/23OXv27K0AP//zP88f/dEfcfz4cd7v/d6P/21+67d+i9/8zd/kmmuuefA3fdM3PZ2rrrrqqquuuuqqq/6nILjqqquuuuqqq6666n+En//5n+f8+fMcP36ct33bt+V/m7/6q7/iN3/zN7nmmmse/OEf/uHfxVVXXXXVVVddddVV/xNQjh8/zlVXXXXVVVddddVV/z1e53Ve571LKQ/+67/+a5bLJX/zN3/D673e63H99dcDcOutt/K/xWq1Ynd3l8Viwau8yqu89DXXXPPgP/3TP/0Zrrrqqquuuuqqq67670Q5fvw4V1111VVXXXXVVVf993id13md916v1w/+67/+aySxXC45f/48L/3SL82JEye455572N3d5X+L1WrF3XffzfXXX8/LvMzLvPQ111zz4D/90z/9Ga666qqrrrrqqquu+u9COX78OFddddVVV1111VVX/fd4ndd5nfder9cP/uu//mskAXDHHXcA8JIv+ZI85CEP4QlPeALr9RpJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhivV5z6623ct111/EyL/MyLw3wD//wD7/DVVddddVVV1111VX/HQiuuuqqq6666qqrrvof54/+6I940pOexPHjx3nf931f/ic7fvw4x48f58EPfjAv8zIvw+u8zuvwMi/zMuzu7gLwTu/0Tp/9Yi/2Yq/NVVddddVVV1111VX/HahcddVVV1111VVXXfXf5r777ru167pbgQfzAOfPn+d7vud7+NiP/VhOnTrF27zN2/BTP/VT/Fc4fvw4AMePH+fEiRMAHD9+HIDjx49z/PhxTpw4wfHjx3lRvdM7vdNnfeZnfuZvc9VVV1111VVXXXXVfzX0oAc9iKuuuuqqq6666qqr/ntcc801D/6mb/qmp3/3d383f/zHf8xzO336NJ//+Z8PwG/91m/xW7/1W/xrHT9+HIDjx48DcOLECY4fPw7A8ePHOX78OAAPechD+LeYpgmA1hrTNDFNE/drrXHy5Enuu+++Wz/kQz7kIVx11VVXXXXVVVdd9V+NylVXXXXVVVddddVV/23uu+++W3/rt37ru9/iLd7ivZ/85Cdz/vx5Huj8+fN87/d+L+/5nu/Jy7zMy/D0pz+dW2+9lePHjwNw/PhxTpw4wfHjxwE4fvw4x48fB+DEiRMcP36cf61pmgCYpgmAaZporQEwTRPTNAGwXq+5nySen9lsBsDZs2dv5aqrrrrqqquuuuqq/w5Urrrqqquuuuqqq676b/WjP/qjn/NiL/Zir/2xH/uxD/60T/s0ntsf/dEfcfLkSd78zd+c933f9+XfYpompmkCYJompmkCYJomWmsATNPENE08N0m8IJJ4YSRx1VVXXXXVVVddddV/KypXXXXVVVddddVVV/23uu+++279rM/6rNf5pm/6pqe/13u9F9/zPd/Dc/vjP/5jXuVVXoVTp04BME0TAOM40lpjHEcApmlimiYApmlimiYk8YJI4oWRxAsiiRdGElddddVVV1111VVX/bejctVVV1111VVXXXXVf7v77rvv1q//+q9/nw//8A//rvPnz/PzP//zPND58+e532233cY0TQBI4oWRxAsiiRdGEi+IJF4YSVx11VVXXXXVVVdd9T8Clauuuuqqq6666qqr/kf4rd/6re8+c+bMg17/9V//s5/0pCfxpCc9iRdGEi+MJF4QSbwwknhBJPHCSOKqq6666qqrrrrqqv8xCK666qqrrrrqqquu+h/jt3/7t7/nnnvu+e33eq/3AsA2z48kXhhJvCCSeGEk8YJI4oWRxFVXXXXVVVddddVV/6MQXHXVVVddddVVV131P8Z9991369d//de/z6lTp3iv93ov/i0k8YJI4oWRxAsiiRdEEpK46qqrrrrqqquuuup/HIKrrrrqqquuuuqqq/5Hue+++279+q//+vd5lVd5Fd78zd+c5yaJF0QSL4gkXhhJvCCSeEEk8YJI4qqrrrrqqquuuuqq/1ZUrrrqqquuuuqqq676H+e3fuu3vvvMmTMPev3Xf/3PfvKTn8yTnvQkzp8/z6lTp6i1Mk0Tz00S/1aSeEEk8YJIopQCQK2VUgq1VgBqrcxmMwDuu+++W7nqqquuuuqqq6666r8Dlauuuuqqq6666qqr/se55pprHvwP//APv/M6r/M6t77ne77ngz/90z+dfw9JvCCSeG61VgBqrdRaKaUAUGul1grAbDbjRXHffffd+qM/+qOfw1VXXXXVVVddddVV/x2oXHXVVVddddVVV1313+qaa6558JkzZx78Yi/2Yq/14i/+4q/9Yi/2Yq/Nc3nP93xPXhhJvCCSqLUCUGul1gpAKQVJ1FoppVBrpdbKv8V9991369mzZ2+97777br3vvvtu5Zn+4R/+4XfOnj1763333XcrV1111VVXXXXVVVf9d6By1VVXXXXVVVddddV/mWuuuebBr/3ar/1eAC/+4i/+2i/2Yi/22jzA7u4uT3/603n6058OwK233srx48d527d9W55brRWAruuotVJrBaDWSq0VgFortVb+tXZ3dwG4ePEiu7u7XLx4EYDd3V12d3cBuHjxIi/zMi/D677u6wLw93//97/927/9299z33333cpVV1111VVXXXXVVf9ToAc96EFcddVVV1111VVXXfWf7yd+4ifMA+zu7vL0pz+dixcvcuutt/L0pz+dF+R1Xud1eN3XfV3+rXZ3dwG4ePEiALu7u1y8eBGA3d1d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Ln/1V3/F05/+dG699VYk8aKQxP2OHz/OS7/0S/PSL/3SHD9+nPvdeuut/NVf/RV//dd/zX+048eP89Iv/dI85CEP4cEPfjD3G8eRS5cusbu7yziOPDfbvCC2Aei6juPHj3PNNddwv3/4h3/47c/8zM98Ha666qqrrrrqqquu+o+EHvSgB3HVVVddddVVV1111X+sa6655sGv/dqv/V4v/uIv/tov9mIv9to80+7uLr/1W7/FX//1X/MvkcRzO378OMePH+elX/qleemXfmnut7u7y6233spf/dVfceutt/Lvcfz4cV76pV+a13md1+GBzp07xziOXLp0ifvZ5vmxzXPruo7jx49z/Phxuq7jfvfdd9+tv/Vbv/XdP/qjP/o5XHXVVVddddVVV131Hw096EEP4qqrrrrqqquuuuqq/zzXXHPNg9/xHd/xs17ndV7nvXmm3d1dbr31Vv7qr/6KW2+9lRdEEi/I8ePHefCDH8xLv/RL8+AHP5j77e7u8td//dfceuut3Hrrrbwojh8/zku/9Evz2q/92jzQOI5cunSJ8+fPY5vnxzbPj20Auq7j+PHjnDlzhvvdd999t/7Wb/3Wd//2b//299x33323ctVVV1111VVXXXXVfxb0oAc9iKuuuuqqq6666qqr/vNdc801D36xF3ux136d13md93qxF3ux1+aZdnd3+au/+iv++q//mt3dXR5IEi+KEydO8FIv9VK89Eu/NMePH+d+u7u7/PVf/zW//du/zXM7fvw4L/3SL82DH/xgHvzgB3O/cRy5dOkSe3t7jOPIA9nm+bHNA3Vdx7Fjxzh+/Dhd13G/++6779bf+q3f+u4f/dEf/Ryuuuqqq6666qqrrvqvgB70oAdx1VVXXXXVVVddddV/rWuuuebBr/3ar/1er/M6r/Pe11xzzYN5pltvvZW/+qu/4q//+q8BkMSLShIAx48f57Ve67V46Zd+ae63u7vLrbfeyq233sqtt97KS7/0S/Par/3a3G8cR/b29jg6OmK5XAJgm+fHNs+PbU6fPs3m5iYbGxvc77777rv1t37rt777t3/7t7/nvvvuu5Wrrrrqqquuuuqqq/4roQc96EFcddVVV1111VVXXfXf58Ve7MVe+3Ve53Xe63Ve53Xem2fa3d3l1ltv5a/+6q94xjOewYtCEg90/PhxHvzgB/NSL/VSPPjBD+b5GceRvb09zp8/z/Njm+fHNvfruo5jx45x+vRpHui+++679bd+67e++0d/9Ec/h6uuuuqqq6666qqr/rugBz3oQVx11VVXXXXVVVdd9d/vxV7sxV77wz/8w7/rmmuueTAPsLu7y1//9V/z13/91+zu7vKCSOIFOX78OC/1Ui/Fa7/2awNw/vx5Lly4wAPZ5vmxzXPruo6dnR2OHTtG13Xcb3d3l4sXL/KQhzyE+9133323AvzDP/zDb//DP/zD79x33323/sM//MNvc9VVV1111VVXXXXVfwX0oAc9iKuuuuqqq6666qqr/nu94zu+42e90zu902cDPP3pT+e3fuu3eMhDHsLLvMzLcPz4cQB2d3e59dZbufXWW/nrv/5rnh9JvDCf9VmfBcCTn/xknh/bPD+2ATh27BiLxYJjx45xv93dXf7qr/6Kv/qrv2J3dxeA48ePc/z4cU6cOMGDH/xgHvKQh3D8+HHud99999169uzZW++7775b/+Ef/uF37rvvvlv/4R/+4be56qqrrrrqqquuuuo/GnrQgx7EVVddddVVV1111VX/PV7sxV7stT/8wz/8u6655poH7+7u8ld/9Vf81m/9Fvc7fvw4D3nIQ3jwgx/My7zMy3C/3d1dbr31Vv76r/+aW2+9lftJ4oX5rM/6LACe8pSnYJvnxzYP1HUdOzs7nDp1igd6+tOfzl//9V/zV3/1V7wojh8/zkMe8hCOHz/Ogx/8YB7ykIfwQPfdd9+tZ8+evfVHfuRHPucf/uEffpurrrrqqquuuuqqq/4joAc96EFcddVVV1111VVXXfVf65prrnnwa7/2a7/XO73TO302wG/91m/xW7/1W7wwx48f5yEPeQgv/dIvzUMe8hDut7u7y1//9V/z27/92wBI4gX5rM/6LACe8pSnAGCb56fWys7ODjs7O3Rdx/12d3f5q7/6K37rt36L/wjHjx/nIQ95CA9+8IN5mZd5GQB+67d+67u//uu//n246qqrrrrqqquuuuo/AnrQgx7EVVddddVVV1111VX/dd7xHd/xs97pnd7pswF2d3f5yZ/8SW699Vb+NY4fP87LvMzL8Dqv8zrcb3d3l1tvvZW/+Zu/4dZbb+X5+azP+iwAnvKUp3A/29yv6zq2t7c5deoU99vd3eWv/uqv+Ku/+it2d3f5j3b8+HHe933fl+PHj3O/D/mQD3nIfffddytXXXXVVVddddVVV/17Ubnqqquuuuqqq6666r/ENddc8+AP//AP/64Xe7EXe22A3/qt3+K3fuu3+LfY3d3lt37rt/irv/orHvKQh/DSL/3SPOQhD+GlX/qleemXfml2d3f567/+a57xjGdw66238sJ0Xcf29janTp3igXZ3d/mrv/orfuu3fov/LK/zOq/D67zO6wCwWq0AmM/nXHXVVVddddVVV131H4bKVVddddVVV1111VX/6d7xHd/xs97pnd7pswFuvfVWvuu7vgsASfx7XLp0ib/+67/mr//6rzl+/Dgv/dIvzUMe8hAe/OAH89qv/doA7O7u8ju/8zv89V//NfertbKzs8NisWCxWHC/3d1d/uqv/orf/u3f5n6S+I92/Phx3uZt3oYHP/jBADztaU/j6U9/Oo997GO5/vrrueqqq6666qqrrrrqPwx60IMexFVXXXXVVVddddVV/zle7MVe7LU/93M/97cAdnd3+amf+iluvfVW/rMdP36c13md1+GlX/qlud/u7i7Hjx/nue3u7vJXf/VX3Hrrrdx66638Z3vpl35p3uZt3gaA1WrF4x73OC5evAjAYx/7WK6//no+5EM+5CH33XffrVx11VVXXXXVVVdd9e9F5aqrrrrqqquuuuqq/3DXXHPNgz/8wz/8u17sxV7stQF+67d+i9/+7d/mv8ru7i4/9VM/xW/91m/x4Ac/mJd5mZfhwQ9+MA+0u7vLX/3VX/Hbv/3b/Fc4fvw4b/M2b8ODH/xgAC5evMhf/uVf8kDz+Zyrrrrqqquuuuqqq/5DUbnqqquuuuqqq6666j/UO77jO37WO73TO302wO7uLt/1Xd/F7u4u/x12d3f567/+a/76r/+a48ePc/z4cY4fP86tt97K7u4u/1Ue/OAH8z7v8z4ArFYrnv70p3P33XcjCdtcddVVV1111VVXXfWfhspVV1111VVXXXXVVf8hrrnmmgd/zud8zm9dc801D97d3eWv/uqv+O3f/m3+p9jd3WV3d5f/aq/92q/N67zO6wBw8eJF/uqv/ooHkoRtTpw4wYkTJ/iHf/iH377vvvtu5aqrrrrqqquuuuqq/whUrrrqqquuuuqqq676D/Har/3a73XNNdc8GGB3dxeABz/4wdx66638f3T8+HHe533eh+PHjwPw9Kc/nac//ek8t/l8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rrrqqquuuuqqq/7TvNiLvdhrA+zu7vKvtbu7y+7uLvf767/+a57b8ePHOX78OMePHwfgIQ95CADHjx/nwQ9+MFtbWwBsbW1xv4c97GE80MHBAQAHBwccHh5ycHDAwcEBBwcHANx33338az3ykY/kt37rt9jd3eUF2d3d5fjx45w5c+bB9913361cddVVV1111VVXXfWfgcpVV1111VVXXXXVVf/pdnd3kcR/tEuXLnHp0iWe8YxnAPA3f/M3PNDx48cBOHbsGCdOnADgwQ9+MMePHwfgwQ9+MFtbWwBsbW3xghwcHABweHjIwcEBBwcHHB4ecnBwwOHhIQcHB2xtbQGwWCzY3d3ld37nd5DEVVddddVVV1111VX/rahcddVVV1111VVXXfWf5pprrnkwwO7uLv8ddnd3Adjd3eUZz3gGAH/913/NAx0/fhyA48ePc/z4cY4fP87x48c5fvw4AA9+8IPZ2toCYGtri2uvvZZ/yU//9E/zL9nd3QXgmmuuefA//MM/cNVVV1111VVXXXXVfwoqV1111VVXXXXVVVf9v7a7uwvA7u4uL8jx48cBOH78OMePH+f48eMcP36c48ePc/z4cY4fPw7A7u4uv/3bv82tt97Kv2R3dxeAM2fOPIirrrrqqquuuuqqq/6zULnqqquuuuqqq6666j/NmTNnHgSwu7vL/2a7u7sA7O7u8oIcP36c3d1drrrqqquuuuqqq676H4XKVVddddVVV1111VX/aa655poHA+zu7vJ/3e7uLv8au7u7AFxzzTUP5qqrrrrqqquuuuqq/yxUrrrqqquuuuqqq6666r/B7u4uANdcc82Dueqqq6666qqrrrrqPwuVq6666qqrrrrqqqv+w1xzzTUPBjhz5syDX+zFXuy1XuzFXuy1AXZ3d7nqqquuuuqqq6666qr/BlSuuuqqq6666qqrrvo3eZ3XeZ33frEXe7HXuuaaax585syZB19zzTUP5gXY3d3lque0u7sLwJkzZx7MVVddddVVV1111VX/WahcddVVV1111VVXXfWv9jqv8zrv/Tqv8zrv9WIv9mKvDbC7u8vu7i67u7vs7u5y8eJFdnd3eZu3eRsAdnd3ueqqq6666qqrrrrqqv8GVK666qqrrrrqqquu+ld7sRd7sdd6sRd7sdcG+KzP+ixekLd5m7cBQBJXPadLly4BcM011zyYq6666qqrrrrqqqv+sxBcddVVV1111VVXXfXv8jZv8zY8P8ePHwdgd3eXq56/3d1dAK655poHc9VVV1111VVXXXXVfwaCq6666qqrrrrqqqv+1e67775bz507B8CDH/xgnp/jx48DsLu7y1XP3+7uLgDXXHPNg7nqqquuuuqqq6666j8DwVVXXXXVVVddddVV/ybnz5/niU98IsePH+dt3uZteG7Hjx8HYHd3l6uuuuqqq6666qqrrvpvQnDVVVddddVVV1111b/a2bNnn3Hq1Cm+8zu/E4AHP/jBHD9+nKv+dXZ3dwE4c+bMg7nqqquuuuqqq6666j8Dlauuuuqqq6666qqr/tX+4R/+4bdPnz7Nox71KJ74xCfyqEc9itd5ndfhp37qp7jf8ePHAXjwgx/Me73Xe/GCSMI2DyQJ2zyQJGzzQJKwzQNJwjYPJAnbPJAkbPNAkrDNA0nCNg8kCds8kCRs80CSsM0DScI2AMePHwfgzJkzD+Kqq6666qqrrrrqqv8MVK666qqrrrrqqquu+le77777bv2t3/qt737Lt3zL9/6yL/syvuRLvoQHP/jBHD9+nN3dXR7o+PHjHD9+nKtesGuuuebBXHXVVVddddVVV131n4HKVVddddVVV1111VX/Jj/6oz/6Oa/zOq/z3o961KN44hOfyKMe9She53Veh5/6qZ/ige644w7uuOMO7ieJfy1J/GtJ4n62kcQD2UYS/1aS+NeQxHO7/vrrueGGG3id13md9/6t3/qt7/mHf/iH3+aqq6666qqrrrrqqv9IVK666qqrrrrqqquu+je57777bv2t3/qt737Lt3zL9/6yL/syvuRLvoQHP/jBnDhxgt3dXSQBsFwuuXDhAveTxL+FJP41JPGvJYl/DUm8qCTx3E6cOMH9PvzDP/y7PuuzPut17rvvvlu56qqrrrrqqquuuuo/CsFVV1111VVXXXXVVf9mP/qjP/o5p0+f5lGPehR/8Ad/wPHjx3nt135tXhjb/Fewzf8ktnlhrrnmmge/4zu+42dx1VVXXXXVVVddddV/JIKrrrrqqquuuuqqq/7N7rvvvlt/67d+67vf8i3fkp/92Z8F4MEPfjAPfvCDeWFs869lm38t2/xr2OZfwzb/Ef76r/8agNd5ndd573d8x3f8LK666qqrrrrqqquu+o+CHvSgB3HVVVddddVVV1111b/dNddc8+Bv+qZvevp3fud38qhHPYpXe7VX46//+q/Z3d3ltV/7tVkul1z1bJKwDcBisQDgt3/7t9nd3eWt3/qtue+++279rM/6rNe57777buWqq6666qqrrrrqqn8v9KAHPYirrrrqqquuuuqqq/59PvzDP/y7XuIlXuK9v+zLvowv+ZIvYXd3l9/+7d8G4K3f+q256gX77d/+bX77t38bgLd+67fmpV/6pbnvvvtu/ZAP+ZCHcNVVV1111VVXXXXVvxd60IMexFVXXXXVVVddddVV/z5nzpx50Dd/8zff+p3f+Z086lGP4tVe7dX467/+a377t3+bq1643d1d7nf8+HHe+73fm+PHj/OjP/qjn/MjP/Ijn81VV1111VVXXXXVVf8eVK666qqrrrrqqquu+nc7e/bsM37rt37ru9/yLd/yvb/sy76MV3u1V+PBD34wx48f59Zbb+WqF83u7i4//dM/zXu/93vzOq/zOu/993//97/9D//wD7/NVVddddVVV1111VX/VpTjx49z1VVXXXXVVVddddW/36233vo37/iO7/jRt99+O0dHRzzykY/k+PHj/PVf/zVXveh2d3cBeLEXe7HjL/ZiL/bav/ALv/A1XHXVVVddddVVV131b0U5fvw4V1111VVXXXXVVVf9+x0eHu5ec801D37N13zNl/6u7/ou3uAN3oDjx49z6623sru7y1Uvut3dXa677jpuvPHG49dcc82D//RP//RnuOqqq6666qqrrrrq34Jy/Phxrrrqqquuuuqqq676j3Hrrbf+zTu+4zt+9O23387R0RG33HILx48f56//+q+56kW3Wq249dZbeeVXfmUe8pCHvPQ//MM//M7Zs2dv5aqrrrrqqquuuuqqfy2Cq6666qqrrrrqqqv+w9x33323/tZv/dZ3v+VbviU/+7M/C8CDH/xgHvKQhyAJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpcuXeK3f/u3AfjwD//w7+Kqq6666qqrrrrqqn8LyvHjx7nqqquuuuqqq6666t/ummuuefArvuIrvvUrvuIrvtWHf/iHf/eLv/iLv/bGxgYbGxvccccd3HzzzRw/fpy/+Zu/4ap/nUuXLnHddddx4403Hr/mmmse/Kd/+qc/w1VXXXXVVVddddVV/xpUrrrqqquuuuqqq676V7nmmmsefObMmQe/2Iu92Gu9zuu8zntfc801D+YBdnd3ufXWW3n0ox/Nl33Zl/Gqr/qqPPjBD+bBD34wt956K1e96HZ3d/mZn/kZPuqjPorXeZ3Xee9/+Id/+J3f+q3f+m6uuuqqq6666qqrrnpRoQc96EFcddVVV1111VVXXfWCXXPNNQ8+c+bMg1/sxV7stV78xV/8tV/sxV7stXmA3d1d/uqv/gqA3/7t3wbg+PHjfMzHfAx/+Id/yBOf+ETe533eh1tvvZXv+Z7v4ap/vZd+6Zfmrd7qrTh79uwzPvMzP/O177vvvlu56qqrrrrqqquuuupFQeWqq6666qqrrrrqqudwzTXXPPjMmTMPfrEXe7HXevEXf/HXebEXe7HX4gF2d3f5q7/6KwB++7d/m+dnd3eXn/qpn+I1X/M1+dmf/VkAHvzgB/PgBz+YW2+9lav+dW699VZuvfVWHvzgBz/owz/8w7/rMz/zM1+Hq6666qqrrrrqqqteFFSuuuqqq6666qqrrnqWa6655sHf9E3f9HQeYHd3l7/6q78C4Ld/+7d5Ud166628zdu8DW/5lm/Jd33Xd/E+7/M+vNZrvRa33norVz2n48ePA/DgBz+YY8eOAfCQhzwE2zz4wQ/mgc6cOfPga6655sH33XffrVx11VVXXXXVVVdd9S+hctVVV1111VVXXXXVs3zTN33T03mmv/7rv+a3fuu32N3d5d9id3eXn/qpn+I1X/M1+dmf/VkAHvzgB/PgBz+YW2+9lf9Pjh8/DsCDH/xgjh07BsCDH/xgjh8/zvHjx/mX2OZ+11xzzYPPnDnz4Pvuu+9Wrrrqqquuuuqqq676l1C56qqrrrrqqquuuur5evCDH8y/16233srbvM3b8JZv+ZZ813d9F+/zPu/Da73Wa3Hrrbfyf8nx48cBePCDH8yxY8cAePCDH8zx48c5fvw4/xLbANjGNgC2AbCNJABKKVx11VVXXXXVVVdd9a9C5aqrrrrqqquuuuqq53DhwgUATp48yfu8z/vw3d/93ezu7vJvcenSJX76p3+a13iN1+Bnf/ZnAXjwgx/Mgx/8YG699Vb+tzh+/DjHjx/n+PHjHDt2DIAHP/jBHD9+nOPHj/MvsQ1AZmIbANsAZCYAkrifJK666qqrrrrqqquu+g9B5aqrrrrqqquuuuqq53DhwgV+8Ad/kFd8xVfkjd/4jXnv935v/vqv/5rf/u3f5t/i1ltv5a3f+q15y7d8S77ru76L93mf9+G1Xuu1eMYznsH/FMePH+fYsWMcP36c48ePA/CgBz2I48ePc/z4cf4ltgForWEbgNYakshMACTxQJK4nyReEEk8t7Nnz97KVVddddVVV1111VUvCipXXXXVVVddddVVVz3L13/917/Pu77ru37XK77iK/Knf/qnALzxG78xL/3SLw3Ab//2b/Ovtbu7y0//9E/zGq/xGvzsz/4s58+f58EPfjAPetCDeMYznsF/hePHj3Ps2DGOHz/O8ePHOX78OMePH+fYsWMcP36cf0lmAtBawzYArTUykweSxANJ4vmRxHOTBIAkJAEQEQBI4n7/8A//8NtcddVVV1111VVXXfWionLVVVddddVVV1111XM4efIkb/zGbwzAL//yLwPwxm/8xrz2a782AL/927/Nv9att97KW7/1W/OWb/mW/OzP/izv8z7vw1u91VvxtV/7tfxHOH78OMeOHeP48eMcP36c48ePc+zYMY4fP87x48f5l2QmANM0kZlIYpombJOZSOJ+knggSTw/knggSQBIIiIAiAgAIoIX1dd//de/z3333XcrV1111VVXXXXVVVe9KNCDHvQgrrrqqquuuuqqq656tmuuuebB3/RN3/R0gF/+5V/ml3/5l3njN35j3viN3xiAv/7rv+anf/qn+dd66Zd+aV7jNV6DL/uyL+MTPuETOHXqFN/zPd/DM57xDP4lx48f59ixYxw/fpzjx49z/Phxjh07xvHjxzl+/Dj/ksyktYZtWmsAtNbITDITAEncTxL3k8QDSeJ+krifJCQhiVIKAKUUACKCf8nu7i4Au7u73HrrrQDs7u6yu7vLgx/8YF77tV8bgPvuu+/Wz/qsz3qd++6771auuuqqq6666qqrrvqXoAc96EFcddVVV1111VVXXfWcrrnmmgd/zud8zm9dc801D37KU57C13/913Py5Ek+8zM/E4Dd3V2++qu/mn+N48eP89Ef/dH84R/+IU960pN47/d+b3Z3d/nar/1ajh8/zrFjxzh+/DjHjx/n+PHjHDt2jAc/+MG8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o3LVVVddddVVV1317/ThH/7h380z3Xrrrezu7vI/we7uLt/zPd/DR33UR3G/l3qpl+LWW2/lGc94Bi/I7/zO7/DgBz8YgJd8yZfkGc94Ble9YMePH+fYsWM86EEPAuBBD3oQD3rQg3hBbAOQmQDYRhIAkogIHkgS99vd3QXgGc94Bru7u9x6663s7u5y6dIl/rsdP36cl3qpl+KlXuqlOH78OC/Mb//2b3Prrbfy3HZ3d3l+vv7rv/59uOqqq6666qqrrvq3oXLVVVddddVVV13173T27Nlb77vvvluvueaaB7/0S780D37wg/mbv/kbfvu3f5v/bru7u3z3d3837/3e7w3A8ePHeau3eiu+93u/l93dXZ6fS5cucb8HP/jBXHXF8ePHueWWWzh+/DjHjx/n2LFjPOhBD+IFsU1mkplIwjb3K6VQSuEF2d3dBeBv/uZvALj11lt5xjOewf80x48f56Ve6qV40IMexIMf/GD+Jbu7u/z1X/81v/M7v4MkHujBD34w7/Ve78Xzc999993KVVddddVVV1111b8NetCDHsRVV1111VVXXXXVv8c111zz4G/6pm96Os/lr//6r/mZn/kZ/id4rdd6LV77tV+b++3u7vK93/u97O7u8vy853u+Jw9+8IMB+L7v+z6e8Yxn8P/B8ePHAbjllls4fvw4D3rQgzh+/DjHjh3jBclMbNNaQxIAtokIJFFK4QXZ3d1ld3eXZzzjGQDceuutPOMZz+B/uuPHj/NSL/VSvNZrvRb/kt3dXf76r/+av/mbv2F3d5fndvz4cd7qrd6KBz/4wTw/P/IjP/LZP/qjP/o5XHXVVVddddVVV/3boAc96EFcddVVV1111VVX/Xtdc801D/6cz/mc37rmmmsezAPs7u7y13/91/zO7/wO/91e67Vei9d+7dfmfru7u3zt134tz8+DHvQg3uu93guAv/mbv+Hnfu7n+L/k+PHjALzkS74kAA960IN40IMexAuTmWQmrTUiAoDMJCKICEopvCC7u7vs7u7yjGc8A4Bbb72VZzzjGfxvcvz4cV7qpV6K13qt1+Jfsru7y1//9V/zjGc8g1tvvZUX5MEPfjDv9V7vxQvyD//wD7/9mZ/5ma/DVVddddVVV1111b8dlauuuuqqq6666qr/APfdd9+tn/VZn/U6r/3ar/1e7/RO7/TZPNPx48d5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hCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEv8XSUISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISVz1/z3jGMwB4sRd7sdfmqquuuuqqq6666t+G4Kqrrrrqqquuuurf6JprrnkwwKVLl/jPIglJSEISkpCEJCQhCUlIQhKSkIQkJCGJq/7nk4QkJCEJSUhCEpKQhCQkIQlJSEISkvi/7pprrnkwV1111VVXXXXVVf82VK666qqrrrrqqqv+jc6cOfMgnunYsWO8MJK46qr/aWzzP9kznvEMHvSgB3HmzJkHcdVVV1111VVXXfVvQ+Wqq6666qqrrrrq3+iaa655MMBLvuRL8pIv+ZJcddVV/zmuueaaB3PVVVddddVVV131b0Plqquuuuqqq6666t/ommuueTBXXXXVVVddddVVV1111f9klOPHj3PVVVddddVVV131b3Hfffc945prrnnwNddc82Cuuuqq/xT/8A//8Ns///M//zVnz569lauuuuqqq6666qp/PfSgBz2Iq6666qqrrrrqqn+ra6655sFnzpx5ECCekwHxnAyI52RAPCcD4jkZEM/JgHhOBsRzMiCekwHxnAyI52RAPCcD4jkZEM/JgHhOBsRzMiCekwHxnAyI52RAPCcD4jkZEM/JgHhOBsRzMiCekwHxnAyI52RAPCcD4jkZEM/JgHhOBsRzMiCekwHxnAyI52RAPCcD4jkZEM/JgHhOBsRzMiCekwHxnAyI5+SzZ88+47777ruVq6666qqrrrrqqn8b9KAHPYirrrrqqquuuuqqq6666qqrrrrqqquuuur/JCpXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+r+Ec4LuOAukdHAQAAAABJRU5ErkJggg==) ```js -fn cube = (length, center) => { +fn cube(length, center) { l = length / 2 x = center[0] y = center[1] @@ -132,26 +133,27 @@ fn cube = (length, center) => { p2 = [l + x, l + y] p3 = [l + x, -l + y] - return startSketchAt(p0) - |> lineTo(p1, %) - |> lineTo(p2, %) - |> lineTo(p3, %) - |> lineTo(p0, %) - |> close(%) - |> extrude(length, %) + return startSketchOn('XY') + |> startProfileAt(p0, %) + |> lineTo(p1, %) + |> lineTo(p2, %) + |> lineTo(p3, %) + |> lineTo(p0, %) + |> close(%) + |> extrude(length, %) } width = 20 -fn transform = (i) => { +fn transform(i) { return { - translate: [0, 0, -i * width], - rotation: { - angle: 90 * i, - // Rotate around the overall scene's origin. - origin: "global" + translate = [0, 0, -i * width], + rotation = { + angle = 90 * i, + // Rotate around the overall scene's origin. + origin = "global" + } } } -} myCubes = cube(width, [100, 100]) |> patternTransform(4, transform, %) ``` @@ -165,19 +167,19 @@ h = 10 // layer height t = 0.005 // taper factor [0-1) // Defines how to modify each layer of the vase. // Each replica is shifted up the Z axis, and has a smoothly-varying radius -fn transform = (replicaId) => { +fn transform(replicaId) { scale = r * abs(1 - (t * replicaId)) * (5 + cos(replicaId / 8)) return { - translate: [0, 0, replicaId * 10], - scale: [scale, scale, 0] -} + translate = [0, 0, replicaId * 10], + scale = [scale, scale, 0] + } } // Each layer is just a pretty thin cylinder. -fn layer = () => { +fn layer() { return startSketchOn("XY") - // or some other plane idk - |> circle({ center: [0, 0], radius: 1 }, %, $tag1) - |> extrude(h, %) + // or some other plane idk + |> circle({ center = [0, 0], radius = 1 }, %, $tag1) + |> extrude(h, %) } // The vase is 100 layers tall. // The 100 layers are replica of each other, with a slight transformation applied to each. @@ -187,4 +189,26 @@ vase = layer() ![Rendered example of patternTransform 4](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAOMtklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV131P9Y111zzYJ7pzJkzD+aZrrnmmgfzAGfOnHkQL8A111zzYP4F99133608H2fPnn0GD3DffffdyjOdPXv2Vp7pvvvuu5Wrrrrqqquuuuqqq/4nQg960IO46qqrrrrqqquuuuo/1zXXXPNggDNnzjz4mmuuefCZM2cexDNdc801D77mmmseDHDmzJkHX3PNNQ/mX+Ev//Ivud/Zs2dv3d7efjD/DvP5nAd62Zd9WV6Y++6779ZrrrnmwQD33XffrQBnz569FeC+++67FeC+++679ezZs88AuO+++24FOHv27K333XffrVx11VVXXXXVVVdd9Z8JPehBD+Kqq6666qqrrrrqqn+7a6655sFnzpx58DXXXPPgM2fOPAjgxV/8xV8b4MVe7MVemxfgD//wD7nfpUuX2NvbA+DSpUsA7O3t8a8hif9Kkrjfzs4O99vZ2QHg2LFjAOzs7LCzs8OZM2duveaaax7Mc7nvvvtuBTh79uyt991336333XffrWfPnn3Gfffdd+vZs2dvve+++27lqquuuuqqq6666qp/K/SgBz2Iq6666qqrrrrqqqteuGuuuebBZ86cefCLvdiLvRbAi7/4i7/2mTNnHnzNNdc8mAf4y7/8S1arFZcuXWJvbw+A22+/nf8skvivIon/aDs7OwDs7Oxw7NgxdnZ2mM1mvOzLviwPdN999936D//wD78N8A//8A+/c99999169uzZW++7775bueqqq6666qqrrrrqhUEPetCDuOqqq6666qqrrrrqimuuuebBZ86cefCLvdiLvRbAi7/4i7/2i73Yi702z/SXf/mXLJdL9vb2uHTpErfffjuS+K8iif9KkvivJInntrOzw87ODjs7O+zs7DCbzXjZl31ZAO67775bAf7hH/7ht//hH/7hd+67775b/+Ef/uG3ueqqq6666qqrrrrqfuhBD3oQV1111VVXXXXVVf9fXXPNNQ9+7dd+7fe65pprHvw6r/M67w2wu7vL05/+dI6Ojrj99tu5/fbbeSBJ/FeSxH8VSfxXksS/x87ODjs7O+zs7PBGb/RG3O++++679R/+4R9++x/+4R9+57777rv1H/7hH36bq6666qqrrrrqqv+f0IMe9CCuuuqqq6666qqr/r+45pprHvzar/3a7/XiL/7ir/1iL/Zir80z/cEf/AG33347t99+O8+PJP6rSOK/kiT+K0niP9POzg47Ozvs7OzwRm/0RgDcd999t549e/bWv//7v//tf/iHf/idf/iHf/htrrrqqquuuuqqq/5/QA960IO46qqrrrrqqquu+r/sxV7sxV77xV7sxV7rnd7pnT4b4Dd/8zeZzWb84R/+IS+IJP4rSeK/kiT+K0niv5IkHmhnZ4ebbrqJM2fO8DIv8zLcd999t/7DP/zDb//Wb/3W9/zDP/zDb3PVVVddddVVV131fxd60IMexFVXXXXVVVddddX/Nddcc82DX/u1X/u9Xud1Xue9r7nmmgf/wR/8Abfffju33347L4gk/qtI4r+SJP6rSeK/kiReVDs7Ozz2sY/llV/5lbnvvvtu/Yd/+Iff/tEf/dHPue+++27lqquuuuqqq6666v8W9KAHPYirrrrqqquuuuqq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t3mgnZ0dAHZ2dnigvb09APb399nb2+O+++4D4LVe67W4397eHgB33nkne3t7ANx5553ceeed/Et2dnbY3t7mpptu4tGPfjQ7Ozvs7e3xV3/1V7zWa70Wd955J49//ON5whOewP22t7d5/dd/fba3t9nZ2eFP//RP2dvb4/Vf//X5qq/6qu/+/d///ffhqquuuuqqq6666v8n9KAHPYirrrrqqquuuuqq/69e53Ve571vvvnm73qd13kdfuzHfozHPvaxvNiLvRh/9Vd/xcu8zMtwxx138Md//Mfs7e3xQI997GO56aabeOxjH8ve3h5Pf/rTOXXqFDfddBN7e3vccccd3HHHHezt7XHHHXcAIIl/yc7ODgA7Ozvs7OwAcOONNwKws7MDwM7ODjs7OzzQ7u4ux48f5z/S7u4ux48f5357e3vcb39/n729Pfb29gDY399nb2+P/f199vb2+NfY2dnhxhtvZHt7m5tuuokbb7yRvb09/uqv/ord3V1e53VehzvvvJP9/X3+9E//lAfa3t7mMY95DK/4iq/I7/zO7/AyL/My/Omf/ilPeMITeM/3fE9+67d+i9tvv/19fuu3fuu7ueqqq6666qqrrvr/icpVV1111VVXXXXV/2Mv9mIv9lqv8zqvwx133ME7vMM78B3f8R087nGP47GPfSw7OzucPXuW933f9+Vxj3scj3vc47jjjjsAeNzjHsfjHvc4/viP/xiAxz72sdxvZ2eHcRx57GMfy0033cTe3h57e3vs7e1x5513sre3xx133MHzs7e3B8De3h73e9zjHscLsrOzA4Aktre3eaCdnR3+Nfb29nig/f19APb29pDEv9fOzg4Aj370owG46aabuPHGGwHY29vjr/7qr7jxxhu532Kx4MKFC3zv934vz217e5tXfMVX5DGPeQy/8zu/A8BiseB7v/d7AXibt3kb9vf3eau3eit+5Ed+5EFcddVVV1111VVX/f9F5aqrrrrqqquuuur/sfvuu+9WgJtuuom9vT3e7/3ejx/7sR/jj//4j3nc4x7HYx/7WADOnj3L27/927O3t8fjHvc47rjjDu644w729vYA+OM//mMAdnZ22NnZYWdnh67r2NvbY2dnh52dHf7mb/6GxzzmMezs7LCzs8Pe3h57e3vs7e1x5513ArC3t8fe3h57e3u8KPb397nf3t4eD3TnnXfyH0ESL6qdnR0AbrzxRra3twG46aabuPHGGwHY29tjf3+fpzzlKdx4440A7O3tsb+/z3w+5yd/8ie56667eH62t7d5zGMew6Mf/WgA/uqv/orHPOYxLBYLvud7vof9/X22t7d5/dd/fQBuvPFGAK655poHc9VVV1111VVXXfX/F5Wrrrrqqquuuuqqq3jc4x7HTTfdxF/91V/xDu/wDvzDP/wDf/Inf8Kf/Mmf8PjHP57HPvax7O3tsbOzw87ODm//9m/P3t4ej3vc47jjjju44447ANjb22Nvbw+Axz3ucQDs7Oxw7NgxdnZ26LoOgJ2dHXZ2dtjZ2eF3fud3uPHGG9nZ2eGmm27ifnt7e+zt7bG3twfA3t4e+/v7AOzt7QGwv78PwN7eHv/RJLGzswPA9vY2ADs7O2xvb3O/m266CYDt7W12dnYA2NvbA+DOO+/kvvvu48Ybb+SB9vb2mM/n/ORP/iR33nknDySJB9re3uYxj3kMj370o9nZ2eHOO+9kZ2eHvb09FosFX//1X8/9brzxRt7mbd6GW2+9lZMnT/L4xz+exzzmMVx11VVXXXXVVVf9P4ce9KAHcdVVV1111VVXXfX/1TXXXPPgb/qmb3r63t4eP/ZjP8arvMqrcPbsWV7rtV6Lxz3ucfzxH/8xe3t73O+mm27isY99LI997GP52Z/9WR7+8Ifz2Mc+lr29Pe644w7uuOMO9vb2uOOOO7ifJJ6fnZ0ddnZ22NnZ4cYbbwRgZ2eHnZ0ddnZ2eKDf+Z3f4fjx43Rdx87ODgA7Ozvs7Ozw3Pb29nh+9vb2eKCdnR2e287ODs/P3t4eAPv7+wCcO3eO3d1dXuu1XosH2tvbA+DOO+9kb28PgDvvvJM777yTF0YSANvb2zzmMY8B4BVf8RXZ29tjf3+fpzzlKbzMy7wMT3jCE7jzzju58847ud/29jav+IqvyI033shf/dVf8fCHP5yf+qmf4j3f8z3Z2dnh67/+69/nt37rt76bq6666qqrrrrqqv+f0IMe9CCuuuqqq6666qqr/r96ndd5nfdurX3X+7zP+/AP//APPO5xj+Oxj30sr/Iqr8Lv/M7v8DIv8zLccccd/PEf/zF7e3vcb2dnh52dHR772Meys7PDTTfdBMAdd9zBTTfdxN7eHnfccQd33nkne3t73HHHHfxr7OzsALCzs8POzg4A29vb7OzsALCzswPAzs4OAJnJAx0/fpx/i93dXe536dIlTpw4AcD+/j4Ae3t77O3tcb/9/X329vbY399nb2+Pf42dnR0AHvOYx7C9vc1jHvMYAPb29virv/orXuZlXgaAJzzhCdx5553ceeedPND29jaPecxjeMVXfEV+53d+h9d6rdfiT//0T/nTP/1TXvEVX5FHP/rRfNVXfRX33HPPQ+67775bueqqq6666qqrrvr/icpVV1111VVXXXXV/2P33XffrZ/7uZ/L93zP9/Be7/VeAPzxH/8xj3vc43ixF3sxdnZ2AHj7t3977rjjDh73uMdxxx13sLe3x97eHnfccQcAOzs73HTTTdx0000A7Ozs8NjHPhaAV3qlV2JnZ4e9vT3uuOMO7rzzTgD29va44447eH729vYA2Nvb4/mRxAuys7PD87O9vc0D7e/v89z29vYAkMR/pJ2dHba3t7nxxhvZ2dlhZ2eHG2+8kb29Pfb397nxxhsB2NvbY39/n8ViwU/91E+xv7/Pc9ve3uYVX/EVecxjHsOf/umfArBYLPj6r/96AB796Efziq/4inzP93wPn/VZn8XXf/3Xv/Z999333Vx11VVXXXXVVVf9/0Tlqquuuuqqq6666v+xF3uxF3utvb093uZt3gaAV3mVV0ESf/zHf8wf//Ef87jHPY7HPvax7OzscPbsWd7+7d+evb09Hve4x3HHHXdwxx13ALC3t8fjHvc4Hve4x/Grv/qr7OzscNNNN3HTTText7fHzs4OOzs7POUpT+HhD384Ozs73HTTTezt7QGwt7fH3t4ed955JwB7e3vs7e2xt7fHA0niX7K3t8fzs7e3x4tCEv9aOzs7ANx4441sb28DcNNNN7G9vc3Ozg57e3sA3Hnnndx3333ceOON3O/OO+/kzjvv5M477+TOO+/k+dne3uYxj3kMj370owH4q7/6Kx7zmMcA8D3f8z3s7+8D8Iqv+Iq84iu+IgCv//qvD8B99913K1ddddVVV1111VX/f6EHPehBXHXVVVddddVVV/1/9WIv9mKv/b7v+76/VWvl9ttv51Ve5VXY29sD4Md//MfZ29sDYGdnh8c+9rE89rGP5bd/+7d5+MMfzmMf+1j29vZ43OMexx133MEdd9zBA0nifjs7OwDcdNNN3Hjjjezs7LCzs8POzg4AP/uzP8uDHvQguq5jZ2eHm266ifvt7e0BsLe3x/7+PgB7e3vs7e0BsLe3x/329/e5397eHv8ax44d44G2t7cB2NnZAWB7exuAnZ0ddnZ2ALjxxhu5397eHgB33nkn9913HwCv9VqvBcDe3h77+/vccccdANx5553cddddvDDb29s85jGP4dGPfjQ7Ozvceeed3Hjjjezt7fGEJzyBP/3TP+V+29vbvP7rvz7b29sA/Omf/imPecxjuOuuu279kz/5k8/5rd/6re/mqquuuuqqq6666v8n9KAHPYirrrrqqquuuuqq/69e53Ve570//MM//Lv29vb4lV/5FQDe6I3eiL/6q7/iZV7mZXjc4x7HH//xH/NAN910E4997GN57GMfy8/+7M/y8Ic/nMc+9rHs7e1xxx13cOedd7K3t8cdd9zBv2RnZweAm266CYAbb7wRgJ2dHXZ2dtjZ2eG5/c3f/A193wOwvb0NwM7ODgA7Ozv8R9jb2+N++/v7AOzt7XHffffxWq/1Wjy3vb09APb397njjjsAuPPOOwG48847eW6SeG7b29s85jGPAeAVX/EV2dvb4wlPeALL5ZKXeZmX4QlPeAJ33nknd955Jw/0iq/4irziK74if/M3f8Pp06f50z/9UwDe5m3eBoDP/MzPfJ1/+Id/+G2uuuqqq6666qqr/n9CD3rQg7jqqquuuuqqq676/+od3/EdP+ud3umdPvtv/uZveMhDHsJ3fMd3cOzYMW666SZe+ZVfmb29PXZ2dnjc4x7HH//xH/NAOzs77OzscNNNN3HTTTdx0003AXDHHXdw0003sbe3x97eHnfccQd33nknd9xxB/8WOzs77OzsALCzswPAzs4OOzs7AGxvbwOwv7/PjTfeyP12dnb419jb2+OB9vf3Adjb2wNgb28PgP39ffb29gDY399nb2+PF5UkALa3t9nZ2eHGG2/kxhtv5MYbb2Rvb4/9/X1uvPFGAPb29njCE57AnXfeyZ133skDbW9v85jHPIZXfMVXZG9vj52dHf70T/+UP/3TPwXgbd7mbTh79iw33HDDrb/1W7/13T/6oz/6OVx11VVXXXXVVVf9/0Tlqquuuuqqq6666v+xa6655sEAL/VSL8Udd9zB+73f+/Gd3/mdPO5xj+OOO+7gDd/wDdnZ2eGmm27ifd/3fbnjjjt43OMexx133MHe3h57e3vccccdAOzs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j388e3t7PLe9vT3+5E/+BICdnR3W6zX7+/sA7OzssLOzw87ODjfeeCN7e3vs7+9zxx13cOedd7K/v8/e3h4vCkns7+8DsL+/z/2e8IQn8C/Z3t4GYGdnh+dHEi/M3t4e99vf3+dFJYl/re3tbba3t7nxxhu54YYbuPHGGwHY399ne3sbgP39ffb391ksFuzv7/P93//9vDDb29s86lGP4hVe4RXY399ne3ub/f19FosF3//9389z297e5nVf93XZ3t4GYHNzk5/92Z/lftvb27zO67wOv/M7v8Px48c5OjriUY96FABPfOIT2d7eBuCRj3zkg1/ndV7nvX/rt37ru7nqqquuuuqqq676nwU96EEP4qqrrrrqqquuuup/ms/93M/9rRd7sRd7bYA//uM/BuCVX/mVedzjHsev/uqvAvCGb/iGjOPIQx7yEH7iJ36Cvb097vfYxz6WN3iDN+COO+5gZ2eHxz3ucfzJn/wJDySJnZ0dbrzxRh7zmMfwl3/5l7zsy74sN910E3fccQePf/zjefzjH8+/5NixYwDceOON3Hjjjdx4443s7Ozwcz/3czz84Q9nZ2eHG2+8kb29Pfb399nb2+POO+9kb2+P/f199vb2uJ8k/rNI4j+DJF6Y7e1ttre3ufHGGwG44YYbuPHGGwHY399nb2+Ppz71qbzma74m+/v77O3tcdddd3HnnXdy991386J4+Zd/eXZ2dnjUox7F/v4+v/Vbv8XrvM7r8IQnPIE///M/5/l59KMfzeu8zutw1113sb29zW/91m9x1113cb/t7W1e53Veh3EcOXv2LH/+538OwOu8zuvwqEc9iic+8Yns7+/z8i//8gDcd999t37Ih3zIQ7jqqquuuuqqq676n4XKVVddddVVV1111f8wL/ZiL/baN95442vfcccd3HTTTQA87nGP47777uO1X/u1ud8f//Ef84Zv+Ibs7e3xdm/3dvzET/wEe3t7ADzucY/jjjvu4A3e4A3467/+a17zNV+Txz72sfzar/0ad9xxB5IA2NvbY29vj8c//vHs7Oywv78PwNOe9jRe6ZVeiVd6pVfizjvv5I477uDxj388z00Se3t7AOzt7fH4xz8egJ2dHW688UYeaGdnh9/5nd/hQQ96EI95zGO48cYbAdjb2wPgzjvvBODOO+8EYH9/n729Pfb39/n3ksR/Bkls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v/zLs7+/z+/+7u/y8Ic/nOPHj/MXf/EXPLe3eIu3YHt7G4A///M/5y/+4i+43w033MANN9wAwG//9m8D8KhHPQqAr/u6r+NVXuVVuN+LvdiLvTZXXXXVVVddddVV/7XQgx70IK666qqrrrrqqqv+q7zO67zOe3/4h3/4d/FMf/zHf8wdd9zBIx7xCB7ykIfwnd/5nUjisY99LMvlktd+7dfm137t17jjjju430033cTbvd3bsbe3B8Cv/dqvceedd/LcHvOYx/CYxzyGv/qrv+K1Xuu1AHj84x/P4x//ePb29nh+JLGzs8ONN97IjTfeyGMe8xgAHv/4x/OYxzyGvb097rzzTu6880729va48847eX4k8S/Z3t5mZ2eH7e1t9vf3efSjH83Ozg4AN954IwDf//3fz/Hjxzl27BjHjh0D4NSpUwDs7OwAsL29zQuyv7/Pi2J7e5sXZH9/H4C9vT0Azp8/z6VLlwC4dOkSu7u7vPu7vzv7+/sA7O3tcXBwwN7eHvv7++zv73PXXXfx77G9vc2jHvUobrzxRm644QYA7rrrLm644Qb29/fZ39/nrrvu4s///M95Yba3t3nUox7Fy7/8y7O/v8/29jb7+/v8+Z//OU960pN4btvb27zFW7wFANvb2/zcz/0cd911F/e74YYbeIu3eAu+93u/lxMnTnDXXXcB8K7v+q487WlP47bbbuORj3wkj3rUo7jf13/917/Pb/3Wb303V1111VVXXXXVVf810IMe9CCuuuqqq6666qqr/qt80zd909OvueaaB//N3/wNL/VSL8Udd9zBj//4j1NK4SM+4iP4tV/7NR73uMcB8Eqv9EoMw8BLv/RL82u/9mvccccd3G9nZ4e3e7u346//+q956Zd+aR7/+MfzJ3/yJzw/j3nMY3jMYx7DX/3VX/EyL/My7OzscOedd/K4xz2OO++8EwBJPD87Oztsb2/zmMc8hp2dHW688UYA7rzzTm688Ub29va488472dvb48477+TOO+9EEv8Rtre3AdjZ2WF7extJbG9vs7Ozw6VLl9je3uZ+29vbHD9+nO3tbf4j3H777dxvf3+f/f19ACKC++3v77O3t8f+/j77+/vcTxL/Htvb2wA86lGP4sYbb+SGG24AYH9/n+3tbQD29/d54hOfyF133cVdd93Fv2R7e5tHPepRvPzLvzz7+/v81V/9FS/zMi/Dn//5n/PEJz4RSTy3l3u5l+PlX/7l+d3f/V1e5mVehp/7uZ9jf3+f+91www28xVu8Bb/7u7/LxsYGf/EXfwHAox71KF77tV+b7/3e72W5XPLar/3aPOpRj2J3d5fjx49z33333fohH/IhD+Gqq6666qqrrrrqvwaVq6666qqrrrrqqv8i11xzzYOvueaaBwOcOnUKgJ2dHQAe9ahHAfBKr/RKPO5xjwPg8Y9/PI95zGP467/+a97gDd6AX/u1X+OOO+4AYG9vj5/4iZ/gMY95DDs7OzzmMY/hMY95DI9//OP5kz/5Ex7o8Y9/PI9//OPZ2dlhf3+fn/7pn+Y1X/M1ebu3ezv29vZ4/OMfzxOe8AT29vZ4bnt7e+zt7XHnnXcCsLOzw4033siNN94IwI033sjOzg533nknr/RKrwTA3t4ed955J3feeSf7+/vceeed/Fvs7+8DsL+/jyT+Lba3t3lBJHG//f19/iNI4l9je3ub7e1tbrjhBgBuvPFGbrjhBvb399nf3+eGG24AYH9/n7vuuov9/X3+/M//nBfF9vY2j3rUo3jUox4FwF/91V/x9V//9bzt274tu7u7/MAP/AAAknigG264gdd+7dfmfhsbG/zgD/4gD3TDDTfwFm/xFvzN3/wND3/4w/m5n/s57vfar/3a7O/vc+LECVarFTfccAP7+/scHR1x/Phxrrnmmge/+Iu/+Gv//d///W9z1VVXXXXVVVdd9Z8PPehBD+Kqq6666qqrrrrqv8I7vuM7ftY7vdM7fTbA4x73OJ7ylKfwlm/5lvz4j/84d9xxB7VW3vqt35q9vT1+7dd+DYCdnR0e85jHMAwDL/3SL83jHvc4/uRP/oQH2tnZ4Q3e4A142tOexmu+5muyt7fHr/3ar3HnnXfy/Ozs7PCYxzyGP/uzP+NBD3oQL/uyL8uNN97InXfeyeMf/3ge//jH86La2dnhxhtv5MYbb2RnZ4cbb7yRn//5n+eWW27h1KlT3HjjjQDs7e2xv7/P3t4ed955J/v7++zt7bG/v8+/RBL/0STxH00SL8j29jbb29vccMMNANx4443ccMMNAOzv77O/v89Tn/pULl26xJu/+Zuzv7/PE57wBAD+/M//HEm8KLa3t3nUox7FDTfcwA033MD+/j5/9Vd/xe/93u/xRm/0RjzxiU9kf38fAEk80Pb2Nq/92q/NDTfcwO/+7u/yMi/zMvz2b/82d911Fw90ww038BZv8Rb87u/+Lg9/+MP5uZ/7Oe73Fm/xFmxvb/PVX/3VXHvttTzykY/ktV/7tfmd3/kdrr/+eh75yEcC8CM/8iOf/aM/+qOfw1VXXXXVVVddddV/PipXXXXVVVddddVV/0Ve53Ve5715gGc84xkAPPaxj+WOO+5gc3OTm266CYC9vT3+5E/+hL29Pf7kT/6EV3qlV2JnZ4dXfuVXBuBP/uRPAJDE/v4+v/7rv85jHvMY9vb2+Ou//mve7u3ejsc//vE87nGP48477+SB9vb2+JM/+RN2dnaYz+fs7e1x44038tSnPpXHPOYxvOIrviL7+/vccccd3Hnnndx55528IHt7e+zt7fH4xz8egJ2dHQDm8zld1wFw44038rM/+7McP36cW265hcc85jFsb2+zs7PD3t4eAPv7++zt7bG/v8/e3h77+/vs7e1xcHDAfzRJ/Efa3t5GEtvb22xvb7O9vQ3AjTfeyPb2Ntvb2wDs7++zv7/PuXPneOpTn8pv/uZv8lZv9VYA3Hnnnczncy5cuMA3fdM38UCSeGG2t7d51KMexQ033MANN9zA/v4+f/VXf8UNN9zAXXfdRWuNU6dO8ed//ufcTxL3297e5uVe7uV41KMexe/+7u8CsLGxwQ/+4A/y3F7u5V6Ol3/5lwfg2muv5ed+7ue436Me9ShuuOEGAB7+8Iezv7/PDTfcAMDv/u7v8k7v9E7c73Vf93Xf50d/9Ec/h6uuuuqqq6666qr/fFSuuuqqq6666qqr/gu8zuu8zntfc801D97d3eX48ePs7OywubnJ3/zN3/CQhzwESezt7fFrv/ZrLJdLXvu1X5s777yTO+64A4A/+ZM/AeDP//zPec/3fE8e+9jH8pM/+ZPs7e0BsLe3x5/8yZ/w+Mc/nsc85jEAnD17lrd7u7fj8Y9/PI973OO48847eaC9vT329/d5whOewJ/+6Z9y4403sre3x4033sjf/M3f8NCHPpRXeqVXYm9vjzvvvJPHP/7x3Hnnnbwgktjf3wfgCU94Ak94whO43/b2NuM4ct9999F1Hffb2dkBYGdnh/Pnz7O9vc2NN97I9vY2Ozs7AOzv7wOwt7cHwP7+PgB7e3vs7+9zv/39fR5ob2+P5yaJF2R7e5sH2tnZAWB7e5v7bW9vs729DcDOzg7b29vcb39/H4D9/X2e+tSncsMNN3C//f199vf3ufPOOwG4cOEC+/v7fP/3fz8vjCSe2/b2Ntvb29xwww086lGPYnt7m/39ff7qr/6KG264gf39fTY2Nvjmb/5mnh9JAGxvb/PyL//yPPKRj+R3f/d3edSjHsXGxgY/93M/x3Pb3t7mtV/7tdne3ub7vu/7uPnmm3niE5/I/W644QZe+7Vfm+/7vu/j+PHj7O/vA/DIRz6Sv/mbv+HhD384D3TmzJkHvdiLvdhr/8M//MNvc9VVV1111VVXXfWfCz3oQQ/iqquuuuqqq6666j/bh3/4h3/X67zO67w3z7S3t8d3fud3Umvlwz/8w3nc4x7Hr/3arwHwSq/0SgzDwEu/9Evza7/2a9xxxx3cb2dnh7d7u7fjr//6r3npl35pHv/4x/Mnf/InPLednR0e85jH8Gd/9me85Eu+JK/5mq/J3t4ej3/84/mTP/kTACTx/Ozs7HDjjTdy44038pjHPAaAv/3bv+XBD34wAPv7+9xxxx3ceeed3HnnnUji32p7exuAnZ0dtre3ufHGGwHY2dlhe3ubnZ0dAPb399ne3gbgb//2bzl27BgAJ0+e5H7b29v8R9vf3wfgwoULXLp0CYCXfMmX5IH29/cB2N/fZ39/n729PQDuuusuAO666y7+LSQBsL29zfb2NjfccAM33HADN9xwA/v7+zz96U/nJV/yJdnf3+eJT3wiAH/+53/OCyOJl3u5l+NRj3oU29vb/O7v/i6/93u/xxu90RvxF3/xFzw/L/dyL8fLv/zL84xnPIOTJ0/y27/929x1113c74YbbuAt3uIt+N3f/V02Nzf5i7/4CwBe7uVejpd7uZfj8z7v87j22mt5l3d5F1prHD9+HIB/+Id/+O3P/MzPfB2uuuqqq6666qqr/nOhBz3oQVx11VVXXXXVVVf9Z/uJn/gJA+zt7bGzswPAj//4j7O3t8fp06d57dd+bX7t136NO+64A4BXeqVXYhgGXvqlX5o/+ZM/4XGPexz329nZ4TGPeQxnz57ltV7rtQD4tV/7Ne68806e287ODo95zGN4zGMew1//9V/z0i/90gDceeedPP7xj+fOO+/khdnZ2QHg0Y9+NDfddBM33ngjP//zP8/DHvYwHvOYx7C3twfAnXfeyZ133sn+/j533nkn/xEkAbC9vQ3Azs4OANvb2wBsb2+zs7PD/ba3t7nf/v4+N954I/9ae3t73G9/fx+A/f197re/v8/e3h4A+/v7HBwc8B9te3ubRz/60QDccMMN3HDDDezv73PXXXdx33338Rqv8Rrs7+/zxCc+kbvuuou77rqLf8n29jaPetSjePmXf3n29/f5q7/6K17mZV6GJz7xifzFX/wFz8/29jav/dqvzfb2Nr/1W7/Fox71KH77t3+bB7rhhht4i7d4C/7mb/6GM2fO8PM///MAbG9v8y7v8i787M/+LJK4++67+cAP/ED29/cB2N7e5r777rv1Qz7kQx7CVVddddVVV1111X8u9KAHPYirrrrqqquuuuqq/0zXXHPNg7/pm77p6QB7e3t8z/d8Dx/xER/BH//xH/PHf/zHvOEbviGbm5ucOHGC7/qu7wJgZ2eHxzzmMQzDwEu/9EvzuMc9jj/5kz/hgW666Sbe4A3egL/+67/mpV/6pXn84x/P4x//ePb29nhuOzs73HjjjTzmMY/hr/7qr3jQgx7ES77kS7K3t8fjH/94nvCEJ7C3t8e/ZGdnhxtvvJEbb7yRnZ0dbrzxRn7+53+eW265hVOnTnHjjTeyt7fH/v4+e3t73Hnnnezv73PnnXfyopLEfzRJ/EeTxL/H9vY2AI961KMAuPHGG7nhhhsA2N/f56//+q8BeI3XeA329/d54hOfyF133cVdd93Fi2J7e5tHPepRPOpRj2J7e5u//du/5RnPeAav/dqvzROf+ET+4i/+gudne3ubRz7ykbz8y788v/u7v8vLvMzL8Nu//dvcddddPNCjHvUoXvu1X5vf/d3f5eEPfzg///M/z/3e/M3fnLNnz7JYLPjt3/5tHvnIR/Lar/3afO/3fi9v8zZvw/b2NgCf+Zmf+Tr/8A//8NtcddVVV1111VVX/eehctVVV1111VVXXfWf7MVe7MVemwe4/vrrecYznsFjH/tY/uRP/oQ/+ZM/4e3e7u0AeIM3eAN+7dd+jb29Pf7kT/6EV3qlV+Kv//qvec3XfE0A/uRP/gRJANx555385E/+JI95zGPY2dnhxhtv5DGPeQyPf/zj+ZM/+RMeaG9vj729PR7/+Mezs7PDNddcA8DOzg433XQTr/RKr8Te3h6Pf/zjecITnsDe3h7Pz97eHnt7ezz+8Y8HYGdnh52dHe677z66rmN7e5udnR1+93d/l1tuuYXHPOYx3HjjjQDs7e2xv7/P3t4ed955J/v7+wDceeed3E8S/9Ek8R9NEi+q7e1ttre3ueGGGwC48cYbueGGGwDY398H4K//+q956lOfyg033MD+/j533XUXi8WCu+66i2/+5m/mRbW9vc2jHvUobrjhBm644Qb29/f5q7/6K37v936PN3qjN2J/f58f/MEf5PnZ3t7mkY98JC//8i/P/v4+ABsbG/zgD/4gz+3lXu7lePmXf3l+9md/lkc/+tH8/M//PPd77dd+bba3t9ne3uaHfuiHAHi5l3s5/uZv/oZbbrmFB3qxF3ux1/qHf/iH3+aqq6666qqrrrrqPw960IMexFVXXXXVVVddddV/pm/6pm96+t133/3gl3qplwLgO7/zO6m18p7v+Z78xE/8BHfccQc7OzscHh7y4R/+4fzxH/8xf/Inf8L9XumVXok///M/5z3f8z0B+Mmf/En29vZ4oJ2dHV7plV6JxzzmMdxxxx3s7Ozw+Mc/nsc//vHs7e3xQJIA2NnZ4cYbb+TGG2/kMY95DL/3e7/HQx/6UG688Ub29vZ4/OMfz5133smdd97J8yOJ52d7e5udnR22t7e58cYb2dnZ4cYbb+R+f/u3f8upU6fY3t5mZ2cHgL29Pfb399nf3wfgzjvvBGB/fx+Avb099vf3+deSxH80SQBsb28DsL29zfb2Ntvb2wDs7Oywvb3NDTfcwP329/fZ39/nqU99Kq/xGq/B/v4+29vb7O/vc9ddd7G3t8fdd9/NXXfdxb/W9vY2j3rUo7jhhhu44YYb2N/f56/+6q94zdd8Te666y6e9KQn8cQnPpEXZHt7m0c+8pG8/Mu/PPv7+2xvb/PEJz6Rv/iLv2B/f58H2t7e5rVf+7XZ3t7mp3/6p7n55pt50pOexP0e+chH8tqv/dp83/d9H8ePH+fuu+/mkY98JK/92q/N937v97JarfjAD/xAdnd3uXTpEovF4tYP+ZAPeQhXXXXVVVddddVV/3nQgx70IK666qqrrrrqqqv+s1xzzTUP/qZv+qan7+3tsbOzA8CP//iPs7Ozw6Me9ShOnDjBd33XdwHw2Mc+luVyyVu+5Vvyx3/8x/zJn/wJ99vZ2eHt3u7t+Ou//mte+qVfmsc//vH8yZ/8Cc9tZ2eHV3qlV+IpT3kKL/MyL8POzg533nknj3vc47jzzjuRxPOzs7PDjTfeyI033shjHvMYAB7/+MfzmMc8hr29Pe68807uvPNO9vb2uPPOO5HEv9b29jY7Oztsb29z4403srOzw/b2Njs7O3z/938/x48fB+CWW27h1KlTAOzs7LC9vc399vf3Adjb2wNgf3+f++3t7QGwv78PgCT+tba3t3mg7e1tALa3twHY2dlhe3ubB9rf3wdgf3+fpz71qQBcunSJ3d1d3v3d3539/X329/e58847Abjrrru46667eCBJvKi2t7d51KMeBcDLv/zLA3DXXXdxww03sL+/z/7+PnfddRd//ud/jiRekO3tbR75yEfy8i//8uzv7/Pbv/3bPPKRj+Qv/uIv2N/f57m93Mu9HC//8i/PM57xDE6ePMlv//Zvc/fdd3O/66+/nrd4i7fg+77v+zh+/Dh33303AG/+5m/OOI48/elPB+C1X/u1eaDP/MzPfJ1/+Id/+G2uuuqqq6666qqr/nOgBz3oQVx11VVXXXXVVVf9Z3md13md9/7wD//w7wK44447uOmmm3jc4x7HH//xH3N0dMSHf/iH88d//Mf8yZ/8CQCv9EqvxH333cdrv/Zr87jHPY4/+ZM/4X47Ozs85jGPYRgGXvM1X5O9vT1+8id/kr29PZ7bzs4Or/RKr8Rv/MZv8Jqv+Zq85Eu+JHt7e/zpn/4pj3/843lhdnZ2uPHGG7nxxhvZ2dnhxhtvBODOO+/kxhtvZG9vjzvvvJM777yT/f197rzzTv69tre3OXbsGNvb2wDceOONAGxvb7Ozs8P29jb3+7u/+zuOHTsGwLFjxzh27Bj/WS5dusT9Ll26xKVLl3iJl3gJAPb39wHY399nf3+fvb09APb399nf3+euu+7iRSGJF2Z7e5tHPepRALz8y788APv7+2xvbwOwv7/PE5/4RO666y7uuusu7ieJ5+dRj3oU119/PY961KP427/9W373d3+Xt33bt+W3f/u32d/f57ltb2/z2q/92mxvb/Pbv/3bvNzLvRw///M/zwM98pGP5LVf+7X5vu/7Pm6++Wae9KQnAfByL/dyvNzLvRxf93Vfx2w247Vf+7V55CMfyQP9yI/8yGf/6I/+6Odw1VVXXXXVVVdd9Z8DPehBD+Kqq6666qqrrrrqP8uHf/iHf9frvM7rvDfA4x73ODY3Nzlx4gTf+Z3fyc0338zbvd3bsbe3x6/92q9xxx13APBKr/RKDMPAa77ma/LHf/zH/Mmf/An3k8RjHvMYXumVXom//uu/5qVf+qV5/OMfz5/8yZ/w/Ozs7PCYxzyGP//zP+clX/IleY3XeA329vZ4/OMfz5133smdd97Jv2RnZ4cbb7yRG2+8kcc85jH8/M//PLfccgunTp3ixhtvZG9vj/39ffb29rjzzju588472d/f519DEi+K7e1tAHZ2dgDY3t7mftvb2wDs7Ozwb7W/vw/A/v4+29vb7O/vA7C3twfAwcEB+/v7/EeRxANtb2+zvb3NDTfcwA033MANN9wAwP7+Pn/9138NwEu/9Euzv7/PXXfdxROf+ET29/d5bpJ4oO3tbR75yEfy8i//8uzv7/NXf/VX/O3f/i2v/MqvzJOe9CT29/d5btvb2zzykY/k5V/+5XnGM57ByZMn+e3f/m3uvvtuHujlXu7leLmXezl+9md/lp2dHZ70pCcBcP311/MWb/EWAPzcz/0cd999N+/yLu/C0572NBaLBY985CPZ3d3lzjvv/O3P/MzPfB2uuuqqq6666qqr/nNQueqqq6666qqrrvpP9GIv9mKvvbu7y/Hjx9nb22NnZ4ednR1uvvlm7rjjDv74j/+YYRh4gzd4A37iJ36Cvb09/uRP/oRXeqVX4uu//uv58A//cHZ2dvj1X/917vf4xz+eO++8kxtvvJHv/d7v5T3f8z15zGMew+Mf/3j+5E/+hAfa29vjT/7kT9jZ2WG9XnPnnXdy4403srOzwyu90iuxt7fH4x//eO68807uvPNOnp+9vT329vZ4/OMfz6//+q+zs7PDOI50Xcf29jY7Ozv87u/+Lrfccguv+IqvyM7ODnt7e+zv77O3t8edd97J/v4+d955J8+PJF5U+/v7AOzv7/PCSOI/miT+o2xvbwPw6Ec/GoAbbriBG264AYD9/X0uXLjAU5/6VG644Qb29/e56667WCwW3HXXXfzAD/wAL4wkALa3t3nkIx/Jox71KLa3t7nrrrv4uZ/7OV77tV+bjY0Nuq7jL/7iL3h+Xu7lXo6Xf/mXZ39/n+///u/n0Y9+NL/yK7/Cc3vzN39zbrjhBr7v+76Pm2++mSc96Unc7+Ve7uV4xjOewXq95u677+aRj3wk29vbnDlzhrvvvhuAZzzjGVx//fUP5qqrrrrqqquuuuo/D3rQgx7EVVddddVVV1111X+Wn/iJnzDPdMcdd/C4xz2ORz3qUZw4cYLv+q7vYmdnhzd4gzdgZ2cHgO/6ru/ifjfddBNv93Zvx97eHgA/+ZM/yd7eHg+0s7PD67/+63PTTText7cHwOMf/3j+5E/+hAeSxP12dnZ49KMfzSu90ivx8z//87zMy7wMN954I3t7ezz+8Y/nzjvv5M477+T5kcRz297e5sYbb2RnZ4cbb7yRG2+8kfv97d/+LadOneLGG28EYG9vj/39ffb29rjzzjuRxP7+Pnt7e+zv7/MfQRL/0STxr7W9vQ3ADTfcwPb2NgA33ngjN9xwAwD7+/sAPP3pT+clX/IlAdjf32d/f5+77rqLu+66i7vuuot/jZ2dHR75yEfyqEc9iu3tbfb39/nrv/5rXvqlX5onPvGJPOlJT2J/f58X5OVe7uV4+Zd/efb399ne3uauu+7iL/7iL7j77rt5oO3tbd78zd+c+/32b/82d999N/d78zd/c7a3t9nf3+fnf/7nAXjzN39zxnHk6U9/OjfccAOPfOQjud9nfuZnvs4//MM//DZXXXXVVVddddVV//HQgx70IK666qqrrrrqqqv+M7zYi73Ya3/u537ubwE84xnP4MSJE/z4j/84b//2b8/Ozg6/9mu/xuMe9zh2dnZ4u7d7OwDuuOMOfu3Xfo377ezs8AZv8AY87WlP46Vf+qV5/OMfz5/8yZ/w3B7zmMfwmMc8hr/6q7/itV7rtQB4/OMfz5/8yZ8giednZ2eHG2+8kRtvvJHHPOYx/PzP/zwv8zIvw4033sje3h533nknd955J49//OMBkMSLant7m52dHba3t7nxxhvZ2dnhxhtvBODnf/7nedCDHkTXdWxvb3PjjTcCsL+/D8De3h77+/sA3HnnnQDs7+8DsLe3x/7+Pi+IJP6jSeJ+29vb3G97e5vt7W22t7cB2NnZYXt7m+3tbba3t7nf/v4++/v7PPWpTwXgNV7jNdjf3wfgrrvuYn9/n7vuuou77rqLf63t7W22t7e54YYbePmXf3kA9vf3+eu//mte+qVfmic+8YkcHBzwxCc+kRdke3ubRz7ykbz8y788+/v7/NVf/RUv8zIvw2//9m9z1113IYkHermXezle7uVejr/5m7/hoQ99KD//8z/P/v4+93vzN39ztre3AfihH/ohAB75yEfy2q/92gB867d+K+/yLu/ChQsXeNCDHgTAj/zIj3z2j/7oj34OV1111VVXXXXVVf/x0IMe9CCuuuqqq6666qqr/jN8+Id/+He9zuu8znsD/OzP/ixv+ZZvyY//+I9z7NgxZrMZL/3SL81P/MRPsLe3x87ODoeHh7zne74ne3t7/MRP/AT329nZ4bGPfSxPfvKTecu3fEsAfu3Xfo0777yT5/aYxzyGm266iac+9am89Eu/NDs7O9x55508/vGP58477+QF2dnZ4cYbb+TGG2/kMY95DAB/+7d/y4Mf/GDu94QnPIE777yTO++8k3+r7e1tdnZ22N7e5sYbb0QS29vb3Hjjjdzv53/+5zl27BjHjx/n5MmTAOzs7LC9vc0D7e/vc7+9vT3ut7+/z3Pb39/nBdne3uaBtre3ud/Ozg4A29vbPLf9/X0A9vf3OX/+PLu7uwC8xmu8BgD7+/sA3HXXXezt7QFw1113cffdd/Pvsb29zaMe9ShuuOEGbrjhBvb39/nrv/5rXuM1XoP9/X2e+MQnctddd3H33Xfzwmxvb/PIRz6Sl3/5l2d/f5+/+qu/4mVe5mX48z//c570pCcBIIn7bW9v81qv9Vpsb2/zMz/zMzzmMY/hL/7iL3igN3/zN2d7e5uv+Zqv4aVe6qW4++67AfjAD/xA/uZv/obbbrsNgLd4i7fgd37nd3it13otAP7hH/7htz/zMz/zdbjqqquuuuqqq676j4ce9KAHcdVVV1111VVXXfWf4Zu+6Zue3vf9g48fP84f//Ef88qv/Mo87nGP49d+7dd4u7d7O1prlFL4iZ/4CQB2dnY4PDzkPd/zPQH4iZ/4Cfb29pAEwM7ODm/7tm/LX//1X/PSL/3SPP7xj+dP/uRPeH52dnZ4/dd/fX7mZ36G13iN1+AlX/Il2dvb40//9E95/OMfz79kZ2eHRz/60dx0003ceOON/PzP/zwv8zIvw4033sje3h4Ad955J3feeSd33nkn+/v7/GtJ4oG2t7cB2NnZYXt7G4Abb7wRgO3tbQB2dna49dZbATh27BgAx44d437Hjh3jP8KlS5e436VLlwC4dOkSe3t7vORLviQA+/v77O/vs7e3B8D+/j77+/vs7++zv7/P8yOJf43t7W22t7e54YYbuOGGG7jhhhvY399nf3+fpz71qbzGa7wG+/v7PPGJT+Tuu+/mrrvu4l/yci/3cjzqUY9ie3ubS5cu8bu/+7u89mu/Nn/xF3/BE5/4RO4nCYDt7W0e+chH8nIv93L87u/+Li/zMi/Db//2b3P33Xdzv+3tbV7rtV6L7e1tvud7vocHPehB3H333QC8+Zu/Off7+Z//eV77tV+bRz7ykTzpSU/ikY98JAD33XffrR/yIR/yEK666qqrrrrqqqv+46EHPehBXHXVVVddddVVV/1n+MzP/EwfP36cBz3oQfzqr/4q8/mcl37pl+a7vuu72NnZ4fDwkA//8A/nj//4j/mTP/kTAHZ2dni7t3s7br31Vh784Afzkz/5k+zt7XG/nZ0dHvOYx/Bnf/ZnvPVbvzU7Ozs8/vGP50/+5E94fo4dO8ajH/1o/vzP/5yXfMmX5KEPfSjb29vceeedPP7xj+fOO+/kX7Kzs8ONN97IjTfeyM7ODjfeeCM///M/zy233MKpU6e48cYb2dvb484772R/f58777yTvb099vf3eUEk8e+1vb3N/XZ2dgDY2dnh+dne3uYF2d/f54H29vYAkATA/v4++/v7/EeQxAuyvb3N9vY2N9xwAzfccAM33HADAPv7+zz96U/n0qVLvMZrvAb7+/s88YlP5K677uKuu+5CEv+S7e1tHvnIR/LyL//y7O/v89d//df87d/+La/0Sq/Ek570JPb393kgSQC83Mu9HC/3ci/H/v4+P/MzP8NjHvMY/uIv/oIH2t7e5l3e5V14xjOewcmTJ/nt3/5t7r77bgBe7uVejpd7uZfj+77v+6i1cnBwwAd8wAfwN3/zN0zTxMu93MvxN3/zNwzDcOsXf/EXP4Srrrrqqquuuuqq/3hUrrrqqquuuuqqq/4TXHPNNQ9+qZd6Ke63s7PDTTfdxM7ODm/wBm/Ar/3ar3HTTTfxsz/7s7zlW74lAH/yJ3/C3t4eP/ETP8EbvMEb8Nd//de87du+LY9//OP5kz/5EwD29vb4kz/5E3Z2dgDY2dnhMY95DI95zGN4/OMfz5/8yZ9wP0ns7e3xp3/6p+zs7LBerwHY2dnh1ltv5W3f9m3Z29vjzjvv5PGPfzx33nknz8/+/j5PeMITeMITngDA9vY2Ozs7rFYr7rezs8Pf/M3f8NCHPpRXfMVXBGBvb4/9/X329va488472d/fZ29vj4ODA/4j7O/vAyCJg4MDAO666y7+I0jiP5okALa3t9ne3uaGG24A4IYbbuCGG24AYH9/n/39fZ761Kdyww03sL+/z/7+PsMwcPHiRb75m7+ZB5LEC7K9vc0jH/lIXv7lX579/X3++q//mvstFgtqrfzFX/wFz00SL/dyL8fLvdzLsb+/D8D+/j6lFP7iL/6CB3rkIx/Ja7/2a/M3f/M3nDlzhh/6oR/iftdffz0v93Ivx/d93/dx/Phx7rnnHl72ZV8WgMViwf7+Pvv7+7zUS70UwINf/MVf/LX//u///re56qqrrrrqqquu+o+FHvSgB3HVVVddddVVV131H+11Xud13vvDP/zDvwtgd3eXg4MDfvVXf5XTp0/z2q/92vzar/0ad9xxB6/0Sq/Efffdx2u/9mvzuMc9jj/5kz8BYGdnh8c85jEMw8BrvuZrcscdd/Drv/7r7O3t8UA33ngjd999Nw9+8IN5zdd8TQAe//jH86d/+qe8IDs7Ozz60Y/mpptu4q/+6q+45ZZbeMmXfEn29va48847ufPOO3n84x8PgCReFNvb29x4443ceOON7OzscOONN/IDP/ADHDt2jAc96EGcPHmS7e1tdnZ22N/fB+DOO+8E4M477wRgf3+fvb099vf3eVFJ4j+aJP49tre3Adje3uaGG24A4MYbbwTghhtuAGB/f5/9/X2e+tSnAnDbbbfxlm/5luzv73PXXXexv7/PXXfdxf7+Pi+IJB5oe3ub7e1trr/+el7+5V+e/f19/vqv/5pLly7xWq/1WjzxiU/kSU96Evv7+7wgL//yL8/LvdzLsb+/z1/91V/x8Ic/nL/4i7/g7rvv5oG2t7d5rdd6Lba3t/mZn/kZXvEVX5Hf/u3f5n7XX389b/EWb8H3fd/3cfPNN/PkJz+Z7e1t3vmd35mf/dmfJSJ4uZd7Oa6//nru9yM/8iOf/aM/+qOfw1VXXXXVVVddddV/LCpXXXXVVVddddVV/wle7MVe7LV4pt/93d/lLd/yLTl27BgPf/jDuXjxIm/wBm/Ad33Xd/Enf/InvNIrvRJ//dd/zUu/9EsD8Cd/8ifs7e3xp3/6pzzmMY8BYH9/n7d927fl8Y9/PH/yJ3/C/e68804AZrMZe3t7/PVf/zUv8zIvw2Me8xge//jH84QnPIG9vT0eaG9vjz/90z/lT//0T9nZ2eHMmTPceeed3Hjjjdx66628/uu/Pq/4iq/I/v4+d955J3feeSd33nknL8z+/j5PeMITeMITnsD9tre3GceRe++9l1orAJLY3t4G4NGPfjR/93d/x6Mf/WgAbrzxRgD29/cB2NvbY39/H4C9vT329/cB2N/fB2B/fx+A/f19/qNI4oG2t7e53/b2NgDb29tsb29zvxtvvBGA7e1ttre3Adjf3wdgf3+f8+fPc8MNN3C//f199vf3ueuuu1gsFtx1113s7+/zAz/wA7yoJAGwvb3NIx/5SG644QZuuOEG9vf3+eu//mvut1gsuP322/nBH/xBXpDt7W0e+chH8vIv//Ls7+/zu7/7u7zMy7wMmcnP//zP89we+chH8tqv/dpcunQJgGPHjvHbv/3b3O/666/nLd7iLfjZn/1ZHvvYx/KXf/mXALzWa70Wz3jGM3j0ox/N7/zO73D99dfzO7/zO7zWa70WANdcc81DuOqqq6666qqrrvqPhx70oAdx1VVXXXXVVVdd9R/t7d7u7X7r1V7t1V77QQ96EPd73OMex5/8yZ9weHjIh3/4h/PHf/zH/Mmf/AkAr/RKr8QwDLzma74mf/zHf8yf/umfcr+dnR0e85jHsF6vec3XfE329vb4yZ/8Sfb29nhuj3nMY3jMYx7DX//1X/MyL/MybG9vc+edd/L4xz+eO++8kxdmZ2eHG2+8kcc85jHceOONANx5553ceOON7O3tceedd3LnnXeyv7/PnXfeyb+WJAC2t7cBuPHGGwG48cYb2d7eBuDGG2/kG7/xGzl27BjHjh0D4EEPehAAJ0+eBGBnZ4ft7W2en/39fZ7b3t4eL8zOzg4PtL29zfOzv7/P/fb39zl//jy7u7sAXLp0iUuXLgHwlm/5lgDs7+9z5513Ion9/X329/e56667+PfY3t7mUY96FDfccAM33HADAPv7+2xvbwNw1113cdddd/GkJz2J/f19Xpjt7W1e/uVfnkc+8pHs7+/zV3/1V7zMy7wMf/EXf8GTnvQkntv29jav9Vqvxfb2Nn/1V3/Fwx/+cH7+53+eB3q5l3s5Xu7lXo6f/dmf5cYbb+Qv//IvAXjZl31ZXu7lXo6v//qvZzab8bIv+7K83Mu9HHfffTfXX389u7u7/OEf/uHvfMd3fMdrc9VVV1111VVXXfUfCz3oQQ/iqquuuuqqq6666j/a537u5/7Wi73Yi702wB//8R+zWCx4yEMewnd913dx0003cXR0xHu8x3vwx3/8x/zJn/wJAK/0Sq/E2bNneYu3eAv+5E/+hD/5kz/hgR7zmMfwSq/0Svz1X/81L/3SL83jH/94Hv/4x7O3t8cDSWJnZ4dXfMVX5Dd/8zd5yZd8SV7jNV6Dvb09Hv/4x3PnnXdy55138sLs7Oxw4403cuONN7Kzs8Nv//Zvc8stt/DQhz6UG2+8kb29Pfb399nb2+POO+/kzjvvZH9/nxdEEv8a29vb7OzssL29DcD29jY7OzvcdtttbG9vA7C9vc3x48fZ3t4G4NixY/xHunTpEvv7+1y6dAmAvb099vf3AThx4gT329/fZ39/n/39ffb393kgSfxbbW9vs729zQ033MANN9zADTfcAMD+/j5//dd/zTOe8Qze6q3eiic+8YkA/MVf/AX/ku3tbR75yEfyqEc9CoC//uu/5m//9m955Vd+ZZ70pCexv7/Pc9ve3uaRj3wkL/dyL8fv/u7v8jIv8zI86UlP4i/+4i94oDd/8zfnhhtu4Pu+7/u4+eabefKTnwzA9ddfz5u/+Zvzfd/3fZw4cYK7776bD/iAD+Bv/uZvWCwWPPKRjwTgH/7hH37nMz/zM1+bq6666qqrrrrqqv9YVK666qqrrrrqqqv+E5w5c+bBPNPOzg47Ozvs7OzwBm/wBvzar/0ar/RKr8Tv/u7v8tIv/dLceeed3HHHHfzJn/wJj33sYwF4zGMew2Me8xh+8id/kr29PQAe//jHc+edd/KYxzyGnZ0dbrzxRh7zmMfw+Mc/nj/5kz8BQBIAe3t7/Pqv/zo7Ozv0fc/e3h47OzvcdNNNvNIrvRJ7e3s8/vGP5wlPeAJ7e3s8t/39fZ7whCfwhCc8AYDt7W3W6zV7e3sA3Hjjjezs7HDhwgUe85jH8Pqv//rs7e2xv7/P3t4ed955J/v7+9x5551I4l9rf3+f/f19XhBJPD/b29s8t+3tbV6Y/f19JHG//f19/iNI4kW1vb3NDTfcwPb2NjfccAM33HADAPv7+zz96U/nhhtuAOCuu+7irrvuYrFYcHh4yA/+4A/yL9ne3uaRj3wkN954I9dffz37+/v89V//Nb/3e7/HG77hG9J1HX/xF3/Bc9ve3uaRj3wkL/dyL8f+/j4Am5ub/NAP/RAPtL29zWu91muxvb0NwPHjx3nyk58MwPXXX8+bv/mb87u/+7s89rGP5S//8i952Zd9WQCuueYa9vf3ud8111zzYK666qqrrrrqqqv+46EHPehBXHXVVVddddVVV/1H+4mf+AkD/M3f/A0PechD+Imf+AlOnTrFa7/2a/Nrv/Zr3HHHHbzSK70SwzDw0i/90vzar/0ad9xxBwDHjh3jbd/2bfnrv/5rXvqlX5rHP/7x/Mmf/AkPtLOzw1133cVLvuRL8tIv/dLs7Ozw+Mc/nj/90z/lBbnxxht5zGMew2Me8xh+7/d+j4c+9KHceOON7O3t8fjHP54777yTO++8E0n8S7a3t7nxxhvZ2dnhxhtv5MYbb+QHfuAHOHbsGA960IM4efIkN954I/v7+wDceeedANx5553s7+9z55138m8lif9IkviPJonntr29DcANN9zA9vY229vbbG9vc8MNNwCwv7/Prbfeyu7uLrfddhtv+ZZvyf7+PnfddRd33XUXd999Ny+q7e1tHvnIR3LDDTdwww03sL+/z1//9V/z0i/90jzxiU/k7rvv5q677kISz217e5tHPvKRvNzLvRz7+/tsb29z11138Tu/8zvs7+/zQC/3ci/Hy73cy/G3f/u3POQhD+G3f/u3ueeeewC4/vrrefM3f3P+5m/+hsViwe/8zu+wvb3NO7/zO/OzP/uzRASv9VqvxYULF3jQgx4EwId8yIc85L777ruVq6666qqrrrrqqv846EEPehBXXXXVVVddddVV/5Fe7MVe7LXf7u3e7rde6qVeivv9xE/8BDfeeCPXX389J06c4Lu+67vY2dnhMY95DMMw8NIv/dL82q/9GnfeeScAOzs7POYxj2G9XvOar/ma7O3t8ZM/+ZPs7e3xQDs7O7z+678+f/3Xf83LvMzLsL29zZ133smf/umfsre3x/Ozs7PDjTfeyI033shjHvMYAO68805uvPFG9vb2uPPOO3nCE57AnXfeyb/G9vY2N954Izs7O2xvb7Ozs8ONN94IwN/93d8BcPLkSW688UYA9vf3AbjzzjsBuPPOOwHY399nb2+P/f19npsk/iNJ4j/C9vY2ANvb2+zs7LC9vQ3ADTfcAMANN9zA/fb397n11lvZ3d3lNV7jNQDY399nf3+fu+66i7vuuou77rqLB5LEv2R7e5tHPvKRPOpRj2J7e5v9/X22t7cBuOuuu7jrrrv4i7/4C+4niQfa3t7mkY98JC/3ci/H/v4+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0pOexP7+Pk960pN4Qba3t3nkIx/JDTfcwPXXX8/+/j5//dd/zUu/9EvzpCc9ib/8y7/kub3sy74sj3zkIwH467/+a37v936Pl3zJl+Tuu+8GYHt7m9d6rddia2uL7e1t/vIv/5K//Mu/ZGtri9d6rddia2sLgN/93d/lZV/2ZVksFhw/fpz7/c3f/A2f+7mfK6666qqrrrrqqqv+46EHPehBXHXVVVddddVVV/1neOu3fmu/x3u8B894xjN40IMexN7eHgB33nknf/Inf8LBwQFv8RZvwYkTJ/jJn/xJ9vb2uPHGG7nnnnt4jdd4DR784Afz+Mc/nj/90z/lfo95zGN44hOfyEu+5EvyUi/1UgA8/vGP50//9E95bjs7O7ziK74ij3nMY/i93/s9HvrQh7K9vc3+/j6Pf/zjecITnsALs729zY033shNN93E9vY2v/3bv82xY8d4mZd5GW688UYA9vf3ufPOO7nzzjvZ39/nzjvv5AWRxItqe3sbgO3tbXZ2dgDY3t4mM7nfzs4OANvb2xw7dozt7W3+o+zv73Pp0iXut7+/D8D+/j77+/scO3YMgP39ffb399nf32d/f5/7SeLfant7m+3tba6//nq2t7d51KMeBcD+/j77+/s89alP5bbbbuMt3/ItedKTngTAX/zFX/DCbG9v88hHPpLrr7+eG264gf39ff76r/+al37pl+ZJT3oSd999N3fffTfP7WVf9mV5uZd7Ofb39/nrv/5rfu/3fo9Xe7VX40lPehL3e7mXezle9mVflmc84xn83M/9HA95yEO4++672dra4s3e7M24cOEC3//938+1117Lm73Zm7G1tQXAwcEBwzDwoAc9iO/93u/lN37jN17n4ODgt7nqqquuuuqqq676j0Xlqquuuuqqq6666j/Jy77sy/72M57xjNd+0IMeBMCdd97Jb/zGb/DhH/7h7O3t8fjHP54TJ07w13/917zt274tj3/84/mTP/kTdnZ2WC6X/M3f/A0v9VIvxWMe8xh+/dd/nTvvvJPHP/7xAKzXa/b39/mrv/orXvM1X5PHPOYxPP7xj+cJT3gCe3t7SGJ/f5/f+I3f4E//9E+58cYbAdjZ2eFv/uZveMxjHsMrvuIrsr+/z5133smdd97JnXfeyQPt7+/zxCc+kSc+8YkAbG9vs1gs2N/f58477+Rnf/ZnueWW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rrrqqquu+q/0ju/4jp/1yq/8yp/9jGc8g9d8zdfk67/+6/nwD/9w7rzzTu644w5e6ZVeCYA/+ZM/4QlPeAKPfvSj+fM//3Pe+q3fmu3tbZ7whCfwp3/6p2xvb3PjjTfypCc9iZd4iZfgpV7qpZDE4x//eB7/+Mezv78PwPb2NjfeeCM33ngjN954I3/zN3/DS7/0S3O/xz/+8dx1113ceeedPLft7W1uvPFGbrzxRra3t7nxxhv5hV/4BW655RYe/OAHs729zf7+Pvv7++zt7XHXXXext7fHXXfdxYtKEtvb2wBsb2+zvb0NwPb2Njs7O/zN3/wNANvb2xw7dozt7W2OHTvG/v4+N910E/c7duwY/9EuXboEwKVLlwC4dOkS+/v7XLp0if39fQBe6qVeiv39fQAODg7Y399nf3+f/f197ieJF8X29jbXX38929vb3HDDDVx//fUA7O/vc/HiRW677TZe/dVfnf39fZ70pCdxcHDAk570JJ6f7e1tHvGIR3DDDTdw/fXXs7+/z1//9V/zGq/xGtx999086UlP4slPfjL329ra4pGPfCQv+7Ivy/7+Pn/913/N7//+7/NGb/RG/OVf/iUAL/uyL8vLvuzLsr+/z/b2Nn/5l3/JX/7lX/Kar/maPPKRjwTgyU9+MltbW1x//fV8//d/P+/+7u/O7/7u7/KgBz2Ipz3tad/99V//9e/DVVddddVVV1111X8d9KAHPYirrrrqqquuuuqq/0rXXHPNgz/5kz/56Q960IP427/9W17yJV+Sr//6r+c93/M9AXj84x/Pn//5n/Me7/EeAPz6r/86+/v73HnnnbzkS74kr/marwnAE57wBP70T/+U7e1tbrzxRh7zmMdw4403cuedd3LjjTdy55138vjHP54nPOEJ3G97e5sbb7yRm266iUc/+tEA3Hnnndx4443s7+9z55138oQnPIE777yT52d7e5vt7W12dnZ49KMfzY033sgP/uAPcuzYMW655RZOnjzJjTfeyP7+PgB33nknAHfddRd7e3vcddddPDdJ/Gttb29zv+3tbe63s7PDc9ve3uZfsr+/zwPt7+8jCYD9/X0A9vf3+beSxP22t7cBuP7669ne3mZ7e5vt7W2uv/56APb397n11lu5dOkSt912G2/xFm/B/v4+d999N3fddRf33HMPL8j111/P9ddfz6Me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xmu8Bn/5l3/Jk570JA4ODtja2uKRj3wkL/uyL8sznvEMfv7nf55XeZVX4S//8i952Zd9WV72ZV+Wv/3bv+WhD30oT3rSk3jZl31ZnvGMZ/CgBz2I++3u7vL1X//1/NVf/ZW46qqrrrrqqquu+u+BHvSgB3HVVVddddVVV1313+XFXuzFXvtjP/Zjf+v48eP83M/9HG/xFm8BwO/93u/xGq/xGjz+8Y9nb2+PV3qlV2Jvbw+AJzzhCTz+8Y/nxhtv5ElPehJv/uZvzvHjx7nzzjt5whOewJ133sn29jaPecxjePSjH83v/u7v8jIv8zLceOON7O/v86d/+qc84QlP4H7b29sAPPrRj+bGG2/kxhtv5Pd///d5yEMewo033sj+/j533nknd911F3t7e9x11108P9vb2wDceOON3HDDDWxvb7Ozs8P29jYAf/d3fwfAqVOnuOGGGwDY398HYH9/n/39fQDuvPNOAPb399nf32d/f5/nRxL/USTxb7G9vQ3A9vY2ANdffz2S2N7eZmtri+3tbba3t7nf/v4+Fy9e5LbbbuPVX/3VAbjrrrsAuPvuuwG46667uPvuuwGQxHPb3t7mEY94BAAv93IvB8D+/j5/8zd/w6u/+quzv7/Pk570JO6++27uvvtu7re9vc0jH/lIrr/+eq6//nr29/f567/+a176pV+aJz/5yfzlX/4lAFtbWzzykY/kZV/2ZXnGM57B7/3e7/HYxz6Wv/zLv+T666/ntV7rtQDY2triL//yLwF42Zd9WX73d3+X13zN1wTg537u53iLt3gLAH70R3/0c37kR37ks7nqqquuuuqqq67674Ee9KAHcdVVV1111VVXXfXf5cyZMw/63M/93N++5pprHgzwcz/3c7zFW7wF99vb2wPg13/917n77rt5yZd8SV7jNV6Dvb09fuqnfgqAxzzmMfz5n/85r/Ear8FLvMRLcOedd/Knf/qn3HnnnQDceOONPPrRj+Yxj3kMAPv7+wDceeed3HnnnTzhCU/ggba3t7nxxhu58cYbefSjHw3A3/3d33Hy5EluvPFG9vf32dvb46677uLOO+/krrvu4oXZ3t4G4MYbb2R7e5udnR22t7fZ3t5me3ubX/iFXwDglltuAeDUqVNsb2+zvb3N/fb397nf/v4++/v73G9/fx+A/f19Hmh/f58XlSS2t7e539bWFg+0vb0NwPb2NgDb29tsb29zv/39fQD29/eZponbbrsNgEuXLvFmb/Zm7O/vA3D33Xezv7/P/v4++/v73H333bwgktje3mZra4vrr7+eG264geuvvx6A/f19/uZv/oZXf/VXZ39/n7vvvpv9/X3+8i//kgfa3t7mEY94BNvb2zzykY9kf3+f7e1tAP7yL/+Su+++m7vvvhuAra0tXvZlX5ZHPvKRPOMZz+Dnf/7neZVXeRWe9KQnAfBar/VaXH/99QAcHBzwl3/5lzziEY9ge3ubra0tDg4O2Nra4ud+7ud4i7d4C+73dm/3duKqq6666qqrrrrqvw960IMexFVXXXXVVVddddV/p3d8x3f8rFd+5Vf+7Gc84xm85mu+Jr/7u7/La77ma/L4xz+e3/zN3+TN3/zNOXnyJHfccQf7+/v82Z/9Ga/xGq/BQx7yEO644w7+9E//FIDHPOYxvOIrviK/93u/x2u8xmuwt7fHE57wBP70T/8USWxvb3PjjTfy6Ec/mp/5mZ/hJV7iJXjpl35pAPb29rjrrru48847ufPOO3mg7e1tbrzxRm688UZuvPFGfvZnf5YHPehBPOQhD+HGG28EYH9/nzvvvJP9/X3uvPNO9vf32d/f57lJ4oG2t7cB2N7eZnt7m+3tbXZ2dgDY3t5me3ub3/u932NnZweAY8eOAXDs2DGOHTvG/Y4dO8Z/hkuXLgFw6dIl7nfp0iV2d3eRxKVLl3jN13xN9vf3Abj77rsB2N/fZ39/n4ODA/b393lRbG9vs7W1xQ033MD29jaPfOQjAdjf3wfgb/7mb3jGM57BW77lW3L33Xezv7/Pk5/8ZPb393mg7e1tHvGIR3DDDTdw/fXXs7+/z1//9V9z22238ZZv+ZY8+clP5i//8i8B2Nra4pGPfCSPeMQj2N7e5vd+7/f4u7/7O175lV+Zv/zLv2Rra4tHPvKRvOzLvizPeMYz+Pmf/3le5VVehYODA17zNV+TZzzjGfz8z/887/Ve78XW1hbf//3fz7u/+7vzt3/7txw7doynPe1p3/31X//178NVV1111VVXXXXVfx/0oAc9iKuuuuqqq6666qr/Ttdcc82DX+zFXuzpH/7hH87v/u7v8pqv+ZoA7O3tAfD4xz+eYRh4jdd4De68807+9E//lBtvvJE///M/563e6q3Y3t7mCU94Ao9//OMBeMxjHsOjH/1o/uZv/oaXeqmXQhJ33nknT3jCE7jzzjsB2N7e5sYbb+TRj340N954I7//+7/PQx7yEG688Ub29/e58847ecITnsCdd94JgCTut729zY033sgNN9zA9vY2P/uzP8stt9zCLbfcwsmTJ7nxxhsB2N/fZ29vj/39fe666y729/cBuOuuu/jX2t7e5n7b29vs7Oxwv+3tbQC2t7d5oO3tbf419vf32d/fZ3t7m/39fR7o4OAAgP39fQD29/fZ39/ngSTxotje3mZra4sbbrgBgOuvv54bbrgBgP39ffb393na057GpUuXuO2223j3d393nvSkJwHwl3/5lzy37e1ttra2uP7663nkIx/J9vY2+/v7/PVf/zWv8Rqvwf7+Pk9+8pP5y7/8S+63tbXFIx/5SF72ZV+W/f19/vqv/5qXfumX5slPfjJ/+Zd/ydbWFo985CN52Zd9Wfb39/mZn/kZHvvYx/LkJz+Z13zN1+T666/n937v93iZl3kZ9vf32d7eZmtrC4BnPOMZnDp1iu/+7u/mH/7hHx5y33333cpVV1111VVXXXXVfx/0oAc9iKuuuuqqq6666qr/bh/+4R/+XQcHB+/9Fm/xFvzu7/4ur/marwnA3t4eAHfeeSePecxjeMYznsGJEyd4whOewOMf/3ge85jH8OQnP5nXfu3XZnt7myc84Qk8/vGPB+DGG2/kMY95DL/927/NS77kS/ISL/ES7O/v8/jHP5677rqLO++8E4Dt7W1uvPFGbrzxRn7rt36LW265hVtuuYWXeImXYH9/n729Pe666y7uvPNO7rrrLp6f7e1tbrzxRm644Qa2t7e58cYb+YEf+AGOHz/OLbfcwqlTp7jhhhu43/7+Pvv7++zv77O3t8f+/j77+/vs7++zv7/PCyOJ/yiS+I8gifttb2+ztbXF9vY229vbAFx//fVsb2+zvb0NwP7+Pvv7+zztaU8D4BnPeAZv+ZZvyf7+PnfffTcAd999N3fffTfPz/b2No94xCO44YYbuP7669nf3+fixYs84xnP4Pd///d5wzd8QwD+6q/+ivttbW3xyEc+kkc84hFsb2/zd3/3dzzjGc/gtV7rtfjLv/xLnvzkJ7O1tcUjH/lIXvZlX5b9/X1+53d+h0c96lH85V/+JY94xCN42Zd9WZ7xjGdw6tQp7r77bq6//noAtra2AHjGM57Bgx70IL7v+76Pvu8/+0d/9Ec/h6uuuuqqq6666qr/XuhBD3oQV1111VVXXXXVVf/drrnmmgd/0zd909N/93d/l7/927/lJV/yJXnN13xNAH7v936Pl37pl+aOO+7gp37qp3jJl3xJXvM1XxNJ/Mmf/Al33nknr/iKr8hf/uVf8tqv/dpsb29z55138oQnPIE777yTnZ0dHv3oR/OYxzyG7e1t7rzzTm688Ub29/d5/OMfz1133cWdd94JwPb2NgCPfvSjufHGG7nxxhsBuPPOO7nxxhvZ398H4M477+Suu+7izjvvZH9/n+dne3ub7e1tdnZ2uOGGG9jZ2WF7e5vt7W3u93d/93ecOnUKgBtuuIH77e/vA7C/v8/+/j4Ae3t7HBwcALC/v8/99vf3Adjf3+dfQxIvzPb2Nvfb3t4GYHt7m62tLe63vb3N9vY229vbbG9v80D7+/vs7+9z/vx5XuIlXoL77e/vs7+/z9133w3AXXfdxd133w2AJJ7b9vY2W1tbXH/99dxwww1cf/31ANx9991cf/31AOzv7/OkJz2Ju+++m7vvvhsASWxtbfHIRz6SRzziEWxvb7O/v8/29jb7+/s8+clP5klPehIHBwdsbW3xsi/7sjzykY9kf3+fn/mZn+H1Xu/1+J3f+R12dnZ4zdd8TQC2tra4++67ufvuu3nZl31Z/vZv/5aXfMmXBOAZz3gG3//9389rvMZr8Jqv+Zp8yId8yEPuu+++W7nqqquuuuqqq67674Ue9KAHcdVVV1111VVXXfU/wXu913v5pV7qpXjGM57Ba77ma/K7v/u7vOZrviYAv/d7v8drvMZrcOedd/Knf/qn3HXXXbzkS74kr/Ear8He3h6/8Ru/wd7eHo95zGN4xVd8Rf7u7/6Ol3iJl2B/f58//dM/5QlPeAIA29vbvOIrviKPfvSj+b3f+z0e+tCHcuONN7K/v88TnvAE7rzzTu68807ut729zU033cQNN9zA9vY2N954I7/wC7/ALbfcwoMf/GC2t7fZ39/nzjvvZH9/n/39fe6880729/d5IEncb3t7G4Dt7W22t7e58cYbAdje3gbghhtu4IH+7u/+DoC+79ne3gZge3ub7e1tXpD9/X3+tba3t3lh9vf3Adjf32eaJi5dusSlS5d49Vd/dR5of3+f/f19Dg4O2N/fB+Cuu+7i4OCA/f19XpidnR22tra4/vrrueGGG7j++usB2N/f59Zbb+XSpUu8+qu/Ovv7+zzpSU/i7rvv5u677+aBtre3eeQjH8kjHvEItre32d/f56//+q956Zd+aZ785Cdz9913c/fddwPwsi/7sjziEY9ge3ubv/u7v+P3fu/3eOVXfmWe9KQnAfBar/VaXH/99fze7/0ev/d7v8erv/qr84hHPILt7W3+6q/+ipd5mZdha2uLv/3bv+UlX/IlecYzngHAM57xDL7ma75GXHXVVVddddVVV/33Qw960IO46qqrrrrqqquu+p/gmmuuefA3fdM3PX1vb4+LFy/yoAc9iN/7vd/jNV7jNbjzzjvZ3t7m1ltv5cEPfjB33nknd955J0960pN4iZd4CV7jNV6Dxz/+8TzhCU9gb2+PxzzmMbziK74iv/d7v8dLv/RLA3DnnXfyhCc8gTvvvJPt7W1uvPFGbrzxRh796EfzC7/wC7z0S780N954I/v7+9x5553ceeedPPGJT+SBtre32d7e5sYbb+SGG27gxhtv5Bd+4Rc4duwYD3nIQ7jxxhsB2N/fZ39/n729Pe666y729/fZ399nf3+fF8X29jYA29vbbG9vA2Cb7e1tALa3t7nfTTfdxP7+PjfccAP/kfb397l06RIA+/v7AOzv73NwcADAzs4OBwcH7O/vc3BwwP7+Pi+q7e1ttra2uOGGGwC44YYbuP766wHY39/n4OCApz71qdx22228xVu8BQcHB9x1113cfffd3H333TzQ9vY2119/PVtbW7zcy70cAPv7+/z1X/81L/3SL82Tn/xk9vf3efKTnwzA1tYWj3zkI3nZl31Z9vf3+eu//mte+qVfmic/+cn85V/+JVtbW7zsy74sj3zkI/m93/s9fu/3fo83fuM3BuBlX/ZlecYznsGpU6e4++67ecQjHsHP/dzP8RZv8RY84xnP4EEPehAAH/IhH/KQ++6771auuuqqq6666qqr/vuhBz3oQVx11VVXXXXVVVf9T/HhH/7h33VwcPDeb/EWb8EznvEMHvSgB/H93//9vPu7vzsAj3/843nMYx4DwP7+Pn/yJ3/Czs4Of/7nf85LvMRL8Bqv8Ro8/vGP5wlPeAJ7e3vcdNNNPPrRj+av/uqveJmXeRluvPFG9vf3ecITnsDjH/949vf32d7eZmdnh0c/+tH81m/9Frfccgu33HILL/ESLwHA/v4+d955J094whO46667eG7b29vceOON3HDDDWxvb3PjjTfygz/4gxw7doxbbrmFU6dOccMNNwCwv78PwF133QXAnXfeyf7+Pvv7++zv7/PCSOJFtb29zQsiiednf3+ffy1JvCDb29tsbW2xvb3N9vY229vbbG1tccMNNwCwv78PwK233sqlS5e47bbbeIu3eAsODg646667ODg44ElPehLPbXt7m62tLa6//npuuOEGrr/+evb39/nrv/5rAH7/93+fN3qjN+Luu+/m7rvvBmBra4tHPvKRPOIRj2B7e5tLly7xe7/3e7zWa70WT37yk/nLv/xLtra2eNmXfVke+chH8rd/+7f83u/9Hq/yKq/Ck5/8ZF7zNV+T66+/HoCDgwP29/e5/vrr+f7v/37e/d3fnWc84xk86EEP4vu+7/u46aabvvvrv/7r34errrrqqquuuuqq/xnQgx70IK666qqrrrrqqqv+p7jmmmse/E3f9E1P/93f/V1e8zVfk2c84xk86EEPAuDSpUtIAuD7vu/7eMmXfEle4zVeg8c//vE84QlP4MYbb+TP//zPeYmXeAle4zVeg/39ff70T/+UJzzhCWxvb/PoRz+axzzmMWxvb3PnnXdy4403cuedd/KEJzyBJzzhCdxve3ubG2+8kUc/+tH87M/+LLfccgsv8RIvwS233ML+/j4Ad955J3fddRd33nkn+/v7PLft7W22t7fZ2dnhxhtvZHt7mxtuuIEf+IEf4Pjx49xyyy0AnDp1iu3tbba3twHY398HYH9/n/39ffb29tjf30cS+/v7AOzv77O/v8+/hST+rba3t7nf9vY229vbbG9vA7C9vc329ja2ueGGG7jf/v4+ABcvXuS2224D4BnPeAav8zqvw/b2NnfffTf7+/vcfffd3H333Tw/29vbXH/99WxtbXHDDTdw/fXXs7+/z8WLF7ntttt4xjOewVu+5VvypCc9iSc/+ckcHBwAsLW1xSMf+Uiuv/56rr/+evb399ne3mZ/f58nP/nJPOlJT+Lg4IBHPOIRvOzLvizb29v83u/9Hn/7t3/Lq7zKq/DkJz+ZRzziEbzsy74sf/u3f8tDH/pQnvSkJ/GyL/uyHBwcsLW1BcAznvEMHvSgB/G7v/u7vOZrviYf8iEf8pD77rvvVq666qqrrrrqqqv+Z0APetCDuOqqq6666qqrrvqf5B3f8R0/65Vf+ZU/+xnPeAav+Zqvye/+7u/ymq/5mgD83u/9Hq/xGq/B4x//ePb39/mzP/sz3vqt35rt7W2e8IQn8PjHP57HPOYxPPrRj+Zv/uZveI3XeA329/d5/OMfzxOe8AQAbrzxRm688UYe/ehH83u/93s89KEPZWdnB4DHP/7x3HXXXdx5551IYnt7m+3tbW688UZuuOEGbrzxRgD+7u/+jgc/+MFsb2+zv7/PnXfeyf7+PnfeeSd33XUXAJJ4btvb22xvb7O9vQ3AjTfeyPb2Nj/zMz8DwLFjxzh27BgAt9xyCwCnTp0C4IYbbuC57e/vc7/9/X0eaH9/nxdGEra53/b2NpKwDcD29jYA29vbPLf9/X0A9vf3OX/+PJcuXQLg0qVLXLp0iUuXLnHp0iXe8z3fk4ODA/b399nf32d/f5+7776bB5LE/ba3t9na2uL666/nhhtu4Prrrwdgf3+fW2+9lZd4iZcAYH9/nyc96Uncfffd3H333QBIYmtri0c+8pFcf/31XH/99ezv7/PXf/3XvMZrvAZ33303f/mXf8ndd9/N1tYWj3zkI3nZl31Z9vf3+eu//mt+//d/nzd6ozfiyU9+Mo94xCN42Zd9WQ4ODvjpn/5pHvvYxwLwsi/7svze7/0er/EarwHA3/7t3/KSL/mSPOMZzwDgaU972vd8/dd//Xtz1VVXXXXVVVdd9T8HetCDHsRVV1111VVXXXXV/yRnzpx50Dd/8zffCvCMZzyDBz3oQfze7/0er/Ear8H99vb2kMQdd9zB/v4+9913H6/5mq+JJB7/+Mfz+Mc/nptuuolHP/rR/NVf/RUv8zIvw87ODnfeeSdPeMITuPPOO9ne3ubGG2/kxhtv5NGPfjS///u/z0Me8hBuvPFG9vf3ufPOO3nCE57AXXfdxf22t7fZ3t5mZ2eHRz3qUdx444384A/+IC/xEi/ByZMnufHGGwHY399nf3+f/f197rzzTvb397nrrrv4l2xvbwOwvb3N9vY229vb7Ozs8Hd/93fs7Oxgm5tuuont7W2OHTvG/Y4dO8Z/hkuXLrG/v8/29jZ33HEHly5dAuDg4ID9/X0e/OAHA7C/v8/+/j4Ad999N/+S7e1tAB75yEcCcMMNN3D99dcDsL+/z8HBAU996lO57bbbeIu3eAsODg646667uPvuu7n77rt5oOuvv54bbriBRzziEWxvb7O/v89f//Vf8xqv8Rrcfffd3H333fzlX/4lAFtbW7zsy74sj3zkI9nf3+ev//qveemXfmme/OQn86QnPYlHPvKRvOzLviwHBwf81V/9FQ9/+MN58pOfzGu+5mtycHDA1tYW9/vbv/1bXvIlX5JnPOMZnDp1iq2tLT7kQz7kIffdd9+tXHXVVVddddVVV/3PgR70oAdx1VVXXXXVVVdd9T/Nh3/4h3/X67zO67w3wDOe8Qwe9KAHcb+9vT0A/uZv/obXeI3X4PGPfzxPeMITeMVXfEX+6q/+itd8zddEEo9//ON5whOeAMArvuIr8pu/+Zu8xmu8Bi/xEi/B/v4+j3/847nrrru488472d7e5sYbb+TGG2/kt37rt7jlllu45ZZbeImXeAn29/fZ29vjrrvu4s477+Suu+7igba3t7nxxhu54YYb2N7e5sYbbwTgF37hF7jllls4deoUN9xwAwD7+/vs7++zv7/P3t4e+/v77O/vs7+/z/7+Ps9NEi/M9vY299ve3uaBtre3eSBJPJBtJHG//f19bCMJgP39fQD29/d5IEm8KLa3twG4/vrr2d7eBuD666/nhhtu4H77+/vceuutXLp0iVd/9Vdnf3+fg4MD7rrrLgD+8i//kue2vb3NIx7xCG644Qauv/569vf3ufXWW9nd3eXv/u7veOVXfmUA/vIv/xKAra0tHvnIR/KyL/uy7O/v89d//dfcdtttvMIrvAJ33303d999N4985CN52Zd9WQ4ODvirv/orXuZlXoa//Mu/5BGPeATXX389v/d7v8drvMZr8Nye8Yxn8KAHPQiA3/qt3/rur//6r38frrrqqquuuuqqq/5nQQ960IO46qqrrrrqqquu+p/mmmuuefA3fdM3Pf3nfu7neIu3eAv+9m//lpd8yZfkG77hG3iP93gPdnZ22Nvb4/u+7/t4jdd4DR784AfzhCc8gcc//vEcHh5yyy238DIv8zLs7Oxw55138oQnPIG9vT1uvPFGHv3oR3PjjTdy2223ccstt7C/v8/jH/947rrrLu688052dnYAePSjH80NN9zAjTfeCMCdd97JjTfeyP7+Pnt7e+zv7/OEJzyBu+66i+e2s7PD9vY229vb3HjjjQA86lGP4gd+4Ac4fvw4t9xyC6dOnQLg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X38999vf30cSW1tbADzjGc/g+7//+/mwD/swfuVXfuWzf/RHf/RzuOqqq6666qqrrvqfCT3oQQ/iqquuuuqqq6666n+qa6655sEv9mIv9vQHPehBvMVbvAW/+7u/y2u+5mvyDd/wDbz5m785J06cYGdnh2/4hm/gNV7jNXjIQx7C4x//eABuvPFGbrzxRu688052dna48847ecITnsDe3h6PfvSjecVXfEV+7/d+j4c+9KHceOON7O/v84QnPIEnPOEJ7O/vs729zY033sgNN9zAox/9aAD+7u/+jpd4iZcAYH9/nzvvvJO77rqLvb097rrrLiRxv+3tbW644QYAbrzxRra3t7nhhhv4hV/4BQBuueUWTp06xfb2Ntvb2wDs7+8DsL+/z/7+PgB33XUXAPv7+wDs7+8DsL+/zwsjif8IkgDY3t4GYGtrC4Dt7W22t7cB2N7eZnt7m62tLba3t7nf/v4++/v7PO1pTwPg0qVLvNmbvRn7+/vcfffd7O/vc3BwwP7+PnfffTcPtL29zSMe8QgAHvnIR7K9vc3+/j4XL17klltuYX9/n7vvvpuDgwOe9KQncXBwwNbWFo985CO5/vrruf7669nf3+ev//qveemXfmme/OQn86QnPQmARz7ykbzsy74sBwcH/NVf/RW/93u/xxu/8RsD8LIv+7I84xnP4Od//ud5r/d6L7a2tnjGM57Bz/3cz/HhH/7h/O3f/i0v+ZIvyfd///djm5/+6Z8WV1111VVXXXXVVf9zoQc96EFcddVVV1111VVX/U/24R/+4d9VSnlvgNd8zdfkd3/3d3nN13xNAH7v936P13iN12Bvb48777yT3/zN3+St3/qt2dnZ4fGPfzxPeMITeMVXfEUe/ehH83d/93e8xEu8BPv7+/zpn/4pd955JzfeeCM33ngjv/mbv8lLvMRL8NCHPpQbb7yR/f19nvCEJ3DnnXdy1113sb29DcCjH/1obrjhBm688UZ+4Rd+gVtuuYWTJ09y4403sr+/z/7+Pvv7+9x5553s7+9z11138dy2t7fZ3t5me3ubG2+8EYCf+qmf4tixYxw7doxjx44BcMsttwBw6tQpAG644Qae2/7+Pg+0v7/P/fb397mfJGzzQJKwzf22t7eRhG0Atre3Adje3ua57e/vA7C/v8/58+e5dOkSAJcuXeLSpUvcdtttALzne74nd999NwB33303BwcH7O/v89y2t7e5/vrr2dra4oYbbuD6668HYH9/n7/5m78B4KVe6qU4ODjg7rvv5u677+buu+8GYGtri0c+8pFcf/31XH/99ezv7/PXf/3X/N3f/R1v8zZvw5Oe9CSe/OQn87Iv+7Jcf/31XH/99Vy6dIljx45xcHDAX/7lX7K1tcXLvuzLcnBwwE//9E/zSq/0SmxtbXH99dfze7/3e7zGa7wGAL/7u7/La77ma/L93//9vORLviTnz5//7q//+q9/H6666qqrrrrqqqv+50IPetCDuOqqq6666qqrrvqf7Jprrnnwu7zLuzz9QQ96EM94xjN4zdd8TZ7bM57xDE6cOMGdd94JwFOf+lRe67VeC4AnPOEJ3Hnnndxwww284iu+Ir/3e7/Ha7zGa7C/v8+dd97JE57wBPb29rjpppu44YYbePSjH83v//7v85CHPIQbb7yR/f197rzzTu666y6e8IQnALC9vQ3AjTfeyA033MCNN97Iz/3cz3Hs2DFuueUWTp06xQ033MD+/j4Ad911F3feeScA+/v73HXXXTw/Ozs7AGxvb7O9vQ3ADTfcwN/93d+xs7ODbW666Sa2t7cBOHbsGADHjh3jP8OlS5cAuHTpEvv7+1y6dIn9/X0ODg4AePCDHwzA/v4++/v7HBwcsL+/z3OTBMD29jZbW1tcf/31ANxwww1cf/31AOzv73Px4kVuu+02brvtNt7iLd6Cu+++m/39fe6++27uvvtuJLG1tcX111/P9vY2L/uyLwvA/v4+f/3Xf81rvMZrcPfdd3P33Xfzl3/5l2xtbfHIRz6Sl33Zl2V/f5+//uu/5qVf+qV58pOfzD333MN1113Hy77sy3JwcMBv//Zv83Iv93IcHBzwiEc8gkuXLnHs2DEADg4O2NraAuDnfu7neMmXfEkAvviLv/gh9913361cddVVV1111VVX/c+FHvSgB3HVVVddddVVV131P92Hf/iHf9dDH/rQ9z5x4gR//dd/zWu+5muyv79PZnLs2DG+8Au/kNd4jdfgpV7qpZDE4x//eG688Ub+6q/+ipd5mZdhZ2eHO++8kyc84Qlsb2/z6Ec/mr/6q7/iJV/yJbnlllvY39/nCU94AnfeeSf7+/vceOON3HDDDdx444387u/+Lrfccgsv8RIvAcD+/j533nknd911F094whO4387ODtvb22xvb3PjjTdyww038HM/93McO3aMW265hVOnTrG9vc329jb7+/sA7O/vs7+/z5133okk9vf32d/fZ39/nxfF9vY299ve3uZ+ktje3uZ+tpHEA9lGEvfb39/HNpIAODg4AGB/f58X1fb2NgDXX38929vbANxwww1sbW2xvb0NwP7+PgcHBzz1qU8F4LbbbuMt3uItODg44K677uLuu+/m7rvv5n7b29tsbW1xww03cP3113P99dezv7/PX//1XwPw0i/90jz5yU/m7rvv5u6772Zra4tHPvKRPOIRj2B7e5v9/X1+53d+h9d6rdfiyU9+Mk9+8pN5xCMewcu+7MtycHDAX/3VX/EyL/MyPOlJT+KRj3wkAH/1V3/Fa7zGawBwcHDA1tYWAL/7u7/Ly77syzJNE7/6q7/6OT/yIz/y2Vx11VVXXXXVVVf9z4Ye9KAHcdVVV1111VVXXfU/3ZkzZx704i/+4rd++Id/OM/t937v93iN13gNHv/4x/Obv/mbvORLviSv8Rqvwf7+Pn/6p3/KjTfeyKMf/WjuvPNObrzxRp7whCfwhCc8gb29PR796Efziq/4ivze7/0eD33oQ7nxxhvZ39/nCU94AnfeeSd33XUX29vb3HjjjTzqUY/ixhtv5Bd+4Re45ZZbeImXeAkA9vf3ueuuu7jzzjvZ39/nrrvu4n7b29tsb2+zvb3NjTfeyPb2Ntvb22xvb3O/v/u7v+PUqVNsb2+zvb3N/fb399nf3wdgf3+f/f199vf3Adjf3+d++/v77O/vcz9J/EfY2dnhfltbWwBsb2+zvb0NwPb2NltbWwBsb2+zvb3N/fb399nf3+f8+fO8xEu8BPfb39/n4OCAu+66C4C7776bu+++mwfa3t7mEY94BACPfOQj2d7eZn9/n4sXL3LbbbfxUi/1UhwcHHD33XfzpCc9iYODA7a2tnjkIx/JIx7xCLa3t9nf3+ev//qveemXfmme/OQn86QnPQmAl3u5l+MRj3gEly5d4vd+7/f427/9W176pV+al3mZl+H666/n937v9/i93/s93ud93ofrr7+e3/u93+M1XuM1eG7f933fxx/+4R8+5L777ruVq6666qqrrrrqqv/Z0IMe9CCuuuqqq6666qqr/jf48A//8O86ODh470uXLvHu7/7ufP3Xfz0f/uEfzv329vbY2dlhf3+f7/3e7+U1XuM1eMmXfEme8IQncOedd7K9vc0rvuIr8nu/93u8xmu8Bvv7+zz+8Y/nrrvuAuDRj340j370owG48847ufHGG9nf3+fOO+/kCU94AnfddRfb29tsb29z4403csMNN/CzP/uz3HLLLdxyyy2cOnWKG264gf39fQDuuusu7rzzTvb397nrrrt4oO3tbQC2t7fZ3t7mxhtvBGB7e5vt7W22t7d5oL/7u78D4NSpU2xvbwOwvb3N87O/v8+/1fb2Ns/P/v4+99vf3+f8+fMAvMRLvAQPtL+/D8D+/j533303AHfffTcAd999Nw+0vb0NwCMe8QgAbrjhBq6//noA9vf3+Zu/+RsA/u7v/o63fuu35u677+buu+/m7rvvBmBra4tHPvKRPPKRj2Rra4v9/X22t7fZ39/nyU9+MnfffTf7+/s88pGP5BGPeATb29v83u/9Hq/xGq/BX/7lX3LPPffwiEc8gkc84hE84xnP4Od//ud527d9W7a3twHY2trift///d/Pu7/7u/P93//93HLLLbTWvvvrv/7r34errrrqqquuuuqq//nQgx70IK666qqrrrrqqqv+N7jmmmse/C7v8i5Pf9CDHsTf/u3f8hZv8RYA7O3tsbOzA8Dv/d7v8Rqv8Rrceeed7O/v85u/+Zu8xmu8Bi/xEi/BE57wBO688062t7d5zGMew1//9V/z0Ic+lJ2dHe68807uuusu7rzzTm688UZuuOEGfuu3fotbbrmFW265hZd4iZdgf3+fvb097rrrLu68807uuusutre3kcQNN9zAjTfeyPb2NjfccAMAf/d3f8epU6e44YYbANjf32d/f5/9/X3uvPNO9vf32d/fZ39/H0k80Pb2NgDb29tsb28DsL29TWYCsL29zf1uuukmtre3+Y+2v7/PpUuXANjf3wfg4OCA/f19jh07xv7+Pvv7+wAcHBywv7/PA0kCYHt7m62tLa6//noAbrjhBq6//nrut7+/z9/8zd/w6q/+6gDs7+9z9913s7+/z913380999wDwNbWFo985CO5/vrruf7669nf3+fixYs84xnP4Pd///d5ozd6I+6++27uvvtuXvZlX5atrS0e+chHsr+/z1//9V/zMi/zMjzpSU/iyU9+Mi/7si/LIx7xCJ7xjGfw8z//87zhG74hW1tbXH/99RwcHLC1tQXAwcEBW1tbAHz/938/r/Ear8EznvEMfuiHfugh9913361cddVVV1111VVX/c+HHvSgB3HVVVddddVVV131v8Xnfu7n/tbW1tZrHz9+nGPHjgHwDd/wDbzkS74kr/EarwHAN3zDN/Dmb/7mnDx5kjvvvJM777yT13u91+P3fu/3eI3XeA329/f50z/9U/b393n0ox/Nox/9aP7u7/6Ol3iJl2B/f58777yTu+66iyc84Qlsb2/z6Ec/mhtuuIGf/dmf5dVf/dU5efIkN954I/v7+9x5553cdddd7O/vc9dddwGwvb3N9vY229vb3HjjjWxvb3PDDTdwv7/7u7/j1KlT3HDDDQDs7+8DsL+/z/7+Pvv7++zv77O/vw/AXXfdxYtCEgDb29s80P7+Ptvb27wo9vf3kcSLant7G4CtrS22t7fZ3t4G4Prrr2d7e5vt7W0A9vf3Abj11lt5iZd4Ce63v7/P3Xffzf7+PnfffTd3330399ve3uaRj3wk119/Pddffz0A+/v7/PVf/zW33XYbb/mWb8mTn/xk7r77bu6++26uv/56rr/+el72ZV+W/f19/vqv/5rXeI3X4ElPehL33HMPAC/7si/L1tYWf/u3f8vv/d7v8YZv+Ibs7+/zsi/7sly6dInv//7v58M+7MMA+N3f/V1+7/d+j0/7tE8DYHd3l0uXLvG0pz3tu7/+67/+fbjqqquuuuqqq6763wE96EEP4qqrrrrqqquuuup/ixd7sRd77Wuuuea3PvzDP5y9vT12dnbY29tjZ2eH7//+7+fd3/3dAXjCE57AU57yFF7rtV4LgDvvvJO9vT1e8RVfkd/7vd/jNV7jNdjf3+fxj388d911Fzs7OzzqUY/ir/7qr3jQgx7ES7zES7C/v8+dd97JXXfdxROe8AS2t7e58cYbueGGG9je3ubGG2/k7/7u7zh16hQ33HAD+/v7ANx1113ceeed7O/vc9ddd3G/7e1tbrjhBgBuvPFGtre32d7eZnt7m1/4hV8A4JZbbuHUqVNsb2+zvb3NA+3v7wOwv7/P/v4+APv7+wAcHBxwv/39fZ7b/v4+z8/29jbPbXt7G4Dt7W3ut729DcDW1hYA29vbbG9vc7/9/X0A9vf3OX/+PJcuXeLSpUu82Zu9Gfv7+xwcHLC/v8/+/j533303BwcH7O/vc7/t7W2uv/56tra2uOGGG7j++usB2N/f52/+5m949Vd/dfb393nyk58MwF/+5V+ytbXFIx/5SABe9mVflv39ff76r/+a2267jdd93dfl7rvv5klPehKPfOQjedmXfVkAfu/3fo+XeZmX4UlPehIAL/uyL8vBwQG//du/zcu93MsBsL29zU//9E/z7u/+7hwcHLC1tcX9vu/7vo8nP/nJr/MP//APv81VV1111VVXXXXV/w7oQQ96EFddddVVV1111VX/m3zlV36l//Zv/5a3eIu3YG9vj52dHS5dusSxY8cA+L3f+z1e+qVfmjvvvJPt7W2e9rSn8dIv/dIA3Hnnndx55508+tGP5mlPexoPfehD2dnZ4c477+Suu+7izjvv5NGPfjQ33HADN954I3/3d3/Hgx/8YAD29va46667uPPOO7nrrrvY3t7mxhtv5MYbb2R7e5sbbriBX/iFX+CWW27h1KlT3HDDDezv7wNw1113ceedd7K/v89dd93FA+3s7ACwvb3N9vY2N9xwAwDb29tsb2+zvb0NwO///u9zv2PHjnHs2DEATpw4wf22t7f5j7K/vw/AxYsXAbh06RIAly5dYnd3lzd/8zdnf38fgLvvvhuA/f19AO6++24A7r77bh5oe3ubra0trr/+egBuuOEGrr/+egD29/e59dZbuXTpEq/+6q/O/v4+T37ykwH4y7/8SwC2trZ45CMfyfXXX8/111/P/v4+f/3Xf81rvMZrsL+/z5Of/GSe9KQnsb29zSMe8Qge+chHcnBwwF/91V/xMi/zMjzpSU8C4GVf9mU5ODjgr/7qr3iZl3kZ9vf3uf7663nGM57Bgx70IAAuXbrEsWPHODg4YGtri9/93d/lQQ96EB/7sR8rrrrqqquuuuqqq/73QA960IO46qqrrrrqqquu+t/kdV7ndd77wz/8w7/rb//2b/nd3/1d3vM935OdnR1+7/d+j9d4jdcA4Pu///t5q7d6K+63t7fH0572NF76pV8agCc84QnceeedPPrRj+Y3f/M3eY3XeA1e4iVegv39fe68806e8IQnsL+/z4033sijHvUobrzxRn7/93+fhzzkIdx4443s7+9z1113ceedd7K/v89dd93F9vY229vbbG9vc+ONN3LDDTewvb3NL/zCL3DLLbdw6tQpbrjhBgD29/fZ399nf3+f/f199vf32d/fZ39/n/39fZ7b9vY299ve3mZ7exuA7e1tALa3t7nf9vY2APv7+2xvbwOwvb3N87O/v89zOzg4AGB/f5/77e/vA7C/vw/AwcEB+/v7PD87OztsbW2xvb3N1tYW29vbbG9vc/3113O//f19/uZv/gaAV3/1V2d/f5+DgwPuuusu7r77bu655x4Atra2eOQjHwnAy77sywKwv7/PX//1X/Mar/Ea7O/v8+QnP5m//Mu/ZGtri0c+8pG87Mu+LPv7+/z1X/81f/d3f8crv/Irc7+XfdmX5eDggL/6q7/iZV7mZdjf3+f666/n4OCAra0t7ve3f/u3vORLviQHBwd893d/N2/xFm/Bgx70IL7+67/+fX7rt37ru7nqqquuuuqqq6763wM96EEP4qqrrrrqqquuuup/k2uuuebBn/zJn/z0EydOYJtjx46xt7fHzs4Ov/d7v8dLv/RLs729zf7+Pn/913/Na7zGa7C/v8+dd97J9vY2N954I/v7+wDceeed3HXXXQA86lGP4q/+6q94yZd8SW655Rb29/e58847ecITnsD+/j433ngjN9xwA9vb29x444383d/9HadOneKGG25gf3+fu+66i729Pe666y7uuusuALa3t9ne3mZ7e5sbb7yR7e1tbrjhBn7hF34BgFtuuYVTp06xvb3N9vY2APv7+wDs7++zv78PwP7+Pvv7++zv7wOwv78PwP7+PpL495LEC7O9vQ3A1tYWANvb22xvbwOwvb3N1tYW29vbbG9vc7/9/X0ODg546lOfCsBtt93GW7zFWwDwpCc9CYC7776bu+++G4Dt7W0AHvGIR3DDDTdw/fXXA7C/v89f//Vf8xqv8Rrs7+/z5Cc/mf39fZ785CeztbXFIx/5SF72ZV8WgNtuu41nPOMZvPRLvzRPfvKTefKTn8wjHvEIXvZlX5aDgwP+6q/+it/7vd/jjd/4jXnkIx/J1tYWv/d7v8drvMZrAHBwcMBv/dZv8RZv8RYcHBwAcP78eR70oAfxjGc8gy/+4i9+yH333XcrV1111VVXXXXVVf97oAc96EFcddVVV1111VVX/W/zuZ/7ub/1Yi/2Yq8NsLe3x87ODs94xjN40IMeBMDf/u3f8pCHPASA7/3e7+UlX/IleY3XeA329/f50z/9U2688UYe/ehH83d/93e8xEu8BPv7+/zZn/0Zd955J49+9KN59KMfzfb2Nrfddhu33HIL+/v73Hnnndx111084QlPYHt7mxtvvJEbb7yRG264gd/93d/llltu4dSpU9xwww0A7O/vc9ddd3HnnXeyv7/PXXfdxf22t7fZ2dlhe3ubG264AYCf+qmf4tixYwDccsstANxyyy0AnDp1CoAbbriB57a/v88DHRwcYBuA/f19ACRhmweShG0Atre3AZCEbba3twHY3t7mue3v7wOwv7/P+fPnuXTpEgCXLl3i0qVLXLp0iUuXLvG2b/u27O/vA3D33Xdz9913c7/t7W22tra4/vrrAbjhhhu4/vrrAdjf3+dv/uZvuHTpEq/5mq/J3XffzcHBAU960pMAuP7669ne3uZlX/ZlAbjtttu45ZZb2N/f58lPfjJ33303119/PY985CPZ2tri0qVLHDt2jLvvvpsnP/nJPOIRj+D666/n937v9/i93/s9PvVTPxWAS5cucezYMQCe8Yxn8KAHPYiDgwO2trYA+K3f+q3v/vqv//r34aqrrrrqqquuuup/F/SgBz2Iq6666qqrrrrqqv9tXuzFXuy1X/7lX/63jh8/zt/+7d/ynu/5nuzs7LC3t8fOzg4Av/d7v8dLv/RLs729zZ133slP//RP85Iv+ZK8xmu8Bvv7+/zpn/4pOzs7vMIrvAK/93u/x0u/9EsDcOedd/KEJzyB/f19Hv3oR3PDDTfwV3/1VzzoQQ/iJV7iJdjf3wfgCU94AnfddRd33XUX29vb3HDDDdx4441sb2/zMz/zM9xyyy3ccsstnDp1ihtuuAGA/f199vf32d/f56677mJ/f5/9/X329/e53/b2NgDb29tsb28DcMMNN/B3f/d3bG9vA3DTTTexvb3NsWPHuN+xY8f4j3Tp0iXud8cdd3Dp0iX29/cBODg44MEPfjAA+/v77O/vc3BwwMHBAQ+0vb3N1tYW119/PQA33HAD119/PQD7+/sA/M3f/A0At912G2/xFm/Bk5/8ZAD+8i//EoCtrS0e+chHcv3113P99dezv7/PX//1XwPw0i/90jz5yU/m7rvvZn9/n0c+8pG87Mu+LAcHB/zVX/0VL/MyL8OTnvQk7rnnHl7mZV6G66+/nr/927/l937v93jDN3xDrr/+egC2trZ4bgcHB3z3d383b/EWb8EznvEMfv3Xf/11/uEf/uG3ueqqq6666qqrrvrfBT3oQQ/iqquuuuqqq6666n+ba6655sHf9E3f9PTd3V0uXbrEgx70IPb29tjZ2eH3fu/3eI3XeA0AvuEbvoGXfMmX5DVe4zW488472d/f59GPfjT329/f58477+Suu+7iUY96FDfeeCN/93d/x0u8xEuwv7/PnXfeyROe8AT29/e58cYbedSjHsXP/MzP8BIv8RI87GEP44YbbmB/f5/9/X3uvPNO7rrrLu666y62t7cBuOGGG7jxxhvZ3t7mhhtu4H5/93d/x6lTp7jhhhsA2N/fB2B/f5/9/X329/fZ399nf38fgLvuuovnJgmA7e1tHmhrawtJAGxvbwNgG0k8kG0kAbC/v88DHRwcALC/v88Lsr29DcDW1hY7OztsbW0BcMMNN7C1tcX29jYA+/v7ANx66628xEu8BAD7+/sAPOlJTwLg7rvv5p577mFra4vt7W2uv/56rr/+eq6//nr29/cB+Ou//mtuu+023vIt35InP/nJPOlJTwLgkY98JC/7si8LwN/93d/xEi/xEhwcHPCkJz0JgEc+8pFsbW3xe7/3e/zt3/4tb/iGbwjAIx7xCP72b/+Wn//5n+dTP/VTAfi5n/s53uIt3oKDgwO2trZ4xjOewbFjxzh+/Dhv93ZvJ6666qqrrrrqqqv+90EPetCDuOqqq6666qqrrvrf6HM+53N+66/+6q9e+z3e4z24dOkSx44d49KlSxw7doz9/X0yk2PHjgHwDd/wDbz5m785J0+e5M477wTgxhtv5K//+q95jdd4Dfb393nCE57AnXfeyY033sgNN9zAX/3VX/GgBz2Il3iJl2B/f58777yTJzzhCezv73PjjTdy4403AvCoRz2KX/iFX+BlXuZluOGGGwDY39/nrrvu4s4772R/f5+77roLgO3tbba3t9nZ2eGGG25ge3ub7e1ttre3+YVf+AUAbrnlFk6dOgXADTfcwP329/e53/7+Pvv7+0hib28PgIODAx5of3+ff63t7W0Atre3ud/29jYAW1tbAGxvb7O9vc0D7e/vc3BwwLlz57h06RKXLl3izd7szdjf3+fg4IC77roLgLvvvpu7776b+21vb/OIRzwCgBtuuIHrr7+e/f19AP76r/+al37plwbgyU9+MnfffTd33303119/Pddffz0v+7IvC8ClS5f427/9W176pV+av/qrv+Lg4IDrrruOl33Zl+Xg4IC/+qu/4mVe5mW4++672d/f52Vf9mW5dOkS3//93897vdd7sbW1xaVLlzh27BgAly5d4tixY1y6dIljx47xfd/3fdx0003f8/Vf//XvzVVXXXXVVVddddX/PuhBD3oQV1111VVXXXXVVf8bvc7rvM57f/iHf/h3/e3f/i0v+ZIvyd7eHjs7O/zu7/4ur/mar8kD7e/vc+edd/Lnf/7nvM7rvA47Ozvceeed7O/vc8MNN/BXf/VXvMzLvAw33ngjd955J0984hO58847efSjH80NN9zAX/3VX/GgBz2Il3iJl2B/f5+77rqLO++8k/39ffb397nhhhu48cYb2d7e5oYbbuAXfuEXuOWWWzh16hQ33HAD+/v7ANx1113cdddd7O/vA3DXXXcBsL29DcD29jbb29vccMMNAGxvb7O9vc329ja/93u/hySOHTvGsWPHOHbsGPc7duwY/xkuXboEwKVLlwC4dOkSly5dwjYv/dIvDcDBwQH7+/vs7+8DcPfddwNw9913c7/t7W22tra4/vrr2d7eZnt7m+uvvx6A/f19/uZv/gaAV3/1V2d/f58nP/nJ3H333dx9991sbW3xyEc+kuuvv57rr78egL/7u79jd3eXl37pl+bJT34yT3rSk3jkIx/J9ddfz/XXX8/BwQF/9Vd/xcu8zMtw9913s7+/z8u+7MtycHDAT//0T/NKr/RKbG1tcf311/NAf/u3f8tLvuRLcnBwwNbWFn/zN3/DS73US/H1X//17/Nbv/Vb381VV1111VVXXXXV/z7oQQ96EFddddVVV1111VX/G505c+ZBn/Ipn3Lrgx70IC5dusT3fd/38V7v9V5sb2/zu7/7u7zma74mAN/wDd/Am7/5m3Py5EnuvPNOAJ785Cfzsi/7suzs7HDnnXdy1113ccMNN/DoRz+a++3v73PnnXfyhCc8gf39fR796Edzww03cOONN/J7v/d7POxhD+OGG25gf3+fu+66izvvvJP9/X329/cBuOGGG7jxxhvZ3t7mhhtu4Bd+4Re45ZZbOHXqFDfccAMA+/v7ANx1110A3HXXXezv7wNw11138UDb29vcb2dnh+3tbWyzvb0NwPb2Ng+0vb3Nv9bBwQEA+/v73G9/fx+A/f19AA4ODtjf3wdAEgDb29sAbG1tcf311wNwww03AHD99dcDsL+/z8HBAU996lMBePVX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4C/+4i94yZd8SV7iJV6C/f19nvCEJ3DnnXeys7PDox/9aH7rt36LW265hYc97GHccMMN7O/vc9ddd/GEJzyB/f19tre32d7e5sYbb+RRj3oU97vtttu45ZZbANjf3wfgrrvu4q677gJgf3+fu+66C4Dt7W0Atre32d7eZnt7m+3tbf7u7/6O7e1tbrrpJgBuuukmAI4dO8Z/hkuXLgFwxx13cOnSJQ4ODgB48IMfzP7+PgB33303AHfffTf3297eZmtri+uvvx6AG264geuvvx6A/f19Ll68yC233ALA/v4+BwcH3H333dx9993s7++zvb3N9ddfzyMe8Qi2t7fZ39/nr//6r7ntttt4y7d8S5785Cfz5Cc/mUc84hE88pGPZGtri9/7vd/j0qVLPOpRj+LJT34yj3jEI3jEIx7BM57xDH7+53+eN3zDN2Rra4vrr7+eB3rGM57Bgx70IAB+93d/l9d8zdfkgT7kQz7kIffdd9+tXHXVVVddddVVV/3vROWqq6666qqrrrrqf7mf/dmf5S3f8i0B+Nu//Vte8zVfk9/93d/lNV/zNTl27Bi/+7u/y8u8zMvwGq/xGnzDN3wDb/7mb86NN97I673e63Hffffx8z//87z5m785r/u6r8sTnvAErr/+elarFfv7+2xvb3PDDTfwCq/wCuzv7/OEJzwB24zjyP7+PgDb29sMw8BbvdVbsb+/D8Bdd93FE57wBH7zN3+T7e1tbrzxRra3t6m1sr29zfb2NgDDMPCoRz2KG264gfvt7++zv7/P/v4+AHfddRcHBwfcfffdDMPArbfeyq233sr9tre3ud/29ja2kcT29jb3s40kXpj9/X3ud3BwAMD+/j4PJInt7W0uXLjA1tYW119/Pddffz3b29u83Mu9HNdffz3329/f5+DggKc+9alcf/31AOzv73NwcMC5c+f4u7/7O+6++262trbY3t7m+uuv52Vf9mW5/vrrAbjtttvY3t5mf3+fg4MDNjc3KaXw5Cc/meuvv56XfdmX5eDggK2tLQ4ODtjc3OSuu+4C4E3f9E25dOkS3/AN38CrvMqr8Cqv8io84hGP4NKlSxwcHLC1tQXA3/7t3/LQhz4UgN/93d/lNV/zNfmbv/kbXuqlXgqA3/md3+Gqq6666qqrrrrqfzn0oAc9iKuuuuqqq6666qr/ra655poHf/Inf/LTH/SgB3G/S5cucezYMR7o937v93iN13gNAJ7whCfw5Cc/mdd+7dcG4M4772R/f59XeIVX4G//9m95yZd8Sfb397nzzjv5sz/7M17hFV6B3/zN3+QlXuIleOmXfmm2t7fZ39/nCU94Avv7++zv73PDDTdw4403csMNN/DzP//zvORLviS33HILAPv7+9x1113cdddd7O/vc9ddd7G9vc329jbb29vccMMNbG9vA3DDDTfwC7/wCwDccsstHDt2jFor29vbbG9vc7/9/X3ut7+/z/7+Pvfb39/nfgcHB/xLtre3eW7b29sAbG1tIYmtrS22t7d5oP39fQAuXrzIbbfdBsClS5d4szd7M/b39zk4OOCuu+4C4O677+buu+9me3sbgEc+8pEAPOIRj2B7e5v9/X0uXrzIM57xDF7jNV6D/f19nvzkJ3P33Xezv7/PIx/5SK6//nquv/56Dg4O+Ku/+iv+7u/+jld+5Vfmfo985CPZ2trib//2b3nJl3xJ/vIv/xKAl33Zl+Xg4IDf+q3f4tGPfjRbW1tcf/31/O7v/i4v+7Ivy9bWFvd7xjOewYMe9CAe6EM+5EMect99993KVVddddVVV1111f9O6EEPehBXXXXVVVddddVV/1tdc801D/6mb/qmp//u7/4uf/u3f8uHf/iHA7C/v8/29ja/+7u/y2u+5mty5513srOzw4ULFzh58iR33nkn29vbPO1pT+M1XuM12N/f584772R/f59HP/rR/PVf/zUv/dIvDcCdd97JXXfdBcCNN97Iox71KH7v936Phz3sYdxwww3s7+9z11138YQnPIH9/X22t7e54YYbuPHGG/npn/5pbrnlFh70oAdx6tQpbrjhBgD29/e56667ALjrrrvY39/nrrvuAmB7e5vt7W22t7fZ3t5me3ub7e1tAP7mb/6G7e1tjh07xrFjxwA4duwYAMeOHeM/yqVLl7jf/v4+mcmlS5e4dOkS+/v7vPqrvzoHBwfcddddABwcHLC/v8/BwQH7+/sAbG9vc/3117O1tcX29jbXX38929vbAOzv7/PXf/3XANx222285Vu+JU9+8pO5++67ufvuu7n++uu5/vrrecQjHsH29jb7+/v89V//NS/zMi/D/v4+d999N09+8pN5xCMewcu+7MtycHDAX/3VX/EyL/MyPOlJTwLgkY98JAB/9Vd/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e3ub52d7exuA/f19np+DgwMA9vf3ud/BwQH7+/sAHBwc8G3f9m3cb3t7G4Drr7+era0trr/+em644Qauv/567re/v8/Fixd5ylOewvXXX8/+/j4HBwecO3eOvb09vv3bv52trS0e+chH8rIv+7Jcf/31ANx222389V//NS/90i/Nk5/8ZGzzC7/wCzziEY/gNV/zNQH4vd/7Pf7kT/6Exz72sezv7/OkJz2Jl33Zl+Xg4IDf+73f4+EPfzi33HILj3jEIzg4OADgEY94BFtbW7TW2Nra4uDggNYaD3rQgwD4uZ/7Od7jPd6D+11zzTUP5qqrrrrqqquuuup/L/SgBz2Iq6666qqrrrrqqv+tvumbvunp11xzzYN5gN/93d/lNV/zNQG4dOkSx44d48477+SpT30qL/MyL8Odd97J9vY2T3va03iN13gN7rzzTv7sz/6MV3iFV+DGG29kf38fgCc84Qnceeed3HjjjTz60Y/mr//6r3nYwx7GDTfcwP7+Pk94whPY399nf3+fG264gRtvvJEbbriBv/u7v+PUqVPccMMN7O/vs7+/z1133cVdd93FXXfdxfb2Ntvb22xvb3PDDTewvb3NDTfcwP3+7u/+jlOnTrG9vc329jb329/fZ39/H4D9/X0A7r77bu63v78PwP7+PgCS2N/f51+yvb3NA21tbQGws7MDwNbWFgDb29tsb28DsL29zdbWFvfb39/n4OCAc+fO8RIv8RIA7O/vA3D33Xdz9913c3BwwN13383W1hbb29tcf/31XH/99Vx//fUA7O/v89d//de8xmu8Bvv7+zz5yU/m7rvv5uDggEc84hE88pGPZGtri4ODA/7qr/6Kl3mZl+FJT3oST37yk3nEIx7By77sy3JwcMBv//Zv89qv/dr85V/+JY94xCO4/vrr+b3f+z1e5mVehrvvvptHPOIR/O3f/i0PfehD2d/fZ2Njg2PHjgHwu7/7u7zma74mD3Tffffd+iEf8iEP4aqrrrrqqquuuup/J/SgBz2Iq6666qqrrrrqqv+tfuInfsIAz3jGM3jQgx7E7u4ux48f52//9m95yZd8SQAuXbrEsWPHeMITnsB9993Ha77ma3LnnXeyv7/Pb/zGb/Aar/EaPOQhD+EJT3gCd955J49+9KN59KMfzZ133snOzg533XUXT3jCE9jf3+cVXuEVeNSjHgXAXXfdxQ033MD+/j5PfOITufPOO9nf3+eGG27gxhtvZHt7mxtuuIG/+7u/49SpU9xwww0A7O/vc9ddd3HXXXexv7/P/v4++/v7bG9vs729zfb2NjfccAMA29vbbG9vs729zf1+//d/n2PHjnHs2DFqrWxvbwOwvb3Nf5T9/X3ud3BwwDiOXLp0iUuXLvHqr/7q3G9/fx+Au+++m/39fQDuvvtu7r77biSxtbXF9vY2119/PVtbW2xvb3P99dcDsL+/z1//9V/zGq/xGuzv7/PkJz8ZgL/8y79ka2uLRz7ykTzykY9ka2uLg4MDtra2ODg44ElPehL33HMP+/v7vOzLviyPeMQjODg4YGtri7vvvpu/+qu/4rrrruNlX/ZluXTpEt///d/PG77hG7K1tcX111/P7/7u73L99deztbXFxsYGx44dA+AZz3gGD3rQg7jf3/zN3/CgBz2I48eP83Zv93biqquuuuqqq6666n8n9KAHPYirrrrqqquuuuqq/41e53Ve570+/MM//Lt5AZ7xjGfwoAc9iL29PS5evMjJkyf50z/9U17v9V6P/f19AO6880729/d54hOfyOu8zuuws7PDE57wBJ7whCfw6Ec/mkc/+tH89V//Na/xGq/B/v4+T3jCE7jrrrvY3t7mxhtv5Dd+4zd4iZd4CR72sIdxww03sL+/z1133cVdd93FE5/4RLa3t7nhhhu44YYb2N7e5oYbbgDg7/7u7zh16hQ33HADAPv7++zv77O/v89dd92FJPb397nrrrsA2N7eBmB7e5vt7W0Atra22N7e5n7b29sAbG9vc7/t7W3+Jfv7+zzQ/v4+kgDY399nf38fgIODA/b39wHY39/n4OAAgO3tbQCuv/56tra2ALjhhhu4/vrrAdjf3wfgr//6r3mN13gNAPb393nyk58MwF/+5V+ytbXFIx/5SABe9mVfFoCDgwP+6q/+ir/7u7/jlV/5lTk4OODuu+/mEY94BI985CPZ2tri937v93iN13gN/vIv/5J77rmH6667jpd92Zfl4OCA3/7t3+bGG2/k7rvv5k3f9E05ODgA4MlPfjIv8zIvwzOe8QyGYWBra4vFYsHx48d5QX7kR37ks3/0R3/0c7jqqquuuuqqq6763wc96EEP4qqrrrrqqquuuup/o8/93M/9rRd7sRd7bZ7L3/zN3/BSL/VS3Hnnnezs7LC9vc2f/umfslqteJmXeRnuvPNOAM6ePctrvMZrcOedd/Jnf/ZnPPrRj+YpT3kKr/VarwXAE57wBO68805uvPFGHv3oR7O9vc1dd93FDTfcwP7+Pn/2Z3/GXXfdxfb2No9+9KPZ3t5me3ubW2+9lQc/+MFsb2+zv7/PXXfdxV133cX+/j77+/sA3HDDDWxvb3PDDTdwww038PM///MAPOhBD+LUqVNsb2+zvb0NwP7+PgAHBwfs7e0BcPfddwOwv78PwP7+PgD7+/tI4t9rZ2eH+21tbbG9vc3W1hYA29vbbG9vA3D99ddzv/39fQ4ODjh37hy7u7tcunSJ13qt1+Lg4IC7774bgLvvvpu7776bra0tHvnIRwLwiEc8gu3tbfb397n11lt5iZd4Cfb393nyk5/MPffcw/7+Po94xCO4/vrruf766zk4OGBra4uDgwP+8i//krvvvptHPOIRvOzLviwHBwf81V/9FQ9/+MP5q7/6K17mZV6G66+/HoC7776bpzzlKbzGa7wGf/u3f8uZM2cA2N7eZmtrC4C/+Zu/4aVe6qV4bv/wD//wO5/5mZ/52lx11VVXXXXVVVf974Me9KAHcdVVV1111VVXXfW/zYu92Iu99ud+7uf+Fs+0u7vL8ePHud/u7i7Hjx/n67/+63mv93ovtre3+dM//VNWqxWv+ZqvyZ/92Z8B8Kd/+qe8+Zu/OSdPnuQJT3gCT3jCE3iFV3gFHv3oR3PnnXeys7PDXXfdxROe8AQAHv3oR/Mbv/EbvMRLvAQv/dIvDcD+/j5PeMITuOuuuwC44YYbuPHGG3nUox7Fz//8z/OgBz2IU6dOccMNN7C/v8/+/j77+/vcdddd3HXXXezv77O9vc329jbb29vccMMNAGxvb3PDDTfw3G677TZqrWxvb7O9vc3zs7+/z/Ozv7/P/ba3t3mg7e1tnp/9/X0ADg4OGMeRW265hQfa398H4ODggLvuuguAe+65h7vvvhuAra0ttre3uf7667n++uu5/vrrAdjf3+fWW29ld3eXl37pl+bg4IC7776bJz3pSUjiEY94BNdffz3XX389BwcH/NVf/RV/+7d/y6u8yqtwcHDA3XffzSMe8Qhe9mVfloODA/7qr/6Khz/84fzVX/0V1113HS/7si/LpUuX+P7v/35e9VVfla2tLR7xiEfwu7/7u1x//fVsbW2xvb3Nd3/3d/N2b/d2LBYLjh8/zv12d3c5fvw49/vMz/zM1/mHf/iH3+aqq6666qqrrrrqfxcqV1111VVXXXXVVf8Lvc7rvM578QDHjx/ngUopALzN27wNd955JzfeeCOPecxjuPPOOwF49KMfDcD+/j733Xcff/d3f8drvdZr8ehHP5onPOEJfN/3fR+v8AqvwI033sh8Puet3uqt2N/f58/+7M/Y2dlhHEf29/e54YYb+Ou//mte4RVege3tbfb393niE5/IE5/4RP78z/8cgHPnztH3PQDb29tsb29z11138Tqv8zoA7O/vs7+/z/7+PnfffTdPetKTALjrrrsA2N7eBmBra4udnR22tra4ePEiADs7O+zs7LC9vc329jYAx44dY3t7m+dne3ubf8mlS5fY398H4NKlSxwcHLC/v8/+/j633HILT3/609nf3wfg7rvv5n7b29tsbW1xww03cP311/OyL/uyXH/99QDs7+9zcHDA9ddfD8D+/j4HBweM48je3h4/8iM/wtbWFo985CN5rdd6La6//noODg74q7/6K66//noANjc3OX36NAAv+7Ivy9bWFpcuXQLgSU96Ek960pPY3NzkTd/0TTk4OOD3fu/3uO666zhz5gyPeMQjuN/29jZbW1tsb28D8HZv93Zcf/31HBwc8EDHjx/ngV7ndV7nvf7hH/7ht7nqqquuuuqqq6763wU96EEP4qqrrrrqqquuuup/m5/4iZ8wL8Sdd97JjTfeCMATnvAEbrzxRjKTiOA3fuM3eL3Xez3++q//mpd+6ZfmCU94Ak94whN43dd9XZ72tKfx0i/90gA84QlP4IlPfCKPetSj+NM//VNe8iVfktd4jddgf3+fu+66iyc84Qns7+9zww03cOONN/KoRz2K3/u93+NhD3sYN9xwA/v7+9x1113cdddd7O/vc9ddd7G9vc0NN9zADTfcwPb2NjfccAP3+7u/+ztOnTrFDTfcwP329/fZ399nf38fSdx1110A7O/vs7+/z/7+Pg8kCYDt7W2en62tLe53cHDAA+3v7yOJ57a9vQ3A1tYWANdffz0A29vbbG9vs7W1xfb2NgD7+/sA3HrrrbzES7wEAPv7+xwcHHD33Xezv7/Pk5/8ZAC2trZ45CMfyfXXX8/1118PwP7+Pn/913/Ny7zMy7C/v8/dd9/NX/3VX7G1tcUjHvEIXvZlX5aDgwP+6q/+ir/927/lVV7lVXjyk5/MIx7xCB75yEcC8Fd/9Ve8zMu8DL/7u7/L9ddfz8u8zMvwt3/7tzz0oQ/lr/7qr3iN13gNLl26RCmFJz/5ybzMy7wML4rd3V0+8zM/83XuvPPO3+aqq6666qqrrrrqfw/0oAc9iKuuuuqqq6666qr/TT78wz/8u17ndV7nvfkX3Hnnndx4440APOEJT2B7e5unPvWpvMzLvAx33nkn+/v73HvvvbzWa70WAE94whPY39/nUY96FDfeeCMA+/v7POEJT+CJT3wiN9xwA49+9KO54YYb+Lu/+zte4iVegv39fe666y6e8IQnsL+/z/b2No9+9KPZ3t7mhhtu4O/+7u84deoUN9xwA/v7++zv77O/v89dd93FXXfdxf7+Ptvb22xvb7O9vc0NN9zA9vY229vbfN/3fR+33HILAA960IMAOHXqFNvb22xvb/NA+/v7AOzv7yMJ2xwcHPCvsb29zf22trbY3t7mue3v7wNw8eJFLl26xO7uLpcuXeLSpUu85Vu+JQcHB9x9990A3H333dx9990AbG1tsb29zfXXX8/111/P9ddfD8D+/j5//dd/zWu8xmuwv7/Pk5/8ZO655x7uvvtutra2eMQjHsHLvuzLAvCMZzyDBz3oQRwcHPCXf/mX3H333TziEY/gZV/2ZTk4OOCv/uqveJmXeRn+6q/+iv39fV7zNV8TgK2tLf7qr/6Ku+++mzd90zflGc94Bn3f85SnPIXXeI3XAOCv/uqveJmXeRn+Jb/1W7/13V//9V//Plx11VVXXXXVVVf974Ee9KAHcdVVV1111VVXXfW/xTXXXPPgb/qmb3o6D/A3f/M3vNRLvRT3u/POOzl//jwPechDePzjH89qteI1X/M1ecITnsD+/j7L5ZLXfM3X5M/+7M94whOewOu+7uvytKc9jdd4jddgf3+f3/iN32BnZ4dHPepR3Hjjjezv7wNw11138YQnPIH9/X0e9ahH8ehHP5rt7W3uuusubrjhBvb397nrrru46667eOITn8j29jY33HADN9xwA9vb2/zlX/4lx44d40EPehC33HILAPv7++zv77O/v8/dd9/N/v4+d911FwDb29sAbG9vs729zdbWFtvb22xvb/N3f/d33HTTTWxvb3Ps2DEAjh07xn+k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OsUNN9zA/v4++/v7HBwccNddd7G/v89dd93FA21vb7O9vc329jZbW1tsb2+zvb0NwK233sqNN97I8ePHud+xY8f4j3Lp0iUAdnd3ufPOO3mJl3gJDg4O2N/f5+DggP39fQ4ODtjf3+fg4IAH2tra4vrrr2d7e5vrr7+e66+/HoD9/X3++q//GoCXeZmX4e6772Z/f5+/+qu/4n7XX3891113HS/7si/LwcEBf/VXf8XLvMzLcPfdd3P33XfzlKc8ha2tLR7xiEfwMi/zMhwcHPBXf/VXPPzhD+f3fu/3ODg44GVe5mV4mZd5GZ7xjGdw6tQpfvd3f5eDgwNe4zVeg+3tbQB+7/d+D4A3eZM34Xd/93c5PDzkuuuu42Ve5mX4vu/7Ph784AfzGq/xGvzN3/wNm5ubPPzhDwdgd3eX48eP8/z86I/+6Of8yI/8yGdz1VVXXXXVVVdd9T8HetCDHsRVV1111VVXXXXV/xQv9mIv9trv+77v+1sPfvCDeUHuvPNObrzxRvb39/mTP/kTXv7lX55SCr/xG7/BQx7yEB760IfyG7/xG9xwww2sVite5mVeht/4jd9gf3+ft37rtyYziQj+7M/+jDvvvJNHP/rR3HvvvbzWa70WAE94whP48z//c7a3t3mFV3gFHvWoR3HXXXexvb3NXXfdxROe8ATuuusutre3ueGGG3j0ox/NDTfcwN/93d/xEi/xEuzv73PXXXdx11138cQnPpH7bW9vc8MNN3DDDTewvb3NDTfcAMBtt91GrZUbbriB/f19AO6++25sc/fdd7O/v8/+/j77+/sASOKBtre3Adja2gJge3ubB9re3uZfcnBwwP329/cBODg4YH9/n+cmCYCtrS22t7fZ2tpie3ub7e1ttra2uP766wHY39/n4sWL3HLLLQDs7+9z9913c3BwwD333MPdd98NwNbWFo94xCPY3t7mEY94BAB/+7d/y0u+5EtycHDAk570JP7qr/4KgO3tbR7xiEfwMi/zMhwcHLC1tcXdd9/N7/3e73FwcMB1113Ha77mawLwl3/5l2xvb/NXf/VXXHfddbzpm74ply5dopTC7/3e7wHwJm/yJvzt3/4trTXuuece3uRN3oS//du/5c477+RlXuZluO666/i93/s9XuM1XgOAe+65h+uuu44XZHd3l6/8yq98nX/4h3/4ba666qqr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7M84f/48j3nMY3jCE57A/v4+v/Ebv0HXdbzMy7wM+/v7POEJT+AJT3gCj370o/mrv/orXuZlXgaAP/uzP2N/f5/v+77vY29vj5d8yZfkrd7qrfizP/sz/vzP/5z9/X3+/M//nO3tbZ7whCfwCq/wCjz60Y/m0Y9+NE984hN54hOfyP7+PnfddRd33XUXT3ziE3nUox7F/v4+29vb3HDDDbz8y788+/v7PPGJT+Tuu+/mrrvuYn9/nyc+8Yk88YlPBGB7e5sbbriB/f197rrrLm644QZ+53d+hwc96EE88pGP5IYbbgBgf3+f/f19Dg4OuOuuuwDY39/n7rvv5oH29/cBODg44J577uHfQhL/GltbWwBsb29z/fXXA3D99ddz/fXXc7+DgwOe/vSn8+QnP5nrrrsOgCc96UnY5ju+4zsAkMQDbW1t8YhHPIJHPOIRbG1tcXBwAMDBwQGtNb7zO7+T+0lia2uLhz/84bzMy7wMBwcH/N7v/R6PeMQjmM1m/PVf/zX3e+mXfmle5mVehvv98i//MgcHBwA8/OEP59Vf/dV5xjOewTiO/NZv/RYA1113HS/90i/N7/7u73J0dMQ999zD1tYWL/3SL83f/M3fcM899wDwsIc9DIDNzU0Atra2ALj33nu53zRNLJdL/iW7u7s85CEPee/XeZ3X+Z3f+q3f+m6uuuqqq6666qqr/mNQueqqq6666qqrrvoPcs011zz4Yz/2Y3/r+PHjvDB7e3sASEISu7u7AOzt7QGws7MDwOMf/3hmsxkPfehD2d7e5s477+TRj34029vbvN7rvR4//dM/zROe8ARe4RVegac//em8wiu8Avv7+9x555382Z/9Ga/wCq/AX/3VX/Gar/maAPzZn/0Z+/v7HDt2jPl8zvd///fzVm/1Vjz60Y/mCU94An/+53/O/v4+f/7nf84Tn/hEXuEVXoFHPepRPOpRj+JRj3oUd911F0984hO566672N/f58///M/58z//c7a3t3n5l395ALa3t7nhhht4+Zd/efb397nrrru4++67eeITnwjA/v4+T3ziE3niE58IwPb2NgDnz5+n73vuuusubrjhBra3t9ne3ubv/u7veOQjH8kNN9zA/fb39wHY39/n4OAAgP39fQ4ODgDY39/nfgcHB7wotre3ud/W1hYA29vbAGxvb7O1tcXW1hbb29vc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f3+f7e1t3uM93oPv+77vA+DP/uzPePSjH83P//zP8+Zv/uY8+tGP5md+5mfY399nf3+fY8eOMZ/P+f7v/37e6q3eird6q7fiiU98In/2Z38GwMHBAX/+53/OE5/4RB71qEfx8z//87zGa7wGb/mWb8n+/j5PfOIT+fM//3MA9vf32d/f5+677+Yv/uIv2N7eZn9/n7vuuosbbriBYRh47dd+bQD29/e56667uPvuu9nf3+euu+7ifvv7++zv7wNw9913c7/t7W329/exTWuNYRg4ODjgD//wDzl27Bjb29vcdNNNABw7dgyAra0t7nf99dfzr3Xp0iUA7rjjDi5dusTBwQEPfvCDOTg4AGBvbw9JrFYrfuRHfoR/ydbWFo985CMBeMQjHsHW1hYHBwdcuHABgIODA5785Cezv7/Pj/7oj/Lctre3efjDH84jHvEItra2uHTpEj//8z/PjTfeyFOe8hQODg54oJd+6ZfmZV7mZTg4OOD7v//7efEXf3FuuOEG7rnnHgC2trZ49Vd/da677jq+//u/nwc/+MH89V//Nfd74zd+Y7a2tjg4OOCmm27ifq/2aq8GwGw245577gHg1V7t1QAYx5GDgwMArrvuOv7mb/6Gpz71qTzsYQ8DYHd3F4CtrS0A7rzzTgC2trZ46lOfynXXXcfW1hYP9OAHP5h3f/d3/65/+Id/+O377rvvVq666qqrrrrqqqv+9ahcddVVV1111VVX/Rt9xVd8hR/84Afzgtx555085jGPAWCaJh5od3eXBz3oQdx4443ceeed1FoBuPHGG7nrrrv4jd/4DV76pV+ahzzkIdx4443ceeed/MZv/AZv8zZvw/b2Nq/wCq/An//5n7O/v89P//RPc+nSJd7rvd6L93iP9+D7vu/7AHjCE57A9vY2+/v7ZCZv9VZvxROe8AT+/M//nP39ff78z/+c7e1t/uzP/oyu63iN13gNHvWoR/HEJz6RP//zPwdgf3+fP//zP+f48eMMw8D+/j5//dd/zUu/9EvzqEc9irvuuou77rqLJz3pSQDs7++zv7/PXXfdBcD29jY33HADT3ziE3nUox7F7/zO7/CgBz2IRz7ykdxwww3s7+9zcHDA/v4+d911F/v7+9x999080P7+PgD7+/vcfffdAEjiuW1vbwNgm+3tbe63vb3NC3JwcMAD7e/vA3BwcMBzu+2225DEv2Rra4vrr7+era0tbrjhBq677joADg4OePrTn85f/dVf8TIv8zLcfffdHBwc8Md//MccHBzw/Fx33XU88pGP5OEPfzgHBwf81V/9FS/zMi/D0572NM6ePcvZs2d5oJd+6ZfmZV7mZTg4OOD3fu/3eMQjHsF8Puev//qvud91113HG7/xG3Pp0iUODg44ffo0T3nKU7jfG7/xG7O1tcVP//RPc+bMGe73Ui/1Ulx33XUcHBzwK7/yKwBcd911PPzhD+dv/uZvuOeeewB46Zd+aQC2trZ4oGc84xkAbG1t8YLcc889XHfddTzQ8ePH+aAP+qCnf97nfZ646qqrrrrqqquu+tejctVVV1111VVXXfVvcOLEifc+fvw4z8+dd97JjTfeyAMdHR2xv7/Pzs4O29vbPO1pT+OlXuqluPHGGwH40z/9U172ZV+WxzzmMfzZn/0Z+/v7rFYrMpPXe73X43u/93vZ39/np37qpzhx4gRv8RZvgST+7M/+jP39fY4dO8b93uM93oOf/umfZn9/n/39fX76p3+avb09XvIlX5LXeI3XAODP//zPAdjf3+eJT3wi29vbPOxhD+OGG27g5V/+5XnUox7FE5/4RP78z/8cgP39ff78z/+cJz7xidxwww3cddddPOpRj2IYBl7ndV6Hl3/5l+euu+7iSU96EnfddRf329/f54lPfCJPfOIT+Yu/+AsAzp8/T9/37O/v8zu/8zs86EEP4tixY7z2a782APv7+wDcfffdANx1113s7+9zcHDA/v4+L8j+/j73Ozg44H53330395PEv5Uk7re1tQXA9ddfz9bWFtvb22xvb3PdddcBcHBwwIULF3jyk5/Mn//5n/Par/3a7O/vM00T+/v7/OiP/igvyNbWFo94xCN4mZd5GQBuu+02HujHfuzHeG4v/dIvzSMe8Qi2trb4vd/7PX7v936Pl33Zl+WXf/mXud/W1hYPf/jDeemXfmkAlsslv/zLv8z9tra2ePVXf3W2trYAOHPmDPfccw8A1113HS/90i/Nz/3cz9H3Pfd7qZd6KXZ3d9nc3OSee+5BEg972MPY3d3lKU95CgDXXXcdAAcHBzzQarXifvfccw8v9VIvxdbWFgAHBwdsbW1xvwc/+MG82Iu92Gv/wz/8w29z1VVXXXXVVVdd9a9D5aqrrrrqqquuuurf4N3f/d2/6/jx47wwe3t7PNClS5fY3t5mZ2eHvb09AHZ2dgC48847KaXwlm/5ljz60Y/mCU94Ak94whO49957eYu3eAte8RVfkT/90z9lf3+fG2+8kd/93d/lZV7mZbjzzju566672N/f56d/+qd567d+azKTt37rt+anf/qn2d/f5+DggIhgHEe+//u/n7d6q7fi0Y9+NE94whP48z//cwD29/f5mZ/5GR71qEfxCq/wCvz1X/81r/Ear8GjHvUonvjEJ/Lnf/7nAOzv7/PEJz6RJz7xifz5n/85j3rUo7jrrrv4y7/8S17yJV+St3iLt2B/f5+77rqLu+++myc+8Yncb39/H4AnPvGJPPGJT0QS29vbnD9/nmEYWK1WXH/99WxvbwNw6623curUKV7u5V6O7e1tAPb39wE4ODhgf38fgP39fQ4ODgDY398H4ODggPvt7+/zgmxtbfFA29vbAGxtbQGwvb0NwPb2NltbW2xvb7O1tcX9Dg4OuHDhAs94xjN4xCMeAcDBwQH7+/ucO3eOvb097rvvPn70R3+UF2Rra4tHPOIRALzMy7wMAJcuXeL3fu/3eJmXeRnOnz/Pb/zGb/Dctra2ePjDH84jHvEItra2+L3f+z1e5mVehq2tLa6//nruuece7nfdddfxxm/8xhwcHPD93//9vPiLvzh//dd/zf22trZ4+7d/ey5dugTAT/zET3C/6667jjd6ozfib//2b+n7nnvuuQeAhz3sYVx33XV83/d9H5mJJB72sIextbXFz/7sz7K7uwvAwx72MADuvfdeHvawhwFw7733cr/d3V3ud3h4yNbWFltbWzzQ8ePHedu3fdvf+od/+Adx1VVXXXXVVVdd9a9D5aqrrrrqqquuuupf6T3f8z392q/92jw/d955J/fb39/ngfb39wG48cYbufPOO/nd3/1dXvM1X5Mbb7yRO++8k9Yau7u7vOIrviJPeMIT2N/f58Ybb+QZz3gGj370o7nzzju58847ecITnsArvuIr8ld/9Ve83uu9Hr/xG7/BXXfdxf7+Pj/90z/N677u63L+/Hne+q3fmic84Qn8+Z//OQBPfOIT2d7eZn9/n6c+9am8xmu8BjfeeCO/+Zu/yf7+PgBPfOITufvuu7nhhhu46667eOpTn8prvMZr8KhHPYonPvGJPPGJT2R/fx+A/f19/vzP/xyAnZ0d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r8FsNuPpT386wzCws7PDS73US3H69GkA7rrrLoZhYH9/n+uvv56HPOQh7OzsMJvNuOuuuwC46667eOITn8if/umfcvPNN/MyL/My9H3PXXfdBcAwDNx1110sl0t2dna44YYb2N7e5iVf8iWZzWbcdddd3G8YBm699Vae+MQnUkphNptx+vRpjo6OeMVXfEUe9ahHcerUKYZhYH9/n/sNw8D+/j533303T3rSk5jNZtimlALA9vY2s9mM7e1tDg8PeamXeike9ahH8chHPpKXeImX4PTp0zz4wQ+m73tmsxnb29scHBzwryWJfwtJPNDW1hZ933Pq1Cke8YhHcP311/OyL/uyPOIRj+A1X/M1efEXf3FOnTrF8ePHOX36NAAHBwecP3+e22+/nfPnz7NarfiHf/gH7rnnHg4ODnhu29vbPPaxj+VN3uRNeLEXezE2NjaYz+cMw8DBwQG//Mu/zD333MMwDNxva2uLxz72sbze670eW1tb/Mmf/Ak/9mM/xrFjx7jtttt4oJd+6ZfmdV/3dTl//jyZye///u9z++23c7+HP/zhvM7rvA4A586d47d+67e430u91Evx8Ic/HIC7776bw8NDAN7wDd+Qra0tvv/7v59pmgB4hVd4BU6ePMmv/uqvAvCwhz2Mhz/84cznc/7sz/6MU6dOcfPNN3Pvvfdy77338pjHPIZhGLh48SLXXXcdh4eHbG1t8dwe/OAHv/Qf//Eff8/h4eEuV1111VVXXXXVVf8yKlddddVVV1111VUvond8x3f8rOPHj3O/nZ0d7re/v8/zs7e3B8CNN94IwJ133smNN97Iox/9aO688052dnYAuPHGG7nxxhu588472dnZAeDRj340d955J094whPY39/np3/6pzl58iSv+ZqvCcCf/dmfsb+/z5/92Z8BsFqteI3XeA0A/uzP/gxJ7O/vc+zYMe677z5uu+02XuM1XoNHP/rR/OZv/iZ33XUXAPv7+/zmb/4mf/7nf87Lv/zLc9999/HSL/3SPOpRj+KJT3wiT3ziE9nf3wdgf3+fJz7xiTzxiU9ke3ubRz3qUZw4cYLt7W22t7d5i7d4C/b397nrrru4++67eeITn8gD7e/vc3BwwN133839tre3uf7667nhhht40pOexPXXX8/29jY///M/z4Me9CCOHTvGy73cy7G9vc399vf3ATg4OGB/f5/77e/vc3BwwP329/eRxL9ka2uL+21vbwOwtbWFJLa3t9na2mJra4sHOjg44MKFCzzlKU8B4Prrr+fg4ID9/X3uueceDg4OePKTn8y/ZGtri62tLa6//npe5mVeBoBLly4BcHBwwNOe9jSe8pSncHBwwHPb2tri4Q9/OC/zMi/DwcEBv/d7v8fLvMzLcHh4yA033MDBwQH329ra4tVf/dXZ2tri937v99je3uav//qvAZAEwEu91Evx0i/90vzu7/4uOzs7/M3f/A33e/jDH85Lv/RL83M/93P0fc8999yDJK699lquu+46AG644QYODg7Y2triYQ97GACbm5scHBxw3XXXAfDUpz4VSVx77bUA3HvvvWxubgJw6dIlDg8PeWGOHz/OO77jO37W13/9178PV1111VVXXXXVVf8yKlddddVVV1111VUvghMnTrz367zO67w3L4LM5H533nknANvb2wDceeed7O7ucuONNwKwv7/P4x//eB7zmMfw6Ec/mjvvvJP9/X1+4zd+gzNnzvCKr/iK3Hnnnezv73PnnXeys7MDwCu8wisA8Gd/9mcA/Nmf/Rmv8AqvwO/93u/xGq/xGtx44438zM/8DAD7+/v8+Z//Odvb2/zt3/4tr/Ear8Hrvu7r8oQnPIEnPvGJ7O/vI4n9/X1+67d+i+3tbR72sIfxl3/5l7zsy74sj3rUo7jrrrt44hOfyF133cX9Dg4O+Iu/+Av+4i/+gu3tbR75yEcCcMMNN7BYLHjt135tXu7lXo79/X3uuusu7r77bu6++26e2/7+Pvv7+zzpSU/iftvb2wCcP3+e8+fPc8MNN3BwcADA9ddfz6233grAsWPHuPbaawE4duwY/5EuXboEwKVLl7hw4QJPf/rTechDHgLA/v4+d999NwC2OTg44Du+4zu4nyRemK2tLR7xiEdw3XXXcf311wNw6dIlAA4ODnja057GPffcwz333MPzs7W1xcMf/nBe5mVehoODA37v936Pl3mZl+Hw8JAf//Ef54G2trZ4+MMfzku/9EvzjGc8g+/8zu/kZV/2ZXnqU58KgCS2trZ4tVd7Na677jq+//u/n4c85CH8zd/8Dfe77rrreLVXezUA+r7nnnvuQRJbW1u80Ru9Ec94xjN4whOewMHBAQAv9VIvBcDf/M3fcHBwAMC1114LwFOf+lQArr32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j+HVX/3VWSwW/Nmf/RnXX389T3va05DExYsXAZDE/a699lre6I3eiFtuuYXf+73f48d//Me5/vrruffee3mgra0tXud1XoeHPexhADz1qU/lz//8z3mghz3sYbz2a782f/u3f8v58+d56lOfiiQArr32Wl71VV+Vv/3bvwXg3nvvBeDaa6/l5V/+5fnbv/1bAA4PD9na2uJVXuVVeMYznsHFixcZhoGXe7mXY2trix/4gR9gsVjwci/3cuzu7nLu3Dke+tCH8oxnPIONjQ3GceQlXuIluN+f/umf/szZs2dv5aqrrrrqqquu+v+MylVXXXXVVVddddUzXbp0iePHjwOws7PDxYsXAbjxxht5xjOewYMe9CBuvPFGnvCEJwBw4403cuONN3LnnXfycz/3c3z4h384j370o7nzzjvZ399nPp/zjGc8g9d7vdfje7/3ewF4whOewCu8wiuwvb3NK77iK3JwcMCdd94JwJ/92Z/xCq/wCvze7/0er/EarwHAn/3Zn3G/EydO8IxnPIO/+7u/493e7d14q7d6K57whCfw53/+59xvf38fSYzjyP7+Pn/913/NW77lW7K/v89v/dZvcdddd/FA+/v7/OzP/izb29vcdddd/PRP/zSv8RqvwWu/9mvzci/3cjzpSU/irrvu4q677uK57e/v86QnPYknPelJ/MVf/AVbW1ssFgtqrfz2b/82t9xyCw996EN5uZd7Ofb39wG4++67ufvuu9nf3+fuu+/mRXVwcADAwcEB/xqS2Nra4oU5ODjguUniP9rW1hYPf/jDAbj++uu57rrrADg4OOCv//qv+c3f/E3e8i3fkqc//ekcHh7y4z/+47wwktja2uJhD3sYL/3SLw3A7/3e7/Enf/InvNiLvRj33XcfP/ETP8Hzs7W1xau+6qty3XXXcdttt/G93/u9POxhD+PGG2/k4OCAB7r22mt5ozd6Iy5dusQ3fMM38IhHPIJ7772XB3rJl3xJXuqlXoq//du/5eDggKc+9alIAuDaa6/lDd7gDbjfvffey/1e5VVehWc84xkA3HvvvUjiVV7lVQD4vd/7PSRx7bXXcu2113J4eMiJEyd46EMfCsAznvEMNjc3Adjd3eVBD3oQ93vGM57Bgx70IK655poH/8M//ANXXXXVVVddddX/a5Tjx49z1VVXXXXVVVf9//aKr/iKb/Xi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whOewJ/92Z/x7u/+7rz1W781P/3TP83+/j77+/vs7Owwn8/567/+a176pV8agD/7sz8DYH9/n+PHj/OMZzyDv/u7v+Pd3u3deKu3eiue+MQn8md/9mfcb39/n7/4i7/gSU96Eq/zOq/DU5/6VF7jNV6DRz3qUTzxiU/kz//8z3mg/f19/uIv/oInPelJ3HDDDdx1113ccMMNLBYL3uIt3oL9/X2e9KQn8cQnPpH9/X3uJwmA/f199vf3ufvuuwHY3t7m+uuv50lPehKPfOQj2d7eZnt7m62tLW644Qb29/c5ODhgf3+fu+++m/39fe6++25eEEk8PwcHBwAcHBzw/Eji30IS/1m2tra47rrr2Nra4vrrr+e6664D4ODggK2tLQAODg645557aK3x3d/93bwotra2eNjDHsbDH/5wtra2uHTpEveLCH7iJ34CSTw/L/VSL8XDHvYwAH7v936PRzziEZw9e5Ybb7wRSTzQwx72MF71VV+VS5cu8f3f//1cc8013HzzzTzQwx72MF71VV+Vv/3bv2Vzc5NbbrmF+21ubvKqr/qqXLp0iW/4hm/glltu4X6v//qvz7XXXsu9997Lgx/8YACuvfZarr32WgAkAfCSL/mS7O7u8mM/9mPcfPPNbG5u8jd/8zccHBywubnJczt27Bj33Xffg7nqqquuuuqqq/6/oxw/fpyrrrrqqquuuur/t1d91Vf96uuuu477zWYzLl26xPHjxzl79ixPfepTedSjHgXAuXPnuO+++3jJl3xJ7rzzTs6dO8ef/umf8qhHPYqHPexh/M3f/A3DMPCEJzyB++67j1d91VcF4K677mIYBra3t7npppvouo7HPOYxPP3pT2cYBoZh4K677uJBD3oQd9xxB6/yKq8CwN133839hmFgZ2eHP//zP8c2r/Iqr8KjH/1onv70pzMMAwCSGIaBJz7xiaxWK06fPs3jH/94XuVVXoVHPepRzGYz7rrrLu4niWEYOH/+PE960pN40pOexHw+52d+5mewzYu92Ivx8i//8jzqUY+i73vuueceXpBhGDh//jy33norf/EXf8GTnvQkzp8/z2w2YxgGTp06xfb2NoeHh7zUS70Uj3zkI3nkIx/JS7zES3Dq1ClmsxmnTp2i73sODg6QxL+FJP61JPFvIYkH2tra4uTJkzz84Q/nEY94BC/2Yi/Ga7zGa/BiL/ZinDp1CknceOONABwcHHDPPfdw22238dd//df86Z/+Kbfddhv33HMPz48kALa2tnjMYx7DS7/0S/OKr/iKbG1t8Vd/9Vf8wi/8Atvb2/zBH/wBf/M3f8OFCxcAkMQDvdRLvRSv9mqvxi233MKf/MmfcP311/O0pz2Nv/3bv2UYBgAkAbC1tcVrv/Zr85jHPIbf+73f48d//MfZ2dnh8PCQB3rVV31VXuqlXorf+73fYz6f8xd/8Rfcb3Nzk1d91VdlPp+zWq04f/4893vJl3xJHvawh/FzP/dzXLhwgcPDQwDe4A3egOVyyVd8xVdw/PhxHvrQh/LQhz6UX/3VX6WUwsu93Mtx4sQJ/vRP/5QTJ05w00038bu/+7s84hGP4IEuXLiw++u//utfw1VXXXXVVVdd9f8Zlauuuuqqq6666v+948ePc79nPOMZPOhBD+Kee+7hQQ96EDfddBN33nknADfeeCP7+/vceOONXLp0idd7vdfje7/3e9ne3ubg4IAbb7yR13u91+M3fuM3AFgsFvze7/0eL/3SL81dd93FnXfeyf7+Pr/xG7/B27zN25CZvPVbvzU//dM/zf7+PgB/9md/xqMf/Wh+/ud/njd/8zfn0Y9+ND/zMz/D/v4+APv7+0hiHEe+8Ru/kTd/8zfnrd7qrXjCE57AX/zFX/BA+/v7/OzP/iyPetSj2N/f56//+q95jdd4DR71qEfxxCc+kb/4i7/gue3v7/MXf/EXHDt2jGmauOuuu3jUox7Frbfeysu//Mvz8i//8uzv7/OkJz2Ju+66i7vvvpsXZH9/n/39fZ785CcDsL29zdbWFtvb26xWK7a3t7n++usBWK/XPPKRj+T666/nfvv7+xwcHLC/vw/A3XffDcDBwQH7+/scHBzw3CTxn2VrawuAra0trr/+egC2t7fZ2triuuuu434HBwcAPP3pT+fhD384AAcHBxwcHHD+/Hke97jHcc899/CvsbW1xcMf/nCuv/56rr32Wg4ODvjrv/5rrrvuOp7ylKdwdHTE5uYmf/M3f8MDSQJga2uLhz3sYbzUS70UBwcH/NVf/RUv8zIvQ0Twkz/5kzyQJABe8iVfkpd6qZfi0qVL/MAP/ABnzpzh5ptv5oG2trZ41Vd9Va699loAVqsVz3jGM7jf5uYmr/qqr8p8PqeUwq/92q9xv+uuu46XfMmX5BnPeAaLxYJ7770XgFd5lVdhc3OTe++9lwc/+MEAvORLviS7u7tcc801HBwccO211wKwsbHBQx7yEAAe9ahHAfA3f/M3vNRLvRQAfd8/mKuuuuqqq6666v879KAHPYirrrrqqquuuur/t8/8zM/0S73USwGwt7dHZnL33Xdz4403AvBTP/VTvP7rvz433ngjv/Ebv8Edd9zByZMneYu3eAt+/dd/nSc84Qlsb2/zkIc8hNd8zdfkp3/6p7nzzjsBeIVXeAWuvfZaTp48yU/91E+xv7+PJLa3t9nb2+Pd3/3diQh++qd/mv39fe536dIljh07xru927sRETzxiU/kz/7sz3ig7e1t9vb2eImXeAle4zVeg/39ff78z/+cJz7xiTy37e1tbrjhBh71qEdxww03sL+/D8ATn/hEnvSkJ7G/v88Lsr29zQ033MD111/Pox71KP7u7/6OU6dOccMNN7C/v8/dd9/NE5/4RO6++26eH0m8INvb29jmhhtu4Prrr+cnf/InOXbsGDs7Oxw/fpxjx45x7Ngxjh07xokTJ9je3uaBDg4OsA3AwcEBAAcHB9xvf3+ff4kktra2uN/W1hb3297eZmtri+d2cHDAhQsXuHTpEpcuXeLSpUvs7u5y++23A/BGb/RGANxzzz3cc889PJAkXhRbW1s8/OEP5+EPfzhbW1scHBzw13/917z6q78699xzD/fccw9/8zd/wwsiia2tLR72sIfxUi/1UhwcHLC1tcXBwQFPfepT+Zu/+Ruen+uuu45XfdVXZWtri9/7vd/j93//97npppt4btdeey1v+IZvyKVLlyil8Ed/9Efce++93G9zc5NXfdVXZT6f8/3f//0cO3aM+21ubvI2b/M2POMZz+DSpUv83d/9HQDXXnstr//6r8/v/u7vMgwD9957Lw996EN5lVd5FX7u536O/f19HvrQh/LKr/zK3HvvvfzGb/wG7/qu7wrA0572NB760IfyQH/zN3/D537u54qrrrrqqquuuur/M/SgBz2Iq6666qqrrrrq/7d3fMd3/KxhGD77Pd7jPbjfnXfeiW1uuukm/uRP/oQ/+7M/48M//MPZ39/ne77ne7jxxht52Zd9WU6cOMH3fu/3AvCYxzyGhz/84Zw8eZKf+qmfYn9/H4BXeIVX4FGPehQRwU//9E+zv78PwPb2Nnt7e7z7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+qfZ39/nfpcuXeLYsWO8x3u8BwA/8zM/w/7+Pg+0vb3N3t4er/Ear8FLvMRL8Od//uc88YlPZH9/n+e2vb3NpUuXuOWWW3jJl3xJTpw4wV133cWTnvQk7rrrLl6Q7e1tbrjhBh75yEfyV3/1V9xyyy28xEu8BPv7+xwcHPDEJz6Ru+++m/39fZ4fSTw/W1tb3HDDDVx//fVsb29z/fXXA/ALv/AL3HLLLZw+fZrrr7+e++3v7wNw9913I4n9/X329/c5ODgAYH9/n8PDQ/4tJPEv2dra4n5bW1tsb2+ztbUFwPXXXw/AddddxwMdHBzw9Kc/nUuXLvHqr/7qHBwccHBwwD333APAPffcwz333MO/RBL329ra4mEPexjXX3891157LQC///u/D8BLv/RL85SnPIW/+Zu/AUASz8/W1hYPe9jDeKmXeikODg74q7/6K37/93+fRz3qURweHvLctra2eOhDH8pLvdRLcdttt/EDP/ADvNzLvRz33nsvkrjf5uYmr/qqr8rm5iZbW1v82q/9Gvfeey/329zc5FVf9VWZz+d8//d/P8ePH+d+1157La//+q8PwK//+q9z7733AvD6r//6XHvttXz/938/EQHAW73VW3Hu3Dme/OQnc9999/Gu7/quPOMZz+Cv//qveau3eisA7rvvPq655hru93mf93n89V//tbjqqquuuuqqq/4/Qw960IO46qqrrrrqqquu+sqv/Eo/6EEPAmBvb4+//uu/5jVf8zX59V//de655x7e/d3fncc//vH8xm/8BsePH+fd3/3defzjH89v/MZvsL29zalTp3jzN39z/vRP/5Q/+7M/436v8RqvwUMe8hB+4zd+g7vuuguA7e1t9vb2ePd3f3cigp/+6Z9mf3+f+21vb7O/v8+7vdu7ERE84QlP4M///M95oO3tbR71qEfxCq/wCuzv7wPwxCc+kT//8z/n+dne3uZRj3oUL//yL89tt93GLbfcwv7+Pn/xF3/BE5/4RF6YnZ0drr/+eh75yEfyV3/1V9xyyy28xEu8BAD7+/vcfffdPPGJT+Tuu+/mfpJ4UW1tbbG9vc329jbXX38929vbAFx//fXc7+/+7u84duwYXdextbXF9vY2z+3g4ID77e/v80CS2N/f54G2t7exzQNtb28DsLW1xfNzcHAAwIULF7jtttt49Vd/de53cHDAwcEBd999NwD33HMP99xzD5L4t9je3uZhD3sYD3/4w9na2uLg4IC//uu/5tKlS7zWa70WT3nKU/ibv/kbHkgSz+1hD3sYL/VSL8XW1haXLl3i2LFj/MEf/AH33nsvBwcHSOK5veRLviQv9VIvxcHBAb/927/N3/3d33HTTTdxP0kAPPShD+VVX/VVecYznsHP//zP88hHPpJ7772X+21ubvI2b/M2XLp0ie///u/n+PHj3O/aa6/l9V//9XnGM57BD/zAD/CgBz0IgGuvvZbXf/3X5/u///u57rrruO+++3iJl3gJXuIlXoLv//7vJyJ45Vd+ZR760Ifysz/7s1xzzTW88iu/Mn/zN3/Dwx/+cDY3N7nf273d24mrrrrqqquuuur/OypXXXXVVVddddVVwP7+/m8Drw2ws7PDbDYD4BVf8RX5qZ/6KZ7xjGdw4403sr29TWuN3/3d3+WlX/qlufHGG7nrrru48847ueWWW3jMYx7DXXfdxZ133gnAarXiwoULvN7rvR4//dM/zf7+Pvv7++zs7HBwcMDW1hZv/dZvzZ/92Z/xhCc8AYCDgwN2dnb4gR/4AV7iJV6C13iN12BnZ4c/+7M/Y39/H4D9/X3+/M//nCc+8Ym8wiu8Avfddx+v8RqvwaMe9Sie+MQn8ud//uc80P7+Pn/+53/Ok570JB75yEfyC7/wC7z6q786r/3ar83LvdzL8cQnPpEnPelJ7O/v89z29/fZ39/nSU96Etvb25w/f54nPelJ/MZv/Aa33HILL/ESL8FbvMVbsL+/z/7+PnfffTd33303d999Ny+Kg4MDDg4OuOeee3jyk5/MA21tbbG9vc3W1hYXLlzg1ltvZXt7m62tLY4dO8b29jZbW1scO3aMY8eOcb+trS2e23XXXceL6tKlSwAcHBxw6dIlLl26xMHBAQcHB+zv7/MSL/ES2OaXfumXuOeee/iPsLW1xcMf/nCuu+46rrvuOgAuXbrEX//1X3Pbbbfxuq/7umxtbfHUpz6Vn/iJn+C5SeJ+W1tbPOxhD+OlXuqlAPi93/s9/u7v/o5Xe7VX42/+5m+4nyQe6Nprr+VVX/VVAfi93/s9fv/3f59HP/rR3HTTTdxPEpubm7zqq74q1157Lb/3e7/H7//+73PzzTdz7733cr9rr72WN3iDN+AZz3gG8/mc48ePc7/NzU1e//Vfn2c84xnM53Me9KAHAbC5ucnrv/7r84xnPINnPOMZRATXXHMNL/ESL8EznvEMrrvuOu677z4e+tCH8oxnPIONjQ0e8pCHAHD99dezubnJ/X7rt37re7jqqquuuuqqq64C9KAHPYirrrrqqquuuuqqd3zHd/ysd3qnd/psnunOO+/k/PnzvORLviQ/9VM/xZ133smHf/iH8/jHP57f+I3f4BVf8RV51KMeRUTwvd/7vQC8wiu8Atdeey0nT57kp37qp9jf32d7e5tHP/rRPOpRjyIi+Omf/mn29/cB2N7e5tGPfjSr1YqXfumX5glPeAJ//ud/zgO9/Mu/PH/2Z3/Gu73buxERPOEJT+DP//zPuZ8kALa3t3nLt3xL/vqv/5rXeI3XYH9/nz//8z/niU98Ig8kCYDt7W1uuOEGHvnIR/K0pz2Nl3qpl2J7e5u77rqLJz3pSTzxiU8EQBIvyPb2NltbW9xwww386Z/+KbfccgvHjh3jYQ97GNdffz0HBwfY5u677+buu+9mf3+fu+++m+dHEv8Wkrjf1tYW99ve3uaBbLO9vQ2AJAD29/d5bgcHBwAcHBzw3CTxryWJ52dra4vrrruOra0trrvuOq677joADg4O+Ou//mtuu+02brvtNt74jd+Ye++9l3vuuYd/iSRe6qVeiq2tLR72sIdxcHDAX//1X/PSL/3SPPWpT+Vv/uZveG6SALj22mt51Vd9Vba2tvi93/s9XuZlXoY//MM/5N577+W5XXfddbzBG7wBBwcH/MzP/AzXXHMN9957Lw/00Ic+lFd91VflGc94BvP5nF//9V/nfpubm7z1W781ly5dYrVa8eu//uvc7/Vf//WZz+esVit+4zd+A4DXe73XYz6fc/78ef74j/+YV37lV+ahD30o3//93891113H67/+6/O3f/u3bG9v85CHPIT7ff3Xf/37/NZv/dZ3c9VVV1111VVX/X9HOX78OFddddVVV1111VX33XffrW/+5m/+0TzAz/7sz/KKr/iK7OzscOedd3LixAmuvfZazp07x5133smTn/xkXuEVXgFJ3Hnnnezv7/Pwhz+c06dP89CHPpS/+Zu/YRgG9vf3uemmmzg8PORlXuZlePrTn84wDAzDwF133cWDHvQg7rjjDl7lVV4FgLvuuov73XXXXezs7PDnf/7n2OZVXuVV2NnZ4dy5c4zjyP2GYeDWW29lc3OTX/qlX8I2r/Var8WjHvUohmHg/PnzSOJ+wzBw/vx5nvSkJ7Fardje3uZXf/VX2d7e5pVe6ZV41KMexenTp1mv1xwcHPD8DMPAwcEBd999NxEBwObmJrPZjGEY+OM//mNss7W1xUu91EvxyEc+kkc96lE8+MEP5vrrr2c2m9H3PQcHB0jiX0sSDzQMA8MwMAwDBwcHHBwccHBwwMHBAQcHB1y4cIELFy5w4cIFLly4wMHBAQcHBxwcHHBwcMDBwQHDMDAMA89NEv8Wktja2uKWW27hlltu4aVf+qV59Vd/dR772Mdy8uRJAJ7+9Kfzd3/3d9xwww085SlP4eLFi+zt7bG9vc29997LwcEBL8zW1haPfexjeaM3eiO2trZ4ylOewt/93d/RWuOOO+7gb/7mb7j33nt5bpK49tprecM3fEMe85jHcM899/ADP/ADPOIRj+B3fud3ODw85IG2trZ47dd+bV7yJV+S3/u93+PHf/zH2dnZ4fDwkAd6lVd5FV7qpV4KgNtuu40//uM/5n6bm5u89Vu/NZcuXWK1WvHrv/7r3O/1X//1mc/nrFYrfuM3fgOAl3iJl+ChD30oP/7jP86dd97JNddcw8u93Mvxt3/7txwdHfFyL/dybG1t8WM/9mO8+qu/On3fc7/v+q7v+pjDw8Ndrrrqqquuuuqq/+8ox48f56qrrrrqqquuuuro6OjSG73RG332fD7nGc94Btdeey17e3uUUrj55pt5+tOfTkTw0Ic+lJ2dHf7mb/6GruvY39/nxV/8xTl37hznzp3jzjvv5O/+7u94hVd4BXZ2dnj605/OOI7cdddd/N3f/R0333wzL/MyL8O5c+fY398H4K677uLJT34yt912G2/8xm/Mox/9aJ7+9KczDAMAwzAgiVtuuYWf+Zmf4VVf9VV5zGMew2w246677uJ+wzBw/vx5dnZ2uO666/iZn/kZdnZ2eKVXeiUe9ahHMQwD58+f57kNw8Ctt97KbDaj1krf9/zJn/wJW1tbvMZrvAaPfOQjOX36NOv1moODA16QYRi4cOECz3jGM3jSk56EbZbLJUdHRwzDwKlTp/i1X/s1uq5ja2uLhz70obzES7wEL/dyL8cjHvEIHvzgB3P99dfT9z2z2Yzt7W0ODg54QSTxryWJfwtJvDBbW1ucPHmShz/84Vx33XW8zMu8DC/zMi/DK77iK/LYxz6WkydPAvD0pz+d2267jZMnT3JwcMDZs2e5cOEC9913H4973OO45557ODw85F9y3XXX8bCHPYw3fuM35rGPfSyLxYI///M/57rrruPw8JCnP/3p3HvvvQzDwPPzUi/1Urzqq74qj3nMY/iTP/kTfuEXfoEzZ86wu7vLvffey3N7yZd8SV77tV+b1ho/8RM/wS233MJqteKBNjc3ee3Xfm1uvvlmAH7t136Npz3taUgC4Nprr+VN3/RNecYznsF3fMd3cOHCBe73+q//+lx77bX8+I//OLfeeisA11xzDa/yKq/CM57xDIZh4PDwkFd+5Vdma2uLw8ND7rvvPl7u5V6Ov/mbv+EhD3kIN910E3/zN3/DddddB8B3fdd3fQxXXXXVVVddddVVgB70oAdx1VVXXXXVVVddBfDhH/7h3/U6r/M67723t8fOzg533nkne3t7POYxj+Hxj388f/qnf8rJkyd5i7d4C37913+dJzzhCUjizd/8zTl58iQ/9VM/xf7+Ptvb25w8eZI3f/M350//9E/58z//cwC2t7fZ29vjNV7jNXjIQx7CE57wBP7sz/6M+21vb7O/v8+7vdu7ERE84QlP4M///M95oO3tbfb29niJl3gJXuM1XoP9/X1+67d+i7vuuovntr29zaMe9Sge9ahH8Td/8ze8+qu/Ovv7+zzxiU/kL/7iL3hhtre3edSjHsX111/PX/3VX/ESL/ES3HLLLezv73P33Xdz11138aQnPYnnJokXZmtri+3tbba3t7n++uvZ3t7mt37rtzh+/Dg333wzAA9+8IPZ3t7mfvv7+wAcHBywv7/PwcEBBwcHABwcHACwv78PwMHBAS+MJF4UW1tb3G97e5utrS22tra43/XXXw/AddddxwMdHBxw4cIFbrvtNgCe8Yxn8FZv9Vbcc889HBwccM8993DPPffwgkji+dna2uJhD3sY29vbPOxhDwPg0qVL/N3f/R0v/dIvzVOf+lSe+tSncnBwwAuytbXFwx72MB72sIextbXF7/3e7/EyL/MyPPWpT+Vv//ZveX62trZ4gzd4A7a2tvi93/s9fv/3f5+bb76Z53bttdfyBm/wBly6dImf+7mf49prr+Xee+9FEgDXXnstr//6r88znvEMfuAHfoAHPehB3O9VXuVVeOhDH8r3f//3c91113HfffexubnJW73VW3Hp0iW+/uu/noc85CE89KEP5ZVf+ZX5uZ/7Ofb393nlV35lHvrQh/L0pz+dzc1NrrnmGu677z6uueYafuu3fuu7v/7rv/59uOqqq6666qqrrgL0oAc9iKuuuuqqq6666iqAF3uxF3vtz/3cz/0tgGc84xk86EEP4td//de55ppreMmXfEl+6qd+iu3tbR7xiEdw4sQJfvqnfxqA/f193v3d352I4Hu/93sB2N7e5iEPeQiv8RqvwZ/92Z/xZ3/2ZwBsb2/z6Ec/mtVqxUu/9EvzhCc8gT/7sz8DQBLb29vs7e3xEi/xErzGa7wGf/Znf8af//mf89xuuOEGXvd1X5dbb72Vl3iJl+CJT3wif/7nf87+/j7PbXt7mxtuuIFHPepRPO1pT+OlXuqlALjrrrt40pOexF133cXzIwmA7e1tHvnIR3L99ddzww038Hd/93e8xEu8BAD7+/vcfffdPPGJT+See+7h32J7exuA66+/HoDrr7+e7e1ttra22N7eBuAXf/EXufnmmzl27BgAJ0+eZGtrixfk4OCAf62trS1ekIODAwAuXLgAwG233QbAq7/6qwNwcHDAwcEBd999NwD33nsvBwcHHBwc8KKSxANtbW3xsIc9jOuuu47rrruOg4MDnv70p/MSL/ESHBwc8JSnPIWnPvWpHB4e8sJsbW3xsIc9jJd6qZfi4OCAv/7rv+alX/qleepTn8rf/u3f8vxsbW3xqq/6qlx77bXcdttt/MAP/AAAN998Mw+0ubnJS77kS/Kwhz2Mv/u7v+Pnf/7nufnmmwGQBMBDH/pQXuVVXoVnPOMZtNb4oz/6I+73Ei/xErzkS74kP//zP898Pue+++4D4PVe7/WYz+f83M/9HBHB5uYmb/VWb8UznvEMnvzkJwPw+q//+vzt3/4tZ8+e5fVe7/V4xjOewYMe9CAAvv7rv/59fuu3fuu7ueqqq6666qqrrgIqV1111VVXXXXVVc909uzZW5/xjGfwoAc9iN/7vd/jQQ96EDfeeCP3e8VXfEV+6qd+iic84Ql8+Id/OK/3eq/HT//0T7O9vU1EsL29zeu93uvxG7/xG+zv7zMMAwCv8AqvAMCf/dmfsb+/z5/92Z/xCq/wCvz1X/81r/EarwHAn/3ZnwGwv7+PJObzOT/wAz/Au73bu/HoRz+aP/uzP+OJT3wi97v77rv52Z/9WR71qEcBsFgseMu3fEue+MQn8sQnPpH9/X3ut7+/z5Oe9CSe9KQn8ahHPYr9/X1uuOEGFosFb/EWb8H+/j5/8Rd/wROf+ETuJ4n77e/v8xd/8RcAbG9vc/3113PXXXdxww038Dd/8zc89KEP5S3e4i3Y39/n4OCAu+66i7vvvpu7776bf4kkDg4OAHjyk58MwJOf/GQeaGtrC4ALFy5w4cIFtre3ue+++wDY3t5mZ2eH7e1tALa2tgDY2tri3+Pg4ACAS5cucXBwwMHBAQcHB+zs7ACwv78PwHd913fx/EjiX2Nra4vt7W2uvfZarrvuOq677joALl26xN/93d9x3XXXcXBwQGuN7/me7+F+knh+tra2eNjDHsbDHvYwtra2uHTpEveLCH7qp36K52dra4uHPvShvNRLvRSXLl3i4OCAixcvcvPNN/Pcrr32Wt7gDd6Ag4MDfuAHfoCXeImX4Oabb+aBXuIlXoKXfMmX5Pd+7/c4duwYf/d3f8f9HvrQh/KSL/mSAMznc+677z4AXvmVX5lrr72Ww8NDIgKAV37lVwbg537u5zh58iSv93qvB8D29jbb29sA/O7v/i7v8R7vwe7uLr/1W7/13Vx11VVXXXXVVVddgR70oAdx1VVXXXXVVVdddb8P//AP/67XeZ3Xee8777yTaZo4ceIEv/Ebv8GpU6d4zdd8TX7qp36Kvb09Tp06xZu/+Zvzp3/6p/zZn/0Z29vbvOd7vicAf/qnf8qf/dmfAfDoRz+avu95jdd4Df7sz/6MP/uzP+N+r/AKr8BqteI1XuM12N/f52d+5mfY39/nftvb2+zt7fESL/ESvMZrvAZ/9md/xp//+Z8jiQfa3t7mUY96FPfeey8v8zIvw/b2Nk984hN54hOfyP7+PpJ4btvb2zzykY/kz/7sz3j1V391XuIlXoL9/X3uuusunvSkJ3H33XfzL9ne3mZra4t/+Id/4NixY9xyyy3ccsstnD59muuvv56DgwNsc/fdd3P33Xezv7/P3Xffzf0k8W8hiX/J1tYWDySJf8nBwQHPTRL/WpL4l2xtbfHwhz8cgOuuu47rrrsOgIODA/76r/+a2267jdtuuw2Al3mZl+Gee+7h+ZHEA21tbfGwhz2Ml3qpl+Lg4IC//uu/5u/+7u941Vd9VZ761KdyeHjI87O1tcVDH/pQXuqlXoqDgwN++7d/m5tvvpm//du/RRIPtLm5ycMe9jBe8iVfkttuu40f+IEf4NGPfjSHh4fcb2tri1d5lVfh2muvBeDXf/3Xuffee7nfS7zES/CSL/mS/N7v/R7r9Zr77rsPgIc+9KG88iu/MgC//uu/zn333cdDH/pQXvmVX5nf/d3f5eLFi2xubvL6r//6/O3f/i3/8A//wLu8y7uwu7vLMAxcc801/NZv/dZ3f/3Xf/37cNVVV1111VVXXXUF5fjx41x11VVXXXXVVVfd79Zbb/2b13iN1/jo2WzGNE2cOXMGgN3dXUopvNiLvRh/+qd/ynXXXUcphVtuuYVz585x7tw5fv3Xfx2Al3iJl2A2m3HnnXdy/vx5Tp48yR133MGrvMqrAHDXXXcBcNddd/HkJz+Zv/u7v+MlXuIleMxjHsO5c+fY398HYBgGJPGkJz2JS5cu8fIv//K85Eu+JLPZjLvuuov7DcPAXXfdhW1msxmPe9zjeLmXezke9ahHMZvNODg4YBgGHmgYBu6++252dnaotfJLv/RL7O7ucuONN/KKr/iKPPKRj+T06dOs12sODg54foZh4ODggMViQSkFgForfd/zoz/6o9x6662sVitOnTrFQx/6UF7iJV6CRz3qUbz4i784p06dou97ZrMZAMMw8KKQxItiGAaGYWAYBoZhYBxHhmFgGAaGYWAYBoZhYBgGhmFgGAaemyT+LSRxv62tLU6ePMnDH/5wrrvuOl76pV+aV3/1V+exj30sW1tbADz96U/n937v9/jFX/xFTp48ycWLF9nb22N7e5vt7W0ODg54fiQBsLW1xWMe8xje6I3eiMc85jEsFgv+/M//nB//8R/nxV7sxbhw4QL33nsvwzAgiQfa2tri0Y9+NK/92q/N1tYWf/Inf8LOzg7PeMYzuP322wGQxP0e+tCH8oZv+IZsbm7yq7/6q/z6r/86N998M+M4cr9rr72WN3uzN0MSP/qjP8p9993Hvffey/1e5VVehUc/+tH83u/9Huv1mnvvvRdJXHPNNbzma74mf/u3f8t3fMd30HUd11xzDa/5mq/JM57xDM6ePcvu7i6v//qvT9/3PP3pT+fRj340J06c4O677+bEiRMcHR3xQz/0Qx9z9uzZW7nqqquuuuqqq666gnL8+HGuuuqqq6666qqr7nd4eLj74Ac/+LMf+chH8nVf93U86EEP4pprruEJT3gCN998M6dPn2Z7e5s///M/50lPehIv8RIvwcMe9jD+5m/+hvl8zi233MKdd97Ji7/4i3Pu3Dn29/c5d+4cJ0+e5A//8A954zd+Y7a3t3n6058OwHw+Z3t7mz//8z/HNq/yKq/CbDbjrrvu4n7z+Rzb/Nmf/Rm2eZVXeRUe9ahHcf78efb397nfMAzcdddd2GZ7e5sbbriBzc1NHv3oR3Pq1CmGYWB/f58HGoaB8+fPIwnbzOdzfuZnfgbbnDp1ild8xVfkkY98JKdPn2a9XnNwcMDzI4lhGDh//jzPeMYziAhmsxm2OTo6AuDHfuzHuHjxIrfddhubm5vcfPPNvOzLviwv/uIvziMe8Qhe/MVfnFOnTvGgBz2Ivu+ZzWYADMPA/STxryWJfwtJvCi2trY4efIk1113HQ960IN4+MMfzmMf+1he/dVfncc+9rE8/OEPZ2tri0uXLnH33Xfzd3/3d/zkT/4kt9xyC5cuXeLixYvs7e2xvb3Nvffey8HBAf+S7e1tHvOYx/BGb/RGPOYxj2GxWPDnf/7n/OAP/iBnzpzhjjvuYDabce+993I/Sdxva2uLRz/60bz2a782W1tb9H3PxYsXeeITn8jjH/94hmEAQBIAm5ubvPZrvzaPecxj+L3f+z1+/Md/nJMnT7JYLHigl3zJl+RVX/VVue222/j2b/92jh8/zuHhIfd7/dd/fW6++Wa+//u/n8Viwb333oskrrnmGl7/9V+fZzzjGVy8eBHbALzyK78yrTW+/du/nb7veeVXfmWuvfZa7rvvPp74xCfyyq/8yjzjGc/gB37gB3i913s9fvVXf5Vf+7Vfex+uuuqqq6666qqrng096EEP4qqrrrrqqquuuuqBXud1Xscf/uEfzv7+PnfccQePecxjePzjH8+f/umfcvLkSd7iLd6Cn/7pn2Zvb4/Xe73X48Ybb+TOO+/kp3/6pwF4hVd4BebzOQ95yEP4jd/4De666y4Atre3iQje7d3ejf39fX76p3+a/f19AHZ2drj99tt59Vd/dV7jNV6D/f19fuZnfob9/X0e6FGPehSv8AqvwMWLFzlx4gRPfOITeeITn8j+/j7PbXt7m0c96lHce++9vMRLvAS33HIL+/v7/MVf/AVPfOITeUEksb29zSMf+Uj+9E//lFtuuYWXeImX4JZbbmF/f5+7776bu+66iyc96UkASOJFtbW1xfb2Ntvb21x//fVsb2/zMz/zM9xyyy0A3HzzzRw7dowTJ06wvb3N/fb395HE/v4+BwcHANx9993c7+DgAID9/X0ADg4OuJ8kXhRbW1vcTxJbW1sAbG1tsbW1BcD29jZbW1sAXHfddTzQwcEBrTX+7u/+DoC9vT12d3d53dd9Xe655x4A7rnnHu655x4eSBL/kq2tLR72sIcB8NIv/dIAXLp0ib/7u7/j7/7u73jVV31VnvrUp3JwcMALIomHPexhPOxhD+Paa6/l0qVL/P7v/z433XQTT3va0zg4OOCBJLG5ucnDHvYwXvIlX5JLly7x8z//89x2223cfPPNPNDm5iav+qqvyrXXXsvv/d7v8fu///vccsst3G9zc5NXeZVX4dprr+X7v//7ue6667j33nuRxDXXXMPrv/7r84xnPIPWGn/8x38MwOu93utx7bXXcu+99/Ibv/EbXHPNNbz+678+v/d7v8cwDDz0oQ/lIQ95CE9/+tO55ppr2Nzc5PM///P5q7/6K3HVVVddddVVV131bOhBD3oQV1111VVXXXXVVQ90zTXXPPhDPuRDnv6SL/mS/Pqv/zrXXHMNL/mSL8lP/dRPceONN3Lttddy8uRJvvd7v5ft7W3e5m3ehu3tbf70T/+UP/uzPwPgFV7hFZjP5zzkIQ/hN37jN7jrrrsA2N7e5q3f+q2530//9E9zcHDA/W644QbuvPNO3u3d3o2I4AlPeAJ//ud/zv0ksb29zaMe9She/uVfnv39fQCe+MQn8ud//uc8N0lsb2/zyEc+kj/7sz/j1V/91XmJl3gJ9vf3eeITn8iTnvQk9vf3uZ8kntv29jaPfOQjuf766/mrv/orXuIlXoJbbrkFgP39fe6++26e9KQncffdd/OiksQDbW1tsb29zdbWFtvb22xtbbG9vc3W1hY///M/z7Fjx9jZ2eHYsWMAHDt2jK7r2N7eZmtri/8sBwcH3O/ChQtcunSJS5cucb/bb7+dt3iLt+Dg4ICDgwMODg44ODjg4OCAe+65h3+JJJ6fra0ttra2uPbaa7nuuuu47rrrODg44MKFC9x222289Eu/NE996lO55557uPfee3lhtra2eNjDHsZLvdRLAfD7v//7/N3f/R2v+qqvylOf+lQODw95fl7qpV6Kl3zJl+Tg4ICtrS3+9m//lr/927/luT30oQ/lVV/1Vbl06RI///M/z7XXXsu9997L/TY3N3mDN3gDpmmi1sof/dEfce+99wJw7bXX8vqv//o84xnPYD6f8xu/8RsAvPIrvzIPfehDOTw85Nd//dc5PDzkrd7qrTh37hz7+/vce++9vN7rvR6/+7u/y4kTJ3iJl3gJfvd3f5ev+ZqvEVddddVVV1111VXPCT3oQQ/iqquuuuqqq6666rm9zuu8znu/+7u/+3dFBE94whN41KMehSR+6qd+ioODAz7swz6MJzzhCfzGb/wG29vbPOQhD+E1XuM1+NM//VP+7M/+jO3tbfb393nzN39zTp48yW/8xm9w1113AbC9vc3+/j6v8RqvwYMf/GCe8IQn8Od//ufcb3t7m729PV7iJV6C13iN1+Cuu+7iN3/zN9nf30cS99ve3ublX/7lOXv2LK/+6q/O/v4+T3ziE/nzP/9zACTxQNvb29xwww088pGP5GlPexov9VIvBcBdd93F3XffzZOe9CT+Jdvb21x//fU88pGP5Gd+5md4iZd4CW655RZuueUW9vf3Abj77ru5++67edKTnsTzI4l/ra2tLSSxvb3N1tYWW1tbZCYAW1tbABw7dozt7W0Atra2+Lc4ODgA4NKlSxwcHABwcHDAwcEBOzs7HBwccHBwAMA999zD/STxbyEJgK2tLba2trj22mu57rrruO666wC4dOkSf/d3f8dtt93G677u63LPPffwtKc9jYODA/4l1157LQ9/+MN52MMexsHBAX/913/NS7/0S/PUpz6Vv/3bv+UFecmXfEle6qVeioODA/7qr/6KRz7ykfzhH/4hh4eHPNDm5iav+qqvyrXXXsvv/d7v8fu///vccsstPNC1117L67/+63Pp0iVqrfz0T/8097v22mt5/dd/fZ7xjGfwAz/wAzz4wQ8G4KEPfSiv/MqvzM///M8zn8+57777eL3Xez2uvfZavv/7v59SCq/3eq/HbDbjtttu49prr+Waa67h67/+69/nt37rt76bq6666qqrrrrqqueEHvSgB3HVVVddddVVV1313K655poHv+mbvunT3+It3oJf//Vf5xVf8RXZ2dnhT//0T3n84x/PqVOnePM3f3P+9E//lD/7sz/j0Y9+NH3f89Iv/dI8/vGP58///M/Z3t7m0Y9+NPP5nAc/+ME84QlP4M/+7M8A2N7eZn9/n5d4iZfgNV7jNfizP/sz/vzP/5wHevmXf3n+7M/+jHd7t3cjInjiE5/In//5n/P8vOVbviVPe9rTePVXf3X29/d54hOfyF/8xV/wgmxvb/PIRz6Se++9l1tuuYWXeImXYH9/n7vvvpsnPvGJ3H333fxLtre32d7e5vrrr+eGG27g+uuv5/d///e55ZZbuOWWWwDY39/n7rvv5u6772Z/f5+7774bSfxrSeJfSxL/FpL415LEi2pra4utrS2uu+46AF76pV+a+126dIm/+7u/49Vf/dU5ODjgKU95Cvfeey/33HMPAJJ4Yba2tnjYwx7GS73USwHwd3/3d9x22208+tGP5t577+WpT30qL8hLvuRL8lIv9VIcHBzwV3/1V7zMy7wMf/RHf8S9997Lc3vJl3xJXvIlX5JLly7x8z//87zES7wEf/d3f8cDvcRLvAQv+ZIvyW233cYP/MAPcMstt3C/a6+9ltd//dfnGc94Bq01/viP/xiAa665htd//dfnb//2b7nvvvu47777eOhDH8orv/Ir8/3f//3s7OzwkIc8hJd4iZfg8PCQv/u7v+OVX/mV+b3f+z2++qu/Wlx11VVXXXXVVVc9L8rx48e56qqrrrrqqquuem6Hh4e7J06ceMajHvWot77pppv4uq/7Oh70oAdxyy23cNddd7G5ucmdd97JS7zES3Du3Dme/vSnc8stt3BwcMAjHvEIzp8/z7lz57jrrru49tprueOOO3jxF39xZrMZd911F8MwAPDkJz8ZgFd5lVfh0Y9+NE9/+tMZhgGAu+66i52dHf78z/8c27zKq7wKj3rUozh//jz7+/s80BOf+EROnDjBL//yL2ObV37lV+ZRj3oUfd9z991389yGYeDuu+/GNsePHwfgT/7kT7jxxht5xVd8RR75yEcym80AODg44PkZhoGDgwPuvvtunvSkJ/HkJz+ZzCQikMT29jaz2Yy77rqLm2++mZd7uZfj5V7u5XjEIx7BqVOneNCDHkTf98xmMw4ODnhBJPFvIYl/LUn8a0ni+dna2qLve2655RZuueUWXvqlX5pXf/VX57GPfSwPf/jD2dra4tKlS1x77bUcHBwwDANPe9rTuHjxIn/wB3/A4x//eO69914ODg64nySe29bWFo95zGN4tVd7NV7qpV6KxWLBn//5n3Py5EkuXLjArbfeyu23387Fixd5bltbWzz60Y/mDd/wDdna2uJP//RP+fEf/3Ee8pCH8Ed/9EccHh7yQJubm7z2a782D3vYw/i93/s9fuInfoKdnR3uu+8+7re5uclrvdZr8bCHPYzf+73f4xd+4Re45ZZbuN9DH/pQXuu1XotnPOMZtNb44z/+YwCuueYaXv/1X59nPOMZDMPA05/+dK655hpe8zVfk2c84xmM48g4jrzma74mz3jGM/jWb/1W3uqt3orlcsmv/uqvvs+tt97611x11VVXXXXVVVc9L/SgBz2Iq6666qqrrrrqqufnzJkzD3qzN3uzW9/iLd6CP/3TP2V7e5sbbriBiOB7v/d7eYVXeAWuvfZaTp48yU/91E+xv7/PK7zCKzCfz3nIQx7Cb/zGb3DXXXcB8Aqv8AqsVite4zVegz/7sz/jz/7szwCQxO7uLseOHePd3u3diAie+MQn8md/9mc80A033MArvMIrcP78eV7iJV6CJz7xifz5n/85+/v7PLdHPepRPOpRj+JpT3sar/7qr87+/j533XUXf/EXf8H+/j4vyM7ODo985CN55CMfye/+7u/yEi/xEtxyyy3s7+9z991388QnPpG7776b+0niX7K9vc3111/P9ddfz2/+5m+ys7PD8ePHufnmmzl27Bi33HIL99vf3+fg4ID9/X0ODg7Y39/n4OCAg4MDDg4O+NeQxL+FJP41tra22N7eZmtri62tLQCuu+46rrvuOu53cHBAa42/+7u/A+C2227j9ttv543e6I0AuPfee7nnnnv4l0jifltbWzzsYQ/jpV7qpQA4ODjgr//6r3npl35pnvrUp/LUpz6Vg4MDJPH8bG1t8dCHPpSXeqmX4uDggL/+67/mpV/6pfnbv/1bnva0p/HcNjc3edjDHsZLvuRLctttt/HzP//zXLp0iZtvvhkASQBce+21vP7rvz6XLl3i53/+57ntttu45ZZbuN9LvMRL8JIv+ZL83u/9Hl3X8bSnPQ2Aa665htd//dfnGc94Bq01/viP/5jNzU3e6q3eimc84xns7e3x93//97ze670es9mMCxcucHBwwEu8xEvw/d///fzUT/2UuOqqq6666qqrrnr+0IMe9CCuuuqqq6666qqrXpBrrrnmwR/yIR/y9Ac/+MH8xm/8BoeHh7z7u787f/qnf8oTnvAE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VVddddVVV/1LXud1Xue93+It3uK7Tp48yU/91E/xiq/4ijz60Y9mf3+f7/3e72V7e5v3fM/3BOAJT3gCv/mbvwnAK7zCK7BarXiN13gN/uzP/ow/+7M/A2B7e5v9/X1e4iVegtd4jdfgz/7sz/jzP/9zHmh3d5dbbrmFN3/zNycieOITn8if//mf89y2t7fZ29vjJV7iJXj1V3919vf3eeITn8hf/MVf8IJcf/31POpRj+JRj3oUf/d3f8dLvMRLsL+/z913380Tn/hE7r77bl4YSWxvbwNw/fXX88hHPpLrr7+e3//93+eWW27hlltuAWB/f5+DgwP29/e5++67OTg44O677+ZFIYl/C0n8a0niX0sS/1qS2Nra4rrrrmNzc5PrrruO6667DoCDgwMuXLjAbbfdxku/9EtzcHDAPffcw7333su9997Li2Jra4uHPexhvNRLvRQAv//7v8+rv/qr89SnPpV7772Xpz71qTw/W1tbPOxhD+MlX/IlAfj93/99fv/3f5+Xe7mX49577+W5veRLviQv+ZIvyaVLl/j5n/95brvtNm655RYe6CVe4iV4yZd8SX7v936P3//93+dBD3oQ93uJl3gJXuIlXoK//du/RRJ/93d/B8Drvd7rce211wLwG7/xG9x333283uu9HrPZjPV6zR//8R/zlm/5ljzjGc/gO77jO17nH/7hH36bq6666qqrrrrqqhcOPehBD+Kqq6666qqrrrrqRfG6r/u6/rAP+zD29/f5qZ/6Kfb39/mwD/swnvCEJ/Abv/EbbG9v85CHPITXeI3X4M/+7M/4sz/7MwBe4RVegVd4hVcA4M/+7M/4sz/7MyQBsLu7y0u8xEvwWq/1WgD8zM/8DPv7+9xve3ubRz3qUazXa1791V+d/f19/vzP/5wnPvGJPLdHPepRPOpRj+JpT3saL/VSLwXAE5/4RJ70pCexv7/P87O9vc0NN9zA4x//eG655RZe4iVegltuuYX9/X3uvvtu7rrrLp70pCfxQJJ4fra3twG4/vrruf7669ne3ub666/n7/7u7zh27Bi33HILAPv7+wDcfffd3H333QAcHBxw991380CS+NeSxL+WJP61JPEv2dra4rrrrmNra4utrS22tra47rrrADg4OODChQvcdtttvPqrvzoHBwfcc889HBwccO+993LPPfdwP0m8MNdeey3XXXcdL/VSLwXApUuX+Lu/+zt+//d/nzd5kzfhb//2b3lBtra2eOhDH8pLvdRLcXBwwF//9V/z0i/90vzt3/4tT3va03hu1157La/yKq/C1tYWv/d7v8fv//7vc8stt/BAm5ubvMEbvAGbm5v8wA/8ALfddhu33HILkgB45Vd+ZR760IcC8Md//Mc87WlPA+CVX/mVeehDH8r3f//3c/3113Pffffxeq/3elxzzTV8//d/P6UUXu/1Xo9rrrmGr//6r+e3fuu3xFVXXXXVVVddddW/DD3oQQ/iqquuuuqqq6666kVxzTXXPPjN3uzNnv7mb/7m/Omf/ilPeMITOHnyJG/+5m/On/7pn/Jnf/ZnbG9vc/LkSd78zd+cJzzhCfzmb/4mAJcuXeIlXuIlePM3f3P29/f5mZ/5Gfb39wHY3t5mb2+PN3/zN+fEiRM88YlP5M/+7M+4nyS2t7d5y7d8S2699VZe4iVegv39fX7rt36Lu+66iweSxPb2Nq/92q/N0572NF7qpV4KgLvuuosnPelJ3HXXXTyQJO63vb3NIx/5SK6//nr++q//mptvvpmXeImXYH9/n7vvvpu77rqLJz/5yfxrbG9vs7W1xfb2Ntdffz3b29tcf/31/OIv/iI333wzp0+f5vrrr+d++/v7HBwccHBwAMDdd9/NwcEBAPv7+xwcHPCCSOLfQhL/Wtvb2wBsbW2xtbXF1tYWW1tbbG1tcd1113G/g4MDAJ7+9Kdz6dIlXv3VX52DgwMODg645557uPfee7nnnnt4QSTx3La2tnjYwx7G1tYWD3vYwwC4dOkSf/d3f8dLv/RL89SnPpWnPvWpHB4e8oJsbW3x0Ic+lJd6qZfi4OCAv/7rv+alX/ql+aM/+iPuvfdentvm5iav+qqvyrXXXsvv/d7v8bIv+7L80R/9Effeey8P9BIv8RK85Eu+JLfddhs/8AM/wCu8witw7733IonNzU1e+ZVfmWuvvRaAX//1X+e+++4D4PVe7/W49tpr+f7v/36uu+46zp49yyu/8ivzkIc8hO///u/n+uuv55prruElXuIl+P7v/35+6qd+Slx11VVXXXXVVVe9aNCDHvQgrrrqqquuuuqqq15UZ86cedC7vdu73foar/Ea/MZv/AZ33nknD3nIQ3iN13gN/vRP/5Q///M/Z3t7mxMnTvDmb/7mPOEJT+A3f/M3Abh06RLHjh3j3d7t3YgIfvM3f5O77roLgO3tbfb29niJl3gJXuM1XoP9/X1+5md+hoODA+63vb3Nox71KP7sz/6MN3uzN+OWW27hiU98In/+53/O/v4+AJK43/b2Ni/3ci/Hox71KG677TZuueUW9vf3eeITn8hf/MVfACCJ52d7e5tHPvKRXH/99fz1X/81N998My/xEi8BwMHBAU984hO5++67ufvuu/mXSOKBtra2ALj++uv54z/+YwCOHTvGsWPHOHbsGDs7Oxw7doxjx45x8uRJtra2eKCDgwMA9vf3OTg44H4HBwccHBzwQPv7+7wwkgDY2trifltbW9xve3sbgK2tLQC2trbY2trigQ4ODmitcdttt3Hp0iUAbr/9dm677Tbu90Zv9Ebce++93HPPPfxrSAJga2uLhz3sYVx33XVce+21APzd3/0dly5d4qVf+qV56lOfylOf+lQODw95Qba2tnjoQx/Kwx72MLa2trh06RLHjh3jb//2b3nqU5/K4eEhz21zc5OHPexhvORLviSXLl3i53/+53mJl3gJ/u7v/o4H2tzc5FVe5VW49tpr+b3f+z1+//d/n1tuuYX7XXvttbz+678+ly5d4ud//ue59tprue+++wB4vdd7Pa699lq+//u/n+uuu46zZ8/y4i/+4rzES7wEP//zP89isQDg9V7v9fjbv/1bfvzHf/x1/uEf/uG3ueqqq6666qqrrnrRoAc96EFcddVVV1111VVX/Wu84zu+42e90zu902fv7+/zG7/xG2xvb/N6r/d6APzZn/0Zf/Znf8b29jYRwbu927uxv7/P933f9wGwvb3N/v4+L/ESL8FLv/RL88QnPpE/+7M/437b29vs7e3x5m/+5pw4cYInPvGJ/Pmf/zkPtL29zaMe9SjuvfdeXuIlXoITJ05w11138Rd/8Rfs7+/z3La3t3nkIx/Jox71KP7mb/6GV3/1V2d/f5+7776bJz7xidx99928MNvb21x//fU88pGP5Hd+53e4+eabedjDHsb111/P/v4+BwcH3H333dx1113cfffdPJAk/jW2trbY3t5me3ubra0tfvu3fxuAY8eOcd1113Hs2DGOHTvGsWPHOHbsGPc7duwY/xkuXboEwKVLl7jfbbfdxsHBAbfffjsHBwcAvM7rvA4HBwccHBxwcHDAwcEBDySJf42trS0e/vCHc+2113LdddcBcOnSJf7u7/6O22+/ndd5ndfh3nvv5W/+5m94IEk8t62tLR760IfyUi/1UhwcHPDXf/3XvPRLvzRPfepT+bu/+zuen83NTR72sIfxki/5kly6dInf//3f5+abb+Zv//ZvkcQDvcRLvAQv+ZIvyW233cbP//zP88hHPpJ7772X+73kS74kL/ESL8Ftt93GD/zAD/CgBz2I+73e670e1157Ld///d/Pddddx9mzZ3nIQx7CK7/yKwPwG7/xGxweHvKWb/mWAPzIj/zIZ//oj/7o53DVVVddddVVV131okMPetCDuOqqq6666qqrrvrXesd3fMfPeuVXfuXPPnnyJD/1Uz/FjTfeSN/3vMZrvAZ/9md/xp/92Z+xvb3NW7/1W3O/n/7pn2Z/f5+dnR1uv/12Xv3VX53XeI3X4K677uI3f/M32d/fB2B7e5tHPepRvMIrvAL7+/sAPPGJT+TP//zPeaDt7W329va45ZZbeImXeAlOnDjB3XffzZ//+Z+zv7/Pc9ve3uaGG27g8Y9/PLfccgsv8RIvwS233ML+/j5PetKTuOuuu7j77rt5YXZ2dtja2uL666/nhhtu4Prrr2d/f5+DgwOuv/569vf3Abj77ru5++67OTg44O677+ZfQxIvzNbWFgDb29tsbW0BIImtrS22trZ4oK2tLV4QSdzv4OCA++3v73O/g4MDAA4ODgA4PDzk4OCAfy1JvCBbW1tcd911bG5uct1113HdddcBcHBwwNbWFgAHBwc89alP5Z577uHee+/l+ZHE/ba2tnjoQx/Kwx72MLa2trh06RJ/93d/x+///u/zJm/yJvzt3/4tAJJ4oM3NTR72sIfxki/5khwcHPDXf/3X/P7v/z6PetSjODw8BEASANdeey2v8iqvAsBf/uVf8vu///vccsst3G9zc5NXeZVX4dprr+X3fu/3+P3f/30e9KAHAbC5uckrv/Irs7W1BcAf/dEfcd999/HQhz6UV37lV+bnf/7nWSwWHB4e8sqv/MrMZjPuuOOO3/7Mz/zM1+Gqq6666qqrrrrqXwc96EEP4qqrrrrqqquuuupf65prrnnwi7/4iz/9wz7sw9jf3+d7v/d7uXTpEq/xGq/Ba7zGa/Bnf/Zn/Nmf/Rnb29vs7+/zbu/2bkQEv/Ebv8Hdd98NwA033MCdd97Ju73buxERPOEJT+DP//zPud/29jav+7qvy9Oe9jRe/dVfnbvuuovf+q3fYn9/nwfa3t7mUY96FC//8i/PbbfdxokTJ7jrrrt40pOexF133cXzs729zaMe9Sj+9E//lJd4iZfgpV7qpdje3mZ/f58nPelJ3HXXXdx99908kCSe2/b2NltbWzzykY/kN3/zN7nlllu4+eabOXbsGLfccgsA+/v7HBwcsL+/z913383BwQF33303L4gk/rUk8a8liX8tSfxrSeJ+W1tbXHfddWxubnLddddx3XXXcb/bbruN2267jb29Pf7u7/6ON37jN+aee+7h3nvv5UWxvb3NQx/6UB72sIextbXFwcEBf/3Xf83f/d3f8aqv+qo89alP5fDwkPtJ4n6bm5u85Eu+JA972MO4dOkSx44d42//9m956lOfyuHhIfeTxObmJq/yKq/Ctddey9/93d/x8z//87zCK7wC9957L/e79tpref3Xf30ODw/56Z/+aa699lruu+8+AK655hpe//Vfn0uXLlFr5Wd+5mcAeOhDH8orv/Ir87d/+7f8/M//PA95yEN4vdd7Pa655hq+4Ru+gd/8zd8UV1111VVXXXXVVf96lOPHj3PVVVddddVVV131r3V4eLh7eHj4Pbu7ux/9Cq/wCuzs7HD33XfzoAc9iKc97Wm8yqu8CgBPf/rT2d7e5s///M+xzau+6qvS9z133XUX+/v77Ozs8Od//ufY5lVe5VUAuOuuuwAYx5G77rqL6667jhtuuIGLFy/y0i/90sxmM/b39xmGAYBhGLjrrrt40pOexHw+53GPexw33ngjr/iKr8ijHvUohmHg/PnzPNA4jtx9991EBLVWZrMZp06d4s/+7M+45ZZbePmXf3ke+chHMpvNADg8POT5GYaBg4MDnvGMZxARACyXS46OjhiGgR/7sR/j0qVLdF3H1tYWL/VSL8UjH/lIXvZlX5ZHPOIRnDp1igc/+MH0fc9sNkMSwzDwryGJfy1J/GtJ4kWxtbXFyZMnue6667jlllt46Zd+aV76pV+aV3zFV+Sxj30sJ0+eBODpT386f//3f8+f//mfc+bMGc6ePcvFixc5e/Ys29vb3HvvvRweHvLCbG1t8ZjHPIZXe7VX46Ve6qXY2trir//6rzl58iRPfepT2d3dZRxH7r33XsZx5IEk8dCHPpTXeq3X4qVe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5ZZbkATAQx/6UF75lV+ZS5cu8QM/8AM88pGP5L777mNzc5NXfuVX5tprrwXgN37jN7jvvvt45Vd+ZR7ykIfw/d///dx22238xV/8hbjqqquuuuqqq67690EPetCDuOqqq6666qqrrvqPcM011zz4Xd/1XZ/+Gq/xGjzhCU/gN3/zN7l06RLHjh3j3d7t3YgIfuZnfob9/X22t7fZ29vjJV7iJXiN13gNnvjEJ/Jnf/Zn7O/vA7Czs8PLv/zLc/bsWV791V+d/f19fuu3fou77rqLB9re3uZ1Xud1eNrTnsarv/qrs7+/zxOf+ESe9KQnsb+/z3Pb3t7mUY96FNdffz1Pe9rTeOhDH8oNN9zA/v4+T3rSk7jrrru4++67eSBJPNDW1hY33HAD119/Pdvb2/zVX/0VN998M6dPn+b6668HYH9/n3vuuYe77rqLg4MD7r77bl4YSfxbbG9vA7C1tQXA9vY2D7S1tcWL6uDggPsdHBwAcHBwAMDh4SH/WpJ4Yba2tgB42MMeBsB1113HddddB8ClS5f4u7/7O/b29njN13xNnvrUp3LPPfdw77338kCSeG5bW1s89KEP5WEPexhbW1scHBzw13/917z0S780T3va0/jbv/1bnp/NzU0e9rCH8ZIv+ZIcHBzw13/917z0S780f/zHf8y9997LA21ubvIGb/AGbG5u8nu/93s88pGP5I/+6I84PDxEEpubm7zyK78y1157Lb/3e7/H7//+7/OgBz0IgM3NTV7/9V+faZqotfLHf/zH3Hfffbze670e11xzDT//8z/Pn/7pn77OP/zDP/w2V1111VVXXXXVVf9+6EEPehBXXXXVVVddddVV/1GuueaaB7/Zm73Z09/8zd+cJzzhCfzmb/4m29vb7O/v827v9m5EBE94whP48z//cwB2d3e55ZZbeMu3fEsAnvCEJ/Dnf/7nSALgUY96FC//8i/Prbfeyku8xEvwxCc+kT//8z9nf3+f+0lie3ub137t1+ZpT3saL/VSLwXAXXfdxZOe9CTuuusuHkgSANvb2zzykY/k5V7u5fj93/99XuqlXort7W329/d50pOexF133cXdd9+NJF6Y7e1trr/+eq6//nq2t7e5/vrrAfi7v/s7HvzgB7O9vQ3A/v4+99xzD3fddRcABwcH3H333QBI4l9LEv9akvjXksS/liQeaGtr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V+Haa6/l937v9/j93/99HvvYx3J4eAjAQx/6UF75lV+ZS5cu8fM///Nce+213HfffVx77bW83uu9HpcuXWK9Xt/6IR/yIQ/hqquuuuqqq6666j8HetCDHsRVV1111VVXXXXVf5ZrrrnmwS/xEi/x9Jd4iZfgpV/6pXnCE57An//5n7O9vc3e3h4v8RIvwWu8xmtw11138Zu/+Zvs7+8jiUc96lG8/Mu/PLfeeisv8RIvwROf+ET+/M//nP39fe63vb3Ny7/8y3P27Fle6qVeCoC7776bJz7xidx11108t52dHV7u5V6O3/zN3+TVXu3VeImXeAn29/e5++67ueuuu3jSk57EA0nigba3t7n++uu5/vrreeQjHwnAbbfdxi233ALA/v4+d999N3fffTcHBwfcfffd/Esk8cJsbW0BsL29zdbWFgAbGxvc78YbbwRge3ubra0tnp+DgwO2trb41zg4OOB+d955JwAHBwccHBxw7NgxDg4OODg4AOCee+7hfpL415LE1tYWAA972MO49tprue666wA4ODjgwoUL3HLLLRwcHHDvvfdycHDA3/7t3/Ivufbaa7n22mt5qZd6KQ4ODvjrv/5rbrvtNl78xV+cpz71qRweHvLcNjc3edjDHsZLvuRLcnh4yF/91V/xiEc8gj/6oz/i8PCQ+21ubvLQhz6Ul3zJl+S2227j1KlT/NEf/RH33XcfAJubm7zyK78y1157Lb/3e7/H7//+7/OgBz0IgJd4iZfgJV7iJbjtttv4gR/4Af78z/9cXHXVVVddddVVV/3nQQ960IO46qqrrrrqqquu+s/28i//8n71V391XuM1XoMnPvGJ/OZv/iYAly5d4tixY7z7u787AE984hP58z//cwC2t7d51KMexb333surv/qrExE88YlP5M///M8BkATA9vY2L/dyL8dTnvIUXv3VX51jx47xxCc+kSc96Uncdddd3E8SANvb21x//fU88pGP5IYbbuDv/u7veImXeAn29/e5++67ueuuu3jSk56EJF6Y7e1trr/+ev74j/+YY8eOccstt3DzzTdz+vRprr/+egD29/e5++67ufvuuzk4OODuu+/mgSTxryWJf8nW1hYPJIl/ycHBAQ8kiX8tSfxLtra22Nra4tprr0US1157Lddddx0ABwcH/PVf/zUAf//3f8+lS5d44zd+Y+655x7uvfdeACTxglx77bVce+21vNRLvRQAly5d4tixYxwcHPC0pz2Nv/3bv+X52dzc5CVf8iV52MMexqVLl/j93/99br75Zp72tKdxeHjI/TY3N3noQx/KS77kS3J4eMhv//Zvc/PNN/P3f//33O+hD30or/zKr8ylS5f4+Z//eW677TYe9KAHAfB6r/d6XHvttfze7/0ev//7v8+f//mfi6uuuuqqq6666qr/XOhBD3oQV1111VVXXXXVVf8VXv7lX9633HILb/mWbwnAz/zMz7C/v8/29jb7+/u8xEu8BK/+6q/OXXfdxW/91m+xv78PwPb2Nnt7e7zES7wEr/7qr87+/j5PfOIT+Yu/+AseaHt7m0c+8pG8/Mu/PH/3d3/HS7zES7C/v8+TnvQk/uIv/oLnZ3t7m0c+8pH82Z/9GTfffDO33HILL/ESL8H+/j533303d999N0960pN4UWxvb3P99ddz/fXXs729zW/91m9x/Phxbr75Zk6fPs31118PwP7+PgcHBxwcHHD33XdzcHDA/v4+BwcH/Esk8a8liX8tSfxrSeKBtra22Nra4tprrwXguuuu47rrruN+BwcHXLhwgdtuu43bbruNt3zLt+SpT30qAE996lM5ODjg+ZHE/ba2tnjoQx/K1tYWD3vYwwC4dOkSf/d3f8cf/MEf8MZv/Mb83d/9Hc/P5uYmD3vYw3joQx/K1tYWly5d4tixY/zt3/4tT3va0zg8POSBXuIlXoKXfMmX5PDwkL/6q7/i93//93n0ox/N0dERAJubm7zyK78y1157LX/3d3/Hz//8z/OgBz0IgM3NTV7/9V+fzc1NfuAHfoDbbruNP//zPxdXXXXVVVddddVV//nQgx70IK666qqrrrrqqqv+q1xzzTUPfomXeImnv8ZrvAYPfvCDeeITn8if/dmfAfDyL//yvMIrvAKXLl0iInjiE5/In//5n3O/7e1t9vb2eImXeAle/dVfnf39fZ74xCfyF3/xFzzQ9vY2j3zkI/nzP/9zXvzFX5xXf/VXZ39/n7vvvpsnPvGJ3H333Tw/29vbPPKRj+T666/nr//6r7n55pt5iZd4CQD29/d50pOexN13383dd9/N8yOJB9ra2gLg+uuv5/rrr2d7e5vf+q3f4vjx49x8880APOQhD2Fra4v7HRwcsL+/z8HBAfv7+xwcHHBwcADA/v4+h4eH/GtJ4l9LEi/M1tYWAFtbW2xtbbG1tcX29jabm5tsbW2xtbXF/Q4ODnj605/OpUuXALjtttt4y7d8S5761KcCcM8993DvvffyopDE1tYWD33oQ7nuuuu49tprOTg44K//+q8BeOmXfmme+tSn8tSnPpXDw0Mk8dw2Nzd52MMexku+5EtycHDAX//1X/N3f/d3vNqrvRp/+7d/iyQe6CVe4iV4yZd8SQB+//d/n9///d/n5V/+5bn33nsBkMRLvMRL8BIv8RJcunSJn//5n+e2227jQQ96EAAv8RIvwUu8xEtw22238QM/8APcdtttD7nvvvtu5aqrrrrqqquuuuq/BnrQgx7EVVddddVVV1111X+la6655sG33HLL01/91V+d13iN12B/f5+f+ZmfYX9/n52dHR71qEexWq149Vd/dfb39/nzP/9znvjEJ3K/Rz3qUTzqUY/iaU97Gq/+6q/O/v4+T3ziE/mLv/gLHmh7e5sbbriBJzzhCdxyyy28+Iu/OLfccgv7+/s86UlP4klPehL7+/s8Pzs7O1x//fU88pGP5Ld/+7e5+eabedjDHsb111/PwcEBd911F3fffTf7+/vcfffdSOJFtbW1BcANN9zA9ddfz9bWFtvb22xtbXG/v/u7v+PYsWOcPHmSra0tHujg4ACA/f19JLG/vw/AwcEBAAcHBzw/BwcHPNDW1hbPbWtrC0kAbG1tAbC1tQXA1tYWW1tbPLeDgwNaa9x22228xEu8BPc7ODjg4OCAe+65B4B7772Xe+65h/tJ4kWxtbXFwx72MK699lquu+46AA4ODvjrv/5rbr/9dl73dV+Xe+65h7/927/luUkCYHNzk4c97GE89KEPZWtri0uXLvF3f/d3/P7v/z6v+ZqvydOe9jTuJwmAl3iJl+AlX/IlAfj93/99XuZlXoa//du/5WlPexr3u/baa3mVV3kVNjc3+b3f+z1uvPFG/viP/xiAzc1NXvmVX5lrr72W3/u93+P3f//3+fM//3Nx1VVXXXXVVVdd9V8LPehBD+Kqq6666qqrrrrqv8MrvMIr+NixY7zru74rEcETn/hE/vzP/xyA7e1t3vIt35K/+Zu/4dVf/dW56667+K3f+i329/cBkMQjH/lIHvWoR/G0pz2NV3/1V2d/f58nPelJ/Pmf/znPbWdnh+uvv54nPOEJvPiLvziv/uqvzv7+Pvv7+zzpSU/iSU96EveTxANtb2+ztbXFP/zDP3Ds2DFuvvlmbrnlFh784Aezvb3N/v4+BwcH3H333dx9993cfffd/Esk8dy2trYA2N7eZmtri62tLX7nd34HgJ2dHba3t7nxxhs5duwYADs7Oxw7doz7HTt2jP9Ily5dAuDSpUvc79KlS1y6dIk777yTvb09Dg4OAHid13kdAO69914ODg44ODjghZHE87O1tcXm5ibXXXcd1113Hddeey0ABwcH/PVf/zUAf//3f8+lS5d4mZd5Ge69915ekK2tLR72sIexubnJwx72MA4ODvjrv/5r/u7v/o5Xe7VX46lPfSqHh4c80NbWFg996EN5yZd8SQ4PD/mrv/orXuZlXoa//du/5WlPexr329zc5FVe5VW49tpr+bu/+zse+tCH8kd/9Efcd999ADz0oQ/llV/5lbl06RI///M/z2233caf//mfi6uuuuqqq6666qr/euhBD3oQV1111VVXXXXVVf9dzpw586CXeqmXuvUlXuIlePVXf3X29/f52Z/9Wfb399ne3uZRj3oUf/Znf8abvdmbceLECe666y7+/M//nIODA+73qEc9isc//vG8xEu8BC/1Ui8FwF133cWTnvQk7rrrLiRxv+3tba6//npuuOEGHvnIR/J3f/d3vMRLvAT7+/vcfffd3HXXXTz5yU/mhdna2uKGG27g+uuv5zd/8ze55ZZbuPnmmzl9+jTXX389APv7+9xzzz3cddddHBwccPfdd/NAkvjXkgTA1tYWAFtbWwBsb28DsLW1BcDW1hb3k8T9tra2eKCDgwOe28HBAQ90cHDAwcEBAAcHBxwcHPDcJPGvJYmtrS0AHvawhwFw7bXXct111wFwcHDAX//1XwPw93//97zKq7wKAH/7t3/LC7O1tcVDH/pQtra2eNjDHsbBwQEXLlzglltu4d577+WpT30qT3va03hum5ubPOxhD+MlX/IlOTw85K/+6q/4/d//fV7rtV6Lpz3tadxvc3OThz70obzkS74kly5d4hd+4Rd4iZd4Cf7u7/4OgM3NTV75lV+Za6+9lt/7vd/j93//9/nzP/9zcdVVV1111VVXXfXfBz3oQQ/iqquuuuqqq6666r/b67zO67z3O77jO37WbDZ7cETwxCc+kT//8z8HYHt7m0c96lHce++9vOZrviYAT3ziE3nSk57E/v4+99ve3ublXu7leNSjHsWlS5c4duwY+/v7/MVf/AVPetKTeG7b29tcf/31POEJT+CWW27h5ptv5iVe4iXY39/n4OCAJz3pSdx9993s7+/zwmxvb3P99ddz/fXXs729zfXXX88v/uIv8uIv/uKcOHGC7e1tAPb397nnnnsAuPvuuzk4OODuu+/mRSGJfy1J/GtJ4l9LEi/M1tYWANdddx2bm5tcf/31XHvttdzv4OCACxcucNttt/Hqr/7qHBwc8NSnPhWAv/mbvwFAEi/I1tYWD33oQ7nuuuu49tprOTg44MKFC9x22238wR/8AW/yJm/C3/7t3/L8PPShD+Xaa6/lYQ97GJcuXeLYsWMcHh7yR3/0R9x7773cb3Nzk4c+9KG85Eu+JJcuXeL3f//3ueWWW/i7v/s77vcSL/ESvMRLvASXLl3i53/+57ntttv48z//c3HVVVddddVVV1313ws96EEP4qqrrrrqqquuuup/gmuuuebBr/3ar/1eN95442e/+qu/Ovv7+/z5n/85T3ziEwHY3t5mb2+PW265hdd8zdcE4IlPfCJPetKT2N/f537b29s88pGP5M///M95tVd7NV7iJV6C/f19nvSkJ/GkJz2J/f19ntv29jbXX389j3zkI/nrv/5rbr75Zl7iJV4CgP39fZ70pCdx9913c/fdd/PcJPFAW1tbAGxvb/OIRzyC7e1trr/+en7xF3+Rm2++mWPHjnHLLbdwv4ODA/b39zk4OGB/f5+DgwMODg7Y39/n4OAAAEn8a0niX0sS/xqSANja2mJra4utrS02NzcBuO6667juuuu438HBAa01/u7v/g6AV3/1V+fg4ICnPvWpANxzzz3ce++9PD+SeKCtrS0e+tCH8rCHPYytrS0ODg54+tOfzu23385rvuZr8rSnPY2//du/5fnZ3NzkYQ97GC/5ki8JwN/93d9x2223cfPNN/O0pz2Nw8ND7re5uclDH/pQXvIlX5LDw0P+6q/+it///d/nMY95DIeHhwBcc801vMqrvAqbm5v83u/9Hr//+7/Pn//5n4urrrrqqquuuuqq/xnQgx70IK666qqrrrrqqqv+Jzlz5syDPvdzP/e377333ge/xEu8BE984hP58z//c/b39wHY2dnh5V7u5Th79iwv9VIvBcATn/hEnvSkJ7G/v8/9tre3uf322zl27Bgv/uIvzku91Euxvb3N/v4+f/EXf8GTnvQknpsktre3uf7667n++uv5zd/8TV78xV+chz3sYVx//fXs7+9zcHDAk570JPb397nnnnt4UWxtbQFw/fXX8yd/8icAHDt2jJ2dHY4dO8axY8e4+eab6bqO66+/ngc6ODgA4ODggP39fQAODg44ODgAYH9/H4CDgwPud3h4yL+WJLa2trjf1tYWAFtbWwBsbW0BsLW1xdbWFgDXXXcdD3RwcADAhQsXuO222wC4/fbbue2227jfq7/6q3NwcMC9997Li0ISW1tbPPShD+W6667j2muvBeDSpUv83d/9Hbfddhuv93qvxz333MPf/u3fIonntrm5ycMe9jCuvfZarr32Wg4ODvjrv/5rfv/3fx+Am2++mQfa3NzkoQ99KC/5ki/J4eEhf/VXf8UjHvEI/uiP/ojDw0Mksbm5ySu/8itz7bXXcttttzGfz2/9+q//+vf5h3/4h9/mqquuuuqqq6666n8O9KAHPYirrrrqqquuuuqq/2muueaaB7/2a7/2e7XWPvvVX/3VOXHiBE984hN54hOfyMHBAQDb29u83Mu9HGfPnuWlXuqlALj77rt54hOfyF133QWAJAC2t7d5uZd7Of7iL/6CF3/xF+clXuIl2N/f5+677+auu+7iSU96EgCSeKCtrS22t7f5h3/4B44dO8Ytt9zCzTffzEu8xEsAsL+/z8HBAXfffTd33303d999Ny+MJJ7b1tYW29vbbG1tcf311wPwG7/xG0hiZ2eHY8eOAXDLLbcAsLOzQ9d1bG9vs7W1xYvq4OCAB9ra2uJFcXBwwP0uXLjA3t4ely5dAuDSpUtcunQJgNtvv523fdu35eDgAIB7772Xg4MDDg4OuJ8k/iVbW1sAPOxhD+Paa6/luuuuA+Dg4IC//uu/BuAP/uAPAHiZl3kZ7r33Xh5IEve79tprufbaa3nJl3xJDg4OePrTn87f//3f82Iv9mLce++93HvvvUjifpubmzz0oQ/lJV/yJTk8POSv/uqveMQjHsEf/dEfcXh4CMDW1hYPfehDeYmXeAkuXbrEL/zCL1BK+ewf/dEf/Ryuuuqqq6666qqr/udBD3rQg7jqqquuuuqqq676n+qaa6558Gu/9mu/14033vjZL/VSLwXAE5/4RP7iL/6C+21vb/PIRz6Sl3/5l+e2227jlltuYX9/n7/4i7/gSU96Eg+0vb3N9ddfzyMf+Uj++q//mhd/8RfnlltuYX9/n7vvvpsnPelJ3H333bwg29vbXH/99Vx//fX85m/+Jrfccgs333wzp0+f5vrrr2d/fx+Au+++m7vvvpuDgwPuvvtu7ieJf63t7W0Atra22N7eBqC1xtbWFpLY2tpiZ2eH7e1t7re1tcW/xcHBAfe78847ATg4OADg4OCAY8eOcXBwwMHBAZK45557+NeQxHPb2triYQ97GADXXnst1113HQAHBwf89V//NQB/8Ad/wBu/8RsD8Ld/+7e8IJK49tprufbaa3nJl3xJAG677TZuu+02XvqlX5qnPe1p/O3f/i0PJImHPvShPPShD+Xaa6/l0qVLHDt2jL/927/laU97GoeHhwBsbm7y0Ic+lJd8yZfk8PCQv/qrv+LOO+/87B/90R/9HK666qqrrrrqqqv+50IPetCDuOqqq6666qqrrvqf7syZMw96qZd6qVtf4iVegld/9Vdnf3+fJz3pSfz5n/8599ve3uaRj3wkf/7nf86rvdqr8RIv8RLs7+/zpCc9iSc96Uns7+/zQNvb21x//fU84QlP4JZbbuHFX/zFueWWW9jf3+fuu+/m7rvv5klPehIviCS2tra4/vrruf7669ne3ub666/nF3/xF3nxF39xbrnlFgD29/cBuOeee7j77rs5ODhgf3+fg4MD/iWS+NeSxPOztbXFAx0cHHA/SfxrSOJfa3t7m83NTa677joArr32Wq677joADg4OuHDhArfddhuv/uqvzsHBAU996lMB+Nu//VtemK2tLR760IcC8FIv9VIAXLp0ib/7u7/jD/7gD3iTN3kTnvrUp3J4eMgDbW5u8rCHPYyXfMmXBOC2227jF37hF3i1V3s1/u7v/o77bW5u8tCHPpSXfMmX5PDwkL/6q7/i93//97n11lsffPbs2Wdw1VVXXXXVVVdd9T8betCDHsRVV1111VVXXXXV/xbXXHPNgz/8wz/8uy5evPjar/7qr87+/j5PfOIT+Yu/+Avut729zQ033MATnvAEXvzFX5xXf/VXZ39/n7vvvpu77rqLJz3pSTy37e1tbrjhBh7/+Mdzyy238OIv/uLccsstAOzv7/OkJz2Ju+++m7vvvpv7SeK5bW1tsb29zdbWFtdffz3b29tcf/31/OIv/iI333wzp0+f5vrrrwfg4OAAgLvvvhuAu+++m4ODAwDuvvtuACTxryWJfw1J/GtJ4vnZ2tpia2uLa6+9FoDrr78e21x33XXc7+DggAsXLnDbbbfx6q/+6hwcHHDvvfdycHDAPffcw7333guAJF6Qra0tHvrQh3Lddddx7bXXcnBwwIULF7jtttv4gz/4A97kTd6Epz71qRweHvLcNjc3ecmXfEke9rCHcXh4yF/91V/x+7//+7zpm74pf/d3f8f9Njc3eehDH8pLvuRLAvD7v//7PPKRj7z167/+69/nH/7hH36bq6666qqrrrrqqv8d0IMe9CCuuuqqq6666qqr/re55pprHvzhH/7h33Xx4sXXfvVXf3X29/d54hOfyJOe9CT29/cBkMT29jYv93Ivx1Oe8hRe/MVfnFtuuYX9/X3uvvtunvjEJ3L33XdzP0kAbG9vc/311/PIRz6S3/qt3+KWW27hYQ97GNdffz37+/vcfffd3H333RwcHHD33XfzL9na2gLghhtu4I//+I8BOHbsGDfffDMAt9xyCzs7O5w8eZKtrS3ud3BwAMD+/j4HBwccHBxwcHAAwP7+PgAHBwcAHBwcACCJfy1JvCBbW1vcb2tri62tLba2tgDY2tpia2sLgOuuu44HOjg44MKFC1y6dIlLly6xt7fHbbfdxqVLlwB44zd+Y+655x7uvfdeXhBJ3G9ra4uHPvShXHfddVx77bUAHBwc8Nd//dfcdtttvOVbviVPe9rT+Nu//Vuen83NTR72sIfxki/5kgBcunSJv/u7v+OGG27g3nvv5WlPexr329zc5KEPfSgv+ZIvyeHhIX/1V3/FIx/5yFu//uu//n3+4R/+4be56qqrrrrqqquu+t8FPehBD+Kqq6666qqrrrrqf6trrrnmwS/5ki/59Jd4iZfgpV7qpQC46667eNKTnsTdd9/N/ba3t3nkIx/Jn/3Zn/HiL/7ivMRLvATHjh1jf3+fJz3pSdx9993cfffdPLetrS1uuOEGrr/+era3t7n++uv5u7/7O17iJV4CgP39fe6++27uvvtuDg4OuPvuu3lBJPFAW1tbAFx//fUAXH/99WxtbbG9vc3P/dzPcezYMQBuueUWAHZ2djh58iQAW1tbPD8HBwc80MHBAS+qra0tALa2tnhBDg4OALhw4QIAe3t7XLp0iUuXLnHp0iXe4i3egoODAw4ODjg4OODg4IDDw0Puvfde/jW2t7d56EMfynXXXce1114LwMHBAU9/+tN5iZd4CQ4ODnjqU5/Kvffey7333oskntvm5iYPe9jDeOhDH8rW1haXLl3i7/7u7/iDP/gD3uRN3oS/+7u/44E2Nzd56EMfyku+5EtyeHjIX/3VX/H7v//7HB0dvc4//MM//DZXXXXVVVddddVV/zuhBz3oQVx11VVXXXXVVVf9b3fNNdc8+B3f8R0/63Ve53Xe+7bbbuOWW25hf3+fv/iLv+BJT3oSD7S9vc0jH/lI/uzP/owXf/EX59Vf/dUBODg44IlPfCJ33303d999N8/P9vY2119/Pddffz2/+Zu/yS233MLNN9/M6dOnuf7669nf3wfg7rvv5u677+bg4IC7774bSfxrbW9vA7C1tcX29jZbW1tcvHgRgBtvvBGAra0tbrzxRv6zHBwccOnSJQDuvPNODg4OODw85Oabbwbg3nvvBeCee+7hBZHEC7O1tcXDHvYwAK699lquu+46AA4ODnj605/OpUuXuP3223nFV3xFDg4O+Nu//VuemyQANjc3edjDHsbDHvYwNjc3OTg44K//+q/5+7//e171VV+Vpz71qRweHiKJ+73ES7wED3vYw9jc3OTSpUscO3aMH/mRH/ns3/7t3/6e++6771auuuqqq6666qqr/ndDD3rQg7jqqquuuuqqq676v+LMmTMPep3XeZ33zszPfvEXf3Fe4iVegv39fZ70pCdx1113cffdd3O/7e1ttra2eNSjHsUjH/lIfv/3f5+HPexhXH/99ezv73P33XfzpCc9ibvvvpvnJgmAra0trr/+eq6//nq2t7f5q7/6K26++WYAXuIlXgKA/f19JHH33Xdz9913c3BwwP7+PgcHB7wgkvjXksTW1hYPtLW1xQsjCYCDgwMe6ODggOdHEv9akgDY2tpic3OT6667DoBrr72W6667DoCDgwMuXLjAbbfdxt7eHq/5mq/JU5/6VAD+9m//lhdma2uLhz3sYTz0oQ9la2uLg4MD/vqv/5qXfumX5mlPexr33nsv9957Lw+0tbXFQx/6UF7yJV8SgL/7u7/j93//9zl58uRn/9Zv/dZ3nz179hlcddVVV1111VVX/d+AHvSgB3HVVVddddVVV131f80111zz4Ac/+MFPP3bsGC/+4i/OS73US7G9vc3+/j5/8Rd/wZOe9CTuJ4nt7W22trb4h3/4B44dO8aLv/iLc8stt3DLLbewv7/P3Xffzd13383+/j733HMPL8jW1hbb29tsbW1x/fXXs729zfXXX88v/uIvcsstt3Dq1Cmuv/56AA4ODgC4++67Abj77rs5ODgA4J577uFfSxL/GpL415LEC7O1tcXW1hbXXnstANvb22xubnLddddxv4ODAy5cuMBtt93Gq7/6q3NwcMC9997LwcEB99xzD/fddx8vzNbWFg996EO57rrruPbaawG4dOkSf/d3f8ftt9/Obbfdxsu+7Mty77338kCbm5s87GEP49prr+Xaa6/l8PCQv/qrv+L3f//3AfizP/szcdVVV1111VVXXfV/D3rQgx7EVVddddVVV1111f9lZ86cedA7vdM7ffYTn/jE9361V3s1XuIlXoL9/X3uvvtu7rrrLp785Cfz3La3t3nEIx7Bn/3Zn3HLLbdw88038xIv8RIAHBwccNddd3H33XdzcHDA3XffzQuzvb0NwPXXX88f//Efc+zYMQBuvvlmAG655RZ2dnY4efIkW1tb3O/g4ACA/f19Dg4OALjnnnsA2N/fB+Dg4ACAw8ND/rUk8S/Z2toCYGtrC0lsbW2xubkJwNbWFltbWwBcd911PNDBwQEXLlxgb2+PS5cucdtttwFw++23A/BGb/RG3HPPPdx77708kCSe29bWFg996EMBeKmXeikADg4O+Ou//msA/uAP/oA3eZM34d577+Xee+/luV177bVce+21vORLviQHBwc8/elP5+///u+JiM/+rd/6re8+e/bsM7jqqquuuuqqq676vws96EEP4qqrrrrqqquuuur/g2uuuebBL/ZiL/bar/M6r/Net95662u/xEu8BLfccgv7+/vcfffdPOlJT+Luu+/muW1vb3P99ddz/fXX88hHPpJf+IVf4CVe4iW45ZZbANjf3+eee+7hrrvu4uDggLvvvpsHksTzs7W1BcD1118PwPXXX8/W1hY/+7M/y87ODseOHePYsWMcO3YMgJ2dHbqu4/rrr+cFOTg44IEODg54UWxtbXG/ra0tXpCDgwMALly4wN7eHpcuXeJ+t912G3t7e7zVW70VBwcHHB4ecnBwwMHBAffeey8vCklsbW3x0Ic+lK2tLR72sIcBcHBwwIULF7jtttt46Zd+ae69914ODg74u7/7O56fzc1NHvawh/GSL/mSANx2223cdtttPPKRj7z1t37rt777R3/0Rz+Hq6666qqrrrrqqv8f0IMe9CCuuuqqq6666qqr/r85c+bMg17ndV7nvS9evPjZt9xyCy/+4i/OLbfcwv7+PnfffTd33303T3rSk3huktja2uL666/n8Y9/PAC33HILN998Mw9+8IPZ3t5mf38fgHvuuYe7776bg4MD7r77bl5UkgDY2toCYGtri+3tbba2trh48SIAW1tbHDt2jK2tLQBuvPFG/jMcHBxw6dIl9vb2ODg44ODggIODA26++WYODw85ODgA4J577uG5SeKF2draAuBhD3sYANdddx3XXnstAAcHBzz96U/n0qVL3H777dx222288Ru/Mffeey/33nsvAJK43+bmJtdeey1bW1u85Eu+JACXLl3i7/7u7/iDP/gDHvzgB3/2j/7oj34OV1111VVXXXXVVf//oAc96EFcddVVV1111VVX/X92zTXXPPi1X/u13+vixYuffcstt/DiL/7i3HLLLezv73NwcMBdd93F3Xffzd13340kntvW1hbXX389119/Pb/1W7/Fzs4OL/ESLwHAi7/4i3O/g4MD7r77bgDuvvtuDg4OuPvuu3kgSfxrSeJ+W1tbPNDW1hbPTRLP7eDggPsdHBzw3CTxryGJ+21tbQFw7bXXsrW1xXXXXcfm5iZbW1sAHBwccOHCBW677TZuv/12brvtNt74jd8YgKc97WkcHBzw/GxtbfGwhz2Ma6+9lmuvvRaA2267jdtuu40/+IM/4MEPfvBn//Zv//b33Hfffbdy1VVXXXXVVVdd9f8XetCDHsRVV1111VVXXXXVVVdcc801Dz5z5syD3+md3umznvGMZ7z2zTffzEu8xEsAsL+/z913383dd9/NwcEBd999N8/P1tYW29vbbG1tccMNN7C1tcVv//Zvc+zYMW655RZ2dna45ZZbuN/BwQH7+/scHBwAcM8997C/vw/APffcwwsjiX8tSfxrSeIF2draAmBra4utrS02NzfZ3t5mc3OT6667jvsdHBzQWuPv/u7vALj99tt5i7d4C+69914ODg649957uffee3lBtra2eOhDHwrAS73USwFwcHDAX//1XwPwyEc+8tbf+q3f+u7f/u3f/p777rvvVq666qqrrrrqqquuAkAPetCDuOqqq6666qqrrrrqeV1zzTUPfrEXe7HXOjw8/O5jx47x4i/+4txyyy3ccsstAOzv73P33Xdz9913c3BwwN13380DSeJ+W1tbAFx//fX88R//MQDHjh1jZ2eHY8eOcezYMY4dO8bOzg633HILD3RwcADAwcEB+/v7ABwcHHBwcMD9Dg4OADg4OOB+BwcHPD+SeG5bW1s80NbWFgBbW1tIYnNzk/ttbW2xvb3N5uYmW1tbPNDBwQEXLlxgb2+PS5cucenSJS5dusTtt9/O/V7t1V6Ng4MD7r33Xu4niee2tbXFQx/6UABe6qVeivvddttt3Hbbbfz93/89ly5d4sEPfvBn/+iP/ujncNVVV1111VVXXXXV84Me9KAHcdVVV1111VVXXXXVv+yaa6558Iu92Iu99ou92Iu91hOf+MT3vuWWW7j55pt5iZd4CQD29/c5ODjg7rvv5u677+aee+7hRbG1tcX29jbb29tsbW3xa7/2a+zs7CCJnZ0djh07BsCxY8c4duwYADs7O5w8eRKAra0t/jMdHBwA0Frj9ttvB+DSpUsAXLp0iUuXLrG3t8elS5cAeKM3eiMODg44ODjg3nvv5V8iia2tLTY3N7n22mu57rrruPbaawE4ODigtcbf/d3fcfvtt/OSL/mSv/33f//3v/3bv/3b33PffffdylVXXXXVVVddddVV/xL0oAc9iKuuuuqqq6666qqr/nWuueaaBwO82Iu92Gu/2Iu92Gu9zuu8znv/4i/+IrfccgunTp3i+uuvB+Dg4ID9/X0ODg64++67OTg44O677+b5kcTzs7W1BcDW1hbb29sAbG1tsb29zf22trYA2Nra4n5bW1u8qO655x62trYAODg44H4HBwcAHBwccL/Dw0P29/c5PDzk4OCA5yaJF2Zra4trr72Wra0trr32Wq677jrud3BwwF//9V8D8MhHPvLWs2fP3vr3f//3v/0P//APv/MP//APv81VV1111VVXXXXVVf9a6EEPehBXXXXVVVddddVVV/37XXPNNQ9+sRd7sdc+Ojr6rmPHjrGzs8OxY8e45ZZb2NnZ4ZZbbgHg4OAAgLvvvhuAu+++m4ODAw4ODjg4OOBFJYl/DUn8a0niX0MSAFtbW2xubrK1tcXW1hbXXnstW1tbbG1tcb9Lly7xd3/3dwDcdttt3H777QBsbm6+z2/91m99N1ddddVVV1111VVX/UdAD3rQg7jqqquuuuqqq6666j/P67zO67z30dHRdwHs7Oxwyy23AHDLLbews7PDyZMn2dra4n4HBwccHBywv78PwD333APA/v4+BwcHABwcHCCJfw1J/GtI4rltbW0BsLW1xdbWFpubmwBsbW2xvb3N5uYmW1tb3O/g4IDWGn//938PwKVLl/j7v/977rexsfE+v/Vbv/XdXHXVVVddddVVV131nwU96EEP4qqrrrrqqquuuuqq/zrXXHPNgwFe7MVe7LUBXuzFXuy1rrnmmgefOXPmwddcc82Df/EXf5FbbrkFgJ2dHbqu4/rrr+e5HRwccL+DgwMADg4OeKD9/X3uJ4kXZmtri/ttbW1xv62tLba2tnh+Dg4OuHDhAnt7e1y6dAmAV3u1V+O+++679ezZs7fed999t9533323nj179hn33Xffrf/wD//w21x11VVXXXXVVVdd9V8JPehBD+Kqq6666qqrrrrqqv8ZrrnmmgcDnDlz5kHXXHPNQwB2d3dfC+DhD3/4g6+55poHX3PNNQ+++eabud+xY8f4z3bp0iUuXbrE2bNnb7106RJPecpTbr3vvvtuve+++259tVd7Nc6ePfuM++677+lnz559xn333XcrV1111VVXXXXVVVf9T4Ee9KAHcdVVV1111VVXXXXV/z7XXHPNg21bks6cOfNggGuuuebBgAEBnDlz5kG8iM6ePfsMwIDuu+++W3mm++677+lnz559BlddddVVV1111VVX/W+EHvSgB3HVVVddddVVV1111VVXXXXVVVddddVVV/2fROWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9X8Y+OhatrVtJpPAAAAABJRU5ErkJggg==) +```js +fn transform(i) { + // Transform functions can return multiple transforms. They'll be applied in order. + return [ + { translate = [30 * i, 0, 0] }, + { rotation = { angle = 45 * i } } + ] +} +startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> polygon({ + radius = 10, + numSides = 4, + center = [0, 0], + inscribed = false + }, %) + |> extrude(4, %) + |> patternTransform(3, transform, %) +``` + +![Rendered example of patternTransform 5](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAACxKklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qr/J6655poH80z33XffrVx11VVXXXXVVVddddX/fVSuuuqqq6666qqr/o+65pprHvzar/3a7wXwTu/0Tp8NcN999916zTXXPPi+++679Ud/9Ec/57d+67e+m6uuuuqqq6666qqrrvq/Cz3oQQ/iqquuuuqqq6666v+Ka6655sGv/dqv/V4v/uIv/tov9mIv9toA586d4w/+4A94whOewPnz53m1V3s1HvWoR/HoRz+a++6779azZ8/e+lu/9Vvf81u/9VvfzVVXXXXVVVddddVVV/3fgh70oAdx1VVXXXXVVVdd9b/ZNddc8+DXfu3Xfq/XeZ3Xee9rrrnmwQDnzp3jD/7gD/jDP/xDzp07x/Nz+vRpXvVVX5VHP/rRPOpRj+K+++679R/+4R9++x/+4R9+57d+67e+m6uuuuqqq6666qqrrvrfDz3oQQ/iqquuuuqqq6666n+bF3uxF3vtF3uxF3utd3qnd/psnumJT3wiT3jCE/jZn/1Z/rVOnz7Nq77qq/Jqr/ZqnD59mvvuu+/Wf/iHf/jt3/qt3/qef/iHf/htrrrqqquuuuqqq6666n8n9KAHPYirrrrqqquuuuqq/+muueaaB7/2a7/2e734i7/4a7/Yi73YawOcO3eOP/iDP+D8+fP8wR/8Af9RTp8+zVu+5Vvyaq/2agDcd999t/7DP/zDb//Wb/3W9/zDP/zDb3PVVVddddVVV1111VX/e6AHPehBXHXVVVddddVVV/1PdM011zz4tV/7td/rxV/8xV/7xV7sxV4b4Ny5c/zBH/wBT3ziE3niE5/If6bTp09z6tQpXu3VXo1Xe7VXA+C+++679bd+67e++x/+4R9+5x/+4R9+m6uuuuqqq6666qqrrvqfDT3oQQ/iqquuuuqqq6666n+Ka6655sGv/dqv/V7v9E7v9Nk807lz5/iDP/gD/vAP/5Bz587x3+H06dM86lGP4lGPehSv9mqvBsB9991362/91m999z/8wz/8zj/8wz/8NlddddVVV1111VVXXfU/D3rQgx7EVVddddVVV1111X+Xa6655sGv/dqv/V4A7/RO7/TZAOfOneOJT3wi58+f52d/9mf5n+bUqVM86lGP4tVe7dV41KMeBcB9991362/91m9992//9m9/z3333XcrV1111VVXXXXVVVdd9T8DetCDHsRVV1111VVXXXXVf6Vrrrnmwa/92q/9Xi/+4i/+2i/2Yi/22gDnzp3jD//wD3niE5/IE5/4RP63OHXqFI961KN4tVd7NR71qEcBcN999936oz/6o5/zW7/1W9/NVVddddVVV1111VVX/fdCD3rQg7jqqquuuuqqq676z3bNNdc8+LVf+7Xf63Ve53Xe+5prrnkwwLlz5/jDP/xD/uAP/oDz58/zv92pU6d4tVd7NR71qEfxqEc9ivvuu+/Ws2fP3vpbv/Vb3/Nbv/Vb381VV1111VVXXXXVVVf910MPetCDuOqqq6666qqrrvqPds011zz4zJkzD36xF3ux13qnd3qnz+aZnvjEJ/LEJz6Rn/3Zn+X/slOnTvFqr/ZqPOpRj+JRj3oU9913363/8A//8Nv/8A//8Du/9Vu/9d1cddVVV1111VVXXXXVfw30oAc9iKuuuuqqq6666qr/CNdcc82DX/u1X/u9XvzFX/y1X+zFXuy1Ac6dO8cf/uEfcu7cOf7wD/+Q/00k8aKyzQty6tQpXu3VXo1XfdVX5fTp09x33323/sM//MNv/9Zv/db3/MM//MNvc9VVV1111VVXXXXVVf950IMe9CCuuuqqq6666qqr/q2uueaaB7/2a7/2e734i7/4a7/Yi73YawOcP3+eP/iDP+BJT3oST3ziE7nq2U6dOsVbvuVb8qqv+qoA3Hfffbf+wz/8w2//1m/91vf8wz/8w29z1VVXXXXVVVddddVV/7HQgx70IK666qqrrrrqqqv+Na655poHv/Zrv/Z7vdM7vdNn80znz5/nD/7gD/jDP/xDzp8/z1Uv3KlTpzh9+jSv+qqvyqu+6qsCcN999936W7/1W9/9D//wD7/zD//wD7/NVVddddVVV1111VVX/fuhBz3oQVx11VVXXXXVVVe9MNdcc82DX/u1X/u9rrnmmge/zuu8znsDnD9/nj/4gz8A4Od+7ue46t/u1KlTPOpRj+JRj3oUr/qqrwrAfffdd+tv/dZvffc//MM//M4//MM//DZXXXXVVVddddVVV131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re/+0R/90c/hqquuuuqqq6666qqr/ueictVVV1111VVXXfWf7L777rv1vvvu++7f+q3f+u5rrrnmwe/4ju/4Wa/zOq/z3idOnOBlX/ZluXjxIr/5m7/JX/7lX2IbSfx3OnbsGC/xEi/Bgx70IB70oAdxv/vuu+/W3/qt3/ru3/7t3/6e++6771auuuqqq6666qqrrrrqfz70oAc9iKuuuuqqq6666qr/atdcc82DX/u1X/u93umd3umzeaaLFy/yl3/5l/zVX/0Vu7u7PJAkHkgS93vwgx/M+77v+3LbbbfxQz/0QwDY5vmxzXOzDcCxY8d4yZd8SV7jNV6DB/qRH/mRzz579uwzfuu3fuu7ueqqq6666qqrrrrqqv9d0IMe9CCuuuqqq6666qqr/rtcc801D36xF3ux136d13md93qxF3ux1wa4ePEiT3/60/mrv/ornv70pwMgiQeSxP2OHz/Ox37sx3Lp0iW++Zu/GQDbPD+2eaBjx47xEi/xErzGa7wGD3Tffffd+lu/9Vvf/aM/+qOfw1VXXXXVVVddddVVV/3vReWqq6666qqrrrrqv9F9991363333ffdv/Vbv/Xd11xzzYPf8R3f8bNe53Ve571PnDjBy77sy3Lx4kV+8zd/k7/+67/mgWwjiX+LY8eO8RIv8RK85Eu+JMeOHeN+9913362/9Vu/9d2//du//T333XffrVx11VVXXXXVVVddddX/fuhBD3oQV1111VVXXXXVVf+TXHPNNQ9+7dd+7fd6p3d6p8/mmXZ3d/nLv/xL/uqv/ord3V0AJAFw/PhxPvZjP5ZLly7xzd/8zQDY5rm9+qu/OseOHeMlXuIluN99991362/91m999z/8wz/8zj/8wz/8NlddddVVV1111VVXXfV/C3rQgx7EVVddddVVV1111f9E11xzzYNf7MVe7LVf53Ve571e7MVe7LUBdnd3efrTn85f/dVfceuttwJw/PhxPvZjP5ZLly7xzd/8zQDYBuDYsWO8xEu8BK/+6q/OA/3DP/zDb//Wb/3W9/zWb/3Wd3PVVVddddVVV1111VX/d6EHPehBXHXVVVddddVVV/1Pd8011zz4Hd/xHT/rdV7ndd6bZ9rd3eW3fuu3+Ku/+is+93M/F4Av+ZIv4dixY7z4i784L/ESL8GxY8e433333Xfrb/3Wb333j/7oj34OV1111VVXXXXVVVdd9f8DetCDHsRVV1111VVXXXXV/xbXXHPNg1/7tV/7vd7pnd7ps3mm3d1djh8/DsBtt93GLbfcwv3uu+++W3/rt37ru3/7t3/7e+67775bueqqq6666qqrrrrqqv9f0IMe9CCuuuqqq6666qqr/re55pprHvxiL/Zir/06r/M67/ViL/Zir80D3Hfffbf+1m/91nf/wz/8w+/8wz/8w29z1VVXXXXVVVddddVV/3+hBz3oQVx11VVXXXXVVVf9b3bNNdc8+LVf+7Xf65prrnnwfffdd+uP/uiPfg5XXXXVVVddddVVV111FQB60IMexFVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Slauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq/5XuOaaax585syZB3PV/2pnz5699b777ruVq6666qqrrrrqqv8aVK666qqrrrrqqquu+h/vmmuuefBrv/Zrv9c7vdM7fTZX/a/2Iz/yI5/927/9299z33333cpVV1111VVXXXXVfz70oAc9iKuuuuqqq6666qqr/md7ndd5nff+8A//8O966lOfyq/+6q/yP5FtJPFAtpHEA9lGEg9km/9tbPOv9Yqv+Iq8wiu8Av/wD//wO5/5mZ/52lx11VVXXXXVVVf956Ny1VVXXXXVVVddddX/eGfOnHkQwFOf+lSe9rSnAWCb/69s8z+dbZ7bxYsXeYVXeAWuueaaB3PVVVddddVVV131X4Pgqquuuuqqq6666qr/lSQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIYn/jSQhCUlIQhKSkIQkJCGJ/06SkIQkJCGJixcvAnDmzJkHvdiLvdhrc9VVV1111VVXXfWfj+Cqq6666qqrrrrqqv/XJCEJSUhCEpKQhCQkIQlJSEISkvjfQBKS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jjvu4ElPehL/nSTxonrEIx7BIx/5SO73Iz/yI5/9oz/6o5/DVVddddVVV1111VX/36EHPehBXHXVVVddddX/R9dcc82DP+dzPue3rrnmmgdfvHiRb//2b+fixYs8kCSemySemySemySemySemyQAXvu1X5uXfumX5vjx4+zt7fG4xz2OP/mTP+GBJHEV2OY/wk033cQbvMEbsLOzw97eHl3Xcfvtt/PkJz+Z/ykk8cI84hGP4KabbmKxWADwIz/yI5/9W7/1W9999uzZZ3DVVVddddVVV1111VWAHvSgB3HVVVddddVV/19dc801D37t137t93qnd3qnz7548SJ/+Zd/yW/8xm/wQJJ4bpJ4bpJ4bpJ4bpJ4bpIAOH78OC/90i/Na7/2awOwt7fHr/3ar3HnnXdy1b+fbQBuuukm3uAN3oCdnR329vbouo477riDpzzlKdjmfxpJPLeTJ0/yki/5kiwWCwD+4R/+4be//uu//n3uu+++W7nqqquuuuqqq6666qpnQw960IO46qqrrrrqqv/vzpw586DP/dzP/e1rrrnmwRcvXuTbv/3buXjxIgCSeG6SeG6SeG6SeG6SeH4kcb/jx4/z3u/93kQEAI9//OP5kz/5E67697nxxht5gzd4A3Z2dtjb26PrOu68806e8pSn8EC2+Z9GEgCLxYKXeImX4OTJkwDcd999t37913/9+/zDP/zDb3PVVVddddVVV1111VXPCz3oQQ/iqquuuuqqq66Ca6655sGv/dqv/V7v9E7v9NkXL17kL//yL/mN3/gNACTx3CTx3CTx3CTx3CTx3CTxQMePH+elX/qlee3Xfm0A9vb2ePzjH8+f/MmfcNW/zo033sgbvMEbsLOzw97eHl3Xceedd/LUpz6V58c2/1a2uZ8k/qMsFgte4iVegpMnTwJw33333fr1X//17/MP//APv81VV1111VVXXXXVVVe9YOhBD3oQV1111VVXXXXVs11zzTUP/vAP//DverEXe7HXvnjxIt/+7d/O7u4uz00Sz00Sz48knpsknpskntuJEyd4q7d6K06ePMnOzg6Pf/zj+ZM/+RP29vZ4IEn8X2Cb/yg33ngjb/AGb8DOzg57e3t0Xcddd93F0572NABs84LY5n+CxWLBwx72MG688UYA7rvvvlt/9Ed/9HN+67d+67u56qqrrrrqqquuuuqq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AkASAJIAkMT9JHE/SXRdR0QAcN9999369V//9e/zD//wD7/NVVddddVVV1111VVXXfVAlOPHj3PVVVddddVVV/3fcHR0dOkf/uEffufw8HD35V/+5V/70Y9+NPP5nFtvvRUASTw/knhuknh+JPGgBz2IBz3oQazXa8ZxRBKSkIQkJCEJSUhCEpKQREQQEUgiIogIJBERRASSiAgkERFIQhIRQUTQdR1d1yGJ++6779bv+q7v+piv//qvf5+zZ8/eylVXXXXVVVddddVVV1313NCDHvQgrrrqqquuuuqq/3uuueaaB3/4h3/4d73Yi73Ya+/u7vLd3/3d7O7uIonnRxLPTRLPTRIv+ZIvyVu+5VtydHTEpUuXkIQkIgJJSEISkpCEJCQBIAlJSEISAJKQBIAkJAEgCQBJRAQRAcB9991364/+6I9+zm/91m99N1ddddVVV1111VVXXXXVC0M5fvw4V1111VVXXXXV/z2Hh4e7v/Vbv/U9AC//8i//2o9+9KOZz+fceuutSOK5SeL5kcRzWywWvNRLvRS2Wa1WSCIikIQkJCEJSUhCEpKICCKCiCAikEREEBFEBJKICCQREUQEEUEpBUncd999t/78z//8V3/pl37p29x6661/zVVXXXXVVVddddVVV131L0EPetCDuOqqq6666qqr/m+75pprHvzhH/7h3/ViL/Zir727u8v3fM/3sLu7y3OTxHOTxHN70IMexHu+53syDAMXL15EEhGBJCQhCUlIQhKSkIQkJCEJSUhCEpIAkIQkACICSQDcd999t/7Wb/3Wd//oj/7o53DVVVddddVVV1111VVX/WtQjh8/zlVXXXXVVVdd9X/b4eHh7m/91m99D8DLv/zLv/ajH/1o5vM5z3jGM3ggSTw/knig48eP81Iv9VK01liv10hCEhGBJCQhCUlIIiKICCKCiCAiiAgkIQlJRAQRQUQQEUjivvvuu/Xnf/7nv/pLv/RL3+Yf/uEffoerrrrqqquuuuqqq6666l+Lcvz4ca666qqrrrrqqv8f/uEf/uF3fvu3f/t7Tp06dfx1Xud1XvqlX/qluffee9nd3eV+knh+JHE/SbzSK70SAKvVCklIIiKQhCQkIYmIQBKSkIQkJCGJiCAiiAgigohAEgA/8iM/8tlf+qVf+jb/8A//8DtcddVVV1111VVXXXXVVf9WlOPHj3PVVVddddVVV/3/cXh4uPunf/qnPwPw8i//8q/94Ac/mPl8zjOe8QzuJ4nnJon7zedzXumVXgnbrFYrJCEJSUQEkpCEJCICSUhCEpKQhCQkERFEBJIA+JEf+ZHP/qzP+qzX+Yd/+Iff4aqrrrrqqquuuuqqq67696IcP36cq6666qqrrrrq/59/+Id/+J3f/u3f/p7W2u6bv/mbv/ZLv/RLc++997K7u4sknh9JAKxWK17rtV6LiODo6IiIQBKSiAgkIQlJRASSkIQkJBERlFKICCQB8CM/8iOf/Q3f8A3v86d/+qc/w1VXXXXVVVddddVVV131H4Vy/Phxrrrqqquuuuqq/58ODw93/+Ef/uF3AF7+5V/+tR/84Aczn8+59dZbkcTzIwmA13qt1wJguVwiiYhAEpKICCQhiYhAEpKQRCmFUgqSAPiHf/iH3/6sz/qs1/nTP/3Tnzk8PNzlqquuuuqqq6666qqrrvqPRDl+/DhXXXXVVVddddX/b//wD//wO7/1W7/13a213Td/8zd/7Zd+6Zfmnnvu4dKlSzw3SQC81Eu9FPP5nGEYAJBERCCJiEASkogIJBER1FqJCADuu+++Wz/+4z/+ZX7+53/+aw4PD3e56qqrrrrqqquuuuqqq/4zUI4fP85VV1111VVXXXXV0dHRpX/4h3/4nbNnzz7j0Y9+9Eu/2qu92nGAZzzjGTw3STz60Y/m+PHjDMMAgCQkERFIIiKQRCmFrusopSCJ++6779Yv+ZIveZvv+q7v+pjDw8Ndrrrqqquuuuqqq6666qr/TJTjx49z1VVXXXXVVVdddb9bb731r//sz/7sZw4PD3ff7M3e7LVf6qVeinvuuYdLly5xP0m81Eu9FMePH2cYBmwTEUgiIpBERNB1HbVWJHHffffd+l3f9V0f/fVf//Xvc/bs2Vu56qqrrrrqqquuuuqqq/4rUI4fP85VV1111VVXXXXVAx0eHu7+wz/8w++cPXv21kc/+tEv/Wqv9mrHAZ7xjGdwv5d+6Zfm+PHjDMMAgCQigoig6zpmsxkRwX333Xfrz//8z3/1l37pl77Nrbfe+jdcddVVV1111VVXXXXVVf+VKMePH+eqq6666qqrrrrq+bn11lv/5s/+7M9+5vDwcPfN3uzNXvulXuqlmM/nPOMZz+DBD34w1113HdM0kZnUWun7nvl8TimF++6779af//mf/+ov/dIvfZt/+Id/+B2uuuqqq6666qqrrrrqqv8O6EEPehBXXXXVVVddddVV/5IXe7EXe+0P//AP/65rrrnmwb/zO78DwGu91msxDAOZyXw+B+C+++679bd+67e++0d/9Ec/h6uuuuqqq6666qqrrrrqvxt60IMexFVXXXXVVVddddWL4pprrnnwa7/2a7/XO73TO302z+W+++679bd+67e++0d/9Ec/h6uuuuqqq6666qqrrrrqfwr0oAc9iKuuuuqqq6666qp/jRd7sRd77Q//8A//rrNnz976Yi/2Yq/9Iz/yI5/9oz/6o5/DVVddddVVV1111VVXXfU/DXrQgx7EVVddddVVV1111b/WNddc82CA++6771auuuqqq6666qqrrrrqqv+p0IMe9CCuuuqqq6666qqrrrrqqquuuuqqq6666qr/k6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1fxj3yiv0PCx/RXAAAAAElFTkSuQmCC) + diff --git a/docs/kcl/patternTransform2d.md b/docs/kcl/patternTransform2d.md new file mode 100644 index 000000000..353ce75b5 --- /dev/null +++ b/docs/kcl/patternTransform2d.md @@ -0,0 +1,45 @@ +--- +title: "patternTransform2d" +excerpt: "Just like patternTransform, but works on 2D sketches not 3D solids." +layout: manual +--- + +Just like patternTransform, but works on 2D sketches not 3D solids. + + + +```js +patternTransform2d(total_instances: integer, transform_function: FunctionParam, solid_set: SketchSet) -> [Sketch] +``` + + +### Arguments + +| Name | Type | Description | Required | +|----------|------|-------------|----------| +| `total_instances` | `integer` | | Yes | +| `transform_function` | `FunctionParam` | | Yes | +| `solid_set` | [`SketchSet`](/docs/kcl/types/SketchSet) | A sketch or a group of sketches. | Yes | + +### Returns + +[`[Sketch]`](/docs/kcl/types/Sketch) + + +### Examples + +```js +// Each instance will be shifted along the X axis. +fn transform(id) { + return { translate = [4 * id, 0] } +} + +// Sketch 4 circles. +sketch001 = startSketchOn('XZ') + |> circle({ center = [0, 0], radius = 2 }, %) + |> patternTransform2d(4, transform, %) +``` + +![Rendered example of patternTransform2d 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAACVuElEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquu+n/hmmuueTDAmTNnHvxiL/Zir8UzXXPNNQ++5pprHswznTlz5sFnz5699cyZMw/mmc6ePXsrz3TffffdCnDffffdevbs2Wfcd999twL8wz/8w29z1VX/Ctdcc82DAc6cOfPgF3uxF3stnumaa6558DXXXPNgnunMmTMP5rmcPXv2Vp7pvvvuuxXgvvvuu/Xs2bPPuO+++24F+Id/+Iff5qqr/pWuueaaB585c+bBL/ZiL/ZaPNM111zz4GuuuebBPNOZM2cezPNx9uzZWwHuu+++WwHuu+++W8+ePfuM++6771aAf/iHf/htrrrqX+maa6558JkzZx58zTXXPPjMmTMPArjmmmsefM011zwEMMCZM2ceDCBJts0znT179lZA991339Pvu+++WwHOnj37jPvuu+9WgH/4h3/4ba666qqrrvr/AD3oQQ/iqquuuuqq/1uuueaaB7/2a7/2ewG8+Iu/+Gu/2Iu92GvzXF78xV+cf4+///u/57ndd999t549e/bW++6779Z/+Id/+J377rvv1n/4h3/4ba76f++aa6558Gu/9mu/F8CLv/iLv/aLvdiLvTbP5cVf/MX59/j7v/97ntt9991369mzZ2+97777bv2Hf/iH37nvvvtu/Yd/+Iff5qr/16655poHA7z2a7/2ewG8+Iu/+Gu/2Iu92GvzAPfdd9+tr/u6r/tg/h3+/u//nud233333Xr27Nlb77vvvlv/4R/+4Xfuu+++W//hH/7ht7nq/7VrrrnmwQCv/dqv/V4AL/7iL/7aL/ZiL/baPB8v/uIvzr/H3//93/NA9913361nz5699b777nvGP/zDP/z2fffdd+s//MM//DZXXXXVVVf9X4Ie9KAHcdVVV1111f9e11xzzYPPnDnz4Bd7sRd7rRd/8Rd/7Rd7sRd7bZ7pZV/2Zfnv8pd/+ZcA3HfffbcC/MM//MNv/8M//MPv3Hfffbf+wz/8w29z1f9Z11xzzYPPnDnz4Bd7sRd7rRd/8Rd/7Rd7sRd7bZ7pZV/2Zfnv8pd/+ZcA3HfffbcC/MM//MNv/8M//MPv/NZv/dZ3c9X/addcc82DX+zFXuy1z5w586AXf/EXf+0Xe7EXe22e6WVf9mX57/KXf/mXANx33323nj179tb77rvv1n/4h3/4nd/6rd/6bq76P+2aa6558Gu/9mu/F8CLv/iLv/aLvdiLvTbP9LIv+7L8d/nLv/xLAO67775bAf7hH/7hd37rt37ru//hH/7ht7nqqquuuup/M/SgBz2Iq6666qqr/ne55pprHvzar/3a7/XiL/7ir/1iL/Zirw3wsi/7svxP95d/+ZcA3Hfffbf+wz/8w2//wz/8w+/81m/91ndz1f9611xzzYNf+7Vf+71e/MVf/LVf7MVe7LUBXvZlX5b/6f7yL/8SgPvuu+/Wf/iHf/jt3/qt3/qef/iHf/htrvpf78Ve7MVe+8Ve7MVe63Ve53Xe+5prrnkwwMu+7MvyP91f/uVfAnDffffd+lu/9Vvf/Q//8A+/8w//8A+/zVX/q11zzTUPfrEXe7HXPnPmzIPe6Z3e6bN5ppd92Zflf7K//Mu/BOC+++679ezZs7f+/d///W//wz/8w+/8wz/8w29z1VVXXXXV/yboQQ96EFddddVVV/3Pd8011zz4tV/7td/rdV7ndd77mmuueTDAy77sy/K/2V/+5V9y33333Xr27Nlb//7v//63f/u3f/t77rvvvlu56n+Fa6655sGv/dqv/V7v9E7v9Nk808u+7Mvyv9lf/uVfct999936D//wD7/9D//wD7/zW7/1W9/NVf8rXHPNNQ9+sRd7sdc+c+bMg97pnd7pswFe9mVflv/N/vIv/xKA++6779Z/+Id/+O3f+q3f+p5/+Id/+G2u+l/hmmuuefBrv/Zrv9eLv/iLv/aLvdiLvTbAy77sy/K/2V/+5V8CcN999936W7/1W9/9D//wD7/zD//wD7/NVVddddVV/9OhBz3oQVx11VVXXfU/1zu+4zt+1uu8zuu89zXXXPNggJd92Zfl/6K//Mu/BOC+++679bd+67e++0d/9Ec/h6v+x7nmmmse/Nqv/drv9U7v9E6fDfCyL/uy/F/1l3/5l9x33323/sM//MNv/8M//MPv/NZv/dZ3c9X/ONdcc82DX/u1X/u93umd3umzAV72ZV+W/6v+8i//kvvuu+/W3/qt3/ruf/iHf/idf/iHf/htrvof5Zprrnnwa7/2a7/Xi7/4i7/Oi73Yi70WwMu+7Mvyf9Ff/uVfAnDffffd+qM/+qOf81u/9VvfzVVXXXXVVf9ToQc96EFcddVVV131P8s111zz4Nd+7dd+r3d6p3f6bICXfdmX5f+Tv/zLv+S+++679R/+4R9++x/+4R9+57d+67e+m6v+W73jO77jZ734i7/4a7/Yi73YawO87Mu+LP+f/OVf/iX33Xffrb/1W7/13b/927/9Pffdd9+tXPXf5pprrnnwa7/2a7/XO73TO302wMu+7Mvy/8lf/uVfct99990K8KM/+qOf81u/9VvfzVX/ra655poHv+M7vuNnvc7rvM57A7zsy74s/5/85V/+Jffdd9+tv/Vbv/Xdv/3bv/099913361cddVVV131Pwl60IMexFVXXXXVVf8zXHPNNQ9+x3d8x896ndd5nfcGeNmXfVn+v/vLv/xL7rvvvlt/67d+67t/+7d/+3vuu+++W7nqv8Q111zz4Nd+7dd+r3d6p3f6bICXfdmX5f+7v/zLv+S+++679R/+4R9++7d+67e+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vuzLctX/HQ9/+MOPnzp16rUB/uEf/uF3+F/gdV7ndd77wz/8w7/rZV/2Zbnq/47rr7+eU6dOvTbAP/zDP/wO/wu8zuu8znt/0id90k+97Mu+LFf933H99dczn89fGuAf/uEffoerrrrqqqv+NSjHjx/nqquuuuqqF92LvdiLvfYnfdIn/dTLvuzLctX/PQ9/+MOPnzp16rUB/uEf/uF3+B/sxV7sxV77Iz7iI777ZV/2Zbnq/57rr7+eU6dOvTbAP/zDP/wO/4O9zuu8znt/+Id/+He97Mu+LFf933P99ddz6tSp15akf/iHf/ht/gd7ndd5nff+8A//8O962Zd9Wa76v+f666/n1KlTrw3wD//wD7/DVVddddVVLyrK8ePHueqqq6666kVzzTXXPPgrvuIr/uplX/Zluer/ruuvv55Tp069NsA//MM//A7/A73Yi73Ya3/u537ub73sy74sV/3fdf3113Pq1KnXBviHf/iH3+F/oNd5ndd57w//8A//rpd92Zflqv+7rr/+elprD3n605/+12fPnr2V/4He8R3f8bPe933f96tf9mVflqv+77r++utprT341ltv/ZuzZ8/eylVXXXXVVS8KyvHjx7nqqquuuupF8+Vf/uV/9Rqv8RrHuer/vOuvv55Tp069NsA//MM//A7/g7zYi73Ya3/u537ub73sy74sV/3fd/3119Nae/Dm5ubxf/iHf/gd/gd5sRd7sdf+pE/6pJ962Zd9Wa76v+/hD3/48ZMnT772rbfe+jdnz569lf9BPvzDP/y73vzN3/yjX/ZlX5ar/u97+MMffvzkyZOv/Qu/8Atfw1VXXXXVVS8KyvHjx7nqqquuuupf9rmf+7m/9ZCHPOSlr7/+eq76/+H666+ntfbgzc3N4//wD//wO/wPcM011zz4kz7pk37qNV7jNY5z1f8bD3/4w4/fc8893Hfffc84e/bsrfwP8GIv9mKv/bmf+7m/9bIv+7Jc9f/Hwx/+8OMnT5587T/7sz/7mcPDw13+B/jwD//w73qd13md937Zl31Zrvr/Y29v7/iLv/iLv85v/dZvfTdXXXXVVVf9SyjHjx/nqquuuuqqF+7FXuzFXvud3umdPvtlX/Zluer/l4c//OHHT5069doA//AP//A7/Dd7n/d5n6968Rd/8de+/vrruer/l5d6qZd68MmTJ1/7z/7sz37m8PBwl/9GL/ZiL/ban/u5n/tbL/uyL8tV///s7e0df8hDHvLSv/Vbv/U9/Dd7sRd7sdd+3/d9369+2Zd9Wa76/+X666+ntfZggH/4h3/4Ha666qqrrnphKMePH+eqq6666qoX7JprrnnwV3zFV/zVy77sy3LV/0/XX389p06dem2Af/iHf/gd/pu84zu+42e9+Zu/+Ue/7Mu+LFf9//Twhz/8+M033/zWf/Znf/Yzh4eHu/w3uOaaax78SZ/0ST/1Gq/xGse56v+l66+/ntbagwH+4R/+4Xf4b/I6r/M67/1Jn/RJP/WyL/uyXPX/0/XXX09r7cF/9md/9jOHh4e7XHXVVVdd9YJQjh8/zlVXXXXVVS/YJ33SJ/3UG7/xGz+Yq/5fu/766zl16tRrA/zDP/zD7/Bf7MVe7MVe+yM+4iO++2Vf9mW56v+3vb2946/4iq/41r/wC7/wNfw3+KRP+qSfeshDHvLS119/PVf9/3X99ddz6tSp137c4x73O/fdd9+t/Bd7sRd7sdf+pE/6pJ962Zd9Wa76/+3hD3/48b29veN/+qd/+jNcddVVV131glCOHz/OVVddddVVz9+LvdiLvfY7vdM7ffb111/PVVddf/31tNYefOutt/7N2bNnb+W/0Od+7uf+1mu8xmsc56r/966//nr29vaOX3PNNQ/+0z/905/hv9Dnfu7n/taLvdiLvfbLvuzLctVV119/PadOnXqdn//5n/9q/gu92Iu92Gt/7ud+7m+97Mu+LFddBTCfz1/67Nmzz7j11lv/mquuuuqqq54fyvHjx7nqqquuuur5+9zP/dzfeo3XeI3jXHXVMz384Q8/fvLkydf+sz/7s585PDzc5b/A537u5/7WQx7ykJe+/vrrueoqgOuvv575fP7SZ8+efcatt9761/wXeLEXe7HXfqd3eqfPftmXfVmuuup+e3t7x6+55poH/+mf/unP8F/gmmuuefBXfMVX/NXLvuzLctVV97v++uuZzWYv/Qu/8Atfw1VXXXXVVc8P5fjx41x11VVXXfW83vEd3/GzXumVXumtr7/+eq666oEe/vCHH7/55pvf+hd+4Re+hv9kL/ZiL/ba7/RO7/TZL/uyL8tVVz3Q9ddfz2w2e+k/+7M/+5nDw8Nd/hNdc801D/6Kr/iKv3rZl31Zrrrqga6//nrm8/lLnz179hm33nrrX/Of7JM+6ZN+6o3f+I0fzFVXPZe9vb3j11xzzYP/9E//9Ge46qqrrrrquRFcddVVV131fL3TO73TZ7/sy74sV131/FxzzTUP/vAP//Dv4j/Zh3/4h3/Xy77sy3LVVc/PG7/xGz/4cz7nc36L/2Qf/uEf/l0v+7Ivy1VXPT8v+7Ivyzu+4zt+Fv/JPvdzP/e3XuzFXuy1ueqq5+NlX/ZlebEXe7HXvuaaax7MVVddddVVz41y/Phxrrrqqquuek7v+I7v+Fkv/uIv/trXX389V131/Fx//fXM5/OXBviHf/iH3+E/wYd/+Id/1zXXXPPghz/84ce56qoXYG9v7zjAP/zDP/wO/wne8R3f8bNe53Ve572vv/56rrrqBdnb2zt+zTXXPPhP//RPf4b/BO/4ju/4Wa/zOq/z3i/7si/LVVe9IHt7e8c3NzeP/+mf/unPcNVVV1111QNRjh8/zlVXXXXVVc92zTXXPPiTPumTfvplX/ZlueqqF+b666+ntfbgP/uzP/uZw8PDXf4DXXPNNQ/+8A//8O9+jdd4jeNcddULcf3119Nae/Cf/dmf/czh4eEu/4Fe7MVe7LU/4iM+4rtf9mVflquuemGuv/569vb2jt96661/c/bs2Vv5D/RiL/Zir/0RH/ER3/2yL/uyXHXVC3P99dezv79/4ulPf/pfnz179lauuuqqq666H8FVV1111VXP4R3f8R0/i6uuehG98Ru/8YM/53M+57f4D/bhH/7h3/WyL/uyXHXVi+KN3/iNH/w5n/M5v8V/sHd6p3f6rJd92ZflqqteFG/8xm/84Hd6p3f6LP6DffiHf/h3vezLvixXXfWieKM3eqMHvc7rvM57cdVVV1111QMRXHXVVVdd9Rxe53Ve571f9mVflquuelFdc801D/7wD//w7+I/yIu92Iu99ou92Iu9Nldd9a9wzTXXPPgd3/EdP4v/IK/zOq/z3i/2Yi/22lx11b/Ci73Yi732i7/4i782/0E+93M/97euueaaB3PVVf8KL/ZiL/ba11xzzYO56qqrrrrqfpTjx49z1VVXXXXVFa/zOq/z3q/4iq/41tdffz1XXfWiuv7665nP5y999uzZZ9x6661/zb/TR3zER3zXG7/xGz+Yq676V7j++utprT34z/7sz37m8PBwl3+nr/iKr/irl33Zl+Wqq/41rr/+elprD/mt3/qt7+bf6cVe7MVe+53e6Z0++2Vf9mW56qp/jb29veObm5vH//RP//RnuOqqq666CoDgqquuuuqqZ3nHd3zHz3rZl31ZrrrqX+tlX/Zlecd3fMfPuuaaax7Mv8OLvdiLvfaLvdiLvTZXXfVvcM011zz4Hd/xHT+Lf6fP/dzP/S2uuurf6MVe7MVe68Ve7MVem3+nz/3cz/2tl33Zl+Wqq/61XvZlX5YXe7EXe22uuuqqq666H8FVV1111VWXvc7rvM57X3PNNQ/mqqv+ja655poHv+M7vuNn8e/wTu/0Tp/1si/7slx11b/Fy77sy/I6r/M67/1iL/Zir82/0Yu92Iu99pkzZx78si/7slx11b/Fy77sy/JO7/ROn8W/w4d/+Id/F1dd9e9wzTXXPPjFXuzFXpurrrrqqqsACK666qqrrrrsxV7sxV7rZV/2Zbnqqn+rl33Zl+V1Xud13vvFXuzFXpt/gxd7sRd77Rd7sRd7ba666t/hZV/2ZXmnd3qnz+Lf6J3e6Z0+643f+I0fzFVX/Tu82Iu92Gu/2Iu92Gvzb/BiL/Zir/06r/M67/2yL/uyXHXVv9XLvuzL8k7v9E6fxVVXXXXVVQAEV1111VVXXfY6r/M6781VV/07vezLviwf/uEf/l38G7zO67zOe73sy74sV13173XmzJkHv9iLvdhr86/0Yi/2Yq/9Yi/2Yq/NVVf9O73sy74s7/RO7/RZ/Bu80zu902e97Mu+LFddddVVV1111X8Ygquuuuqqq3id13md9+aqq/6DXHPNNQ9+x3d8x8/iX+l1Xud13purrvoP8MZv/MYPfqd3eqfP4l/pnd7pnT7rZV/2Zbnqqv8IZ86ceTD/Su/4ju/4WS/2Yi/22lx11X+AF3uxF3vtF3uxF3ttrrrqqquuIrjqqquuuooXe7EXe62XfdmX5aqr/iO87Mu+LK/zOq/z3tdcc82DeRG9zuu8zntz1VX/gV7sxV7stV/sxV7stXkRvdiLvdhrv9iLvdhrc9VV/0GuueaaB7/jO77jZ/Gv8E7v9E6f/bIv+7JcddV/hJd92Zflnd7pnT6Lq6666qqrCK666qqrruJ1Xud13purrvoPdM011zz4Hd/xHT+LF9E7vuM7ftbLvuzLctVV/1Fe9mVflnd6p3f6LF5E7/RO7/RZL/uyL8tVV/1HedmXfVle53Ve5715EX34h3/4d3HVVf/Bzpw582Cuuuqqq64iuOqqq676f+51Xud13purrvoP9rIv+7K82Iu92Gu/2Iu92GvzL3ixF3ux177mmmsezFVX/Qd7sRd7sdd+sRd7sdfmX3DNNdc8+MVe7MVem6uu+g92zTXXPPjFXuzFXpt/wTXXXPPg13md13nvl33Zl+Wqq/4jXXPNNQ9+8Rd/8dfmqquuuur/N4Krrrrqqv/nzpw58yCuuuo/wU033fTg13md13kv/gWv8zqv815cddV/ktd5ndd5L/4F7/iO7/hZXHXVf5IXe7EXey3+Be/4ju/4WVx11X+Sxz72sa/FVVddddX/bwRXXXXVVf/PvfiLv/hrv+zLvixXXfUf7cVf/MV5sRd7sdd+sRd7sdfmhXixF3ux137Zl31ZrrrqP9rLvuzL8mIv9mKvzb/gdV7ndd77ZV/2Zbnqqv9oL/uyL8vrvM7rvDcvxDXXXPPg13md13nvl33Zl+Wqq/6jvezLviwv/uIv/jpcddVVV/3/RnDVVVdd9f/ci73Yi702V131n+Saa6558Ou8zuu8Fy/Ai73Yi732Nddc82Cuuuo/yTXXXPPg13md13lvXoDXeZ3XeW+uuuo/0TXXXPPgF3/xF39tXoB3fMd3/Cyuuuo/0TXXXPNgrrrqqqv+fyO46qqrrvp/7MVe7MVem6uu+k/0si/7srzYi73Ya/MCXHPNNQ/mqqv+E73sy74sr/M6r/NevACv8zqv814v+7Ivy1VX/Wd67GMf+1q8AK/zOq/z3i/7si/LVVf9Zzlz5syDXuzFXuy1ueqqq676/4vgqquuuur/sWuuuebBXHXVf7Jrrrnmwe/4ju/4WTwfr/M6r/NeL/uyL8tVV/1nerEXe7HXfrEXe7HX5vl4sRd7sdfmqqv+E73sy74sL/7iL/46PB/v+I7v+FlcddV/gWuuuebBXHXVVVf9/0Vw1VVXXfX/2Iu92Iu91su+7Mty1VX/mV72ZV+W13md13lvno8Xe7EXe22uuuq/wIu92Iu9Fs/ldV7ndd6bq676L3DNNdc8mOfjdV7ndd77ZV/2Zbnqqv9ML/uyL8uZM2cexFVXXXXV/18EV1111VVXXXXVf7prrrnmwS/2Yi/22jzA67zO67w3V131X+BlX/ZlefEXf/HX5rm8zuu8znu97Mu+LFdd9Z/tzJkzD3qxF3ux1+YBXud1Xue9rrnmmgdz1VX/BV78xV/8tbnqqquu+v+L4Kqrrrrq/7EXe7EXe22uuuq/wMu+7MvyTu/0Tp/FA5w5c+ZBXHXVf5EXe7EXe+1rrrnmwTzAi73Yi702V131X+TFXuzFXosHeJ3XeZ33ftmXfVmuuuq/wpkzZx7MVVddddX/XwRXXXXVVf+PXXPNNQ/mqqv+i5w5c+bBL/ZiL/baPNM111zz4Jd92Zflqqv+q7zYi73Ya/NMr/M6r/PeXHXVf5GXfdmX5cVf/MVfmwd4sRd7sdfmqquuuuqqq676r0Bw1VVXXXXVVVf9l7jmmmse/GIv9mKvxTO92Iu92Gtz1VX/RV72ZV+W13md13kvnunFXuzFXutlX/Zlueqq/ypnzpx5MM/0Oq/zOu/NVVf9F7rmmmsefM011zyYq6666qr/nwiuuuqqq/6ferEXe7HX5qqr/gu97Mu+LC/+4i/+2lx11X+TM2fOPJhnerEXe7HX5qqr/gtdc801D+aZ3vEd3/GzXvZlX5arrvqvdObMmQdz1VVXXfX/E5Wrrrrqqquuuuq/zIu92Iu99ou92Iu9NsA111zzYK666r/QNddc8+AXe7EXe+2zZ8/ees011zyYq676L/ZiL/Zir/0P//APv33NNdc8mKuuuuqqq6666r8Klauuuuqq/6euueaaB3PVVf8NXuzFXuy1zp49+wyuuuq/wYu92Iu91tmzZx/MVVf9N7jmmmsefM0117w3V1313+Caa6558D/8wz9w1VVXXfX/EMFVV1111VVXXfVf5mVf9mV58Rd/8dc+c+bMg7jqqv9iL/uyL8s111zz4Bd7sRd7rZd92Zflqqv+q505c+ZBr/M6r/NeL/uyL8tVV1111VVXXfVfhuCqq6666qqrrvovdebMmQdfc801D37Zl31Zrrrqv9o111zz4Bd7sRd7ba666r/Yy77sy3LNNdc8+MVe7MVem6uuuuqqq6666r8Slauuuuqqq6666r/UNddc82Dgtbnqqv8GZ86cefA111zzYK666r/B67zO67w3V1111VVXXXXVfzWCq6666qqrrrrqv9TLvuzLcs011zyYq676b3DNNdc8mKuuuuqqq6666qqr/j+hctVVV1111VVXXXXVVVdd9V/kZV/2Zbnqqquuuuqqq/5LEVx11VVXXXXVVf/l7rvvvlu56qqrrrrqqquuuuqqq676z0flqquuuur/qfvuu+9Wrrrqv8k111zzYK666r/By77sy3LVVVddddVVV1111f8rVK666qqrrrrqqquuuuqqq6666v+4++6771auuuqqq/5/Irjqqquu+n/svvvuu5Wrrvpv8IhHPIKrrrrqqv9vHvGIR3DVVf9dzp49eytXXXXVVf8/Ubnqqquu+n/q7Nmzt15zzTUP5qqr/hvMZjOuuuqqq/6/mc1mXHXVVVddddVV/+WoXHXVVVf9P3XffffdylVXXXXVVVdd9V+m73uuuuq/y3333XcrV1111VX/PxFcddVVV/0/dt999906DANX/dv84A/+4J1f8AVfMHLVv1rf91x11VVXXXXVVf817rvvvlu56qqrrvr/i8pVV1111f9j//AP//Dbr/Zqr/befd9z1b+OJN7t3d7tRp7JNlf96wzDQN/3XHXVVVf9fzAMA33fc9VV/9XOnz/PP/zDP/w2V1111VX/fxFcddVVV/0/dt999916cHDAVf86q9VqxVX/buv1mquuuuqq/y/W6zVXXXXVVVddddV/C4Krrrrqqv/n7r77bq560UUE3/M938Nziwge+tCHctVVV1111VXPzzAMXHXVf4c///M/f8Y//MM//A5XXXXVVf9/EVx11VVX/T/2D//wD7/DVf9qH/IhHzLn+XjEIx5xK1e9yIZh4Kqrrrrqqquu+s915syZB/3DP/zDb3PVVVdd9f8XwVVXXXXV/2Nnz569lav+VTITAEk88pGPvLPrulESAL/yK7/yYK56kT3jGc/gqquuuur/i2c84xlcddV/l/vuu+9Wrrrqqqv+/yK46qqrrvp/7L777rv1H/7hH357GAauetFlJgBPfvKTb5ymqSultMzkqquuuuqqq6666n+af/iHf/gdrrrqqqv+fyO46qqrrvp/7u///u9/e71ec9W/TmaSmWQm4zgWrrrqqquuuuqqq/6HOX/+PPfdd9+tXHXVVVf9/0Zw1VVXXfX/3D/8wz/8zpOf/GSuuuqqq6666qqrrvq/5RnPeAb/8A//8NtcddVVV/3/RuWqq6666v+5s2fP3spVV1111VVXXXXVVf8n/cM//MNvc9VVV131/xvBVVddddX/c/fdd9+t//AP//DbXHXVVVddddVVV131f8p9991363333XcrV1111VX/vxFcddVVV13F3//93//2X/7lX3LVVf/V/vIv/5Krrvqv9Jd/+Zf85V/+JVdd9V/pL//yL7nqqv9qf/mXf8k//MM//DZXXXXVVVdRueqqq666in/4h3/4Ha666qqrrrrqqquu+j/lt37rt76Hq6666qqrCK666qqrruIf/uEffvsf/uEffpurrrrqqquuuuo/3H333XcrV1313+Af/uEffpurrrrqqqsIrrrqqquuuuzv//7vf5urrvovdt99993KVVddddX/cWfPnr2Vq676L/Zbv/Vb381VV1111VUABFddddVVV132D//wD7/zl3/5l1x11X+lf/iHf/jtX/7lX76Vq676L/IP//APv/0P//APv81VV/0X+cu//Evuu+++W7nqqv9Cf/mXf8lv/dZvfQ9XXXXVVVcBEFx11VVXXXXZP/zDP/z2P/zDP/w2V131X+i3fuu3vueaa655MFdd9V/kvvvuu/Xv//7vf5urrvov9KM/+qOfw1VX/Re67777bv2Hf/iH3+aqq6666ioAgquuuuqqq57lt37rt77nL//yL7nqqv8K9913363/8A//8Nv/8A//8NtcddV/gb/8y7/kH/7hH37nH/7hH37nL//yL7nqqv8q9913363/8A//8NtcddV/gb/8y7/kR3/0Rz+Hq6666qqr7kflqquuuuqqZ/mHf/iH377vvvtuBR7MVVf9J/uHf/iH3wa47777buWqq/6L/MM//MNvc9VV/4V+67d+67u56qr/Yv/wD//w21x11VVXXXU/gquuuuqqq57lvvvuu/Xs2bO3ctVV/wXuu+++WwF+67d+63v+8i//kquu+q9w33333Xrffffd+g//8A+/zVVX/Sf7y7/8S37rt37rewD+/u///rf/8i//kquu+s/2W7/1W99933333cpVV1111VX3I7jqqquuuuo5fP3Xf/37/OVf/iVXXfWf6Zd/+ZdvPXv27DMAzp49e+s//MM//DZXXfWf7Ed+5Ec+m2e67777buWqq/4L/MM//MNvA/zDP/zD73DVVf/J/vIv/5Lf+q3f+h6uuuqqq656IIKrrrrqqquew3333XfrP/zDP/w2V131n+iaa6558D/8wz/8NsB9991369///d//9l/+5V9y1VX/Wf7yL/+Ss2fPPoNn+q3f+q3v+cu//Euuuuo/y1/+5V/yW7/1W9/NM509e/ZWrrrqP9k//MM//PY//MM//DZXXXXVVVc9EMFVV1111VXP4+u//uvf55d/+Zdv5aqr/hPdd999t/JMv/3bv/099913361cddV/ot/6rd/6bp7p7Nmzt3LVVf/JfvRHf/RzeKb77rvvVq666j/RX/7lX/IjP/Ijn8NVV1111VXPjeCqq6666qrncd9999169uzZW7nqqv8kv/Vbv/XdPMB9991369mzZ2/lqqv+k/zWb/3W9/AA9913361///d//9tcddV/kt/6rd/67vvuu+9WHuAf/uEffpurrvpP8g//8A+//Q//8A+/zVVXXXXVVc+N4KqrrrrqqufrR37kRz7nL//yL7nqqv9of/mXf8k//MM//A7P5Ud+5Ec+5y//8i+56qr/aH/5l3/JP/zDP/w2z+VHf/RHP/sv//Ivueqq/2h/+Zd/yT/8wz/8Ds/lt37rt77nL//yL7nqqv9of/mXf8mP/MiPfA5XXXXVVVc9PwRXXXXVVVc9X//wD//w2//wD//w21x11X+Cf/iHf/htnsvZs2dv/Yd/+Iff5qqr/hP81m/91nfzXO67775bf+u3fuu7ueqq/wS/9Vu/9d08l3/4h3/4ba666j/BP/zDP/z2P/zDP/w2V1111VVXPT8EV1111VVXvUA/8iM/8jl/+Zd/yVVX/Ue77777buW53Hfffbf+1m/91vf85V/+JVdd9R/pt37rt76b5+Ps2bPPuOaaax7MVVf9B/rLv/xLvv7rv/59eD7uu+++W//hH/7ht7nqqv9Af/mXf8mP/MiPfA5XXXXVVVe9IARXXXXVVVe9QP/wD//w2//wD//w21x11X+Qv/zLv+S3fuu3vpsX4B/+4R9++7777ruVq676D/KXf/mX/NZv/db38AL8yI/8yOf85V/+JVdd9R/pt37rt76bF+Dv//7vf5urrvoP9Fu/9Vvf/Q//8A+/zVVXXXXVVS8IwVVXXXXVVS/U13/917/PX/7lX3LVVf9Rfuu3fut7eAHuu+++W3/0R3/0c/7yL/+Sq676j3Dffffd+g//8A+/zQvwD//wD7/9D//wD7/NVVf9B/jLv/xLfvRHf/RzeCH+4R/+4Xf+8i//kquu+o/wl3/5l/zoj/7o53DVVVddddULQ3DVVVddddULdd999936Iz/yI5/9l3/5l1x11X+Ef/iHf/htXoh/+Id/+O377rvvVq666t/pL//yL/nRH/3Rz+Ff8Fu/9Vvf85d/+ZdcddV/hB/5kR/5bF6If/iHf/jtf/iHf/htrrrq3+kv//Iv+ZEf+ZHPvu+++27lqquuuuqqF4bgqquuuuqqf9Fv//Zvf88//MM//DZXXfXv8Jd/+Zf8yI/8yGfzL7jvvvtu/dEf/dHP+cu//Euuuurf67d+67e+m3/BP/zDP/w2V1317/SXf/mXfOZnfubr8CL4+7//+9/+y7/8S6666t/jvvvuu/VHf/RHP4errrrqqqv+JQRXXXXVVVf9i+67775bf+RHfuRz/vIv/5Krrvr3+O3f/u3v4UXwD//wD7/9D//wD7/NVVf9G/3lX/4lP/IjP/LZvAjuu+++W7/+67/+ff7yL/+Sq676t7rvvvtu/Yd/+Iff5kXw27/929/DVVf9O/zlX/4lX//1X/8+XHXVVVdd9aIguOqqq6666kXyD//wD7/9Iz/yI5/9l3/5l1x11b/Fb/3Wb333fffddysvgvvuu+/WH/mRH/mcv/zLv+Sqq/6tfvRHf/RzeBH9wz/8w2/fd999t3LVVf8Gf/mXf8nXf/3Xvw8vovvuu+/Wv//7v/9trrrq3+Av//Iv+a3f+q3v/od/+Iff5qqrrrrqqhcFwVVXXXXVVS+y3/7t3/6e++6771auuupf6S//8i/5rd/6re/hX+Ef/uEffvsf/uEffpurrvpX+su//Et+5Ed+5LP5V7jvvvtu/dEf/dHP+cu//Euuuupf6x/+4R9++x/+4R9+m3+FH/3RH/3sv/zLv+Sqq/617rvvvlu//uu//n246qqrrrrqRUVw1VVXXXXVi+y+++679bM+67Ne5y//8i+56qp/jfvuu+/Wf/iHf/ht/pW+/uu//n3+8i//kquu+tf60R/90c/hX+kf/uEffvu+++67lauu+lf4y7/8S77+67/+ffhX+od/+Iff+Yd/+Iff5qqr/hX+8i//kq//+q9/H6666qqrrvrXoBw/fpyrrrrqqqtedIeHh7sAp06deu3rr7+eq676l/zlX/4l3/Vd3/Uxt95661/zr3R4eLh79uzZZ9x8881vff3113PVVf+Sv/zLv+Trv/7r3+fWW2/9a/6VDg8Pd4+Oji7dfPPNb3399ddz1VX/kr/8y7/kR37kRz77T//0T3+GfxvdfPPNb3399ddz1VX/kr/8y7/kR37kRz77t3/7t7+Hq6666qqr/jUIrrrqqquu+lf77d/+7e/5h3/4h9/+y7/8S6666l/yD//wD7/9W7/1W9/Nv9E//MM//PY//MM//DZXXfUi+Id/+Iff/q3f+q3v5t/o7//+73/rH/7hH36bq656EfzDP/zDb//oj/7o5/Bv9A//8A+//Q//8A+/zVVX/Qv+8i//kn/4h3/47R/90R/9HK666qqrrvrXIrjqqquuuupf7b777rv167/+69/nvvvuu5Wrrnoh/vIv/5Lf+q3f+h7+He67775bv/7rv/59/vIv/5Krrnph/vIv/5If+ZEf+Rz+Hc6ePfuMH/mRH/mcv/zLv+Sqq16Yv/zLv+RHfuRHPod/h/vuu+/W3/qt3/qev/zLv+Sqq16Y++6779bP/MzPfB2uuuqqq676t6AcP36cq6666qqr/vUODw93/+zP/uxnXu7lXu6jr7/+eq666vn59V//9d/+ru/6ro/h3+nw8HD3H/7hH37n0Y9+9Htff/31XHXVc/vLv/xLfuu3fuu7f+EXfuFr+Hc6e/bsrddcc82D5/P5S19//fVcddVz+8u//Es+8zM/83X+4R/+4bf5dzo6Otp9yEMe8tIv9VIv9WCuuur5+Mu//Eu+5Eu+5G3Onj17K1ddddVVV/1bUI4fP85VV1111VX/NoeHh7tnz559xs033/zW119/PVdd9UB/+Zd/ydd//de/z9mzZ2/lP8DZs2dvveaaax48n89f+vrrr+eqqx7o7rvv5uM//uNfhv8gt95669+84iu+4ls//OEPP85VVz3AX/7lX/IP//APv/2jP/qjn8N/gMPDw9377rvvGY9+9KPf+/rrr+eqqx7oL//yL/nMz/zM1/mHf/iH3+aqq6666qp/K8rx48e56qqrrrrq3+7WW2/9a4BTp0699vXXX89VV93vB3/wB7/7F37hF76G/0C33nrr37ziK77iWz/84Q8/zlVXPdNf/uVf8pmf+Zmvc/bs2Vv5D3J4eLh76623/s2jH/3o977++uu56qr7/c3f/M2tH//xH/8y/Ac6e/bsrS/+4i/+2i/1Ui/1YK666pn+8i//kh/5kR/57N/+7d/+Hq666qqrrvr3oBw/fpyrrrrqqqv+fc6ePfuMw8PD3VOnTr329ddfz1VX/eVf/iVf+qVf+jaHh4e7/Ac6PDzc/bM/+7OfebmXe7mPvv7667nqqr/8y7/kt37rt777F37hF76G/2Bnz569FeDUqVOvff3113PVVX/5l3/Jl3zJl7zN2bNnb+U/2D/8wz/8zs033/zWD3/4w49z1f97f/mXf8k//MM//PbXf/3Xvw9XXXXVVVf9e1GOHz/OVVddddVV/z6Hh4e7Z8+efcZDHvKQl26tPfj666/nqv+//vIv/5Kv//qvf59/+Id/+G3+ExweHu6ePXv2GTfffPNbX3/99Vz1/9uv//qv//aXfMmXvA3/Sc6ePfuMBz/4wS/9Ui/1Ug/mqv/X/vIv/5LP/MzPfJ1/+Id/+G3+ExweHu4eHR1duvnmm9/6+uuv56r/v/7yL/+Sf/iHf/jtz/zMz3wdrrrqqquu+o9AOX78OFddddVVV/37HR4e7v7DP/zD7zzkIQ956Zd6qZd6MFf9v/Xrv/7rv/1d3/VdH8N/oltvvfWvAU6dOvXa119/PVf9//SXf/mXfP3Xf/37nD179lb+kxweHu7+wz/8w2+/3Mu93Edff/31XPX/01/+5V/yoz/6o5/zW7/1W9/Nf6Jbb731r1/8xV/8tV/qpV7qwVz1/9Jf/uVfct9999368R//8S/DVVddddVV/1Eox48f56qrrrrqqv8Yh4eHu//wD//wOzfffPNbP/zhDz/OVf/v/OVf/iWf9Vmf9TqHh4e7/Cf7h3/4h985e/bsM26++ea3vv7667nq/5e//Mu/5DM/8zNf5x/+4R9+m/9kR0dHl86ePfuMm2+++a2vv/56rvr/5S//8i/5h3/4h9/++q//+vfhv8A//MM//M7LvdzLffT111/PVf///M3f/M2tH/IhH/IQrrrqqquu+o9EOX78OFddddVVV/3HOTw83P2zP/uzn7n55pvf+uEPf/hxrvp/45d/+Zdv/ZIv+ZK3ufXWW/+a/yJHR0e7m5ubx+fz+Utff/31XPX/w1/+5V/y9V//9e/zp3/6pz/Nf5Fbb731rwFOnTr12tdffz1X/f/wl3/5l/zDP/zDb3/mZ37m6/Bf5PDwcPfs2bPPuPnmm9/6+uuv56r/P375l3/51g/5kA95CFddddVVV/1Hoxw/fpyrrrrqqqv+Yx0eHu7+2Z/92c/cfPPNb/3whz/8OFf9n/eXf/mX/PzP//xX//Zv//b38F/o8PBw99Zbb/2bhzzkIS/dWnvw9ddfz1X/t/3lX/4l//AP//Db3/Vd3/Ux/Bf7h3/4h9+55pprHjyfz1/6+uuv56r/2/7yL/+Sf/iHf/jtz/zMz3wd/ovdeuutfw1w6tSp177++uu56v+2v/zLv+Rv/uZvbv2QD/mQh3DVVVddddV/Bsrx48e56qqrrrrqP97h4eHun/3Zn/3MzTff/NZ7e3vHr7/+eq76v+vXf/3Xf/vrv/7r34f/BoeHh7v/8A//8DsPechDXrq19uDrr7+eq/5v+su//Ev+4R/+4bc/8zM/83X4b3Lrrbf+zUMe8pCXbq09+Prrr+eq/5v+8i//kn/4h3/47c/8zM98Hf6bnD179hkPechDXrq19uDrr7+eq/5v+su//Evuu+++Wz/kQz7kIVx11VVXXfWfhXL8+HGuuuqqq676z3F4eLj7Z3/2Zz/zkIc85KVbaw++/vrruer/nl/+5V++9eM//uNfhv9Gh4eHu//wD//wOw95yENeurX24Ouvv56r/u/5m7/5m1s//uM//mX4b3R4eLj7D//wD7/ziq/4im/98Ic//DhX/Z/zl3/5l9x33323fvzHf/zL8N/o8PBw9x/+4R9+5xVf8RXf+uEPf/hxrvo/5y//8i/5h3/4h9/++I//+Jfhqquuuuqq/0yU48ePc9VVV1111X+ew8PD3X/4h3/4ncPDw91Tp0699vXXX89V/3f85V/+JV/yJV/yNmfPnr2V/2aHh4e7//AP//A7D3nIQ166tfbg66+/nqv+7/jlX/7lWz/kQz7kIfwPcHh4uPunf/qnP33zzTe/9cMf/vDjXPV/xl/+5V/yD//wD7/98R//8S/D/wCHh4e7f/qnf/rTN99881s//OEPP85V/2f85V/+Jf/wD//w25/5mZ/5Olx11VVXXfWfjXL8+HGuuuqqq676z3V4eLh79uzZZxweHu6eOnXqta+//nqu+t/vL//yL/nMz/zM1/mHf/iH3+Z/iMPDw91/+Id/+J3Nzc3j8/n8pa+//nqu+t/vl3/5l2/9kA/5kIfwP8jR0dGlP/uzP/uZm2+++a0f/vCHH+eq//X+8i//kn/4h3/47c/8zM98Hf4HOTo6uvRnf/ZnP/NyL/dyH3399ddz1f9+f/mXf8lv/dZvffeXfMmXvA1XXXXVVVf9V6AcP36cq6666qqr/vMdHh7u/sM//MPvAJw6deq1r7/+eq763+sv//Iv+czP/MzX+Yd/+Iff5n+Yw8PD3VtvvfVvDg8Pd0+dOvXa119/PVf97/SXf/mX/M3f/M2tH/IhH/IQ/gc6PDzc/bM/+7Ofufnmm9/64Q9/+HGu+l/rL//yL/mt3/qt7/6SL/mSt+F/oMPDw91/+Id/+J1HP/rR73399ddz1f9ef/mXf8nXf/3Xv8+P/uiPfg5XXXXVVVf9V6EcP36cq6666qqr/uv8wz/8w+/89m//9vfcfPPNb/3whz/8OFf9r/OXf/mXfOZnfubr/MM//MNv8z/U4eHh7j/8wz/8DsCpU6de+/rrr+eq/13+8i//kvvuu+/WD/mQD3kI/4MdHh7u/tmf/dnP3HzzzW+9t7d3/Prrr+eq/13+8i//kh/5kR/57O/6ru/6GP4HO3v27K1nz559xs033/zW119/PVf97/PLv/zLt37Jl3zJ2/zpn/7pT3PVVVddddV/Jcrx48e56qqrrrrqv9bh4eHun/3Zn/3MfD5/6dbag6+//nqu+t/hL//yL/mQD/mQh9x6661/zf8C//AP//A7AKdOnXrt66+/nqv+d/jLv/xLfuu3fut7PuuzPut1+F/g8PBw98/+7M9+ZnNz8/h8Pn/p66+/nqv+d/jLv/xLvv7rv/59fuEXfuFr+F/g1ltv/euzZ88+4+abb37r66+/nqv+d/jLv/xLfv3Xf/23P/7jP/5lzp49eytXXXXVVVf9V6McP36cq6666qqr/usdHh7u/sM//MPvHB4e7p46deq1r7/+eq76n+0v//Iv+czP/MzXufXWW/+a/0X+4R/+4Xd++7d/+3tuvvnmt97b2zt+/fXXc9X/XH/5l3/Jb/3Wb33313/9178P/4scHh7uPv3pT//rw8PD3VOnTr329ddfz1X/c/3lX/4lf/M3f3Prl3zJl7zNn/7pn/40/4vceuutf/1bv/Vb3/1yL/dyH3399ddz1f9sf/mXf8mP/MiPfPbXf/3Xvw9XXXXVVVf9d6EcP36cq6666qqr/nscHh7u/sM//MPv/MM//MPvnDx58rX39vaOX3/99Vz1P88v//Iv3/olX/Ilb/MP//APv83/QoeHh7t/9md/9jOHh4e7p06deu3rr7+eq/7n+cu//Et+5Ed+5LO/67u+62P4X+jo6OjSP/zDP/wOwKlTp177+uuv56r/ef7yL/+Sf/iHf/jtj//4j3+Zs2fP3sr/QkdHR5d++7d/+3tuvvnmt374wx9+nKv+x/nLv/xL/uZv/ubWL/mSL3mb3/7t3/4errrqqquu+u9EOX78OFddddVVV/33Onv27K1/9md/9jOHh4e7p06deu3rr7+eq/5n+Mu//Ev+5m/+5tYP+ZAPecjZs2dv5X+xw8PD3X/4h3/4HYBTp0699vXXX89V/3P88i//8q1f8iVf8ja//du//T38L/cP//APv/Pbv/3b33PzzTe/9cMf/vDjXPU/xl/+5V/yIz/yI5/99V//9e/D/3KHh4e7f/Znf/YzN99881vv7e0dv/7667nqf4a//Mu/5B/+4R9+++M//uNf5uzZs7dy1VVXXXXVfzfK8ePHueqqq6666r/f4eHh7j/8wz/8ztmzZ58xm81eem9v7/j111/PVf99fvmXf/nWP/3TP/3pz/qsz3od/g/5h3/4h9/57d/+7e+5+eab33pvb+/49ddfz1X/ff7yL/+SX//1X//tj//4j3+Zs2fP3sr/EYeHh7t/9md/9jPz+fylW2sPvv7667nqv89f/uVf8jd/8ze3fsmXfMnb/PZv//b38H/E4eHh7p/92Z/9zOHh4e6pU6de+/rrr+eq/z5/+Zd/yd/8zd/c+iVf8iVv86M/+qOfw1VXXXXVVf9TUI4fP85VV1111VX/c9x6661//Wd/9mc/c3h4uHvq1KnXvv7667nqv95f/uVf8vM///Nf/V3f9V0fw/9Bh4eHu3/2Z3/2M4eHh7unTp167euvv56r/uv95V/+JV//9V//Pt/1Xd/1MfwfdHh4uPv3f//3v314eLjbWnvwwx/+8ONc9V/uL//yL/mRH/mRz/7SL/3Stzl79uyt/B9zeHi4+w//8A+/A3Dq1KnXvv7667nqv95f/uVf8lu/9Vvf/Vmf9Vmvc/bs2Vu56qqrrrrqfxL0oAc9iKuuuuqqq/5nerEXe7HX/vAP//Dvuuaaax78si/7slz1n+8v//Ivue+++279+q//+vf5h3/4h9/m/4FrrrnmwZ/zOZ/zW9dcc82DX/ZlX5ar/vP95V/+Jffdd9+tX//1X/8+//AP//Db/D9wzTXXPPhzPudzfuuaa6558Mu+7Mty1X++v/zLv+S+++679eu//uvf5x/+4R9+m/8Hrrnmmgd/zud8zm9dc801D37Zl31ZrvrP98u//Mu3Anz913/9+/zDP/zDb3PVVVddddX/RJTjx49z1VVXXXXV/0xnz5699c/+7M9+5vDwcPfUqVOvfffdd3P99ddz1X+Ov/zLv+RHfuRHPvtLv/RL3+bs2bO38v/E4eHh7p/92Z/9zOHh4e6pU6de+/rrr+eq/zx/+Zd/yY/8yI989pd+6Ze+zdmzZ2/l/4nDw8PdP/uzP/uZw8PD3VOnTr329ddfz1X/Of7yL/+Su+++mx/5kR/57C/90i99m7Nnz97K/xOHh4e7f/Znf/Yzh4eHu6dOnXrt66+/nqv+c/zlX/4lf/M3f3Prb/3Wb333l37pl77N2bNnb+Wqq6666qr/qdCDHvQgrrrqqquu+t/hHd/xHT/rnd7pnT77ZV/2ZbnqP85f/uVfct9999369V//9e/zD//wD7/N/2PXXHPNg1/7tV/7vd7pnd7ps1/2ZV+Wq/7j/PIv//KtZ8+evfXrvu7r3vvs2bPP4P+xM2fOPOgjPuIjvvvFXuzFXvtlX/Zlueo/zl/+5V/yD//wD7/9mZ/5ma/D/3PXXHPNgz/ncz7nt6655poHv+zLvixX/cf5y7/8S37kR37ks3/0R3/0c7jqqquuuup/A/SgBz2Iq6666qqr/ve45pprHvzar/3a7/VO7/ROn/2yL/uyXPVv95d/+Zfcd999t/7Wb/3Wd//oj/7o53DVs1xzzTUP/vAP//DverEXe7HXftmXfVmu+rf7y7/8S+67775bf/RHf/Rzfuu3fuu7uepZXud1Xue93/Ed3/Gzrrnmmge/7Mu+LFf92/3lX/4l9913361f//Vf/z7/8A//8NtcddmZM2ce9Dqv8zrv/U7v9E6fDfCyL/uyXPVv95d/+Zf8yI/8yGf/9m//9vfcd999t3LVVVddddX/FuhBD3oQV1111VVX/e9zzTXXPPgd3/EdP+t1Xud13hvgZV/2ZbnqRfeXf/mX/MiP/Mhn/+iP/ujncNUL9Dqv8zrv/Tqv8zrv9WIv9mKv/bIv+7Jc9aL7y7/8S+67775bf+u3fuu7f/RHf/RzuOr5uuaaax782q/92u/1Tu/0Tp8N8LIv+7Jc9aL7y7/8S+67775bf/RHf/Szf+u3fut7uOr5uuaaax782q/92u/1Tu/0Tp/9si/7slz1r/OXf/mX/MM//MNvf/3Xf/373Hfffbdy1VVXXXXV/zboQQ96EFddddVVV/3vdc011zz4tV/7td/rdV7ndd77mmuuefDLvuzLctUL9pd/+Zf8wz/8w29//dd//fvcd999t3LVi+R1Xud13vt1Xud13uvFXuzFXvtlX/ZlueoF+8u//Evuu+++W3/rt37ru3/0R3/0c7jqRXLmzJkHvc7rvM57v9M7vdNnA7zsy74sV71gf/mXf8l9991364/+6I9+zm/91m99N1e9SK655poHv+M7vuNnvc7rvM57v+zLvixXvWB/+Zd/CcCP/MiPfPZv//Zvf8999913K1ddddVVV/1vhR70oAdx1VVXXXXV/37XXHPNg1/7tV/7vV7ndV7nva+55poHv+zLvixXPdtf/uVf8g//8A+//fVf//Xvc999993KVf8m11xzzYPf8R3f8bNe53Ve570BXvZlX5arrvjLv/xL7rvvvlt/67d+67t/9Ed/9HO46t/kmmuuefBrv/Zrv9frvM7rvPc111zz4Jd92Zflqiv+8i//EoD77rvv1q//+q9/n3/4h3/4ba76N7nmmmse/I7v+I6f9Tqv8zrv/bIv+7Jc9Wx/+Zd/yX333Xfrb/3Wb333j/7oj34OV1111VVX/V+AHvSgB3HVVVddddX/Hddcc82Dz5w58+B3eqd3+qwXe7EXe22Al33Zl+X/o7/8y78E4Ed+5Ec++7d/+7e/57777ruVq/5DXHPNNQ9+7dd+7fd6p3d6p88GeNmXfVn+v/rLv/xL7rvvvlt/67d+67t/9Ed/9HO46j/ENddc8+AXe7EXe63XeZ3Xee8Xe7EXe+2XfdmX5f+rv/zLv+S+++679bd+67e++7d/+7e/57777ruVq/5DXHPNNQ9+7dd+7fd6p3d6p88GeNmXfVn+P/rLv/xLAO67775bf/RHf/Rzfuu3fuu7ueqqq6666v8S9KAHPYirrrrqqqv+b7rmmmse/Nqv/drv9eIv/uKv/WIv9mKvDfCyL/uy/F/3l3/5l9x33323/tZv/dZ3/+iP/ujncNV/mmuuuebBL/ZiL/bar/M6r/NeL/ZiL/baAC/7si/L/3V/+Zd/yX333Xfrb/3Wb333b//2b3/PfffddytX/ae55pprHvzar/3a7/VO7/ROnw3wsi/7svxf95d/+ZcA3Hfffbf+1m/91nf/6I/+6Odw1X+aM2fOPOh1Xud13vt1Xud13vuaa6558Mu+7Mvyf91f/uVfAnDffffd+lu/9Vvf/Vu/9Vvfffbs2Wdw1VVXXXXV/0XoQQ96EFddddVVV/3fd8011zz4tV/7td/rdV7ndd77mmuueTDAy77sy/J/xV/+5V9y33333fpbv/Vb3/0P//APv/MP//APv81V/6WuueaaB7/Yi73Ya7/O67zOe73Yi73YawO87Mu+LP9X/OVf/iUA//AP//Dbf//3f//bP/qjP/o5XPVf6pprrnnwi73Yi73Wi73Yi73267zO67w3wMu+7Mvyf8Vf/uVfAnDffffd+lu/9Vvf/aM/+qOfw1X/5a655poHv+M7vuNnvc7rvM57A7zsy74s/1f85V/+JQD33Xffrb/1W7/13b/927/9Pffdd9+tXHXVVVdd9X8detCDHsRVV1111VX/v1xzzTUPfu3Xfu33evEXf/HXfrEXe7HXBnjZl31Z/jf5y7/8SwDuu+++W3/rt37ru8+ePfuM3/qt3/purvof4Zprrnnwi73Yi73W67zO67z3i73Yi702wMu+7Mvyv8lf/uVfAnDffffd+g//8A+/fd999936oz/6o5/DVf8jXHPNNQ9+sRd7sdd+sRd7sdd6ndd5nffmmV72ZV+W/03+8i//EoD77rvv1t/6rd/67h/90R/9HK76H+HMmTMPevEXf/HXebEXe7HXep3XeZ335ple9mVflv9N/vIv/xKA++6779bf+q3f+u7f/u3f/p777rvvVq666qqrrvr/BD3oQQ/iqquuuuqq/7+uueaaB7/Yi73Ya7/Yi73Ya11zzTUPfrEXe7HX5ple9mVflv8p/vIv/5L7/cM//MNv//3f//1v/8M//MPv/MM//MNvc9X/aNdcc82Dz5w58+AXe7EXe60Xf/EXf+0Xe7EXe22e6WVf9mX5n+Iv//Ivud99991362/91m999z/8wz/8zj/8wz/8Nlf9j3bmzJkHXXPNNQ95sRd7sdd68Rd/8dc+c+bMg6+55poHA7zsy74s/1P85V/+Jfe77777bv2t3/qt7/6Hf/iH3/mHf/iH3+aq/9GuueaaBwO89mu/9nu9+Iu/+Gu/2Iu92GvzTC/7si/L/xR/+Zd/yf3uu+++W3/rt37ru//hH/7ht//hH/7hd7jqqquuuur/M/SgBz2Iq6666qqrrrrfNddc8+AzZ848+Jprrnnwi73Yi73Wi73Yi732Nddc82Ae4GVf9mX5z/SXf/mX3O++++679R/+4R9++7777rv1H/7hH37nH/7hH36bq/5Xu+aaax585syZB19zzTUPfrEXe7HXerEXe7HXvuaaax7MA7zsy74s/1n+8i//kge67777bv2Hf/iH377vvvtu/Yd/+Iff/od/+Iff4ar/1a655poHnzlz5kHXXHPNQ17sxV7stV7sxV7sta+55poH80wv+7Ivy3+mv/zLv+SB7rvvvlv/4R/+4bfvu+++W//hH/7hd/7hH/7ht7nqf7VrrrnmwWfOnHnwNddc8+AXe7EXe61rrrnmwS/2Yi/22jzTy77sy/Kf6S//8i8BuO+++2695pprHnzffffd+g//8A+/fd999936D//wD7/zD//wD7/NVVddddVVVz0betCDHsRVV1111VVXvTDXXHPNgwFe7MVe7LXPnDnzoGuuuebB11xzzYPPnDnz4GuuuebB/Dvdd999t549e/bWv//7v/9tgLNnzz7jvvvuu/Uf/uEffpur/l+45pprHgzwYi/2Yq995syZB11zzTUPvuaaax585syZB19zzTUP5pnuu+++W6+55poH869033333Xr27Nlb77vvvlvvu+++W8+ePfuM++677+n/8A//8Dtc9f/CNddc82DbfvEXf/HXOXPmzIOuueaaB19zzTUPPnPmzIOvueaaB/NM9913363XXHPNg/lXuO+++24FOHv27K333Xffrffdd9+tZ8+efcZ999136z/8wz/8Nlf9v3DNNdc8GODFXuzFXvvMmTMPuuaaax58zTXXPBjgxV7sxV6bf4f77rvvVoCzZ8/eet99991633333Xr27Nlb77vvvmf8wz/8w29z1VVXXXXVVS8cetCDHsRVV1111VVX/Xtdc801DwY4c+bMg3mma6655sEA99133608l7Nnz95633333cpVV70IrrnmmgfbtiSdOXPmwTzTNddc8yBA99133608m8+ePfsMgPvuu+9WrrrqRXDNNdc8mGc6c+bMgwABXHPNNQ8GuO+++54O6OzZs7eeOXPmwWfPnr3Vts+ePfsMrrrqRXDmzJkHSdKZM2cezLP5mmuueQjAfffddytXGNDZs2dvBbjvvvtu5aqrrrrqqqv+fdCDHvQgrrrqqquuuuqqq6666qqrrrrqqquuuuqq/5OoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6v4R8EJS8U7Dqo3AAAAAElFTkSuQmCC) + + diff --git a/docs/kcl/pi.md b/docs/kcl/pi.md index 39e50a440..61edb807b 100644 --- a/docs/kcl/pi.md +++ b/docs/kcl/pi.md @@ -30,8 +30,8 @@ circumference = 70 exampleSketch = startSketchOn("XZ") |> circle({ - center: [0, 0], - radius: circumference / (2 * pi()) + center = [0, 0], + radius = circumference / (2 * pi()) }, %) example = extrude(5, exampleSketch) diff --git a/docs/kcl/polar.md b/docs/kcl/polar.md index c9dc60419..b8143df30 100644 --- a/docs/kcl/polar.md +++ b/docs/kcl/polar.md @@ -29,7 +29,7 @@ polar(data: PolarCoordsData) -> [number] ```js exampleSketch = startSketchOn('XZ') |> startProfileAt([0, 0], %) - |> line(polar({ angle: 30, length: 5 }), %, $thing) + |> line(polar({ angle = 30, length = 5 }), %, $thing) |> line([0, 5], %) |> line([segEndX(thing), 0], %) |> line([-20, 10], %) diff --git a/docs/kcl/polygon.md b/docs/kcl/polygon.md new file mode 100644 index 000000000..9f9843f84 --- /dev/null +++ b/docs/kcl/polygon.md @@ -0,0 +1,60 @@ +--- +title: "polygon" +excerpt: "Create a regular polygon with the specified number of sides that is either inscribed or circumscribed around a circle of the specified radius." +layout: manual +--- + +Create a regular polygon with the specified number of sides that is either inscribed or circumscribed around a circle of the specified radius. + + + +```js +polygon(data: PolygonData, sketch_surface_or_group: SketchOrSurface, tag?: TagDeclarator) -> Sketch +``` + + +### Arguments + +| Name | Type | Description | Required | +|----------|------|-------------|----------| +| `data` | [`PolygonData`](/docs/kcl/types/PolygonData) | Data for drawing a polygon | Yes | +| `sketch_surface_or_group` | [`SketchOrSurface`](/docs/kcl/types/SketchOrSurface) | A sketch surface or a sketch. | Yes | +| `tag` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | | No | + +### Returns + +[`Sketch`](/docs/kcl/types/Sketch) - A sketch is a collection of paths. + + +### Examples + +```js +// Create a regular hexagon inscribed in a circle of radius 10 +hex = startSketchOn('XY') + |> polygon({ + radius = 10, + numSides = 6, + center = [0, 0], + inscribed = true + }, %) + +example = extrude(5, hex) +``` + +![Rendered example of polygon 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAC59UlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqv+hrrnmmge/2Iu92Gtz1VX/w/3Wb/3Wd3PVVVddddVVV131PxN60IMexFVXXXXVVVddddX/JNdcc82D3/Ed3/GzXuzFXuy1Aa655poHc9VV/0Pdd999twL8wz/8w2//1m/91vf8wz/8w29z1VVXXXXVVVdd9T8HetCDHsRVV1111VVXXXXV/wTXXHPNg9/xHd/xs17ndV7nvXmmv/iLv+Cqq/6ne7mXeznu91u/9Vvf/Vu/9Vvf8w//8A+/zVVXXXXVVVddddV/P/SgBz2Iq6666qqrrrrqqv9O11xzzYM//MM//Lte7MVe7LUBLl68yF/8xV/w67/+61z1v4Nt/j87ceIEL/dyL8cbvMEbcL/77rvv1h/90R/9nN/6rd/6bq666qqrrrrqqqv++6AHPehBXHXVVVddddVVV/13eJ3XeZ33fsd3fMfPuuaaax4McPHiRf7iL/6CX//1X+eqq14Y2/xPdOLECV7u5V6ON3iDN+B+9913360/+qM/+jm/9Vu/9d1cddVVV1111VVX/ddDD3rQg7jqqquuuuqqq676r/SO7/iOn/U6r/M6733NNdc8GODixYv8xV/8Bb/+67/OVVf9d7HNf5QTJ07wci/3crz8y788J06cAOC+++679bd+67e++0d/9Ec/h6uuuuqqq6666qr/OuhBD3oQV1111VVXXXXVVf8V3vEd3/Gz3umd3umzeaaLFy/yF3/xF/z6r/86V131f4Vt7nfixAke+tCH8gZv8AacOHECgPvuu+/W3/qt3/ruH/3RH/0crrrqqquuuuqqq/7zoQc96EFcddVVV1111VVX/We55pprHvzar/3a7/VO7/ROn80zXbx4kb/4i7/g13/917nqqv8PTpw4wUMf+lBe7uVejoc+9KEA3Hfffbf+1m/91nf/6I/+6Odw1VVXXXXVVVdd9Z8HPehBD+Kqq6666qqrrrrqP9o111zz4Nd+7dd+r3d6p3f6bJ7p4sWL/MZv/AZ/8Rd/wVX/e9nmqn+7l3u5l+PlXu7leOhDHwrAfffdd+tv/dZvffdv//Zvf8999913K1ddddVVV1111VX/sdCDHvQgrrrqqquuuuqqq/6jXHPNNQ9+7dd+7fd6p3d6p8/mmS5evMiP//iP87SnPY2rrvrXss3/RSdOnOAd3uEdeOhDHwrAfffdd+s//MM//PaP/uiPfs599913K1ddddVVV1111VX/MdCDHvQgrrrqqquuuuqqq/69rrnmmge/9mu/9nu90zu902fzTE972tP48R//cS5evMhVV/1PY5v/CU6cOMHrv/7r83Iv93IA3Hfffbf+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137t136vd3qnd/psnunixYv85E/+JE9/+tO56qqr/vexzf80J06c4HVf93V52Zd9WQDOnj37jL//+7//rR/90R/9nPvuu+9Wrrrqqquuuuqq/y3Qgx70IK666qqrrrrqqv/5rrnmmge/9mu/9nu90zu902fzTE9/+tP5iZ/4CXZ3d/mvJImr/n+xzVX/s9jmv8KJEyd43dd9XV72ZV8WgPvuu+/Wf/iHf/jt3/qt3/qef/iHf/htrrrqqquuuuqq/+nQgx70IK666qqrrrrqqv+5rrnmmge/4zu+42e9zuu8znvzTL/5m7/JX/7lX7K7uwuAJK666v8S21z1H882/1bHjx/nZV/2ZXm913s97vdbv/Vb3/Nbv/Vb3/0P//APv81VV1111VVXXfU/FXrQgx7EVVddddVVV131P88111zz4A//8A//rhd7sRd7bZ7pN3/zN/mt3/otrrrqqn8921z1r2Ob53bixAle5mVehtd7vdfjfvfdd9+tX//1X/8+//AP//DbXHXVVVddddVV/9OgBz3oQVx11VVXXXXVVf9zvNiLvdhrf/iHf/h3XXPNNQ8G2N3d5S//8i/5rd/6La666qr/Xra56orjx4/zsi/7srzu674u97vvvvtu/dEf/dHP+a3f+q3v5qqrrrrqqquu+p8CPehBD+Kqq6666qqrrvrv947v+I6f9Tqv8zrvfc011zwYYHd3l7/8y7/kt37rt7jqqqv+b7DN/zXHjx/nZV/2ZXmZl3kZTpw4AcB9991362/91m9994/+6I9+DlddddVVV1111X839KAHPYirrrrqqquuuuq/zzu+4zt+1ju90zt9Ns+0u7vLX/7lX/Jbv/Vb/F8kiav+e9jmqv+dbPM/3fHjx3nIQx7C677u63LixAkA7rvvvlt/67d+67t/9Ed/9HO46qqrrrrqqqv+u6AHPehBXHXVVVddddVV/7WuueaaB7/2a7/2e73TO73TZ/NMu7u7/OVf/iW/9Vu/xX8mSVx11X8X21z1n882/12OHz/OQx7yEF72ZV+WhzzkIQCcPXv2Gb/5m7/5XT/6oz/6OVx11VVXXXXVVf/V0IMe9CCuuuqqq6666qr/Gtdcc82DX/u1X/u93umd3umzeabd3V1+8zd/k7/6q7/ifpK46qqrXnS2uerfzjb/GV7mZV6Gl33Zl+UhD3kIAPfdd9+tv/Vbv/Xdv/3bv/099913361cddVVV1111VX/FdCDHvQgrrrqqquuuuqq/1zXXHPNg1/7tV/7vd7pnd7ps3mm3d1dfvInf5Jbb72Vq6666n8O21z1wtnmX+P48eO83du9HQ95yEMAuO+++2797d/+7e/5rd/6re++7777buWqq6666qqrrvrPhB70oAdx1VVXXXXVVVf957jmmmse/Nqv/drv9U7v9E6fzTM9/elP56d+6qfY3d3lqquu+r/HNlddYZsHOn78OK/7uq/Ly77sywJw33333foP//APv/1bv/Vb3/MP//APv81VV1111VVXXfWfAT3oQQ/iqquuuuqqq676j3XNNdc8+B3f8R0/63Ve53Xem2f6rd/6Lf7qr/6K3d1drvqvIYn/DWxz1VW2+f/i+PHjvMzLvAyv+7qvy/1+67d+67t/67d+63v+4R/+4be56qqrrrrqqqv+I6EHPehBXHXVVVddddVV/zGuueaaB7/jO77jZ73O67zOe/NMv/Vbv8Vf/dVfsbu7y/9Wkrjqqudmm6v+e9nmf7Pjx4/zMi/zMrzu674u97vvvvtu/fqv//r3+Yd/+Iff5qqrrrrqqquu+o+AHvSgB3HVVVddddVVV/37vNiLvdhrf/iHf/h3XXPNNQ8G2N3d5a/+6q/4rd/6Lf4zSeKqq/4vs81V/7Fs8z/N8ePHeZmXeRle93Vfl/vdd999t/7oj/7o5/zWb/3Wd3PVVVddddVVV/17oAc96EFcddVVV1111VX/Nu/4ju/4Wa/zOq/z3tdcc82DAXZ3d/mrv/orfuu3fovnRxJXXXXVfx/bXPWis81/pePHj/MyL/MyvOzLvizHjx8H4OzZs8/4zd/8ze/60R/90c/hqquuuuqqq676t0APetCDuOqqq6666qqr/nXe8R3f8bNe53Ve572vueaaBwPs7u7yV3/1V/z2b/82V1111f9ttrnqednmP8rx48d5mZd5GV72ZV+W48ePA3Dffffd+lu/9Vvf/aM/+qOfw1VXXXXVVVdd9a+BHvSgB3HVVVddddVVV/3Lrrnmmge/9mu/9nu90zu902fzTLu7u/zVX/0Vv/3bv81VV1111b/ENv/f2eZFdfz4cR7ykIfwuq/7uhw/fhyA++6779bf/u3f/p4f+ZEf+Wyuuuqqq6666qoXBXrQgx7EVVddddVVV131gl1zzTUPfu3Xfu33eqd3eqfP5pl2d3f5rd/6Lf76r/+aq140krjqfw7bXPW/h23+v7HN/Y4fP85DHvIQXuZlXoaHPOQhANx33323/tZv/dZ3/+iP/ujncNVVV1111VVXvTDoQQ96EFddddVVV1111fO65pprHvzar/3a7/VO7/ROn80z7e7u8lu/9Vv89V//Nf8bSeKqq/672eaq/1y2+b/qwQ9+MK/zOq/DQx7yEADuu+++W3/rt37ru3/7t3/7e+67775bueqqq6666qqrnht60IMexFVXXXXVVVdd9WzXXHPNg1/7tV/7vd7pnd7ps3mmW2+9ld/6rd/i1ltv5b+CJK666qoXnW2u+rezzf82x48f53Ve53V4mZd5GQDOnj37jL//+7//rR/90R/9nPvuu+9Wrrrqqquuuuqq+6EHPehBXHXVVVddddVVcM011zz4Hd/xHT/rdV7ndd6bZ/qt3/ot/vqv/5rd3V1eFJK46qqr/veyzVUvnG3+Jzl+/Div8zqvw8u8zMsAcN999936D//wD7/9W7/1W9/zD//wD7/NVVddddVVV12FHvSgB3HVVVddddVV/59dc801D37Hd3zHz3qd13md9+aZfvu3f5u//uu/Znd3l6uuuuqqF5VtrrrCNv+Vjh8/zsu8zMvwOq/zOtzvt37rt77nt37rt777H/7hH36bq6666qqrrvr/Cz3oQQ/iqquuuuqqq/4/uuaaax784R/+4d/1Yi/2Yq/NM/32b/82v/3bv81V/7dI4n8q21x1lW3+v7LNf6Tjx4/zMi/zMrzO67wO97vvvvtu/dEf/dHP+a3f+q3v5qqrrrrqqqv+/0EPetCDuOqqq6666qr/T17sxV7stT/8wz/8u6655poHA+zu7vLXf/3X/PZv/zZXvXCSuOoqANtc9d/LNv9f2OZf6/jx47zMy7wMr/M6r8P97rvvvlt/9Ed/9HN+67d+67u56qqrrrrqqv8/0IMe9CCuuuqqq6666v+Dd3zHd/ys13md13nva6655sEAu7u7/PVf/zW//du/zf8Fkrjqqv9LbHPVfxzb/F9mm+fn+PHjvMzLvAwv8zIvw/HjxwG47777bv2t3/qt7/7RH/3Rz+Gqq6666qqr/u9DD3rQg7jqqquuuuqq/8ve8R3f8bPe6Z3e6bN5pt3dXf76r/+a3/7t3+a/kySuuuqq/zq2uepFY5v/a44fP86DH/xgXud1Xofjx48DcN999936W7/1W9/9oz/6o5/DVVddddVVV/3fhR70oAdx1VVXXXXVVf/XXHPNNQ9+7dd+7fd6p3d6p8/mmXZ3d/nrv/5rfvu3f5t/L0lcddVV/7/Y5qrnZJv/bY4fP86DH/xgXuZlXoYHP/jBAJw9e/YZv/mbv/ldP/qjP/o5XHXVVVddddX/PehBD3oQV1111VVXXfV/yeu8zuu894d/+Id/F8+0u7vLb//2b/PXf/3XPJAkrrrqqqv+K9jm/zPb/E/00i/90rzMy7wMD37wgwG47777bv2t3/qt7/7RH/3Rz+Gqq6666qqr/u+gctVVV1111VX/h1xzzTUPfp3XeZ33Atjd3eVnfuZnuPXWWwGQxFX/80jiqv9ctrnqv5ck/rVs83+FJF4Utvmv9Nd//df89V//NcePH+d93ud9uOaaax58zTXXPPiaa6558H333XcrV1111VVXXfV/A5Wrrrrqqquu+j/kzJkzD36xF3ux1+aZdnd3ueqFk8RV/7dJ4r+Tba7615PEv4Zt/reTxL/ENv8Zdnd3OX78OK/zOq/z3v/wD//wO/fdd993c9VVV1111VX/NxBcddVVV1111f9Rx48f573e6704fvw4/xdIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCRx1VX/2SQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkrjqOUlCEpKQhCQkIQlJSEISkpDE/1aSkIQkJCEJSUhCEpL41zh+/Dhv8zZvw4Mf/GDud999993KVVddddVVV/3fQXDVVVddddVV/4ecPXv2VoA/+qM/4vz58xw/fpz3eq/34r+TJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkcdVVVz0nSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlI4v8rSUhCEpKQhCQkIQlJSOJ/I0lIQhKSkIQkJCEJSdzvbd7mbXjwgx/M/v4+f/qnfwrA2bNnb+Wqq6666qqr/u8guOqqq6666qr/g06dOsVXfdVXcf78eY4fP85HfdRH8W8lCUlIQhKSkIQkJCEJSUhCEpKQhCQkcdVVV/3PJglJSEISkpCEJCQhCUlIQhKSkIQkJPF/nSQkIQlJSEISkpCEJCQhif9NJPE+7/M+PPjBD2Z/f5/v/d7vZWdnB4D77rvvVq666qqrrrrq/w6Cq6666qqrrvo/5L777rv1vvvuuxXg/PnzfNVXfRXnz5/n+PHjfNRHfRSSkIQkJCEJSUhCEpKQhCQkIYmrrrrqqhdGEpKQhCQkIQlJSEISkpCEJCQhif+LJCEJSUhCEpKQhCQk8T/Fe7/3e/PgBz+Y/f19vvd7vxeA7e1trrrqqquuuur/IIKrrrrqqquu+j/m7Nmzt546dQqA8+fP81Vf9VWcP3+e48eP85Ef+ZFc9Z9HEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkrvrPJQlJSEISkpCEJCQhCUlIQhL/V0hCEpKQhCQkIQlJSEIS/5ne+73fmwc/+MHs7+/zvd/7vdxvZ2eH++6771auuuqqq6666v8Wgquuuuqqq676P+78+fN89Vd/NefPn+f48eN85Ed+JP+fSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkrjq/xZJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISV/3LJCEJSUhCEpKQhCQkIQlJSOJ/O0lIQhKSkIQkJCEJSfxbvPd7vzcPfvCD2d/f53u/93u5nyS2t7f5h3/4h9/mqquuuuqqq/5vIbjqqquuuuqq/2Puu+++W0+dOsUDnT9/nq/+6q/m/PnzHD9+nI/8yI/kfypJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpK46qr/DSQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSOIqkIQkJCEJSUhCEpKQhCQk8b+VJCQhCUlIQhKSkMRze+/3fm8e/OAHs7+/z0//9E8jCUlI4qqrrrrqqqv+DyO46qqrrrrqqv9j7rvvvlsBHvnIR3I/25w/f56v/uqv5vz58xw/fpyP/MiP5D+aJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCSuuuqqfz9JSEISkpCEJCQhCUlIQhKSkIQkJCGJ/28kIQlJSEISkpCEJCQhif9tJCEJSbz3e783D37wg9nf3+c3fuM32N/f54G2t7cBuO+++27lqquuuuqqq/5vIbjqqquuuuqq/2POnj37DF6A8+fP89Vf/dWcP3+e48eP85Ef+ZE8N0lIQhKSkIQkJCEJSUhCEpKQhCQkcdVVV/3fIAlJSEISkpCEJCQhCUlIQhKSkIQk/i+ThCQkIQlJSEISkpCEJP6nea/3ei8e/OAHs7+/z2/8xm9w11138dxuvPFGAM6ePfsMrrrqqquuuur/FoKrrrrqqquu+j/mvvvuuxXg1KlTPD/nz5/nq7/6qzl//jzHjx/nIz/yI5GEJCRx1f8ukpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkMRV/3tIQhKSkIQkJCEJSUhCEpKQhCT+r5GEJCQhCUlIQhKSkIQk/iu813u9Fw9+8IPZ39/nN37jN7jrrru46qqrrrrqqv9nCK666qqrrrrq/6iTJ0/ygpw/f56v/uqv5vz58xw/fpz3fM/35KoXThKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIYn/LyQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQxFX/fpKQhCQkIQlJSEISkpCEJCQhif8LJCEJSUhCEpKQhCQk8e/xXu/1Xjz4wQ9mf3+f3/iN3+Cuu+7igSQhCUlsb28D8A//8A+/zVVXXXXVVVf930Jw1VVXXXXVVf/HnD179laAU6dO8UC2eaDz58/zNV/zNZw/f54HPehBvOVbviX/m0lCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSVx11QsiCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJK56wSQhCUlIQhKSkIQkJCEJSfxvJglJSEISkpCEJCTxgrzXe70XD37wg9nf3+c3fuM3uPvuu5GEJCQhiQfa2dnhqquuuuqqq/6PIrjqqquuuuqq/2Puu+++WwFOnTrFv+TcuXN8zdd8DefPn+elXuqleMu3fEv+q0lCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhJXXfV/kSQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCGJ/88kIQlJSEISkpCEJCQhCUn8byMJSUhCEpJ4r/d6Lx784Aezv7/Pb/7mb3L33Xfzorrvvvtu5aqrrrrqqqv+byG46qqrrrrqqv+D7rvvvlt5EZ0/f56v+Zqv4fz587zUS70Ub/mWb8m/hiQkIQlJSEISkpCEJCQhCUlIQhKSkMRVV131X0MSkpCEJCQhCUlIQhKSkIQkJCEJSUji/wtJSEISkpCEJCQhCUlI4n+q93zP9+TBD34w+/v7/OZv/iZ33XUXL4obbriB++6771auuuqqq6666v8egquuuuqqq676P+js2bO3njp1ihfV+fPn+Zqv+RrOnz/PS73US/GWb/mWSEISkpCEJCQhCUlIQhJXXXXV/w+SkIQkJCEJSUhCEpKQhCQkIQlJ/F8lCUlIQhKSkIQkJCGJ/2rv+Z7vyYMf/GD29/f5zd/8Te666y7+Nc6ePXsrV1111VVXXfV/D8FVV1111VVX/R916tQpnpttXpDz58/zNV/zNQC81Eu9FG/xFm/BVf97SUISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIYmr/m+RhCQkIQlJSEISkpCEJCQhCUn8XyEJSUhCEpKQhCQkIQlJ/Ed4z/d8Tx784AcD8Ju/+ZvcddddvCCSkIQkJCGJ7e1t7rvvvlu56qqrrrrqqv97CK666qqrrrrq/6C///u//22AU6dO8S+xzf3Onz/PZ37mZwLwUi/1UrzFW7wFVz0vSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUn8byYJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhiav+c0lCEpKQhCQkIQlJSEISkvi/QBKSkIQkJCEJSUjiX/Ke7/mePPjBDwbgZ37mZ7jrrrt4IElIQhKSuOqqq6666qr/Zwiuuuqqq6666v+wkydP8q91/vx5PvMzPxOAl3qpl+It3uIt+N9GEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUjiqqskIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCSuetFJQhKSkIQkJCEJSUhCEpL430oSkpCEJCQhCUm813u9Fw9+8IMB+Jmf+RnuuusuACQhCUn8S2644QYA7rvvvlu56qqrrrrqqv97CK666qqrrrrq/6CzZ88+gxfANv+S8+fP85mf+ZkAvNRLvRRv8RZvwX82SUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhJXXfW/nSQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCGJq55NEpKQhCQkIQlJSEISkpDE/wbv+Z7vyYMe9CAAfuZnfoa7774bSUjiX2N7exuAs2fPPoOrrrrqqquu+r+H4Kqrrrrqqqv+D7rvvvtuBXjkIx/Jv9WFCxf4zM/8TABe6qVeird4i7fghZGEJCQhCUlIQhKSkIQkJCEJSUhCEpK46qqr/nNIQhKSkIQkJCEJSUhCEpKQhCQkIQlJ/H8lCUlIQhKSkIQkJCEJSfx3ecu3fEse9KAHAfCzP/uz3H333fxrSUIS97vvvvtu5aqrrrrqqqv+7yG46qqrrrrqqv+Dzp49eyv/CrZ5fi5cuMBnfuZnAvBSL/VSvOZrviaSkIQkJCEJSVx11VX/N0lCEpKQhCQkIQlJSEISkpCEJCTx/4UkJCEJSUhCEpKQhCT+o73lW74lL/VSLwXAz/7sz3LXXXfxopCEJCQhifttb28DcPbs2Vu56qqrrrrqqv97CK666qqrrrrq/7BTp05hm38L2wBcuHCBz/zMzwTgNV/zNXmN13gNrvqvJQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJXPU/iyQkIQlJSEISkpCEJCQhCUlI4v8qSUhCEpKQhCQkIQlJvKje8i3fkpd6qZcC4Gd/9me56667eEEkIQlJSOIF2d7eBuC+++67lauuuuqqq676v4fgqquuuuqqq/4Puu+++24FOHXqFM+Pbf41Lly4wGd+5mcC8Jqv+Zq8xmu8Bv9fSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlI4qoXjSQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCRx1b+dJCQhCUlIQhKSkIQkJCGJ/2skIQlJSEISkpCEJCTxlm/5lrzUS70UAD/7sz/LXXfdxfMjCUm8qLa3t7nqqquuuuqq/8MIrrrqqquuuur/qH/4h3/47VOnTvEf5cKFC3zmZ34mAK/5mq/Ja7zGa/A/iSQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEldd9a8lCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpDEVc9JEpKQhCQkIQlJSEISkpDE/wVv8RZvwUu91EsB8LM/+7PcddddPJAkJCGJf63t7W3uu+++W7nqqquuuuqq/5sIrrrqqquuuur/Adv8S2zzL7lw4QLf//3fD8BrvuZr8hqv8Rr8e0lCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhJXXfV/nSQkIQlJSEISkpCEJCQhCUlIQhKSkIQk/r+ShCQkIQlJSEISkpCEJCTxP9FbvMVb8FIv9VIA/OzP/ix33XUX95OEJF5UkpCEJCQhCYCzZ8/eylVXXXXVVVf930Tlqquuuuqqq/6Puu+++259sRd7Mf49bCOJB/qTP/kTAN793d+d13zN10QSv/d7v8dVV131P58k/j1s83+dJF4Utvmv8BZv8Ra81Eu9FAA/+7M/y1133QWAJF5Uknhhtre3ue+++27lqquuuuqqq/5vonLVVVddddVV/0fdd999twKcOnWK8+fP89xsI4l/iz/5kz8B4N3f/d15jdd4DQB+7/d+j6uuuur/Nkn8a9nm/yJJ/Ets8+/xFm/xFrzUS70UAD/7sz/LXXfdhSReFJJ4UWxvbwNw33333cpVV1111VVX/d9E5aqrrrrqqqv+jzt16hTnz5/nRWEbSbwwtpHEn/zJnwDw7u/+7rzGa7wGAL/3e7/HVf96krjqv4ZtrvqvJYl/Ldv8XyCJf4ltnp+3eIu34KVe6qUA+Nmf/VnuvvtuJPHCSOJfa2trC4CzZ88+g6uuuuqqq676v4nKVVddddVVV/0f9Q//8A+/A3Dq1CkAbCOJ/0h/8id/AsC7v/u78xqv8RoA/N7v/R7/m0niqv+7JPFfzTZX/etI4kVlm//NJPHcXuM1XoOXeqmXAuDnfu7nuPvuu3lhJPGvIYn77ezscNVVV1111VX/x1G56qqrrrrqqv/jTp06xQtiG0m8MLaRxAvyJ3/yJwC8+7u/O6/xGq8BwO/93u/xX0ESV131P50k/qPZ5qorJPGiss3/dC/5ki/Ja77mawLwcz/3c9x11128IJJ4UUjiBdna2gLgH/7hH36bq6666qqrrvq/icpVV1111VVX/R919uzZW/lPYhtJ3O9P/uRPkMS7vdu78Rqv8RoA/N7v/R4vjCSuuuqqfxtJ/HvZ5v8bSbwobPPf4SVf8iV5i7d4CwB+7ud+jrvuuovnRxL/Ekm8KLa3t7nqqquuuuqq/+OoXHXVVVddddX/Uffdd9+tAI985CP517CNJP61/uRP/gSAd3u3d+M1XuM1APj93/99rrrqqv+ZJPFvZZv/yyTxL7HNf6SXfMmX5C3e4i0A+Lmf+znuuusunpsk/iWS+Le47777buWqq6666qqr/m+ictVVV1111VX/h9133323Ag/mmWwjiX8t20jihbHNn/zJnwDwbu/2brzGa7wGAL//+7/PVVdd9X+LJP61bPN/iSReFLb5l7zkS74kb/EWbwHAz/3cz3HXXXfxQJL4l0jiRSWJ+21vb3PVVVddddVV/8dRueqqq6666qr/w86ePXvrdddd92BeCNtI4j/Kn/zJn3Dy5Ene5E3ehNd4jdcA4Pd///e56tkkcdX/HLa56j+fJP41bPN/gSRemJd4iZfgLd7iLQD47d/+be666y7uJ4l/iSReFJJ4fra2tviHf/iH3+Gqq6666qqr/u+ictVVV1111VX/x506dYr/DLaRxPPzS7/0SwC8yZu8Ca/xGq8BwO///u/zP5kkrvr/SRL/VWxz1YtGEi8q2/xv9JIv+ZK8+Zu/OQC//du/zROf+ETuJ4kXRhL/Ekn8S7a3t7nvvvtu5aqrrrrqqqv+7yK46qqrrrrqqv/D7rvvvlsBTp06xf1s8y+xzb/XL/3SL/FLv/RLALzGa7wGr/7qr85/JElIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkrjqqv8KkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkcdUVkpCEJCQhCUlIQhKSkIQk/qd4yZd8Sd78zd8cgN/+7d/miU98IgCSkMQLIglJvCCSkIQkrrrqqquuuuqqy6hcddVVV1111f9h9913360Ap06d4vz58/x72EYSL4xtJHG/X/qlXwLgTd7kTXiN13gNAH7/938fSVx11VX/fpL497LN/yeSeFHY5j/LS77kS/Lmb/7mAPz2b/82T3ziEwGQxAsiiRdGEi8qSQBcf/31ANx3331P56qrrrrqqqv+76Jy1VVXXXXVVf+HnT179hm8CGwjif8Mv/RLvwTAm7zJm/CSL/mSSOL3f//3ueqqq/5nkMS/hW3+L5PEv8Q2/1q33HILb/7mbw7Ab//2b/PEJz4RSbwgknhhJPGikMRz29raAuDs2bPP4Kqrrrrqqqv+76Jy1VVXXXXVVf+H3XfffbcCnDp1in8t20jihbGNJP4lv/zLvwzAm7zJm/ASL/ESAPz+7/8+V1111f9ekvjXss3/JZL4l9jmfrfccgvv/u7vDsBv//Zv86QnPQlJvCCSeEEk8S+RxIvi7Nmzt3LVVVddddVV/3dRueqqq6666qr/w86ePXsrwKlTp3gg20jiP4NtJPHcfvmXfxmAN3mTN+ElXuIlAPj93/99/r+QxFX/O9jmqv8ckvjXsM3/dpIAuOWWW3i3d3s3AH77t3+bJz3pSbwgknhBJPHCSOJFtbW1BcB99913K1ddddVVV131fxeVq6666qqrrvp/4NSpU/xLbCOJF8Y2kvi3+uVf/mUA3uRN3oSXeImXAOD3f//3+e8kiauueiBJ/FewzVUvnCReVLb5n+qWW27h3d7t3QD47d/+bZ70pCfx/EjiBZHECyOJF5UkALa3t7nqqquuuuqq/weoXHXVVVddddX/Yffdd9+tAKdOneI/i20k8cLYRhIAv/zLvwzAm7zJm/ASL/ESAPz+7/8+/xqSuOqq/+0k8R/FNv/fSeJFYZv/Srfccgvv9m7vBsBf/MVf8KQnPYnnRxIviCReEEn8SyTxwtx33323ctVVV1111VX/d1G56qqrrrrqqv/j7rvvvltPnTr1YP4NbCOJ/2i//Mu/DMCbvMmb8BIv8RIA/MEf/AFXXXXVv40k/j1s8/+FJF4Utvn3uuWWW3i3d3s3AJ70pCfxF3/xFzw3SbwgknhBJPEvkcQLc/3113PffffdylVXXXXVVVf930Zw1VVXXXXVVf/HnT179laeD9v8W9jmX2Kbf8kv//Iv88u//MscO3aMl3iJl+DVXu3VuOqqq/57SEISkpCEJCQhCUlIQhKSkIQkJPF/mSQkIQlJSEISkpCEJF6YW265hXd7t3cD4ElPehK//du/zXOTxAsiiedHEpJ4QSQhCUm8KM6ePXsrV1111VVXXfV/G5Wrrrrqqquu+j/uvvvuu/XFXuzFeFHYRhL/GWwjiQf65V/+ZQDe+I3fmJd4iZcA4A/+4A+46qqr/neQxL+Wbf6vkMTzc8stt/Cu7/quADzpSU/it3/7t3luknh+JPGCSOIFkcSLQhL329ra4r777ruVq6666qqrrvq/jcpVV1111VVX/R9333333Qpw8uRJLly4wL+WbSTxwthGEv8Wv/zLvwzAG7/xG/MSL/ES3H777dx22238XyKJq/73sc1V//Ek8aKyzf82t9xyC+/6ru8KwJOe9CR++7d/mweSxAsiiedHEi+IJP4lknhuW1tbANx33323ctVVV1111VX/txFcddVVV1111f8Tp06d4rnZ5j+Lbf4ltgH45V/+ZX75l3+ZY8eO8aZv+qbccsst/FeRhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQxFX/O0lCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUjiqhdOEpKQhCQkIQlJSEISkpDE/wS33HIL7/qu7wrAk570JH77t3+bB5LE8yMJSTw3SUji+ZGEJF4QSUhCEs/P1tYWAGfPnn0GV1111VVXXfV/G8FVV1111VVX/R/3D//wD7/DfzDb/Ef75V/+ZX75l3+ZY8eO8aZv+qbccsstvCCSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJK666r+TJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIYn/7yQhCUlIQhKSkIQkJCGJ/yy33HIL7/qu7wrAk570JH77t3+b+0lCEs+PJJ4fSTw/kpDECyIJSfxLtra2uOqqq6666qr/Jwiuuuqqq6666v+JRz7ykbwobPNvYZt/iW1emF/+5V/ml3/5lzl27Bhv+qZvyi233IIkJCEJSUjiqquuel6SkIQkJCEJSUhCEpKQhCQkIQlJSOL/E0lIQhKSkIQkJCEJSUjiX+OWW27hXd/1XQF40pOexG//9m9zP0k8P5KQxHOThCSeH0m8IJKQxAsjCUlIQhIA9913361cddVVV1111f9tBFddddVVV131f9zZs2dv5Zls829hm/8qv/zLv8wv//Ivc+zYMd70Td+Um2++mauuuuo/lyQkIQlJSEISkpCEJCQhCUlIQhL/l0lCEpKQhCQkIQlJSALglltu4V3f9V0BeNKTnsRv//Zvcz9JPD+SeH4k8fxIQhLPjyQk8YJIQhKSeKDrrrsOgLNnz97KVVddddVVV/3fRnDVVVddddVV/0886lGP4vmxzX8W2/xLbPPcfuVXfoVf/uVf5tixY7zpm74pN998M1ddddX/PJKQhCQkIQlJSEISkpCEJCQhif9LHvSgB/Gu7/quANx111389m//NgCSkMRzk4Qknh9JPD+SeH4kIYnnRxKSkMS/5L777ruVq6666qqrrvq/jcpVV1111VVX/R9333333XrffffdCjyYF5FtJPHC2EYS/xls82d/9mcAvPEbvzFv+qZvyi/+4i9y++2387+RJK7638k2V/3HksSLyjb/U91yyy28y7u8CwB33XUXP//zPw+AJJ4fSTw/knh+JPH8SOIFkcSLQhJbW1tcddVVV1111f8TBFddddVVV131/8DZs2dvPXXqFAC2+c9im3+JbV4UFy5c4M/+7M/45V/+ZY4dO8abvumbcvPNN/OfQRKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlI4qr/vSQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJK564SQhCUlIQhKSkIQkJCEJSfxXuuWWW3iXd3kXAO666y5+/ud/HgBJPD+SeH4k8fxI4vmRxPMjCUm8MJKQhCQAtra2+Id/+Iff5qqrrrrqqqv+7yO46qqrrrrqqquwzb/ENv9ZbPP8XLhwgT/7sz/jl3/5lzl27Bhv+qZvys033wyAJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIYmrrvrvIglJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUji/ztJSEISkpCEJCQhCUlI4t/rlltu4V3e5V0AuOuuu/j5n/95JCGJ5yYJSTw3SUjiuUlCEs9NEpJ4bpKQxAsiCUlI4rltbW1x33333cpVV1111VVX/d9HcNVVV1111VX/D9x33323njp1ilOnTvEfyTb/Etv8e1y4cIE/+7M/45d/+Zc5duwYb/qmb8ott9zCVVdd9ZwkIQlJSEISkpCEJCQhCUlIQhKSkMT/J5KQhCQkIQlJSEISknhBjh07xru8y7sAcNddd/HzP//zSOL5kcTzI4nnRxLPTRKSeH4k8YJIQhJXXXXVVVddddVlBFddddVVV131/8B99913K8CpU6d4UdnmP4tt/iW2ud+FCxf4sz/7M37lV36FY8eO8SZv8iYcO3aMq6666j+GJCQhCUlIQhKSkIQkJCEJSUhCEv9XSUISkpCEJI4fP84Hf/AHA3DXXXfx8z//80ji+ZHE8yOJ5yYJSTw3STw/kpDEc5OEJCTxgkhCEtvb2wDcd999t3LVVVddddVV//cRXHXVVVddddX/A2fPnn0GD2Cbfwvb/Ets85/hwoUL/Nmf/Rm/8iu/wrFjx3ind3onjh07xlVXXfXfRxKSkIQkJCEJSUhCEpKQhCT+tzp27Bgf9EEfBMBdd93FL/zCLyCJ50cSz00Sknhuknh+JPHcJCGJ50cSL4gkJCGJ+1177bUAnD179hlcddVVV1111f99VK666qqrrrrq/4H77rvvVoBTp07xgthGEv8ZbCOJF8Y2knhhzp8/z5/92Z8B8EZv9Ea80zu9Ez/yIz/CpUuX+J9OElf972Obq/7jSOJfwzb/3Y4dO8YHfdAHAXDXXXfxC7/wCzw/knh+JPH8SOK5SeL5kcTzI4kXRBJXXXXVVVddddVlBFddddVVV131/8DZs2dvBTh16hT/Grb5l9jmv9KFCxf4sz/7M37lV36FY8eO8U7v9E4cO3aMfy9JSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIYmr/neShCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpK46oWThCQkIQlJSEISkpCEJP6zHDt2jA/6oA8C4K677uIXfuEXeH4k8fxI4rlJQhLPTRLPTRKSeG6SkMTzIwlJvDBbW1sA/MM//MNvc9VVV1111VX/9xFcddVVV1111f8jp0+f5n62+c9im3+Jbf4ltnl+Lly4wJ/92Z/xlKc8hWPHjvFO7/ROHDt2DElIQhKSkIQkJCEJSUhCEpKQhCQkcdVV/x0kIQlJSEISkpCEJCQhCUlIQhKSkIQkJCGJ/+8kIQlJSEISkpCEJCQhiX+NY8eO8UEf9EEA3HXXXfzCL/wCz48knh9JPDdJPDdJSOK5SeK5SUISz48kJPH8SEISkpDE1tYWV1111VVXXfX/CMFVV1111VVX/T9w33333Qpw6tQp/r1s85/FNv8S2wBcuHCBH/7hH+YpT3kKx44d453e6Z3Y2dnhqqv+P5KEJCQhCUlIQhKSkIQkJCEJSUhCEpL4/0ISkpCEJCQhCUlIQhKSOHbsGB/0QR8EwN13380v/MIv8PxI4rlJQhLPTRLPTRLPTRKSeG6SeH4kIYnnRxKSeEHuu+++W7nqqquuuuqq//sIrrrqqquuuur/ifvuu+/WU6dO8cLY5t/CNv8S2/xHu3DhAj/8wz/MU5/6VI4dO8Y7vdM7sbOzw1VXXfWvIwlJSEISkpCEJCQhCUlIQhKS+L/q2LFjfNAHfRAAd999Nz//8z/Pc5OEJJ6bJJ6bJCTx3CTx3CTx3CQhiecmCUk8P5KQxAty7bXXct99993KVVddddVVV/3/QHDVVVddddVV/0+cPXv2Vv4NbPOfxTb/Etu8MBcuXOCHfuiHeOpTn8qxY8d4p3d6J3Z2drjqqqv+c0lCEpKQhCQkIQlJSEISkpCEJP6nO3bsGB/4gR8IwN13383P//zP89wk8fxI4rlJ4rlJQhLPTRLPTRLPTRKSeG6SkIQkXhBJSALg7Nmzt3LVVVddddVV/z8QXHXVVVddddX/I6dOneKBbPNvYZt/iW3+q1y4cIEf/uEf5qlPfSrHjh3jnd7pndjZ2eF/IklIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCElf9x5OEJCQhCUlIQhKSkIQkJPFf7dixY7zTO70TAHfffTc///M/z3OTxPMjiecmiecmiecmCUk8kCQk8dwk8fxI4gWRhCQkcb+trS3uu+++W7nqqquuuuqq/x8Irrrqqquuuur/ib//+7//bYBTp07xwtjmP4tt/iW2+ZfY5rlduHCBH/7hH+apT30qx44d453e6Z3Y2dnhX0sSkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSOKq/z0kIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCSueuEkIQlJSEISkpCEJCQhif8Ix44d403e5E04duwYd999Nz//8z/Pc5PEc5OEJJ6bJJ6bJJ6bJJ6bJJ6bJCTx3CQhiecmCUlI4rltbm5y1VVXXXXVVf/PEFx11VVXXXXV/zOnTp3iP4Nt/jvZ5sKFC/zwD/8wT33qUzl27Bjv/M7vzLFjx5CEJCQhCUlIQhKSkIQkJHHVVf9VJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhif/vJCEJSUhCEpKQhCQkIYkX5NixY7zJm7wJN998M3fffTc///M/zwNJQhLPTRLPjySemySemySemySemySemyQk8dwkIYkXZnt7G4B/+Id/+B2uuuqqq6666v8Hgquuuuqqq676f+If/uEffod/I9v8W9jmX2Kbf4ltXlQXLlzgh3/4h3nqU5/Kzs4O7/RO78TOzg5XXfV/lSQkIQlJSEISkpCEJCQhCUlIQhKSkMT/F5KQhCQkIYljx47xJm/yJtx8883cfffd/PzP/zwPJInnRxLPTRKSeCBJSOKBJCGJB5KEJB5IEpJ4bpJ4bpKQxAsiCUlIYnNzk6uuuuqqq676f4bgqquuuuqqq/6feeQjH8kD2ebfwjb/WWzzL7HNC3LhwgV++Id/mKc+9ans7OzwTu/0Tuzs7HDVVVc9L0lIQhKSkIQkJCEJSUhCEpKQxP8FOzs7vMmbvAk333wzd999Nz//8z/PA0ni+ZHEc5PEc5PEc5PEc5PEc5PEc5OEJB5IEpJ4fiQhCUk8P/fdd9+tXHXVVVddddX/DwRXXXXVVVdd9f/E2bNnb+VFZJt/C9v8S2zzX+HChQv88A//MBcuXGBnZ4d3eqd3Ymdnh6uuuurfTxKSkIQkJCEJSUhCEpKQhCQk8T/Jzs4Ob/Imb8LNN9/M/v4+P//zP88DSeL5kcRzk8Rzk8Rzk8Rzk8Rzk8QDSUISz00Sz48kJPGCbG5uAnD27Nlbueqqq6666qr/Hwiuuuqqq6666v+ZRz7ykfxb2OY/i23+Jbb5l9jmgS5cuMA3fdM3ceHCBXZ2dnind3ondnZ2+J9EEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCSu+s8jCUlIQhKSkIQkJCEJSUjiP9POzg5v8iZvws0338z+/j4//MM/zP0kIYnnJglJPDdJPDdJPDdJPJAkJPFAkpDEA0niuUlCEs9NEpJ4QSQhia2tLQDuu+++W7nqqquuuuqq/x8Irrrqqquuuur/ifvuu+/W++6771aeD9v8W9jmX2Kb/04XL17km77pm7hw4QI7Ozu80zu9Ezs7O7woJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJHHV/yySkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSuOpfJglJSEISkpCEJCQhCUn8a+3s7PAmb/Im3Hzzzezv7/PDP/zD3E8Sz48knh9JPDdJPDdJPJAknpsknpsknpsknpskJPH8SEISkrjf5uYmV1111VVXXfX/DMFVV1111VVX/T9y9uzZW0+fPs2Lwjb/WWzzL7HNv8Q2/xLbXLx4kW/6pm/iwoUL7Ozs8E7v9E4cO3YMSUhCEpKQhCQkIYmrrvrPIAlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUji/ztJSEISkpCEJCQhCUlIAmBnZ4c3eZM34eabb2Z/f58f/uEf5n6SeH4k8dwkIYkHkoQkHkgSknggSTw3STyQJCTxQJKQxHOTxPMjCUk8P1tbW9x33323ctVVV1111VX/fxBcddVVV1111f9DtvnPYpv/TrZ5fi5evMg3fdM3ceHCBXZ2dnjHd3xHrrrqfztJSEISkpCEJCQhCUlIQhKSkIQkJPH/iSTe5E3ehJtvvpn9/X1++Id/mPtJ4vmRxHOTxHOTxHOTxHOTxANJQhIPJInnJonnJglJPDdJSOL5kYQkNjc3+Yd/+Iff5qqrrrrqqqv+/yC46qqrrrrqqv9H7rvvvltPnTrFv5Vt/i1s8y+xzb/ENv8eFy9e5Ju+6Zu4cOECOzs7vP/7vz9XXfX/lSQkIQlJSEISkpCEJCQhCUlIQhL/G73jO74jN998M/v7+/zwD/8wAJKQxHOThCSemySemySemySemyQeSBLPTRIPJAlJPJAkJPHcJCGJ5yYJSUjiqquuuuqqq/4fI7jqqquuuuqq/0fuu+++WwEe+chH8txs829hm/8stvmX2OZfYpv7Xbx4kW/6pm/i4sWL7Ozs8P7v//5cddVVLzpJSEISkpCEJCQhCUlIQhKS+O/2ju/4jtx8883s7+/zwz/8wwBI4vmRxPMjiecmiecmiQeShCQeSBIPJAlJPJAknpsknpskJPHcJCGJ57a5uQnAfffddytXXXXVVVdd9f8HwVVXXXXVVVf9P3L27Nln8K9gm38L2/xLbPPf5eLFi3zjN34jFy9eZGdnh/d///fnfwpJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQxFX/uSQhCUlIQhKSkIQkJCEJSfxHe8d3fEduvvlm9vf3+eEf/mEAJPH8SOL5kcRzk8Rzk8QDSeK5SeKBJPHcJPFAkpDEA0lCEs9NEpJ4Qa699loAzp49+wyuuuqqq6666v8PKlddddVVV131/8h99913K8Dp06d50pOehCT+tWwjif8MtpHEC2MbSbwwtpHEC3Px4kW+6Zu+iQ/5kA/hxIkTvP/7vz+//Mu/zAsiiauu+vewzVX/dV7lVV6Fm2++mf39fX74h38YSbwgknhuknh+JPFAknhuknhuknggSTyQJJ6bJJ6bJJ6bJF4QSVx11VVXXXXV/3NUrrrqqquuuur/oVOnTvH82EYS/xlsI4n/SS5evMg3fdM38SEf8iGcOHGCd3zHd+Sqq676v2N/f5/f+Z3fQRIviCSemySemySemySemyQeSBLPTRIPJInnJokHksRzk8TzI4nnZ3NzE4B/+Id/+G2uuuqqq6666v8PKlddddVVV131/8jZs2dvBTh16hQvKttI4oWxjST+tWwjiRfGNpJ4YWwjiRfGNpJ4INtcvHiRX/3VX+Wd3umdALj77ru56qqr/nfb2tpie3ubv/zLv+See+7h+ZHE8yOJ5yaJ5yaJ5yaJB5LEA0niuUnigSTx3CTx3CTx3CTxwmxubnLVVVddddVV/w9Rueqqq6666qr/R+67775bAU6dOsV/NttI4r+LbSTxorh48SIAd999N7/wC7/Av5Uk/qeSxFX//9jmfyLb/Gd6szd7M7a3tzk4OOD5kcTzI4nnJonnJonnJokHksQDSeK5SeKBJPFAknhuknhuknhBJPHc7rvvvlu56qqrrrrqqv8/qFx11VVXXXXV/zP33XffrcCDAWwjiX8t20jiX8s2knhhbCOJF8Y2kvifxjbPTRL/E9jmhZHEVf/72OZ/A9v8V9ra2uIFkcTzI4nnJonnJokHksRzk8QDSeKBJPHcJPFAknhuknggSTw/knh+rrnmGs6ePfsMrrrqqquuuur/FypXXXXVVVdd9f/M2bNnb73uuusezAtgG0n8a9lGEv8ZbCOJF8Y2knhhbCOJ53bhwgUAtra2+I9mm+cmif9pbPOikMRV//ls87+Rbf472eaB9vf3eSBJPD+SeG6SeG6SeCBJPDdJPJAkHkgSz00SDySJB5LEc5PEc5PEv+S+++67lauuuuqqq676/4XKVVddddVVV/0/dOrUKf41bCOJfy3bSOKFsY0k/rvY5r+abZ4fSfxPZ5t/DUlcBbb5v8Y2/91s86KQxPMjiedHEs9NEg8kiecmiQeSxANJ4oEk8UCSeG6SeCBJPDdJvCCSuN/m5ib33XffrVx11VVXXXXV/y8EV1111VVXXfX/zN///d//NsCpU6cAsM2/hW3+s9jmX2Kbf4ltXhQXL14EYHt7G9vY5r+DbWxjG9vY5n8729jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbPMfzTa2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9v8b2Yb29jGNraxzX8129jGNraxzQuyvb0NwMHBAZJ4fiTx/EjigSQhiQeSxANJQhIPJIkHksQDSeKBJPFAkpDEA0niuUniuUlCEpK46qqrrrrqqqugctVVV1111VX/T506dYrz58/z/NhGEv8ZbCOJ/+ls80CS+O9gmxdEEv+f2eaq/zi2+Z/ENv9eknh+JPHcJPHcJPHcJPFAknhuknggSTyQJB5IEg8kiQeSxHOTxHOTxAty5swZAO67776nc9VVV1111VX/vxBcddVVV1111f8zZ8+efQb/Brb5l9jm38I2/xLb/Ets8y+xzXOzzcWLFwHY3t7m+bGNbWxjG9v8d7ONbWxjG9vYxjZXXfX82MY2trGNbWxjm/9OtrGNbWxjm3+r7e1tAA4ODnh+JPHcJPHcJPHcJPFAknggSUjifpKQxANJ4oEk8UCSeCBJPJAkJPFAkpDE8yMJSWxtbQFw9uzZZ3DVVVddddVV/78QXHXVVVddddX/M/fdd9+tAI961KP4r2Cb/062eVFcuHABgK2tLV5UtrGNbWxjm/8pbGMb29jGNraxjW2u+r/JNraxjW1sYxvb2OZ/CtvYxja2+Y+0tbUFwP7+Pg8kCUk8N0k8N0k8N0k8kCQeSBIPJInnJon7SUIS95OEJB5IEg8kiecmiecmCUlI4rmdPXv2Vq666qqrrrrq/xeCq6666qqrrvp/5uzZs7f+wz/8w2+/6qu+Kvezzb+Fbf4tbPMvsc2/xDb/09jGNraxjW3+J7KNbWxjG9vYxja2sc1V/7PYxja2sY1tbGMb29jmfyLb2MY2trHNfzVJPD+SeG6SeG6SeCBJPJAkHkgSDyQJSdxPEg8kiQeShCTuJwlJPJAkJPFAkpDE8/PgBz+Y++6779b77rvvVq666qqrrrrq/xeCq6666qqrrvp/5r777rv17//+73/71KlTvPd7vzcviG3+LWzzn8U2/xLb/Ets81/JNraxjW1s87+BbWxjG9vYxja2sY1tbHPVv51tbGMb29jGNraxjW1sY5v/6WxjG9vYxja2+a9km62tLQAODg4AkMTzI4nnJonnJokHksQDSeKBJPFAknggSTyQJB5IEg8kiQeShCQeSBKSeG6SkMRrv/Zrc+bMGX7rt37ru++7775bueqqq6666qr/Xwiuuuqqq6666v+h3/7t3/6e3/qt3/ruV33VV+Ut3uIteFHZ5t/CNv8S2/x3unDhAgDb29v8V7CNbWxjG9vY5n8j29jGNraxjW1sYxvb2MY2trGNbWxjm//tbGMb29jGNraxjW1sYxvb2MY2trHN/1a2sY1tbGOb/w62sY1tbPPcJPHcJCGJ5yaJB5KEJB5IEg8kiQeSxANJ4oEk8UCSeCBJPJAkHkgSDyQJSTw3SUgC4LGPfSxnzpzhH/7hH377R3/0Rz+Hq6666qqrrvr/h+Cqq6666qqr/h+67777bv3RH/3Rz7nvvvtufYu3eAte9VVfFdv8W9jmP4tt/iW2+ZfY5l9y8eJFALa2tvjvZBvb2MY2trHN/2W2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxjb/l9nGNraxjW1s89/BNraxjW1s8/xsb28DcHBwwHOTxHOThCQeSBLPTRIPJIkHksQDSeKBJPFAkrifJCRxP0lI4n6SkMQDSeK5SUIS9ztz5gyPfexjue+++279zM/8zNfhqquuuuqqq/5/Irjqqquuuuqq/6fuu+++Wz/rsz7rdQDe4i3egkc+8pE8N9v8W9jmX2Kb/062eUFsYxvb2MY2/91sYxvb2MY2trnqqn8v29jGNraxjW1s89/JNraxjW3+vSTx3CTx3CTx3CTxQJJ4IEk8kCQeSBL3k4Qk7ieJB5LEA0nigSQhiQeShCQe6MyZM7zWa70WAF//9V//Plx11VVXXXXV/18EV1111VVXXfX/2H333XfrZ37mZ77OqVOneJ/3eR9OnTrFv8Q2/1ls8y+xzb/ENv9aFy5cAGB7e5vnxza2sY1tbPM/gW1sYxvb2MY2trHNVVcB2MY2trGNbWxjm/8JbGMb29jGNv9W29vbABwcHHA/STw3STw3STw3STyQJB5IEg8kiQeSxP0k8UCSeCBJPJAkHkgSDyQJSTyQJCTxCq/wCgB85md+5uv8wz/8w29z1VVXXXXVVf9/EVx11VVXXXXV/3P/8A//8Ns/8iM/8tmnTp3i4z7u4/jPYpv/LLb5l9jmP5ptbGMb2/xPZBvb2MY2trGNbWxz1f9+trGNbWxjG9vYxja2+Z/ENraxjW1s859JEs9NEs9NEg8kCUk8kCQeSBIPJIn7SUIS95PEA0nifpKQxP0kIYn7SUIS95OEJB5IEpIAeM3XfE02Njb40R/90c/5h3/4h9/mqquuuuqqq/5/I7jqqquuuuqqq/jRH/3Rz/mRH/mRzz516hTv/d7vzb+Wbf4tbPMvsc1/hYsXLwKwtbXFv5VtbGMb29jGNv+T2cY2trGNbWxjG9vYxjZX/fewjW1sYxvb2MY2trHN/2S2sY1tbGOb/2xbW1sAHBwcIInnJonnJokHksRzk8QDSeKBJHE/STyQJB5IEveTxANJ4oEk8UCSeG6SuN/Lv/zLc+bMGf7hH/7ht3/kR37ks7nqqquuuuqqqwiuuuqqq6666qrLfvu3f/t7/uEf/uG3X+VVXoU3f/M35362+bewzX8W2/xLbPMvsc1/BdvYxja2sc3/NraxjW1sYxvb2MY2trGNbWxz1fNnG9vYxja2sY1tbGMb29jGNv+b2MY2trGNbf6nkcRzk8QDSeKBJCGJ+0lCEg8kiftJ4oEkcT9JSOJ+knggSdxPEpK4nyQk8UCSkMT9zpw5w4Me9CD+4R/+4bc/8zM/83W46qqrrrrqqqsACK666qqrrrrqqsvuu+++W7/+67/+fe67775bX/VVX5VHPvKRvCC2+bewzb/ENv8dLly4AMD29jb/FWxjG9vYxja2+b/CNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1t/jvYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbf4vsI1tbGMb29jmv4ttbGMb22xvbwNwcHDA/SQhiQeShCQeSBIPJIkHksQDSUIS95PEA0nifpJ4IEk8kCTuJ4kHksQDSUISD3TmzBle8zVfk/vuu+/Wr//6r38frrrqqquuuuqq+xFcddVVV1111VXPct999936WZ/1Wa9z6tQp3vu935tTp07xorLNfxbb/Ets8y+xzf90trGNbWxjG9v8f2cb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNrb5/842trGNbWxjm/9OtrGNbWxjm3+JJJ6bJJ6bJB5IEg8kiQeSxANJ4oEkcT9JPJAk7icJSdxPEg8kiQeSxANJYnNzk9d8zdcE4Ou//uvf57777ruVq6666qqrrrrqfgRXXXXVVVddddVzuO+++279+q//+vc5deoUH/dxHweAbf4tbPMvsc1/Ftv8S2wDcPHiRQC2t7exjW1sY5v/CWxjG9vYxja2sc1VV/1b2cY2trGNbWxjm/8JbGMb29jmRbG9vQ3AwcEBknhuknhuknggSTyQJB5IEg8kiQeSxP0k8UCSuJ8kHkgS95OEJO4nCUncTxKSAHi5l3s5AL7+67/+ff7hH/7ht7nqqquuuuqqqx6I4Kqrrrrqqquueh6/9Vu/9d0/8iM/8tmnTp3ivd/7vXl+bPOfxTb/Etv8V7GNbWxjm/9pbGMb29jGNraxjW2u+v/NNraxjW1sYxvb/E9iG9vYxja2+feQxHOTxHOTxANJ4oEk8UCSeCBJPJAk7ieJB5LE/SRxP0lI4n6SeCBJPJAk7vcar/EanDlzhn/4h3/47d/6rd/6bq666qqrrrrqqudGcNVVV1111VVXPV+//du//T3/8A//8Nuv8iqvwpu/+ZvzH8U2/1ls8y+xzQty4cIFALa3t3lhbGMb29jGNv+T2cY2trGNbWxjG9tc9b+XbWxjG9vYxja2sY1t/ieyjW1sYxvb/EfY3t4G4ODggOcmiecmiQeSxANJ4oEk8UCSuJ8kJHE/SdxPEpK4nyTuJ4kHksT9JCGJ+0lCEvd7zGMew5kzZ/iHf/iH3/7Mz/zM1+Gqq6666qqrrnp+CK666qqrrrrqqufrvvvuu/Xrv/7r3+e+++679VVf9VV55CMfyb/ENv8WtvmX2OY/28WLFwHY3t7mX8s2trGNbWxjm/8NbGMb29jGNraxjW1sY5ur/uvYxja2sY1tbGMb29jGNv8b2MY2trGNbf6zbG9vA3BwcMADSeKBJCGJB5LEA0nigSTxQJK4nyQeSBL3k8QDSeJ+knggSdxPEg8kiQc6c+YMj3nMY7jvvvtu/czP/MzX4aqrrrrqqquuekEIrrrqqquuuuqqF+i+++679bM+67Ne59SpU7zXe70Xp06d4l/LNv9ZbPMvsc2/xDb/WWxjG9vYxjb/W9nGNraxjW1sYxvb2MY2trGNbWzz/51tbGMb29jGNraxjW1sYxvb2OZ/I9vYxja2sY1t/jtJQhIPJInnJokHksQDSeKBJHE/STyQJO4niQeSxP0kcT9JSOJ+krifJCRxP0lsbm7yGq/xGgB8/dd//ftw1VVXXXXVVVe9MARXXXXVVVddddULdd9999369V//9e9z6tQpPvZjP5YHss2/hW3+Jbb5z2Kb/062sY1tbGMb2/xfZRvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trHNA9nGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sY5v/a2xjG9vYxja2+e9kG9tsbW0BcHBwgCSemySemyQeSBIPJIkHksT9JPFAkrifJO4nCUncTxL3k8QDSeJ+knggSQC83Mu9HACf+Zmf+Tr/8A//8NtcddVVV1111VUvDMFVV1111VVXXfUv+q3f+q3v/pEf+ZHPPnXqFO/1Xu/FC2Ob/yy2+ZfY5t/qwoULAGxvb/PfwTa2sY1tbGObq/5tbGMb21z1r2cb29jGNraxzf8EtrGNbWzzopDEc5PEA0nigSTxQJK4nyQeSBL3k8T9JPFAkrifJO4nCUncTxL3k4QkAF7jNV6D06dP8yM/8iOf/Q//8A+/zVVXXXXVVVdd9S8huOqqq6666qqrXiS//du//T3/8A//8Nuv8iqvwpu/+Zvzr2Gbf4lt/i1s8y+xzb/ENhcvXgRga2sL2/xPYRvb2MY2trGNba666t/DNraxjW1sYxvb/E9hG9vYxja2eUG2t7cBODg44IEk8UCSkMQDSeKBJPFAkrifJB5IEveTxP0k8UCSuJ8k7ieJ+0lCEveTxP0e/ehHc/r0af7hH/7ht3/0R3/0c7jqqquuuuqqq14UBFddddVVV1111Yvkvvvuu/Xrv/7r3+e+++679c3f/M15lVd5FQBs85/FNv+dbGMb29jGNv/T2MY2trGNbWxjG9tcdZVtbGMb29jGNrb5n8g2trGNbf69JPFAknhuknggSTyQJO4niQeSxP0kcT9J3E8SkrifJO4niftJ4oEkcb8zZ87wmMc8hvvuu+/Wz/zMz3wdrrrqqquuuuqqFxXBVVddddVVV131Irvvvvtu/azP+qzXAXjzN39zTp06xfNjm3+Jbf4tbPMvsc2/xDbP7cKFCwBsb2/zgtjGNraxjW3+J7ONbWxjG9vYxja2sc1V/3vZxja2sY1tbGMb29jmfzLb2MY2trHNv8f29jYAh4eHSEISDySJB5KEJB5IEg8kiftJ4oEkcT9J3E8S95PEA0nifpK4nyTuJwlJ3G9zc5NXf/VXB+Drv/7r34errrrqqquuuupfg+Cqq6666qqrrvpXue+++279+q//+vc5deoUH/uxH8t/JNv8b2Qb29jGNrb538Q2trGNbWxjG9vYxja2ueq/jm1sYxvb2MY2trGNbWzzv4VtbGMb29jGNv+VJPFAknhukrifJCRxP0ncTxKSuJ8k7ieJ+0nifpKQxP0kcT9J3E8SDySJl33ZlwXgMz/zM1/nH/7hH36bq6666qqrrrrqX4Pgqquuuuqqq676V/ut3/qt7/6RH/mRzz516hQf+7Efy4vCNv8WtvmX2OZfYpt/yYULFwDY3t7m38s2trGNbWzzv51tbGMb29jGNraxjW1sYxvb2MY2/5/Zxja2sY1tbGMb29jGNraxjW1s87+ZbWxjG9vY5r/K9vY2AAcHBzyQJB5IEs9NEveTxANJ4n6SeCBJ3E8S95PE/SRxP0lI4n6SuJ8k7icJSbz6q786p0+f5kd+5Ec++x/+4R9+m6uuuuqqq6666l+L4Kqrrrrqqquu+jf50R/90c/5rd/6re9+5CMfyZu92Zvxb2Gb/yy2+ZfY5r+SbWxjG9vYxjb/19nGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjm//LbGMb29jGNrb5n0YSDySJB5KEJO4niQeSxP0k8UCSuJ8k7ieJ+0nifpJ4IEncTxL3kwTAox/9aE6fPs0//MM//PaP/uiPfg5XXXXVVVddddW/BZWrrrrqqquuuurf7Ed/9Ec/55prrnnwm7/5m782wC/8wi9wP9tI4l/LNpJ4YWwjif9oFy9eBGB7e5v/SrZ5QSRx1VX/nWzzP5VtHmh7exuAw8NDJPHcJPFAknggSTyQJO4niQeSxP0kcT9J3E8S95PE/STxQJK4nyQATp8+zaMf/Wjuu+++Wz/zMz/zdbjqqquuuuqqq/6tCK666qqrrrrqqn+z++6779av//qvfx+AV3mVV+GRj3wkL4xt/rPY5l9im/9tbGMb29jGNraxzVVX/UexjW1sYxvb2MY2/5PYxja2sc0LIonnJokHksQDSeKBJHE/STyQJO4niftJ4n6SuJ8k7ieJ+0lCEveTBMDp06d59Vd/dQC+/uu//n246qqrrrrqqqv+PQiuuuqqq6666qp/l/vuu+/Wz/zMz3ydU6dO8Z7v+Z6cOnWKfw3b/Ets85/FNve7cOECANvb29jGNrb5n8o2trGNbWxjG9tcddUD2cY2trGNbWxjG9v8T2Qb29jGNrb5l2xvbwNwcHDAA0nigSTxQJJ4IEncTxIPJIn7SeJ+krifJO4niftJ4n6SuJ8kJAGwsbHBy77sywLwmZ/5ma/zD//wD7/NVVddddVVV13170Fw1VVXXXXVVVf9u/3DP/zDb//Ij/zIZ586dYqP+ZiP4X62+c9im3+Jbf4j2MY2trGNbf6ns41tbGMb29jGNraxzVX/d9jGNraxjW1sYxvb/E9nG9vYxja2+Y8gCUk8kCQeSBIPJIn7SeKBJHE/SdxPEveTxP0kcT9J3E8S95PE/STxsi/7smxsbPAjP/Ijn/0P//APv81VV1111VVXXfXvRXDVVVddddVVV/2H+NEf/dHP+ZEf+ZHPPnXqFO/5nu/Jv4dt/rPY5oW5cOECANvb27wwtrGNbWxjm/9tbGMb29jGNraxjW1sY5ur/nvYxja2sY1tbGMb29jGNrb538Q2trGNbWzzH2F7exuAg4MDACTx3CTxQJJ4IEncTxIPJIn7SeJ+krifJO4niftJ4n6SuJ8k7ieJV3u1V+P06dP8wz/8w2//6I/+6Odw1VVXXXXVVVf9RyC46qqrrrrqqqv+w/z2b//29/zDP/zDb7/Kq7wKb/Zmb8bzY5t/C9v8S2zz73Xx4kUAtre3+deyjW1sYxvb2OZ/O9vYxja2sY1tbGMb29jGNraxzVXPyTa2sY1tbGMb29jGNraxjW1s87+dbWxjG9vYxjb/Wba3twE4PDxEEs9NEg8kiQeSxP0k8UCSuJ8k7ieJ+0nifpK4nyTuJ4n7SeJ+kjh9+jSnT5/mH/7hH377Mz/zM1+Hq6666qqrrrrqPwrBVVddddVVV131H+a+++679eu//uvf57777rv1VV7lVXjkIx/Ji8I2/1ls8y+xzX8m29jGNraxjW3+L7ONbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trHNfyTb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sY5v/y2xjG9vYxja2+Z9EEg8kiQeSxP0kcT9JSOJ+krifJO4niftJ4n6SuJ8k7ieJ+0ni9OnTvNqrvRr33XffrV//9V//Plx11VVXXXXVVf+RCK666qqrrrrqqv9Q9913362f9Vmf9TqnTp3iPd/zPTl58iT/Frb5l9jmfzPb2MY2trGNba560djGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2uepfZhvb2MY2trHN/xTb29sAHBwccD9JSOKBJHE/SUjifpK4nyQeSBL3k8T9JHE/SdxPEveTxP0kcT9JbGxs8Gqv9moAfP3Xf/373Hfffbdy1VVXXXXVVVf9RyK46qqrrrrqqqv+w9133323fv3Xf/37nDp1io/5mI/hudnm38I2/xLb/Ets84JcuHABgO3tbf672MY2trGNbWxjm6uu+s9kG9vYxja2sY1t/qexjW1sY5vnJokHkoQk7ieJB5LE/STxQJK4nyTuJ4n7SeJ+krifJO4nCQBJSALgZV7mZQD4zM/8zNf5h3/4h9/mqquuuuqqq676j0Zw1VVXXXXVVVf9p/it3/qt7/6RH/mRzz516hTv+Z7vyb/ENv9ZbPMvsQ3AhQsXANje3uZ/ItvYxja2sY1tbHPVVS8K29jGNraxjW1s8z+VbWxjG9vY5rltb29zP0k8kCQeSBIPJIn7SeKBJHE/SdxPEveTxP0kcT9JAEhCEgCSuN+rvdqrcfr0aX7kR37ks//hH/7ht7nqqquuuuqqq/4zEFx11VVXXXXVVf9pfvu3f/t7/uEf/uG3X/mVX5k3e7M341/LNv8S2/xnsY1tbPO/gW1sYxvb2MY2trGNba76v882trGNbWxjG9vY5n8629jGNraxzb/G4eEhDySJB5LEA0nifpJ4IEncTxL3k8T9JHE/SdxPEgCSuJ8k7vfoRz+a06dP8w//8A+//aM/+qOfw1VXXXXVVVdd9Z+F4Kqrrrrqqquu+k9z33333fr1X//173Pffffd+sqv/Mo84hGP4H62+c9im3+JbZ6fixcvArC9vc0D2cY2trGNbWzzv41tbGMb29jGNraxjW2u+p/JNraxjW1sYxvb2MY2tvnfxDa2sY1tbPNvtb29DcDh4SH3k8QDSeKBJHE/STyQJO4niftJ4n6SuJ8k7icJAEncTxL3O336NI961KO47777bv3Mz/zM1+Gqq6666qqrrvrPRHDVVVddddVVV/2nuu+++279rM/6rNc5deoU7/me78mpU6f497DNfxbb/GvZxja2sY1t/rezjW1sYxvb2MY2trGNbWxjG9tc9a9nG9vYxja2sY1tbGMb29jGNv/b2cY2trGNbf4zSeKBJPFAkrifJB5IEveTxP0kcT9J3E8SAJKQBIAk7ieJ+21ubvJqr/ZqAHz913/9+3DVVVddddVVV/1nI7jqqquuuuqqq/7T3Xfffbd+/dd//fucOnWKj/7oj+YFsc2/hW3+JbZ5UVy4cAGA7e1t/q1sYxvb2MY2tvm/zDa2sY1tbGMb29jGNraxjW1sYxvb2MY2tvmfzja2sY1tbGMb29jGNraxjW1sYxvb2MY2trHN/1W2sY1tbGMb2/xn297eBuDw8BBJPJAkHkgS95PE/SQhiftJ4n6SuJ8k7icJAEncTxL3k8T9JPHSL/3SAHzmZ37m6/zDP/zDb3PVVVddddVVV/1nI7jqqquuuuqqq/5L/NZv/dZ3/8iP/Mhnnzp1ivd8z/fkRWWb/yy2+a9kG9vYxja2sc1Vz2Yb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxz1bPZxja2sY1tbPM/jSTuJwlJ3E8S95PEA0nifpK4nyTuJwkASdxPEveTxP0k8aqv+qqcPn2aH/mRH/nsf/iHf/htrrrqqquuuuqq/woEV1111VVXXXXVf5nf/u3f/p5/+Id/+O1XfuVX5s3e7M2wzb+Fbf4ltvm3uHjxIgA7Ozv8V7GNbWxjG9vYxjZXXfXfyTa2sY1tbGMb2/xPs7OzA8Dh4SEAkpDE/STxQJK4nyQeSBL3k8T9JHE/SQBI4n6SuJ8k7ieJRz3qUZw+fZp/+Id/+O0f/dEf/Ryuuuqqq6666qr/KgRXXXXVVVddddV/mfvuu+/Wr//6r3+f++6779Y3e7M345Vf+ZV5brb5z2Kbf4lt/iexjW1sYxvb2MY2V131H8E2trGNbWxjG9v8T2Ub29jGNrZ5IEk8kCQeSBL3k8QDSeJ+krifJO4nCQBJ3E8S95PE/SRx6tQpHvWoR3Hffffd+pmf+Zmvw1VXXXXVVVdd9V+J4Kqrrrrqqquu+i9133333fpZn/VZrwPwZm/2ZjziEY/gX2Kbf4lt/iNcuHABgO3tbf6ns41tbGMb29jGNra56ioA29jGNraxjW1sY5v/6WxjG9vYxjbPz/b2NgBHR0c8kCQeSBL3k8QDSeJ+krifJO4nCQBJ3E8S95PE/SSxsbHBq73aqwHw9V//9e/DVVddddVVV131X43gqquuuuqqq676L3fffffd+vVf//Xvc+rUKd7jPd6DU6dO8a9lm3+Jbf4ltnlBbGMb29jmfxvb2MY2trGNbWxjG9tc9b+bbWxjG9vYxja2sY1t/jexjW1sYxvb/HtI4oEkcT9J3E8SkrifJO4niftJAkAS95PE/SRxP0kAvOqrvioAn/mZn/k6//AP//DbXHXVVVddddVV/9UIrrrqqquuuuqq/xa/9Vu/9d0/8iM/8tmnTp3iPd7jPXgg2/xnsc2/5MKFCwDs7OzwQLaxjW1sY5v/7WxjG9vYxja2sY1tbGMb21z1X8M2trGNbWxjG9vYxja2sc3/ZraxjW1sY5t/q+3tbQAODw+5nyTuJwlJ3E8S95PEA0nifpK4nyQAJHE/SdxPEgCSkATAq73aq7GxscGP/uiPfs4//MM//DZXXXXVVVddddV/B8rx48e56qqrrrrqqqv+e/zDP/zD7wC85mu+5msDPPnJT+Z+knhuknggSTw3STyQJJ6bJB5IEg/04i/+4pw8eZKnP/3p7O/v828hiaueTRL/n9jmqits85/tzJkzPPrRj2YcR570pCchiftJ4oEkcT9JPJAk7ieJ+0kCQBL3k8T9JAEgifu9zMu8DNdddx3/8A//8Ntf//Vf/z5cddVVV1111VX/XahcddVVV1111VX/rX77t3/7e178xV/8td/szd7stQF+8Rd/kf9ItpHEC2MbSfxHss3zI4n/j2xz1f9ttvnvdnh4yANJ4oEkcT9J3E8SDyQJAEncTxL3k8T9JAEgifudPn2am2++mX/4h3/47c/8zM98Ha666qqrrrrqqv9OBFddddVVV1111X+r++6779av//qvf5/77rvv1ld+5VfmkY98JC8q2/xvYxvb2MY2trHNVVf9b2Eb29jGNraxzX+n7e1tAA4PD7mfJB5IEveTxP0k8UCSAJDE/SRxP0ncTxIAkrjf6dOnedVXfVUAvv7rv/59uOqqq6666qqr/rsRXHXVVVddddVV/+3uu+++Wz/rsz7rdU6dOsV7vMd7cOrUKWzzb2Gbf4ltXpiLFy8CsL29zX8V29jGNraxjW1sc9VV/9VsYxvb2MY2trHN/waSeCBJ3E8S95PE/SQhCQBJ3E8S95PE/SQBIIn7bW5u8qqv+qoAfOZnfubr3Hfffbdy1VVXXXXVVVf9dyO46qqrrrrqqqv+R7jvvvtu/fqv//r3OXnyJB/1UR/F82Ob/yy2ud+FCxcA2N7e5n8C29jGNraxjW1sY5urrvrXso1tbGMb29jGNrb5n842trGNbba3t7mfJO4nCUncTxL3k8T9JHE/SdxPEveTxP0kASCJ+0nipV/6pQH4+q//+vf5h3/4h9/mqquuuuqqq676n4Dgqquuuuqqq676H+O3fuu3vvtHfuRHPvvUqVO8x3u8By8K2/xLbPN/mW1sYxvb2MY2trGNba76/8U2trGNbWxjG9vY5n8T29jGNraxzQtyeHjI/STxQJK4nyTuJ4n7SeJ+krifJO4nCQBJ3E8Sr/qqr8qpU6f4h3/4h9/+rd/6re/mqquuuuqqq676n4Lgqquuuuqqq676H+W3fuu3vvsf/uEffvuVX/mVeZM3eRP+LWzzL7HNC3LhwgUAdnZ2sI1tbPO/mW1sYxvb2MY2trGNba76n882trGNbWxjG9vYxja2+d/KNraxjW1s86LY3t4G4OjoCABJPJAk7ieJ+0nifpK4nyTuJ4n7SQJAEveTxCMf+UhOnTrFP/zDP/z2Z37mZ74OV1111VVXXXXV/yQEV1111VVXXXXV/yhnz559xtd//de/z3333XfrK7/yK/OIRzyCB7LNfxbbvDC2sY1tbGMb2/xfYRvb2MY2trGNbWxjG9vYxja2uerfxza2sY1tbGMb29jGNraxjW3+r7CNbWxjG9vY5j+CJO4nCUncTxL3k8T9JHE/SdxPEveTBIAk7ieJU6dO8ahHPYr77rvv1s/8zM98Ha666qqrrrrqqv9pCK666qqrrrrqqv9x7rvvvls/67M+63VOnTrFu7/7u3Py5EleGNv8S2zzorpw4QIA29vbvChsYxvb2MY2/1/Yxja2sY1tbGMb29jGNraxjW1sYxvb2MY2/5vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2tvn/wDa2sY1tbPMfbWdnB4DDw0PuJ4kHksT9JHE/SdxPEveTxP0kASCJ+0liY2ODV33VVwXg67/+69+Hq6666qqrrrrqfyKCq6666qqrrrrqf6T77rvv1q//+q9/n1OnTvHRH/3R/GewzX8W29jGNraxjW2uev5sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb21z1/NnGNraxjW1s899BEg8kiftJ4n6SuJ8k7ieJ+0kCQBL3kwTAS7/0SwPwmZ/5ma/zD//wD7/NVVddddVVV131PxHBVVddddVVV131P9Zv/dZvffeP/MiPfPbJkyd593d/d+5nm3+Jbf6tLl68CMDOzg7/0WxjG9vYxja2sc1VV/1PZxvb2MY2trGNbf47bW9vA3B0dIQk7icJSdxPEveTxP0kcT9J3E8SAJK4nyQAXvVVX5VTp07xIz/yI5/9D//wD7/NVVddddVVV131PxXBVVddddVVV131P9pv//Zvf8/f//3f//Yrv/Ir86Zv+qb8e9jmX2Kb/y62sY1tbGMb29jmqqv+q9jGNraxjW1sY5v/6SRxP0k8kCTuJ4n7SeJ+krifJAAkcT9JADzykY/k1KlT/MM//MNv/+iP/ujncNVVV1111VVX/U9GcNVVV1111VVX/Y9233333fr1X//1733ffffd+kqv9Eq88iu/Ms+Pbf4tbPPcLly4AMD29jb/U9jGNraxjW1sYxvbXHXVi8o2trGNbWxjG9vY5n8b2+zs7ABweHgIgCQeSBL3k8T9JHE/SdxPEgCSuJ8kAE6dOsWjHvUo7rvvvls/8zM/83W46qqrrrrqqqv+pyO46qqrrrrqqqv+xzt79uwzPuuzPut1Tp06xZu8yZtw8uRJXhS2+f/CNraxjW1sYxvb2MY2V/3fZxvb2MY2trGNbWxjm//NbGMb29jGNs9NEveThCTuJ4n7SeJ+krifJAAkcT9JAGxsbPCqr/qqAHz913/9+3DVVVddddVVV/1vQHDVVVddddVVV/2vcN9999369V//9e9z6tQpPuqjPgrb/FvY5l9imwsXLgCwvb3N/xW2sY1tbGMb29jGNraxzVX/89jGNraxjW1sYxvb2MY2/5fYxja2sY1tnp+dnR0ADg8PkcT9JPFAkrifJO4niftJAkAS95PE/V76pV8agM/8zM98nX/4h3/4ba666qqrrrrqqv8NCK666qqrrrrqqv81fuu3fuu7f+RHfuSzT506xUd91Efx3GzzH+XChQsAbG9vYxvb2MY2/9fZxja2sY1tbGMb29jGNraxjW1sc9W/zDa2sY1tbGMb29jGNraxjW1sY5v/62xjG9vYxjYvqu3tbZ6bJO4nCUncTxL3kwSAJCQBIIn7SeJ+r/qqr8qpU6f4kR/5kc/+h3/4h9/mqquuuuqqq67634Lgqquuuuqqq676X+VHf/RHP+e3fuu3vvsRj3gEb/Imb8K/xDb/Etv8a9jGNraxjW1s8/+dbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2tvmvZBvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW3+v7ONbWxjG9vY5j/C0dERAJK4nyTuJwlJ3E8SAJK4nyTuJ4n7PepRj+LUqVP8wz/8w2//6I/+6Odw1VVXXXXVVVf9b0Llqquuuuqqq676X+dHf/RHP+fMmTMPftM3fdPXBvilX/ol/iewzfMjiav+fWxz1f8etvmvsrOzA8DR0RGSuJ8k7ieJ+0nifpK4nyTuJ4n7nT59mkc+8pHcd999t37mZ37m63DVVVddddVVV/1vQ3DVVVddddVVV/2vc99999369V//9e8N8Mqv/Mo84hGP4H62+ZfY5l9y4cIFAHZ2dvj3so1tbGMb29jmqqv+t7ONbWxjG9vY5r+bJO4niftJ4n6SuJ8k7ieJ+50+fZpXeZVXAeDrv/7r34errrrqqquuuup/I4Krrrrqqquuuup/pbNnzz7jMz/zM1/n5MmTvPu7vzsnT57k38M2D3ThwgUAtre3+c9iG9vYxja2sY1trrrqfwrb2MY2trGNbWzzP8H29jb3k4Qk7ieJ+0nifpK4nyTuJwkASWxsbPBSL/VSAHzmZ37m6/zDP/zDb3PVVVddddVVV/1vRHDVVVddddVVV/2v9Q//8A+//SM/8iOfffLkST7qoz6KF8Q2/9vYxja2sY1tbGMb21x11X8U29jGNraxjW1sY5v/LY6OjnggSdxPEveTxP0kcT9JAEgC4KVf+qXZ2NjgR37kRz77H/7hH36bq6666qqrrrrqfyuCq6666qqrrrrqf7Uf/dEf/Zwf+ZEf+eyTJ0/y7u/+7ryobPPCXLx4EYCdnR3+J7KNbWxjG9vYxja2ueoqANvYxja2sY1tbGMb2/xvZBvb2GZnZweAo6MjACQhiftJ4n6SuJ8k7icJAEkAvNRLvRSnTp3iH/7hH377R3/0Rz+Hq6666qqrrrrqfzOCq6666qqrrrrqf73f/u3f/p5/+Id/+O1XeqVX4k3e5E2wzb+Fbf6vsI1tbGMb29jGNraxjW2u+t/LNraxjW1sYxvb2MY2/9vZxja2sY1tbPOCSOKBJHE/SdxPEgCSkASAJABOnTrFzTffzD/8wz/89md+5me+DlddddVVV1111f92BFddddVVV1111f969913361f//Vf/z733Xffra/8yq/MIx7xCJ6bbf41Lly4AMD29ja2sc3/RbaxjW1sYxvb2MY2trGNbWxz1X8e29jGNraxjW1sYxvb2MY2tvm/xja2sY1tbPOi2N7eBuDo6Ij7SUIS95PE/SQBIIn7SQLg1KlTvMqrvAr33XffrV//9V//Plx11VVXXXXVVf8XEFx11VVXXXXVVf8n3Hfffbd+5md+5mufPHmSd3/3d+fkyZP8S2zzr2Eb29jGNraxzf8ntrGNbWxjG9vYxja2sY1tbGMb29jGNrb5v8g2trGNbWxjG9vYxja2sY1tbGMb29jGNv9f2MY2trGNbWzzH0US95OEJAAkIQkASdxPEgCLxYJXeZVXAeDrv/7r3+e+++67lauuuuqqq6666v8Cgquuuuqqq6666v+Ms2fPPuPrv/7r3+fkyZN85Ed+JP8WtgG4cOECADs7O/xLbGMb29jGNra56vmzjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvbXPW8bGMb29jGNrb5j7azswPA0dERkrifJO4niftJ4n6SuN9Lv/RLA/CZn/mZr/MP//APv81VV1111VVXXfV/BcFVV1111VVXXfV/ym/91m9994/8yI989smTJ3m3d3s3Hsg2/5VsYxvb2MY2trHNVVf9X2Eb29jGNraxzX81SdxPEveTxP0kcT9J3O9VXuVVOHXqFP/wD//w2//wD//w21x11VVXXXXVVf+XEFx11VVXXXXVVf/n/PZv//b3/MM//MNvv9IrvRJv8iZvwgtjm+fnwoULAOzs7PCfwTa2sY1tbGMb21x11f80trGNbWxjG9vY5r/bzs4OAEdHRwBI4n6SuJ8k7ieJ+z3ykY/k1KlT/MM//MNvf+ZnfubrcNVVV1111VVX/V9DcNVVV1111VVX/Z9z33333fr1X//173Pffffd+kqv9Eo8/OEP538T29jGNraxjW1sc9VV/xlsYxvb2MY2trGNbf43kIQk7ieJ+0nifpIAkMTp06d55CMfyX333XfrZ37mZ74OV1111VVXXXXV/0UEV1111VVXXXXV/0n33XffrZ/1WZ/1OidPnuTd3/3dOXnyJAC2+ZfYBuDChQsA7Ozs8D+FbWxjG9vYxja2sY1trrrqudnGNraxjW1sYxvb/G+1vb0NwNHREfeThCQAJCGJ+0kCQBKLxYJXfuVXBuDrv/7r34errrrqqquuuur/KoKrrrrqqquuuur/rPvuu+/Wr//6r3+fkydP8pEf+ZG8ILZ5fi5cuADA9vY2/5vYxja2sY1tbGMb29jGNlf972cb29jGNraxjW1sYxvb/F9gG9vYxja2eW6SuJ8k7icJSQBIAuClXuqlAPjMz/zM1/mHf/iH3+aqq6666qqrrvq/iuCqq6666qqrrvo/7bd+67e++0d+5Ec+++TJk7zbu70bVz2bbWxjG9vYxja2sY1tbGMb21z1n882trGNbWxjG9vYxja2sY1t/i+yjW1sYxvb2Ob52dnZAeDo6AhJ3E8S95PE/SQB8Mqv/MqcOnWKH/mRH/nsf/iHf/htrrrqqquuuuqq/8sIrrrqqquuuuqq//N++7d/+3v+4R/+4bdf6ZVeiTd5kzfBNv8S2zyQbWxjG9v8f2Qb29jGNraxjW1sYxvb2MY2trGNbWzzf51tbGMb29jGNraxjW1sYxvb2MY2trGNbf4/sY1tbGMb29jmX2NnZweA5XLJ/SRxP0ncTxIAj3jEIzh16hT/8A//8Ns/+qM/+jlcddVVV1111VX/1xFcddVVV1111VX/59133323fv3Xf/373Hfffbe+yZu8Ca/0Sq/Ei+LChQsA7Ozs8NxsYxvb2MY2trHNVc+fbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sc1Vz59tbGMb29jGNv/RJCGJ+0nifpIAOHXqFI985CO57777bv3Mz/zM1+Gqq6666qqrrvr/gOCqq6666qqrrvp/4b777rv1sz7rs14H4E3e5E14+MMfzgPZ5rlduHABgO3tbf41bGMb29jGNra56qr/y2xjG9vYxja2+a8mCUkASEISABsbG7zyK78yAF//9V//Plx11VVXXXXVVf9fEFx11VVXXXXVVf9v3Hfffbd+/dd//fucPHmSd3u3d+O/mm1sYxvb2MY2trnqqv8NbGMb29jGNraxzX+H7e1tAI6OjgCQxP0kcT9JvORLviQAn/mZn/k6//AP//DbXHXVVVddddVV/18QXHXVVVddddVV/6/81m/91nf/yI/8yGefPHmSj/iIj+CFuXDhAgA7Ozv8Z7ONbWxjG9vYxja2ueqq/yq2sY1tbGMb29jmf5qdnR0AlsslkrifJO4niVd6pVfi1KlT/OiP/ujn/MM//MNvc9VVV1111VVX/X9CcNVVV1111VVX/b/zoz/6o5/zW7/1W9/98Ic/nDd+4zfmfrb5n8o2trGNbWxjG9vY5qqrXhS2sY1tbGMb29jGNrb530wSkrifJB7xiEdw6tQp/uEf/uG3f+RHfuSzueqqq6666qqr/r+hctVVV1111VVX/b/0oz/6o59zzTXXPPhN3uRNXhvgl3/5l3luFy5cAGBnZ4f/6WzzopDEVf832eb/C9sA7OzsALBcLpHE/SQBcPLkSR7xiEdw33333fqZn/mZr8NVV1111VVXXfX/EcFVV1111VVXXfX/0n333Xfr13/917/Pfffdd+srvdIr8YhHPIL/D2xjG9vYxja2sY1tbGMb21z138s2trGNbWxjG9vYxja2sY1t/i+yjW1sYxvb2Oa5SeJ+kgA4efIkr/zKrwzAZ33WZ70OV1111VVXXXXV/1cEV1111VVXXXXV/1v33XffrV//9V//PidPnuRd3/VdOXnyJLa534ULFwDY2dnBNv/f2MY2trGNbWxjG9vYxja2sY1tbGMb21wFtrGNbWxjG9vYxja2sY1tbGMb29jm/xvb2MY2trHNv2RnZweA5XKJJCQBsFgseKmXeikAPvMzP/N17rvvvlu56qqrrrrqqqv+vyK46qqrrrrqqqv+X/uHf/iH3/76r//69zl58iQf8REfwQtjG9vYxja2sc1Vz59tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNba56XraxjW1sYxvb/EeRxEu91EuxWCz4+q//+vf5h3/4h9/mqquuuuqqq676/4zgqquuuuqqq676f++3fuu3vvtHfuRHPvvkyZO827u9G/e7cOECADs7O7wwtrGNbWxjG9vY5qqr/j+yjW1sYxvb2MY2/5F2dnYAWC6XAEjilV7plTh58iT/8A//8Nu/9Vu/9d1cddVVV1111VX/3xFcddVVV1111VVXAb/1W7/13f/wD//w26/4iq/IG73RG/EfxTa2sY1tbGObq6763842trGNbWxjG9v8V5OEJG688UZOnjzJP/zDP/z2Z37mZ74OV1111VVXXXXVVUBw1VVXXXXVVVddBZw9e/YZX//1X/8+9913362v9EqvxMMf/nAALly4AMDOzg7/kWxjG9vYxja2sY1trrrqfwLb2MY2trGNbWzz321nZweA5XIJwMmTJ3nJl3xJ7rvvvls/8zM/83W46qqrrrrqqquuuoLgqquuuuqqq6666pnuu+++Wz/rsz7rdU6ePMm7vuu7cvLkSS5cuADAzs4O/5VsYxvb2MY2trGNba666j+CbWxjG9vYxja2sc3/FovFgld6pVcC4Ou//uvfh6uuuuqqq6666qpnI7jqqquuuuqqq656gPvuu+/Wr//6r3+fkydP8uEf/uH8T2Ub29jGNraxjW1sY5ur/n+zjW1sYxvb2MY2trHN/2Y7OzsALJdLXvIlXxKAz/zMz3ydf/iHf/htrrrqqquuuuqqq56NylVXXXXVVVddddVz+a3f+q3vPnPmzIPe6Z3e6bNPnjzJ/1a2eVFJ4qr/+Wzz/5lt7re9vQ3AyZMnAfiRH/mRz/6Hf/iH3+aqq6666qqrrrrqOVG56qqrrrrqqquuej5++7d/+3te7MVe7LVf/MVf/LUBHvvYx7Kzs8NVz0kSV/3r2eaqF8w2/5Kbb76Z+/3DP/zDb//oj/7o53DVVVddddVVV131vNCDHvQgrrrqqquuuuqqq56fM2fOPOhzP/dzfxvgmmuueTBXXXXV/yj33XffrQAf8iEf8hCuuuqqq6666qqrnj/0oAc9iKuuuuqqq6666qoX5nVe53Xe+8Ve7MVei6uuuup/lN/6rd/6nrNnz95633333cpVV1111VVXXXXV84ce9KAHcdVVV1111VVXXXXVVVddddVVV1111VVX/Z9E5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+r+EcBlIqNer4rngAAAABJRU5ErkJggg==) + +```js +// Create a square circumscribed around a circle of radius 5 +square = startSketchOn('XY') + |> polygon({ + radius = 5.0, + numSides = 4, + center = [10, 10], + inscribed = false + }, %) +example = extrude(5, square) +``` + +![Rendered example of polygon 1](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAADMPklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8VwVVXXXXVVVddddVV/29cc801D+aqq6666qqrrrrqqv9PqFx11VVXXXXVVVdd9X/aNddc8+DXfu3Xfq/XeZ3XeW8e4Ld+67e++x/+4R9+5x/+4R9+m6uuuuqqq6666qqr/q9CD3rQg7jqqquuuuqqq6666v+Oa6655sFnzpx58Iu92Iu91ju90zt9Nv+C++6779Z/+Id/+O1/+Id/+J3f+q3f+m6uuuqqq6666qqrrvq/BD3oQQ/iqquuuuqqq6666qr/3a655poHv/Zrv/Z7vfiLv/hrv9iLvdhr8wAXLlzgz/7sz3jKU57CA73iK74iJ06c4OEPfzj3u++++249e/bsrb/1W7/1Pffdd9+t//AP//DbXHXVVVddddVVV131vxl60IMexFVXXXXVVVddddVV//tcc801D37t137t93qd13md977mmmsezANcuHCBP/uzP+PP/uzPuHDhAi/MyZMneYVXeAUe9rCH8fCHP5wHuu+++279rd/6re/+h3/4h9/5h3/4h9/mqquuuuqqq6666qr/bdCDHvQgrrrqqquuuuqqq676n++aa6558JkzZx78Yi/2Yq/1Tu/0Tp/NA1y4cIGnPvWpXLhwgV/5lV/h3+rkyZM87GEP4+EPfziv8AqvwAPdd999t/7DP/zDb//DP/zD7/zWb/3Wd3PVVVddddVVV1111f8G6EEPehBXXXXVVVddddVV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5poHv/Zrv/Z7vfiLv/hrv9iLvdhr8wAXL17kz/7sz3ja057GU5/6VK76j2Gb/4lOnDjByZMnedjDHsbDHvYwHvawh3G/++6779azZ8/e+vd///e//Q//8A+/8w//8A+/zVVXXXXVVVddddX/LehBD3oQV1111VVXXXXVVf8XXHPNNQ9+7dd+7fd6ndd5nfe+5pprHswDXLx4kT/7sz/jz//8z7l48SJX/e9gm/9oJ06c4GEPexiv8AqvwMMe9jAe6L777rv1H/7hH377t37rt77nH/7hH36bq6666qqrrrrqqv/90IMe9CCuuuqqq6666qqr/je65pprHvzar/3a7wXwTu/0Tp/NA1y8eJE/+7M/A+DXfu3XuOr/N9s8PydOnOBhD3sYD3vYw3iFV3gFHui+++679R/+4R9++x/+4R9+57d+67e+m6uuuuqqq6666qr/ndCDHvQgrrrqqquuuuqqq/63uOaaax782q/92u/14i/+4q/9Yi/2Yq/NA1y8eJE/+7M/42lPexpPfepTueqqf40TJ04A8PIv//I87GEP42EPexj3u++++249e/bsrX//93//2//wD//wO//wD//w21x11VVXXXXVVVf974Ae9KAHcdVVV1111VVXXfU/2TXXXPPg137t136v13md13nva6655sE8wMWLF/nzP/9z/vzP/5yLFy/yv41trvqf6cSJEzzsYQ/j5V/+5XnYwx7GA9133323/sM//MNv/9Zv/db3/MM//MNvc9VVV1111VVXXfU/F3rQgx7EVVddddVVV1111f8k11xzzYNf+7Vf+70A3umd3umzeYCLFy/y53/+5wD82q/9Glf929jmqhfdiRMneNjDHsbDHvYwXv7lX54Huu+++279h3/4h9/+h3/4h9/5rd/6re/mqquuuuqqq6666n8W9KAHPYirrrrqqquuuuqq/27XXHPNg1/7tV/7vV78xV/8tV/sxV7stXmAixcv8ud//uc89alP5WlPexpX/c9nm/+rTpw4AcDLv/zL87CHPYyHPexh3O++++679ezZs7f+/d///W//wz/8w+/8wz/8w29z1VVXXXXVVVdd9d8LPehBD+Kqq6666qqrrrrqv8M111zz4Nd+7dd+r9d5ndd572uuuebBPMDFixf58z//c/78z/+cixcvctX/b7b5n+rEiRM87GEP4+Vf/uV5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D3rQg7jqqquuuuqqq6666v+ua6655sGv/dqv/V7v9E7v9Nk8wD/8wz/89md+5me+DlddddVVV1111VVX/V+GHvSgB3HVVVddddVVV1111f9911xzzYPf8R3f8bMAfuu3fut7/uEf/uG3ueqqq6666qqrrrrq/zr0oAc9iKuuuuqqq6666qqrrrrqqquuuuqqq6666v8kKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/in8ElsK8J4u35H8AAAAASUVORK5CYII=) + + diff --git a/docs/kcl/pop.md b/docs/kcl/pop.md new file mode 100644 index 000000000..b2176d74b --- /dev/null +++ b/docs/kcl/pop.md @@ -0,0 +1,39 @@ +--- +title: "pop" +excerpt: "Remove the last element from an array." +layout: manual +--- + +Remove the last element from an array. + +Returns a new array with the last element removed. + +```js +pop(array: [KclValue]) -> KclValue +``` + + +### Arguments + +| Name | Type | Description | Required | +|----------|------|-------------|----------| +| `array` | [`[KclValue]`](/docs/kcl/types/KclValue) | The array to pop from. Must not be empty. | Yes | + +### Returns + +[`KclValue`](/docs/kcl/types/KclValue) - Any KCL value. + + +### Examples + +```js +arr = [1, 2, 3, 4] +new_arr = pop(arr) +assertEqual(new_arr[0], 1, 0.00001, "1 is the first element of the array") +assertEqual(new_arr[1], 2, 0.00001, "2 is the second element of the array") +assertEqual(new_arr[2], 3, 0.00001, "3 is the third element of the array") +``` + +![Rendered example of pop 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAABMiklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V/FPwKn4gueWQqZ4gAAAABJRU5ErkJggg==) + + diff --git a/docs/kcl/pow.md b/docs/kcl/pow.md index 830d6b940..219d90988 100644 --- a/docs/kcl/pow.md +++ b/docs/kcl/pow.md @@ -34,7 +34,7 @@ pow(num: number, pow: number) -> number ```js exampleSketch = startSketchOn("XZ") |> startProfileAt([0, 0], %) - |> angledLine({ angle: 50, length: pow(5, 2) }, %) + |> angledLine({ angle = 50, length = pow(5, 2) }, %) |> yLineTo(0, %) |> close(%) diff --git a/docs/kcl/profileStart.md b/docs/kcl/profileStart.md index 9d8aaa59a..86c06ff31 100644 --- a/docs/kcl/profileStart.md +++ b/docs/kcl/profileStart.md @@ -29,10 +29,10 @@ profileStart(sketch: Sketch) -> [number] ```js sketch001 = startSketchOn('XY') |> startProfileAt([5, 2], %) - |> angledLine({ angle: 120, length: 50 }, %, $seg01) + |> angledLine({ angle = 120, length = 50 }, %, $seg01) |> angledLine({ - angle: segAng(seg01) + 120, - length: 50 + angle = segAng(seg01) + 120, + length = 50 }, %) |> lineTo(profileStart(%), %) |> close(%) diff --git a/docs/kcl/profileStartX.md b/docs/kcl/profileStartX.md index 3ea64dad8..5da544c22 100644 --- a/docs/kcl/profileStartX.md +++ b/docs/kcl/profileStartX.md @@ -31,7 +31,7 @@ sketch001 = startSketchOn('XY') |> startProfileAt([5, 2], %) |> angledLine([-26.6, 50], %) |> angledLine([90, 50], %) - |> angledLineToX({ angle: 30, to: profileStartX(%) }, %) + |> angledLineToX({ angle = 30, to = profileStartX(%) }, %) ``` ![Rendered example of profileStartX 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAACdTElEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VX/Q/3wD//wpa7rdgC+8iu/8kF/8Ad/cBtXXXXVVVddddW/BsFVV1111VVXXXXVVVddddX/QD/xEz/hrut2eKaP/diPfcZDHvKQDa666qqrrrrqqn8Ngquuuuqqq6666qqrrrrqqv9hrrnmmgfzfHziJ37iP3DVVVddddVVV/1rULnqqquuuuqqq6666qqrrvpvdM011zz4tV/7td8L4MVf/MVf+8Ve7MVem6uuuuqqq6666j8Klauuuuqqq6666qqrrrrqqv8i11xzzYPPnDnz4Bd7sRd7rRd/8Rd/7Rd7sRd7bZ6P++6779ZrrrnmwTyXP/iDP/gUrrrqqquuuuqqfw0qV1111VVXXXXVVVddddVV/0muueaaB7/2a7/2ewG80zu902fzfNx33323/sM//MNv33fffbf+wz/8w+/8wz/8w2/zTD/xEz9hHuDVXu3Vvuiv/uqv7vmHf/iH3+aqq6666qqrrnpRoAc96EFcddVVV1111VVXXXXVVVf9e11zzTUPfrEXe7HXPnPmzINe/MVf/LVf7MVe7LV5Lvfdd9+tAL/1W7/13f/wD//wO//wD//w2/wLvumbvunp11xzzYN5prNnzz7jN3/zN7/rR3/0Rz+Hq6666qqrrrrqX0Llqquuuuqqq6666qqrrrrqX+maa6558JkzZx78Yi/2Yq/14i/+4q/9Yi/2Yq/N83Hffffd+lu/9VvfDfAP//APv/MP//APv82/0td//de/D8A7vdM7fdaLvdiLvfbf//3f/9Y//MM//A5XXXXVVVddddWLAj3oQQ/iqquuuuqqq6666qqrrrrqhbnmmmse/Nqv/drvBfDiL/7ir/1iL/Zir81zue+++249e/bsrX//93//2//wD//wO//wD//w2/wHerEXe7HX/tzP/dzfOnv27DM++IM/+MFcddVVV1111VUvCipXXXXVVVddddVVV1111VUPcM011zz4zJkzD36xF3ux13rxF3/x136xF3ux1+b5uO+++279rd/6re8G+NEf/dHP4T/ZP/zDP/z2P/zDP/z2i73Yi732h3/4h3/X13/9178PV1111VVXXXXVv4TKVVddddVVV1111VVXXfX/2jXXXPPg137t136va6655sGv8zqv8948H/fdd9+t//AP//Db9913363/8A//8Dv/8A//8Nv8N/iRH/mRz/ncz/3c136xF3ux177mmmsefN99993KVVddddVVV131wlC56qqrrrrqqquuuuqqq/7fuOaaax78Yi/2Yq995syZB734i7/4a7/Yi73Ya/Nc7rvvvlvPnj1769///d//9j/8wz/8zj/8wz/8Nv9D/MM//MNv//3f//1vv/iLv/hrv+M7vuNnff3Xf/37cNVVV1111VVXvTDoQQ96EFddddVVV1111VVXXXXV/z3XXHPNg8+cOfPgF3uxF3utF3/xF3/tF3uxF3ttno/77rvv1t/6rd/6boB/+Id/+J1/+Id/+G3+Bztz5syDvvmbv/nW++6779av//qvf59/+Id/+G2uuuqqq6666qoXBD3oQQ/iqquuuuqqq6666qqrrvrf75prrnnwa7/2a78XwDu90zt9Ns/Hfffdd+vZs2dv/fu///vf/od/+Iff+Yd/+Iff5n+hD//wD/+u13md13nvf/iHf/jtz/zMz3wdrrrqqquuuuqqFwQ96EEP4qqrrrrqqquuuuqqq6763+Waa6558Iu92Iu99pkzZx704i/+4q/9Yi/2Yq/Nc7nvvvtuBfit3/qt7/6Hf/iH3/mHf/iH3+b/iGuuuebB3/RN3/R0gM/8zM98nX/4h3/4ba666qqrrrrqqucHPehBD+Kqq6666qqrrrrqqquu+p/rmmuuefCZM2ce/GIv9mKv9eIv/uKv/WIv9mKvzfNx33333fpbv/Vb3w3wD//wD7/zD//wD7/N/2Hv+I7v+Fnv9E7v9Nn/8A//8Nuf+Zmf+TpcddVVV1111VXPD3rQgx7EVVddddVVV1111VVXXfU/xzXXXPPg137t134vgBd/8Rd/7Rd7sRd7bZ7Lfffdd+vZs2dv/fu///vf/od/+Iff+Yd/+Iff5v+Za6655sHf9E3f9HSAz/qsz3qdv//7v/9trrrqqquuuuqq54Ye9KAHcdVVV1111VVXXXXVVVf997jmmmsefObMmQe/2Iu92Gu9+Iu/+Gu/2Iu92GvzfNx33323/tZv/dZ3A/zoj/7o53DVZa/zOq/z3h/+4R/+XWfPnn3GB3/wBz+Yq6666qqrrrrquVG56qqrrrrqqquuuuqqq/7LXHPNNQ9+7dd+7fe65pprHvw6r/M6783zcd999936D//wD79933333foP//APv/MP//APv81Vz9c//MM//PY//MM//PaLvdiLvfbrvM7rvPdv/dZvfTdXXXXVVVddddUDoQc96EFcddVVV1111VVXXXXVVf/xrrnmmge/2Iu92GufOXPmQS/+4i/+2i/2Yi/22jyX++6779azZ8/e+vd///e//Q//8A+/8w//8A+/zVX/Kq/zOq/z3h/+4R/+Xffdd9+tH/IhH/IQrrrqqquuuuqqB0IPetCDuOqqq6666qqrrrrqqqv+fa655poHnzlz5sEv9mIv9lov/uIv/tov9mIv9to8H/fdd9+tv/Vbv/XdAP/wD//wO//wD//w21z17/Y5n/M5v/XiL/7ir/0jP/Ijn/2jP/qjn8NVV1111VVXXXU/9KAHPYirrrrqqquuuuqqq6666l/nmmuuefBrv/ZrvxfA67zO67z3Nddc82Cey3333Xfr2bNnb/37v//73/6Hf/iH3/mHf/iH3+aq/xQv9mIv9lqf+7mf+9v33XffrR/yIR/yEK666qqrrrrqqvtRueqqq6666qqrrrrqqqteqGuuuebBL/ZiL/baZ86cedCLv/iLv/aLvdiLvTbP5b777rsV4Ld+67e+++zZs8/4rd/6re/mqv8y//AP//A7//AP//DbL/ZiL/baH/7hH/5dX//1X/8+XHXVVVddddVVAFSuuuqqq6666qqrrrrqqme55pprHnzmzJkHv9iLvdhrvfiLv/hrv9iLvdhr83zcd999t/7Wb/3WdwP8wz/8w+/8wz/8w29z1X+rr//6r3+fb/qmb3r6i73Yi732Nddc8+D77rvvVq666qqrrrrqKipXXXXVVVddddVVV131/9g111zz4Nd+7dd+L4AXf/EXf+0Xe7EXe22ey3333Xfr2bNnb/37v//73/6Hf/iH3/mHf/iH3+aq/3Huu+++W3/rt37ru1/ndV7nvd/xHd/xs77+67/+fbjqqquuuuqqq9CDHvQgrrrqqquuuuqqq6666v+Da6655sFnzpx58Iu92Iu91ou/+Iu/9ou92Iu9Ns/Hfffdd+tv/dZvfTfAj/7oj34OV/2vcc011zz4m77pm55+33333foN3/AN7/P3f//3v81VV1111VVX/f9G5aqrrrrqqquuuuqqq/6Puuaaax782q/92u91zTXXPPh1Xud13pvn47777rv1H/7hH377vvvuu/Uf/uEffucf/uEffpur/te67777bv2t3/qt736d13md937Hd3zHz/77v//71+aqq6666qqr/n9DD3rQg7jqqquuuuqqq6666qr/7a655poHv9iLvdhrnzlz5kEv/uIv/tov9mIv9to8l/vuu+/Ws2fP3vr3f//3v/0P//APv/MP//APv81V/+dcc801D/6mb/qmpwN85md+5uv8wz/8w29z1VVXXXXVVf9/oQc96EFcddVVV1111VVXXXXV/ybXXHPNg8+cOfPgF3uxF3utF3/xF3/tF3uxF3ttno/77rvv1t/6rd/6boB/+Id/+J1/+Id/+G2u+n/hdV7ndd77wz/8w7/rvvvuu/VDPuRDHsJVV1111VVX/f9F5aqrrrrqqquuuuqqq/6Hu+aaax782q/92u8F8Dqv8zrvfc011zyY53Lffffdevbs2Vv//u///rf/4R/+4Xf+4R/+4be56v+tf/iHf/jt++6779ZrrrnmwS/2Yi/22v/wD//w21x11VVXXXXV/0/oQQ96EFddddVVV1111VVXXfU/xTXXXPPgF3uxF3vtM2fOPOjFX/zFX/vFXuzFXpvn47777rv1t37rt7777Nmzz/it3/qt7+aqq57L67zO67z3h3/4h3/Xfffdd+uHfMiHPISrrrrqqquu+v+JylVXXXXVVVddddVVV/03ueaaax4M8Nqv/drv9eIv/uKv/WIv9mKvzfNx33333fpbv/Vb3w3wD//wD7/zD//wD7/NVVf9C/7+7//+t/7hH/7ht1/sxV7stV/ndV7nvX/rt37ru7nqqquuuuqq/3/Qgx70IK666qqrrrrqqquuuuq/wjXXXPPg137t134vgBd/8Rd/7Rd7sRd7bZ7Lfffdd+vZs2dv/fu///vf/od/+Iff+Yd/+Iff5qqr/o1e7MVe7LU/93M/97fuu+++Wz/kQz7kIVx11VVXXXXV/z9Urrrqqquuuuqqq6666j/BNddc8+AzZ848+MVe7MVe68Vf/MVf+8Ve7MVem+fjvvvuu/W3fuu3vhvgR3/0Rz+Hq676D/QP//APv/0P//APv/1iL/Zir/3hH/7h3/X1X//178NVV1111VVX/f9C5aqrrrrqqquuuuqqq/4DXHPNNQ9+7dd+7fe65pprHvw6r/M6783zcd999936D//wD79933333foP//APv/MP//APv81VV/0n+5Ef+ZHP+dzP/dzXfrEXe7HXvuaaax5833333cpVV1111VVX/f9B5aqrrrrqqquuuuqqq/6Vrrnmmge/2Iu92GufOXPmQS/+4i/+2i/2Yi/22jyX++6779azZ8/e+vd///e//Q//8A+/8w//8A+/zVVX/Tf4h3/4h9/+h3/4h99+sRd7sdd+x3d8x8/6+q//+vfhqquuuuqqq/7/QA960IO46qqrrrrqqquuuuqqF+Saa6558JkzZx78Yi/2Yq/14i/+4q/9Yi/2Yq/N83Hffffd+lu/9VvfDfAP//APv/MP//APv81VV/0Pcc011zz4m77pm55+9uzZZ3zd133de//DP/zDb3PVVVddddVV/z9Queqqq6666qqrrrrqqge45pprHvzar/3a7wXwOq/zOu99zTXXPJjnct9999169uzZW//+7//+t//hH/7hd/7hH/7ht7nqqv/B7rvvvlt/67d+67tf53Ve571f53Ve573+4R/+4be56qqrrrrqqv8f0IMe9CCuuuqqq6666qqrrvr/6Zprrnnwi73Yi732mTNnHvTiL/7ir/1iL/Zir83zcd999936W7/1W9999uzZZ/zWb/3Wd3PVVf8LXXPNNQ/+pm/6pqcDfOZnfubr/MM//MNvc9VVV1111VX/96EHPehBXHXVVVddddVVV131f98111zzYIDXfu3Xfq8Xf/EXf+0Xe7EXe22ej/vuu+/Wf/iHf/jt++6779Z/+Id/+J1/+Id/+G2uuur/iHd8x3f8rHd6p3f67H/4h3/47c/8zM98Ha666qqrrrrq/z70oAc9iKuuuuqqq6666qqr/u+55pprHvzar/3a7wXw4i/+4q/9Yi/2Yq/Nc7nvvvtuPXv27K1///d//9v/8A//8Dv/8A//8NtcddX/YWfOnHnQN3/zN98K8Jmf+Zmv8w//8A+/zVVXXXXVVVf934Ye9KAHcdVVV1111VVXXXXV/27XXHPNg8+cOfPgF3uxF3utF3/xF3/tF3uxF3ttno/77rvv1t/6rd/6boAf/dEf/Ryuuur/odd5ndd57w//8A//rvvuu+/WD/mQD3kIV1111VVXXfV/G5Wrrrrqqquuuuqqq/7Xueaaax782q/92u8F8E7v9E6fzfNx33333foP//APv33ffffd+g//8A+/8w//8A+/zVVXXcU//MM//PZ999136zXXXPPg13md13nv3/qt3/purrrqqquuuur/LvSgBz2Iq6666qqrrrrqqqv+57rmmmse/GIv9mKvfebMmQe9+Iu/+Gu/2Iu92GvzXO67775bz549e+vf//3f//Y//MM//M4//MM//DZXXXXVC/Q6r/M67/3hH/7h33Xffffd+iEf8iEP4aqrrrrqqqv+76Jy1VVXXXXVVVddddX/GNdcc82Dz5w58+AXe7EXe60Xf/EXf+0Xe7EXe22ej/vuu+/W3/qt3/pugH/4h3/4nX/4h3/4ba666qoX2T/8wz/89j/8wz/89ou92Iu99uu8zuu892/91m99N1ddddVVV131fxN60IMexFVXXXXVVVddddVV/z2uueaaB7/2a7/2ewG8zuu8zntfc801D+a53HfffbeePXv21r//+7//7X/4h3/4nX/4h3/4ba666qp/txd7sRd77c/93M/9rbNnzz7jgz/4gx/MVVddddVVV/3fROWqq6666qqrrrrqqv8S11xzzYNf7MVe7LXPnDnzoBd/8Rd/7Rd7sRd7bZ6P++6779bf+q3f+u6zZ88+47d+67e+m6uuuuo/xT/8wz/89j/8wz/89ou92Iu99od/+Id/19d//de/D1ddddVVV131fw+Vq6666qqrrrrqqqv+w11zzTUPBnjt137t93rxF3/x136xF3ux1+b5uO+++279h3/4h9++7777bv2Hf/iH3/mHf/iH3+aqq676L/P1X//17/NN3/RNT3+xF3ux177mmmsefN99993KVVddddVVV/3fQuWqq6666qqrrrrqqn+3a6655sGv/dqv/V4AL/7iL/7aL/ZiL/baPJf77rvv1rNnz97693//97/9D//wD7/zD//wD7/NVVdd9d/qvvvuu/Xv//7vf/vFX/zFX/sd3/EdP+vrv/7r34errrrqqquu+r8FPehBD+Kqq6666qqrrrrqqhfdNddc8+AzZ848+MVe7MVe68Vf/MVf+8Ve7MVem+fjvvvuu/W3fuu3vhvgt3/7t7/nvvvuu5Wrrrrqf5wzZ8486Ju/+Ztvve+++279+q//+vf5h3/4h9/mqquuuuqqq/7vQA960IO46qqrrrrqqquuuuoFu+aaax782q/92u8F8E7v9E6fzfNx33333foP//APv33ffffd+g//8A+/8w//8A+/zVVXXfW/xod/+Id/1+u8zuu89z/8wz/89md+5me+DlddddVVV131fwd60IMexFVXXXXVVVddddVVV1xzzTUPfrEXe7HXPnPmzINe/MVf/LVf7MVe7LV5Lvfdd9+tZ8+evfXv//7vf/sf/uEffucf/uEffpurrrrqf7Vrrrnmwd/0Td/0dIDP/MzPfJ1/+Id/+G2uuuqqq6666v8G9KAHPYirrrrqqquuuuqq/4+uueaaB585c+bBL/ZiL/ZaL/7iL/7aL/ZiL/baPB/33Xffrb/1W7/13QD/8A//8Dv/8A//8NtcddVV/+e8zuu8znt/+Id/+Hf9wz/8w29/5md+5utw1VVXXXXVVf83ULnqqquuuuqqq676f+Kaa6558Gu/9mu/F8CLv/iLv/aLvdiLvTbP5b777rv17Nmzt/793//9b//DP/zD7/zDP/zDb3PVVVf9v/AP//APv33ffffd+mIv9mKv/eIv/uKv/fd///e/zVVXXXXVVVf974ce9KAHcdVVV1111VVXXfV/zTXXXPPgF3uxF3vtM2fOPOjFX/zFX/vFXuzFXpvn47777rv1t37rt7777Nmzz/it3/qt7+aqq676f+11Xud13vvDP/zDv+vs2bPP+OAP/uAHc9VVV1111VX/+1G56qqrrrrqqquu+l/ummuueTDAa7/2a7/Xi7/4i7/2i73Yi702z8d999136z/8wz/89n333XfrP/zDP/zOP/zDP/w2V1111VUP8A//8A+//Q//8A+//WIv9mKv/Tqv8zrv/Vu/9VvfzVVXXXXVVVf974Ye9KAHcdVVV1111VVXXfW/yTXXXPPg137t134vgBd/8Rd/7Rd7sRd7bZ7Lfffdd+vZs2dv/fu///vf/od/+Iff+Yd/+Iff5qqrrrrqRfA6r/M67/3hH/7h33Xffffd+iEf8iEP4aqrrrrqqqv+d0MPetCDuOqqq6666qqrrvqf6pprrnnwmTNnHvxiL/Zir/XiL/7ir/1iL/Zir83zcd999936W7/1W98N8Nu//dvfc999993KVVddddW/0ed8zuf81ou/+Iu/9o/8yI989o/+6I9+DlddddVVV131vxeVq6666qqrrrrqqv9Brrnmmge/9mu/9nsBvNM7vdNn83zcd999t/7DP/zDb9933323/sM//MPv/MM//MNvc9VVV131H+hHf/RHP/vFX/zFf/t1Xud13vu3f/u3v+e+++67lauuuuqqq67634nKVVddddVVV1111X+Ta6655sEv9mIv9tpnzpx50Iu/+Iu/9ou92Iu9Ns/lvvvuuxXgt37rt777H/7hH37nH/7hH36bq6666qr/ZP/wD//wO//wD//w2y/2Yi/22u/4ju/4WV//9V//Plx11VVXXXXV/07oQQ96EFddddVVV1111VX/2a655poHnzlz5sEv9mIv9lov/uIv/tov9mIv9to8H/fdd9+tv/Vbv/XdAP/wD//wO//wD//w21x11VVX/Te45pprHvxN3/RNT7/vvvtu/fqv//r3+Yd/+Iff5qqrrrrqqqv+96Fy1VVXXXXVVVdd9Z/gmmuuefBrv/ZrvxfAi7/4i7/2i73Yi702z+W+++679ezZs7f+/d///W//wz/8w+/8wz/8w29z1VVXXfU/xH333Xfrb/3Wb33367zO67z367zO67zXP/zDP/w2V1111VVXXfW/D3rQgx7EVVddddVVV1111b/HNddc8+AzZ848+MVe7MVe68Vf/MVf+8Ve7MVem+fjvvvuu/W3fuu3vvvs2bPP+K3f+q3v5qqrrrrqf7hrrrnmwd/0Td/0dIDP+qzPep2///u//22uuuqqq6666n8XKlddddVVV1111VX/Ctdcc82DAV77tV/7vV78xV/8tV/sxV7stXk+7rvvvlv/4R/+4bfvu+++W//hH/7hd/7hH/7ht7nqqquu+l/mvvvuu/VHfuRHPvud3umdPvsd3/EdP/vv//7vX5urrrrqqquu+t8FPehBD+Kqq6666qqrrrrqBbnmmmse/Nqv/drvBfDiL/7ir/1iL/Zir81zue+++249e/bsrX//93//2//wD//wO//wD//w21x11VVX/R9xzTXXPPibvumbng7wmZ/5ma/zD//wD7/NVVddddVVV/3vgR70oAdx1VVXXXXVVVddBXDNNdc8+MyZMw9+sRd7sdd68Rd/8dd+sRd7sdfm+bjvvvtu/a3f+q3vBvjt3/7t77nvvvtu5aqrrrrq/7DXeZ3Xee8P//AP/6777rvv1g/5kA95CFddddVVV131vweVq6666qqrrrrq/61rrrnmwa/92q/9XgDv9E7v9Nk8H/fdd9+t//AP//Db9913363/8A//8Dv/8A//8NtcddVVV/0/8w//8A+/fd999916zTXXPPh1Xud13vu3fuu3vpurrrrqqquu+t8BPehBD+Kqq6666qqrrvq/75prrnnwi73Yi732mTNnHvTiL/7ir/1iL/Zir81zue+++24F+K3f+q3v/od/+Iff+Yd/+Iff5qqrrrrqqste53Ve570//MM//Lvuu+++Wz/kQz7kIVx11VVXXXXV/w5Urrrqqquuuuqq/3OuueaaB585c+bBL/ZiL/ZaL/7iL/7aL/ZiL/baPB/33Xffrb/1W7/13QD/8A//8Dv/8A//8NtcddVVV131fP393//9b/3DP/zDb7/Yi73Ya7/O67zOe//Wb/3Wd3PVVVddddVV//OhBz3oQVx11VVXXXXVVf+7XXPNNQ9+7dd+7fcCePEXf/HXfrEXe7HX5rncd999t549e/bWv//7v//tf/iHf/idf/iHf/htrrrqqquu+ld5sRd7sdf+3M/93N+67777bv2QD/mQh3DVVVddddVV//NRueqqq6666qqr/le55pprHnzmzJkHv9iLvdhrvfiLv/hrv9iLvdhr83zcd999t/7Wb/3WdwP86I/+6Odw1VVXXXXVv9s//MM//PY//MM//PaLvdiLvfaHf/iHf9fXf/3Xvw9XXXXVVVdd9T8blauuuuqqq6666n+sa6655sEAr/3ar/1e11xzzYNf53Ve5715Pu67775b/+Ef/uG377vvvlv/4R/+4Xf+4R/+4be56qqrrrrqP8XXf/3Xv883fdM3Pf3FXuzFXvuaa6558H333XcrV1111VVXXfU/F5Wrrrrqqquuuup/jGuuuebBr/3ar/1eAC/+4i/+2i/2Yi/22jyX++6779azZ8/e+vd///e//Q//8A+/8w//8A+/zVVXXXXVVf9l7rvvvlv/4R/+4bdf7MVe7LXf8R3f8bO+/uu//n246qqrrrrqqv+50IMe9CCuuuqqq6666qr/etdcc82Dz5w58+AXe7EXe60Xf/EXf+0Xe7EXe22ej/vuu+/W3/qt3/pugN/+7d/+nvvuu+9Wrrrqqquu+m91zTXXPPibvumbnn727NlnfN3Xfd17/8M//MNvc9VVV1111VX/M6EHPehBXHXVVVdd9b+LT8ctiADgwBe09B4P1Gnm47qeZ9KFvJPGyFX/ra655poHv/Zrv/Z7AbzTO73TZ/N83Hfffbf+wz/8w2/fd999t/7DP/zD7/zDP/zDb3PVVVddddX/SB/+4R/+Xa/zOq/z3v/wD//w25/5mZ/5Olx11VVXXXXV/0zoQQ96EFddddVVV/3vkS/evc76U3d+iU4z3dOe0n3v4ceXPxt+hmfyhnba687fb3yvza8EiCdPf9p/2d7b6GLexVX/Za655poHv9iLvdhrnzlz5kEv/uIv/tov9mIv9to8l/vuu+9WgN/6rd/67n/4h3/4nX/4h3/4ba666qqrrvpf45prrnnwN33TNz0d4DM/8zNf5x/+4R9+m6uuuuqqq676n4fKVVddddVV/3t0mvtk3EinGQBrH+m+disPNNOmr4mHAGCSQ1/QJd/DVf9prrnmmgefOXPmwS/2Yi/2Wi/+4i/+2i/2Yi/22jwf9913362/9Vu/9d0A//AP//A7//AP//DbXHXVVVdd9b/Wfffdd+vXf/3Xv8+Hf/iHf9c7vdM7fdZnfuZn/jZXXXXVVVdd9T8Plauuuuqqq/7X8IyNPFMezDNp6X2dy9t4oJk2fU15CABrH8XZdivp5Kr/MNdcc82DX/u1X/u9AF78xV/8tV/sxV7stXku9913361nz5699e///u9/+x/+4R9+5x/+4R9+m6uuuuqqq/7P+fu///vfuu+++259sRd7sdd+sRd7sdf+h3/4h9/mqquuuuqqq/5noXLVVVddddX/HjNtciYeBEBj0iXfp0Nf5AE811ZeUx4CoLUPdW97Olf9m11zzTUPPnPmzINf7MVe7LVe/MVf/LVf7MVe7LV5Pu67775bf+u3fuu7AX70R3/0c7jqqquuuur/hbNnzz7jR3/0Rz/nwz/8w7/rwz/8w7/rQz7kQx7CVVddddVVV/3PQuWqq6666qr/PWba8Jl4MABrH+psu5XnttA2p+MWAFY+1H3t6Vz1Irvmmmse/Nqv/drvdc011zz4dV7ndd6b5+O+++679R/+4R9++7777rv1H/7hH37nH/7hH36bq6666qqr/t/6h3/4h9/+h3/4h99+sRd7sdd+ndd5nff+rd/6re/mqquuuuqqq/7noHLVVVddddX/Gp5pM68pDwLQ2oe6L5/OAxU6H9d1XmgbQGsO4758Olc9X9dcc82DX/u1X/u9AF78xV/8tV/sxV7stXku9913361nz5699e///u9/+x/+4R9+5x/+4R9+m6uuuuqqq656gPvuu+/W3/qt3/qeF3uxF3vtd3zHd/ys3/qt3/purrrqqquuuup/DipXXXXVVVf977HQNifjJgBWPtR97ek8gOfa9HXl4dxv5QPO5jO4imuuuebBZ86cefCLvdiLvdaLv/iLv/aLvdiLvTbPx3333Xfrb/3Wb303wD/8wz/8zj/8wz/8NlddddVVV131L/it3/qt736d13md93qxF3ux136nd3qnz/6RH/mRz+aqq6666qqr/megctVVV1111f8OVb2Px3XutQDQ2kdxrt3GA23qeD6kvgwASeNSntV+nuP/oWuuuebBr/3ar/1eAO/0Tu/02Twf9913363/8A//8Nv33Xffrf/wD//wO//wD//w21x11VVXXXXVv9GP/MiPfM7nfu7nvvbrvM7rvPeP/MiPfDZXXXXVVVdd9T8Dlauuuuqqq/5XcM/CJ+J67jey4sAXuJ+IvKW+RL54/7oArH0YZ9utGPN/3DXXXPPgF3uxF3vtM2fOPOjFX/zFX/vFXuzFXpvnct99990K8Fu/9Vvf/Q//8A+/8w//8A+/zVVXXXXVVVf9B/qHf/iH3/6Hf/iH336xF3ux1/7wD//w7/r6r//69+Gqq6666qqr/vtRueqqq6666n+HQueeBfcLgp04zYW8C6F8SH2Z9jqz9/GWTgBo5UPdl0/n/5hrrrnmwWfOnHnwi73Yi73Wi7/4i7/2i73Yi702z8d9991362/91m99N8A//MM//M4//MM//DZXXXXVVVdd9Z/s67/+69/nm77pm57+Yi/2Yq99zTXXPPi+++67lauu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37nvvvtu/Yd/+Iff5qqrrrrqqqv+HV7sxV7stT/3cz/3t+67775bP+RDPuQhXHXVVVddddV/PPSgBz2Iq6666qqr/nudOXMm/uzP/qxJ4vmxzYMf/GDxb/SJF/iul1rz2r+ywXf/zZzf+ZsZv82/w7WUG76jnfy5F6d/WR7g6UxP+tTY/eCvyhPfdx3lRh7gCB/8hlY//9mx+5HnybP8L3DNNdc8+MVe7MVe+8Ve7MVe65prrnnwi73Yi702D3Dffffdevbs2Vv//u///rf/4R/+4Xf+4R/+4be56qqrrrrqqn+lz/3cz/2tF3uxF3vt3/qt3/rur//6r38frrrqqquuuuo/FnrQgx7EVVddddVV//2+9Eu/9H3e8R3f8Ttf/MVf/PDw8HAT4PVf//X/5tu+7dte6nVe53X6pz/96SP/Q2yjnXf35od8eO582gbaSmhnafd+nw6/8Qfj8Fs+Lnc+/x288d49mjU8XcTnf12rn/tC7X7ivrzL/1LXXHPNg1/sxV7stV/sxV7sta655poHv9iLvdhr8wD33XffrWfPnr317//+73/7H/7hH37nH/7hH36bq6666qqrrvoXXHPNNQ/+pm/6pqffd999t37WZ33W69x33323ctVVV1111VX/cdCDHvQgrrrqqquu+p/jt3/7t59Qa50B3H333X/6Du/wDu/E/zACnXJc8xHe/vRX9uy1zyrv/nktf+zHdfTdifOhro/8uNz5vIdTH3Ob2tN+Rssf/AWOfqyJif9Drrnmmge/2Iu92Gu/2Iu92Gtdc801D36xF3ux1+YB7rvvvlvPnj1769///d//9j/8wz/8zj/8wz/8NlddddVVV131fHz4h3/4d73O67zOe//Wb/3Wd3/913/9+3DVVVddddVV/3HQgx70IK666qqrrrrqqn+/a6655sEv9mIv9tov9mIv9lrXXHPNg1/sxV7stXmA++6771aAf/iHf/jt3/qt3/qef/iHf/htrrrqqquuugq45pprHvxN3/RNTz979uwzvu7rvu69/+Ef/uG3ueqqq6666qr/GOhBD3oQV1111VVXXXXVf7xrrrnmwS/2Yi/22i/2Yi/2Wtdcc82DX+zFXuy1eYD77rvvVoB/+Id/+O1/+Id/+J3f+q3f+m6uuuqqq676f+vDP/zDv+t1Xud13vsf/uEffvszP/MzX4errrrqqquu+o+BHvSgB3HVVVddddVVV/3nu+aaax585syZB7/Yi73Ya734i7/4a7/Yi73Ya/Nc7rvvvlv/4R/+4bf/4R/+4Xd+67d+67u56qqrrrrq/41rrrnmwd/0Td/0dIDP/MzPfJ1/+Id/+G2uuuqqq6666t8PPehBD+Kqq6666qqrrvqvd8011zz4zJkzD36xF3ux13rxF3/x136xF3ux1+a53Hfffbf+wz/8w2//wz/8w+/81m/91ndz1VVXXXXV/2mv8zqv894f/uEf/l333XffrR/yIR/yEK666qqrrrrq3w896EEP4qqrrrrqqquu+u93zTXXPPjMmTMPfrEXe7HXevEXf/HXfrEXe7HX5rncd999t/7DP/zDb//DP/zD79x33323/sM//MNvc9VVV1111f8ZZ86cedDnfu7n/vY111zz4M/8zM98nX/4h3/4ba666qqrrrrq3wc96EEP4qqrrrrqqquu+p/nmmuueTDAi73Yi73267zO67zXi73Yi702z+W+++679R/+4R9++x/+4R9+57777rv1H/7hH36bq6666qqr/ld7ndd5nff+8A//8O+67777bv2QD/mQh3DVVVddddVV/z7oQQ96EFddddVVV1111f9811xzzYMBXuzFXuy1X+zFXuy1Xud1Xue9eS733Xffrf/wD//w2//wD//wO/fdd9+t//AP//DbXHXVVVdd9b/KNddc8+AP//AP/64Xe7EXe+2v//qvf5/f+q3f+m6uuuqqq6666t8OPehBD+Kqq6666qqrrvrf6Zprrnnwi73Yi732i73Yi73W67zO67w3z+W+++679R/+4R9++x/+4R9+57777rv1H/7hH36bq6666qqr/sd7sRd7sdf+3M/93N+67777bv2QD/mQh3DVVVddddVV/3boQQ96EFddddVVV1111f8N11xzzYNf7MVe7LVf7MVe7LVe53Ve5715Lvfdd9+t//AP//Db//AP//A79913363/8A//8NtcddVVV131P9Lnfu7n/taLvdiLvfZv/dZvfffXf/3Xvw9XXXXVVVdd9W+DHvSgB3HVVVddddVVV/3fdM011zz4xV7sxV77xV7sxV7rmmuuefCLvdiLvTYPcN999936D//wD79933333foP//APv/MP//APv81VV1111VX/I7zYi73Ya3/u537ub509e/YZn/mZn/na9913361cddVVV1111b8eetCDHsRVV1111VVXXfX/wzXXXPPgF3uxF3vtF3uxF3uta6655sEv9mIv9to8wH333Xfr2bNnb/37v//73/6Hf/iH3/mHf/iH3+aqq6666qr/Np/7uZ/7Wy/2Yi/22r/1W7/13V//9V//Plx11VVXXXXVvx560IMexFVXXXXVVVdd9f/TNddc8+AXe7EXe+0Xe7EXe61rrrnmwS/2Yi/22jzAfffdd+vZs2dv/fu///vf/od/+Iff+Yd/+Iff5qqrrrrqqv8y11xzzYO/6Zu+6en33XffrV//9V//Pv/wD//w21x11VVXXXXVvw560IMexFVXXXXVVVdddRXANddc8+AXe7EXe+0Xe7EXe61rrrnmwS/2Yi/22jzAfffdd+vZs2dvve+++279rd/6re/5h3/4h9/mqquuuuqq/1Qf/uEf/l2v8zqv896/9Vu/9d1f//Vf/z5cddVVV1111b8OetCDHsRVV1111VVXXXXV83PNNdc8+MVe7MVe+8Ve7MVe65prrnnwi73Yi702D3DffffdCvAP//APv/1bv/Vb3/MP//APv81VV1111VX/oc6cOfOgb/7mb74V4DM/8zNf5x/+4R9+m6uuuuqqq6560aEHPehBXHXVVVddddVVV70orrnmmge/2Iu92Gu/2Iu92Gtdc801D36xF3ux1+YB7rvvvlsB/uEf/uG3/+Ef/uF3fuu3fuu7ueqqq6666t/tHd/xHT/rnd7pnT77H/7hH377Mz/zM1+Hq6666qqrrnrRoQc96EFcddVVV1111VVX/Vtcc801Dz5z5syDX+zFXuy1XvzFX/y1X+zFXuy1eS733Xffrf/wD//w2//wD//wO7/1W7/13Vx11VVXXfWvds011zz4m77pm54O8Jmf+Zmv8w//8A+/zVVXXXXVVVe9aNCDHvQgrrrqqquuuuqqq/4jXHPNNQ8+c+bMg1/sxV7stV78xV/8tV/sxV7stXku9913363/8A//8Nv/8A//8Du/9Vu/9d1cddVVV131Inmd13md9/7wD//w77rvvvtu/ZAP+ZCHcNVVV1111VUvGvSgBz2Iq6666qqrrrrqqv8M11xzzYPPnDnz4Bd7sRd7rRd/8Rd/7Rd7sRd7bZ7Lfffdd+s//MM//PY//MM//M5999136z/8wz/8NlddddVVVz2Pa6655sGf8zmf81vXXHPNg7/+67/+fX7rt37ru7nqqquuuuqqfxl60IMexFVXXXXVVVddddV/hWuuuebBAC/2Yi/22q/zOq/zXi/2Yi/22jyX++6779Z/+Id/+O1/+Id/+J377rvv1n/4h3/4ba666qqrrrrsdV7ndd77wz/8w7/r7Nmzz/jgD/7gB3PVVVddddVV/zL0oAc9iKuuuuqqq6666qr/Dtdcc82DAV7sxV7stV/sxV7stV7ndV7nvXku9913363/8A//8Nv/8A//8Dv33Xffrf/wD//w21x11VVX/T91zTXXPPjDP/zDv+vFXuzFXvvrv/7r3+e3fuu3vpurrrrqqquueuHQgx70IK666qqrrrrqqqv+p7jmmmse/GIv9mKv/WIv9mKv9Tqv8zrvzXO57777bv2Hf/iH3/6Hf/iH37nvvvtu/Yd/+Iff5qqrrrrq/5EXe7EXe+3P/dzP/a377rvv1g/5kA95CFddddVVV131wqEHPehBXHXVVVddddVVV/1Pdc011zz4xV7sxV77xV7sxV7rdV7ndd6b53Lffffd+g//8A+//Q//8A+/c9999936D//wD7/NVVddddX/cZ/zOZ/zWy/+4i/+2r/1W7/13V//9V//Plx11VVXXXXVC4Ye9KAHcdVVV1111VVXXfW/xTXXXPPgF3uxF3vtF3uxF3uta6655sEv9mIv9to8wNmzZ59x3333Pf3v//7vf/sf/uEffucf/uEffpurrrrqqv9jzpw586Bv/uZvvvW+++679bM+67Ne57777ruVq6666qqrrnr+0IMe9CCuuuqqq6666qqr/re65pprHvxiL/Zir/1iL/Zir3XNNdc8+MVe7MVemwe47777bj179uwz/v7v//63/uEf/uF3/uEf/uG3ueqqq676P+BzP/dzf+vFXuzFXvu3fuu3vvvrv/7r34errrrqqquuev7Qgx70IK666qqrrrrqqqv+rzhz5syDXvzFX/x1XuzFXuy1rrnmmge/2Iu92GvzAPfdd9+tZ8+evfUf/uEffufv//7vf/sf/uEffpurrrrqqv+Frrnmmgd/0zd909Pvu+++W7/+67/+ff7hH/7ht7nqqquuuuqq54Ue9KAHcdVVV1111VVXXfV/1TXXXPPgF3uxF3utF3uxF3vta6655sEv9mIv9to8wH333Xfr2bNnb73vvvtu/a3f+q3v+Yd/+Iff5qqrrrrqf4kP//AP/67XeZ3Xee9/+Id/+O3P/MzPfB2uuuqqq6666nmhBz3oQVx11VVXXXXVVVf9f3HNNdc8+MVe7MVe+8Ve7MVe65prrnnwi73Yi702D3DffffdCvAP//APv/1bv/Vb3/MP//APv81VV1111f9Q11xzzYO/6Zu+6ekAn/VZn/U6f//3f//bXHXVVVddddVzQg960IO46qqrrrrqqquu+v/qmmuuefCZM2ce/GIv9mKv9eIv/uKv/WIv9mKvzXO57777bv2Hf/iH3/6Hf/iH3/mt3/qt7+aqq6666n+Q13md13nvD//wD/+uf/iHf/idz/zMz3xtrrrqqquuuuo5oQc96EFcddVVV1111VVXXXXFNddc8+AzZ848+MVe7MVe68Vf/MVf+8Ve7MVem+dy9uzZZ/z93//9b/3DP/zD7/zWb/3Wd3PVVVdd9d/ommuuefDnfM7n/NY111zz4M/8zM98nX/4h3/4ba666qqrrrrq2dCDHvQgrrrqqquuuuqqq656/s6cOfOga6655iEv9mIv9lov/uIv/tov9mIv9to8l/vuu+/Wf/iHf/idf/iHf/jt3/qt3/purrrqqqv+i73O67zOe3/4h3/4d9133323fsiHfMhDuOqqq6666qpnQw960IO46qqrrrrqqquuuupFc8011zz4zJkzD7rmmmse8jqv8zrv9WIv9mKvzXO57777bv2Hf/iH3/6Hf/iH37nvvvtu/Yd/+Iff5qqrrrrqP9E111zz4A/7sA/7rhd/8Rd/7a//+q9/n9/6rd/6bq666qqrrrrqCvSgBz2Iq6666qqrrrrqqqv+ba655poHA7zYi73Ya73O67zOe7/Yi73Ya/Nc7rvvvlv/4R/+4bf/4R/+4Xfuu+++W//hH/7ht7nqqquu+g/2Oq/zOu/94R/+4d9133333fohH/IhD+Gqq6666qqrrkAPetCDuOqqq6666qqrrrrqP84111zz4Bd7sRd77Rd7sRd7rdd5ndd5b57Lfffdd+s//MM//PY//MM//M5999136z/8wz/8NlddddVV/wE+93M/97de7MVe7LV/5Ed+5LN/9Ed/9HO46qqrrrrqKkAPetCDuOqqq6666qqrrrrqP88111zz4Bd7sRd77Rd7sRd7rdd5ndd5b57L2bNnn/H3f//3v/UP//APv3Pffffd+g//8A+/zVVXXXXVv8GLvdiLvfbnfu7n/tZ9991364d8yIc8hKuuuuqqq64C9KAHPYirrrrqqquuuuqqq/7rXHPNNQ9+sRd7sdd+sRd7sdd6ndd5nffmudx33323/sM//MPv/MM//MNv33fffbf+wz/8w29z1VVXXfUi+tzP/dzferEXe7HX/q3f+q3v/vqv//r34aqrrrrqqv/v0IMe9CCuuuqqq6666qqrrvrvc+bMmQe9+Iu/+Ou82Iu92Gtdc801D36xF3ux1+YB7rvvvlvPnj176z/8wz/8zt///d//9j/8wz/8NlddddVVL8A111zz4G/6pm96+n333XfrN3zDN7zP3//93/82V1111VVX/X+GHvSgB3HVVVddddVVV1111f8c11xzzYNf7MVe7LVe7MVe7LWvueaaB7/Yi73Ya/MA9913361nz5699e///u9/+x/+4R9+5x/+4R9+m6uuuuqqB/jwD//w73qd13md9/6t3/qt7/76r//69+Gqq6666qr/z9CDHvQgrrrqqquuuuqqq676n+uaa6558Iu92Iu99ou92Iu91jXXXPPgF3uxF3ttHuC+++679ezZs7f+/d///W//wz/8w+/8wz/8w29z1VVX/b92zTXXPPibvumbng7wmZ/5ma/zD//wD7/NVVddddVV/1+hBz3oQVx11VVXXXXVVVdd9b/HNddc8+AXe7EXe+0Xe7EXe61rrrnmwS/2Yi/22jzA2bNnn2Hb//AP//Dbv/Vbv/U9//AP//DbXHXVVf/vfPiHf/h3vc7rvM57/8M//MNvf+ZnfubrcNVVV1111f9X6EEPehBXXXXVVVddddVVV/3vdc011zz4xV7sxV77xV7sxV7rmmuuefCLvdiLvTYPcN99990qSX//93//W//wD//wO7/1W7/13Vx11VX/511zzTUP/qZv+qanA3zmZ37m6/zDP/zDb3PVVVddddX/R+hBD3oQV1111VVXXXXVVVf933HmzJkHXXPNNQ95sRd7sdd68Rd/8dd+sRd7sdfmudx33323/sM//MPv/MM//MNv/9Zv/dZ3c9VVV/2f9Dqv8zrv/eEf/uHfdd999936IR/yIQ/hqquuuuqq/4/Qgx70IK666qqrrrrqqquu+r/rmmuuefCZM2ce9GIv9mKv/eIv/uKv/WIv9mKvzXO57777bv2Hf/iH3/6Hf/iH3/mt3/qt7+aqq676P+HMmTMP+tzP/dzfvuaaax789V//9e/zW7/1W9/NVVddddVV/9+gBz3oQVx11VVXXXXVVVdd9f/HNddc8+AzZ848+MVe7MVe68Vf/MVf+8Ve7MVem+dy33333foP//APv/0P//APv3Pffffd+g//8A+/zVVXXfW/0uu8zuu894d/+Id/13333Xfrh3zIhzyEq6666qqr/r9BD3rQg7jqqquuuuqqq6666v+va6655sEAL/ZiL/bar/M6r/NeL/ZiL/baPJf77rvv1n/4h3/47X/4h3/4nfvuu+/Wf/iHf/htrrrqqv8Vrrnmmgd/+Id/+He92Iu92Gt//dd//fv81m/91ndz1VVXXXXV/yfoQQ96EFddddVVV1111VVXXXW/a6655sEAL/ZiL/baL/ZiL/Zar/M6r/PePJezZ88+4+///u9/6x/+4R9+57777rv1H/7hH36bq6666n+sF3uxF3vtz/3cz/2t++6779YP+ZAPeQhXXXXVVVf9f4Ie9KAHcdVVV1111VVXXXXVVS/MNddc8+AXe7EXe+0Xe7EXe63XeZ3XeW+ey3333XfrP/zDP/zOP/zDP/z2fffdd+s//MM//DZXXXXV/yif+7mf+1sv9mIv9tq/9Vu/9d1f//Vf/z5cddVVV131/wV60IMexFVXXXXVVVddddVVV/1rnDlz5kEv/uIv/jov9mIv9lqv8zqv8948l/vuu+/Wf/iHf/jtf/iHf/id++6779Z/+Id/+G2uuuqq/1Yv9mIv9tqf+7mf+1tnz559xmd+5me+9n333XcrV1111VVX/X+AHvSgB3HVVVddddVVV1111VX/Htdcc82DX+zFXuy1XuzFXuy1X+zFXuy1r7nmmgfzAPfdd9+t//AP//Db//AP//A79913363/8A//8NtcddVV/+U+93M/97de7MVe7LV/67d+67u//uu//n246qqrrrrq/wP0oAc9iKuuuuqqq6666qqrrvqPdM011zz4xV7sxV77xV7sxV7rmmuuefCLvdiLvTYPcN9999169uzZW//+7//+t//hH/7hd/7hH/7ht7nqqqv+011zzTUP/qZv+qan33fffbd+/dd//fv8wz/8w29z1VVXXXXV/3XoQQ96EFddddVVV1111VVXXfWf6Zprrnnwi73Yi732i73Yi73WNddc8+AXe7EXe20e4OzZs8+47777nv73f//3v/0P//APv/MP//APv81VV131n+LDP/zDv+t1Xud13vsf/uEffvszP/MzX4errrrqqqv+r0MPetCDuOqqq6666qqrrrrqqv9K11xzzYNf7MVe7LVf7MVe7LWuueaaB7/Yi73Ya/MA9913361nz559xt///d//1j/8wz/8zj/8wz/8NlddddV/iDNnzjzom7/5m28F+MzP/MzX+Yd/+Iff5qqrrrrqqv/L0IMe9CCuuuqqq6666qqrrrrqv9OZM2ce9OIv/uKv82Iv9mKvdc011zz4xV7sxV6bB7jvvvtuBfiHf/iH3/mt3/qt7/6Hf/iH3+aqq676N3ud13md9/7wD//w7/qHf/iH3/7Mz/zM1+Gqq6666qr/y9CDHvQgrrrqqquuuuqqq6666n+Sa6655sEv9mIv9lov9mIv9trXXHPNg1/sxV7stXmA++6771aAf/iHf/jtf/iHf/id3/qt3/purrrqqhfZNddc8+DP+ZzP+a1rrrnmwZ/5mZ/5Ov/wD//w21x11VVXXfV/FXrQgx7EVVddddVVV1111VVX/U92zTXXPPjMmTMPfrEXe7HXevEXf/HXfrEXe7HX5rncd999t/7DP/zDb//DP/zD7/zWb/3Wd3PVVVe9UK/zOq/z3h/+4R/+Xffdd9+tH/IhH/IQrrrqqquu+r8KPehBD+Kqq6666qqrrrrqqqv+N7nmmmsefObMmQe/2Iu92Gu9+Iu/+Gu/2Iu92GvzXO67775b/+Ef/uG3/+Ef/uF3fuu3fuu7ueqqq57DNddc8+AP//AP/64Xe7EXe+2v//qvf5/f+q3f+m6uuuqqq676vwg96EEP4qqrrrrqqquuuuqqq/43u+aaax585syZB7/Yi73Ya734i7/4a7/Yi73Ya/Nczp49+4y///u//61/+Id/+J377rvv1n/4h3/4ba666v+513md13nvD//wD/+us2fPPuODP/iDH8xVV1111VX/F6EHPehBXHXVVVddddVVV1111f8lZ86ceZAkvdiLvdhrv87rvM57vdiLvdhr81zuu+++W//hH/7hd/7hH/7ht++7775b/+Ef/uG3ueqq/4c+93M/97de7MVe7LV/5Ed+5LN/9Ed/9HO46qqrrrrq/xr0oAc9iKuuuuqqq6666qqrrvq/7Jprrnmwbb/4i7/467zYi73Ya73O67zOe/Nc7rvvvlv/4R/+4bf/4R/+4Xfuu+++W//hH/7ht7nqqv8HXuzFXuy1P/dzP/e37rvvvls/5EM+5CFcddVVV131fw160IMexFVXXXXVVVddddVVV/1/c8011zz4xV7sxV7rxV7sxV77dV7ndd6b53Lffffd+g//8A+//Q//8A+/c9999936D//wD7/NVVf9H/U5n/M5v/XiL/7ir/1bv/Vb3/31X//178NVV1111VX/l6AHPehBXHXVVVddddVVV1111f9311xzzYNf7MVe7LVf7MVe7LVe53Ve5715Lvfdd9+t//AP//Db//AP//A79913363/8A//8NtcddX/EWfOnHnQN3/zN99633333fpZn/VZr3PffffdylVXXXXVVf9XoAc96EFcddVVV1111VVXXXXVVc/pmmuuefCLvdiLvfaLvdiLvdY111zz4Bd7sRd7bR7g7Nmzz7jvvvue/vd///e//Q//8A+/8w//8A+/zVVX/S/24R/+4d/1Oq/zOu/9W7/1W9/99V//9e/DVVddddVV/1egBz3oQVx11VVXXXXVVVddddVVL9w111zz4Bd7sRd77Rd7sRd7rWuuuebBL/ZiL/baPMB9991369mzZ5/x93//97/1D//wD7/zD//wD7/NVVf9L3LNNdc8+Ju+6Zueft9999369V//9e/zD//wD7/NVVddddVV/xegBz3oQVx11VVXXXXVVVddddVV/zpnzpx50Iu/+Iu/zou92Iu91jXXXPPgF3uxF3ttHuC+++679ezZs7f+wz/8w+/8/d///W//wz/8w29z1VX/w334h3/4d73O67zOe//DP/zDb3/mZ37m63DVVVddddX/BehBD3oQV1111VVXXXXVVVddddW/zzXXXPPgF3uxF3utF3uxF3vta6655sEv9mIv9to8wH333Xfr2bNnb73vvvtu/a3f+q3v+Yd/+Iff5qqr/oe55pprHvxN3/RNTwf4rM/6rNf5+7//+9/mqquuuuqq/+3Qgx70IK666qqrrrrqqquuuuqq/1jXXHPNg1/sxV7stV/sxV7sta655poHv9iLvdhr8wD33XffrQD/8A//8Nu/9Vu/9T3/8A//8NtcddX/AK/zOq/z3h/+4R/+XWfPnn3GB3/wBz+Yq6666qqr/rdDD3rQg7jqqquuuuqqq6666qqr/nNdc801D36xF3ux1z5z5syDXvzFX/y1X+zFXuy1eYCzZ88+w7b/4R/+4bf/4R/+4Xd+67d+67u56qr/Btdcc82DP+dzPue3rrnmmgd/5md+5uv8wz/8w29z1VVXXXXV/2boQQ96EFddddVVV1111VVXXXXVf61rrrnmwWfOnHnwi73Yi73Wi7/4i7/2i73Yi702z+Xs2bPP+Pu///vf+od/+Iff+a3f+q3v5qqr/ou8zuu8znt/+Id/+Hfdd999t37Ih3zIQ7jqqquuuup/M/SgBz2Iq6666qqrrrrqqquuuuq/15kzZx50zTXXPOTFXuzFXuvFX/zFX/vFXuzFXpvnct999936D//wD7/zD//wD7/9W7/1W9/NVVf9J7nmmmse/GEf9mHf9eIv/uKv/fVf//Xv81u/9VvfzVVXXXXVVf9boQc96EFcddVVV1111VVXXXXVVf+zXHPNNQ8+c+bMg6655pqHvM7rvM57vdiLvdhr81zuu+++W//hH/7ht//hH/7hd+67775b/+Ef/uG3ueqq/yAv9mIv9lqf+7mf+9v33XffrR/yIR/yEK666qqrrvrfCj3oQQ/iqquuuuqqq6666qqrrvqf7ZprrnkwwIu92Iu91uu8zuu894u92Iu9Ns/lvvvuu/Uf/uEffvsf/uEffue+++679R/+4R9+m6uu+nf43M/93N96sRd7sdf+rd/6re/++q//+vfhqquuuuqq/43Qgx70IK666qqrrrrqqquuuuqq/12uueaaBwO82Iu92Gu/2Iu92Gu9zuu8znvzXO67775b/+Ef/uG3/+Ef/uF37rvvvlv/4R/+4be56qp/hRd7sRd77c/93M/9rfvuu+/Wz/qsz3qd++6771auuuqqq6763wY96EEP4qqrrrrqqquuuuqqq6763++aa6558Iu92Iu99ou92Iu91uu8zuu8N8/l7Nmzz/j7v//73/qHf/iH37nvvvtu/Yd/+Iff5qqr/gWf+7mf+1sv9mIv9tq/9Vu/9d1f//Vf/z5cddVVV131vw160IMexFVXXXXVVVddddVVV131f88111zz4Bd7sRd77Rd7sRd7rdd5ndd5b57Lfffdd+s//MM//M4//MM//PZ999136z/8wz/8Nldd9VyuueaaB3/TN33T0++7775bv+EbvuF9/v7v//63ueqqq6666n8T9KAHPYirrrrqqquuuuqqq6666v++M2fOPOjFX/zFX+fFXuzFXuuaa6558Iu92Iu9Ng9w33333Xr27Nlb/+Ef/uF3/v7v//63/+Ef/uG3ueoq4MM//MO/63Ve53Xe+7d+67e+++u//uvfh6uuuuqqq/43QQ960IO46qqrrrrqqquuuuqqq/7/ueaaax78Yi/2Yq/1Yi/2Yq99zTXXPPjFXuzFXpsHuO+++249e/bsrX//93//2//wD//wO//wD//w21z1/9I111zz4G/6pm96OsBnfuZnvs4//MM//DZXXXXVVVf9b4Ee9KAHcdVVV1111VVXXXXVVVdddc011zz4xV7sxV77xV7sxV7rmmuuefCLvdiLvTYPcN9999169uzZW//+7//+t//hH/7hd/7hH/7ht7nq/413fMd3/Kx3eqd3+ux/+Id/+O3P/MzPfB2uuuqqq6763wI96EEP4qqrrrrqqquuuuqqq6666rldc801D36xF3ux136xF3ux17rmmmse/GIv9mKvzQOcPXv2Gffdd9/T77vvvlt/67d+63v+4R/+4be56v+sa6655sHf9E3f9HSAz/zMz3ydf/iHf/htrrrqqquu+t8APehBD+Kqq6666qqrrrrqqquuuupfcs011zz4xV7sxV77xV7sxV7rmmuuefCLvdiLvTYPcN99990qSX//93//W7/1W7/1Pf/wD//w21z1f8rrvM7rvPeHf/iHf9d9991364d8yIc8hKuuuuqqq/43QA960IO46qqrrrrqqquuuuqqq6761zpz5syDrrnmmoe82Iu92Gu9+Iu/+Gu/2Iu92GvzXO67775b/+Ef/uF3/uEf/uG3f+u3fuu7uep/tTNnzjzocz/3c3/7mmuuefDXf/3Xv89v/dZvfTdXXXXVVVf9T4ce9KAHcdVVV1111VVXXXXVVVdd9e91zTXXPPjMmTMPerEXe7HXfvEXf/HXfrEXe7HX5rncd999t/7DP/zDb//DP/zD7/zWb/3Wd3PV/zqv8zqv894f/uEf/l333XffrR/yIR/yEK666qqrrvqfDj3oQQ/iqquuuuqqq6666qqrrrrqP9o111zz4DNnzjz4xV7sxV7rxV/8xV/7xV7sxV6b53Lffffd+g//8A+//Q//8A+/81u/9VvfzVX/K3zu537ub73Yi73Ya3/913/9+/zWb/3Wd3PVVVddddX/ZOhBD3oQV1111VVXXXXVVVddddVV/9muueaaB585c+bB11xzzYNf53Ve571e7MVe7LV5Lvfdd9+t//AP//Db//AP//A79913363/8A//8Ntc9T/Oi73Yi732537u5/7Wfffdd+uHfMiHPISrrrrqqqv+J0MPetCDuOqqq6666qqrrrrqqquu+q92zTXXPBjgxV7sxV77dV7ndd7rxV7sxV6b53L27Nln/P3f//1v/cM//MPv3Hfffbf+wz/8w29z1f8In/u5n/tbL/ZiL/bav/Vbv/XdX//1X/8+XHXVVVdd9T8VetCDHsRVV1111VVXXXXVVVddddX/BNdcc82DX+zFXuy1X+zFXuy1Xud1Xue9eS733Xffrf/wD//wO//wD//w2/fdd9+t//AP//DbXPXf4pprrnnwN33TNz397Nmzz/jMz/zM177vvvtu5aqrrrrqqv+J0IMe9CCuuuqqq6666qqrrrrqqqv+Jzpz5syDXvzFX/x1XuzFXuy1Xud1Xue9eS733Xffrf/wD//w2//wD//wO/fdd9+t//AP//DbXPVf5sM//MO/63Ve53Xe+7d+67e+++u//uvfh6uuuuqqq/4nQg960IO46qqrrrrqqquuuuqqq6763+Caa6558Iu92Iu91ou92Iu99uu8zuu8N8/lvvvuu/Uf/uEffvsf/uEffue+++679R/+4R9+m6v+01xzzTUP/qZv+qan33fffbd+/dd//fv8wz/8w29z1VVXXXXV/zToQQ96EFddddVVV1111VVXXXXVVf8bXXPNNQ9+sRd7sdd+sRd7sde65pprHvxiL/Zir80D3HfffbeePXv21r//+7//7X/4h3/4nX/4h3/4ba76D/XhH/7h3/U6r/M67/0P//APv/2Zn/mZr8NVV1111VX/06AHPehBXHXVVVddddVVV1111VVX/V9wzTXXPPjFXuzFXvvFXuzFXuuaa6558Iu92Iu9Ng9w9uzZZ9x3331P//u///vf/od/+Iff+Yd/+Iff5qp/lzNnzjzom7/5m28F+MzP/MzX+Yd/+Iff5qqrrrrqqv9J0IMe9CCuuuqqq6666qqrrrrqqqv+L7rmmmse/GIv9mKv/WIv9mKvdc011zz4xV7sxV6bB7jvvvtuPXv27DP+/u///rf+4R/+4Xf+4R/+4be56l/tdV7ndd77wz/8w7/rH/7hH377Mz/zM1+Hq6666qqr/idBD3rQg7jqqquuuuqqq6666qqrrvr/4MyZMw968Rd/8dd5sRd7sde65pprHvxiL/Zir80D3HfffbcC/MM//MPv/NZv/dZ3/8M//MNvc9W/6Jprrnnw53zO5/zWNddc8+DP/MzPfJ1/+Id/+G2uuuqqq676nwI96EEP4qqrrrrqqquuuuqqq6666v+ja6655sEv9mIv9lov9mIv9trXXHPNg1/sxV7stXmA++6771aAf/iHf/jtf/iHf/id3/qt3/purnq+Xud1Xue9P/zDP/y77rvvvls/5EM+5CFcddVVV131PwV60IMexFVXXXXVVVddddVVV1111VVwzTXXPPjMmTMPfrEXe7HXevEXf/HXfrEXe7HX5rncd999t/7DP/zDb//DP/zD7/zWb/3Wd3PVZddcc82DP/zDP/y7XuzFXuy1v/7rv/59fuu3fuu7ueqqq6666n8C9KAHPYirrrrqqquuuuqqq6666qqrntc111zz4DNnzjz4xV7sxV7rxV/8xV/7xV7sxV6b53Lffffd+g//8A+//Q//8A+/81u/9Vvfzf9jL/ZiL/ban/u5n/tbZ8+efcYHf/AHP5irrrrqqqv+J0APetCDuOqqq6666qqrrrrqqquuuupfds011zz4zJkzD36xF3ux13rxF3/x136xF3ux1+a5nD179hl///d//1v/8A//8Dv33Xffrf/wD//w2/w/8rmf+7m/9WIv9mKv/Vu/9Vvf/fVf//Xvw1VXXXXVVf/d0IMe9CCuuuqqq6666qqrrrrqqquu+tc7c+bMgyTpxV7sxV77dV7ndd7rxV7sxV6b53Lffffd+g//8A+/8w//8A+/fd999936D//wD7/N/2Ev9mIv9tqf+7mf+1v33XffrZ/1WZ/1Ovfdd9+tXHXVVVdd9d8JPehBD+Kqq6666qqrrrrqqquuuuqqf79rrrnmwbb94i/+4q/zYi/2Yq/1Oq/zOu/Nc7nvvvtu/Yd/+Iff/od/+Iffue+++279h3/4h9/m/5jP+ZzP+a0Xf/EXf+3f+q3f+u6v//qvfx+uuuqqq67674Qe9KAHcdVVV1111VVXXXXVVVddddV/jmuuuebBL/ZiL/ZaL/ZiL/bar/M6r/PePJf77rvv1n/4h3/47X/4h3/4nfvuu+/Wf/iHf/ht/pc7c+bMg775m7/51vvuu+/Wr//6r3+ff/iHf/htrrrqqquu+u+CHvSgB3HVVVddddVVV1111VVXXXXVf41rrrnmwS/2Yi/22i/2Yi/2Wq/zOq/z3jyX++6779Z/+Id/+O1/+Id/+J377rvv1n/4h3/4bf4X+vAP//Dvep3XeZ33/q3f+q3v/vqv//r34aqrrrrqqv8u6EEPehBXXXXVVVddddVVV1111VVX/fe45pprHvxiL/Zir/1iL/Zir3XNNdc8+MVe7MVemwc4e/bsM/7+7//+t/7hH/7hd+67775b/+Ef/uG3+V/gmmuuefA3fdM3PR3gMz/zM1/nH/7hH36bq6666qqr/jugBz3oQVx11VVXXXXVVVddddVVV131P8M111zz4Bd7sRd77Rd7sRd7rWuuuebBL/ZiL/baPMB9991369mzZ5/x93//97/1D//wD7/zD//wD7/N/1Dv+I7v+Fnv9E7v9Nn/8A//8Nuf+Zmf+TpcddVVV1313wE96EEP4qqrrrrqqquuuuqqq6666qr/mc6cOfOgF3/xF3+dF3uxF3uta6655sEv9mIv9to8wH333Xfr2bNnb/2Hf/iH3/n7v//73/6Hf/iH3+Z/iGuuuebB3/RN3/R0gM/6rM96nb//+7//ba666qqrrvqvhh70oAdx1VVXXXXVVVddddVVV1111f8O11xzzYNf7MVe7LVe7MVe7LWvueaaB7/Yi73Ya/MA9913361nz5699e///u9/+x/+4R9+5x/+4R9+m/9Gr/M6r/PeH/7hH/5dZ8+efcYHf/AHP5irrrrqqqv+q6EHPehBXHXVVVddddVVV1111VVXXfW/0zXXXPPgF3uxF3vtF3uxF3uta6655sEv9mIv9to8wH333XcrwD/8wz/89m/91m99zz/8wz/8Nv+Frrnmmgd/zud8zm9dc801D/76r//69/mt3/qt7+aqq6666qr/SuhBD3oQV1111VVXXXXVVVddddVVV/3fcM011zz4xV7sxV77xV7sxV7rmmuuefCLvdiLvTYPcPbs2WfY9j/8wz/89j/8wz/8zm/91m99N//JXud1Xue9P/zDP/y77rvvvls/5EM+5CFcddVVV131Xwk96EEP4qqrrrrqqquuuuqqq6666qr/m6655poHnzlz5sEv9mIv9lov/uIv/tov9mIv9to8l7Nnzz7j7//+73/rH/7hH37nt37rt76bF+Caa6558H333Xcr/0rXXHPNgz/swz7su178xV/8tb/+67/+fX7rt37ru7nqqquuuuq/CnrQgx7EVVddddVVV1111VVXXXXVVf8/nDlz5kHXXHPNQ17sxV7stV78xV/8tV/sxV7stXku9913363/8A//8Dv/8A//8Nu/9Vu/9d080zd90zc9HeC3fuu3vvu3f/u3v+e+++67lRfRi73Yi73W537u5/72fffdd+uHfMiHPISrrrrqqqv+q6AHPehBXHXVVVddddVVV1111VVXXfX/0zXXXPPgM2fOPOjFXuzFXvvFX/zFX/vFXuzFXpvnct9999169uzZW1/sxV7stXmm++6779azZ8/e+lu/9Vvf81u/9VvfzYvgcz/3c3/rxV7sxV77t37rt77767/+69+Hq6666qqr/iugBz3oQVx11VVXXXXVVVddddVVV111FcA111zzYIAXe7EXe63XeZ3Xee8Xe7EXe23+Bffdd9+t//AP//Dbv/Vbv/U9//AP//DbvADXXHPNg7/pm77p6ffdd9+tn/VZn/U69913361cddVVV131nw096EEP4qqrrrrqqquuuuqqq6666qqrnp9rrrnmwQDf9E3f9HReBPfdd9+tv/3bv/09P/IjP/LZPB+f+7mf+1sv9mIv9tq/9Vu/9d1f//Vf/z5cddVVV131n41y/Phxrrrqqquuuuqqq6666qqrrrrq+Tk8PNx9xVd8xbd+xVd8xbfmRbC5uXn8xV7sxV77dV7ndd77IQ95yEsfHh5eOnv27K080z/8wz/8zpu/+Zt/9Obm5vFnPOMZf3PffffdylVXXXXVVf+Z0IMe9CCuuuqqq6666qqrrrrqqquuuupfcubMmQddc801D7nmmmseDPBiL/Zir3XNNdc8GODFXuzFXpsX4L777rv1H/7hH37nH/7hH377vvvuu/Wt3uqt3vjlXu7lPokHeLu3eztx1VVXXXXVfwb0oAc9iKuuuuqqq6666qqrrrrqqquu+ve65pprHgxw5syZB11zzTUPebEXe7HXuuaaax78Yi/2Yq/Nv+BzPudzbvjbv/3bu7nqqquuuuo/GnrQgx7EVVddddVVV1111VVXXXXVVVf9Z7nmmmse/GIv9mKv9WIv9mKvfc011zz4xV7sxV6b5/IP//APv/2Zn/mZr8NVV1111VX/0ahcddVVV1111VVXXXXVVVddddV/ovvuu+/W++6779bf+q3f+h6An/iJnzDP5Z577vk9rrrqqquu+s9AcNVVV1111VVXXXXVVVddddVV/4VsJ8/lG7/xGz+Tq6666qqr/jOgBz3oQVx11VVXXXXVVVddddVVV1111X+1D/uwD/vOv/qrv/rqP/zDP/xbrrrqqquu+s+CHvSgB3HVVVddddVVV1111VVXXXXVVVddddVVV/2fROWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/Ff8IIVpCv013VJMAAAAASUVORK5CYII=) diff --git a/docs/kcl/profileStartY.md b/docs/kcl/profileStartY.md index 8fc7c885a..0e9195514 100644 --- a/docs/kcl/profileStartY.md +++ b/docs/kcl/profileStartY.md @@ -29,8 +29,8 @@ profileStartY(sketch: Sketch) -> number ```js sketch001 = startSketchOn('XY') |> startProfileAt([5, 2], %) - |> angledLine({ angle: -60, length: 14 }, %) - |> angledLineToY({ angle: 30, to: profileStartY(%) }, %) + |> angledLine({ angle = -60, length = 14 }, %) + |> angledLineToY({ angle = 30, to = profileStartY(%) }, %) ``` ![Rendered example of profileStartY 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAB5AElEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KoKrrrrqqv9APhMPWn7/qcPlj5326rtOnZ9ed/5+PFCnWXul2dstf+y0lz922qtvOXlHXlcezlVXXXXVVVddddVVV1111VVXXfWfgcpVV1111X+UQvWpuImZNgCYPOqu6Uk8UKX3jfFIAIxZcxRn8+lcddVVV1111VVXXXXVVVddddVV/xmoXHXVVVf9Rynq8rr6CO7XGOKefDIP4EKX15dHAdAY4972VJobV1111VVXXXXVVVddddVVV1111X8GKlddddVV/0Fc6Xx9PBwAkzrwRe3mPTxQVe/r6yMBmDzqrumJXHXVVVddddVVV1111VVXXXXVVf9ZqFx11VVX/Ucp9L6uPAKAyaPunp7Ec6t0vrE8CoDGoLvak7jqqquuuuqqq6666qqrrrrqqqv+s1C56qqrrvqPUtX5hvoIACYG3dWezAMFxTs64y2dBNDkMe5qT+Sqq6666qqrrrrqqquuuuqqq676z0Llqquuuuo/SqHztfFwADVG3Z1P5IGKOt9QH839JgbdlU/iqquuuuqqq6666qqrrrrqqquu+s9C5aqrrrrqP0JQfDyu80LbAEwe4u7pKTyAO+b5sPpyAJjkyHu60O7gqquuuuqqq6666qqrrrrqqquu+s9C5aqrrrrqP0JR5zPlQdwvabroO7mfENs62V519k4ATB7jnvZkjLnqqquuuuqqq6666qqrrrrqqqv+s1C56qqrrvqPEIQ3dZxnE5WeZ/KGjo9vtfhEn4wbAWiMcdf0RK76D3PNNdc8+MVe7MVem+dy33333foP//APv81VV1111VVXXXXV83HNNdc8+MVe7MVem+dy33333foP//APv81VV1111VX/21G56qqrrvqPkCRH3uOZvKFj05ssPqL+yNFneYtT7U0XH+GH1JfVkfe8oR1NDNyVT+Kq/zCv/dqv/V7v9E7v9Nk8lx/5kR/57H/4h3/4ba666qqrrrrqqquej9d+7dd+r3d6p3f6bJ7Lj/zIj3z2P/zDP/w2V1111VVX/W9HcNVVV131H6F5KHe3J6kxATDX5vTG8w9f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Kt/Nf6A/ZP1bD1d97MIbmzvEsadpfOJP6Oh7/0Tr330605MfTH3463n+FgXqEzX93a+w/Mlf1vKn7lK7PaFx1WX/8A//8Ns/8iM/8tnv9E7v9Nnv+I7v+Fn33Xffrf/wD//w21x11VVXXXXV/zLXXHPNg1/7tV/7vV78xV/8dV7sxV7stXgu9913362/9Vu/9d3/8A//8Dv/8A//8NtcddVVV1111f9t6EEPehBXXXXVVS/MfD7XarUy/0MJ9BDXRz6c+pgeze6j3fUkTf9wibxYUfco1xd/EPVhgO6m3f4UTY/fJy8ZzFXP4x3f8R0/653e6Z0++7777rv1sz7rs17nvvvuu5Wrrrrqqquu+h/smmuuefBrv/Zrv9eLv/iLv/aLvdiLvTbP5b777rv1t37rt777H/7hH37nH/7hH36bq6666qqrrvr/BT3oQQ/iqquuuuqqq+53zTXXPPjDP/zDv+vFXuzFXvu+++679UM+5EMewlVXXXXVVVf9D3LNNdc8+LVf+7Xf68Vf/MVf+8Ve7MVem+dy33333fpbv/Vb3/0P//APv/0P//APv8NVV1111VVX/f+GHvSgB3HVVVddddVVD3TNNdc8+HM+53N+65prrnnwb/3Wb33313/9178PV1111VVXXfXf5Jprrnnwa7/2a7/Xi7/4i7/2i73Yi702z+W+++679bd+67e++x/+4R9+5x/+4R9+m6uuuuqqq6666oHQgx70IK666qqrrrrquV1zzTUP/qZv+qanA/zIj/zIZ//oj/7o53DVVVddddVV/wWuueaaB7/2a7/2e734i7/4a7/Yi73Ya/Nc7rvvvlt/67d+67vPnj37jN/6rd/6bq666qqrrrrqqhcGPehBD+Kqq6666qqrnp/XeZ3Xee8P//AP/6777rvv1q//+q9/n3/4h3/4ba666qqrrrrqP9g111zz4Nd+7dd+rxd/8Rd/nRd7sRd7LZ7Lfffdd+tv/dZvfTfAj/7oj34OV1111VVXXXXVvwZ60IMexFVXXXXVVVe9IO/4ju/4We/0Tu/02ffdd9+tn/VZn/U69913361cddVVV1111b/DNddc8+DXfu3Xfi+Ad3qnd/psnst9991362/91m99N8CP/uiPfg5XXXXVVVddddW/B3rQgx7EVVddddVVV70g11xzzYM//MM//Lte7MVe7LXvu+++Wz/kQz7kIVx11VVXXXXVv8I111zz4Nd+7dd+L4B3eqd3+myey3333Xfrb/3Wb303wI/+6I9+DlddddVVV1111X8k9KAHPYirrrrqqquuemGuueaaB3/O53zOb11zzTUP/q3f+q3v/vqv//r34aqrrrrqqqtegGuuuebBr/3ar/1eAO/0Tu/02TyX++6779Z/+Id/+O377rvv1t/+7d/+nvvuu+9Wrrrqqquuuuqq/yzoQQ96EFddddVVV131L7nmmmse/E3f9E1PB/iRH/mRz/7RH/3Rz+Gqq6666qqrgGuuuebBr/3ar/1eAO/0Tu/02TyX++6779Z/+Id/+O377rvv1t/+7d/+nvvuu+9Wrrrqqquuuuqq/yroQQ96EFddddVVV131onid13md9/7wD//w77rvvvtu/fqv//r3+Yd/+Iff5qqrrrrqqv93rrnmmge/2Iu92GufOXPmQa/zOq/z3tdcc82DeYD77rvv1rNnz97693//97/9D//wD7/zD//wD7/NVVddddVVV1313wU96EEP4qqrrrrqqqteVO/4ju/4We/0Tu/02ffdd9+tn/VZn/U69913361cddVVV131f9o111zz4DNnzjz4xV7sxV7rdV7ndd77mmuueTAPcN9999169uzZW//+7//+t//hH/7ht//hH/7hd7jqqquuuuqqq/6nQA960IO46qqrrrrqqn+ND//wD/+u13md13nv++6779YP+ZAPeQhXXXXVVVf9n3LNNdc8+MyZMw9+sRd7sdd68Rd/8dd+sRd7sdfmAe67775bz549e+vf//3f//Y//MM//M4//MM//DZXXXXVVVddddX/VOhBD3oQV1111VVXXfWvcc011zz4wz/8w7/rxV7sxV77H/7hH377Mz/zM1+Hq6666qqr/te65pprHnzmzJkHv9iLvdhrvfiLv/hrv9iLvdhr81zuu+++W3/rt37ru//hH/7hd/7hH/7ht7nqqquuuuqqq/63QA960IO46qqrrrrqqn+ta6655sGf8zmf81vXXHPNg3/kR37ks3/0R3/0c7jqqquuuup/hWuuuebBZ86cefCLvdiLvdaLv/iLv86LvdiLvRbP5b777rv1t37rt777H/7hH37nH/7hH36bq6666qqrrrrqfyv0oAc9iKuuuuqqq676t7jmmmse/E3f9E1PB/iRH/mRz/7RH/3Rz+Gqq6666qr/ka655poHv/Zrv/Z7vfiLv/hrv9iLvdhr81zuu+++W3/rt37ru//hH/7hd/7hH/7ht7nqqquuuuqqq/6vQA960IO46qqrrrrqqn+r13md13nvD//wD/+u++6779av//qvf59/+Id/+G2uuuqqq676b3fNNdc8+LVf+7Xf68Vf/MVf+8Ve7MVem+dy33333fpbv/Vb3/0P//APv/0P//APv8NVV1111VVXXfV/FXrQgx7EVVddddVVV/17vOM7vuNnvdM7vdNn33fffbd+1md91uvcd999t3LVVVddddV/qWuuuebBr/3ar/1eL/7iL/7aL/ZiL/baPJf77rvv1t/6rd/67n/4h3/4nX/4h3/4ba666qqrrrrqqv8v0IMe9CCuuuqqq6666t/jmmuuefCHf/iHf9eLvdiLvfZ9991364d8yIc8hKuuuuqqq/5TXXPNNQ9+7dd+7fd68Rd/8dd+sRd7sdfmudx33323/tZv/dZ3/8M//MPv/MM//MNvc9VVV1111VVX/X+FHvSgB3HVVVddddVV/17XXHPNgz/ncz7nt6655poH/9Zv/dZ3f/3Xf/37cNVVV1111X+Ya6655sGv/dqv/V4v/uIv/jov9mIv9lo8l/vuu+/W3/qt3/pugB/90R/9HK666qqrrrrqqquuQA960IO46qqrrrrqqv8I11xzzYO/6Zu+6ekAP/IjP/LZP/qjP/o5XHXVVVdd9W9yzTXXPPi1X/u13+uaa6558Ou8zuu8N8/lvvvuu/W3fuu3vhvgR3/0Rz+Hq6666qqrrrrqqucPPehBD+Kqq6666qqr/qO8zuu8znt/+Id/+Hfdd999t37913/9+/zDP/zDb3PVVVddddW/6Jprrnnwa7/2a78XwDu90zt9Ns/lvvvuu/W3fuu3vhvgR3/0Rz+Hq6666qqrrrrqqhcNetCDHsRVV1111VVX/Ud6x3d8x896p3d6p8++7777bv2sz/qs17nvvvtu5aqrrrrqqudwzTXXPPi1X/u13wvgnd7pnT6b53Lffffd+g//8A+/fd999936oz/6o5/DVVddddVVV1111b8NetCDHsRVV1111VVX/Ue65pprHvzhH/7h3/ViL/Zir33ffffd+iEf8iEP4aqrrrrq/7lrrrnmwa/92q/9XgDv9E7v9Nk8l/vuu+/Wf/iHf/jt++6779bf/u3f/p777rvvVq666qqrrrrqqqv+/dCDHvQgrrrqqquuuuo/2jXXXPPgz/mcz/mta6655sG/9Vu/9d1f//Vf/z5cddVVV/0/cs011zz4xV7sxV77zJkzD3qd13md977mmmsezAPcd999t549e/bWv//7v//t3/7t3/6e++6771auuuqqq6666qqr/uOhBz3oQVx11VVXXXXVf4Zrrrnmwd/0Td/0dIAf+ZEf+ewf/dEf/Ryuuuqqq/6Puuaaax78Yi/2Yq995syZB73O67zOe19zzTUP5gHuu+++W8+ePXvr3//93//2P/zDP/z2P/zDP/wOV1111VVXXXXVVf/50IMe9CCuuuqqq6666j/L67zO67z3h3/4h3/Xfffdd+uP/uiPfs5v/dZvfTdXXXXVVf8HXHPNNQ8+c+bMg1/sxV7stV78xV/8tV/sxV7stXmA++6779azZ8/e+vd///e//Q//8A+/8w//8A+/zVVXXXXVVVddddV/PSpXXXXVVVdd9Z/ot37rt777zJkzD3qnd3qnz37Hd3zHz/qHf/iH377vvvtu5aqrrrrqf5lrrrnmwWfOnHnwi73Yi73Wi7/4i7/2i73Yi702z+W+++679bd+67e++x/+4R9+5x/+4R9+m6uuuuqqq6666qr/fuhBD3oQV1111VVXXfWf7R3f8R0/653e6Z0++7777rv1Qz7kQx7CVVddddX/cNdcc82Dz5w58+AXe7EXe60Xf/EXf50Xe7EXey2ey3333Xfrb/3Wb333P/zDP/zOP/zDP/w2V1111VVXXXXVVf/zoAc96EFcddVVV1111X+2a6655sEf/uEf/l0v9mIv9tr/8A//8Nuf+Zmf+TpcddVVV/0Pc8011zz4tV/7td/rxV/8xV/7xV7sxV6b53Lffffd+lu/9Vvf/Q//8A+/8w//8A+/zVVXXXXVVVddddX/fOhBD3oQV1111VVXXfVf4Zprrnnw53zO5/zWNddc8+Af+ZEf+ewf/dEf/Ryuuuqqq/4bXXPNNQ9+7dd+7fd68Rd/8dd+sRd7sdfmudx33323/tZv/dZ3/8M//MNv/8M//MPvcNVVV1111VVXXfW/D3rQgx7EVVddddVVV/1Xueaaax78Td/0TU8H+JEf+ZHP/tEf/dHP4aqrrrrqv8g111zz4Nd+7dd+rxd/8Rd/7Rd7sRd7bZ7Lfffdd+tv/dZvffc//MM//M4//MM//DZXXXXVVVddddVV//uhBz3oQVx11VVXXXXVf6XXeZ3Xee8P//AP/6777rvv1q//+q9/n3/4h3/4ba666qqr/hNcc801D37t137t93rxF3/x136xF3ux1+a53Hfffbf+1m/91nf/wz/8w+/8wz/8w29z1VVXXXXVVVdd9X8PetCDHsRVV1111VVX/Vd7x3d8x896p3d6p8++7777bv2sz/qs17nvvvtu5aqrrrrq3+maa6558Gu/9mu/14u/+Iu/zou92Iu9Fs/lvvvuu/W3fuu3vhvgR3/0Rz+Hq6666qqrrrrqqv/70IMe9CCuuuqqq6666r/aNddc8+AP//AP/64Xe7EXe+377rvv1g/5kA95CFddddVV/0rXXHPNg1/7tV/7vV78xV/8tV/sxV7stXku9913362/9Vu/9d0AP/qjP/o5XHXVVVddddVVV/3/gx70oAdx1VVXXXXVVf8drrnmmgd/zud8zm9dc801D/6t3/qt7/76r//69+Gqq6666oW45pprHvzar/3a7wXwTu/0Tp/Nc7nvvvtu/a3f+q3vBvjRH/3Rz+Gqq6666qqrrrrqKvSgBz2Iq6666qqrrvrvcs011zz4m77pm54O8CM/8iOf/aM/+qOfw1VXXXXVM11zzTUPfu3Xfu33Anind3qnz+a53Hfffbf+1m/91ncD/OiP/ujncNVVV1111VVXXXXVc0MPetCDuOqqq6666qr/Tq/zOq/z3h/+4R/+Xffdd9+tX//1X/8+//AP//DbXHXVVf8vXXPNNQ9+7dd+7fcCeKd3eqfP5rncd999t/7DP/zDb9933323/vZv//b33Hfffbdy1VVXXXXVVVddddULgx70oAdx1VVXXXXVVf/d3vEd3/Gz3umd3umz77vvvls/67M+63Xuu+++W7nqqqv+z7vmmmse/GIv9mKvfebMmQe90zu902fzXO67775bz549e+vf//3f//Zv//Zvf8999913K1ddddVVV1111VVX/WugBz3oQVx11VVXXXXVf7drrrnmwe/4ju/4Wa/zOq/z3vfdd9+tH/IhH/IQrrrqqv9zrrnmmge/2Iu92GufOXPmQa/zOq/z3tdcc82DeYD77rvv1rNnz97693//97/9D//wD7/9D//wD7/DVVddddVVV1111VX/HuhBD3oQV1111VVXXfU/wTXXXPPgz/mcz/mta6655sG/9Vu/9d1f//Vf/z5cddVV/6tdc801Dz5z5syDX+zFXuy1Xud1Xue9r7nmmgfzAPfdd9+tZ8+evfXv//7vf/sf/uEffucf/uEffpurrrrqqquuuuqqq/4joQc96EFcddVVV1111f8U11xzzYO/6Zu+6ekAP/IjP/LZP/qjP/o5XHXVVf9rXHPNNQ8+c+bMg1/sxV7stV78xV/8tV/sxV7stXmA++6779azZ8/e+vd///e//Q//8A+/8w//8A+/zVVXXXXVVVddddVV/5nQgx70IK666qqrrrrqf5IXe7EXe+3P/dzP/S2Ar//6r3+f3/qt3/purrrqqv+RrrnmmgefOXPmwS/2Yi/2Wi/+4i/+Oi/2Yi/2WjyX++6779bf+q3f+u5/+Id/+J1/+Id/+G2uuuqqq6666qqrrvqvhB70oAdx1VVXXXXVVf/TvOM7vuNnvdM7vdNn33fffbd+/dd//fv8wz/8w29z1VVX/Y9wzTXXPPi1X/u13+vFX/zFX/vFXuzFXpvnct999936W7/1W9/9D//wD7/zD//wD7/NVVddddVVV1111VX/ndCDHvQgrrrqqquuuup/ond8x3f8rHd6p3f67Pvuu+/Wz/qsz3qd++6771auuuqq/3LXXHPNg1/7tV/7vV78xV/8tV/sxV7stXku9913362/9Vu/9d3/8A//8Nv/8A//8DtcddVVV1111VVXXfU/CXrQgx7EVVddddVVV/1PdM011zz4wz/8w7/rxV7sxV77H/7hH377Mz/zM1+Hq6666j/dNddc8+DXfu3Xfq8Xf/EXf+0Xe7EXe22ey3333Xfrb/3Wb333P/zDP/zOP/zDP/w2V1111VVXXXXVVVf9T4Ye9KAHcdVVV1111VX/U11zzTUP/pzP+Zzfuuaaax78Iz/yI5/9oz/6o5/DVVdd9R/qmmuuefBrv/Zrv9eLv/iLv/aLvdiLvTbP5b777rv1t37rt777H/7hH37nH/7hH36bq6666qqrrrrqqqv+N0EPetCDuOqqq6666qr/ya655poHf9M3fdPTAX7kR37ks3/0R3/0c7jqqqv+za655poHv/Zrv/Z7vfiLv/jrvNiLvdhr8Vzuu+++W3/rt37ru//hH/7hd/7hH/7ht7nqqquuuuqqq6666n8z9KAHPYirrrrqqquu+p/udV7ndd77wz/8w7/rvvvuu/Xrv/7r3+cf/uEffpurrrrqRXLNNdc8+LVf+7Xf68Vf/MVf+8Ve7MVem+dy33333fpbv/Vb3w3woz/6o5/DVVddddVVV1111VX/l6AHPehBXHXVVVddddX/Bu/4ju/4We/0Tu/02ffdd9+tn/VZn/U69913361cddVVz+Oaa6558Gu/9mu/F8A7vdM7fTbP5b777rv1t37rt74b4Ed/9Ec/h6uuuuqqq6666qqr/i9DD3rQg7jqqquuuuqq/w2uueaaB3/4h3/4d73Yi73Ya9933323fsiHfMhDuOqqq7jmmmse/Nqv/drvBfBO7/ROn81zue+++279rd/6re8G+NEf/dHP4aqrrrrqqquuuuqq/0/Qgx70IK666qqrrrrqf4trrrnmwZ/zOZ/zW9dcc82Df+u3fuu7v/7rv/59uOqq/2euueaaB7/2a7/2ewG80zu902fzXO67775b/+Ef/uG377vvvlt/+7d/+3vuu+++W7nqqquuuuqqq6666v8r9KAHPYirrrrqqquu+t/kmmuuefA3fdM3PR3gR37kRz77R3/0Rz+Hq676P+yaa6558Gu/9mu/F8A7vdM7fTbP5b777rv1H/7hH377vvvuu/W3f/u3v+e+++67lauuuuqqq6666qqrrroCPehBD+Kqq6666qqr/rd5ndd5nff+8A//8O+67777bv36r//69/mHf/iH3+aqq/6PuOaaax78Yi/2Yq995syZB73O67zOe19zzTUP5gHuu+++W8+ePXvr3//93//2P/zDP/z2P/zDP/wOV1111VVXXXXVVVdd9fyhBz3oQVx11VVXXXXV/0bv+I7v+Fnv9E7v9Nn33XffrZ/1WZ/1Ovfdd9+tXHXV/0LXXHPNg8+cOfPgF3uxF3ut13md13nva6655sE8wH333Xfr2bNnb/37v//73/6Hf/iH3/mHf/iH3+aqq6666qqrrrrqqqteNOhBD3oQV1111VVXXfW/1Yd/+Id/1+u8zuu893333Xfrh3zIhzyEq676X+Caa6558JkzZx78Yi/2Yq/14i/+4q/9Yi/2Yq/NA9x33323nj179ta///u//+1/+Id/+J1/+Id/+G2uuuqqq6666qqrrrrq3wY96EEP4qqrrrrqqqv+t7rmmmse/OEf/uHf9WIv9mKv/Vu/9Vvf/fVf//Xvw1VX/Q9zzTXXPPjMmTMPfrEXe7HXevEXf/HXebEXe7HX4rncd999t/7Wb/3Wd//DP/zD7/zDP/zDb3PVVVddddVVV1111VX/MdCDHvQgrrrqqquuuup/s2uuuebB3/RN3/R0gB/5kR/57B/90R/9HK666r/RNddc8+AzZ848+MVe7MVe68Vf/MVf+8Ve7MVem+dy33333fpbv/Vb3/0P//APv/MP//APv81VV1111VVXXXXVVVf950APetCDuOqqq6666qr/7V7sxV7stT/3cz/3twC+/uu//n1+67d+67u56qr/Qtdcc82DX/u1X/u9XvzFX/y1X+zFXuy1eS733Xffrb/1W7/13f/wD//w2//wD//wO1x11VVXXXXVVVddddV/DfSgBz2Iq6666qqrrvq/4B3f8R0/653e6Z0++7777rv167/+69/nH/7hH36bq676T3LNNdc8+LVf+7Xf68Vf/MVf+8Ve7MVem+dy33333fpbv/Vb3/0P//APv/MP//APv81VV1111VVXXXXVVVf990APetCDuOqqq6666qr/K97xHd/xs97pnd7ps++7775bP+uzPut17rvvvlu56qr/ANdcc82DX/u1X/u9XvzFX/y1X+zFXuy1eS733Xffrb/1W7/13f/wD//wO//wD//w21x11VVXXXXVVVddddX/DOhBD3oQV1111VVXXfV/xTXXXPPgD//wD/+uF3uxF3vt++6779YP+ZAPeQhXXfVvcM011zz4tV/7td/rxV/8xV/nxV7sxV6L53Lffffd+lu/9Vvf/Q//8A+/8w//8A+/zVVXXXXVVVddddVVV/3PhB70oAdx1VVXXXXVVf+XXHPNNQ/+nM/5nN+65pprHvxbv/Vb3/31X//178NVV/0Lrrnmmge/9mu/9nu9+Iu/+Gu/2Iu92GvzXO67775bf+u3fuu7AX70R3/0c7jqqquuuuqqq6666qr/HdCDHvQgrrrqqquuuur/mmuuuebB3/RN3/R0gB/5kR/57B/90R/9HK666gGuueaaB7/2a7/2e11zzTUPfp3XeZ335rncd999t/7Wb/3WdwP86I/+6Odw1VVXXXXVVVddddVV/zuhBz3oQVx11VVXXXXV/0Wv8zqv894f/uEf/l333XffrV//9V//Pv/wD//w21z1/9Y111zz4Nd+7dd+L4B3eqd3+myey3333Xfrb/3Wb303wI/+6I9+DlddddVVV1111VVXXfV/A3rQgx7EVVddddVVV/1f9Y7v+I6f9U7v9E6ffd999936WZ/1Wa9z33333cpV/y9cc801D37t137t9wJ4p3d6p8/mudx33323/sM//MNv33fffbf+6I/+6Odw1VVXXXXVVVddddVV/zehBz3oQVx11VVXXXXV/1XXXHPNgz/8wz/8u17sxV7ste+7775bP+RDPuQhXPV/0jXXXPPg137t134vgHd6p3f6bJ7Lfffdd+s//MM//PZ9991362//9m9/z3333XcrV1111VVXXXXVVVdd9X8fetCDHsRVV1111VVX/V92zTXXPPhzPudzfuuaa6558G/91m9999d//de/D1f9r3fNNdc8+MVe7MVe+8yZMw96ndd5nfe+5pprHswD3HfffbeePXv21r//+7//7d/+7d/+nvvuu+9Wrrrqqquuuuqqq6666v8f9KAHPYirrrrqqquu+r/ummuuefA3fdM3PR3gR37kRz77R3/0Rz+Hq/5Xueaaax78Yi/2Yq995syZB73O67zOe19zzTUP5gHuu+++W8+ePXvr3//93//2P/zDP/zOP/zDP/w2V1111VVXXXXVVVdddRV60IMexFVXXXXVVVf9f/A6r/M67/3hH/7h33Xffffd+vVf//Xv8w//8A+/zVX/Y11zzTUPPnPmzINf7MVe7LVe/MVf/LVf7MVe7LV5gPvuu+/Ws2fP3vr3f//3v/0P//APv/MP//APv81VV1111VVXXXXVVVdd9dzQgx70IK666qqrrrrq/4t3fMd3/Kx3eqd3+uz77rvv1s/6rM96nfvuu+9Wrvof4ZprrnnwmTNnHvxiL/Zir/XiL/7ir/1iL/Zir81zue+++279rd/6re/+h3/4h9/5h3/4h9/mqquuuuqqq6666qqrrvqXoAc96EFcddVVV1111f8nH/7hH/5dr/M6r/Pe9913360f8iEf8hCu+m9xzTXXPPjMmTMPfrEXe7HXevEXf/HXfrEXe7HX5rncd999t/7Wb/3Wd//DP/zD7/zDP/zDb3PVVVddddVVV1111VVX/WuhBz3oQVx11VVXXXXV/yfXXHPNgz/8wz/8u17sxV7stX/rt37ru7/+67/+fbjqv8Q111zz4Nd+7dd+rxd/8Rd/7Rd7sRd7bZ7Lfffdd+tv/dZvffc//MM//M4//MM//DZXXXXVVVddddVVV1111b8XetCDHsRVV1111VVX/X9zzTXXPPhzPudzfuuaa6558I/8yI989o/+6I9+Dlf9h7vmmmse/Nqv/drv9eIv/uKv/WIv9mKvzXO57777bv2t3/qt7/6Hf/iH3/mHf/iH3+aqq6666qqrrrrqqquu+o+GHvSgB3HVVVddddVV/x+92Iu92Gt/7ud+7m8B/MiP/Mhn/+iP/ujncNW/yzXXXPPg137t136vF3/xF3/tF3uxF3ttnst9991362/91m999z/8wz/8zj/8wz/8NlddddVVV1111VVXXXXVfzb0oAc9iKuuuuqqq676/+p1Xud13vvDP/zDv+u+++679eu//uvf5x/+4R9+m6teZNdcc82DX/u1X/u9XvzFX/y1X+zFXuy1eS733Xffrb/1W7/13f/wD//wO//wD//w21x11VVXXXXVVVddddVV/9XQgx70IK666qqrrrrq/7N3fMd3/Kx3eqd3+uz77rvv1s/6rM96nfvuu+9Wrnq+rrnmmge/9mu/9nu9+Iu/+Gu/2Iu92GvzXO67775bf+u3fuu7AX70R3/0c7jqqquuuuqqq6666qqr/ruhBz3oQVx11VVXXXXV/2fXXHPNgz/8wz/8u17sxV7ste+7775bP+RDPuQhXHXZNddc8+DXfu3Xfq8Xf/EXf+0Xe7EXe22ey3333Xfrb/3Wb303wI/+6I9+DlddddVVV1111VVXXXXV/zToQQ96EFddddVVV131/90111zz4M/5nM/5rWuuuebBv/Vbv/XdX//1X/8+/D90zTXXPPi1X/u13wvgnd7pnT6b53Lffffd+lu/9VvfDfCjP/qjn8NVV1111VVXXXXVVVdd9T8detCDHsRVV1111VVXXQXXXHPNg7/pm77p6QA/8iM/8tk/+qM/+jn8H3fNNdc8+LVf+7XfC+Cd3umdPpvnct999936W7/1W98N8KM/+qOfw1VXXXXVVVddddVVV131vw160IMexFVXXXXVVVdddcXrvM7rvPeHf/iHf9d9991369d//de/zz/8wz/8Nv+HXHPNNQ9+7dd+7fcCeKd3eqfP5rncd999t/7DP/zDb9933323/vZv//b33Hfffbdy1VVXXXXVVVddddVVV/1vhh70oAdx1VVXXXXVVVc92zu+4zt+1ju90zt99n333XfrZ33WZ73Offfddyv/S11zzTUPfrEXe7HXPnPmzIPe6Z3e6bN5Lvfdd9+tZ8+evfXv//7vf/u3f/u3v+e+++67lauuuuqqq6666qqrrrrq/xL0oAc9iKuuuuqqq6666tmuueaaB3/4h3/4d73Yi73Ya9933323fsiHfMhD+F/immuuefCLvdiLvfaZM2ce9Dqv8zrvfc011zyYB7jvvvtuPXv27K1///d//9v/8A//8Dv/8A//8NtcddVVV1111VVXXXXVVf+XoQc96EFcddVVV1111VXP6Zprrnnw53zO5/zWNddc8+Df+q3f+u4f/dEf/ZwzZ848+MVe7MVe68Vf/MVf+0d+5Ec+5x/+4R9+m/9m11xzzYPPnDnz4Bd7sRd7rdd5ndd572uuuebBPMB9991369mzZ2/9+7//+9/+h3/4h9/5h3/4h9/mqquuuuqqq6666qqrrvr/BD3oQQ/iqquuuuqqq656Ttdcc82DX/u1X/u93umd3umzeT5+5Ed+5LN/9Ed/9HP4L3bNNdc8+MyZMw9+sRd7sdd68Rd/8dd+sRd7sdfmAe67775bz549e+vf//3f//Y//MM//M4//MM//DZXXXXVVVddddVVV1111f9nVK666qqrrrrqqme55pprHvw5n/M5v3XNNdc8mBfixV/8xV/7R3/0Rz+H/2TXXHPNg8+cOfPgF3uxF3utF3/xF3/tF3uxF3ttnst9991362/91m999z/8wz/8zj/8wz/8NlddddVVV1111VVXXXXVVc9G5aqrrrrqqquuepb77rvv1h/90R/9nHd8x3f8rGuuuebBvABnzpx5MP9Jrrnmmge/9mu/9nu9+Iu/+Gu/2Iu92GvzXO67775bf+u3fuu7/+Ef/uF3/uEf/uG3ueqqq6666qqrrrrqqquuesHQgx70IK666qqrrrrqqud0zTXXPPi1X/u13+ud3umdPpsX4O3e7u3Ef4Brrrnmwa/92q/9Xi/+4i/+2i/2Yi/22jyX++6779bf+q3f+u5/+Id/+J1/+Id/+G2uuuqqq6666qqrrrrqqqtedOhBD3oQV1111VVXXXXV83fNNdc8+MM//MO/68Ve7MVem+fymZ/5ma/zD//wD7/Nv9I111zz4Nd+7dd+rxd/8Rd/7Rd7sRd7bZ7Lfffdd+tv/dZvffc//MM//M4//MM//DZXXXXVVVddddVVV1111VX/dlSuuuqqq6666qoX6L777rv167/+69/ntV/7td/rnd7pnT6bB3ixF3ux1/qHf/iH3+ZfcM011zz4tV/7td/rxV/8xV/7xV7sxV6b53Lffffd+lu/9Vvf/Q//8A+/8w//8A+/zVVXXXXVVVddddVVV1111X8c9KAHPYirrrrqqquuuupfds011zz4tV/7td/rnd7pnT4b4L777rsV4MlPfvJ3fuVXfuXn8UzXXHPNg1/7tV/7vV78xV/8tV/sxV7stXku9913362/9Vu/9d3/8A//8Dv/8A//8NtcddVVV1111VVXXXXVVVf950EPetCDuOqqq6666qqrXnSv8zqv894f/uEf/l08l3/4h3/47Rd7sRd7bZ7Lfffdd+tv/dZvfTfAj/7oj34OV1111VVXXXXVVVddddVV/3WoXHXVVVddddVV/yqv8zqv8148Hy/2Yi/22gD33Xffrb/1W7/13QA/+qM/+jlcddVVV1111VVXXXXVVVf996Fy1VVXXXXVVVf9h/iRH/mRz/7RH/3Rz+Gqq6666qqrrrrqqquuuup/DoKrrrrqqquuuupf5Tu/8zvfgufjR3/0Rz+Hq6666qqrrrrqqquuuuqq/1kIrrrqqquuuuqqf5Vbb731YJqmAx7g7d7u7cRVV1111VVXXXXVVVddddX/POhBD3oQV1111VVXXXXVVVddddVVV1111VVXXXXV/0lUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KfwTAiEjtLXuJWQAAAABJRU5ErkJggg==) diff --git a/docs/kcl/push.md b/docs/kcl/push.md new file mode 100644 index 000000000..321786b07 --- /dev/null +++ b/docs/kcl/push.md @@ -0,0 +1,38 @@ +--- +title: "push" +excerpt: "Append an element to the end of an array." +layout: manual +--- + +Append an element to the end of an array. + +Returns a new array with the element appended. + +```js +push(array: [KclValue], elem: KclValue) -> KclValue +``` + + +### Arguments + +| Name | Type | Description | Required | +|----------|------|-------------|----------| +| `array` | [`[KclValue]`](/docs/kcl/types/KclValue) | | Yes | +| `elem` | [`KclValue`](/docs/kcl/types/KclValue) | Any KCL value. | Yes | + +### Returns + +[`KclValue`](/docs/kcl/types/KclValue) - Any KCL value. + + +### Examples + +```js +arr = [1, 2, 3] +new_arr = push(arr, 4) +assertEqual(new_arr[3], 4, 0.00001, "4 was added to the end of the array") +``` + +![Rendered example of push 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAABMiklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V/FPwKn4gueWQqZ4gAAAABJRU5ErkJggg==) + + diff --git a/docs/kcl/reduce.md b/docs/kcl/reduce.md index a50e8223a..730715cfc 100644 --- a/docs/kcl/reduce.md +++ b/docs/kcl/reduce.md @@ -29,41 +29,93 @@ reduce(array: [KclValue], start: KclValue, reduce_fn: FunctionParam) -> KclValue ### Examples ```js -fn decagon = (radius) => { - step = 1 / 10 * tau() - sketch001 = startSketchAt([cos(0) * radius, sin(0) * radius]) - return reduce([1..10], sketch001, (i, sg) => { - x = cos(step * i) * radius - y = sin(step * i) * radius - return lineTo([x, y], sg) -}) +// This function adds two numbers. +fn add(a, b) { + return a + b } -decagon(5.0) - |> close(%) + +// This function adds an array of numbers. +// It uses the `reduce` function, to call the `add` function on every +// element of the `arr` parameter. The starting value is 0. +fn sum(arr) { + return reduce(arr, 0, add) +} + +/* The above is basically like this pseudo-code: +fn sum(arr): + sumSoFar = 0 + for i in arr: + sumSoFar = add(sumSoFar, i) + return sumSoFar */ + + +// We use `assertEqual` to check that our `sum` function gives the +// expected result. It's good to check your work! +assertEqual(sum([1, 2, 3]), 6, 0.00001, "1 + 2 + 3 summed is 6") ``` -![Rendered example of reduce 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAABvnklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqv+Hrrnmmge/2Iu92GufOXPmQddcc82DX+zFXuy1uer/pH/4h3/47X/4h3/4nfvuu+/Wf/iHf/htrrrqqquuuuqqq/5/QQ960IO46qqrrrrqqquu+r/ummuuefBrv/ZrvxfAO73TO302z/Snf/qnP8ZV/+e94iu+4jsA3Hfffbf+wz/8w2//wz/8w+/cd999t/7DP/zDb3PVVVddddVVV131fxt60IMexFVXXXXVVVddddX/Nddcc82DX/u1X/u9XvzFX/y1X+zFXuy1eabf/d3f/S6u+n/vNV/zNd8H4L777rv1H/7hH377H/7hH37nvvvuu/Uf/uEffpurrrrqqquuuuqq/1vQgx70IK666qqrrrrqqqv+N7vmmmsefObMmQe/2Iu92Gu9+Iu/+Gu/2Iu92GvzTL/7u7/7XVx11b/gNV/zNd8H4L777rv17Nmzt/793//9b//DP/zD7/zDP/zDb3PVVVddddVVV131vxt60IMexFVXXXXVVVddddX/Jtdcc82Dz5w58+AXe7EXe60Xf/EXf+0Xe7EXe22e6Xd/93e/i6uu+nd6zdd8zfcBuO+++24F+Id/+Iff/od/+Iff+a3f+q3v5qqrrrrqqquuuup/F/SgBz2Iq6666qqrrrrqqv/Jrrnmmge/9mu/9nsBvM7rvM57X3PNNQ8G+N3f/d3v4qqr/ou85mu+5vsA3Hfffbf+wz/8w2//wz/8w+/cd999t/7DP/zDb3PVVVddddVVV131Pxd60IMexFVXXXXVVVddddX/JNdcc82DX/u1X/u9rrnmmge/zuu8znvzTL/7u7/7XVx11f8Qr/mar/k+APfdd9+t//AP//Db//AP//A79913363/8A//8NtcddVVV1111VVX/c+BHvSgB3HVVVddddVVV1313+maa6558Gu/9mu/14u/+Iu/9ou92Iu9Ns/0u7/7u9/FVVf9L/Gar/ma7wNw33333Xr27Nlb//7v//63/+Ef/uF3/uEf/uG3ueqqq6666qqrrvrvgx70oAdx1VVXXXXVVVdd9V/lmmuuefCZM2ce/GIv9mKv9eIv/uKv/WIv9mKvzTP97u/+7ndx1VX/R7zma77m+wDcd999twL8wz/8w2//wz/8w+/81m/91ndz1VVXXXXVVVdd9V8HPehBD+Kqq6666qqrrrrqP8s111zz4Bd7sRd77TNnzjzoxV/8xV/7xV7sxV4b4Hd/93e/i6uu+n/mNV/zNd8H4L777rv1H/7hH377H/7hH37nvvvuu/Uf/uEffpurrrrqqquuuuqq/xzoQQ96EFddddVVV1111VX/Ua655poHv/Zrv/Z7AbzTO73TZ/NMv/u7v/tdXHXVVc/hNV/zNd8H4L777rv1H/7hH377H/7hH37nvvvuu/Uf/uEffpurrrrqqquuuuqq/xjoQQ96EFddddVVV1111VX/Vtdcc82DX/u1X/u9XvzFX/y1X+zFXuy1eabf/d3f/S6uuuqqf5XXfM3XfB+A++6779Z/+Id/+O1/+Id/+J377rvv1n/4h3/4ba666qqrrrrqqqv+bdCDHvQgrrrqqquuuuqqq14U11xzzYPPnDnz4Bd7sRd7rRd/8Rd/7Rd7sRd7bZ7pd3/3d7+Lq6666j/Ua77ma74PwH333Xfr2bNnb/37v//73/6Hf/iH3/mHf/iH3+aqq6666qqrrrrqRYMe9KAHcdVVV1111VVXXfX8XHPNNQ8+c+bMg1/sxV7stV78xV/8tV/sxV7stXmm3/3d3/0urrrqqv9Sr/mar/k+APfdd9+tAP/wD//w2//wD//wO7/1W7/13Vx11VVXXXXVVVc9f+hBD3oQV1111VVXXXXVVQDXXHPNg1/7tV/7vQBe53Ve572vueaaBwP87u/+7ndx1VVX/Y/0mq/5mu8DcN999936D//wD7/9D//wD79z33333foP//APv81VV1111VVXXXUVoAc96EFcddVVV1111VX/P11zzTUPfu3Xfu33Anind3qnz+aZfvd3f/e7uOqqq/5Xes3XfM33ATh79uwz/v7v//63/uEf/uF37rvvvlv/4R/+4be56qqrrrrqqqv+P0IPetCDuOqqq6666qqr/n+45pprHvzar/3a7/XiL/7ir/1iL/Zir80z/e7v/u53cdVVV/2f9Jqv+ZrvA3Dffffdevbs2Wf8/d///W/9wz/8w+/8wz/8w29z1VVXXXXVVVf9f4Ae9KAHcdVVV1111VVX/d9zzTXXPPjMmTMPfrEXe7HXevEXf/HXfrEXe7HX5pl+93d/97u46qqr/l96zdd8zfcBuO+++24F+Id/+Iff+a3f+q3v/od/+Iff5qqrrrrqqquu+r8IPehBD+Kqq6666qqrrvrf75prrnnwi73Yi732mTNnHvTiL/7ir/1iL/Zirw3wu7/7u9/FVVddddUL8Zqv+ZrvA3Dffffd+g//8A+//Q//8A+/8w//8A+/fd99993KVVddddVVV131vx160IMexFVXXXXVVVdd9b/PNddc8+DXfu3Xfi+Ad3qnd/psnul3f/d3v4urrrrqqn+H13zN13wfgPvuu+/Wf/iHf/jtf/iHf/id++6779Z/+Id/+G2uuuqqq6666qr/bdCDHvQgrrrqqquuuuqq//muueaaB7/2a7/2e734i7/4a7/Yi73Ya/NMv/u7v/tdXHXVVVf9J3rN13zN9wG47777bv2Hf/iH3/6Hf/iH37nvvvtu/Yd/+Iff5qqrrrrqqquu+p8OPehBD+Kqq6666qqrrvqf5ZprrnnwmTNnHvxiL/Zir/XiL/7ir/1iL/Zir80z/e7v/u53cdVVV1313+g1X/M13wfg7Nmzz7jv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vvvuu/WzPuuzXue+++67lauuuuqqq676/4Ny/Phxrrrqqquuuur/ixd7sRd77a/4iq/4qyc84Qm/9YxnPOOvueqqq6666v+FZzzjGX997ty5W9/xHd/xczY2No79wz/8w+9w1VVXXXXVVf8/UI4fP85VV1111VVX/X/wju/4jp/1ER/xEd/9u7/7u9/FVVddddVV/y+dO3fu6W/2Zm/2MQD/8A//8DtcddVVV1111f996EEPehBXXXXVVVdd9X/ZNddc8+AP//AP/64Xe7EXe+3f/d3f/S6uuuqqq676f+81X/M13+e+++679bM+67Ne57777ruVq6666qqrrvq/Cz3oQQ/iqquuuuqqq/6vep3XeZ33/vAP//Dv+t3f/d3v4qqrrrrqqquey6Mf/ejX+e3f/u3v+ZEf+ZHP5qqrrrrqqqv+b6IcP36cq6666qqrrvq/6HM/93N/683f/M0/+nd/93e/i6uuuuqqq656Ps6dO3frm77pm340wD/8wz/8DlddddVVV131fw960IMexFVXXXXVVVf9X3LNNdc8+HM+53N+65prrnnw7/7u734XV1111VVXXfUveM3XfM33ue+++279rM/6rNe57777buWqq6666qqr/u9AD3rQg7jqqquuuuqq/yve8R3f8bPe6Z3e6bN/93d/97u46qqrrrrqqn+lRz/60a/zW7/1W9/9oz/6o5/DVVddddVVV/3fQDl+/DhXXXXVVVdd9b/dNddc8+BP+qRP+qnXeZ3Xee/f/d3f/S6uuuqqq6666t/g3Llzt77Zm73Zx7z4i7/4a//DP/zD7xweHu5y1VVXXXXVVf+7UY4fP85VV1111VVX/W/2Yi/2Yq/9FV/xFX91zTXXPPh3f/d3v4urrrrqqquu+nd4xjOe8dev8Aqv8Dav+Iqv+NZHR0eXbr311r/mqquuuuqqq/73Qg960IO46qqrrrrqqv+t3vEd3/Gz3umd3umzf/d3f/e7uOqqq6666qr/YI9+9KNf57d+67e++0d/9Ec/h6uuuuqqq6763wk96EEP4qqrrrrqqqv+t7nmmmse/OEf/uHf9WIv9mKv/bu/+7vfxVVXXXXVVVf9J3nN13zN97nvvvtu/azP+qzXue+++27lqquuuuqqq/53oRw/fpyrrrrqqquu+t/kxV7sxV77K77iK/7qCU94wm894xnP+Guuuuqqq6666j/RM57xjL8+d+7cre/4ju/4ORsbG8f+4R/+4Xe46qqrrrrqqv89KMePH+eqq6666qqr/rd4x3d8x8/6iI/4iO/+3d/93e/iqquuuuqqq/4LnTt37ulv9mZv9jEA//AP//A7XHXVVVddddX/DuhBD3oQV1111VVXXfU/3TXXXPPgD//wD/+uF3uxF3vt3/3d3/0urrrqqquuuuq/yWu+5mu+z3333XfrZ33WZ73OfffddytXXXXVVVdd9T8betCDHsRVV1111VVX/U/2Oq/zOu/94R/+4d/1u7/7u9/FVVddddVVV/0P8ehHP/p1fvu3f/t7fuRHfuSzueqqq6666qr/uSjHjx/nqquuuuqqq/6n+vAP//Dveqd3eqfP/t3f/d3v4qqrrrrqqqv+Bzl37tytb/qmb/rRAP/wD//wO1x11VVXXXXV/0zoQQ96EFddddVVV131P80111zz4M/5nM/5rWuuuebBv/u7v/tdXHXVVVddddX/UK/5mq/5Pvfdd9+tn/VZn/U69913361cddVVV1111f8s6EEPehBXXXXVVVdd9T/JO77jO37WO73TO3327/7u734XV1111VVXXfW/xKMf/ejX+a3f+q3v/tEf/dHP4aqrrrrqqqv+50APetCDuOqqq6666qr/Ca655poHf/iHf/h3vdiLvdhr/+7v/u53cdVVV1111VX/y7zma77m+/zDP/zDb3/mZ37m63DVVVddddVV/zNQjh8/zlVXXXXVVVf9d3uxF3ux1/6Kr/iKv7rmmmse/Lu/+7vfxVVXXXXVVVf9L/SMZzzjr1/hFV7hbV7ndV7nvW+99da/OXv27K1cddVVV1111X8v9KAHPYirrrrqqquu+u/0ju/4jp/1Tu/0Tp/9u7/7u9/FVVddddVVV/0f8ehHP/p1fuu3fuu7f/RHf/RzuOqqq6666qr/PuhBD3oQV1111VVXXfXf4Zprrnnwh3/4h3/Xi73Yi7327/7u734XV1111VVXXfV/zGu+5mu+z3333XfrZ33WZ73OfffddytXXXXVVVdd9V+Pcvz4ca666qqrrrrqv9qLvdiLvfZXfMVX/NUTnvCE33rGM57x11x11VVXXXXV/0HPeMYz/vrcuXO3vuM7vuPnbGxsHPuHf/iH3+Gqq6666qqr/mtRjh8/zlVXXXXVVVf9V3rHd3zHz/qIj/iI7/7d3/3d7+Kqq6666qqr/h84d+7c09/szd7sYwD+4R/+4Xe46qqrrrrqqv866EEPehBXXXXVVVdd9V/hmmuuefCHf/iHf9eLvdiLvfbv/u7vfhdXXXXVVVdd9f/Ma77ma77Pfffdd+tnfdZnvc599913K1ddddVVV131n49y/Phxrrrqqquuuuo/24u92Iu99ld8xVf81ROe8ITfesYznvHXXHXVVVddddX/Q894xjP++ty5c7e+wzu8w2dvbW2d+Id/+Iff5qqrrrrqqqv+c1GOHz/OVVddddVVV/1nesd3fMfP+oiP+Ijv/t3f/d3v4qqrrrrqqquu4ty5c7e+6Zu+6UcD/MM//MPvcNVVV1111VX/edCDHvQgrrrqqquuuuo/wzXXXPPgD//wD/+uF3uxF3vt3/3d3/0urrrqqquuuuqq5/Car/ma73Pffffd+lmf9Vmvc999993KVVddddVVV/3HQw960IO46qqrrrrqqv9or/M6r/PeH/7hH/5dv/u7v/tdXHXVVVddddVVL9SjH/3o1/mt3/qt7/7RH/3Rz+Gqq6666qqr/mNRjh8/zlVXXXXVVVf9R/rcz/3c33rzN3/zj/7d3/3d7+Kqq6666qqrrvoXnTt37tY3e7M3+xhJ+od/+Iff5qqrrrrqqqv+46AHPehBXHXVVVddddV/hGuuuebBn/M5n/Nb11xzzYN/93d/97u46qqrrrrqqqv+VV7zNV/zfe67775bP+uzPut17rvvvlu56qqrrrrqqn8/9KAHPYirrrrqqquu+vd6x3d8x896p3d6p8/+3d/93e/iqquuuuqqq676d3n0ox/9Or/1W7/13T/6oz/6OVx11VVXXXXVvw/l+PHjXHXVVVddddW/1TXXXPPgT/qkT/qp13md13nv3/3d3/0urrrqqquuuuqqf7dz587d+mZv9mYf8+Iv/uKv/Q//8A+/c3h4uMtVV1111VVX/dsQXHXVVVddddW/w2u/9mu/14u92Iu99u/+7u9+F1ddddVVV1111X+Y3/3d3/2uF3uxF3vt13md13lvrrrqqquuuurfjuCqq6666qqr/h3e6Z3e6bN/93d/97u46qqrrrrqqqv+w/3u7/7ud73O67zOe19zzTUP5qqrrrrqqqv+bahcddVVV1111b/DfffddytXXXXVVVddddV/mjNnzjzovvvuu5Wrrrrqqquu+rehctVVV1111VX/DmfPnr2Vq6666qqrrrrqP81v/dZvfQ9XXXXVVVdd9W9HcNVVV1111VX/Dn//93//21x11VVXXXXVVf9p7rvvvqdz1VVXXXXVVf92BFddddVVV1317/AP//APv/Oar/ma78NVV1111VVXXfUf7jVf8zXf5+zZs8/gqquuuuqqq/7tqFx11VVXXXXVv8PZs2dv5aqrrrrqqquu+k/zD//wD7/NVVddddVVV/3bUbnqqquuuuqqf4f77rvvVq666qqrrrrqqv809913361cddVVV1111b8dlauuuuqqq676d/qHf/iH3+aqq6666qqrrvoP9w//8A+/zVVXXXXVVVf9+xBcddVVV1111b/TfffddytXXXXVVVddddV/uPvuu+9Wrrrqqquuuurfh+Cqq6666qqr/p3uu+++W1/zNV/zfbjqqquuuuqqq/7DvOZrvub7/MM//MPvcNVVV1111VX/PlSuuuqqq6666t/pH/7hH36Hq6666qqrrrrqP9w//MM//DZXXXXVVVdd9e9D5aqrrrrqqqv+nc6ePXsrV1111VVXXXXVf7j77rvvVq666qqrrrrq34fKVVddddVVV/073Xfffbf+wz/8w29z1VVXXXXVVVddddVVV1111f80VK666qqrrrrqqquuuuqqq676H+e3fuu3vpurrrrqqquu+vcjuOqqq6666qr/AH//93//26/5mq/5Plx11VVXXXXVVf9ur/mar/k+9913361cddVVV1111b8flauuuuqqq676D/AP//APv8NVV1111VVXXfUf5uzZs8/gqquuuuqqq/79qFx11VVXXXXVf4CzZ8/eylVXXXXVVVdd9R/mH/7hH36bq6666qqrrvr3o3LVVVddddVV/wHuu+++W7nqqquuuuqqq/7D3Hfffbdy1VVXXXXVVf9+VK666qqrrrrqP8g//MM//DZXXXXVVVddddW/22/91m99N1ddddVVV131H4Pgqquuuuqqq/6D/P3f//1vc9VVV1111VVXXXXVVVddddX/JARXXXXVVVdd9R/k7Nmzz3jN13zN9+Gqq6666qqrrvo3e83XfM33+Yd/+Iff4aqrrrrqqqv+Y1C56qqrrrrqqv8g9913361cddVVV1111VX/bv/wD//w21x11VVXXXXVfwwqV1111VVXXfUf5OzZs7dy1VVXXXXVVVf9u9133323ctVVV1111VX/MahcddVVV1111X+Q++6779Z/+Id/+G2uuuqqq6666qp/s/vuu+9Wrrrqqquuuuo/DpWrrrrqqquuuuqqq6666qqr/sf4h3/4h9/mqquuuuqqq/7jEFx11VVXXXXVf6C///u//+3XfM3XfB+uuuqqq6666qp/tdd8zdd8n/vuu+9Wrrrqqquuuuo/DpWrrrrqqquu+g/0D//wD7/DVVddddVVV131b3b27NlncNVVV1111VX/cahcddVVV1111X+gs2fP3spVV1111VVXXfVv9g//8A+/zVVXXXXVVVf9x6Fy1VVXXXXVVf+B7rvvvlvvu+++W7nqqquuuuqqq/5N7rvvvlu56qqrrrrqqv84VK666qqrrrrqP9jZs2dv5aqrrrrqqquu+lf7rd/6re/hqquuuuqqq/5jEVx11VVXXXXVf7C///u//22uuuqqq6666qqrrrrqqquu+p+A4Kqrrrrqqqv+g/3DP/zD77zma77m+3DVVVddddVVV73IXvM1X/N9/uEf/uG3ueqqq6666qr/WFSuuuqqq6666j/Y2bNnb+Wqq6666qqrrvpX+4d/+Iff5qqrrrrqqqv+Y1G56qqrrrrqqquuuuqqq6666n+E++6771auuuqqq6666j8Wlauuuuqqq676D3bffffd+g//8A+/zVVXXXXVVVdd9SL7h3/4h9/mqquuuuqqq/7jUbnqqquuuuqqq6666qqrrrrqv9199913K1ddddVVV131H4/gqquuuuqqq/4T/P3f//1vv+Zrvub7cNVVV1111VVX/Yte8zVf833+4R/+4Xe46qqrrrrqqv94VK666qqrrrrqP8E//MM//A5XXXXVVVddddVVV1111VVX/XejctVVV1111VX/Cc6ePXsrV1111VVXXXXVi+wf/uEffpurrrrqqquu+o9H5aqrrrrqqqv+E9x333233nfffbdy1VVXXXXVVVe9SO67775bueqqq6666qr/eFSuuuqqq6666j/J2bNnb+Wqq6666qqrrvoX/dZv/dZ3c9VVV1111VX/OQiuuuqqq6666j/J3//93/82V1111VVXXXXVVVddddVVV/13Irjqqquuuuqq/yT/8A//8Duv+Zqv+T5cddVVV1111VUv0Gu+5mu+zz/8wz/8DlddddVVV131n4PKVVddddVVV/0nOXv27K1cddVVV1111VX/on/4h3/4ba666qqrrrrqPweVq6666qqrrvpPct99993KVVddddVVV131L7rvvvtu5aqrrrrqqqv+c1C56qqrrrrqqv9E//AP//DbXHXVVVddddVVL9A//MM//DZXXXXVVVdd9Z+H4Kqrrrrqqqv+E9133323ctVVV1111VVXvUD33XffrVx11VVXXXXVfx6Cq6666qqrrvpPdN999936mq/5mu/DVVddddVVV131PF7zNV/zff7hH/7hd7jqqquuuuqq/zxUrrrqqquuuuo/0T/8wz/8DlddddVVV1111Qv0D//wD7/NVVddddVVV/3noXLVVVddddVV/4nOnj17K1ddddVVV1111VVXXXXVVVf9d6Fy1VVXXXXVVf+J7rvvvlvvu+++W7nqqquuuuqqq56v++6771auuuqqq6666j8Plauuuuqqq676T3b27Nlbueqqq6666qqrnsdv/dZvfTdXXXXVVVdd9Z+L4Kqrrrrqqqv+k/393//9b7/ma77m+3DVVVddddVVVz3La77ma77PfffddytXXXXVVVdd9Z+LylVXXXXVVVf9J/uHf/iH3+Gqq6666qqrrnoeZ8+efQZXXXXVVVdd9Z+LylVXXXXVVVf9Jzt79uytXHXVVVddddVVz+Mf/uEffpurrrrqqquu+s9F5aqrrrrqqqv+k9133323ctVVV1111VVXPY/77rvvVq666qqrrrrqPxeVq6666qqrrvov8A//8A+/zVVXXXXVVVdd9Sz/8A//8DtcddVVV1111X8+gquuuuqqq676L/D3f//3v81VV1111VVXXfUs9913361cddVVV1111X8+gquuuuqqq676L/Kar/ma78NVV1111VVXXcVrvuZrvs8//MM//DZXXXXVVVdd9Z+PylVXXXXVVVf9F/iHf/iH3+Gqq6666qqrrnqWf/iHf/htrrrqqquuuuo/H5Wrrrrqqquu+i9w9uzZW7nqqquuuuqqq57lvvvuu5Wrrrrqqquu+s9H5aqrrrrqqqv+C9x33323/sM//MNvc9VVV1111VVXcd99993KVVddddVVV/3XoHLVVVddddVVV1111VVXXXXVf6l/+Id/+G2uuuqqq6666r8GwVVXXXXVVVf9F/n7v//7337N13zN9+Gqq6666qqr/h97zdd8zfe57777buWqq6666qqr/mtQueqqq6666qr/Iv/wD//wO1x11VVXXXXVVZw9e/YZXHXVVVddddV/DSpXXXXVVVdd9V/k7Nmzt3LVVVddddVVV/EP//APv81VV1111VVX/degctVVV1111VX/Re67775bueqqq6666qqruO+++27lqquuuuqqq/5rULnqqquuuuqq/0L/8A//8NtcddVVV1111f9jv/Vbv/XdXHXVVVddddV/HYKrrrrqqquu+i/0W7/1W9/DVVddddVVV/0/dt99993KVVddddVVV/3XIbjqqquuuuqq/0K/9Vu/9d2tNb3ma77m+3DVVVddddVV/4+85mu+5vucOnXqIT/6oz/6OVx11VVXXXXVfx30oAc9iKuuuuqqq676r3bNNdc8+LVf+7Xf653e6Z0+G+B3f/d3v4urrrrqqquu+j/mNV/zNd8H4Ed+5Ec++7d/+7e/57777ruVq6666qqrrvqvhR70oAdx1VVXXXXVVf9drrnmmge/9mu/9nu9zuu8zntfc801D/7d3/3d7+Kqq6666qqr/pd7zdd8zfe57777bv2t3/qt7/7RH/3Rz+Gqq6666qqr/vugBz3oQVx11VVXXXXVf7drrrnmwS/2Yi/22q/zOq/zXi/2Yi/22r/7u7/7XVx11VVXXXXV/zKv+Zqv+T733Xffrb/1W7/13T/6oz/6OVx11VVXXXXVfz/0oAc9iKuuuuqqq676n+Saa6558Du+4zt+1uu8zuu8N8Dv/u7vfhdXXXXVVVdd9T/Ua77ma74PwI/8yI989m//9m9/z3333XcrV1111VVXXfU/B3rQgx7EVVddddVVV/1PdM011zz4tV/7td/rdV7ndd77mmuuefDv/u7vfhdXXXXVVVdd9T/Ea77ma77Pfffdd+tv/dZvffeP/uiPfg5XXXXVVVdd9T8TetCDHsRVV1111VVX/U92zTXXPPjFXuzFXvt1Xud13uvFXuzFXvt3f/d3v4urrrrqqquu+m/ymq/5mu9z33333fpbv/Vb3/2jP/qjn8NVV1111VVX/c+GHvSgB3HVVVddddVV/1tcc801D37Hd3zHz3qd13md9wb43d/93e/iqquuuuqqq/6TveZrvub7APzIj/zIZ//2b//299x33323ctVVV1111VX/O6AHPehBXHXVVVddddX/Ntdcc82DX/u1X/u93umd3umzAX73d3/3u7jqqquuuuqq/2Cv+Zqv+T733Xffrb/1W7/13T/6oz/6OVx11VVXXXXV/z7oQQ96EFddddVVV131v9U111zz4Bd7sRd77dd5ndd5rxd7sRd77d/93d/9Lq666qqrrrrq3+k1X/M13+e+++679bd+67e++0d/9Ec/h6uuuuqqq6763ws96EEP4qqrrrrqqqv+L7jmmmse/I7v+I6f9Tqv8zrvDfC7v/u738VVV1111VVXvYhe8zVf830Afuu3fuu7f+RHfuSzz549+wyuuuqqq6666n8/9KAHPYirrrrqqquu+r/kmmuuefBrv/Zrv9c7vdM7fTbA7/7u734XV1111VVXXfUCvOZrvub73Hfffbf+1m/91nf/9m//9vfcd999t3LVVVddddVV/3egBz3oQVx11VVXXXXV/0XXXHPNg1/sxV7stV/ndV7nvV7sxV7stX/3d3/3u7jqqquuuuqqZ3rN13zN97nvvvtu/a3f+q3v/tEf/dHP4aqrrrrqqqv+b0IPetCDuOqqq6666qr/66655poHv+M7vuNnvc7rvM57A/zu7/7ud3HVVVddddX/O6/5mq/5PgD/8A//8Nu/9Vu/9T2/9Vu/9d1cddVVV1111f9t6EEPehBXXXXVVVdd9f/FNddc8+DXfu3Xfq93eqd3+myA3/3d3/0urrrqqquu+j/vNV/zNd/nvvvuu/W3fuu3vvu3f/u3v+e+++67lauuuuqqq676/wE96EEP4qqrrrrqqqv+v7nmmmse/GIv9mKv/Tqv8zrv9WIv9mKv/bu/+7vfxVVXXXXVVf/nvOZrvub73Hfffbf+1m/91nf/6I/+6Odw1VVXXXXVVf//oAc96EFcddVVV1111f9nL/ZiL/ba7/RO7/RZL/ZiL/baAL/7u7/7XVx11VVXXfW/1mu+5mu+D8B9991364/+6I9+zm/91m99N1ddddVVV131/xd60IMexFVXXXXVVVddBddcc82DX/u1X/u93umd3umzAX73d3/3u7jqqquuuup/jdd8zdd8n/vuu+/W3/qt3/ru3/7t3/6e++6771auuuqqq6666ir0oAc9iKuuuuqqq6666tmuueaaB7/2a7/2e73O67zOe19zzTUP/t3f/d3v4qqrrrrqqv+xXvM1X/N97rvvvlt/67d+67t/9Ed/9HO46qqrrrrqqqseCD3oQQ/iqquuuuqqq656/l7ndV7nvV/ndV7nvV7sxV7stX/3d3/3u7jqqquuuup/jNd8zdd8n/vuu+/WH/3RH/2c3/qt3/purrrqqquuuuqq5wc96EEP4qqrrrrqqquueuGuueaaB7/2a7/2e73TO73TZwP87u/+7ndx1VVXXXXVf7nXfM3XfB+AH/mRH/ns3/7t3/6e++6771auuuqqq6666qoXBj3oQQ/iqquuuuqqq6560VxzzTUPfu3Xfu33ep3XeZ33vuaaax78u7/7u9/FVVddddVV/+le8zVf833uu+++W3/rt37ru3/0R3/0c7jqqquuuuqqq15U6EEPehBXXXXVVVddddW/zjXXXPPgF3uxF3vt13md13mvF3uxF3vt3/3d3/0urrrqqquu+g/3mq/5mu9z33333fqjP/qjn/Nbv/Vb381VV1111VVXXfWvhR70oAdx1VVXXXXVVVf9211zzTUPfu3Xfu33eqd3eqfPBvjd3/3d7+Kqq6666qp/s9d8zdd8H4Af+ZEf+ezf+q3f+u6zZ88+g6uuuuqqq6666t8KPehBD+Kqq6666qqrrvr3u+aaax782q/92u/1Oq/zOu99zTXXPPh3f/d3v4urrrrqqqteZK/5mq/5Pvfdd9+tv/Vbv/XdP/qjP/o5XHXVVVddddVV/xHQgx70IK666qqrrrrqqv8411xzzYNf7MVe7LVe53Ve571f7MVe7LV/93d/97u46qqrrrrqBXrN13zN97nvvvtu/a3f+q3v/tEf/dHP4aqrrrrqqquu+o+EHvSgB3HVVVddddVVV/3nuOaaax78ju/4jp/1Oq/zOu8N8Lu/+7vfxVVXXXXVVbzma77m+wD8yI/8yGf/9m//9vfcd999t3LVVVddddVVV/1nQA960IO46qqrrrrqqqv+c11zzTUPfu3Xfu33ep3XeZ33vuaaax78u7/7u9/FVVddddX/Q6/5mq/5Pvfdd9+tv/Vbv/XdP/qjP/o5XHXVVVddddVV/9nQgx70IK666qqrrrrqqv8a11xzzYNf7MVe7LVf53Ve571e7MVe7LV/93d/97u46qqrrvp/4DVf8zXf57777rv1t37rt777R3/0Rz+Hq6666qqrrrrqvwp60IMexFVXXXXVVVdd9V/vmmuuefA7vuM7ftbrvM7rvDfA7/7u734XV1111VX/h7zma77m+wD8yI/8yGf/9m//9vfcd999t3LVVVddddVVV/1XQw960IO46qqrrrrqqqv++1xzzTUPfu3Xfu33eqd3eqfPBvjd3/3d7+Kqq6666n+x13zN13yf++6779bf+q3f+u4f/dEf/Ryuuuqqq6666qr/TuhBD3oQV1111VVXXXXVf79rrrnmwS/2Yi/22q/zOq/zXi/2Yi/22r/7u7/7XVx11VVX/S/ymq/5mu9z33333fpbv/Vb3/2jP/qjn8NVV1111VVXXfU/AXrQgx7EVVddddVVV131P8s111zz4Hd8x3f8rNd5ndd5b4Df/d3f/S6uuuqqq/4Hes3XfM33Afit3/qt7/7RH/3Rz7nvvvtu5aqrrrrqqquu+p8EPehBD+Kqq6666qqrrvqf6Zprrnnwa7/2a7/XO73TO302wO/+7u9+F1ddddVV/wO85mu+5vvcd999t/7Wb/3Wd//oj/7o53DVVVddddVVV/1PhR70oAdx1VVXXXXVVVf9z3bmzJkHvfiLv/jrvM7rvM57vdiLvdhr/+7v/u53cdVVV1313+A1X/M13+e+++679bd+67e++0d/9Ec/h6uuuuqqq6666n869KAHPYirrrrqqquuuup/j2uuuebB7/iO7/hZr/M6r/PeAL/7u7/7XVx11VVX/Sd6zdd8zfcB+Id/+Iff/q3f+q3v+a3f+q3v5qqrrrrqqquu+t8CPehBD+Kqq6666qqrrvrf58yZMw96ndd5nfd+p3d6p88G+N3f/d3v4qqrrrrqP9BrvuZrvs99991362/91m9992/91m9999mzZ5/BVVddddVVV131vw160IMexFVXXXXVVVdd9b/XNddc8+AXe7EXe+3XeZ3Xea8Xe7EXe+3f/d3f/S6uuuqqq/4dXvM1X/N97rvvvlt/67d+67t/9Ed/9HO46qqrrrrqqqv+N0MPetCDuOqqq6666qqr/m94sRd7sdd6ndd5nfd+ndd5nfcG+N3f/d3v4qqrrrrqRfCar/ma7wNw33333fqjP/qjn/1bv/Vb38NVV1111VVXXfV/AXrQgx7EVVddddVVV131f8s111zz4Nd+7dd+r3d6p3f6bIDf/d3f/S6uuuqqq56P13zN13yf++6779bf+q3f+u7f/u3f/p777rvvVq666qqrrrrqqv9L0IMe9CCuuuqqq6666qr/m6655poHv/Zrv/Z7vc7rvM57X3PNNQ/+3d/93e/iqquuugp4zdd8zfe57777bv2t3/qt7/7RH/3Rz+Gqq6666qqrrvq/Cj3oQQ/iqquuuuqqq676v+91Xud13vt1Xud13uvFXuzFXvt3f/d3v4urrrrq/6XXfM3XfJ/77rvv1h/90R/9nN/6rd/6bq666qqrrrrqqv/r0IMe9CCuuuqqq6666qr/P6655poHv/Zrv/Z7vdM7vdNnA/zu7/7ud3HVVVf9n/aar/ma7wPwIz/yI5/927/9299z33333cpVV1111VVXXfX/BXrQgx7EVVddddVVV131/88111zz4Nd+7dd+r9d5ndd572uuuebBv/u7v/tdXHXVVf+nvOZrvub73Hfffbf+1m/91nf/6I/+6Odw1VVXXXXVVVf9f4Qe9KAHcdVVV1111VVX/f91zTXXPPjFXuzFXvt1Xud13uvFXuzFXvt3f/d3v4urrrrqf7XXfM3XfJ/77rvv1h/90R/9nN/6rd/6bq666qqrrrrqqv/P0IMe9CCuuuqqq6666qqrAK655poHv/Zrv/Z7vdM7vdNnA/zu7/7ud3HVVVf9r/Car/ma7wPwIz/yI5/927/9299z33333cpVV1111VVXXXUVoAc96EFcddVVV1111VVXPdA111zz4Nd+7dd+r9d5ndd572uuuebBv/u7v/tdXHXVVf8jveZrvub73Hfffbf+1m/91nf/6I/+6Odw1VVXXXXVVVdd9ZzQgx70IK666qqrrrrqqquenzNnzjzoxV/8xV/ndV7ndd7rxV7sxV77d3/3d7+Lq6666n+E13zN13yf++6779Yf/dEf/Zzf+q3f+m6uuuqqq6666qqrnj/0oAc9iKuuuuqqq6666qp/yTXXXPPgd3zHd/ys13md13lvgN/93d/9Lq666qr/Uq/5mq/5PgA/8iM/8tm//du//T333XffrVx11VVXXXXVVVe9cOhBD3oQV1111VVXXXXVVS+qM2fOPOh1Xud13vt1Xud13vuaa6558O/+7u9+F1ddddV/qtd8zdd8n/vuu+/W3/qt3/ruH/3RH/0crrrqqquuuuqqq1506EEPehBXXXXVVVddddVV/1rXXHPNg1/sxV7stV/ndV7nvV7sxV7stX/3d3/3u7jqqqv+Q73ma77m+9x33323/tZv/dZ3/+iP/ujncNVVV1111VVXXfWvhx70oAdx1VVXXXXVVVdd9e9x5syZB73TO73TZ7/O67zOewP87u/+7ndx1VVX/Zu85mu+5vsA/MiP/Mhn/9Zv/dZ3nz179hlcddVVV1111VVX/duhBz3oQVx11VVXXXXVVVf9R7jmmmse/Nqv/drv9Tqv8zrvfc011zz4d3/3d7+Lq6666kXymq/5mu9z33333fpbv/Vb3/2jP/qjn8NVV1111VVXXXXVfwz0oAc9iKuuuuqqq6666qr/SNdcc82DX+zFXuy1Xud1Xue9X+zFXuy1f/d3f/e7uOqqq56v13zN13yf++6779bf+q3f+u4f/dEf/Ryuuuqqq6666qqr/mOhBz3oQVx11VVXXXXVVVf9Z7nmmmse/I7v+I6f9Tqv8zrvDfC7v/u738VVV/0/95qv+ZrvA/Bbv/Vb3/2jP/qjn3PffffdylVXXXXVVVddddV/DvSgBz2Iq6666qqrrrrqqv9s11xzzYNf+7Vf+73e6Z3e6bPvu+++W6+55poHc9VV/w/dd999t/7Wb/3Wd//oj/7o53DVVVddddVVV131nw896EEP4qqrrrrqqquuuuq/0jXXXPNgnsm2JYkHsG1J4gFsW5J4ANuWJB7AtiWJB7BtSeIBbFuSeADbliQewLYliQewbUniAWxbkngA25YkHsC2JYkHsG1J4gFsW5J4ANuWJB7AtiWJB7BtSeIBbFuSeADbliQewLYliQewbUniAWxbkngA25YkHsC2JYkHsG1J4gFsW5J4ANuWJB7AtiWJB7BtSeIBbFuSeADbliQewLYliQewbUniAWxbkngA25YkHsC2JYkHsG1JArjvvvtu5aqrrrrqqquuuuq/FnrQgx7EVVddddVVV1111VVXXXXVVVddddVVV131fxKVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/Kv4R4nLOaOpJfrUAAAAASUVORK5CYII=) +![Rendered example of reduce 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAABMiklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V/FPwKn4gueWQqZ4gAAAABJRU5ErkJggg==) ```js -array = [1, 2, 3] -sum = reduce(array, 0, (i, result_so_far) => { +// This example works just like the previous example above, but it uses +// an anonymous `add` function as its parameter, instead of declaring a +// named function outside. +arr = [1, 2, 3] +sum = reduce(arr, 0, fn(i, result_so_far) { return i + result_so_far }) + +// We use `assertEqual` to check that our `sum` function gives the +// expected result. It's good to check your work! assertEqual(sum, 6, 0.00001, "1 + 2 + 3 summed is 6") ``` ![Rendered example of reduce 1](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAABMiklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V/FPwKn4gueWQqZ4gAAAABJRU5ErkJggg==) ```js -fn add = (a, b) => { - return a + b +// Declare a function that sketches a decagon. +fn decagon(radius) { + // Each side of the decagon is turned this many degrees from the previous angle. + stepAngle = 1 / 10 * tau() + + // Start the decagon sketch at this point. + startOfDecagonSketch = startSketchOn('XY') + |> startProfileAt([cos(0) * radius, sin(0) * radius], %) + + // Use a `reduce` to draw the remaining decagon sides. + // For each number in the array 1..10, run the given function, + // which takes a partially-sketched decagon and adds one more edge to it. + fullDecagon = reduce([1..10], startOfDecagonSketch, fn(i, partialDecagon) { + // Draw one edge of the decagon. + x = cos(stepAngle * i) * radius + y = sin(stepAngle * i) * radius + return lineTo([x, y], partialDecagon) + }) + + return fullDecagon } -fn sum = (array) => { - return reduce(array, 0, add) -} -assertEqual(sum([1, 2, 3]), 6, 0.00001, "1 + 2 + 3 summed is 6") + +/* The `decagon` above is basically like this pseudo-code: +fn decagon(radius): + stepAngle = (1/10) * tau() + plane = startSketchOn('XY') + startOfDecagonSketch = startProfileAt([(cos(0)*radius), (sin(0) * radius)], plane) + + // Here's the reduce part. + partialDecagon = startOfDecagonSketch + for i in [1..10]: + x = cos(stepAngle * i) * radius + y = sin(stepAngle * i) * radius + partialDecagon = lineTo([x, y], partialDecagon) + fullDecagon = partialDecagon // it's now full + return fullDecagon */ + + +// Use the `decagon` function declared above, to sketch a decagon with radius 5. +decagon(5.0) + |> close(%) ``` -![Rendered example of reduce 2](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAABMiklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V/FPwKn4gueWQqZ4gAAAABJRU5ErkJggg==) +![Rendered example of reduce 2](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAABvnklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqv+Hrrnmmge/2Iu92GufOXPmQddcc82DX+zFXuy1uer/pH/4h3/47X/4h3/4nfvuu+/Wf/iHf/htrrrqqquuuuqqq/5/QQ960IO46qqrrrrqqquu+r/ummuuefBrv/ZrvxfAO73TO302z/Snf/qnP8ZV/+e94iu+4jsA3Hfffbf+wz/8w2//wz/8w+/cd999t/7DP/zDb3PVVVddddVVV131fxt60IMexFVXXXXVVVddddX/Nddcc82DX/u1X/u9XvzFX/y1X+zFXuy1eabf/d3f/S6u+n/vNV/zNd8H4L777rv1H/7hH377H/7hH37nvvvuu/Uf/uEffpurrrrqqquuuuqq/1vQgx70IK666qqrrrrqqqv+N7vmmmsefObMmQe/2Iu92Gu9+Iu/+Gu/2Iu92GvzTL/7u7/7XVx11b/gNV/zNd8H4L777rv17Nmzt/793//9b//DP/zD7/zDP/zDb3PVVVddddVVV131vxt60IMexFVXXXXVVVddddX/Jtdcc82Dz5w58+AXe7EXe60Xf/EXf+0Xe7EXe22e6Xd/93e/i6uu+nd6zdd8zfcBuO+++24F+Id/+Iff/od/+Iff+a3f+q3v5qqrrrrqqquuuup/F/SgBz2Iq6666qqrrrrqqv/Jrrnmmge/9mu/9nsBvM7rvM57X3PNNQ8G+N3f/d3v4qqr/ou85mu+5vsA3Hfffbf+wz/8w2//wz/8w+/cd999t/7DP/zDb3PVVVddddVVV131Pxd60IMexFVXXXXVVVddddX/JNdcc82DX/u1X/u9rrnmmge/zuu8znvzTL/7u7/7XVx11f8Qr/mar/k+APfdd9+t//AP//Db//AP//A79913363/8A//8NtcddVVV1111VVX/c+BHvSgB3HVVVddddVVV1313+maa6558Gu/9mu/14u/+Iu/9ou92Iu9Ns/0u7/7u9/FVVf9L/Gar/ma7wNw33333Xr27Nlb//7v//63/+Ef/uF3/uEf/uG3ueqqq6666qqrrvrvgx70oAdx1VVXXXXVVVdd9V/lmmuuefCZM2ce/GIv9mKv9eIv/uKv/WIv9mKvzTP97u/+7ndx1VX/R7zma77m+wDcd999twL8wz/8w2//wz/8w+/81m/91ndz1VVXXXXVVVdd9V8HPehBD+Kqq6666qqrrrrqP8s111zz4Bd7sRd77TNnzjzoxV/8xV/7xV7sxV4b4Hd/93e/i6uu+n/mNV/zNd8H4L777rv1H/7hH377H/7hH37nvvvuu/Uf/uEffpurrrrqqquuuuqq/xzoQQ96EFddddVVV1111VX/Ua655poHv/Zrv/Z7AbzTO73TZ/NMv/u7v/tdXHXVVc/hNV/zNd8H4L777rv1H/7hH377H/7hH37nvvvuu/Uf/uEffpurrrrqqquuuuqq/xjoQQ96EFddddVVV1111VX/Vtdcc82DX/u1X/u9XvzFX/y1X+zFXuy1eabf/d3f/S6uuuqqf5XXfM3XfB+A++6779Z/+Id/+O1/+Id/+J377rvv1n/4h3/4ba666qqrrrrqqqv+bdCDHvQgrrrqqquuuuqqq14U11xzzYPPnDnz4Bd7sRd7rRd/8Rd/7Rd7sRd7bZ7pd3/3d7+Lq6666j/Ua77ma74PwH333Xfr2bNnb/37v//73/6Hf/iH3/mHf/iH3+aqq6666qqrrrrqRYMe9KAHcdVVV1111VVXXfX8XHPNNQ8+c+bMg1/sxV7stV78xV/8tV/sxV7stXmm3/3d3/0urrrqqv9Sr/mar/k+APfdd9+tAP/wD//w2//wD//wO7/1W7/13Vx11VVXXXXVVVc9f+hBD3oQV1111VVXXXXVVQDXXHPNg1/7tV/7vQBe53Ve572vueaaBwP87u/+7ndx1VVX/Y/0mq/5mu8DcN999936D//wD7/9D//wD79z33333foP//APv81VV1111VVXXXUVoAc96EFcddVVV1111VX/P11zzTUPfu3Xfu33Anind3qnz+aZfvd3f/e7uOqqq/5Xes3XfM33ATh79uwz/v7v//63/uEf/uF37rvvvlv/4R/+4be56qqrrrrqqqv+P0IPetCDuOqqq6666qqr/n+45pprHvzar/3a7/XiL/7ir/1iL/Zir80z/e7v/u53cdVVV/2f9Jqv+ZrvA3Dffffdevbs2Wf8/d///W/9wz/8w+/8wz/8w29z1VVXXXXVVVf9f4Ae9KAHcdVVV1111VVX/d9zzTXXPPjMmTMPfrEXe7HXevEXf/HXfrEXe7HX5pl+93d/97u46qqr/l96zdd8zfcBuO+++24F+Id/+Iff+a3f+q3v/od/+Iff5qqrrrrqqquu+r8IPehBD+Kqq6666qqrrvrf75prrnnwi73Yi732mTNnHvTiL/7ir/1iL/Zirw3wu7/7u9/FVVddddUL8Zqv+ZrvA3Dffffd+g//8A+//Q//8A+/8w//8A+/fd99993KVVddddVVV131vx160IMexFVXXXXVVVdd9b/PNddc8+DXfu3Xfi+Ad3qnd/psnul3f/d3v4urrrrqqn+H13zN13wfgPvuu+/Wf/iHf/jtf/iHf/id++6779Z/+Id/+G2uuuqqq6666qr/bdCDHvQgrrrqqquuuuqq//muueaaB7/2a7/2e734i7/4a7/Yi73Ya/NMv/u7v/tdXHXVVVf9J3rN13zN9wG47777bv2Hf/iH3/6Hf/iH37nvvvtu/Yd/+Iff5qqrrrrqqquu+p8OPehBD+Kqq6666qqrrvqf5ZprrnnwmTNnHvxiL/Zir/XiL/7ir/1iL/Zir80z/e7v/u53cdVVV1313+g1X/M13wfg7Nmzz7jv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vvvuu/WzPuuzXue+++67lauuuuqqq676/4Ny/Phxrrrqqquuuur/ixd7sRd77a/4iq/4qyc84Qm/9YxnPOOvueqqq6666v+FZzzjGX997ty5W9/xHd/xczY2No79wz/8w+9w1VVXXXXVVf8/UI4fP85VV1111VVX/X/wju/4jp/1ER/xEd/9u7/7u9/FVVddddVV/y+dO3fu6W/2Zm/2MQD/8A//8DtcddVVV1111f996EEPehBXXXXVVVdd9X/ZNddc8+AP//AP/64Xe7EXe+3f/d3f/S6uuuqqq676f+81X/M13+e+++679bM+67Ne57777ruVq6666qqrrvq/Cz3oQQ/iqquuuuqqq/6vep3XeZ33/vAP//Dv+t3f/d3v4qqrrrrqqquey6Mf/ejX+e3f/u3v+ZEf+ZHP5qqrrrrqqqv+b6IcP36cq6666qqrrvq/6HM/93N/683f/M0/+nd/93e/i6uuuuqqq656Ps6dO3frm77pm340wD/8wz/8DlddddVVV131fw960IMexFVXXXXVVVf9X3LNNdc8+HM+53N+65prrnnw7/7u734XV1111VVXXfUveM3XfM33ue+++279rM/6rNe57777buWqq6666qqr/u9AD3rQg7jqqquuuuqq/yve8R3f8bPe6Z3e6bN/93d/97u46qqrrrrqqn+lRz/60a/zW7/1W9/9oz/6o5/DVVddddVVV/3fQDl+/DhXXXXVVVdd9b/dNddc8+BP+qRP+qnXeZ3Xee/f/d3f/S6uuuqqq6666t/g3Llzt77Zm73Zx7z4i7/4a//DP/zD7xweHu5y1VVXXXXVVf+7UY4fP85VV1111VVX/W/2Yi/2Yq/9FV/xFX91zTXXPPh3f/d3v4urrrrqqquu+nd4xjOe8dev8Aqv8Dav+Iqv+NZHR0eXbr311r/mqquuuuqqq/73Qg960IO46qqrrrrqqv+t3vEd3/Gz3umd3umzf/d3f/e7uOqqq6666qr/YI9+9KNf57d+67e++0d/9Ec/h6uuuuqqq6763wk96EEP4qqrrrrqqqv+t7nmmmse/OEf/uHf9WIv9mKv/bu/+7vfxVVXXXXVVVf9J3nN13zN97nvvvtu/azP+qzXue+++27lqquuuuqqq/53oRw/fpyrrrrqqquu+t/kxV7sxV77K77iK/7qCU94wm894xnP+Guuuuqqq6666j/RM57xjL8+d+7cre/4ju/4ORsbG8f+4R/+4Xe46qqrrrrqqv89KMePH+eqq6666qqr/rd4x3d8x8/6iI/4iO/+3d/93e/iqquuuuqqq/4LnTt37ulv9mZv9jEA//AP//A7XHXVVVddddX/DuhBD3oQV1111VVXXfU/3TXXXPPgD//wD/+uF3uxF3vt3/3d3/0urrrqqquuuuq/yWu+5mu+z3333XfrZ33WZ73OfffddytXXXXVVVdd9T8betCDHsRVV1111VVX/U/2Oq/zOu/94R/+4d/1u7/7u9/FVVddddVVV/0P8ehHP/p1fvu3f/t7fuRHfuSzueqqq6666qr/uSjHjx/nqquuuuqqq/6n+vAP//Dveqd3eqfP/t3f/d3v4qqrrrrqqqv+Bzl37tytb/qmb/rRAP/wD//wO1x11VVXXXXV/0zoQQ96EFddddVVV131P80111zz4M/5nM/5rWuuuebBv/u7v/tdXHXVVVddddX/UK/5mq/5Pvfdd9+tn/VZn/U69913361cddVVV1111f8s6EEPehBXXXXVVVdd9T/JO77jO37WO73TO3327/7u734XV1111VVXXfW/xKMf/ejX+a3f+q3v/tEf/dHP4aqrrrrqqqv+50APetCDuOqqq6666qr/Ca655poHf/iHf/h3vdiLvdhr/+7v/u53cdVVV1111VX/y7zma77m+/zDP/zDb3/mZ37m63DVVVddddVV/zNQjh8/zlVXXXXVVVf9d3uxF3ux1/6Kr/iKv7rmmmse/Lu/+7vfxVVXXXXVVVf9L/SMZzzjr1/hFV7hbV7ndV7nvW+99da/OXv27K1cddVVV1111X8v9KAHPYirrrrqqquu+u/0ju/4jp/1Tu/0Tp/9u7/7u9/FVVddddVVV/0f8ehHP/p1fuu3fuu7f/RHf/RzuOqqq6666qr/PuhBD3oQV1111VVXXfXf4Zprrnnwh3/4h3/Xi73Yi7327/7u734XV1111VVXXfV/zGu+5mu+z3333XfrZ33WZ73OfffddytXXXXVVVdd9V+Pcvz4ca666qqrrrrqv9qLvdiLvfZXfMVX/NUTnvCE33rGM57x11x11VVXXXXV/0HPeMYz/vrcuXO3vuM7vuPnbGxsHPuHf/iH3+Gqq6666qqr/mtRjh8/zlVXXXXVVVf9V3rHd3zHz/qIj/iI7/7d3/3d7+Kqq6666qqr/h84d+7c09/szd7sYwD+4R/+4Xe46qqrrrrqqv866EEPehBXXXXVVVdd9V/hmmuuefCHf/iHf9eLvdiLvfbv/u7vfhdXXXXVVVdd9f/Ma77ma77Pfffdd+tnfdZnvc599913K1ddddVVV131n49y/Phxrrrqqquuuuo/24u92Iu99ld8xVf81ROe8ITfesYznvHXXHXVVVddddX/Q894xjP++ty5c7e+wzu8w2dvbW2d+Id/+Iff5qqrrrrqqqv+c1GOHz/OVVddddVVV/1nesd3fMfP+oiP+Ijv/t3f/d3v4qqrrrrqqquu4ty5c7e+6Zu+6UcD/MM//MPvcNVVV1111VX/edCDHvQgrrrqqquuuuo/wzXXXPPgD//wD/+uF3uxF3vt3/3d3/0urrrqqquuuuqq5/Car/ma73Pffffd+lmf9Vmvc999993KVVddddVVV/3HQw960IO46qqrrrrqqv9or/M6r/PeH/7hH/5dv/u7v/tdXHXVVVddddVVL9SjH/3o1/mt3/qt7/7RH/3Rz+Gqq6666qqr/mNRjh8/zlVXXXXVVVf9R/rcz/3c33rzN3/zj/7d3/3d7+Kqq6666qqrrvoXnTt37tY3e7M3+xhJ+od/+Iff5qqrrrrqqqv+46AHPehBXHXVVVddddV/hGuuuebBn/M5n/Nb11xzzYN/93d/97u46qqrrrrqqqv+VV7zNV/zfe67775bP+uzPut17rvvvlu56qqrrrrqqn8/9KAHPYirrrrqqquu+vd6x3d8x896p3d6p8/+3d/93e/iqquuuuqqq676d3n0ox/9Or/1W7/13T/6oz/6OVx11VVXXXXVvw/l+PHjXHXVVVddddW/1TXXXPPgT/qkT/qp13md13nv3/3d3/0urrrqqquuuuqqf7dz587d+mZv9mYf8+Iv/uKv/Q//8A+/c3h4uMtVV1111VVX/dsQXHXVVVddddW/w2u/9mu/14u92Iu99u/+7u9+F1ddddVVV1111X+Y3/3d3/2uF3uxF3vt13md13lvrrrqqquuuurfjuCqq6666qqr/h3e6Z3e6bN/93d/97u46qqrrrrqqqv+w/3u7/7ud73O67zOe19zzTUP5qqrrrrqqqv+bahcddVVV1111b/DfffddytXXXXVVVddddV/mjNnzjzovvvuu5Wrrrrqqquu+rehctVVV1111VX/DmfPnr2Vq6666qqrrrrqP81v/dZvfQ9XXXXVVVdd9W9HcNVVV1111VX/Dn//93//21x11VVXXXXVVf9p7rvvvqdz1VVXXXXVVf92BFddddVVV1317/AP//APv/Oar/ma78NVV1111VVXXfUf7jVf8zXf5+zZs8/gqquuuuqqq/7tqFx11VVXXXXVv8PZs2dv5aqrrrrqqquu+k/zD//wD7/NVVddddVVV/3bUbnqqquuuuqqf4f77rvvVq666qqrrrrqqv809913361cddVVV1111b8dlauuuuqqq676d/qHf/iH3+aqq6666qqrrvoP9w//8A+/zVVXXXXVVVf9+xBcddVVV1111b/TfffddytXXXXVVVddddV/uPvuu+9Wrrrqqquuuurfh+Cqq6666qqr/p3uu+++W1/zNV/zfbjqqquuuuqqq/7DvOZrvub7/MM//MPvcNVVV1111VX/PlSuuuqqq6666t/pH/7hH36Hq6666qqrrrrqP9w//MM//DZXXXXVVVdd9e9D5aqrrrrqqqv+nc6ePXsrV1111VVXXXXVf7j77rvvVq666qqrrrrq34fKVVddddVVV/073Xfffbf+wz/8w29z1VVXXXXVVVddddVVV1111f80VK666qqrrrrqqquuuuqqq676H+e3fuu3vpurrrrqqquu+vcjuOqqq6666qr/AH//93//26/5mq/5Plx11VVXXXXVVf9ur/mar/k+9913361cddVVV1111b8flauuuuqqq676D/AP//APv8NVV1111VVXXfUf5uzZs8/gqquuuuqqq/79qFx11VVXXXXVf4CzZ8/eylVXXXXVVVdd9R/mH/7hH36bq6666qqrrvr3o3LVVVddddVV/wHuu+++W7nqqquuuuqqq/7D3Hfffbdy1VVXXXXVVf9+VK666qqrrrrqP8g//MM//DZXXXXVVVddddW/22/91m99N1ddddVVV131H4Pgqquuuuqqq/6D/P3f//1vc9VVV1111VVXXXXVVVddddX/JARXXXXVVVdd9R/k7Nmzz3jN13zN9+Gqq6666qqrrvo3e83XfM33+Yd/+Iff4aqrrrrqqqv+Y1C56qqrrrrqqv8g9913361cddVVV1111VX/bv/wD//w21x11VVXXXXVfwwqV1111VVXXfUf5OzZs7dy1VVXXXXVVVf9u9133323ctVVV1111VX/MahcddVVV1111X+Q++6779Z/+Id/+G2uuuqqq6666qp/s/vuu+9Wrrrqqquuuuo/DpWrrrrqqquuuuqqq6666qqr/sf4h3/4h9/mqquuuuqqq/7jEFx11VVXXXXVf6C///u//+3XfM3XfB+uuuqqq6666qp/tdd8zdd8n/vuu+9Wrrrqqquuuuo/DpWrrrrqqquu+g/0D//wD7/DVVddddVVV131b3b27NlncNVVV1111VX/cahcddVVV1111X+gs2fP3spVV1111VVXXfVv9g//8A+/zVVXXXXVVVf9x6Fy1VVXXXXVVf+B7rvvvlvvu+++W7nqqquuuuqqq/5N7rvvvlu56qqrrrrqqv84VK666qqrrrrqP9jZs2dv5aqrrrrqqquu+lf7rd/6re/hqquuuuqqq/5jEVx11VVXXXXVf7C///u//22uuuqqq6666qqrrrrqqquu+p+A4Kqrrrrqqqv+g/3DP/zD77zma77m+3DVVVddddVVV73IXvM1X/N9/uEf/uG3ueqqq6666qr/WFSuuuqqq6666j/Y2bNnb+Wqq6666qqrrvpX+4d/+Iff5qqrrrrqqqv+Y1G56qqrrrrqqquuuuqqq6666n+E++6771auuuqqq6666j8Wlauuuuqqq676D3bffffd+g//8A+/zVVXXXXVVVdd9SL7h3/4h9/mqquuuuqqq/7jUbnqqquuuuqqq6666qqrrrrqv9199913K1ddddVVV131H4/gqquuuuqqq/4T/P3f//1vv+Zrvub7cNVVV1111VVX/Yte8zVf833+4R/+4Xe46qqrrrrqqv94VK666qqrrrrqP8E//MM//A5XXXXVVVddddVVV1111VVX/XejctVVV1111VX/Cc6ePXsrV1111VVXXXXVi+wf/uEffpurrrrqqquu+o9H5aqrrrrqqqv+E9x333233nfffbdy1VVXXXXVVVe9SO67775bueqqq6666qr/eFSuuuqqq6666j/J2bNnb+Wqq6666qqrrvoX/dZv/dZ3c9VVV1111VX/OQiuuuqqq6666j/J3//93/82V1111VVXXXXVVVddddVVV/13Irjqqquuuuqq/yT/8A//8Duv+Zqv+T5cddVVV1111VUv0Gu+5mu+zz/8wz/8DlddddVVV131n4PKVVddddVVV/0nOXv27K1cddVVV1111VX/on/4h3/4ba666qqrrrrqPweVq6666qqrrvpPct99993KVVddddVVV131L7rvvvtu5aqrrrrqqqv+c1C56qqrrrrqqv9E//AP//DbXHXVVVddddVVL9A//MM//DZXXXXVVVdd9Z+H4Kqrrrrqqqv+E9133323ctVVV1111VVXvUD33XffrVx11VVXXXXVfx6Cq6666qqrrvpPdN999936mq/5mu/DVVddddVVV131PF7zNV/zff7hH/7hd7jqqquuuuqq/zxUrrrqqquuuuo/0T/8wz/8DlddddVVV1111Qv0D//wD7/NVVddddVVV/3noXLVVVddddVV/4nOnj17K1ddddVVV1111VVXXXXVVVf9d6Fy1VVXXXXVVf+J7rvvvlvvu+++W7nqqquuuuqqq56v++6771auuuqqq6666j8Plauuuuqqq676T3b27Nlbueqqq6666qqrnsdv/dZvfTdXXXXVVVdd9Z+L4Kqrrrrqqqv+k/393//9b7/ma77m+3DVVVddddVVVz3La77ma77PfffddytXXXXVVVdd9Z+LylVXXXXVVVf9J/uHf/iH3+Gqq6666qqrrnoeZ8+efQZXXXXVVVdd9Z+LylVXXXXVVVf9Jzt79uytXHXVVVddddVVz+Mf/uEffpurrrrqqquu+s9F5aqrrrrqqqv+k9133323ctVVV1111VVXPY/77rvvVq666qqrrrrqPxeVq6666qqrrvov8A//8A+/zVVXXXXVVVdd9Sz/8A//8DtcddVVV1111X8+gquuuuqqq676L/D3f//3v81VV1111VVXXfUs9913361cddVVV1111X8+gquuuuqqq676L/Kar/ma78NVV1111VVXXcVrvuZrvs8//MM//DZXXXXVVVdd9Z+PylVXXXXVVVf9F/iHf/iH3+Gqq6666qqrrnqWf/iHf/htrrrqqquuuuo/H5Wrrrrqqquu+i9w9uzZW7nqqquuuuqqq57lvvvuu5Wrrrrqqquu+s9H5aqrrrrqqqv+C9x33323/sM//MNvc9VVV1111VVXcd99993KVVddddVVV/3XoHLVVVddddVVV1111VVXXXXVf6l/+Id/+G2uuuqqq6666r8GwVVXXXXVVVf9F/n7v//7337N13zN9+Gqq6666qqr/h97zdd8zfe57777buWqq6666qqr/mtQueqqq6666qr/Iv/wD//wO1x11VVXXXXVVZw9e/YZXHXVVVddddV/DSpXXXXVVVdd9V/k7Nmzt3LVVVddddVVV/EP//APv81VV1111VVX/degctVVV1111VX/Re67775bueqqq6666qqruO+++27lqquuuuqqq/5rULnqqquuuuqq/0L/8A//8NtcddVVV1111f9jv/Vbv/XdXHXVVVddddV/HYKrrrrqqquu+i/0W7/1W9/DVVddddVVV/0/dt99993KVVddddVVV/3XIbjqqquuuuqq/0K/9Vu/9d2tNb3ma77m+3DVVVddddVV/4+85mu+5vucOnXqIT/6oz/6OVx11VVXXXXVfx30oAc9iKuuuuqqq676r3bNNdc8+LVf+7Xf653e6Z0+G+B3f/d3v4urrrrqqquu+j/mNV/zNd8H4Ed+5Ec++7d/+7e/57777ruVq6666qqrrvqvhR70oAdx1VVXXXXVVf9drrnmmge/9mu/9nu9zuu8zntfc801D/7d3/3d7+Kqq6666qqr/pd7zdd8zfe57777bv2t3/qt7/7RH/3Rz+Gqq6666qqr/vugBz3oQVx11VVXXXXVf7drrrnmwS/2Yi/22q/zOq/zXi/2Yi/22r/7u7/7XVx11VVXXXXV/zKv+Zqv+T733Xffrb/1W7/13T/6oz/6OVx11VVXXXXVfz/0oAc9iKuuuuqqq676n+Saa6558Du+4zt+1uu8zuu8N8Dv/u7vfhdXXXXVVVdd9T/Ua77ma74PwI/8yI989m//9m9/z3333XcrV1111VVXXfU/B3rQgx7EVVddddVVV/1PdM011zz4tV/7td/rdV7ndd77mmuuefDv/u7vfhdXXXXVVVdd9T/Ea77ma77Pfffdd+tv/dZvffeP/uiPfg5XXXXVVVdd9T8TetCDHsRVV1111VVX/U92zTXXPPjFXuzFXvt1Xud13uvFXuzFXvt3f/d3v4urrrrqqquu+m/ymq/5mu9z33333fpbv/Vb3/2jP/qjn8NVV1111VVX/c+GHvSgB3HVVVddddVV/1tcc801D37Hd3zHz3qd13md9wb43d/93e/iqquuuuqqq/6TveZrvub7APzIj/zIZ//2b//299x33323ctVVV1111VX/O6AHPehBXHXVVVddddX/Ntdcc82DX/u1X/u93umd3umzAX73d3/3u7jqqquuuuqq/2Cv+Zqv+T733Xffrb/1W7/13T/6oz/6OVx11VVXXXXV/z7oQQ96EFddddVVV131v9U111zz4Bd7sRd77dd5ndd5rxd7sRd77d/93d/9Lq666qqrrrrq3+k1X/M13+e+++679bd+67e++0d/9Ec/h6uuuuqqq6763ws96EEP4qqrrrrqqqv+L7jmmmse/I7v+I6f9Tqv8zrvDfC7v/u738VVV1111VVXvYhe8zVf830Afuu3fuu7f+RHfuSzz549+wyuuuqqq6666n8/9KAHPYirrrrqqquu+r/kmmuuefBrv/Zrv9c7vdM7fTbA7/7u734XV1111VVXXfUCvOZrvub73Hfffbf+1m/91nf/9m//9vfcd999t3LVVVddddVV/3egBz3oQVx11VVXXXXV/0XXXHPNg1/sxV7stV/ndV7nvV7sxV7stX/3d3/3u7jqqquuuuqqZ3rN13zN97nvvvtu/a3f+q3v/tEf/dHP4aqrrrrqqqv+b0IPetCDuOqqq6666qr/66655poHv+M7vuNnvc7rvM57A/zu7/7ud3HVVVddddX/O6/5mq/5PgD/8A//8Nu/9Vu/9T2/9Vu/9d1cddVVV1111f9t6EEPehBXXXXVVVdd9f/FNddc8+DXfu3Xfq93eqd3+myA3/3d3/0urrrqqquu+j/vNV/zNd/nvvvuu/W3fuu3vvu3f/u3v+e+++67lauuuuqqq676/wE96EEP4qqrrrrqqqv+v7nmmmse/GIv9mKv/Tqv8zrv9WIv9mKv/bu/+7vfxVVXXXXVVf/nvOZrvub73Hfffbf+1m/91nf/6I/+6Odw1VVXXXXVVf//oAc96EFcddVVV1111f9nL/ZiL/ba7/RO7/RZL/ZiL/baAL/7u7/7XVx11VVXXfW/1mu+5mu+D8B9991364/+6I9+zm/91m99N1ddddVVV131/xd60IMexFVXXXXVVVddBddcc82DX/u1X/u93umd3umzAX73d3/3u7jqqquuuup/jdd8zdd8n/vuu+/W3/qt3/ru3/7t3/6e++6771auuuqqq6666ir0oAc9iKuuuuqqq6666tmuueaaB7/2a7/2e73O67zOe19zzTUP/t3f/d3v4qqrrrrqqv+xXvM1X/N97rvvvlt/67d+67t/9Ed/9HO46qqrrrrqqqseCD3oQQ/iqquuuuqqq656/l7ndV7nvV/ndV7nvV7sxV7stX/3d3/3u7jqqquuuup/jNd8zdd8n/vuu+/WH/3RH/2c3/qt3/purrrqqquuuuqq5wc96EEP4qqrrrrqqquueuGuueaaB7/2a7/2e73TO73TZwP87u/+7ndx1VVXXXXVf7nXfM3XfB+AH/mRH/ns3/7t3/6e++6771auuuqqq6666qoXBj3oQQ/iqquuuuqqq6560VxzzTUPfu3Xfu33ep3XeZ33vuaaax78u7/7u9/FVVddddVV/+le8zVf833uu+++W3/rt37ru3/0R3/0c7jqqquuuuqqq15U6EEPehBXXXXVVVddddW/zjXXXPPgF3uxF3vt13md13mvF3uxF3vt3/3d3/0urrrqqquu+g/3mq/5mu9z33333fqjP/qjn/Nbv/Vb381VV1111VVXXfWvhR70oAdx1VVXXXXVVVf9211zzTUPfu3Xfu33eqd3eqfPBvjd3/3d7+Kqq6666qp/s9d8zdd8H4Af+ZEf+ezf+q3f+u6zZ88+g6uuuuqqq6666t8KPehBD+Kqq6666qqrrvr3u+aaax782q/92u/1Oq/zOu99zTXXPPh3f/d3v4urrrrqqqteZK/5mq/5Pvfdd9+tv/Vbv/XdP/qjP/o5XHXVVVddddVV/xHQgx70IK666qqrrrrqqv8411xzzYNf7MVe7LVe53Ve571f7MVe7LV/93d/97u46qqrrrrqBXrN13zN97nvvvtu/a3f+q3v/tEf/dHP4aqrrrrqqquu+o+EHvSgB3HVVVddddVVV/3nuOaaax78ju/4jp/1Oq/zOu8N8Lu/+7vfxVVXXXXVVbzma77m+wD8yI/8yGf/9m//9vfcd999t3LVVVddddVVV/1nQA960IO46qqrrrrqqqv+c11zzTUPfu3Xfu33ep3XeZ33vuaaax78u7/7u9/FVVddddX/Q6/5mq/5Pvfdd9+tv/Vbv/XdP/qjP/o5XHXVVVddddVV/9nQgx70IK666qqrrrrqqv8a11xzzYNf7MVe7LVf53Ve571e7MVe7LV/93d/97u46qqrrvp/4DVf8zXf57777rv1t37rt777R3/0Rz+Hq6666qqrrrrqvwp60IMexFVXXXXVVVdd9V/vmmuuefA7vuM7ftbrvM7rvDfA7/7u734XV1111VX/h7zma77m+wD8yI/8yGf/9m//9vfcd999t3LVVVddddVVV/1XQw960IO46qqrrrrqqqv++1xzzTUPfu3Xfu33eqd3eqfPBvjd3/3d7+Kqq6666n+x13zN13yf++6779bf+q3f+u4f/dEf/Ryuuuqqq6666qr/TuhBD3oQV1111VVXXXXVf79rrrnmwS/2Yi/22q/zOq/zXi/2Yi/22r/7u7/7XVx11VVX/S/ymq/5mu9z33333fpbv/Vb3/2jP/qjn8NVV1111VVXXfU/AXrQgx7EVVddddVVV131P8s111zz4Hd8x3f8rNd5ndd5b4Df/d3f/S6uuuqqq/4Hes3XfM33Afit3/qt7/7RH/3Rz7nvvvtu5aqrrrrqqquu+p8EPehBD+Kqq6666qqrrvqf6Zprrnnwa7/2a7/XO73TO302wO/+7u9+F1ddddVV/wO85mu+5vvcd999t/7Wb/3Wd//oj/7o53DVVVddddVVV/1PhR70oAdx1VVXXXXVVVf9z3bmzJkHvfiLv/jrvM7rvM57vdiLvdhr/+7v/u53cdVVV1313+A1X/M13+e+++679bd+67e++0d/9Ec/h6uuuuqqq6666n869KAHPYirrrrqqquuuup/j2uuuebB7/iO7/hZr/M6r/PeAL/7u7/7XVx11VVX/Sd6zdd8zfcB+Id/+Iff/q3f+q3v+a3f+q3v5qqrrrrqqquu+t8CPehBD+Kqq6666qqrrvrf58yZMw96ndd5nfd+p3d6p88G+N3f/d3v4qqrrrrqP9BrvuZrvs99991362/91m9992/91m9999mzZ5/BVVddddVVV131vw160IMexFVXXXXVVVdd9b/XNddc8+AXe7EXe+3XeZ3Xea8Xe7EXe+3f/d3f/S6uuuqqq/4dXvM1X/N97rvvvlt/67d+67t/9Ed/9HO46qqrrrrqqqv+N0MPetCDuOqqq6666qqr/m94sRd7sdd6ndd5nfd+ndd5nfcG+N3f/d3v4qqrrrrqRfCar/ma7wNw33333fqjP/qjn/1bv/Vb38NVV1111VVXXfV/AXrQgx7EVVddddVVV131f8s111zz4Nd+7dd+r3d6p3f6bIDf/d3f/S6uuuqqq56P13zN13yf++6779bf+q3f+u7f/u3f/p777rvvVq666qqrrrrqqv9L0IMe9CCuuuqqq6666qr/m6655poHv/Zrv/Z7vc7rvM57X3PNNQ/+3d/93e/iqquuugp4zdd8zfe57777bv2t3/qt7/7RH/3Rz+Gqq6666qqrrvq/Cj3oQQ/iqquuuuqqq676v+91Xud13vt1Xud13uvFXuzFXvt3f/d3v4urrrrq/6XXfM3XfJ/77rvv1h/90R/9nN/6rd/6bq666qqrrrrqqv/r0IMe9CCuuuqqq6666qr/P6655poHv/Zrv/Z7vdM7vdNnA/zu7/7ud3HVVVf9n/aar/ma7wPwIz/yI5/927/9299z33333cpVV1111VVXXfX/BXrQgx7EVVddddVVV131/88111zz4Nd+7dd+r9d5ndd572uuuebBv/u7v/tdXHXVVf+nvOZrvub73Hfffbf+1m/91nf/6I/+6Odw1VVXXXXVVVf9f4Qe9KAHcdVVV1111VVX/f91zTXXPPjFXuzFXvt1Xud13uvFXuzFXvt3f/d3v4urrrrqf7XXfM3XfJ/77rvv1h/90R/9nN/6rd/6bq666qqrrrrqqv/P0IMe9CCuuuqqq6666qqrAK655poHv/Zrv/Z7vdM7vdNnA/zu7/7ud3HVVVf9r/Car/ma7wPwIz/yI5/927/9299z33333cpVV1111VVXXXUVoAc96EFcddVVV1111VVXPdA111zz4Nd+7dd+r9d5ndd572uuuebBv/u7v/tdXHXVVf8jveZrvub73Hfffbf+1m/91nf/6I/+6Odw1VVXXXXVVVdd9ZzQgx70IK666qqrrrrqqquenzNnzjzoxV/8xV/ndV7ndd7rxV7sxV77d3/3d7+Lq6666n+E13zN13yf++6779Yf/dEf/Zzf+q3f+m6uuuqqq6666qqrnj/0oAc9iKuuuuqqq6666qp/yTXXXPPgd3zHd/ys13md13lvgN/93d/9Lq666qr/Uq/5mq/5PgA/8iM/8tm//du//T333XffrVx11VVXXXXVVVe9cOhBD3oQV1111VVXXXXVVS+qM2fOPOh1Xud13vt1Xud13vuaa6558O/+7u9+F1ddddV/qtd8zdd8n/vuu+/W3/qt3/ruH/3RH/0crrrqqquuuuqqq1506EEPehBXXXXVVVddddVV/1rXXHPNg1/sxV7stV/ndV7nvV7sxV7stX/3d3/3u7jqqqv+Q73ma77m+9x33323/tZv/dZ3/+iP/ujncNVVV1111VVXXfWvhx70oAdx1VVXXXXVVVdd9e9x5syZB73TO73TZ7/O67zOewP87u/+7ndx1VVX/Zu85mu+5vsA/MiP/Mhn/9Zv/dZ3nz179hlcddVVV1111VVX/duhBz3oQVx11VVXXXXVVVf9R7jmmmse/Nqv/drv9Tqv8zrvfc011zz4d3/3d7+Lq6666kXymq/5mu9z33333fpbv/Vb3/2jP/qjn8NVV1111VVXXXXVfwz0oAc9iKuuuuqqq6666qr/SNdcc82DX+zFXuy1Xud1Xue9X+zFXuy1f/d3f/e7uOqqq56v13zN13yf++6779bf+q3f+u4f/dEf/Ryuuuqqq6666qqr/mOhBz3oQVx11VVXXXXVVVf9Z7nmmmse/I7v+I6f9Tqv8zrvDfC7v/u738VVV/0/95qv+ZrvA/Bbv/Vb3/2jP/qjn3PffffdylVXXXXVVVddddV/DvSgBz2Iq6666qqrrrrqqv9s11xzzYNf+7Vf+73e6Z3e6bPvu+++W6+55poHc9VV/w/dd999t/7Wb/3Wd//oj/7o53DVVVddddVVV131nw896EEP4qqrrrrqqquuuuq/0jXXXPNgnsm2JYkHsG1J4gFsW5J4ANuWJB7AtiWJB7BtSeIBbFuSeADbliQewLYliQewbUniAWxbkngA25YkHsC2JYkHsG1J4gFsW5J4ANuWJB7AtiWJB7BtSeIBbFuSeADbliQewLYliQewbUniAWxbkngA25YkHsC2JYkHsG1J4gFsW5J4ANuWJB7AtiWJB7BtSeIBbFuSeADbliQewLYliQewbUniAWxbkngA25YkHsC2JYkHsG1JArjvvvtu5aqrrrrqqquuuuq/FnrQgx7EVVddddVVV1111VVXXXXVVVddddVVV131fxKVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/Kv4R4nLOaOpJfrUAAAAASUVORK5CYII=) diff --git a/docs/kcl/rem.md b/docs/kcl/rem.md index 5fc72fc1d..9e53743f5 100644 --- a/docs/kcl/rem.md +++ b/docs/kcl/rem.md @@ -9,7 +9,7 @@ Compute the remainder after dividing `num` by `div`. If `num` is negative, the result will be too. ```js -rem(num: i64, divisor: i64) -> i64 +rem(num: number, divisor: number) -> number ``` ### Tags @@ -21,20 +21,23 @@ rem(num: i64, divisor: i64) -> i64 | Name | Type | Description | Required | |----------|------|-------------|----------| -| `num` | `i64` | | Yes | -| `divisor` | `i64` | | Yes | +| `num` | `number` | The number which will be divided by `divisor`. | Yes | +| `divisor` | `number` | The number which will divide `num`. | Yes | ### Returns -`i64` +`number` ### Examples ```js -assertEqual(rem(int(7), int(4)), 3, 0.01, "remainder is 3") -assertEqual(rem(int(-7), int(4)), -3, 0.01, "remainder is 3") -assertEqual(rem(int(7), int(-4)), 3, 0.01, "remainder is 3") +assertEqual(rem(7, divisor = 4), 3, 0.01, "remainder is 3") +assertEqual(rem(-7, divisor = 4), -3, 0.01, "remainder is -3") +assertEqual(rem(7, divisor = -4), 3, 0.01, "remainder is 3") +assertEqual(rem(6, divisor = 2.5), 1, 0.01, "remainder is 1") +assertEqual(rem(6.5, divisor = 2.5), 1.5, 0.01, "remainder is 1.5") +assertEqual(rem(6.5, divisor = 2), 0.5, 0.01, "remainder is 0.5") ``` ![Rendered example of rem 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAABMiklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V/FPwKn4gueWQqZ4gAAAABJRU5ErkJggg==) diff --git a/docs/kcl/revolve.md b/docs/kcl/revolve.md index d7dc10860..297ead630 100644 --- a/docs/kcl/revolve.md +++ b/docs/kcl/revolve.md @@ -40,7 +40,7 @@ part001 = startSketchOn('XY') |> line([0, -5.5], %) |> line([-2, 0], %) |> close(%) - |> revolve({ axis: 'y' }, %) // default angle is 360 + |> revolve({ axis = 'y' }, %) // default angle is 360 ``` ![Rendered example of revolve 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAGK/klEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq676X+Waa655MMCZM2ceDHDNNdc8+MyZMw/ima655poHA9x33323vviLv/hr80Lcd999t15zzTUPvu+++27lAe67775bz549+wye6b777rv17Nmzt9533323ctVVV1111VVXXXXV/yboQQ96EFddddVVV1111VVX/c9xzTXXPPjMmTMPfrEXe7HXArjmmmsefM011zz4zJkzD77mmmsezItgd3eX++3u7gJw33333frIRz7ywTzA8ePH+de67777bgU4e/bsrffdd9+tAP/wD//wO/fdd9+tAP/wD//w21x11VVXXXXVVVdd9T8FetCDHsRVV1111VVXXXXVVf+1rrnmmgefOXPmwS/2Yi/2WgAv/uIv/tov9mIv9to8H7u7u+zu7rK7uwvA7u4u99vd3WV3dxeA3d1ddnd3+Y9w/PhxbANw/Phxjh8/DsBDHvIQAI4fP87x48c5fvw4z899991369mzZ2+97777bv2Hf/iH37nvvvtu/Yd/+Iff5qqrrrrqqquuuuqq/2roQQ96EFddddVVV1111VVX/ee55pprHnzmzJkHv9iLvdhrvfiLv/hrv9iLvdhr81x2d3cBuPXWW9nd3eXWW29ld3eX3d1d/qewzfNz/Phxjh8/zvHjxwF4yEMegm2OHz/OQx7yEB7ovvvuu/Xs2bO33nfffbf+wz/8w+/8wz/8w2/fd999t3LVVVddddVVV1111X8W9KAHPYirrrrqqquuuuqqq/7jXHPNNQ9+7dd+7fd68Rd/8dd+sRd7sdfmAXZ3d9nd3eXpT386krj11lu59dZb+Y8giX+Jbf6j2OZFcezYMR7ykIfw4Ac/mOPHj/OQhzyEB7rvvvtu/Yd/+Iff/od/+Iffue+++279h3/4h9/mqquuuuqqq6666qr/KOhBD3oQV1111VVXXXXVVVf9211zzTUPfu3Xfu33evEXf/HXfrEXe7HX5pl2d3fZ3d3l6U9/Orfeeiu33norkvjXksR/Fdv8W9jmX2Kb+x0/fpyHPOQhPPjBD+b48eM85CEP4X733Xffrf/wD//w2/fdd9+t//AP//A7//AP//DbXHXVVVddddVVV131b4Ue9KAHcdVVV1111VVXXXXVi+6aa6558Gu/9mu/14u/+Iu/9ou92Iu9Ns+0u7vL7u4uT3/607n11lu59dZbAZDEv4Yk/iexzb+GbV4Y2zw/x44d4yEPeQgPechDOH78OA95yEMAuO+++249e/bsrX//93//2//wD//wO//wD//w21x11VVXXXXVVVdd9aJCD3rQg7jqqquuuuqqq6666oV7sRd7sdd+sRd7sdd6p3d6p8/mmXZ3d7n11lu5ePEit956K7feeisPJIkXhST+N7HNi8I2L4xtnh/bABw/fpyHPOQhPOQhD+FlXuZluN9999136z/8wz/89m/91m99zz/8wz/8NlddddVVV111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uuqqq676T/EP//APv33ffffd+qhHPQoA29zPNrYBsM39bANgG9sA2AbANrYBsM39bANgGwDb2AbANgC2sQ2AbQBs8x7v8R4APOlJT+Luu+/m+bGNbWxjG9v8T2Mb29jm4Q9/OK/xGq8BwK/+6q/y1Kc+lReFbWzzb2WbB5LEc5PE8yOJF0QSLwpJ/HeQhCT+JZJ4QSTx3CTx3CTxQJK4nyTuJ4n7SeKFkcSv/dqv8SM/8iMAvOzLviwv+7Ivy38329jGNrb5tzg4OOBJT3oSAG/4hm/IuXPniAgigoggIogIIoKIICKICCKCiCAiiAgigoggIogIJBERRAQRQUQQEUQEEUFEIImIICKQREQgiYggIpBERCCJY8eOcd999936W7/1W9/NVVddddVVV131n4Hgqquuuuqqq676T3Hffffd+qM/+qOfc+rUKV71VV8VANs8kG0AbGMbANvczzYAtrmfbQBsYxsA2wDYxjYAtgGwzf1sA2AbSbzyK78yAH/5l3/Jv4ZtbGMb29jmf4Lrr7+e13zN1wTgD//wD7n33nv517KNbf6jSeL5kcQLIol/iSQk8d9NEv8SSbwgknhukviv8ud//uf86q/+KgAv8zIvw8u8zMvwX8U2trGNbWzzH+Uv//IvOXnyJA972MPo+57Dw0MigoggIogIIoKIICKICCKCiCAiiAgkERFEBBFBRBARRASSiAgiAklEBJKICCICSUQEkogIIgJJRASSOH78OAC/9Vu/9d1cddVVV1111VX/WQiuuuqqq6666qr/NP/wD//w2wCv+qqvyv1s80C2uZ9tAGxjGwDbANjGNgC2uZ9tAGxzP9sA2AbANrYBsM16vea93/u9AXjSk57EwcEB/162sY1tbGMb2/xXuf7663nTN31TAP7wD/+Qpz71qTw32/xPIokXRBL/Ekn8TyIJSbwwkvjXkMQDSeKBJHE/SdxPEs9NEgCSAJDE/STxa7/2a/zqr/4qAI985CO5/vrr+Y9kG9vYxja2sc1/poODA570pCdx8uRJ3uAN3oDz589TSiEiiAgigoggIogIIoKIICKICCKCUgoRQUQQEUQEEUFEEBFEBJKICCQREUQEkogIJBERRASSiAgkERGcPHkSgB/90R/9HK666qqrrrrqqv8sBFddddVVV1111X+a++6779bf+q3f+u5HPepRPPKRj+R+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/E9km+3tbQDuu+++W7nqqquuuuqqq/4vIbjqqquuuuqqq/5Pue+++2697777bgXY3t7mfxLb2MY2trHN/wS2+feSxHOTxPMjiedHEi+MJCTxopKEJCTx7yEJSUjiX0MSL4wknh9JvCgk8Z9BEi+MJJ4fSQBIQhKnTp0CYH9/n/9JbGMb29jGNlddddVVV1111f9pBFddddVVV1111f85Z8+evRVge3sb2/xPdueddwJw6tQp7meb/00k8dwk8fxI4vmRxAsjiReVJCTxn0ESknhRSeKFkcTzI4nnJonnJokHksQDSeJ+krifJJ6bJB5IEgCSuJ8kXhhJ/E9jG9vYxjbPz4033gjAP/zDP/w2V1111VVXXXXV/zVUrrrqqquuuuqq/7O2t7cBsM1zk8T/JIvFgv9OtnlBbPMfQRLPjyReGEm8KCTxX0USALb5l0jCNi+IJGzz3CRhmweShG3+I0nCNv8WkrifbQAkIYlHPOIRANx55538V7HNv8X29jYA9913361cddVVV1111VX/1xBcddVVV1111VX/5/z93//9bwPs7OzwgtjGNraxjW3+O9x1110AbGxs8G9hmweyzQtjm38v27wwknhukvi3kMSLQhL/HSQhiX+JJP6zSOKBJPFAkrifJO4niRdEEs9NEveThCQeSBIPdPLkSf6z2MY2trGNbWzzb7WzswPAfffddytXXXXVVVddddX/NQRXXXXVVVddddX/Of/wD//wOwA33ngj/xq2sY1tbGOb/2x7e3sALBYL/jPY5kVlm+dmm38NSfxrSOIFkcS/RBKS+O8miX+JJF4QSTw/knhukvjPIokHkgSAJF4UkgCQxKlTpwC46667+PewjW1sYxvb/Efb3t4G4OzZs8/gqquuuuqqq676v4bgqquuuuqqq676P2t7e5t/L9vYxja2sY1t/qPs7+8DsLGxwcbGBv/dbPMfTRLPjyReEEn8SyTxP4kkJPHCSOIFkcTzI4nnJokHksQDSeKBJHE/STw3SbyoJPHCSALg5MmTAOzt7fGisI1tbGMb29jmv8KNN94IwD/8wz/8NlddddVVV1111f81BFddddVVV1111f85Z8+evZX/ZLaxjW1sYxvb/FvceeedACwWC54f2/xHss0LYxvb2OZfQxLPTRLPjyReEEm8MJKQxL+VJCQhCUlIQhKSkIQkJPFvJYkX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6j/Kzs4Ob/Imb8LNN98MwH333Xfr13/917/PP/zDP/w2V1111VVXXXXVVf97UI4fP85VV1111VVXXXXV/yaHh4e7f/Znf/Yzh4eHuy/+4i/+2seOHePhD3848/mcS5cusV6vueqqf6udnR1e7uVejrd+67fm2LFj3Hfffbf+/M///Fd/6Zd+6ducPXv2Vq666qqrrrrqqqv+d0EPetCDuOqqq6666qqrrvrf6pprrnnwa7/2a7/XO73TO302wN7eHn//93/PH/7hH3LVVf8aOzs7vPiLvziv+qqvyv1+5Ed+5LN/9Ed/9HO46qqrrrrqqquu+t8LPehBD+Kqq6666qqrrrrqf7trrrnmwe/4ju/4Wa/zOq/z3gCXLl3iH/7hH/jDP/xDrrrqX/Kqr/qqvOqrvir3+4d/+Iff/vqv//r3ue+++27lqquuuuqqq6666n839KAHPYirrrrqqquuuuqq/yvOnDnzoI/4iI/47hd7sRd7bYBLly7xD//wD/zhH/4hV131QDs7O7z4i784r/qqr8r97rvvvlu//uu//n3+4R/+4be56qqrrrrqqquu+r8BPehBD+Kqq6666qqrrrrq/5prrrnmwR/+4R/+XS/2Yi/22gCXLl3iH/7hH/jDP/xDrvr/xzb3O3bsGC/2Yi/Gq73aq3G/++6779av//qvf59/+Id/+G2uuuqqq6666qqr/m9BD3rQg7jqqquuuuqqq676v+qaa6558Id/+Id/14u92Iu9NsClS5f4+7//e/7hH/6BS5cu8dwkcdX/bLb5tzh27Bgv9mIvxqu92qtxv/vuu+/WH/3RH/2c3/qt3/purrrqqquuuuqqq/5vQg960IO46qqrrrrqqquu+r/ummuuefA7vuM7ftaLvdiLvfY111zz4L29PW677Tb+/u//nttvv53/SJK46vmzzX+1Y8eO8aqv+qq8+Iu/OPe77777bv36r//69/mHf/iH3+aqq6666qqrrrrq/zb0oAc9iKuuuuqqq6666qr/L6655poHv/Zrv/Z7vdM7vdNn80yXLl3i7//+7/nDP/xDrvq/4dixY7zYi70YL/7iL86xY8e434/8yI989m//9m9/z3333XcrV1111VVXXXXVVf8/oAc96EFcddVVV1111VVX/X9z5syZB73O67zOe7/O67zOe19zzTUPBtjb2+O2227j7//+77n99tu56n+fY8eO8WIv9mK82qu9Gve77777bv2t3/qt7/7RH/3Rz+Gqq6666qqrrrrq/x/0oAc9iKuuuuqqq6666qr/r6655poHv9iLvdhrv87rvM57vdiLvdhr80yXLl3i7//+7/mHf/gHLl26xFX/cx07dowXe7EX48Vf/MU5duwY97vvvvtu/dEf/dHP+a3f+q3v5qqrrrrqqquuuur/L/SgBz2Iq6666qqrrrrqqqvgzJkzD3qd13md936d13md977mmmsezDNdunSJv//7v+cP//APuep/hmPHjvFiL/Zi3HLLLdx8883c77777rv1t37rt777t37rt7777Nmzz+Cqq6666qqrrrrqKvSgBz2Iq6666qqrrrrqqque7ZprrnnwmTNnHvw6r/M67/U6r/M6780zXbp0CYB/+Id/4O///u+5dOkSV/3XOXbsGC/2Yi/GLbfcws0338z97rvvvlt/67d+67vPnj37jN/6rd/6bq666qqrrrrqqquueiD0oAc9iKuuuuqqq6666qqrnr8zZ8486MVf/MVf58Ve7MVe63Ve53Xemwe4dOkSf//3f8/tt9/O7bffzlX/8Y4dO8aLvdiL8eIv/uIcO3aMB/qHf/iH3/77v//73/7RH/3Rz+Gqq6666qqrrrrqqhcEPehBD+Kqq6666qqrrrrqqn/ZNddc8+AXe7EXe+0Xe7EXe63XeZ3XeW8eYG9vj9tuu43bb7+dS5cucfvtt3PVv96xY8d4sRd7MQBe7dVejfvdd999twKcPXv21r//+7//7R/90R/9HK666qqrrrrqqquuelGgBz3oQVx11VVXXXXVVVdd9a9zzTXXPPjMmTMPfp3XeZ33uuaaax78Yi/2Yq/NA1y6dInbb7+d22+/nUuXLnH77bdz1fM6duwYL/ZiLwbAi7/4i3Ps2DEe6L777rv1t37rt777H/7hH37nH/7hH36bq6666qqrrrrqqqv+tdCDHvQgrrrqqquuuuqqq6769zlz5syDXvzFX/x1XuzFXuy1Xud1Xue9eS6XLl3i9ttvZ29vj9tuu43bb7+d/09sc+zYMXZ2drjlllu4+eabueWWW3hu9913361nz5699e///u9/+7d+67e+++zZs8/gqquuuuqqq6666qp/D/SgBz2Iq6666qqrrrrqqqv+Y11zzTUPfrEXe7HXerEXe7HXfp3XeZ335vm4dOkSt99+OwC33XYbly5d4vbbb+f/gmPHjnHzzTdz7Ngxbr75Zm655Raen/vuu+/Ws2fP3vr3f//3v/0P//APv/MP//APv81VV1111VVXXXXVVf+R0IMe9CCuuuqqq6666qqrrvrPdc011zz4xV7sxV77xV7sxV4L4HVe53Xem+fj0qVLAOzt7XHp0iVuu+02Ll26BMDtt9/O/xTHjh0DYGdnh1tuuQWAW265hZ2dHY4dO8YLct999936W7/1W98N8KM/+qOfw1VXXXXVVVddddVV/9nQgx70IK666qqrrrrqqquu+q93zTXXPPjFXuzFXvvFXuzFXuuaa6558JkzZx58zTXXPJgX4tKlSwBcunSJvb09AC5dusSlS5e436VLl7jf3t4eL6qdnR0Ajh07BsCxY8e437Fjx9jZ2eHYsWMcO3aMf8l9991369mzZ2/9rd/6re8BuO+++279h3/4h9/mqquuuuqqq6666qr/auhBD3oQV1111VVXXXXVVVf9z3DNNdc8GODFXuzFXgvQi73Yi73WNddc82CAF3uxF3tt/oe47777bgU4e/bsrX//93//2wD/8A//8NuA/uEf/uG3ueqqq6666qqrrrrqfwr0oAc9iKuuuuqqq6666qqr/ne45pprHgxw5syZB19zzTUPBnzmzJkHX3PNNQ/mma655poH80xnzpx5MC+is2fP3gpw33333Qpw33333coznT179hn33XffrWfPnr31vvvuu5Wrrrrqqquuuuqqq/63QA960IO46qqrrrrqqquuuuqqq6666qqrrrrqqqv+T6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxX/CDetaO7Uum9BAAAAAElFTkSuQmCC) @@ -48,8 +48,8 @@ part001 = startSketchOn('XY') ```js // A donut shape. sketch001 = startSketchOn('XY') - |> circle({ center: [15, 0], radius: 5 }, %) - |> revolve({ angle: 360, axis: 'y' }, %) + |> circle({ center = [15, 0], radius = 5 }, %) + |> revolve({ angle = 360, axis = 'y' }, %) ``` ![Rendered example of revolve 1](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAJdqUlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666n+1a6655sE805kzZx7Mc7nmmmsezL/gvvvuu5UHOHv27K0803333XcrV1111VVXXXXVVVf9b0Xlqquuuuqqq6666qr/Ea655poHA5w5c+bB11xzzYPPnDnzIJ7pmmuuefA111zzYIAzZ848+Jprrnkw/wUuXrzIiRMnALjvvvtu5ZnOnj1763333XcrwH333Xfr2bNnnwFw33333QrwD//wD7/NVVddddVVV1111VX/E6AHPehBXHXVVVddddVVV131n++aa6558JkzZx58zTXXPPjMmTMPAnjxF3/x1z5z5syDr7nmmgfzXC5evAjAxYsX2d3d5eLFi0ji4sWL3G93dxcASQBcvHgRgN3dXf41jh8/zvNz/PhxAI4fPw7AiRMnOH78OPc7fvw4ACdOnODEiRM80H333XcrwNmzZ2+97777br3vvvtuPXv27DPuu+++W8+ePXvrfffddytXXXXVVVddddVVV/1nQw960IO46qqrrrrqqquuuuo/xjXXXPNggBd7sRd77TNnzjzoxV/8xV8b4MVe7MVemwe4ePEiu7u7PO1pT0MSFy9eZHd3F0lcvHiR3d1dJPFAknhukvjPZpvnZpsHsg3A8ePHsc2JEyc4fvw4x48f58SJExw/fpwTJ05w4sQJ7nfffffdCvB7v/d7v33y5En+4R/+4Xfuu+++W//hH/7ht7nqqquuuuqqq6666j8KetCDHsRVV1111VVXXXXVVf9611xzzYNf7MVe7LXPnDnzoBd/8Rd/7Rd7sRd7bZ7p4sWLADz96U/n4sWLSOLpT386t956KwCSAJDE/STxQJJ4bpL4l0ji38I2/xLbPDfbPJBt7meb+9kG4NixYwA85CEPAeAhD3kIx48f56EPfSj3u++++2594hOfeOs0Tbf+wz/8w+/cd999t/7DP/zDb3PVVVddddVVV1111b8WetCDHsRVV1111VVXXXXVVS/YNddc82CA137t134vgBd/8Rd/7Rd7sRd7bYCLFy8C8Jd/+ZdI4ulPfzq33norAJIAkASAJO4niftJ4oEk8dwk8aKQxL+Hbf4ltnl+bPNAtrmfbe5nm/vZBsA2AMeOHeP48eOcOHGChzzkIRw/fpyHPvShANx33323AvzDP/zDb//DP/zD79x33323/sM//MNvc9VVV1111VVXXXXVC4Me9KAHcdVVV1111VVXXXXVs11zzTUPfrEXe7HXPnPmzINe/MVf/LVf7MVe7LUBLl68yMWLF3n605/O7u4uu7u73HrrrUgCQBKSuJ8k7ieJ+0nifpJ4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4FOnTr02gCQAJAEgiftJ4n6SuJ8kHkgS95PE/STxQJJ4IEncTxIPJInnJokHksQDSeKBJPHcJPFAknhuknggSTyQJB5IEs9NEg8kiQeSxHOTxANJ4rlJ4gWRxL9kf3//1ic+8Ynffccdd/zOvffe+9tcddVVV1111VVX/d+HHvSgB3HVVVddddVVV131/818Pn/QqVOnXufkyZOvtbGx8eBTp069NoAkACQBIIn7SeJ+knggSdxPEg8kiQeSxP0k8UCSeCBJPJAkHkgSz00SDySJB5LEc5PEA0nigSTxQJJ4bpJ4IEk8N0k8N0k8kCSemyReEEm8IPv7+7c+6UlP+u5hGPi7v/u7z+Gqq6666qqrrrrq/x/0oAc9iKuuuuqqq6666qr/7+bz+YNPnDjxWmfOnHntxWLx4NOnT782gCQAJAEgiftJ4oEkcT9JPJAkHkgSDySJB5LEA0nigSTxQJJ4IEk8kCSemyQeSBLPTRIPJIkHksRzk8QDSeK5SeKBJPH8SOIFkcRz29/fv/VJT3rSd7fW+Ju/+ZvP4aqrrrrqqquuuuoq9KAHPYirrrrqqquuuuqqq57TfD5/8GKxePDp06df69SpU699+vTp1waQBIAk7ieJ+0nifpJ4IEk8kCQeSBIPJInnJokHksQDSeKBJPFAknhuknggSTw3STyQJB5IEg8kiecmiecmiecmiRdEEvfb39+/9eDg4Na77777t++4447fue+++36bq6666qqrrrrqqqueG3rQgx7EVVddddVVV1111VX/svl8/uCTJ0++9tbW1oNOnz792hsbGw/e2Nh4MIAk7ieJ+0nigSTxQJJ4IEk8kCQeSBLPTRIPJIkHksQDSeK5SeKBJPFAknhuknggSTw3STw3STw3STw/kgA4ODi4dX9//9a77777t3d3d5/x9Kc//bu56qqrrrrqqquuuupFgR70oAdx1VVXXXXVVVddddW/zWKxePBisXjw5ubmg06fPv3aGxsbDz59+vRrA0jifpK4nyQeSBIPJIkHksQDSeKBJPFAknhuknggSTyQJJ6bJB5IEs9NEg8kiecmiedHEs/t4ODgVkk8+clP/m6AO++883fuu+++3+aqq6666qqrrrrqqn8r9KAHPYirrrrqqquuuuqqq/5jLRaLBy8WiwdtbGw85JprrnmtjY2NBwOcOXPmtXkmSdxPEg8kiQeSxANJ4oEk8UCSeG6SeCBJPJAknpskHkgSz00Sz00Sz00SAAcHB7cCHBwc3HrPPff8NsCdd97522fPnv0drrrqqquuuuqqq676j4Ye9KAHcdVVV1111VVXXXXVf53FYvHgjY2NBy8WiwdHBGfOnHktgI2NjQdvbW09eGNj48EAknggSTyQJB5IEg8kiQeSxHOTxANJ4rlJ4oEk8dwkcb+Dg4NbAQ4PD289ODi49eDg4Na9vb1nHBwc3Hr27Nnf5qqrrrrqqquuuuqq/0roQQ96EFddddVVV1111VVX/c+yWCweBGhzc/PBi8XiwQAR4c3NzQdvbm4+GGBzc/PBktjY2Hgwz7S1tfVgHkASDySJ5yaJB5LE4eHhrTzTwcHBrZI4ODi4FeDw8PBWANscHBw84+Dg4NbDw8Nbj46ObuWqq6666qqrrrrqqv9p0IMe9CCuuuqqq6666qqrrvq/abFYPFgSgAEB2OaZvFwun8FVV1111VVXXXXVVf+XUbnqqquuuuqqq6666v+s5XJ5K1ddddVVV1111VVX/X9G5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4p/BFvc/WMJuOznAAAAAElFTkSuQmCC) @@ -65,7 +65,7 @@ part001 = startSketchOn('XY') |> line([0, -5.5], %) |> line([-2, 0], %) |> close(%) - |> revolve({ axis: 'y', angle: 180 }, %) + |> revolve({ axis = 'y', angle = 180 }, %) ``` ![Rendered example of revolve 2](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAErXElEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVV/0O84zu+42e9+Iu/+GvzX+xHfuRHPucf/uEffpur/s+55pprHvzhH/7h38V/sb//+7//7R/90R/9HK666qqrrrrqqqv++6EHPehBXHXVVVddddVVV/13+6Zv+qanA1xzzTUP5r/YP/zDP/z2j/zIj3zOP/zDP/w2V/2fcc011zz4cz7nc37rmmuueTD/xe67775bAT7kQz7kIVx11VVXXXXVVVf996Jy1VVXXXXVVVdd9d/sxV7sxV77mmuueTDAx37sx/Jf6Su/8it5sRd7sdcGPoer/k95sRd7sde+5pprHgzwDd/wDTzlKU/hv8LJkyf5jM/4jAcDvNiLvdhr/8M//MNvc9VVV1111VVXXfXfh+Cqq6666qqrrrrqv9nrvM7rvBfAn/3Zn/Ff6RVe4RW43zXXXPNgrvo/6+EPfziS+K9w4cIF/vRP/xSA13md13kvrrrqqquuuuqqq/57EVx11VVXXXXVVVf9N3uxF3ux1wb40z/9U/4rPfzhD+d+Z86ceRBX/Z/1sIc9DABJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQk8UB/9md/BsCLvdiLvTZXXXXVVVddddVV/70Irrrqqquuuuqqq/4bvc7rvM57X3PNNQ8GeOpTn8p/pVd4hVcA4NKlS1z1f8+ZM2ce9LjHPQ6AkydP8p9NEpKQxFOf+lSe8pSncM011zz4xV7sxV6bq6666qqrrrrqqv8+BFddddVVV1111VX/jV7sxV7stQD+7M/+DElIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKv+IqvCMClS5e47bbbePEXf/HX5qr/U6655poHnzt3jsc97nGcPHmShz3sYfxXeupTnwrA67zO67wXV1111VVXXXXVVf99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CyOJ/wrb29vs7Oxwww03AHDjjTdy44038tz29/cBeOITnwjAX/zFX/B/jW3+Oz3qUY/idV7ndQD4rd/6re/++q//+vfhqquuuuqqq6666tnQgx70IK666qqrrrrqqque2zu+4zt+1ju90zt9NsCf//mf8+d//uf8d5PE/0Xb29tsb2+zvb3N9ddfz/b2NjfccAMvyN7eHvv7++zt7SGJvb099vf32d/f5357e3vs7+/zotre3uZ+Ozs7AGxvb7O9vQ3Azs4O29vb3Hjjjbwg+/v7AOzv73PXXXdx9913c9ddd/F/gW3+J3r5l395Xv7lXx6AH/mRH/nsH/3RH/0crrrqqquuuuqqq54TetCDHsRVV1111VVXXXXV8/OO7/iOn/VO7/ROnw3w53/+5/z5n/85/5NJ4v+K7e1ttre32d7e5vrrr2d7exuAG264gf8J9vf32d/f56677gLg7rvv5q677uJ/K9v8b/OWb/mW3HDDDQB8/dd//fv81m/91ndz1VVXXXXVVVdd9bzQgx70IK666qqrrrrqqqtekBd7sRd77c/93M/9LYD9/X1+9md/lv39ff63ksT/dtvb22xvb7O9vY1tbrjhBgC2t7cB2N7eBmB7e5sX1f7+Pvfb398HYH9/n/39fQAODg7Y39/nrrvu4n8b2/xfsr29zeu8zutwww03APCZn/mZr/MP//APv81VV1111VVXXXXV84ce9KAHcdVVV1111VVXXfXCXHPNNQ/+nM/5nN+65pprHry/v8/P/uzPsr+/z/91krjqfy7b/H9hG4Dt7W3e6q3eiu3tbe67775bv/7rv/59/uEf/uG3ueqqq6666qqrrnrBKMePH+eqq6666qqrrrrqhTk8PNz9sz/7s595xVd8xbc+efLk8Yc85CH0fc9dd90FgCSuukISV/3r2eYqsM0LcsMNN/CO7/iOzGYz/uEf/uG3P/7jP/5lzp49eytXXXXVVVddddVVLxzl+PHjXHXVVVddddVVV/1LDg8Pd//sz/7sZw4PD3df9mVf9rVvvPFGAO666y5eEElc9e8nif8pbHPVv59t/jVe/uVfntd93dcF4Ld+67e++0u+5Evehquuuuqqq6666qoXDeX48eNcddVVV1111VVXvSgODw93/+Ef/uF3AF78xV/8tW+88UYe/ehH8/SnP51hGHhRSeKqq/4/sM2/x/b2Nm/yJm/Cox/9aAB+5Ed+5LO/67u+62O46qqrrrrqqquuetGhBz3oQVx11VVXXXXVVVf9a11zzTUP/pzP+Zzfuuaaax68v7/Pb/7mb3LXXXfx7yWJq67638Q2/xluuOEG3uqt3gqA++6779av//qvf59/+Id/+G2uuuqqq6666qqr/nUox48f56qrrrrqqquuuupf6/DwcPfP/uzPfmZzc/P4ox71qJe+8cYb6fueu+66i/9Mkrjqqv9qtvmv9PIv//K87uu+LgD/8A//8Nsf//Ef/zJnz569lauuuuqqq6666qp/Pcrx48e56qqrrrrqqquu+rc4PDzcvfXWW//m8PBw92Vf9mVf+8Ybb+TRj340T3/60xmGgf8Okrjqqn8N2/xPsb29zZu8yZvw6Ec/GoAf+ZEf+eyv//qvfx+uuuqqq6666qqr/u0ox48f56qrrrrqqquuuurf6vDwcPcf/uEffucf/uEffufFXuzFXvvkyZPHH/KQhzCbzbjrrrv4n0gSV/3/YJv/LW644Qbe8R3fke3tbe67775bv+RLvuRtfvu3f/t7uOqqq6666qqrrvr3oRw/fpyrrrrqqquuuuqqf6+zZ8/e+md/9mc/s7m5efxRj3rUS99www0A3HXXXfxvJomr/mexzf81L//yL8/rvu7rAvAP//APv/3xH//xL3P27Nlbueqqq6666qqrrvr3oxw/fpyrrrrqqquuuuqq/wiHh4e7f/qnf/ozAC/+4i/+2jfeeCOPfvSjOXfuHPv7+/x/IomrXjjb/H93ww038FZv9VY85CEPAeBHfuRHPvvrv/7r34errrrqqquuuuqq/zjoQQ96EFddddVVV1111VX/0c6cOfOgz/3cz/3ta6655sEAf/Znf8af//mfc9V/LEn8R7PNVf/5Xv7lX55XeIVXAOAf/uEffvtHfuRHPucf/uEffpurrrrqqquuuuqq/1iU48ePc9VVV1111VVXXfUf7ejo6NKf/dmf/czh4eHui7/4i7/2jTfeyKMf/WjOnj3LwcEBV131/4FtntsNN9zAW7/1W/OQhzwEgB/5kR/57K//+q9/n7Nnz97KVVddddVVV1111X889KAHPYirrrrqqquuuuqq/0zXXHPNgz/ncz7nt6655poHA/zZn/0ZT3jCE9jf3+e5SeKqq/43sc2LYnt7m0c/+tG8wiu8AgD33XffrV//9V//Pv/wD//w21x11VVXXXXVVVf956EcP36cq6666qqrrrrqqv9Mh4eHu3/2Z3/2M4eHh7sv/uIv/to33ngjD33oQ5nNZtx11128qCRx1VX/HWzz7/EKr/AKvMmbvAk33ngjAD/yIz/y2V/6pV/6NmfPnr2Vq6666qqrrrrqqv9c6EEPehBXXXXVVVddddVV/1WuueaaB3/4h3/4d73Yi73YawPs7+/zG7/xG9x11138R5DEVVf9a9nmP8P29jav+7qvy4033gjAP/zDP/z213/917/PfffddytXXXXVVVddddVV/zUox48f56qrrrrqqquuuuq/yuHh4e5v/dZvfc/Zs2ef8eAHP/ilT548efzGG29kNpuxv7/PMAz8Z5PEVf8/2Oa/w/b2Ni/1Ui/Fm7zJm7Czs8N9991363d913d9zHd913d9zOHh4S5XXXXVVVddddVV/3XQgx70IK666qqrrrrqqqv+O1xzzTUPfu3Xfu33eqd3eqfPBtjf3+cJT3gCf/Znf8b/FJK46n8W2/xP9gqv8Aq8wiu8Avf7kR/5kc/+0R/90c/hqquuuuqqq6666r8HetCDHsRVV1111VVXXXXVf6drrrnmwe/4ju/4Wa/zOq/z3gD7+/s84QlP4M/+7M/430wSV71gtvm/5IYbbuD1Xu/12N7eBuAf/uEffvvrv/7r3+e+++67lauuuuqqq6666qr/PuhBD3oQV1111VVXXXXVVf8TvNiLvdhrf/iHf/h3XXPNNQ8G2N/f5zd+4ze46667uOpFI4l/C9tc9W+zvb3N677u63LjjTcCcN9999369V//9e/zD//wD7/NVVddddVVV1111X8/9KAHPYirrrrqqquuuuqq/ymuueaaB7/2a7/2e73O67zOe19zzTUPBtjf3+c3fuM3uOuuu7jqqv8ptre3ed3XfV1uvPFGAO67775bf+u3fuu7f/RHf/RzuOqqq6666qqrrvqfAz3oQQ/iqquuuuqqq6666n+aa6655sGv/dqv/V7v9E7v9Nk80xOe8ASe8IQncNddd3HVVf9dtre3eYVXeAUe/ehHA3Dffffd+lu/9Vvf/aM/+qOfw1VXXXXVVVddddX/POhBD3oQV1111VVXXXXVVf9TXXPNNQ9+7dd+7fd6p3d6p8/mmZ7whCfwhCc8gbvuuourrvqvsrW1xSu+4ivy6Ec/mvv9yI/8yGf/6I/+6Odw1VVXXXXVVVdd9T8XetCDHsRVV1111VVXXXXV/3Rnzpx50Ou8zuu89zu90zt9Ns+0v7/Pb/zGb3DnnXciiauu+vewzfOzvb3N673e63HjjTcCcN999936W7/1W9/9oz/6o5/DVVddddVVV1111f986EEPehBXXXXVVVddddVV/1tcc801D37t137t93qnd3qnz+aZ9vf3+dM//VOe8IQn8C+RxFX/v9jm3+IVXuEVeMxjHsP29jYA9913362/9Vu/9d0/+qM/+jlcddVVV1111VVX/e+BHvSgB3HVVVddddVVV131v80111zz4Nd+7dd+r9d5ndd572uuuebBAPv7+zzhCU/gT//0T/mPIImr/meyzX+G7e1tHv3oR/OKr/iK3O++++679bd+67e++0d/9Ec/h6uuuuqqq6666qr/fdCDHvQgrrrqqquuuuqqq/63uuaaax78Yi/2Yq/9Oq/zOu/1Yi/2Yq8NsL+/z5133skTnvAE7rzzTv6rSeKqF41t/ifY3t7m0Y9+NK/4iq/I/e67775bf+u3fuu7f/RHf/RzuOqqq6666qqrrvrfCz3oQQ/iqquuuuqqq6666v+CF3uxF3vt13md13mv13md13lvnml/f58//dM/5QlPeAL/F0niP5pt/j/Y3t7m0Y9+NI95zGPY3t7mfvfdd9+tP/qjP/o5v/Vbv/XdXHXVVVddddVVV/3vhx70oAdx1VVXXXXVVVdd9X/JNddc8+DXfu3Xfq93eqd3+myeaX9/nzvvvJMnPOEJ3HnnnVz1/9f29jaPfvSjecVXfEUA7rvvvlsBfuu3fuu7f/u3f/t77rvvvlu56qqrrrrqqquu+r8DPehBD+Kqq6666qqrrrrq/6JrrrnmwS/2Yi/22q/zOq/zXi/2Yi/22jzT/v4+T3jCE3j84x/P/v4+V/3ft729zaMf/Wge85jHsL29zf3uu+++W3/rt37ru3/0R3/0c7jqqquuuuqqq676vwk96EEP4qqrrrrqqquuuur/umuuuebBr/3ar/1er/M6r/Pe11xzzYN5pv39fR7/+MfzZ3/2Z1z1f8v29jaPfvSjufHGG7nxxhu533333Xfrj/7oj37OP/zDP/z2fffddytXXXXVVVddddVV/7ehBz3oQVx11VVXXXXVVVf9f3HNNdc8+MyZMw9+ndd5nfd6ndd5nffmmfb399nf3+fxj388d955J/v7+1z1v8/29jaPfvSjuemmm7jhhht4oB/5kR/57LNnzz7jt37rt76bq6666qqrrrrqqv8/0IMe9CCuuuqqq6666qqr/j+65pprHvxiL/Zir/1iL/Zir/U6r/M6780D7O/v8/jHP5677rqLO++8k6v+59re3ubRj340N954IzfeeCMP9A//8A+//fd///e//aM/+qOfw1VXXXXVVVddddX/T+hBD3oQV1111VVXXXXVVf/fXXPNNQ9+sRd7sdd6sRd7sdd+ndd5nffmAfb397nzzju58847ecITnsBV/722t7fZ2dnhhhtu4BVf8RV5bv/wD//w23//93//2z/6oz/6OVx11VVXXXXVVVddhR70oAdx1VVXXXXVVVddddWzXXPNNQ9+sRd7sdd+sRd7sdd6ndd5nffmAfb29tjf3+fOO+/kzjvv5M477wRAElf9+9jmBdne3uYxj3kMN954IzfeeCMPdN999936W7/1W9999uzZZ/zWb/3Wd3PVVVddddVVV1111QOhBz3oQVx11VVXXXXVVVdd9YJdc801D37t137t93rxF3/x136xF3ux1+YB9vb22N/f58477+TOO+/kzjvv5D+SJP4nsc1/tu3tbQAe85jHcOONN3LjjTfy3O67775bf+u3fuu7/+Ef/uF3/uEf/uG3ueqqq6666qqrrrrqBUEPetCDuOqqq6666qqrrrrqRXPNNdc8+MVe7MVe68Ve7MVe+5prrnnwi73Yi702D7C3twfAnXfeyZ133sn+/j533nknV71g29vbPOYxjwHgxhtv5MYbb+S53Xfffbf+1m/91nefPXv21t/6rd/6Hq666qqrrrrqqquuelGhBz3oQVx11VVXXXXVVVdd9W9zzTXXPPjFXuzFXvvFXuzFXuuaa6558Iu92Iu9Ns9lb2+P/f199vb2uPPOO9nf3+fOO+/k/5vt7W0AHvOYxwBw4403cuONN/L83Hfffbf+1m/91ncD/OiP/ujncNVVV1111VVXXXXVvxV60IMexFVXXXXVVVddddVV/zGuueaaB585c+bB11xzzYNf7MVe7LWuueaaB7/Yi73Ya/N87O3tsb+/z/7+PnfccQf7+/sA3Hnnnfxvtr29zc7ODjfeeCMAN954IzfeeCMvyH333XfrP/zDP/z2fffdd+s//MM//M4//MM//DZXXXXVVVddddVVV/1HQQ960IO46qqrrrrqqquuuuo/zzXXXPPgM2fOPPiaa6558Iu92Iu91jXXXPPgF3uxF3ttXoj9/X329vbY29sD4M477wRgf38fgL29Pfb39/mvtL29DcDOzg7b29vs7OwAsL29zc7ODjfeeCMvzH333XcrwD/8wz/89n333XfrP/zDP/zOP/zDP/w2V1111VVXXXXVVVf9Z0IPetCDuOqqq6666qqrrrrqv94111zz4DNnzjz4mmuuedCLvdiLvfY111zz4DNnzjz4mmuueTAvov39fWwDsL+/D8D+/j62eaD9/X1ekO3tbe4nie3tbQC2t7cB2NnZ4V/jvvvuu/Xs2bO3/v3f//1vA/zDP/zD7/zDP/zDb3PVVVddddVVV1111X8H9KAHPYirrrrqqquuuuqqq/5nOXPmzIOuueaah1xzzTUPBnixF3ux1wK45pprHgxw5syZB19zzTUP5r/QfffddyvA2bNnb73vvvtuve+++24FOHv27DPuu+++W//hH/7ht7nqqquuuuqqq6666n8a9KAHPYirrrrqqquuuuqqq/53OnPmzIMkCeDMmTMPBrjmmmseBIgHOHPmzIN4Ac6ePfsMns333XffM3ims2fP3nrffffdylVXXXXVVVddddVV/1uhBz3oQVx11VVXXXXVVVddddVVV1111VVXXXXVVf8nUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q/iHwGgoh+6xE909AAAAABJRU5ErkJggg==) @@ -81,7 +81,7 @@ part001 = startSketchOn('XY') |> line([0, -5.5], %) |> line([-2, 0], %) |> close(%) - |> revolve({ axis: 'y', angle: 180 }, %) + |> revolve({ axis = 'y', angle = 180 }, %) part002 = startSketchOn(part001, 'end') |> startProfileAt([4.5, -5], %) |> line([0, 5], %) @@ -103,8 +103,8 @@ box = startSketchOn('XY') |> extrude(20, %) sketch001 = startSketchOn(box, "END") - |> circle({ center: [10, 10], radius: 4 }, %) - |> revolve({ angle: -90, axis: 'y' }, %) + |> circle({ center = [10, 10], radius = 4 }, %) + |> revolve({ angle = -90, axis = 'y' }, %) ``` ![Rendered example of revolve 4](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAGtQUlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8V5fjx41x11VVXXXXVVf+xXuzFXuy13+md3umzNjc3T9x6661/zVVXXXXVVVddddVVV1111X8P9KAHPYirrrrqqquuuuo/xou92Iu99od/+Id/F8A111zzYID77rvvVp7p7Nmzt/JM9913360803333Xfr2bNnn8Ez3XfffbcCnD179tb77rvvVq666qqrrrrqqquuuuqqq/5t0IMe9CCuuuqqq6666qp/vxd7sRd77Q//8A//rsPDwwf/xV/8BQ904sQJHuj48ePc78SJEwCcOHECgBMnTvDc7rvvvlsBzp49e+t99913K8A//MM//M599913K8A//MM//DZXXXXVVVddddVVV1111VXPCz3oQQ/iqquuuuqqq6769/umb/qmp19zzTUP/qqv+ip2d3d5YWzzQLa5n22OHz8OwPHjxwE4fvw4J06c4Pjx4wCcOHGCEydOcOLECe5333333QrwD//wD78N8A//8A+/c9999936D//wD7/NVVddddVVV1111VVXXfX/FZWrrrrqqquuuurf7cVe7MVe+5prrnnwM57xDA4ODqi18oLY5rnZ5oEODg4AODg4wDa33347ALYBsA3AsWPHADh+/DjHjx9/8EMe8hB2dnbe+8SJE7zO67zOe/NM9913361nz5699b777rv1H/7hH37nvvvuu/Uf/uEffpurrrrqqquuuuqqq6666v869KAHPYirrrrqqquuuurf55u+6Zuefs011zz4+7//+7ntttt4QWzz/NjmudnmgWwDYJv72QbANgC2sQ2AbY4fP87x48c5fvw4D3nIQzhx4gQPfehDud9999136z/8wz/89j/8wz/8zn333XfrP/zDP/w2V1111VVXXXXVVVddddX/JehBD3oQV1111VVXXXXVv93rvM7rvPeHf/iHfxfAF3/xF/Oiss0LYpsHss39bHM/29zPNgC2AbANgG1sA2Ab2xw/fpwHP/jBADzkIQ/hoQ99KCdOnADgvvvuu/Uf/uEffvsf/uEffue+++679R/+4R9+m6uuuuqqq6666qqrrrrqfyv0oAc9iKuuuuqqq6666t/uwz/8w7/rxV/8xd/7z/7sz/j7v/97/rVs8/zY5oFs80C2uZ9t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NlddddVVV1111VVXXfX/D3rQgx7EVVddddVVV131r/MTP/ETBvie7/ke/rVs8y+xzQtim+dmmweyzXOzzQPZ5n62eSDb3M8297PN/WwDYJv72eZ+tgGwDYBtAGwDYBsA2wDYxjYAtgGwjW1sA2Ab29jGNraxjW0yE9tkJpnJsWPHeNmXfVle/uVfHoDHP/7xt/7SL/3S5zz+8Y//bq666qqrrrrqqquuuur/D8rx48e56qqrrrrqqqv+dd7pnd7pswH+9m//FklIQhKSkIQkJCEJSUhCEpKQhCQkASAJSUhCEpKQhCQAJCEJSUhCEgCSkIQkJAEgCUlIAkASkpAEgCQkIQkASUgCQBKSkASAJCQBIAlJAEhCEgCSkASAJAAkIQkASQBIQhIAkgCQBIAk7icJAEncTxKSuJ8kJCEJSUhCEpKQhCQigvV6za233so//MM/cOHCBR75yEcef/u3f/u3vummm957f3//0n333ffXXHXVVVddddVVV1111f99lOPHj3PVVVddddVVV73oXuzFXuy1X+d1Xue97733Xp7+9KcjCUlIQhKSkIQkJAEgCUlIQhKSkIQkJCEJAElIQhKSkIQkACQhCUlIAkASkpAEgCQkIQlJAEhCEpIAkIQkACQhCUkASEISAJKQBIAkJAEgCUkASEISAJKQBIAkACQhCQBJAEgCQBIAkgCQBIAkACQhCQBJSEISAJKQhCQkIQlJSEISkpCEJFarFffccw9/8Rd/wfnz53nEIx5x/O3e7u3e+qabbnrv/f39S/fdd99fc9VVV1111VVXXXXVVf93UY4fP85VV1111VVXXfWie/EXf/HXfsVXfMW3vu+++7jjjjuQhCQkIQlJSEISkpCEJCQhCUkASEISkpCEJCQhCQBJSEISkpAEgCQkIQkASUhCEgCSkIQkACQhCUkASEISkgCQhCQAJCEJAElIAkASkgCQhCQAJCEJAElIAkASAJKQBIAkACQBIAlJAEgCQBL3kwSAJO4nCUkASEISkpCEJCQhCUlIQhKSkIQk7rnnHv78z/+cCxcu8IhHPOL4273d2731TTfd9N67u7uXzp0799dcddVVV1111VVXXXXV/z2U48ePc9VVV1111VVXvege8pCHvPQrvuIrvvXu7i533nknkpCEJCQhCUlIQhIAkpCEJCQhCUlIQhIAkpCEJCQhCQBJSEISkgCQhCQkIQkASUhCEgCSkASAJCQhCQBJSAJAEpIAkIQkJAEgCUkASEISAJIAkIQkACQhCQBJAEhCEgCSAJCEJAAkASAJAEkASAJAEveTxP0kcT9JSEISkpCEJCQhCUlIQhKSkMTdd9/NX/zFX3DhwgUe8YhHHH/7t3/7t77xxhvf+2lPe9rfHB4e3spVV1111VVXXXXVVVf930E5fvw4V1111VVXXXXVi+4VX/EV3+rFX/zFX/vOO+/k7NmzSEISkpCEJCQhCUlIQhKSkIQkJCEJAElIQhKSkASAJCQhCUkASEISkgCQhCQkASAJSUgCQBKSAJCEJCQBIAlJAEhCEgCSkASAJCQBIAlJAEhCEgCSAJCEJAAkIQkASQBIAkASkgCQBIAkACQBIAkASQBI4n6SAJCEJO4nCUlIQhKSkIQkJCEJSUgiIpDE3XffzV/8xV9w4cIFXvmVX/n4673e6733Nddc896333773xwdHd3KVVddddVVV1111VVX/e9HOX78OFddddVVV1111YvudV7ndd57a2vrpc+ePculS5eQhCQkIQlJSEISkpCEJCQhCUkASEISkpCEJAAkIQlJSAJAEpKQBIAkJCEJAElIAkASkpAEgCQkASAJSQBIQhIAkpAEgCQkASAJSQBIQhIAkpAEgCQAJCEJAElIAkASAJKQBIAkACQBIAkASQBIAkASAJIAkASAJO4nCUncTxKSkIQkJCEJSUhCEgCSkEREcPfdd/MP//APnD9/ntd6rdc6/iZv8ibvPZ/PH/z3f//3fwPsctVVV1111VVXXXXVVf97UY4fP85VV1111VVXXfWie8VXfMW3vuaaa1760qVL7O3tIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSQBIQhKSkASAJCQhCQBJSAJAEpKQBIAkJAEgCUkASEISAJKQBIAkJAEgCUkASEISAJKQBIAkACQhCQBJSAJAEgCSkASAJAAkIQkASQBIAkASAJKQBIAkACRxP0kASAJAEveThCQeSBKSkIQkJCEJSQBIQhKSWK1W3H333fz93/89rTXe8i3f8qVf53Ve5603NzeP/8M//MPvcNVVV1111VVXXXXVVf87UY4fP85VV1111VVXXfWie/M3f/OPfvCDH/zgpz71qaxWKyKCiCAiiAgkIQlJSEISkpCEJCQREUhCEpKQREQgCUlIQhKSkIQkACQhCUlIQhKSAJCEJAAkIQkASUgCQBIAkpAEgCQkASAJSQBIAkASkgCQhCQAJAEgCUkASAJAEpIAkASAJCQBIAkASQBIAkASkgCQBIAkACQBIIn7SQJAEg8kCUncTxKSkIQkJCEJAElIQhIRwXq95mlPexp/+qd/iqTjb/VWb/Xar/M6r/Pet9122/H77rvvd7jqqquuuuqqq6666qr/XSjHjx/nqquuuuqqq6560b3O67zOe19zzTUPftKTnsQ0TUhCEpKQREQQEUQEEUFEIAlJSEISkogIJCEJSUhCEpKQhCQkIQlJSEISkgCQhCQAJCEJAElIAkASAJKQBIAkJAEgCQBJSAJAEgCSkASAJAAkIQkASQBIQhIAkgCQhCQAJAEgCUkASAJAEgCSkASAJAAkASAJAEkASAJAEveTxP0kcT9JSOIFkYQkJCEJAElIYr1e87SnPY0/+7M/4+TJk8ff7d3e7bVf8iVf8r3//u///m8ODw9v5aqrrrrqqquuuuqqq/53oBw/fpyrrrrqqquuuupF947v+I6fvbm5efzWW2+ltUZEEBFEBBFBRCAJSUhCEhFBRBARRASSkEREEBFIQhIRQUQgCUlEBJKQREQgCUlEBJKQhCQkIQlJSAJAEpKQhCQAJAEgCUkASAJAEpIAkASAJCQBIAkASQBIQhIAkgCQhCQAJAEgCQBJSAJAEgCSAJAEgCQkASAJAEkASAJAEgCSuJ8kACRxP0ncTxKSkIQkJCEJSUhCEpKQBIAkJBERrNdr/uEf/oE//dM/5bVf+7WPv97rvd577+zsPPhv//Zv/0bSLlddddVVV1111VVXXfU/G+X48eNcddVVV1111VUvujd/8zf/6M3NzePPeMYzaK0REUQEEYEkJBERRAQRQUQQEUQEEYEkIoKIICKQREQQEUhCEhFBRCCJiEASkogIJCEJSUgiIpCEJCQhCUlIAkASkpCEJCQhCQBJAEgCQBKSAJAEgCQAJCEJAEkASAJAEgCSkASAJAAkASAJSQBIAkASAJIAkIQkACQBIAkASQBIAkASAJK4nyQAJHE/STyQJCQhCUlIQhKSkIQkACQBIAlJrNdr/u7v/g7bvMVbvMVLv87rvM5bb25uHv+Hf/iH3+Gqq6666qqrrrrqqqv+50IPetCDuOqqq6666qqrXnQ/8RM/YYBf/dVf5YWxzfNjmweyzf1scz/bANjmfrYBsA2AbQBsA2AbANsA2AbANgC2uZ9tAGwDYBsA2wDYBsA2ALYBsA2Abe5nGwDbANgGwDb3sw2AbQBsA2AbANvczzYAtgGwDYBtAGwDYBsA29gGwDYAtrENgG1sA2Ab29jGNgC2sY1tbJOZ2MY2mYltMpPMJDPZ2dnh5V7u5XjjN35j7rvvvls/8zM/833Onj3721x11VVXXXXVVVddddX/PJTjx49z1VVXXXXVVVe96N7pnd7pswFuvfVWIoKIICKICCKCiCAiiAgigoggIpBERBARRASSiAgiAklEBBGBJCICSUQEkogIJBERSCIikEREIImIQBIRgSQiAklEBJKICCQREUgCQBIAkgCQBIAkACQBIAkASQBIAkASAJIAkASAJAAkIQkASQBIAkASAJIAkASAJCQBIAkASQBIAkASAJIAkASAJO4nCQBJ3E8SDyQJSTw/kpCEJCQBIAlJSGK9XvO0pz2NP/3TP+WVXumVjr/pm77pe3ddxz/8wz/8DlddddVVV1111VVXXfU/C+X48eNcddVVV1111VUvmmuuuebBb/7mb/7Rq9WKu+++m4ggIogIIoKIICKICCKCiCAikEREEBFEBJKICCICSUQEEYEkIgJJRASSiAgkERFIIiKQhCQiAklEBJKQREQgiYhAEhGBJCQhCUlEBJKQhCQkIQlJAEgCQBIAkgCQBIAkACQBIAkASQBIAkASAJIAkASAJAAkASAJAElIAkASAJIAkASAJAAkASAJAEncTxIAkrifJO4niQeShCQkIQlJSEISkgCQhCQkIQlJrFYr/v7v/55pmnirt3qr136d13md97711luPnz179ne46qqrrrrqqquuuuqq/xkox48f56qrrrrqqquuetFsbm4ef/M3f/OPbq1xzz33EBGUUiilUEohIogIIoKIICKICEopRAQRQUQQEUQEEUFEEBFIIiKQREQgiYhAEhGBJCICSUgiIpCEJCICSUgiIpCEJCICSUgiIpCEJCQhCUlIQhKSkIQkJCEJSUgCQBIAkgCQxP0kASAJAEkASAJAEgCSAJAEgCQAJAEgCUkASAJAEgCSAJAEgCQAJHE/SQBIAkAS95MEgCQeSBLPjyQkASAJSUhCEpKQRESwXq956lOfyp/+6Z8i6fgHfMAHvHZEPPjv/u7v/kbSLlddddVVV1111VVXXfXfi8pVV1111VVXXfVv0nUdLwrbPJBt7mcbANsA2AbANrYBsA2AbWwDYBvb2AbANrYBsI1tbANgG9vYBsA2tgGwjW1sA2Ab2wDYxjaSsI1tJGEbSdgGQBK2kYRtJGEbSdhGEraRhG3+JbaRxIvKNpJ4YSRhm+cmCdvcTxK2sY1tACIC29jGNrYBkERmIglJ7O3t8Ru/8RtcvHiRN3qjN3rv13qt13rt3/qt3/ruH/3RH/0crrrqqquuuuqqq6666r8Plauuuuqqq6666kV25syZBwOM40jXdbyobHM/2wDYBsA2ALYBsI1tAGxjGwDb2MY2ALaxjW0AbGMb29gGwDa2sY1tbANgG9vYBsA2trENgG1sYxsA29gGwDa2kYRtbCMJ20jCNi+MJGwjCdtIwjaSsI0kbGMbSdhGEraRhG0kYRtJ/EeRhG0eSBK2sY1tMhOAiMA2kshMACTRWuOv/uqveNrTnsbLvdzLPfid3umdPjsiHvxDP/RDnyPpVq666qqrrrrqqquuuuq/HpWrrrrqqquuuupfTRJd1yGJ58c2z80297MNgG0AbGMbANvYBsA2trENgG1sYxvb2MY2tgGwjW1sYxvb2MY2tgGwjW1sYxvb2AbANraxjW0AbGMb2wDYxja2kYRtbCMJ20jCNraRhG0kYZt/DUnY5j+CbSTxryEJ2zxQRGAb29jGNgCSyEwAJLG3t8dv/MZvcPHiRd7ojd7ovV/rtV7rtX/rt37ru3/0R3/0c7jqqquuuuqqq6666qr/WlSuuuqqq6666qp/NUn0fQ+AJB7INs/NNvezDYBtAGxjGwDb2AbANraxjW1sYxsA29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMbANvYxja2sQ2AbWxjGwDb2MY2krANgCRsIwnbAEjCNpKwzf8UkrDN/SRhmweShG1sY5vMBCAisA2AJCQhCUn81V/9FU972tN42Zd92Qe/0zu902cD/OiP/ujncNVVV1111VVXXXXVVf91qFx11VVXXXXVVS+ya6655sEAmUnf90ji+bHNA9nmfrYBsA2AbWxjGwDb2MY2trGNbQBsYxvb2MY2mYltbGMb29jGNraxjW1sY5vMxDa2sY1tbGMb29jGNraxDYBtbGMb29jGNgC2sY1tAGxjG9tIwjYAkrDNA0nCNv9ZbCOJfw1J2OaBJGGbB4oIbGMb2wDYRhKSkIQk9vb2+I3f+A12d3d5ozd6o89+ndd5nff+zM/8zPc5e/bsb3PVVVddddVVV1111VX/+SjHjx/nqquuuuqqq6560TzkIQ956Vd8xVd862maGMeRWiulFEoplFIopVBKodZKrZVSCqUUaq2UUiilUEqhlEIphVIKpRRKKdRaKaVQSqGUQimFUgqlFEopRAQRQUQQEUQEEUFEEBFEBBFBRBARSCIiiAgigohAEhFBRBARRAQRQUQgCUlIQhKSkIQkJCEJSUgiIpCEJCQhCUkASEISkgCQhCTuJ4n7SQJAEveTBIAkACRxP0kASAJAEgCSAJDE/SQBIAkASQBI4n6SAJDE/STxQJJ4UUhCEpIAkIQkJCGJu+66i7/7u78DOP5u7/Zur725uXn8H/7hH36Hq6666qqrrrrqqquu+s9F5aqrrrrqqquu+lcrpTCbzXhR2OZ+tgGwDYBtbGMbANvYxja2sY1tbGMb29gmM7GNbWyTmdjGNrbJTGxjm8zENraxTWZiG9vYJjOxTURgG9tkJraxjW1sYxvb2MY2trGNbWxjG9sA2MY2trGNJGxjG9tIwja2kYRtACRhm38r20jihbGNJB7INpJ4UUjCNraxjW1sYxvbZCYRgW3uJwlJ7O3t8eu//utIevA7vdM7ffbrvM7rvPdnfdZnvc599913K1ddddVVV1111VVXXfWfg3L8+HGuuuqqq6666qoXzUMe8pCXfsVXfMW3to1tSimUUqi1Umul1kqtlVIKpRRKKdRaqbVSSqHWSimFWiulFEop1FoppVBKoZRCKYVSCqUUSimUUiilUEqhlEJEUEqhlEIphYiglEIphYggIogIIoKIICKICCICSUQEkogIIgJJRAQRgSQkERFEBJKQhCQkIQlJSAJAEpKQREQgCUlIQhKSkMT9JCGJ+0nifpK4nyTuJwkASdxPEgCSAJDE/SQBIAkASdxPEgCSAJDE/SQBIIkHksT9JPEvkYQkJAEgiftJQhJPfepT+ZM/+RNe+ZVf+fhrvdZrvfXm5ubxf/iHf/gdrrrqqquuuuqqq6666j8elauuuuqqq6666l8tIuj7nvtJ4rnZ5oFsA2AbANsA2MY2trGNbWxjG9vYxja2sU1mYhvbZCa2sU1mYpvMxDaZiW0yE9tkJrbJTGyTmdgmM7GNbTIT22QmtokIbJOZ2MY2tslMJGEb29jGNraxjW1sYxvb2MY2tpGEbWxjGwBJ2AZAErYBkIRt/iW2kcTzYxtJPD+2kcQD2UYSAJKwzb9EEraxjW0yE4CIwDYAkpCEJCSxt7fHN37jN/JyL/dyD36nd3qnzwb40R/90c/hqquuuuqqq6666qqr/mNRueqqq6666qqr/tUigr7veW6SALDNc7MNgG0AbANgG9vYxja2sY1tbGMb29jGNpmJbWyTmdgmM7FNZmKbzMQ2mYltMpPMxDaZiW0yE9tkJpmJbTIT22QmtslMbBMRZCa2sY0kbGMb29gmM7GNbWxjG9vYxja2sY1tJGEb29jGNgCSsM0LIwnb/FewjSReEEnYxjYPFBHYxjaZSURgm/tJAmBvb49f//Vf5+LFi7zru77rZ7/O67zOe3/WZ33W69x33323ctVVV1111VVXXXXVVf8xKMePH+eqq6666qqrrnrRvOIrvuJbvfiLv/hrl1KotVJKoZRCrZVSCqUUSimUUiilEBGUUiilUEohIiilEBGUUogISimUUiilUEqhlEIphVIKpRRKKZRSKKUQEZRSKKUQEZRSKKUQEZRSiAgiglIKEUEphYggIiilEBFEBBFBRCCJiCAikEREIImIQBKSiAgkERFIQhIRgSQkIQkASUhCEpIAkIQkJCEJSUjifpKQhCQkcT9JSOJ+krifJO4niftJAkAS95MEgCQAJHE/SQBI4n6SAJDE/SRxP0k8kCT+JZKQhCQAJAEgCUlI4q677uJP/uRPeKVXeqXjr/Var/XWm5ubx//hH/7hd7jqqquuuuqqq6666qp/P8rx48e56qqrrrrqqqteNC/2Yi/22i/+4i/+2qUUaq2UUiilEBFEBBFBKYWIICIopVBKoZRCKYWIoJRCRFBKISIopRARRAQRQSmFUgqlFEoplFKICCKCUgqlFCKCUgqlFCKCUgoRQSmFiCAiKKUQEUQEpRQigoggIogIIoKIQBIRQUQgiYhAEpKICCQhiYhAEhGBJCICSUgiIpCEJCQBIAlJSEISAJKQhCQkcT9JSEISknggSdxPEg8kCQBJ3E8S95MEgCTuJwkASdxPEgCSuJ8kACRxP0k8kCSeH0lIQhIPJAlJ3E8SkgBYrVb83d/9HcDxt37rt35tgH/4h3/4Ha666qqrrrrqqquuuurfh8pVV1111VVXXfWvFhHUWpHEc5PE/Wzz3GwDYBsA2wDYxja2AbCNbWxjm8zENraxTWZiG9tkJrbJTDIT22QmmYltMpPMJDOxTWaSmWQmmYltMpPMJDPJTGyTmWQmmYltMpPMJCLITCKCzMQ2krBNZiIJ29gmM7GNJGxjG9tkJraxjW3uJwnb2MY2tgGQhG3uJwnb/E8iCdvY5n4RgW1sY5vMJCIAsM39JHHp0iV+7dd+DYB3eqd3+uzXeZ3Xee/P+qzPep377rvvVq666qqrrrrqqquuuurfhnL8+HGuuuqqq6666qoXzYu92Iu99ou/+Iu/dq2V2WxGRBARRASlFCKCiCAiiAgigoggIpBERBARSCIiiAgigoggIogISilEBBFBRBARRAQRQUQQEUQEEUFEEBFEBBFBRFBKISKICEopRAQRQURQSiEiiAgigoggIogIIoKIICKICCQhCUlEBJKQhCQiAklIIiKQREQgiYhAEpIAkIQkACQhCUlIAkASkpCEJB5IEpKQxANJ4oEkcT9J3E8S95MEgCTuJwkASdxPEgCSuJ8k7ieJ+0nigSTxL5GEJAAkASAJSUhCEk996lP5kz/5E17plV7p+Gu91mu99Z/92Z/9zOHh4S5XXXXVVVddddVVV131r0c5fvw4V1111VVXXXXVi+bFXuzFXvvFX/zFX7vve/q+RxIRQUQgCUlIQhKSkIQkJBERRAQRgSQigohAEhGBJCICSUgiIogIIoKIICKICCKCiCAikEREEBFIIiKQREQQEUQEEUFEEBFEBBFBRBARRAQRgSQkERFEBBFBRBARRASSkIQkIgJJSEISEYEkJCEJSUhCEpKQBIAkJAEgCUlIAkASkpCEJCQhiecmCUk8kCQeSBL3k8T9JAEgiftJ4n6SAJDE/SQBIIn7SeJ+knggSbyoJAEgCUncTxKSWK1W/O3f/i3A8Xd7t3d7683NzeP/8A//8DtcddVVV1111VVXXXXVvw6Vq6666qqrrrrq3yQiuJ8k/rVscz/bANgGwDYAtrGNbWxjG9vYxjYRgW1sk5nYxjaZiW0yk8zENplJZmKbzCQzyUwyk8wkM8lMMpPMxDaZSWaSmWQmmUlmkplkJplJZhIRZCaZSWYSEWQmEUFmIgnb2EYStslMbCMJ22QmtrGNbWxjG9vYxja2eSBJ2OZ+krDNC2MbSfxr2EYSALaRBIBtJPEvkYRtbGObzAQgIrBNZhIRPLe9vT3+4i/+AuDB7/RO7/TZAD/6oz/6OVx11VVXXXXVVVddddWLjspVV1111VVXXfWvJglJPJAk/jUkAWAbSQDYBsA2ALYBsI1tbGMb29jGNraxTURgm8wkIrBNZmKbzCQzsU1mkpnYJjPJTDKTzCQzyUwyk8wkM8lMMpPMJDPJTDKTzCQzyUxsk5lkJplJZhIRZCaSiAgyk8xEEpmJJGyTmdhGEpmJbWxjG9vYxja2sY1tbGMb29xPEra5nyRs88LYRhIPZBtJANhGEv8ekrDNA0UEtslMACIC29xPEpIA2Nvb49d//deRxDu90zt99ou/+Iu/9md+5me+DlddddVVV1111VVXXfWioRw/fpyrrrrqqquuuupF82Iv9mKv/eIv/uKv3XUdfd9zP0k8kCQkIQlJSEISkpCEJCQBIAlJSAJAEpIAkASAJCQhiYhAEpKQhCQkIQlJRASSkEREIImIQBIRgSQiAklIQhKSiAgigoggIogIIoKIICKICCKCiCAiiAgigohAEpKQhCQkIQlJRASSkEREIAlJSAJAEpIAkASAJCQhCUlIQhLPTRKSkMRzk8QDSeJ+krifJO4nCQBJ3E8S95PE/SQBIIkHksQDSeIFkYQkJAEgCQBJAEhCEgBPecpT+OM//mNe93Vf98Fv+qZv+t5/9md/9jOHh4e7XHXVVVddddVVV1111QtHOX78OFddddVVV1111YvmmmuuecgrvuIrvnVE0Pc9krifJJ6bJF4YSUjifpKQBIAkJAEgCQBJ3E8SkpCEJCQhCUlIQhKSkIQkIgJJRASSiAgkIYmIQBKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIIiKQhCQiAklIQhIAkgCQhCQAJCEJSQBIQhKSkMTzIwlJPJAkHkgS95PE/SRxP0ncTxIAkrifJO4niftJ4oEk8aKQBIAkJPFAkpDEarXib/7mb3jlV37l46/1Wq/11n/2Z3/2M4eHh7tcddVVV1111VVXXXXVC0Y5fvw4V1111VVXXXXVi+YhD3nIS7/iK77iW9da6fse29zPNv9RJHE/SQBIAkASAJIAkIQkJCEJSUhCEpKQhCQkIQlJRASSiAgkIYmIQBKSkIQkJBERRAQRgSQkIQlJSEISkpCEJCQhCUlIQhKSkIQkIgJJSEISkpAEgCQAJCEJAElIAkASkpCEJCQhCUlIQhLPjyQeSBL3k8T9JHE/SdxPEveTxP0kASCJB5LEA0niRSEJSQBI4n6SAJDEarXib//2b7F9/N3e7d3eenNz8/g//MM//A5XXXXVVVddddVVV131/FGOHz/OVVddddVVV131onnIQx7y0q/4iq/41qUUuq4DwDa2AbCNbe5nG9v8R5EEgCQAJAEgCQBJSEISkpCEJCQhCUlIAkASkpBERCCJiEASkpCEJCICSUgiIogIIoKIICKQhCQkIQlJSEISkpCEJCQhCUlIQhIRgSQkIQlJSEISAJIAkIQkACQhCUlI4oWRhCQeSBIPJIkHksT9JAEgiftJ4n6SuJ8k7ieJB5LEv4YkACQBIAlJSAJgtVpx4cIFgOOv9mqv9uDNzc3j//AP//A7XHXVVVddddVVV1111fOiHD9+nKuuuuqqq6666kXzkIc85KVf8RVf8a1LKdRasQ2AbQBsYxsA29jGNgC2sY1tbPNvYZv7SQJAEgCSAJDE/SQhCUlIQhKSkIQkACQhCUlIQhIRgSQkIYmIQBKSkIQkJCGJiCAiiAgkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJAEkASAJAEgCSkIQkACQhCUlIQhKSkMTzI4kHksQDSeJ+krifJO4niftJ4n6SuJ8kHkgSz48kJCGJB5KEJAAkcT9JSGK1WvHkJz+ZxWJx/G3e5m1eG+Af/uEffoerrrrqqquuuuqqq656TlSuuuqqq6666qp/tcyktYYkACRxP0ncTxL3k8QDSeK5SeJFYZvnRxK2kcTzIwnb2MY2kshMbCMJ20jCNpKICDKTzEQSEUFmkplkJplJZpKZZCYRQWbSWiMzyUwyk8wkM8lMMpPMpLWGJCKCzCQzyUwkIQnbSCIzkURmIonMxDa2AbCNbWxjm8zk+ZGEbWzzP1VEYJvM5H4RQWYSETw/v/Zrv8aFCxd493d/988G+NEf/dHP4aqrrrrqqquuuuqqq56NylVXXXXVVVdd9a9mm9YakgCQxP0kASCJ+0nifpK4nyQeSBLPTRIvjG2eH0nYRhIvTCmFzMQ2tpGEbSRhG0lEBJlJZhIRZCaZSWaSmWQmmUlmkplEBK01MpPMJDPJTDKT1hqSkERmkplIQhKSkIQkbCMJSWQmkshMJJGZ2AbANraxTWYSEdjGNraxjW1s869lG0kA2EYSALaRBIBtJAFgG0kA2EYS97ONJF4UEYFtMhOAiCAziQien7/4i7/gyU9+Mp/zOZ/z2S/+4i/+2p/5mZ/5Olx11VVXXXXVVVddddUVlOPHj3PVVVddddVVV71oNjc3j7/O67zOewNIwja2sY1tbGMb29jGNgC2sQ2AbQBsYxsA29gGwDa2uZ9tbGObf4ltHkgSAJIAkASAJCQhCQBJSEISkpCEJCQhCUlIIiKQhCQiAklIQhKSkIQkJBERSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQAJAEgCQBJSAJAEpKQxL9EEs9NEg8kiQeSxP0kcT9J3E8S95PE/STx/Eji+ZHE/SQBIIkHkgTAarXij/7oj3i913u9B7/CK7zCa//Wb/3W93DVVVddddVVV1111VVAOX78OFddddVVV1111YvmmmuuefDrvM7rvDfPlJnYJjOxjW1sYxvb2MY2tgGwDYBtAGxjGwDbANjGNgC2sc39bGObfwtJAEhCEveThCQkIQlJSEISkpCEJCQhCUlEBJKQREQgCUlIQhKSkEREIAlJSEISEYEkJCEJSUgCQBKSkIQkJCEJSUhCEpIAkMT9JCEJAElIAkASkpCEJCQhCUlI4vmRxHOTxP0kcT9J3E8S95PE/STxQJJ4bpJ4QSRxP0kASOKBJAGwWq3467/+a17v9V7vwW/6pm/63n/2Z3/2M4eHh7tcddVVV1111VVXXfX/GeX48eNcddVVV1111VUvmmuuuebBr/M6r/PeALaxjW1sYxvb2MY2trGNbWxjG9vYBsA2ALYBsA2AbWwDYBsA29jmfrZ5bpJ4fiRxP0lIAkASkrifJCQhCUlEBJKQBIAkJBERSCIikIQkJBERSEISkpCEJCICSUhCEpKICCQhCUkASEISkpCEJCQBIAlJSEISkgCQhCQAJAEgCUkASEIS/xqSeG6SuJ8kHkgS95PE/SRxP0k8kCSemyReEEncTxKSeG6SAFitVvz1X/81r/Iqr3L8tV7rtd76z/7sz37m8PBwl6uuuuqqq6666qqr/r+iHD9+nKuuuuqqq6666kVzzTXXPPh1Xud13ts2mYltbGMb29jGNraxDYBtAGwDYBvbANgGwDYAtrmfbQBscz/bPD+SeG6SuJ8kJCEJAElIQhIAkgCQhCQkIQlJSEISkpAEgCQkIYmIQBKSiAgkIQlJSEISEYEkJCEJSUhCEpKICCQhCUkASEISkpCEJCQhCUlIAkASkgCQBIAkACQBIAlJSEISknh+JPH8SOKBJPFAkrifJO4niftJ4oEk8UCSeGEkIYn7SeK5SQJgtVrxN3/zNzziEY84/iZv8iZv/Wd/9mc/c3h4uMtVV1111VVXXXXVVf8fUY4fP85VV1111VVXXfWikcSbv/mbfzTAOI7Yxja2sY1tbANgG9vYxjYAtrmfbQBscz/b3M82ALZ5UUnigSTx3CQhCUlIAkASkgCQhCQkIQlJSEISkpCEJCQhCUlEBJKQREQgCUlIQhKSiAgkIQlJRASSkIQkJCEJSUhCEpKQBIAkJCEJSUhCEveTxP0kASAJAElI4oEkIQlJSEISL4gknpsk7ieJ+0nigSRxP0k8kCQeSBL/EkncTxLPTRIAy+WSJz3pSTzykY88/iZv8iZv/Wd/9mc/c3h4uMtVV1111VVXXXXVVf/fUI4fP85VV1111VVXXfWi2dzcPP7mb/7mHw0wDAO2sY1tbGMb29jGNrYBsI1tAGxjm/vZ5n62uZ9t7meb+9kGwDYviCTuJ4kXRhKSkIQkACQBIAlJSCIikIQkJCEJSUhCEpKICCQhiYhAEpKQhCQiAklIQhIRgSQkERFIQhKSkIQkACQhCUkASEISkpCEJAAkIQkASdxPEpIAkIQk/jUk8dwk8UCSuJ8kHkgS95PE/STx3CTxL5HE/STx3CQBsFqteNKTnsQjH/nI42/yJm/y1n/2Z3/2M4eHh7tcddVVV1111VVXXfX/CeX48eNcddVVV1111VUvms3NzeNv/uZv/tG2Wa/X2MY2trENgG1sA2Ab2wDYxjb3s41t7mebB7LNA9nmfrZ5bpIAkASAJO4niftJQhKSkIQkJCEJSUgCQBKSkIQkJCEJSUhCEpKQhCQiAklEBJKQREQgCUlIQhIRQUQgCUlEBJKQhCQkERFIQhKSkIQkACQhCQBJSEISkrifJO4nCQBJAEgCQBKSkMS/RBLPjyTuJ4kHksT9JPFAkrifJJ6bJP61JPFAkgBYrVY86UlPwvbxd3/3d3/rP/uzP/uZw8PDXa666qqrrrrqqquu+v+Ccvz4ca666qqrrrrqqhfN4eHh7ju90zt9tiSWyyW2sY1tbGMb29jGNraxjW1sYxvb2AbANraxzf1sY5sHss1zs80D2eb5kQSAJAAk8UCSkIQkJCEJSQBIQhKSkIQkIgJJSEISkpCEJCQhiYhAEpKICCQhCUlIQhIRgSQkERFIIiKQhCQkIQlJSAJAEpIAkIQkACQhCUlI4n6SuJ8kACQBIAlJAEhCEpKQhCTuJ4kXRBIPJIkHksT9JPFAkrifJJ6bJF4YSdxPEgCSeCBJAKxWK86fP4/t4+/+7u/+1n/2Z3/2M4eHh7tcddVVV1111VVXXfX/AeX48eNcddVVV1111VUvund6p3f6bIDDw0NsYxvb2CYzsY1tbGMb29jGNraxjW1sYxvb2MY2trmfbWxjm+fHNs+PbZ6bJAAkASAJAEk8N0lIQhIAkpCEJCQhCUlIIiKQhCQkERFIQhIRgSQkERFIQhKSkIQkIgJJSCIikEREIImIQBIRgSQkIQkASUgCQBKSAJCEJCQhiftJ4n6SAJAEgCQk8dwkIYkXRhLPTRIPJIn7SeKBJHE/STw3SbwwkrifJAAk8UCSAFitVpw/f55Tp04df9u3fdu3/rM/+7OfOTw83OWqq6666qqrrrrqqv/rKMePH+eqq6666qqrrnrRvc7rvM57b25uHl8ul2QmmYltbGMb29gmM7GNbTIT29jGNrbJTGxjG9vYxja2sc39bGMb29jGNrZ5YWzzgkgCQBIAkgCQhCQeSBKSkIQkJAEgiYhAEpKQREQgCUlIQhIRgSQkERFIQhKSkIQkIgJJSCIikEREIAlJSEISEYEkIgJJAEhCEgCSkASAJCQhCUncTxL3kwSAJAAkIYl/LUk8N0k8kCTuJ4kHksT9JPH8SOIFkcT9JAEgiQeSBMBqteK2227jEY94xPE3eZM3ees/+7M/+5nDw8Ndrrrqqquuuuqqq676v4xy/PhxrrrqqquuuuqqF92bv/mbf/Tm5ubxg4MDWmvYxjaZiW1sk5nYxjaZiW1sY5vMxDa2sY1tbJOZ2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNi+Mbe4nCQBJAEjifpKQhCQkIQlJSEISAJKQREQgCUlIQhKSkEREIAlJRASSkIQkJCGJiEASkogIJBERSEISEYEkJCEJSUhCEgCSAJCEJAAkIQlJSEISDyQJAEkASAJAEpKQxItCEs+PJO4niQeSxANJ4n6SeH4k8aKQBIAknpsklsslT3rSk3jEIx5x/E3e5E3e+s/+7M9+5vDwcJerrrrqqquuuuqqq/6vohw/fpyrrrrqqquuuupF90qv9Epvfc011zz46OiIcRyxTWZim8zENrbJTGxjm8zENraxTWZiG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2/xa2uZ8kACQBIIn7SUISkpCEJCQBIAlJSEISEYEkJCEJSUgiIpBERCAJSUhCEpKICCQhiYhAEpKICCQhiYhAEpKICCQhCUlIQhIAkgCQhCQkIQlJSEIS95MEgCQAJHE/SUjihZHE8yOJB5LEA0nigSTxQJJ4bpJ4fiTxQJK4nyQAJAEgieVyyZOe9CQe8YhHHH+TN3mTt/6zP/uznzk8PNzlqquuuuqqq6666qr/iyjHjx/nqquuuuqqq6560b3O67zOe19zzTUP3t/fZxxHMhPbZCa2yUxsk5nYxja2yUxsYxvbZCa2sY1tbGMb29jGNraxjW1sYxvb2MY2ALaxjW1sA2Ab29jGNraxzQtim+dHEgCSeH4kIQlJSEISkpCEJCQhCUlIIiKQREQgCUlIQhKSiAgiAklEBJKQREQgCUlIIiKQhCQkIQlJAEgCQBIAkpDE8yOJB5IEgCQkcT9JSEISz00SL4gkHkgSDySJB5LEA0ni+ZHEi0IS95PEA61WK570pCfxyq/8ysdf+7Vf+61/4Rd+4Wu46qqrrrrqqquuuur/Isrx48e56qqrrrrqqqtedK/zOq/z3tdcc82DL126xDAMZCa2yUxsk5nYxjaZiW1sk5nYxjaZiW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29gGwDa2sQ2AbWxjGwDb2MY2trHNi0oSAJKQhCQkIQlJSAJAEpKICCQhCUlIIiKQREQgCUlIQhKSkEREIImIQBKSiAgkIQlJSCIikIQkJCEJSUgCQBIAkpAEgCQkIYkHksT9JAEgCUk8kCQkcT9JvDCSeCBJPJAkHkgSDySJfwtJAEjiuUkCYLlc8jd/8ze88iu/8vE3e7M3e+9f+IVf+Bquuuqqq6666qqrrvq/hnL8+HGuuuqqq6666qoX3Yu92Iu99kMe8pCXPjo6YrlcYpvMxDaZiW0yE9tkJraxTWZiG9tkJraxjW0yk8wkM8lMMpPMJDPJTDKTzMQ2trGNbTIT29jGNpmJbWxjG9vYxjYAtrENgG1s868lCQBJPJAkJAEgCUkASEISkpCEJCQhCUlEBJKQhCQkIYmIQBIRgSQkIYmIQBKSkIQkJCEJSUhCEpIAkASAJAAkIQlJSEISknggSQBIAkASz00SknhRSOKBJPFAknggSTyQJP69JPH8LJdL/vqv/5pXeZVXOf7gBz/4wX/6p3/6M1x11VVXXXXVVVdd9X8J5fjx41x11VVXXXXVVS+6Bz/4wS/94i/+4q99dHTE4eEhmUlmYpvMxDaZiW0yE9tkJraxTWZiG9vYJjOxjW1sYxvb2MY2trGNbTKTzCQzyUxsk5lkJraxTWZiG9tkJraxjW1sA2Ab2wDYBsA2trHNv4YkACQBIAlJSEISAJKQhCQiAklIQhKSkEREIAlJSEISkpCEJCICSUhCEhGBJCQhCUlIQhKSkIQkJCEJAEkASEISL4gk7icJAElI4t9KEs9NEg8kiftJ4rlJ4l9DEgCSAJDE/SRxv+VyyV/91V/xfu/3fi99zTXXPPhP//RPf4arrrrqqquuuuqqq/6voBw/fpyrrrrqqquuuupF92Iv9mKv/eIv/uKvfXBwwP7+PpmJbTKTzMQ2mYltMhPbZCa2yUxsY5vMJDOxjW1sk5lkJplJZpKZZCaZSWaSmWQmmYltMpPMJDOxTWaSmdgmM7FNZmKbzMQ2mYltbGMb29jGNgC2sQ2AbWzzL5EEgCSemyQkIQlJAEhCEpKQhCQkIYmIQBKSkIQkIgJJRASSkIQkJCEJSUhCEpKQhCQkASAJSdxPEgCSkIQkJCEJSTyQJAAkASAJSfxbSOK5SeKBJPFAknggSfxbSOJ+krANgCQAVqsVv//7v8/7vd/7vfTZs2efceutt/41V1111VVXXXXVVVf9X0A5fvw4V1111VVXXXXVi+6aa655yCu+4iu+9Xq95uLFi9gmM8lMbJOZZCa2yUxsk5nYJjOxjW0yE9vYJjPJTGxjG9tkJplJZpKZZCaZSWZim8wkM8lMMhPbZCaZiW0yE9tkJrbJTGyTmdjGNpmJbTIT29jGNgC2AbANgG1sY5sHss1zk8TzIwlJAEhCEpKQhCQkIQlJSEISkpCEJCQhiYhAEpKQhCQkIQlJSAJAEpIAkIQkJAEgCQBJSOIFkcT9JHE/SfxbSOK5SeKBJPFAknhukvi3kMQLslwuOXv2LB/4gR/41gD/8A//8DtcddVVV1111VVXXfW/HeX48eNcddVVV1111VUvus3NzeOv8zqv896tNc6ePUtmkpnYJjPJTGyTmdgmM8lMbJOZ2MY2mYltMhPb2CYzyUwyE9vYxja2sY1tbJOZZCaZSWaSmdgmM8lMbJOZ2CYzsU1mYpvMxDa2yUxsY5vMxDa2yUxsYxvb2MY2ALYBsI1tXhhJ3E8SkgCQhCQAJCEJSUgCQBKSiAgkIQlJSCIikIQkJCEJSUhCEpKQhCQkIQlJAEhCEpK4nyQAJCEJSTyQJO4nCQBJAEji30ISz00SDySJB5LE8yOJF5UkACTx3CQBcMcdd9Ba49Vf/dUffOutt/7N2bNnb+Wqq6666qqrrrrqqv/NKMePH+eqq6666qqrrnrRXXPNNQ9+ndd5nfder9fcd9992MY2mYltbJOZ2CYzyUxsk5nYJjOxTWZim8zENrbJTGxjG9tkJplJZpKZZCaZSWaSmWQmmUlmYpvMJDOxTWaSmdgmM7FNZmIb22QmtrGNbTIT29jGNpmJbWxjG9vYBsA2ALaxzb9EEveThCQAJCGJ+0lCEgCSkIQkJCEJSUhCEpKICCQhCUlIQhKSAJCEJCQhCUkASEISkgCQBIAkACQhCUk8N0kASAJAEpL4t5DEA0niuUnigSTx/Eji30ISDySJJz3pSczn8+Nv+7Zv+9p/9md/9jOHh4e7XHXVVVddddVVV131vxXl+PHjXHXVVVddddVVLzpJvPmbv/lH2+aOO+7ANraxTWZiG9tkJpmJbTIT22QmmYltMhPbZCa2sU1mYhvbZCa2sY1tbJOZZCaZSWaSmWQmmYltMpPMJDOxTWZim8zENpmJbTIT29gmM8lMbGMb29gmM7GNbWxjG9tkJraxjW3uZxvbPD+2AZDE8yMJSdxPEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkASAJCQhCUk8kCTuJwkASbwgkrifJO4niX8LSTw3STyQJJ6bJF4YSdjmuUkCQBLPjyQAzp8/j+3j7/Ee7/HWf/Znf/Yzh4eHu1x11VVXXXXVVVdd9b8Rlauuuuqqq6666t+stYYknpskHkgSAJK4nyQAJAEgCQBJSAJAEpIAkIQkJCEJSUhCEpKQhCQkIYmIQBKSiAgkERFIIiKICCQREUQEEYEkIoKIICKICCKCiCAiiAgigohAEhFBRBARSCIiyEwiAklIIiKQBIBtJCGJ50cSAJKwjW1sAyAJSUhCEpLITCQREUQEEUFEEBFIQhKSkIQkJCEJAElIorXG/SQBIAkASUjigTKTiAAgM4kIMhOAiCAz+dewjSQeyDaSuJ9tACRxP9tI4gWxjSSeH0kASCIiuJ9tAEopXLp0iT/90z/lkY985IM/53M+57c+5EM+5CFcddVVV1111VVXXfW/EeX48eNcddVVV1111VUvusPDw913eqd3+uxaK09/+tOxjW1sYxvb2MY2trGNbWyTmdjGNraxTWZim8zENpmJbWyTmdgmM7GNbWxjm8wkM8lMMpPMJDOxjW0yk8wkM7FNZmKbzMQ2mYltMpPMJDOxjW1sY5vMJDPJTDKTzCQzsY1tMhPb2MY2tgGwDYBtAGxjm+dHEg8kCQBJ3E8SkpCEJCQhCUlIAkASkpCEJCQhCQBJSAJAEpIAkIQkJCGJ+0kCQBIAkpCEJCTxQJJ4IEn8W0niuUnigSTx3CTxbyGJF2a5XPLEJz6RV33VVz3+4Ac/+MF/+qd/+jNcddVVV1111VVXXfW/DeX48eNcddVVV1111VX/Oq/zOq/z3pubm8fvvPNOxnHENrYBsI1tbGMbANvYxja2sU1mYhvb2MY2trGNbTIT22QmtslMbGMb22QmtrGNbWxjm8wkM8lMMhPbZCaZiW0yk8zENrbJTGxjm8wkM8lMMhPb2MY2trGNbTKTzMQ2trENQGZiG9vYBsA2ALZ5fmxzP0kASAJAEgCSkIQkACQhCUlIQhIAkpCEJCQhCUkASEISAJKQBIAkJCEJSUjigSTxL5EEgCQAJPHvIYkHksRzk8Rzk8S/hSSemyQkcXR0xF/+5V/y/u///i8N8A//8A+/w1VXXXXVVVddddVV/5tQjh8/zlVXXXXVVVdd9a/zSq/0Sm99zTXXPPjee+9luVxiG9vYxja2AbCNbWxjGwDb2AbANraxjW0yE9tkJrbJTGxjG9vYJjOxjW1sk5nYxja2sY1tbGObzCQzsU1mkplkJrbJTGxjm8zENrbJTDKTzCQzyUwyk8wkM7GNbWxjG9tkJrYBsI1tbGMb2wDYBsA2D2SbF0QSkrifJCQBIAlJSEISAJKQhCQkIQlJAEhCEgCSAJCEJF4QSQBI4oWRBIAkACTx7yGJ5yaJB5LECyKJ58c2/xqSODo64r777uMN3/ANH3zrrbf+zdmzZ2/lqquuuuqqq6666qr/LSjHjx/nqquuuuqqq67613md13md977mmmsefMcdd3B0dASAbWxjG9vYxjYAtrGNbWwDYBvbANjGNgC2sY1tbGObzMQ2mYltbJOZ2MY2tslMbGMb29jGNraxTWaSmdjGNpmJbTKTzMQ2tslMbGMb29jGNraxjW0yk8wkM8lMbGMb22QmtrGNbWxjG9sA2OZ+trHN8yOJ5yaJ+0lCEgCSkIQkACQhCUlIQhKSAJCEJO4nCUkASEISkpCEJB5IEpJ4QSQBIAkASbwgtgGQxAsjiecmiQeSxH8ESTw/krj99tuZz+fH3/Zt3/a1/+zP/uxnDg8Pd7nqqquuuuqqq6666n8DyvHjx7nqqquuuuqqq/51XuzFXuy1H/KQh7z0+fPnuXTpErYBsI1tbGMb29gGwDa2sY1tAGxjG9sA2MY2ALYBsA2AbQBsYxvb2MY2mYltbJOZ2MY2trGNbWxjm8wkM7FNZpKZ2CYzsU1mYhvbZCaZSWaSmWQmmUlmkplkJrbJTDIT29gmM8lMbGMb29jGNraxjW0AbPP82Ob5kcQDSUIS95OEJAAkIQlJSEISAJIAkASAJAAk8cJIAkASL4gkHkgSLypJvCCSeCBJPDdJ/FtJ4n6SsA2AJO537tw5HvGIRxx/0zd907f+hV/4ha/hqquuuuqqq6666qr/DSjHjx/nqquuuuqqq67613nwgx/80i/+4i/+2pcuXeL8+fMA2MY2trGNbWxjGwDb2MY2trENgG1sA2Ab29gGwDYAtrGNbWxjG9vYxja2sU1mYhvb2MY2mYltbGMb29jGNraxTWZim8zENpmJbTIT29jGNraxjW1sY5vMJDOxTWaSmdjGNpmJbWxjG9sA2MY2trGNbQBsY5v72eZ+knggSTyQJAAkIQkASQBIQhKSAJCEJO4nCQBJAEhCEs9NEveTxAsiiQeSxAPZ5oWRxPMjiecmiecmiX8rSbwgy+WSJzzhCbzqq77q8Qc/+MEP/tM//dOf4aqrrrrqqquuuuqq/+kox48f56qrrrrqqquu+te55pprHvKKr/iKb71cLrn77ruxjW1sYxvb2OZ+trGNbWxjGwDb2MY2tgGwjW0AbGMbANvYBsA2ALaxjW1sA2Ab29gmM7GNbWxjG9vYxja2sY1tMhPbZCaZiW1sk5nYxjaZSWaSmWQmmUlmYpvMJDPJTGyTmdgmM8lMbGMb29jGNraxjW1sA2AbANs8kG2emyQeSBKSAJCEJAAkcT9JSEISAJK4nyQAJAEgCUlIQhLPTRKSeH4k8YJI4kUhiedHEs9NEs+PJF4Q27wwkrDNAy2XS/7iL/6C93//939pgH/4h3/4Ha666qqrrrrqqquu+p+Mcvz4ca666qqrrrrqqn+dzc3N46/zOq/z3uM48oxnPAPbPD+2sY1tbGOb+9nGNraxDYBtbGMbANvYBsA2tgGwDYBtbANgG9sA2MY2ALaxjW1sk5nYxja2sY1tbGMb29jGNpmJbTIT22QmtrGNbWxjm8wkM8lMbJOZZCa2yUxsk5nYJjOxjW1sA2Ab29gGwDYAtnkg2zw/knggSdxPEpIAkIQkJAEgCUkASOJ+kgCQxAsjCQBJPD+SuJ8k/j0k8dwk8dwk8R9BEi/I0dER9957L2/0Rm/04FtvvfVvzp49eytXXXXVVVddddVVV/1PRTl+/DhXXXXVVVddddW/jiTe/M3f/KMBnvKUpwBgG9vYxja2eX5sYxvbPJBtbGMbANvYBsA2trENgG1sA2AbANsA2AbANrYBsI1tbGMb29jGNraxjW1sYxvb2MY2mYltMhPbZCa2sY1tbGMb29gmM8lMbJOZ2CYzsU1mYpvMxDa2yUxsYxvb2MY2trmfbWzz3CTxQJJ4IEncTxKSuJ8kJCEJAEncTxIAkgCQxAsiCQBJvCCSAJDE/STxbyGJ5yaJ5yaJfytJvDCSuP3225nP58ff7u3e7rV/4Rd+4Wu46qqrrrrqqquuuup/Ksrx48e56qqrrrrqqqv+dTY3N4+/+Zu/+UeP48hTnvIUXhDb2MY2z49tbGObB7KNbQBsYxvbANjGNgC2sQ2AbQBsA2AbANsA2MY2ALaxjW1sYxvb2MY2trGNbWxjG9vYxja2yUxsYxvb2MY2trFNZmKbzCQzsU1mYpvMxDaZiW1sYxvbANjGNraxDYBtnptt/iWSeCBJPDdJAEgCQBL3kwSAJF4QSQBI4gWRxH8kSTw3STw/kviX2Ob5kcQDScI2AOfOneMRj3jE8cc+9rEP/tM//dOf4aqrrrrqqquuuuqq/4kox48f56qrrrrqqquu+tc5PDzcfad3eqfP7rqOxz3ucbwobPPC2Oa52cY297ONbQBsYxsA29gGwDYAtrHN/WwDYJv72cY2trGNbWxjG9vYxja2sY1tbJOZ2MY2mYltbGMb29jGNplJZmKbzMQ2mYltMhPb2CYzsY1tbGMb2wDYxjYAtgGwjW1eGEncTxIPJInnJglJAEjifpK4nyQk8e8hiX+Jbe4niRdGEs9NEi+IJJ6bbZ4fSbwwy+WSxz/+8XzAB3zASwP8wz/8w+9w1VVXXXXVVVddddX/NJTjx49z1VVXXXXVVVf96734i7/4a19zzTUPPnv2LIeHh/xHsM3zY5sHss39bGMbANvYBsA2ALYBsA2AbQBscz/b2MY2trGNbWxjG9vYxja2AbCNbWxjm8zENraxjW1sY5vMxDaZiW0yE9tkJraxTWZim8zENgC2sQ2AbQBsA2CbB7LNv0QS95PE/SRxP0kASOJ+kgCQBIAkXhBJ/EskASCJ52abF0YSz48knpsk/i1s89wkAWCbBzo6OuK+++7jjd7ojR586623/s3Zs2dv5aqrrrrqqquuuuqq/0kox48f56qrrrrqqquu+td7ndd5nfe+5pprHnzrrbdyeHjICyOJfy/bPJBtHsg297MNgG1sA2AbANsA2AbANg9kG9vYxja2sY1tbGMb2wDYxja2sY1tbJOZ2MY2trGNbWyTmdgmM7FNZmIb22QmtrFNZmIb29jGNraxjW3uZxvbvDCSeCBJ3E8Sz00SAJK4nyQAJAEgiRdEEg9kGwBJvDC2eVFJ4vmRxPMjiX8rSbwwt912GzfddNPxl3u5l3vt3/7t3/4arrrqqquuuuqqq676n4Ry/Phxrrrqqquuuuqqf70zZ848+Nprr31tgLNnz/IfQRL/GrZ5INvczzb3sw2AbQBsA2AbANsA2OZ+trGNbWxjG9vYxja2sQ2AbQBsYxvb2MY2trGNbWxjm8zENpmJbTIT29gmM7GNbTIT29jGNgC2sY1tbANgmweyzb+GJJ6bJAAkcT9JPJAk/i0kcT9J3E8S/xaSeG6SeEEk8YLY5t/iGc94Bm/wBm9w/MEPfvCD//RP//RnuOqqq6666qqrrrrqfwrK8ePHueqqq6666qqr/vVe7MVe7LVf8RVf8bXPnj3Lfffdx7+FJF5UknhR2OZ+trmfbQBsYxsA2wDYBsA297PNA9nGNraxjW1sA2Ab29jGNraxjW0yE9vYxja2sY1tbGMb29gmM7GNbTIT29gmM7GNbWwDYBvb2OZ+trHNv0QSAJJ4IEk8kCQAJHE/SbwgtgGQxItCEv+RJPH8SOI/giTuZ5sHWi6X/MVf/AUf8AEf8NL/8A//8Dtnz569lauuuuqqq6666qqr/iegHD9+nKuuuuqqq6666t9Er/M6r/PeALfeeiv/GSTxwkjiX2Kb+9nmfrYBsA2AbQBsA2Cb+9nmBbGNbWxjGwDb2MY2ALaxjW1sYxvb2CYzsU1mYhvbZCa2sU1mYhvbZCa2sY1tAGxjG9sA2OaBbPOvIYkXRBL3kwSAJF4QSbwoJPGC2OYFkcQLIonnRxIvKtv8axwdHTFNE2/3dm/32n/2Z3/2M4eHh7tcddVVV1111VVXXfXfjXL8+HGuuuqqq6666qp/PUm8+Zu/+UcDPOlJT+LfQhL/VpJ4fiTxr2UbANsA2AbANvezzf1sYxvb2MY2trENgG1sA2Ab29jGNraxjW1sYxvb2MY2mYltbJOZ2MY2mYltbGMb29jGNgC2sQ2AbQBscz/b3M82z00SL4wk7icJAEm8KCRxP9s8kCT+I0ji+ZHECyKJ58c2/xa2OXfuHI985COPv8IrvMJL/9Zv/db3cNVVV1111VVXXXXVfzfK8ePHueqqq6666qqr/vU2NzePv/mbv/lH933PP/zDP/CfSRIvCkk8N0m8ILZ5brYBsA2AbQBscz/bvCC2sY1tbANgGwDb2MY2mYltbANgG9vYxjaZiW1sk5nYxja2yUxsYxsA2wDYxjb3s839bANgmxeFJJ4fSTw3SQBI4t9KEgCSuJ9t/i0k8fxI4t/CNs9NEgC2eaDlcsnjH/943vVd3/XBZ8+efcatt97611x11VVXXXXVVVdd9d+Jcvz4ca666qqrrrrqqn+9w8PD3Rd/8Rd/7WuuuebBZ8+e5fDwkP9qknhhJPGiss39bANgGwDbANjmfrZ5INvYxja2sQ2AbWxjGwDb2AbANraxjW1sA2Ab29jGNraxjW0yE9vYxja2sY1tbANgG9sA2OY/gyReGNv8TyCJ50cSLwrb/Ets80BHR0fcc889vO3bvu1L/9mf/dnPHB4e7nLVVVddddVVV1111X8XyvHjx7nqqquuuuqqq/5tXud1Xue9r7nmmgffeuutHB4e8j+BJF4QSTyQJF5UtrmfbQBscz/bPDfb2MY2ALaxDYBt7mcb29jGNgC2sY1tbGMb29jGNraxTWZiG9sA2AbANra5n21sY5sXhSTuJ4kXRBL/VrZ5IEm8MLb5l0ji+ZHECyOJB7LNc7MNgCSem20AbANw22238VIv9VLHX/EVX/Glf+u3fut7uOqqq6666qqrrrrqvwvl+PHjXHXVVVddddVV/zZnzpx5sKTX3tjY4OzZs7yobPPvIYl/DUk8N0m8KGzzQLYBsA2Abe5nmxfENraxDYBtAGxzP9vYxjYAtrGNbWxjG9vYxjaZiW1sYxvb2MY2tgGwjW0AbPNAtrmfbR7INvezzb+VbR5IEgC2eUEkASCJfw9JPD+S+PewzfNjG0nc7/GPfzzv9m7v9uCzZ88+49Zbb/1rrrrqqquuuuqqq67670A5fvw4V1111VVXXXXVv5ne6Z3e6b0Bbr31Vv4ltvnPJol/iSSemyReVLYBsM39bHM/27wwtrENgG0AbPNAtrGNbWxjG9vYxja2sY1tbGMb2wDYBsA2ALaxzf1sY5v72ebfyjb/FpK4n23uJ4nnxzb/HpJ4QSTxwtjmBZEEgG0AbHO/o6Mj7rnnHt7u7d7upf/sz/7sZw4PD3e56qqrrrrqqquuuuq/GuX48eNcddVVV1111VX/Ntdcc82DX+d1Xue9AZ70pCfxwtjmv4skXhBJPDdJ/GvYBsA297PNv8Q2tgGwDYBtbGMb29jGNrYBsI1tbANgG9vYxja2sY1tAGwDYBvb2OZfwzbPjyRs8/zYBsA297PNfyTbvDCSeEEk8V/BNoeHhzzykY88/uAHP/j4n/7pn/4MV1111VVXXXXVVVf9V6McP36cq6666qqrrrrq30YSb/7mb/7R4zjypCc9if8tJPH8SOK5SeJFYZv72QbANs/NNrZ5INvYBsA297ONbWxjG9sA2MY2tgGwjW1sYxvb2MY2ALYBsI1tbGMbANvY5rnZ5n62eW62kQSAbQBs8/zY5gWxzQPZRhIvjG3+tSTx/EjiX8M2/xpHR0c87nGP4wM/8ANf+h/+4R9+5+zZs7dy1VVXXXXVVVddddV/Jcrx48e56qqrrrrqqqv+bQ4PD3df/MVf/LVvvPHGB589e5bDw0OeH9u8qGzzH0USLwpJPD+S+JfY5oFsA2Cb+9nmudnGNg9kGwDb2Ob5sY1tbANgGwDb2MY2ALaxjW0AbANgmweyzQPZxjb3s40kbPPC2OaBbANgm/vZ5gWxzfMjif9oknhhJPHcbPNAtnlR2Obo6IhxHHn7t3/71/6FX/iFr+Gqq6666qqrrrrqqv9KlOPHj3PVVVddddVVV/3bvc7rvM57X3PNNQ8+e/Ysu7u7PDfb/Ets819JEi+IJJ6bJB5IEveTxAtjm/vZ5l9iG9sA2AbANraxjW1sYxsA29gGwDa2sc39bGOb+9kGwDa2uZ9tbPP82Ob5sc0D2eYFsQ2AbR5IEs/NNgCSeG62eSDb/Esk8YJI4t/DNs+Pbe5nm7Nnz/KIRzzi+Iu92Is9+E//9E9/hquuuuqqq6666qqr/qtQjh8/zlVXXXXVVVdd9W935syZB7/4i7/4a1+8eJGzZ8/yQLZ5QWzzb2Wb50cS/xaSeH4k8dwk8W9hm/vZ5l9iGwDbANjmudnGNrYBsA2AbWxjGwDb2MY2ALYBsI1tbANgm/vZ5n62eSDb2OZ+trmfbe5nGwDbANjmX2Kb50cSz802/xaSeEEk8cLY5kVlm/sdHR1x77338kZv9EbHb7311r85e/bsrVx11VVXXXXVVVdd9V+Bcvz4ca666qqrrrrqqn8Xvc7rvM57A9x6663czzbPj23+Jbb5zyKJf4kknpsknpsk7ieJF4Vt7mebF8Y2ALaxzf1sYxvb2MY2ALYBsA2AbWxzP9vY5n62sY1tAGwDYJv72eZFYRvbPDfbANgGwDYvCtv8W9kGQBL/Ekn8W9nmuUkCwDYPZJtz585xww03HH/FV3zFB//Wb/3W93DVVVddddVVV1111X8FyvHjx7nqqquuuuqqq/7tJPHmb/7mHw3wpCc9CQDbPDfbPD+2+e8miRdEEs9NEg8kiftJ4kVhm/vZ5gWxzf1sA2Cb52Yb2wDYBsA2ALaxzf1sYxsA2wDY5n62uZ9tHsg2tvnXsA2AbQBs8/zYBsA2L4gknh/bvKgk8YJI4kVhm/vZ5vmxzXO79dZbefd3f/cH/8M//MPvnD179lauuuqqq6666qqrrvrPRjl+/DhXXXXVVVddddW/3eHh4e6Lv/iLv/aNN9744Pvuu4/Dw0PuZ5vnxzYviG3+M0niXyKJ50cSz00S95PEv5ZtHsg2z80297MNgG2eH9vYBsA2ALa5n20eyDYAtrGNbe5nm/vZBsA2L4htnh/b3M8297PNC2ObF8Q297PNv5Uk/jPZxjb3Ozo64q677uK93uu9XvsXfuEXvoarrrrqqquuuuqqq/6zUY4fP85VV1111VVXXfXv8zqv8zrvLenBAPfddx+2eSDbPD+2eVHY5l9DEv8aknhhJPHcJPFAknggSfxr2Oa52eb5sQ2AbR7INrYBsI1tAGwDYJsHss39bGObB7LN/WzzgtgGwDYviG3uZ5v72eb5sc2/lW1eEEm8MJJ4UdnmX8M2tjk8POSRj3zk8Rd7sRd78J/+6Z/+DFddddVVV1111VVX/WeiHD9+nKuuuuqqq6666t9Nr/M6r/PWAE972tMAsM0D2eb5sc1/NUn8SyTx/EjiuUnigSRxP0n8a9nmRWWb+9kGwDa2AbCNbQBscz/b3M8297ONbWxzP9s8P7axzfNjmweyzf1s80C2uZ9tHsg2L4xt7mebfwtJ/HvZBsA2z802ALYBODo64p577uGN3/iNj//Zn/3ZzxweHu5y1VVXXXXVVVddddV/Fsrx48e56qqrrrrqqqv+fY6Ojnbf/M3f/KMBnvCEJwBgmweyzQtim/9MknhRSOL5kcTzI4kHksQDSeJ+knhR2OaBbPP82OaBbHM/2wDYxjYAtgGwDYBt7meb+9nGNg9kmweyjW3+JbaxjW2em23uZ5vnxzb3s80DSeJFYZsHksQLI4l/Ldv8S2xzP9ucPXuWl37plz7+4Ac/+Pif/umf/gxXXXXVVVddddVVV/1noRw/fpyrrrrqqquuuurf5/DwcPed3umdPrvve+69914ODg6wzQPZ5vmxzX8WSfxLJPGCSOK5SeK5SeKBJPFAkrifJF5UtnlutgGQxP1sA2Cb+9nmfrYBsI1tAGxzP9vczzYAtrGNbe5nG9s8N9vczza2sc0LY5sHss39bHM/27wobHM/2/xrSOJfIokHss1zsw2Abf4ltvn7v/97PviDP/il/+Ef/uF3zp49eytXXXXVVVddddVVV/1noBw/fpyrrrrqqquuuurf78Vf/MVf+5prrnnwPffcw4ULF3gg2zw/tvnPIokXRhLPjySeH0k8N0k8N0k8kCTuJ4n7SQJAEi8K27wobHM/29zPNvezDYBtAGxzP9sA2OZfYpv72cY2z49tnpttHsg2D2SbB7LNi8I2/16S+Neyzb/ENrYBsM3R0RHHjx/nFV/xFR/8W7/1W9/DVVddddVVV1111VX/GSjHjx/nqquuuuqqq676D6FXfMVXfOuu63jqU58KgG1s80C2sY1t/rtI4vmRxHOTxPMjiQeSxANJ4oEkcT9JPDdJAEjiudnmgWzzL7HN/WwDYJv72QbANgC2AbDN/Wxjmweyzf1sA2Cb52ab+9kGwDa2sc1zs81zsw2AbQBs869hmxeVJP4lkngg2zw32wDY5l9im6c//em8x3u8x4P/4R/+4XfOnj17K1ddddVVV1111VVX/UejHD9+nKuuuuqqq6666t/v6Oho983f/M0/GuAf/uEfsM39bGMb2zw329jGNraxjW1sYxvb2MY2trGNbf4ltvnXkMRzk8Rzk8Rzk8QDSeJ+knggSdxPEv9atvnXsM0LYhsA2wDYBsA2ALYBsI1tbHM/2zw/trHN/WxzP9u8ILZ5fmwDYJsHsg2AJJ4f2/x7SOJfyzb/EtvYBsA2R0dH3HXXXbz3e7/3a//CL/zC13DVVVddddVVV1111X80yvHjx7nqqquuuuqqq/79Dg8Pd1/8xV/8tW+66aYH33333ezv72Mb29zPNraxjW1s829lG9vY5gWxzb+VJJ6bJB5IEg8kiQeSxANJ4n6SuJ8kACTxr2WbF8Q2ALZ5QWwDYBvb3M82ALZ5UdjGNs/NNvezDYBtbGMb29jmhbENgG3+LWzzL5HEi0ISD2Sb52YbANu8KPb393n1V3/140dHR8+49dZb/5qrrrrqqquuuuqqq/4jUY4fP85VV1111VVXXfUf48yZMw+W9Nrz+Zy7774b29jGNra5n21sYxvb2MY2trGNbWxjG9vYxja2eX5sY5vnxzb/ESTxQJJ4IEk8kCTuJ4kHksT9JPHcJAEgCQBJPD+2+dewzfNjm/vZBsA297ONbZ6bbe5nmweyDYBtAGxzP9v8a9kGwDb/Etvczzb/VpL417LNv8Q2tgGwzdHREZcuXeId3uEdXvoXfuEXvoarrrrqqquuuuqqq/4jUY4fP85VV1111VVXXfUfRu/0Tu/03ltbW/zd3/0dtrGNbWxjG9sA2MY2trGNbWxjG9vYxjbPzTa2sY1tHsg2tnlutnkg2/xrSOKBJPFAkrifJB5IEg8kiftJ4n6SAJDEv5VtHkgSL4htXhS2uZ9tHsg2ALZ5fmzz/NgGwDbPzTa2sY1tHsg297PNv8Q2D2SbF0YSLypJANjm+bENgG1eFPv7+7z6q7/68aOjo2fceuutf81VV1111VVXXXXVVf9RKMePH+eqq6666qqrrvqPcfbs2Vtf/MVf/LVvuummB991113s7e1hG9vYxja2sQ2AbWxjG9vYxjYPZBvb2MY2tnkg29jGNvezjW0eyDYPZJv/CJK4nyQeSBL3k8QDSeJ+knhukvjXsM2LyjYvjG0AbANgm/vZ5oFs89xsY5vnZhvb3M82ALaxjW2em21scz/b3M82Lwrb/FtJ4l/DNi8K29gGwDZHR0fs7e3x9m//9i/9C7/wC1/DVVddddVVV1111VX/USjHjx/nqquuuuqqq676j3PmzJkHv/iLv/hr2+ZpT3satrGNbWxjm8zENraxjW1sYxsA29jGNraxjW1sA2Ab29jGNvezjW3uZxvb3M82L4htXhSSuJ8kXhBJ3E8S95PEA0nifpIAkMT9JAEgCQBJ/Eexzb/ENgC2uZ9tHsg2L4xtbPPcbANgG9u8MLaxDYBtHsg2Lyrb/Esk8R/BNgC2eW62eSDb7O/v88hHPvK4pGfceuutf81VV1111VVXXXXVVf8RKMePH+eqq6666qqrrvqPc/bs2We8+Zu/+Uf3fc9f//VfYxvbZCa2sY1tbGMb29jGNrYBsI1tbGMb29gGwDa2sY1tAGxjG9sA2MY297PN/WxzP9v8R5HE/SRxP0ncTxIPJIn7SQJAEveTBIAk/rVs89wk8YLY5l9im/vZ5n62eW62uZ9tHsg2trmfbQBsYxvb2MY2trHN/WwDYJsXxjYAtrmfbf6tJPGiss1zs81zs41tAGxzdHTENE28wzu8w0v/wi/8wtdw1VVXXXXVVVddddV/BMrx48e56qqrrrrqqqv+4xweHu6++Iu/+GvffPPND7506RL33XcftrGNbWxjG9vYxja2sY1tbGMbANvYxja2AbCNbWwDYBvb2AbANrYBsI1tAGxjGwDb3M8297PN/WzzH0kS95PE/SRxP0ncTxLPTRIAkgCQxPNjm38N2/xb2OZ+tgGwDYBtAGxzP9vY5rnZBsA2tnl+bGMbANsA2OZFZZv72eZfIol/L9u8MLYBsI1tbHNwcMAjH/nI45Keceutt/41V1111VVXXXXVVVf9e1GOHz/OVVddddVVV131H+u+++57xou92Iu99oMf/ODjf/mXf0lmYhvb2MY2trGNbWwDYBvb2MY2tgGwjW1sA2Ab2wDYxjYAtrENgG1sA2Ab2wDYBsA2tgGwzf1s89xs86KSxP0k8cJI4n6SuJ8k7icJAEm8MJL4j2CbfyvbANjmRWEb29zPNgC2sY1tbGOb+9kGwDYAtvnXsM2/hyT+JbZ5INsA2OaBbHM/2wAcHh4yTRPv8A7v8NK/8Au/8DVcddVVV1111VVXXfXvRTl+/DhXXXXVVVddddV/rLNnz976Sq/0Sm998803P3h3d5f77ruPzMQ2trGNbWxjGwDb2MY2tgGwjW1sA2Ab2wDYxjYAtgGwjW0AbANgG9sA2AbANvezDYBtnpttnptt/rUkcT9JPDdJ3E8S95MEgCTuJwkASQBI4rlJ4rnZ5oEk8d/BNvezzf1scz/b2OaBbGMbANvYBsA2/xLbPD+2+ZdI4t/DNg9km/vZBsA2ALYB2N/f5zVe4zWOHx0dPePWW2/9a6666qqrrrrqqquu+vegHD9+nKuuuuqqq6666j/efffd94zXeZ3Xee9rrrmGP/uzP8M2trGNbWxjG9vYxja2sY1tbGMb2wDYxjYAtgGwjW0AbANgGwDbANgGwDYAtrENgG0AbANgGwDbPDfb/GtI4rlJ4n6SeG6SuJ8knpskACTx/Eji30ISz49tHkgSDySJfy3bANjmfrZ5INsA2MY2trENgG1sA2AbANs8P7Z5INvczzb/HpJ4QWzz3GxzP9sA2OaBbGObw8ND9vb2eId3eIeX/oVf+IWv4aqrrrrqqquuuuqqfw/K8ePHueqqq6666qqr/uOdPXv21rNnzz7jNV/zNd/6Gc94Bru7u9jGNraxjW1sYxvb2MY2trGNbQBsYxvb2MY2trENgG0AbHM/2wDYBsA2ALYBsA2AbQBsA2AbANsA2OYFsc2/hSTuJwkASdxPEveTBIAknpskACTx3CTx72Gb/2i2eX5sYxsA29zPNra5n21sA2Ab29zPNi+Mbe5nm/vZ5kUhiX8L29zPNvezzQPZBsA2AHt7e7zd273d8X/4h3/4nbNnz97KVVddddVVV1111VX/VpTjx49z1VVXXXXVVVf95zg6Otp9yEMe8tIv93Iv9+AnPvGJLJdLbGMb29jGNraxjW0AbGMb29gGwDa2sQ2AbWxjG9vYBsA2tgGwDYBt7mcbANvczzYAtgGwDYBtAGwDYBsA27yoJPGCSOK5SeJ+kgCQxP0kASAJAEkASAJAEv8ekgCQxHOzDYAknpskHsg2/xLb2OZ+trmfbQBsA2Ab2wDYxjYAtgGwzYvCNvezzX8V2wDY5vmxjW1sY5vDw0Puuusu3uzN3uzBv/Vbv/U9XHXVVVddddVVV131b0U5fvw4V1111VVXXXXVf47Dw8Pdf/iHf/idxzzmMS/96q/+6g8+c+YM11xzDfv7+7/91Kc+9btXq9WtR0dHf310dPTX0zTtrtfrWzMTScdtYxvb2MY2tgGwDYBtbANgG9vYxja2AbDN/WxzP9vczzYAtrmfbQBsA2Cb/yySeG6SAJDE/SQBIIkXhSReGNvcTxIvjG2eH0m8ILb517CNbWxzP9sA2MY2ALYBsI1t7meb52ab58c2D2SbF4Uk/jVs86KwjW3uZ5v9/X3e8z3f88H/8A//8Dtnz569lauuuuqqq6666qqr/i3Qgx70IK666qqrrrrqqv9c11xzzYNf7MVe7LXPnDnzoLNnzz7jt37rt76bf0Gt9cFd1z247/sHS2Jzc/O1+r5/8Pb29msDSAJAEgCSAJDE/SQhCUlIQhKSAJCEJCQBIAlJAEhCEgCSAJCEJAAkASAJAEkASEISAJIAkASAJO4nCQBJAEgCQBIAkrifJAAkASCJ+0kCQBIAkgCQBIAkACQhCQBJSEISAJKQhCQkERFIQhIRgSQiAklEBBFBRBARRAQRQUQQEUQEEUFEEBFEBBGBJCQhCUlI4n62AchMbGObzCQzyUxaa2QmrTUyk9YarTUyk9YamUlrjcyktUZmkplkJplJZmKbzCQzsU1mYhvbZCa2sY1tbJOZ2MY2tgGwjW1sYxvb2MY2trGNbWxjG9vYxja2yUxsY5vMxDaZSWaSmbTWyExaa0zTxDiOrFYr3ud93oczZ8789md+5me+DlddddVVV1111VVX/VugBz3oQVx11VVXXXXVVf+71FofXGt98Gw2e/DW1tZr9X3/4K2trdeWhCQkASAJAElIQhKSkIQkJAEgCUlIAkASkpAEgCQkASAJAElIAkASAJIAkASAJCQBIAkASQBI4n6SAJAEgCQAJAEgiftJAkASAJIAkASAJAAkASAJAEkASEISkgCQhCQkIQlJSCIikIQkIgJJRAQRQUQQEUiilEJEEBFEBBFBRBARRASSiAgkEREASEISALYBsI1tbJOZZCaZSWaSmbTWyExaa7TWyExaa2QmrTUyk8yktUZmkplkJplJZmKbzMQ2mYltMhPb2MY2mYltbGMb29jGNraxjW1sYxsA29jGNraxjW1sk5nYxja2sU1mYpvMxDaZSWbSWiMzaa0xTRPTNDEMA1tbW3zap33arV//9V//Pv/wD//w21x11VVXXXXVVVdd9a9FOX78OFddddVVV1111f8umbk7TdOt6/X6r/f3939md3f3ey5cuPA9BwcHfzNN0+40Tbtd1z3YNgC2sY1tMhMA29jmudnmgWzzQLa5n20AbPOC2OaFkQSAJAAk8YJIAkASAJJ4UUgCQBL/WpIAkMQD2ebfwza2eX5s80C2uZ9tAGxjGwDb3M82L4xtAGxzP9s8N9s8N0n8W9nmfrYBsI1tbHM/2wDYxjYHBwe8zMu8zPFrrrmGP/3TP/0Zrrrqqquuuuqqq67616IcP36cq6666qqrrrrqf7/M3B2G4a/39/d/Znd393suXLjwPYeHh38zTdPuxsbGS2cmtgGwTWZiGwDb2MY2z49tHsg297PN/WzzH0USAJIAkASAJJ6bJAAkASAJAEk8N0ncTxIvCkn8V7CNbe5nG9vczzb3sw2AbWxzP9s8P7Z5fmxzP9v8Z7MNgG2eH9vYBsA2mcndd9/Nm77pmx7/hV/4ha/hqquuuuqqq6666qp/Lcrx48e56qqrrrrqqqv+78nM3fV6/df7+/s/c++9937OhQsXvmccx13b1FofzDNlJrYBsI1tbPNAtnl+bHM/29zPNs/NNv+RJAEgCQBJAEgCQBIAkgCQxPMjiReFJB5IEi8q2/xb2OaBbANgm/vZBsA2ALZ5QWwDYBsA29zPNs/NNi+MJF5UtrmfbQBs89xsA2Ab29jm3nvv5aVf+qWPS3rGrbfe+tdcddVVV1111VVXXfWvQTl+/DhXXXXVVVddddX/fZm5e3R09Du7u7vfc+HChe8Zx3G37/sHSzpuG9sA2MY2ALaxzQtjmweyzf1s828hCQBJAEgCQBIAkgCQBIAkXhSSAJDEv5UkXhjbvCC2+ZfY5n62AbCNbe5nGwDb3M82ALZ5Udjmfra5n23+M9nmgWzzQLa5n21sk5m01niHd3iHl/6FX/iFr+Gqq6666qqrrrrqqn8NyvHjx7nqqquuuuqqq/5/yczdo6Oj3zl//vzX7O/v/45tZrPZS9sGwDa2AbDNi8I2LwrbvCCS+PeQBIAkACQBIInnJon7SeJfQxIAkvi3kgSAbZ6bbWxzP9vYxja2uZ9t7mcbANu8MLZ5INvczzYPZJt/DUk8N9s8P7a5n23uZxsA29jGNrbZ39/n7d/+7Y//wz/8w++cPXv2Vq666qqrrrrqqquuelFRjh8/zlVXXXXVVVdd9f/XNE237u/v/8zFixe/ZxiGXdt0Xfdg29jmfraxzYvCNg9km38vSQBIAkASAJIAkASAJAAkASAJAEkASOJ+krifJP41JAEgif9stnlutrmfbe5nm3+JbQBsA2CbB7LNfwbbPJBt7mcb29zPNgC2yUz29/c5ceIED3nIQ/jTP/3Tn+Gqq6666qqrrrrqqhcV5fjx41x11VVXXXXVVVdl5u5yufydS5cufc/e3t7v2GY+n7+0bWwDYBsA27yobHM/2zw/knhukgCQxL+WJB5IEgCSAJDE/SRxP0n8a0gCQBL3k8S/RBL/EtvczzYAtrGNbR7INvezzQPZxjYvCts8N9v8R7PN/Wzz/NjGNrYBsM3e3h5v+qZvevwXfuEXvoarrrrqqquuuuqqq15UlOPHj3PVVVddddVVV131QNM03XpwcPAzFy9e/J5pmnYXi8Vr28Y2ALYBsM2/lW3uZ5sXhSQAJAEgCQBJAEjigSTx3CQBIIn/CJIAkMT9JPGikgSAbZ6bbWxzP9s8N9vczzYPZJv72cY297MNgG0AbHM/27wwtnl+JPGC2Oa52QbANra5n20AbAOQmdjm3nvv5aVf+qWPS3rGrbfe+tdcddVVV1111VVXXfWioBw/fpyrrrrqqquuuuqq5yczd4+Ojn7n4sWL3zOO4+7GxsZr28Y2ALb5ryCJF0QSAJIAkASAJAAkASCJ5yYJAEncTxL/WpIAkMT9JPEvkcS/lm1sYxvbPJBt7meb58c297MNgG3uZ5sHss1/NNvczzb3s41t7mcb29jGNq01Wmu8zuu8zvHf+q3f+h6uuuqqq6666qqrrnpRUI4fP85VV1111VVXXXXVC5OZu8vl8ncuXrz4PeM47m5sbLx2ZvJAtrmfJF4Q2/xHkMQLIgkASQBIAkASAJK4nyQAJHE/SfxrSQJAEveTxL+XbR7INrZ5INvY5oFs84LY5n62uZ9t7meb58c2/1FsA2Cb58c2tgGwjW0ODg54z/d8zwf/wz/8w++cPXv2Vq666qqrrrrqqquu+pdQjh8/zlVXXXXVVVddddWLIjN3l8vl71y8ePF7pmna3djYeG3b2EYStgGwzX8WSTw3SQBI4gWRBIAkACTx3CRxP0n8a0kCQBL3k8T9JHE/SQBI4l9iG9vY5n62sY1tnptt/iW2eSDbANjmgWzzorKNJF4Q2zw32wDY5rnZxja2sU1mcnBwwCMf+UiAW//hH/7hd7jqqquuuuqqq6666l9COX78OFddddVVV1111VX/Gpm5u1wuf+fixYvf0/f9S9daH2ybB7LNA0niudnmhZHE/STx3CTx3CQBIAkASTw3SQBIAkAS95PE/STxryUJAEncTxL3k8R/BNvY5oFsY5vnZhvb2OaBbANgGwDb3M82z802/xFs80C2AbCNbWxjGwDb2MY2tslM7rnnHt7hHd7hwb/wC7/wNVx11VVXXXXVVVdd9S+hHD9+nKuuuuqqq6666qp/i8zcvXTp0vcsl8tnzGazl5Z0nAewzX8GSTw3STw3SQBIAkASz00SAJK4nyTuJ4l/DUncTxL3k8RzkwSAJP61bANgG9vY5rnZxjYPZBvb3M82ALYBsM0D2eZFYZt/LdvczzbPj21sA2Ab29jm7d7u7Y7/wz/8w++cPXv2Vq666qqrrrrqqquuemEox48f56qrrrrqqquuuurfYxiGv97f3/+ZcRx3NzY2Xts2AJJ4fiTx/NjmX0sS95MEgCSemyQAJAEgiftJAkAS95PE/SQhiReVJO4niftJAkAS95PECyMJ2wDY5n62AbCNbR7INrZ5YWxzP9sA2OZ+tnlutvn3sM3zYxsA2zw329jGNrbJTPb39zlx4gQPechD+NM//dOf4aqrrrrqqquuuuqqF4Zy/Phxrrrqqquuuuqqq/69MnN3uVz+zu7u7vfMZrOXrrU+GMA2krDNv5ck7ieJ+0niuUkCQBL3kwSAJAAkcT9JAEjifpJ4IEm8qCQBIAkASQBIAkASDySJF8Y2ALaxzf1sA2Ab29jmRWWb+9nmfra5n21eENv8W9nmgWwDYBvb2MY2ALaxjW1sk5ns7e3xpm/6psd/4Rd+4Wu46qqrrrrqqquuuuqFoRw/fpyrrrrqqquuuuqq/yiZuXtwcPA70zTtLhaL1+aZJPHcJPEfTRL3kwSAJJ6bJAAkcT9JAEjifpJ4IEm8KCRxP0kASAJAEgCSAJDE/STxgtjm+bGNbZ6bbWxjG9vYxja2uZ9t7meb+9nmgWzzr2GbF4Vt7meb58c2tgGwjW3uu+8+XuqlXur4uXPnfufs2bO3ctVVV1111VVXXXXVC0I5fvw4V1111VVXXXXVVf+RbO8ul8vfuXjx4vdsbm6+dUQc50UgiQeyzQsjiftJ4n6SeG6SAJDE/SQBIIn7SQJAEveTxANJQhL/EkncTxIAkgCQBIAkACTxorDNc7MNgG1sYxvbvDC2sQ2AbR7INvezzXOzzb+WbV4Q29zPNra5n20AbGMb22QmmcnJkyd58Rd/cf70T//0Z7jqqquuuuqqq6666gWhHD9+nKuuuuqqq6666qr/DLZ39/b2fmaapt3FYvHavACSeFFJ4gWRxHOTxP0kASCJ+0kCQBL3kwSAJCQBIAlJPJAkXhhJ3E8S95MEgCQAJAEgiedmm+dmmweyDYBtbGObF5VtAGwDYBsA2zyQbV4UtnlR2OaBbPNAtrHN/WxjG9vYJjO59957efu3f/vjv/ALv/A1XHXVVVddddVVV131glCOHz/OVVddddVVV1111X8W27vL5fJ3dnd3v2exWLx1RByXxPMjiX8tSTw/krifJO4nCQBJ3E8SAJK4nyTuJ4n7SeKBJCGJ5yaJ5yYJAEkASOJ+kgCQxIvCNraxzf1scz/b2MY2trGNbWxjG9vczzYAtgGwzf1s80C2+deyzQtim/vZBsA2D2QbANvYxjaZycHBAS/1Ui91/Ny5c79z9uzZW7nqqquuuuqqq6666vmhHD9+nKuuuuqqq6666qr/bJm5u7+//zOSjs9ms5eWhCSeH0n8a0jifpK4nyTuJ4nnJon7SQJAEveTxP0kcT9JPDdJSEISknh+JHE/SQBIAkAS/xJJANjm+bENgG1s8y+xzf1sA2AbANvczzYviG3+NWzz/NgGwDYAtrGNbe5nG9vYxjaZyYkTJ3jxF39x/vRP//RnuOqqq6666qqrrrrq+aEcP36cq6666qqrrrrqqv8KtndXq9XfjOO4u1gsXpvnQxIPJIl/LUncTxL3kwSAJO4niftJAkAS95PE/SRxP0lI4l9LEgCSuJ8kACTxorLN82Ob+9nGNraxjW1s80C2sQ2AbQBsA2CbB7LNv4Ztnh/bPD+2AbDNc7MNgG0AMpPMJDN50zd90+O/8Au/8DVcddVVV1111VVXXfX8UI4fP85VV1111VVXXXXVfxXbu6vV6neWy+Uztra23ppnksQDSeKBJPHCSOKBJHE/SdxPEgCSuJ8k7icJAEncTxL3k8QDSeJfQxL3kwSAJO4niReVbZ6bbQBsYxvbPDfb2MY297MNgG0AbHM/2zw32/xr2ea52eaBbANgG9vYxjYAtrGNbWyTmWQmb//2b3/8H/7hH37n7Nmzt3LVVVddddVVV1111XOjHD9+nKuuuuqqq6666qr/auM4/vXu7u73bGxsvHWt9TiAJJ6bJF5UknhBJHE/SQBI4n6SuJ8kACQhCQBJ3E8SkrifJCTxopDE/SRxP0ncTxIvKts8kG0AbHM/29jGNrZ5INvYBsA2ALYBsM39bPPC2OZFZZsHss0D2eb5sY1tbGObzOTg4IBHPvKRALf+wz/8w+9w1VVXXXXVVVddddVzI7jqqquuuuqqq676b9Jau/W22257ncPDw1unaWKaJlprZCaZiW0yE9vYxja2sY1tbGMb29jGNraxjW0AbGMb2wDYxjYAtgGwjW0AbGMbANvYBsA297ONbQBsYxvbPJBtbGMb29gGwDa2sU1mYhvbZCa2sU1mYhvb2MY2trGNbe5nGwDbPDdJPJAkJCGJB5KEJAAkASAJAEncTxKSeEEkIQlJSEISkpDEc5OEJO4nCUn8SyQhCUlIIiKQxI//+I/zOq/zOu/NVVddddVVV1111VXPD8FVV1111VVXXXXVf6PW2q23337769x9992fPU0TrTUyk8wkM7FNZmIb29jGNraxjW1sYxvbANjGNrYBsI1tbANgG9sA2OZ+tgGwjW0AbGMbANvYBsA2trmfbWxjG9s8P7axjW1sYxvb2MY2trGNbTIT29jGNraxDYBtbPNAtrHN8yOJB5KEJCRxP0kASAJAEgCSkMT9JCEJSbyoJCEJSTyQJB5IEgCSAJCEJCQhCUlIQhKSkEREcOHCBa655poHX3PNNQ/mqquuuuqqq6666qrnRjl+/DhXXXXVVVddddVV/51s747j+IxxHHc3NjZeWxIAkgCQBIAkXhSSeCBJPJAk7ieJ+0kCQBKSAJDE/SRxP0lI4n6SkMS/liTuJ4kHksS/h20AbGOb+9nGNra5n20AbANgGwDb3M82/xLbSMI2L4xtHsg297MNgG1sA2Ab2wDYxja2aa1xcHDAIx/5SG699dafOXv27K1cddVVV1111VVXXfVAlOPHj3PVVVddddVVV13138327mq1+p1pmtjY2HhtSQBI4rlJ4l8iiQeShCTuJ4n7SeJ+krifJAAkIQkASUjifpJ4IElI4kUhiecmiQeSxPMjifvZ5vmxDYBtAGxjG9vczza2AbANgG1scz/bPJBt/i1s89xscz/b3M8297PN/WxjG9vYJjOxzYkTJ3jd133dB//Wb/3W93DVVVddddVVV1111QMRXHXVVVddddVVV/0Psru7+zn33HPPZ0/TRGuN1hqZiW0yE9tkJraxjW1sYxvb2MY2trmfbWxjGwDb2AbANrYBsI1tAGxjGwDb2AbANrYBsI1t7mcb29jmfraxjW1sYxvb2MY2trGNbWxjG9vYxjaZiW1sYxvb2MY2trENgG2emyQAJHE/SUjifpKQBIAk7ieJ+0lCEveThCQk8a8hCUk8kCTuJ4l/iSQkIQlJRASS+L3f+z3OnDnzYK666qqrrrrqqquuem6U48ePc9VVV1111VVXXfU/yWq1+p1xHNnc3HxtSQBIQhIAkgCQxItCEg8kiftJ4n6SuJ8k7ieJ+0nifpKQxP0kIYkHkoQkJCEJSUhCEs9NEs+PJCRxP0k8P7Z5brYBsA2AbWxjGwDb2AbANrYBsM39bHM/2/xLbCMJ27wwtnkg2wDYBsA2z49tbGObzMQ2h4eHvNEbvdHxW2+99XfOnj17K1ddddVVV1111VVX3Y9y/Phxrrrqqquuuuqqq/6nWa/XvzOOI5ubm68tCQBJSAJAEpJ4UUnigSRxP0lIAkASkgCQhCQAJCEJAElI4n6SeCBJSOJfSxLPjySeH0k8N9s8kG0AbANgG9sA2MY2ALaxDYBtAGxzP9s8kG3+LWzz3GxzP9sA2AbANraxjW1sA2Ab29gmM8lMXuZlXgZJt/7DP/zD73DVVVddddVVV1111f0ox48f56qrrrrqqquuuup/ovV6/TvTNLGxsfHakgCQhCQkASCJF5UkJHE/STyQJO4niftJ4n6SuJ8k7icJSTyQJCTxopDE8yOJ+0nifpJ4QWxzP9vczza2AbCNbQBsYxsA2wDYBsA297PNc7PNv4VtHsg297ONbQBs89xsYxvb2CYzsc3dd9/N67zO6/Bbv/Vb38NVV1111VVXXXXVVfejctVVV1111VVXXfU/2O7u7ucAXHfddZ/Nc4kIMpOI4IEkcT/bPDdJ2AZAEgC2AZCEbQAkYRsASdgGQBIAtpEEgG0AJAFgm/tJ4l9im+fHNg8kCdvcTxL3s839bGOb5yYJ2wBIwjYAkrCNJGwjCdtIwjYAkrDNA0niudnmXyIJANsASMI2AJKQhG0kYZsHkoQkJCGJiEASFy5c4MyZMw/mqquuuuqqq6666qoHonLVVVddddVVV/2/8Dqv8zrvfebMmQfxv5DtB587d+7We+6558GSkMT9IoLMJCK4n23uJwkA2zyQJGxzP0nYBkASALaRBIBtJAFgGwBJ2AZAEgC2AZAEgG3+rSRhmxdEErb5t5CEbSQhCdtIwjbPTRK2AZAEgG1eEEm8ILZ5IEkA2EYStrmfJGwDIAlJSAJAEpKQhCQigvPnz3P33Xc/+MM//MO/67777ruVq16of/iHf/idf/iHf/htrrrqqquuuuqq/+uoXHXVVVddddVV/+d9+Id/+He92Iu92Gtfc801D+Z/qfPnz/NjP/Zj3HHHHTy3iMA297PNc5MEgG3uJwkA2wBIAsA2AJKwDYAkbAMgCdsASALANgCSALANgCTuZ5sXhSQAbPP8SMI295MEgG1eGEnYRhK2eSBJ2AZAEraRhG0AJGGb+0kCwDb/GpK4n23uJwnbSAJAErYBkIRt7ieJ+0lCEpKICCKC13md13lvrvoX3XfffbeePXv21s/8zM98Ha666qqrrrrqqv/LqFx11VVXXXXVVf+nXXPNNQ9+ndd5nfcG+IIv+AL+Nzt37hxd1yEJSQBIIjMBiAgAbPOCSALANveTBIBtACRhGwBJ2AZAEgC2kQSAbQAkYZv7SQLANveTxHOzjSQeyDb/EknYRhK2eSDbvCgkYRtJ2AZAEraRhG0kYRsASQDY5n6SeCDbvKgkAWAbAEnY5n6SkIRtACQhCQBJSEISkpBERPA7v/M73HjjjXzjN34j/xq2+d/MNv9an/mZn/nga6655sEv9mIv9tr/8A//8NtcddVVV1111VX/V1G56qqrrrrqqqv+T3vHd3zHzwL4sz/7My5evMj/ZqUUWmu01pAEgCQiAtvYBiAziQheGEkA2OZ+krANgCQAbCMJANsASMI2AJIAsI0kAGxzP0kA2Ob5kYRt/iNIwjb/VpKwjSRsIwnbSMI295OEbZ4fSbwwtnlukrANgCRsIwnbSEISkrANgCQAJAEgCUlI4olPfCIAFy5c4D+Tbf43ss39/vRP/5RXfMVX5HVe53Xe6x/+4R9+m6uuuuqqq6666v8qgquuuuqqq6666v+013md13lvgD//8z/n/wJJHB0dMY4jrTVaa2QmmUlmYhvb2MY2trGNbWxjG9vYxjb3s41t7mcb2wDYxjb3s839bGMbANvY5n62sY1tHsg2trGNbWxjG9vYxja2sY1tHsg2trENgG3uZ5v72eaFkQSAJAAk8cJI4oEkIYl/LUlIQhIPJAlJAEgCQBIviCQAJCEJSUji/PnznDx5koc97GH8Z5KEJCQhCUlIQhKSkIQkJPE/iSQkIYlf+ZVfAeDFXuzFXpurrrrqqquuuur/MoKrrrrqqquuuur/rNd5ndd5b4CnPvWpPPWpT+X/ilor6/Wa1hqZSWaSmdgmM7GNbWxjG9s8kG1sYxvb2AbANraxDYBtbHM/29gGwDa2uZ9t7mcb2zyQbWxjm38t29jGNvezjW0AbGMbANvYBsA2z00SL4wkACQBIIn7SeK5SUIS/xaSkMQDSQJAEgCSkIQkJCEJSQBIQhKSkIQkJPG3f/u3/E8iCUlIQhKSkIQkJCEJSUjiv9KFCxd4ylOewjXXXPPg13md13lvrrrqqquuuuqq/6sIrrrqqquuuuqq/7Ne53Ve570A/uzP/oz/a2yzXq+ZponMxDaZiW1sk5nYxja2sY1tbPNAtrGNbe5nG9vczza2uZ9t7mcb29zPNvezjW1scz/b2MY2trGNbWxjG9vYxja2sY1tbGMb29gGwDa2sQ2Abf41JAEgCQBJPJAkACRxP0lI4rlJQhKSkIQkXlSSkMT9JAEgiRdEEveThCQkERE87nGP4+EPfziSkIQkJCEJSfxPJglJSEISkpCEJCQhCUn8R/mVX/kVAN7xHd/xs7jqqquuuuqqq/6vIrjqqquuuuqqq/5PerEXe7HXfrEXe7HXBviLv/gLJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJP61SilkJuM40lqjtUZmkplkJraxjW0AbGMb29jGNra5n21sY5v72cY297ONbQBsY5v72cY2ALaxzQPZxjbPzTa2sY1tbGMb29jGNraxjW1sYxvbANgGwDYPZBsA2/xrSeK5SeKBJPEvkYQkJCEJSUhCEs+PJJ4fSUhCEpK4nyQkIQlJSEISj3/843n4wx/OCyIJSUhCEpKQhCQkIQlJSEIS/xNJQhKSkIQkJCEJSUhCEv+SCxcucOHCBa655poHv9iLvdhrc9VVV1111VVX/V9EcNVVV1111VVX/Z/0Oq/zOu8F8Od//uf8byAJSUhCEpKQhCQkIQlJSEISkiilME0T0zSRmWQmtrGNbWxjG9vYxja2sY1tbGMb2zyQbWxzP9vY5n62uZ9tbHM/29zPNraxzf1sYxvb2Obfyja2AbANgG1sY5sHss2/RBIAkgCQBIAk7ieJB5KEJP4tJCEJSTyQJAAkASCJ5yYJSTyQJCQhiQsXLnDixAn+o0hCEpKQhCQkIQlJSEISkpDE/ySSkIQkJCEJSUhCEhcvXuRP//RPAXind3qnz+Kqq6666qqrrvq/iOCqq6666qqrrvo/6XVe53XeG+BXf/VX+b+slMIwDEzTRGaSmWQmtslMbGMb29jGNs/NNraxjW3uZxvb3M82tgGwjW3uZxvb3M82D2Qb2zw329jGNraxjW1sYxvb2MY2trGNbQBsYxsA29jmgWzzL5HEv0QS95PEc5OEJP6tJPFAkgCQBIAkJCEJSUgCQBKSkIQkJCGJ8+fPM44jD3vYw/jvIAlJSEISkpCEJCQhCUn8T/Hnf/7nAJw5c+bB11xzzYO56qqrrrrqqqv+ryG46qqrrrrqqqv+z3nHd3zHzwL48z//cy5evMj/dbYZx5HWGpmJbTIT29gmM7GNbQBsYxvb2OaBbGMb29zPNra5n23uZxvb3M82trmfbWxzP9vYxja2+ZfYxja2sY1tbGOb+9nmfraxjW0eyDb3k8TzIwkASQBI4vmRxPMjCUlIQhKSkIQkJCGJF0QSkrifJAAk8fxI4oEkIQlJSOLee+9FEpL4n0oSkpCEJCQhCUlIQhKSkMR/pgsXLvCUpzyFa6655sGv/dqv/V5cddVVV1111VX/1xBcddVVV1111VX/57zO67zOewP8+Z//OZKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJP6zlFKwzTiOtNbITDIT29jGNraxjW1sYxvb2MY2trHN/WxjG9vczza2AbCNbe5nG9vczza2uZ9tbPPcbGMb29jGNraxjW1eENvYxjYAtrHNc7PN/Wzz/EjiBZEEgCQeSBKS+NeShCQkIYnnJon7SeJ+kpCEJCQBIAlJSAJAEpKICP7hH/6Bhz3sYQBIQhKSkIQkJCEJSUhCEpKQxP9EkpCEJCQhCUlIQhKS+Pf4lV/5FQBe53Ve57256qqrrrrqqqv+ryG46qqrrrrqqqv+T3md13md977mmmsefPHiRZ72tKfxP4kkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSiAimaaK1RmsN22QmmYltbGMb29jGNraxDYBtbGMb2zyQbWxzP9vczza2uZ9tbHM/29jmgWxjG9s8P7axjW1sYxvb2MY2trmfbWxzP9vYxja2eW62sc2/RBLPTRLPTRL/HpKQxANJ4oEk8dwk8UCSkIQkJPGEJzyBhz3sYfxbSEISkpCEJCQhCUlIQhKSkMT/FJKQhCQkIQlJSEISkpDE8/PUpz6VpzzlKVxzzTUPfrEXe7HX5qqrrrrqqquu+r+E4Kqrrrrqqquu+j/ldV7ndd4L4Nd+7df4/2gcR1prtNawjW1sYxvb2MY2D2Sb52Yb29jmfraxzf1scz/b2OZ+trHN/WxjG9s8kG1sYxvb2OZfYhvb2AbANraxzfNjmxeVJJ6bJO4niecmCUlI4t9KEpK4nyQAJAEgCUlIQhIAkpCEJB5IEufPn+fEiRP8V5CEJCQhCUlIQhKSkIQk/qeQhCQkIQlJSOLP//zPAXind3qnz+Kqq6666qqrrvq/hOCqq6666qqrrvo/45prrnnwi73Yi702wJ//+Z/z/00phdYarTUyk8wkM7GNbWxjG9vYxja2sY1tbGMb29zPNraxzf1sY5v72eZ+trHNA9nmgWxjG9s8P7axjW1sYxvb2MY2D2SbB7LNA9nmRSGJ5yaJ+0nifpJ4QSQhCUlIQhL3k8S/RBL3kwSAJJ6bJAAkASAJSUhCEhcvXuTkyZP8TyIJSUhCEpKQhCQkIQlJ/Hd56lOfCsCLvdiLvfaLvdiLvTZXXXXVVVddddX/FQRXXXXVVVddddX/Ge/4ju/4WQB/8Rd/gSQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIYn/SWqtjONIa43MxDaZSWZiG9vYxja2sY1tHsg2trHNA9nGNvezjW3uZ5sHso1t7mcb2zyQbWxjG9vY5oWxjW1sYxsA29jmfraxjW3uZ5sXlST+JZKQxItCEpIAkIQkJCEJSTw3STw/kpCEJCQhCQBJSEISkpCEbf7mb/6Ghz/84UhCEpKQhCT+J5OEJCQhCUlIQhKSkIQk/qNduHCBP/uzPwPgdV7ndd6Lq6666qqrrrrq/woqV1111VVXXXXV/xmv8zqv894Av/Zrv8Z/JUn8TxIRtNaICCQhCdvYxjaSsA2AJABscz9J3M8295MEgG0AJAFgGwBJANgGQBIAtgGQxP1sAyCJ52abF0QS97MNgCQAbAMgiX8LSdjmgSRhGwBJ2OaBJGGbfw9JANjmfpKwjSRsIwnbPJAkJCGJ+0kCQBKSOHHiBM+PJF5UtvmfSBIvCtu8qH71V3+VV3iFV+DFX/zFX4errrrqqquuuur/CoKrrrrqqquuuur/hNd5ndd5b4CnPe1pXLx4kf/PIoJxHGmtkZlkJraxjW1sYxsA29jGNraxjW1sY5sHso1tHsg297ONbe5nG9vczza2sc0D2cY2trHNC2Mb29jmfraxzf1s80C2+deSxP0kcT9JPDdJSOLfSxIPJAkASdxPEpKQBIAkJCEJSQBIIiL4h3/4B06cOMG/lyQkIQlJSEISkpCEJCQhif+JJCEJSUhCEpKQhCQkcb8LFy7w1Kc+lTNnzjzodV7ndd6bq6666qqrrrrq/wKCq6666qqrrrrq/4R3fMd3/CyAP//zP+cqiAimaaK1RmaSmdjGNraxjW1sY5sXxDa2sc0D2cY297PNA9nmgWzzQLaxjW2eH9vYxja2sY1tHsg2trmfbe5nG9vY5n62+Y8giedHEpKQxL+VJJ4fSUjigSRxP0lIQhKSkMTjH/94Hvawh/FfSRKSkIQkJCEJSUhCEpL4n0YSkpDEr/7qrwLwju/4jp/FVVddddVVV131fwHBVVddddVVV131v96LvdiLvfY111zzYIC//Mu/RBKSkIQkJCEJSUhCEpKQhCQk8X9NKYXMpLVGZmKbzMQ2trGNbWwDYBvb2MY2trHNc7ONbe5nG9vczza2uZ9tbHM/29jmudnGNraxzQtjG9s8kG0AbPPvIYn7SeJ+knggSbwwkpCEJCQhCUlIQhKSkMTzI4n7SeK5SeJ+kpDE/SRxv4jg5MmTSOJ/GklIQhKSkIQkJCEJSUjiv8OFCxe4cOEC11xzzYNf7MVe7LW56qqrrrrqqqv+tyO46qqrrrrqqqv+13ud13md9wL49V//df6tJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEhFBa43MJDOxTWZiG9vYBsA2trHNc7ONbWxjm/vZxjb3s41t7mcb2zyQbR7INraxzfNjG9vYxja2sc0D2cY2ALYBsI1tHsg2ALb5jyKJfy9JSEISDySJ+0kCQBKSAJCEJO4nCUkASEIS58+f536SkIQkJCEJSUhCEpKQhCT+J5GEJCQhCUlIQhKSkIQk/iNdvHiRP//zPwfgnd7pnT6Lq6666qqrrrrqfzuCq6666qqrrrrqf73XeZ3XeW+Av/iLv+CqZyulYJvWGplJZmKbzMQ2trGNbe5nG9vYxjbPzTa2eSDbPJBtHsg2trmfbWzz3GxjG9vY5gWxjW1scz/bANjmfraxjW3+NSRxP0ncTxLPTRL/USTxQJL4l0hCEpKQhCQAJHHu3DlOnDjBiRMn+NeQhCQkIQlJSEISkpCEJCTxP4UkJCEJSUhCEpKQhCT+Nf7sz/4MgDNnzjz4mmuueTBXXXXVVVddddX/ZgRXXXXVVVddddX/au/4ju/4WQB/8Rd/wcWLF7nqOUmitUZrDdvYxja2sY1tbGMb29jGNvezjW1sY5sHso1t7mcb29zPNrZ5INs8kG1sY5sXxDa2sY1tHsg2tnkg2/xnkcRzk4Qk/iNIQhL3kwSAJO4nCUlI4oEkIQlJSEISf/M3f8OJEyf4zyIJSUhCEpKQhCQkIQlJ/E8gCUlIQhKSkIQkJCGJ+128eJGnPvWpXHPNNQ9+7dd+7ffiqquuuuqqq67634zgqquuuuqqq676X+11Xud13hvgL/7iL7jqeZVSGMeRzCQzyUxsYxvb2AbANra5n21s8/zYxjYPZJsHss0D2cY297ONbZ4f29jGNrZ5QWxzP9vY5n62eW62AbDNv4YkHkgSz48kJCGJfy9J3E8SAJKQxANJQhKSAJDE/SQhif8JJCEJSUhCEpKQhCQkIYn/bpKQhCR+7dd+DYDXeZ3XeW+uuuqqq6666qr/zQiuuuqqq6666qr/tV7ndV7nva+55poHP+1pT+PpT386kpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpJ4frquY5omWmvYxja2sY1tbGMbANvYxja2sY1tbGMb2zyQbWxzP9vY5n62sc0D2ea52cY2tnlBbGMb29jmfra5n23uZ5v72eZfQxIvjCReGElIQhKSkIQkJCEJSUhCEi+IJF5UkpCEJCQhCUn83d/9HQ972MOQhCQkIQlJSEIS/5NIQhKSkIQkJCEJSUjiv8pTn/pUnvrUp3LNNdc8+MVe7MVem6uuuuqqq6666n8rgquuuuqqq6666n+t13md13kvgL/8y7/kqiskIQlJSEIStVZaa2QmmUlmYhvb2MY2ALaxzYvCNrZ5INs8kG0eyDa2eSDb2Ob5sY1tbGOb58c297MNgG3uZxvb/HtJ4rlJ4j+CJCQhiRdEEveThCQkASAJAEkASAJAEqUU/iWSkIQkJCEJSUhCEpKQhCT+J5CEJCQhCUlIQhKSkIQk/iP8+Z//OQDv9E7v9FlcddVVV1111VX/WxFcddVVV1111VX/K73Yi73Ya7/Yi73YawP8xV/8BVe9cBFBa43MxDa2sY1tbGMb2wDYxja2sQ2AbWxjG9s8kG1scz/b2OZ+trHNA9nGNg9kG9vYxjYviG1sY5v72eaBbPP82AbANv8SSTyQJJ6bJP4jSeKBJPFAknggSTyQJCQhCYDHPe5xPOxhD+M/iiQkIQlJSEISkpCEJCTxP4EkJCEJSUhCEpKQxIviqU99KgAv9mIv9tov/uIv/tpcddVVV1111VX/GxFcddVVV1111VX/K73O67zOewH8xV/8BVf9y/q+JzNprZGZZCa2sY1tbANgG9s8kG2eH9vY5oFs80C2eSDb2OaBbGObF8Q2trGNbZ6bbe5nm/vZ5r+CJP4jSeKBJAEgiedHEpKQhCQkIQlJSOK/gyQkIQlJSEISkpCEJCTx30kSkpCEJCQhCUlIQhIXL17kz//8zwF47dd+7ffiqquuuuqqq67634jKVVddddVVV131v9LrvM7rvDfAb/7mbyKJ/29s86/VWqOUQmYSEdjGNraxjW0AJGGb+0nifra5nyTuZxsASdzPNpK4n20kcT/bAEjiudnmfpJ4fmwDIAkA20jCNpIAsI0kAGzz7yUJ2zw3SQDY5j+CJGzz/EhCEpKQxANJQhKSkMT58+c5ceIEkrifbf6nkMS/xDb/XSTxa7/2a7z8y788L/7iL/46XHXVVVddddVV/xsRXHXVVVddddVV/+u8zuu8znsD/OVf/iUXL17k/yNJSEISkpCEJCQhCUlIQhKSkMRsNiMzyUxsYxvbANjGNgC2eSDb2MY2z802tnkg29jmfraxzQPZ5rnZxja2eUFsYxvbPJBtXhDb2ObfQhL/GpKQxL9EEpJ4YSRxP0kASOK5SUISkrifJCTx/EhCEpKQhCQkIQlJSEISkvifQBKSkIQkJCEJSUhCEv+ZLl68yFOf+lTOnDnzoNd5ndd5b6666qqrrrrqqv9tCK666qqrrrrqqv913vEd3/GzAJ72tKdx1YuulEJrjcwkM8lMbGOb+9kGwDa2sc1zs41tbPPcbPNAtnkg29jmgWxjm+fHNraxjW2eH9vczzYAtnlBbANgm38LSfxLJCEJSUhCEpKQhCTuJwlJSEISz00S/xqSkASAJM6fP8+JEyf4t5KEJCQhCUlIQhKSkIQk/rtJQhKSkIQkJCEJSUji3+PXfu3XAHjHd3zHz+Kqq6666qqrrvrfhuCqq6666qqrrvpf5XVe53Xe+5prrnkwwF/+5V9y1b+OJFprZCa2sY1tbGMb29jGNvezjW1sY5vnxza2eSDbPJBtHsg2tnlutrGNbV4Q29jGNvezzQPZ5j+CJJ6bJP4zSOIFkcT9JCEJSQBIQhIAkpCEJADuvfdeTpw4wX8mSUhCEpKQhCQkIQlJSOK/kyQkIQlJSEISkpDEC3Px4kUuXrzINddc8+AXe7EXe22uuuqqq6666qr/TQiuuuqqq6666qr/VV7sxV7stQB+4zd+A0lIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCGJ/wy1VjKTzMQ2trGNbWwDYBsA29jmhbGNbR7INra5n21s80C2eW62sc0LYhvb2Oa52eZ+trmfbR7INv9RJPGfQRIPJIkHksQDSeJ+kgCQhCQignvuuYf/KSQhCUlIQhKSkIQkJPHfRRKSkIQkJCEJSezu7vJrv/ZrALzTO73TZ3HVVVddddVVV/1vQnDVVVddddVVV/2v8jqv8zrvDfBXf/VX/F8nCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkui6DttkJpmJbWxjG9vYBsA297ONbWxjG9vYxjbPzTYPZJsHso1tHsg2tnl+bGMb27wgtrmfbQBscz/b2MY2/1aSeH4k8Z9BEg8kCQBJ/EskASAJSQCcPHkSSUhCEpKQhCQkIQlJ/E8gCUlIQhKSkIQkJCGJ/w5Pe9rTADhz5syDX+zFXuy1ueqqq6666qqr/rcguOqqq6666qqr/td4x3d8x88C+Mu//EsuXrzIVf82tslMbGMb29jGNraxDYBtbPOisI1tHsg2D2Sb52ab52Yb29jmhbGNbe5nm/8OkvjPIIkXRhKSAJCEJO4nCQBJ3HvvvbyoJCEJSUhCEpKQhCQkIYn/bpKQhCQkIQlJSEISkviPdvHiRZ72tKdxzTXXPPh1Xud13ourrrrqqquuuup/C4Krrrrqqquuuup/jdd5ndd5b4C//Mu/5Kp/u4igtUZmkpnYxjYPZJv72cY2z802trHNA9nGNg9kmweyjW0eyDa2eWFsYxvbPJBt7mcbANu8ILYBsM2LShIviCQk8R9NEs+PJO4niftJQhKSkIQkJHHixAn+I0lCEpKQhCQkIQlJSOK/myQkIQlJSEISkpDEv8Wv/dqvAfBiL/Zir81VV1111VVXXfW/BcFVV1111VVXXfW/wuu8zuu89zXXXPPgpz/96dx6661IQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlI4r9LKQXbZCa2sQ2AbWxjGwDb2OZ+trGNbWzz/NjmudnmgWzz3GzzgtjGNrZ5fmzzgtjmv5IkJPGCSEISkpCEJCQhiX+JJAAk8fxI4oEkIYn77ruP/w6SkIQkJCEJSUhCEpKQxH8XSUhCEpKQhCQkIYnn52lPexpPe9rTuOaaax78Yi/2Yq/NVVddddVVV131vwHBVVddddVVV131v8LrvM7rvBfAX/7lX/J/hSQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISs9mMzCQzsY1tbGMb29jGNvezzb/ENrZ5INvY5oFs80C2sc1zs41tbPOC2MY2D2QbANu8ILb5t5LEi0ISkpCEJCQhiRdGEpJ4bpL4l0gCQBKSkASAJCQBIAlJSEIS/1NIQhKSkIQkJCEJSUjiv4MkJCEJSUhCEn/xF38BwDu90zt9FlddddVVV1111f8GBFddddVVV1111f94L/ZiL/baL/ZiL/baAH/1V3/FVf8xMpPMJDOxjW3uZxvb2AbANraxjW0AbGMb2zw32zw32zyQbZ6bbWzzwtjGNs/NNs+PbWzzH0US/5kk8YJI4n6SkMQLIglJRAQnTpzguUlCEpKQhCQkIQlJSEIS/xNIQhKSkIQkJCEJSfxXetrTngbAi73Yi732i7/4i782V1111VVXXXXV/3QEV1111VVXXXXV/3iv8zqv814Af/mXf8lV/zG6rqO1hm1sYxsA29gGwDYAtnlutnlBbPNAtrHNA9nmudnmBbGNbWzz/NjmfrYBsM0D2cY2/xtI4oEk8UCSuJ8kHkgSD3T27Fn+PSQhCUlIQhKSkIQkJCGJ/06SkIQkJCEJSUhCEpL4j3Lx4kX+4i/+AoDXfu3Xfi+uuuqqq6666qr/6Qiuuuqqq6666qr/8V7ndV7nvQF+67d+C0lIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJ/G9Qa8U2mYltbGMb29jGNg9km3+JbWzzQLZ5brZ5brZ5braxjW1eENvY5r+aJP6zSeJfQxKSAJCEJCQhif8KkpCEJCQhCUlIQhKS+O8kCUlIQhKSkIQkJPGv8eu//usAvPiLv/jrcNVVV1111VVX/U9HcNVVV1111VVX/Y/2Oq/zOu8N8Fd/9Vfs7u7yv4EkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJPD9d1wGQmdjGNrZ5INvY5n62sY1tbANgG9vY5rnZ5rnZ5oFsY5vnZpsXxja2eW62eSDbvCC2+feQxH82SdxPEgCSeG6SeH4kIYn/KSQhCUlIQhKSkIQkJPHfRRKSkIQkJCEJSUjigS5evMjTnvY0zpw586DXeZ3XeW+uuuqqq6666qr/yQiuuuqqq6666qr/0d7xHd/xswD+6q/+iqv+bSQhCUlIQhKSaK1hG9vYxja2sY1t7mcb2zw327wgtnlutnkg2zw329jmBbGNbZ4f29zPNi8q2/xbSeJ/GklIQhIAkgCQhCQkIQlJSEISkpCEJP67SUISkpCEJCQhCUlI4r+DJCQhCUn8xm/8BgDv+I7v+FlcddVVV1111VX/kxFcddVVV1111VX/Y73O67zOe19zzTUPBnj605/OVf+xaq1kJraxjW1scz/b2OZ+tvmX2MY2z802D2Sb52ab58c2trHNC2KbF8Q2/xaSeFFI4j+TJJ4fSUjifpJ4bpI4f/48J06c4EUlCUlIQhKSkIQkJCEJSfx3koQkJCEJSUhCEpL4r3Dx4kWe9rSncc011zz4xV7sxV6bq6666qqrrrrqfyqCq6666qqrrrrqf6zXeZ3XeS+An/qpn0ISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCTxf13f92QmmYlt7mcb29zPNvezjW2em21s89xsY5sHss1zs81zs41tXhjb2OaBbANgm/vZ5oFs88JIAkASLwpJSOJFJQlJSEISkpDEv0QSz00S95PE/SQBIIn/DJKQhCQkIQlJSEISkvjvIglJSEISkpCEJCTxH+HixYv85V/+JQDv9E7v9FlcddVVV1111VX/UxFcddVVV1111VX/Y73Yi73YawM8/elP57+DJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIYl/i1IKmYltbGMb29gGwDa2AbDNA9nGNraxzfNjm+dmm+dmm+dmmxfGNrZ5brZ5QWzzbyGJF5UkJPHcJCEJSUjiBZGEJJ6bJB5IEg8kiQeSBIAkJPHfRRKSkIQkJCEJSUhCEv8dJCEJSUhCEpKQhCReVE972tMAOHPmzINf7MVe7LW56qqrrrrqqqv+JyK46qqrrrrqqqv+R/rwD//w7wL4q7/6K3Z3d7nqhZOEJCQhCUlIQhKSkIQkJCEJSUgiM7GNbWxjGwDb3M82ALZ5UdnmudnmudnmudnmBbGNbZ4f2/xLbGOb/2ySkIQkJPGvJYl/K0k8kCQAJCEJSUhCEpL47yYJSUhCEpKQhCQkIYn/apKQhCQkIQlJSEIS97t48SJPe9rTuOaaax78Oq/zOu/FVVddddVVV131PxHBVVddddVVV131P9KLvdiLvTbAX/3VX3HVf46u6wDITGxjGwDb3M82D2Qb27wgtrHNc7PNc7PNc7PN82Mb27wgtnkg2wDY5j+CJP63kQRARPDCSEISkpCEJCQhCUlI4r+bJCQhCUlIQhKSkMR/NUlIQhK/8Ru/AcCLvdiLvTZXXXXVVVddddX/RARXXXXVVVddddX/OK/zOq/z3tdcc82Dn/70p3Prrbdy1X8eSdjGNgC2AbCNbe5nmweyjW3uZxvbPD+2eW62eW62eW62sc0LY5v/CpL4rySJB5IEgCT+JZIAkMSJEyfY3d3l30MSkpCEJCQhCUlIQhKS+O8iCUlIQhKSkIQkJPGf6elPfzpPe9rTuOaaax78Yi/2Yq/NVVddddVVV131Pw3BVVddddVVV131P87rvM7rvBfAX//1XyMJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUn8Z3iZl3kZHvawh2Eb29jGNrZ5INsA2Oa52cY2L4htnpttnpttnpttXhjb2Oa52eaBbPO/lSReGEncTxKS+O8kCUlIQhKSkIQkJPHfRRKSkIQkJCEJSUji3+sv//IvAXind3qnz+Kqq6666qqrrvqfhuCqq6666qqrrvof5cVe7MVe+8Ve7MVeG+Cv//qvueoKSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkASAbe5nm/vZxja2eSDbvKhs89xs89xs89xs88LY5vmxzf1s8y+xzb+GJP6nkASAJF4UkvjvJglJSEISkpCEJCQhif8OkpCEJCQhCUlI4kXx9Kc/HYAXe7EXe+0Xf/EXf22uuuqqq6666qr/SQiuuuqqq6666qr/UV7ndV7nvQD++q//mqv+cx0/fpxTp04BYBsA29jmudnmfrZ5YWxjm+dmm+dmm+dmmxfENrZ5fmzzb2WbF5Uk/jeQxHOThCQkIQlJSEISkpCEJP47SUISkpCEJCQhCUn8V5OEJCQhCUlIQhKSALh48SJ/+Zd/CcBrv/ZrvxdXXXXVVVddddX/JARXXXXVVVddddX/KK/zOq/z3gC/9Vu/xVX/uU6cOMH9bGOb+9kGwDa2AbDN/Wxjm+dmm+fHNs/NNs/NNs+PbWzzgtjmgWzzQLb530oS95PE8yOJ+0lCEgCSADhx4gT/GpKQhCQkIQlJSEISkvjvIglJSEISkpCEJCTxX00SkvjN3/xNAF78xV/8dbjqqquuuuqqq/4nIbjqqquuuuqqq/7HeJ3XeZ33Bvjrv/5rLl26hCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCTx3+XixYtEBPezjW1sA2Cbf4ltbGMb27yobPPcbPP82OaFsc0LYpv/DJL47ySJF9VjHvMYLl68yH80SUhCEpKQhCQkIQlJ/HeQhCQkIQlJSEISkvjPcvHiRZ7+9Kdz5syZB73jO77jZ3HVVVddddVVV/1PQXDVVVddddVVV/2P8Y7v+I6fBfDXf/3X/H8iCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSAPjrv/5r3uzN3owXhW0AbPOvZZt/iW2eH9u8MLZ5brZ5fmzzQLb595DE/wbXX389u7u7/HeQhCQkIQlJSEISkpDEfzVJSEISkpCEJCQhiX+P3/iN3wDgdV7ndd6bq6666qqrrrrqfwqCq6666qqrrrrqf4TXeZ3Xee9rrrnmwQC33norV/3nkoQkTp06xcMf/nAAbGMb29gGwDa2eSDbvKhs89xs86KwzQtjm38t2/xHkoQk/j0kIQlJSOL5kcS/xSMf+Uge8YhHcOuttyIJSUhCEpKQxH83SUhCEpKQhCQkIYn/apKQhCQkIQlJSOJfsru7y9Oe9jSuueaaB7/Yi73Ya3PVVVddddVVV/1PQHDVVVddddVVV/2P8Dqv8zrvBfDTP/3TXPVfY3d3l1tvvZU3eZM3AUASD2SbB7LN/WzzL7HNc7PNc7PNc7PNC2Ib2zw/trmfbZ4f29jmP5Ik/jUkIQlJ/Gd6i7d4C37rt36L3d1dXhBJSEISkpCEJCQhCUn8d5KEJCQhCUlIQhKS+K8kCUlIQhKSkIQkAC5evMhf/dVfAfBO7/ROn8VVV1111VVXXfU/AcFVV1111VVXXfU/wou92Iu9NsAznvEMJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJPG/xU//9E/z8Ic/nDd6ozcCwDYvKts8P7axzYvCNv8atnlBbPP82Oa/giT+JZKQxAsjif8Ib/qmb8ojH/lInv70p/PvJQlJSEISkpCEJCQhif8ukpCEJCQhCUlIQhL/VSQhiac//ekAnDlz5sEv9mIv9tpcddVVV1111VX/3Qiuuuqqq6666qr/dh/+4R/+XQB//dd/ze7uLv8XSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUm8qHZ3d/nt3/5tXv7lX57Xf/3XB8A2tnkg2wDY5oFsY5v72eYFsc2LwjbPj23+p5OEJJ6bJCTxopLECyKJf8nDH/5w3vRN35S/+qu/4tZbb+W/giQkIQlJSEISkpCEJP47SEISkpCEJCQhif8Mu7u7/OVf/iXXXHPNg1/ndV7nvbjqqquuuuqqq/67EVx11VVXXXXVVf/tXuzFXuy1Af7mb/6Gq/5jSEISkpCEJCQhCUlIQhKS+Ju/+Rv29vZ4+Zd/eV7/9V+f+9kGwDb/EtvY5gWxzXOzzXOzzfNjmxfGNg9km/9OkpCEJCTxX+lhD3sYH/7hH86tt97KT//0TyMJSUjiv5skJCEJSUhCEpKQxH81SUhCEpKQhCQkIYl/q7/6q78C4MVe7MVem6uuuuqqq6666r8bwVVXXXXVVVdd9d/qdV7ndd77mmuuefCtt97KrbfeylX/9XZ3d/me7/keJPF6r/d6vO7rvi73s81zs81/Jdu8MLb5l9jmRSWJ/wkk8UCS+Je8wRu8AR/6oR/K7u4u3/Vd38Vzk4QkJCEJSUhCEpKQhCT+u0hCEpKQhCQkIQlJ/FeThCQkIQlJSEISL8zTn/50nv70p3PNNdc8+HVe53Xem6uuuuqqq6666r8TwVVXXXXVVVdd9d/qdV7ndd4L4G/+5m+QhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhif9vvud7vofd3V1e93Vfl4/5mI/h+PHjPJBt/i1s89xs89xs869lmxfGNv8fHD9+nA/4gA/gDd7gDdjd3eWrvuqr+PeQhCQkIQlJSEISkpDEfwdJSEISkpCEJCQhif9KkpCEJCQhCUlIAuAv//IvAXid13md9+Kqq6666qqrrvrvRDl+/DhXXXXVVVddddV/jxd7sRd77Xd6p3f6bIAf/dEf5X8aSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJP6zrFYrnvjEJ7JarXj0ox/Nox/9aObzObfddhuSkIQkJAEgCUlIQhKSkIQkJCEJSQBIQhKSkASAJCQhCUkASEISkpAEgCQkIQlJSEISAJKQhCQkIQkASUgCQBIAkvjfxjYPZBsA29jGNq/92q/Nu73bu3HixAluvfVWvumbvon/CpKQhCQkIQlJSEIS/x0kIQlJSEISkpCEJP6rSGK1WvGqr/qqXHPNNQ9+3OMe9zv33XffrVx11VVXXXXVVf8dKMePH+eqq6666qqrrvrv8U7v9E6f9ZCHPOSl/+Zv/oYnPvGJXPWikYQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhLr9Zpbb70VgEc/+tE8+MEP5qVe6qV44hOfyDAMSEISkpCEJCQhCUlIQhKSkASAJCQhCUlIAkASkpAEgCQkIQlJSAJAEpKQhCQkASAJSUhCEpKQBIAkJAEgCQBJ/G9jmweyDYBtjh07xju90zvxMi/zMgD89m//Nj/90z+NJCQhif9OkpCEJCQhCUlIQhL/HSQhCUlIQhKSkMR/tNVqBcBDHvIQAP70T//0Z7jqqquuuuqqq/47ULnqqquuuuqqq/7bvM7rvM57A/zO7/wOV/3PIYnf/d3f5W//9m95y7d8Sx784Afz7u/+7vzd3/0df//3f8/+/j4AtpHEC2IbSTw320jiX2IbSTw320ji+bGNJJ4f20jif7tjx47xEi/xErzma74mALfeeis//dM/ze7uLs9NEv8S2/x3kMS/xDb/VSTxgtjm3+Kv/uqveN3XfV1e/MVf/HW46qqrrrrqqqv+u1COHz/OVVddddVVV131X+91Xud13vsVX/EV3/pv/uZv+Ju/+Ruu+p9ntVrxN3/zN+zu7vKgBz2IRz7ykTziEY9gNpuxt7fHMAxIQhKSkIQkJAEgCUlIQhKSkASAJCQhCUkASEISkpAEgCQkIQlJSAJAEpKQhCQkIQkASUgCQBKSuJ8k/jexzf2OHTvGy7/8y/P2b//2POhBD+LWW2/lt3/7t/nlX/5lVqsV/1aSkIQkJCEJSUhCEpL47yIJSUhCEpKQhCT+K0lCEpKQhCQkIYkXZrVa8ZCHPIQbb7zxOMA//MM//A5XXXXVVVddddV/NSpXXXXVVVddddV/i3d8x3f8LIC/+Zu/QRJXgW3+J/qbv/kbnvGMZ/BSL/VSvNRLvRSv9mqvxou/+Itzxx138A//8A/cddddvKhsI4kHso0kHsg2knhutpHE82MbSfxfIomdnR1e7MVejFd7tVcDYHd3l7/+67/mt3/7t/mvIokXxjb/1STxwtjmv4IkXhDb/NZv/RYPechDeJ3XeZ33/tEf/dHP4aqrrrrqqquu+q9G5aqrrrrqqquu+i/3Oq/zOu99zTXXPBjgGc94BlddIYn/Crb519rd3eV3fud3+Ju/+Rse9KAH8VIv9VK82Iu9GC/2Yi/G3t4ej3vc4/jTP/1TAGwjif8pbCOJfy9J2Oa/ws7ODo997GN5sRd7MXZ2dgDY3d3lr//6r/md3/kdACTxQLb57yKJf4lt/itJ4gWxzX8FSdx66608/elP5yEPeciDX+zFXuy1/+Ef/uG3ueqqq6666qqr/itRjh8/zlVXXXXVVVdd9V/rfd/3fb/qmmuuefDP/uzPcu+993LVfy1JSEISkpCEJCQhCUlIQhKSkIQkJLFer7n33nv527/9W57xjGcA8KAHPYibbrqJxzzmMZw5c4bZbMa5c+eQhCQkIQlJAEhCEpKQBIAkJCEJSQBIQhKSkASAJCQhCUlIQhIAkpCEJCQBIAkASQBI4t9CEg9km/9oOzs7vPRLvzSPfexjeaM3eiNuvvlmZrMZf/3Xf82f/Mmf8DM/8zM84xnP4AWRhCQkIQlJSEISkpDEfydJSEISkpCEJCQhif9KkpCEJCQhCUlI4j+DJB7zmMdwzTXXPPi3fuu3voerrrrqqquuuuq/EpWrrrrqqquuuuq/3Iu92Iu9NsAznvEMrvrf6xnPeAbPeMYz+N3f/V0e9KAH8VIv9VI85jGP4TGPeQyv+IqvyP7+Pk984hPZ39/n7rvv5r+SbSTx3GwjiX8NSdjmgSRhm3+v7e1tHv3oR3PjjTdy4403cr/d3V3++q//mt/5nd/hP5Ik/iW2+e8giRfENv9VJPGC2Obf4ulPfzoAL/ZiL/baL/ZiL/ba//AP//DbXHXVVVddddVV/1WoXHXVVVddddVV/6U+/MM//LsA/uZv/oZLly4hif+rbPP/we7uLru7u/zN3/wNx48f50EPehAv9VIvxbFjx3jd131dAPb397nrrru4++672d/f55577uEFsY0k/qvY5t9CErb519je3uaRj3wktnmFV3gFHmh3d5e//uu/5m/+5m/Y3d3lv4sk/iW2+a8kiRfGNv8VJPGC2OYF2d3d5a/+6q94mZd5GV7ndV7nvf7hH/7ht7nqqquuuuqqq/6rULnqqquuuuqqq/5LvdiLvdhrA/zt3/4t/9dJ4r+abf477e7usru7y9/8zd9w/PhxHvSgB/GgBz2IBz3oQTzqUY/iUY96FAD7+/vcfffd3H333RweHnLPPffwb2UbSfxnkIRt/i22trbY2triuuuu4/rrr+f666/ngXZ3d/mbv/kbAH7nd36HB5LEC2Kb/26SeGFs819JEi+Ibf4rSOIFsc1v/dZv8TIv8zK82Iu92Gtz1VVXXXXVVVf9V6Jy1VVXXXXVVVf9l3md13md977mmmse/IxnPINnPOMZXPUfTxL/0Wzzb7G7u8vu7i5/8zd/A8Dx48c5duwYL/VSL8Xx48d55CMfySMf+Ujud3BwwMHBAQcHB9x7770cHBxwdHTE4eEhtpHE/zSS2NjYYHNzk2uvvRbbXHfddVx33XU8t93dXf7mb/4GgL/5m79hd3eXfwtJvChs899FEi+Mbf6rSOKFsc1/NklcunSJW2+9lQc/+MEPfp3XeZ33/q3f+q3v5qqrrrrqqquu+q9A5aqrrrrqqquu+i/zOq/zOu8F8Dd/8zdc9b+HJP69bLO7u8vu7i7PeMYzADh+/DjHjh3j+PHjPOhBD+L48eM86EEPAuDhD3849zs4OADg8PCQw8NDJHHfffchicPDQwCWyyVHR0f8W0jCNs9tY2MDgI2NDRaLBRsbGwBsbGywubnJ5uYmm5ubPD+7u7s84xnPYHd3l1tvvZVnPOMZ/FeTxL/ENv8dJPHC2Oa/iiReENv8R/qrv/orHvzgB/OO7/iOn/Vbv/Vb381VV1111VVXXfVfgcpVV1111VVXXfVf4sVe7MVe+8Ve7MVeG+Dv/u7vkMR/JNtc9T+XJJ7bpUuXuHTpErfddht/+7d/C8Dx48cBuOWWWwB40IMexPHjxwF40IMexP0e8pCH8IIcHR3xQEdHR/xLNjY2ANjY2OBFtbu7yzOe8QxuvfVWAJ7xjGdw6dIldnd3eW6SeCDb/E8giRfGNv8dJPGC2Oa/iiSeH9v8W9x6660AXHPNNQ9+8Rd/8df++7//+9/mqquuuuqqq676z0blqquuuuqqq676L/E6r/M67wXwt3/7t/xnkMT/drb5/253dxeA3d1dAP72b/+WBzp+/DgAx44d49ixYwAcP36cY8eOAXD8+HHud+zYMQBqrfxLhmEA4OzZswDs7u4CsLu7C8ClS5fY3d0F4BnPeAb/XpJ4Udjmv5Mk/iW2+a8kiRfENv8VJPGC2OYF2d3d5bd+67d4ndd5HV77tV/7vf7+7//+t7nqqquuuuqqq/6zUbnqqquuuuqqq/5LvM7rvM57A/zu7/4uVz1/kvjPZJv/7XZ3dwHY3d3lP5pt/qeRxIvCNv9dJPHC2Oa/iiReGNv8Z5PEC2Kbv/7rv+Z1Xud1ePEXf/HX4aqrrrrqqquu+q9AcNVVV1111VVX/ad7ndd5nfcG+Nu//VsuXbrEVf89JCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUn8XyQJSUhCEpKQhCQkIQlJSOJ/GklIQhKSkIQkJCEJSfx3kYQkJCEJSUhCEpL4ryQJSUhCEpKQhCT+K0ji0qVL3HrrrZw5c+ZB7/iO7/hZXHXVVVddddVV/9kIrrrqqquuuuqq/3Tv+I7v+FkAf/u3f8tV/zdIQhKSkIQkJCEJSUhCEpKQhCQkIQlJ/G8nCUlIQhKSkIQkJCEJSUjifwpJSEISkpCEJCQhif8ukpCEJCQhCUlI4r+SJCQhCUlIQhL/GX77t38bgNd5ndd5b6666qqrrrrqqv9sVK666qqrrrrqqv9Ur/M6r/Pe11xzzYMvXbrEbbfdhiT+P7DNVS+YJP4tbPO/jSReFLb57ySJf4lt/itJ4gWxzX8FSbwgtvm3uPXWW7n11lt58IMf/OAXe7EXe+1/+Id/+G2uuuqqq6666qr/LARXXXXVVVddddV/qtd5ndd5L4Df+73f4/8TSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpL4/0ISkpCEJCQhCUlIQhKSkIQkJPG/hSQkIQlJSEISkpCEJP67SUISkpCEJCQhCUn8V5KEJCQhCUlIQhKS+K8gCUlIQhKSkIQk/iV//dd/DcA7vdM7fRZXXXXVVVddddV/JoKrrrrqqquuuuo/zTXXXPPgF3uxF3ttgL/927/lqv88kpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQk8X+JJCQhCUlIQhKSkIQkJCEJSfxPJglJSEISkpCEJCQhif9OkpCEJCQhCUlI4r+aJCQhCUlIQhKS+K8gCUlIQhKSkMT9br31VgBe7MVe7LVf7MVe7LW56qqrrrrqqqv+sxBcddVVV1111VX/ad7xHd/xswD+9m//lqv+d5GEJCQhCUlIQhKSkIQkJCEJSUhCEpKQxP9WkpCEJCQhCUlIQhKSkIQk/ieShCQkIQlJSEISkpDEfwdJSEISkpCEJCQhif9KkpCEJCQhCUn8V5CEJC5dusRf//VfA/A6r/M678VVV1111VVXXfWfhcpVV1111VVXXfWf5nVe53XeG+Dv/u7vkMT/dLa56j+OJP4tbPO/hSReFLb5n0QSL4xt/qtJ4gWxzX8FSbwgtvmP9ju/8zu89Eu/NC/2Yi/22lx11VVXXXXVVf9ZCK666qqrrrrqqv8Ur/M6r/PeALfddhu33XYb/xtIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQxP9XkpCEJCQhCUlIQhKSkIQkJCGJ/+kkIQlJSEISkpCEJCQhif8pJCEJSUhCEpKQhCT+q0lCEpKQhCQkIQlJ/FeQhCQkIQlJSEIS/1a7u7vceuutXHPNNQ9+ndd5nffmqquuuuqqq676z0Bw1VVXXXXVVVf9p3id13md9wL427/9W676t5GEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSOL/IklIQhKSkIQkJCEJSUhCEpL4n0oSkpCEJCQhCUlIQhL/E0hCEpKQhCQkIQlJ/FeThCQkIQlJSEIS/xUkIQlJSEISknhR/M7v/A4A7/iO7/hZXHXVVVddddVV/xkIrrrqqquuuuqq/3Av9mIv9tov9mIv9toAf/d3f8dV/7NIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEIS/5tJQhKSkIQkJCEJSUhCEpKQxP8kkpCEJCQhCUlIQhKS+O8mCUlIQhKSkIQkJPFfSRKSkIQkJCGJ/wqSkIQkJCEJSTzQ7u4uu7u7XHPNNQ9+8Rd/8dfmqquuuuqqq676j0Zw1VVXXXXVVVf9h3ud13md9wL4u7/7O676v0sSkpCEJCQhCUlIQhKSkIQkJCEJSfxvIwlJSEISkpCEJCQhCUn8TyEJSUhCEpKQhCQk8d9NEpKQhCQkIQlJ/FeRhCQkIQlJSEIS/9kkIQlJXLp0ib/5m78B4B3f8R0/m6uuuuqqq6666j8alauuuuqqq6666j/c67zO67w3wO///u8jif/vbHPVc5LEv5Zt/qeTxIvCNv+dJPEvsc1/B0m8ILb5ryCJ58c2/xn+5m/+htd6rdfimmuuefA111zz4Pvuu+9Wrrrqqquuuuqq/ygEV1111VVXXXXVf6jXeZ3XeW+Av/u7v+PSpUtcBZKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQxP91kpCEJCQhCUlIQhKSkIQkJCGJ/6kkIQlJSEISkpCEJCTx300SkpCEJCQhCUlI4r+DJCQhCUlIQhKS+K8gCUlIQhKSkIQk/j12d3e59dZbOXPmzINe+7Vf+7246qqrrrrqqqv+IxFcddVVV1111VX/od7xHd/xswD+7u/+jqv+a0lCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKS+L9CEpKQhCQkIQlJSEISkpDE/zSSkIQkJCEJSUhCEpL47yQJSUhCEpKQhCT+O0hCEpKQhCQkIYn/CpKQhCQkIQlJvKh+53d+B4DXeZ3XeW+uuuqqq6666qr/SARXXXXVVVddddV/mNd5ndd572uuuebBly5d4rbbbuOq/70kIQlJSEISkpCEJCQhCUlIQhKSkIQk/jeShCQkIQlJSEISkpCEJCTxP4UkJCEJSUhCEpKQhCT+O0hCEpKQhCQkIQlJ/FeThCQkIQlJSEIS/9kkIQlJSEISknhuz3jGM7j11lu55pprHvxiL/Zir81VV1111VVXXfUfheCqq6666qqrrvoP8zqv8zrvBfAHf/AHSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSOKqfztJSEISkpCEJCQhCUlIQhKSkIQk/reQhCQkIQlJSEISkpCEJP4nkIQkJCEJSUhCEpL47yAJSUhCEpKQhCT+q0lCEpKQhCQk8Z9NEpKQhCQk8bd/+7cAvNM7vdNncdVVV1111VVX/UchuOqqq6666qqr/kNcc801D36xF3ux1wb4u7/7O/4vkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpL4/0gSkpCEJCQhCUlIQhKSkIQkJPE/mSQkIQlJSEISkpCEJP67SUISkpCEJCQhCUn8V5OEJCQhCUlIQhL/lSQhCUlIQhKSkMR/lltvvRWAF3uxF3vtF3uxF3ttrrrqqquuuuqq/wgEV1111VVXXXXVf4h3fMd3/CyAv/u7v+Oq/xiSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhif+LJCEJSUhCEpKQhCQkIQlJ/E8kCUlIQhKSkIQkJCGJ/06SkIQkJCEJSUhCEv+VJCEJSUhCEpKQxH8lSUhCEpKQhCT+vS5dusTf/M3fAPA6r/M678VVV1111VVXXfUfgeCqq6666qqrrvoP8Tqv8zrvDfAHf/AHXPU/lyQkIQlJSEISkpCEJCQhCUlIQhKSkIQk/jeThCQkIQlJSEISkpCEJCTxP4kkJCEJSUhCEpKQhCT+u0hCEpKQhCQkIYn/SpKQhCQkIQlJSOK/iiQkIQlJSEIS/xq/+7u/C8CLvdiLvTZXXXXVVVddddV/BIKrrrrqqquuuurf7XVe53XeG+C2227j0qVLXPV/myQkIQlJSEISkpCEJCQhCUlIQhKS+N9EEpKQhCQkIQlJSEISkvifQhKSkIQkJCEJSUjiv4MkJCEJSUhCEpL4ryQJSUhCEpKQxH8VSUhCEpKQhCSen93dXZ7xjGdwzTXXPPh1Xud13purrrrqqquuuurfi+Cqq6666qqrrvp3e8d3fMfPAvj7v/97JCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlI4qrnJAlJSEISkpCEJCQhCUlIQhKS+J9OEpKQhCQkIQlJSEISkvjvJglJSEISkpCEJCTxX00SkpCEJCQhCUlI4r+CJCQhCUlIQhL/VSQhCUlIQhKS+J3f+R0A3vEd3/GzuOqqq6666qqr/r0Irrrqqquuuuqqf5cXe7EXe+1rrrnmwQB///d/z1XPSRKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhL/10lCEpKQhCQkIQlJSEISkpDE/1SSkIQkJCEJSUhCEpL47yQJSUhCEpKQhCQk8V9NEpKQhCQkIYn/CpKQhCQkIQlJSOK/wt7eHru7u1xzzTUPfvEXf/HX5qqrrrrqqquu+vcguOqqq6666qqr/l1e53Ve570A/uAP/oCr/ntIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEIS/1dIQhKSkIQkJCEJSUhCEpL4n0YSkpCEJCQhCUlIQhL/XSQhCUlIQhKSkIQk/qtIQhKSkIQkJCGJ/wqSkIQkJCEJSfxH2t3d5W//9m8BeMd3fMfP5qqrrrrqqquu+vcguOqqq6666qqr/l1e53Ve570B/v7v/56r/neThCQkIQlJSEISkpCEJCQhCUlIQhKS+N9IEpKQhCQkIQlJSEISkpDE/xSSkIQkJCEJSUhCEv9dJCEJSUhCEpKQxH8VSUhCEpKQhCQk8Z9NEpKQhCQkIYl/q7/9278F4JprrnnwNddc82Cuuuqqq6666qp/K4Krrrrqqquuuurf7B3f8R0/C+Dv//7v2dvbQxKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSuOrfRhKSkIQkJCEJSUhCEpKQhCQkIYn/LSQhCUlIQhKSkIQkJPE/gSQkIQlJSEISkpDEfwdJSEISkpCEJCTxX0USkpCEJCQhif9skpCEJCQhCUn8S3Z3d3nGM57BmTNnHvTar/3a78VVV1111VVXXfVvRXDVVVddddVVV/2bvc7rvM57A/z93/89/5dIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCGJ/48kIQlJSEISkpCEJCQhCUlI4n8ySUhCEpKQhCQkIQlJSOK/kyQkIQlJSEISkpDEfzVJSEISkpCEJCTxX0ESkpCEJCQhif9skpCEJCQhCUk80O/+7u8C8Dqv8zrvzVVXXXXVVVdd9W9FcNVVV1111VVX/Zu8zuu8znv/7YPGB1+6dInbb7+dq/5jSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCT+r5GEJCQhCUlIQhKSkIQkJCGJ/4kkIQlJSEISkpCEJCTx30USkpCEJCQhCUlI4r+SJCQhCUlIQhKS+M8mCUlIQhKSkIQk/jNJQhKSuO2223jGM57BNddc8+AXe7EXe22uuuqqq6666qp/C8rx48e56qqrrrrqqqv+dcb3fdnPetK73vLRf3R69/i5X/kbdPc+V/3PJQlJSEISkpCEJCQhCUlIQhKSkIQkJCGJ/80kIQlJSEISkpCEJCQhif9pJCEJSUhCEpKQhCT+u0hCEpKQhCQkIYn/SpKQhCQkIQlJ/FeQhCQkIQlJSOI/y6Me9SiuueaaB//Wb/3W93DVVVddddVVV/1rUbnqqquuuuqqq15k7U0e8d7j+77sZ/n67QfzTM84PfEQrvq/ThL/Frb530ISLwrb/E8giRfGNv/VJPGC2Oa/giReENv8Z5LEc7PNv8cznvEMAF7sxV7stV/sxV7stf/hH/7ht7nqqquuuuqqq/41KMePH+eqq6666qqrrvqX5ctc/9rDF73BT7E9O85zueEvLiEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlc9ZwkIQlJSEISkpCEJCQhCUlIQhL/00lCEpKQhCQkIQlJSEIS/90kIQlJSEISkpCEJP6rSUISkpCEJCQhif8qkpCEJCQhCUn8Z5KEJCQhCUlI4kW1Xq85fvw41157LQB/+qd/+jNcddVVV1111VX/GgRXXXXVVVddddWLZPjU1/wuno/dh21y8WGbXHWFJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpDE/weSkIQkJCEJSUhCEpKQhCQk8T+VJCQhCUlIQhKSkIQk/jtJQhKSkIQkJCEJSfxXkoQkJCEJSUhCEv8VJCEJSUhCEpL4zyQJSUhCEpKQxPPzu7/7uwC82Iu92Gtz1VVXXXXVVVf9axFcddVVV1111VVX/S8iCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSOL/CklIQhKSkIQkJCEJSUhCEv/TSEISkpCEJCQhCUlI4r+LJCQhCUlIQhKS+K8kCUlIQhKSkMR/BUlIQhKSkIQk/jNJQhKSkIQk9vb2eMYznsE111zz4Nd5ndd5b6666qqrrrrqqn8Ngquuuuqqq6666kUSf3X3b/MCLC4MXPW/jyQkIQlJSEISkpCEJCQhCUlIQhKSkMT/RpKQhCQkIQlJSEISkpDE/ySSkIQkJCEJSUhCEv8dJCEJSUhCEpKQxH8VSUhCEpKQhCQk8Z9NEpKQhCQkIYn/TL/3e78HwDu+4zt+FlddddVVV1111b8GwVVXXXXVVVdd9SLpvvMvP0d379/Kcznx1EMWuxOSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpDEVf9xJCEJSUhCEpKQhCQkIQlJSEIS/1tIQhKSkIQkJCEJSUhCEv8TSEISkpCEJCQhCUn8V5OEJCQhCUlIQhL/VSQhCUlIQhKS+M8mCUlIQhKSkMR/hEuXLnHp0iWuueaaB7/4i7/4a3PVVVddddVVV72oKMePH+eqq6666qqrrvqX6WDYffEHP/Kl73n0xks/6smmf/olzvzDPo/90bv430QSkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKS+P9KEpKQhCQkIQlJSEISkpCEJCTxP5kkJCEJSUhCEpKQhCT+u0lCEpKQhCQkIQlJ/FeShCQkIQlJSEIS/xUkIQlJSEISkvjPJglJSEISkpDEv8Z6vWY+n/OgBz2Ia6655iG/9Vu/9d1cddVVV1111VUvCipXXXXVVVddddWL7K43v+m9X2JY8PAf+Vv29va46t9OEv/RbPN/kSReVLb5n0YS/xLb/HeRxAtim/8qknhBbPOfSRLPj23+M0niudnmBfnbv/1bXuM1XoNrrrnmwddcc82D77vvvlu56qqrrrrqqqv+JQRXXXXVVVddddWL5DHv/vqfdW9ZcsOf77K3t8dV//NIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSOJ/O0lIQhKSkIQkJCEJSUhCEv+TSEISkpCEJCQhCUn8d5GEJCQhCUlIQhL/lSQhCUlIQhKS+M8mCUlIQhKSkMR/JklIQhKSkIQkAC5dusQznvEMzpw586B3fMd3/Cyuuuqqq6666qoXBZWrrrrqqquuuur5uu6668of//EfTzyXT/qLT+J2rvq/ShL/Vrb530QS/xLb/E8giRfGNv/VJPGC2Oa/giSeH9v8Z5LE82Ob/yySAPj93/99HvSgB/FiL/Zir81VV1111VVXXfWioHLVVVddddVVVz2P13u917v2O77jO+6RxHOzzbu927vxH+VVl0/nLQ//nj+YP4Qn9dfwxP4a/ieyzVUvnCT+tWzzP5kkXhS2+e8kiRfGNv+VJPGC2OY/myReENv8Z5HE82Ob/yi33XYbt912G7fccsuDX+zFXuy1/+Ef/uG3ueqqq6666qqrXhj0oAc9iKuuuuqqq6666jndeuutlgTAb/3WbwHw27/92//wOZ/zOS8GYJt3e7d34z/C++z9Ca+6fDr3O182eWJ/DX84fwhP7K/h/yPbXPW8bPO/mW3+p7LN/wS2+e9im/9qtvm3eImXeAne/M3fnH/4h3/47c/8zM98Ha666qqrrrrqqheGylVXXXXVVVdd9Rxe8iVf8sS99957Hjhlm/u99mu/9ou93du93cFLvuRLbu3v73PTTTfxH+Ehz/hzWPIsp9ohr7p8Oq+6fDrnyyZP7K/hD+cP4fChL8tVV72obPO/jW3+J7LN/2e2+a9kmxfVi73Yi732i73Yi732P/zDP/w2V1111VVXXXXVC0Llqquuuuqqq656Dm/0Rm/0nl/8xV9ceT62t7e3ANpbHR8+K+j5T3aqHfKqy6fzqsunMz7t8Rw99OXYffk34+ihL8dVV1111VVwzTXXPPgf/uEfuOqqq6666qqrXiAqV1111VVXXXXVc7jrrrv+/iVe4iXuBY7xAuTbfWz/uKc91Tbi3+nGJ/wWx4c9Xphbt27i8OaX49xrfwCX3Xcf/5dI4qqr/j+zzf8XtvmPsLW1xebmJmfOnHkQV1111VVXXXXVC4Me9KAHcdVVV1111VVXPadbb73VkgCwzf0kAWCbj//4j+c/wvs+5cd48MEdPNBuv8NfnXwxdmc7/PXJF+PfQhL/GSTxn0US/1Uk8d9NElf9x7HNfxXb/Eexzb+Xbf6tbPNvYZt/Ldv8a9nm+XmVV3kVHvrQh/L1X//17/Nbv/Vb381VV1111VVXXfWCULnqqquuuuqqq56vr//6r//dD//wD39NSTyQbf76r//6j4BX4T/A07du4sEHd7Db7/BXJ1+MW7dv4tatm/n3sg2AJP4j2QZAEv/RbHM/Sfxnsg2AJP672OaBJHHVv55t/ivZ5j+Kbf69bPNvZZt/C9v8a9nmqquuuuqqq676b0Hlqquuuuqqq656Hg9+8IN16623+sM+7MN48zd/88PDw8PNF3uxF3va13/91z/0woULt3/f933fq/BMkvj3+KuTL8bTt27m1q2buJ/4j2MbAEn8R7INgCT+M9gGQBL/mWxzP0n8d7LN/SRx1Qtnm/9qtvmPYpt/L9v8W9nm38I2/1Vs84Jsbm4CcN99993KVVddddVVV131wlC56qqrrrrqqquerwc/+MGaz+f6hm/4hh98xVd8xXdeLpf9x33cxwHczAPY5n6S+Nfa7XfY7Xd4INsASOI/im0AJPEfyTb3k8R/NNvcTxL/mWxzP0n8d7LNA0niqits89/BNv+T2Obfyjb/Frb5t7DNv5ZtXpitrS0Azp49eytXXXXVVVddddULQ3DVVVddddVVV71Aq9XKn/Ipn/IpT3rSk3jCE55wE/8C29jmP4ptbPMfyTa2sc1/NNvY5j+LbWzzX8E2tvmfwja2sc3/V7axzX8H2/xHss3/F7b517LNv2RzcxOA++6771auuuqqq6666qoXhspVV1111VVXXfVC3XfffbcCbG5u8qKyDYAk/iPY5n6S+I9iGwBJ/EeyDYAk/jPYBkAS/9lscz9J/E9gmweSxP9VtvnvZJv/aLb597LNv5Vt/i1s869lm38t21x11VVXXXXVVf+hCK666qqrrrrqqn/RfffddyvANddcw7+GbWzzH8k2tvmPZBvb/EezjW1s85/BNraxzX8F29jmfxrb2MY2tvm/wDa2+e9km/9otvn3ss2/lW3+LWzzP8nm5iYA9913361cddVVV1111VX/EoKrrrrqqquuuupfdPbs2Vv5d7CNbf4j2cY2/5FsY5v/DLaxzX8W29jmv4JtbGOb/4lsYxvb2OZ/C9vYxjb/3WzzH802/162+beyzX8l2/xr2eZFsbW1BcDZs2dv5aqrrrrqqquu+pcQXHXVVVddddVV/6L77rvvVoCtrS3+PWxjm/9ItrHNfyTb2MY2/9FsY5v/LLaxzX8V29jmfzLb2MY2tvmfxDa2sc1V/zPZ5l/LNv9atnlRbW5uAnDffffdylVXXXXVVVdd9S+hctVVV1111VVX/Yvuu+++WwE2Nzf5j2AbAEn8R7ENgCT+I9kGQBL/kWwDIIn/DLYBkMR/BdsASOJ/Ots8P5L4z2ab/+ls8x/NNv9etvm3ss2/hW2uuuqqq6666qr/9ahcddVVV1111VUvMtvYRhL/EWxzP0n8R7ANgCT+I9kGQBL/kWwDIIn/DLYBkMR/BdsASOJ/G9u8IJL417DN/0a2+Y9mm38v2/xvYZt/Ldv8a1x77bUA3Hfffbdy1VVXXXXVVVf9Swiuuuqqq6666qp/0dmzZ58BcO211wJgG9v8R7KNbf6j2MY2tvmPZBvb/EezjW3+s9jGNrb5r2Ab29jm/wLb2MY2trGNbWxjG9vYxja2+d/INv/RbPPfzTb/Frb517LNv5Zt/rVsA3D27NlncNVVV1111VVX/UuoXHXVVVddddVV/6L77rvvVp4P2wBI4j+KbQAk8R/FNgCS+I9iGwBJ/Eeyzf0k8Z/BNgCS+K9gGwBJXPU/k23+p7LNv5Vt/i1s8z+Vbba2tgC47777buWqq6666qqrrvqXULnqqquuuuqqq/5FZ8+evRVga2uL58c2AJL4j2IbAEn8R7ENgCT+o9gGQBL/0WwDIIn/DLYBkMR/BdsASOKq/zls85/BNv+f2OZfyzb/FpubmwCcPXv2Vq666qqrrrrqqn8JwVVXXXXVVVdd9R/GNrb5j2Qb2/xHso1t/iPZxjb/GWzzn8k2tvmvYhvbXPXfzzb/k9nm38o2/xa2+a9gm38t21x11VVXXXXVVf9qVK666qqrrrrqqn/RfffddyvA5uYmLwrb3E8S/xFsAyCJ/yi2AZDEfxTbAEjiP5JtACTxn8U2kvivYhsASVz1f4tt/j+xzX8229xva2sLgPvuu+9WrrrqqquuuuqqfwnBVVddddVVV131IrnvvvtuBdjc3ORfwza2+Y9iG9v8R7KNbf4j2cY2/9FsY5v/LLaxzX8l29jmqv9atvmfzDb/Vrb5t7DNv5Zt/rVs82+1ubkJwH333XcrV1111VVXXXXVi4Lgqquuuuqqq656kZw9e/ZWgK2tLf4tbGOb/yi2sc1/JNvY5j+SbWzzH802tvnPYhvb/FeyjW2u+s9nm/8strnqP5Zt7re1tQXA2bNnb+Wqq6666qqrrnpREFx11VVXXXXVVf+lbGOb/yi2sc1/JNvY5j+SbWzzH802tvnPYhvb/FeyzVX/v9nm38o2/xa2+deyzb+Wbf49Njc3Abjvvvtu5aqrrrrqqquuelEQXHXVVVddddVVL5L77rvvVoBrrrmG/wi2+Y9kG9v8R7KNbf4j2cY2/9FsY5v/LLb5r2Qb21z1H882/1lsc9V/LNtcddVVV1111VX/LgRXXXXVVVddddWL5L777ruV/2C2sc1/JNvY5j+Sbf6j2eY/g23+s9jGNv+VbGObq/7/sM2/lW3+LWzzr2Wbfy3b/HttbW0BcN99993KVVddddVVV131oiC46qqrrrrqqqteJGfPnn0GwObmJraxzX8U29jmP5JtbPMfxTa2+Y9kG9v8R7ONbf6z2Oa/mm2u+vezzVX/e9jmuW1ubgJw9uzZZ3DVVVddddVVV70oCK666qqrrrrqqhfJfffddyvA1tYW97ONbf6j2MY2/5FsY5v/KLaxzX8k29jmP5pt/rPYxjb/lWxjm6v+Z7LNVS+Yba666qqrrrrqqv8WBFddddVVV1111b/K5uYmz802tvmPYhvb/EeyzX8k29jmP5JtbPMfyTa2+c9im/9qtrnq/ybb/FvZ5t/CNv9atvnPZpvn59prrwXgH/7hH36bq6666qqrrrrqRUFw1VVXXXXVVVe9SM6ePXsr/wLb2OY/im1s8x/FNrb5j2Qb2/xHss1/NNvY5j+DbWzzX8k2V131v4Vtrrrqqquuuuqq/zYEV1111VVXXXXVi+S+++67FWBra4t/iW1s8x/FNrb5j2Ib2/xHss1/JNvY5j+abf6z2Oa/km2uetHZ5qrnZJt/Ldv8Z7PNC7K1tQXAfffddytXXXXVVVddddWLguCqq6666qqrrnqR3XfffbcCbG5u8qKwjW3+o9jGNv9RbGOb/yi2sc1/JNv8R7PNfxbb/FeyjW2uuur/g83NTa666qqrrrrqqn81gquuuuqqq6666kV29uzZWwG2trb417CNbf6j2MY2/1Fs8x/JNv+RbGOb/0i2sc1/Btv8V7PNVf99bPPfyTb/U9nmX8M2L8jW1hYA//AP//A7XHXVVVddddVVLyqCq6666qqrrrrqv4xt/iPZ5j+KbWzzH8U2tvmPZJv/aLb5z2Cb/2q2uep/L9v8T2eb/06bm5sA3Hfffbdy1VVXXXXVVVe9qAiuuuqqq6666qoX2X333XcrwObmJv9WtrHNfxTb2OY/im1s8x/FNrb5j2Ib2/xHss1/BttcddX/VLb5z2abq6666qqrrrrqvx3BVVddddVVV131IrvvvvtuBdja2uLfyza2+Y9iG9v8R7HNfyTb/EeyzX8k2/xnsM1/JdtcddX/VrZ5Yba2tgC47777ns5VV1111VVXXfWiIrjqqquuuuqqq15kZ8+efQbA5uYm/1FsY5v/KLb5j2Ib2/xHsY1t/qPY5j+Sbf4z2Oa/km2uuur/os3NTQDOnj37DK666qqrrrrqqhcVwVVXXXXVVVdd9SK77777bgXY2trCNv+RbGOb/wi2sc1/FNvY5j+Kbf6j2OY/km3+M9jmqv9ekvjPIon/62zzr2Gbfw3bXHXVVVddddVV/ykIrrrqqquuuuqqfzPb2OY/km3+o9jGNv9RbPMfxTb/UWxjm/8otrHNfzTb/FexzVVX/V9z7bXXAnD27Nlbueqqq6666qqrXlQEV1111VVXXXXVi+zs2bO3AmxubvJAtvmPZBvb/EexzX8U29jmP4JtbPMfxTb/09nmqquu+ve57777buWqq6666qqrrnpREVx11VVXXXXVVf9qW1tbPDfb2OY/km1s8x/BNrb5j2Kb/yi2+Y9im/8otvnPYJv/Cra56jlJ4v8a2/xr2eZ/Etu8KLa2tgC47777buWqq6666qqrrnpREVx11VVXXXXVVS+y++6779b77rvvVoCtrS2eH9vY5j+Sbf6j2OY/im3+o9jmP4pt/qPY5qqrrvrXsc1VV1111VVXXfU/BsFVV1111VVXXfWvcvbs2VsBNjc3eWFs8x/JNrb5j2Ab2/xHsI1t/iPY5j+Kbf6j2OY/mm2u+u8hif8Mkvj3kMT/VLb577a5uQnAfffddytXXXXVVVddddW/BsFVV1111VVXXfWfxja2+Y9kG9v8R7DNfxTb/EewjW3+I9jmP4ptrvq/QxL/V0ji/4Nrr70WgLNnz97KVVddddVVV131r0Fw1VVXXXXVVVf9q9x33323AmxtbfGiso1t/iPZ5j+CbWzzH8E2/1Fs8x/BNv9RbPMfyTb/2Wxz1VX/k9nmX+O+++67lauuuuqqq6666l+D4Kqrrrrqqquu+le57777bgXY3NzkX8s2/5FsY5v/CLb5j2Ab2/xHsM1/BNtcddVzk8RV/3tsbW0BcN99993KVVddddVVV131r0Fw1VVXXXXVVVf9l7KNbf4j2eY/gm1s8x/BNv8RbPMfwTb/EWzzH8k2V/33kcR/JElc9Z9jc3MTgLNnzz6Dq6666qqrrrrqX4Pgqquuuuqqq676V/mHf/iH3wG47rrr+PewjW3+o9jGNv8RbPMfwTb/EWzzH8E2/xFs87+FJK7630MSV1111VVXXXXVVf/BCK666qqrrrrqqv9WtvmPZJv/CLb5j2Cb/wi2ueqq/wyS+I8kif/PbPOfYWtrC4D77rvvVq666qqrrrrqqn8Ngquuuuqqq6666l/l7NmztwJsbm5im/8ItrHNfxTb/EewjW3+vWzzH8E2/162+Y9gm6v+75DEVf+zbW5uAnD27Nlbueqqq6666qqr/jUIrrrqqquuuuqqfxfb/EexzX8U29jmP4Jt/r1s8x/BNv9etvmfxDZX/feTxH8USVz1L7PNi2prawuA++6771auuuqqq6666qp/DYKrrrrqqquuuupf5b777rsVYGtri/vZxjb/EWxjm/8otvmPYJt/L9v8X2Kbq/5vkcR/N0n8a0niX0MSV1111VVXXXXV/xsEV1111VVXXXXVv9p99913K8DW1hYPZBvb/EewzX8U29jm38s2/162+feyzb+Xbf6vk8RV/3qS+I8giav+Y2xubgJw33333cpVV1111VVXXfWvRXDVVVddddVVV/2rnT179laAzc1Nnh/b/EewjW3+o9jm38s2/162+feyzb+Xba666vmRxH8nSVz1bFtbWwCcPXv2Vq666qqrrrrqqn8tgquuuuqqq6666j+FbWzzH8E2/1Fs8+9lm38v2/x72ea/m22u+r9JEv9ekrjq329zcxOA++6771auuuqqq6666qp/LYKrrrrqqquuuupf7e///u9/G+C6667jX2Kb/wi2+Y9im38v29jm38M2/162+fewzf9FkvifSBKSkIQkJCEJSUhCEpL4n0IS/16S+K8giauuuuqqq6666qrng8pVV1111VVXXfWfzjYAkvj3sA2AJP69bAMgiX8P20ji38o2krjq/x5J/FtJ4rnZ5r+DJGzzX00StrkKtra2ALjvvvtu5aqrrrrqqquu+tciuOqqq6666qqr/tXOnj37DICtrS3+NWzzH8E2/1Fs8+9lm38P2/x72Obfwzb/l0jiv4skJCGJ/2iSkIQkJPFfSRL/HpL4n0YS/1tsbm4CcPbs2Wdw1VVXXXXVVVf9axFcddVVV1111VX/avfdd9+tAJubm/xr2eY/gm3+o9jm38s2/x62+fewzX8X2/x/JglJSOK/kiQkIYn/CpL4ryaJfw1J/GeQxH+nra0tAO67775bueqqq6666qqr/rUIrrrqqquuuuqqf7WzZ8/eCrC1tcW/hW1s8+9lG9v8R7DNv5dt/j1sc9W/jyT+q0hCEv8TSEIS/9kk8W8liav+bTY3NwE4e/bsrVx11VVXXXXVVf9aBFddddVVV1111X8b2/xHsM1/BNv8b2abfyvbXPWikYQk/ieShCQk8Z9FEv9WkvjXksRVV1111VVXXXXVvwPBVVddddVVV131r3bffffdCrC1tcW/l23+I9jmP4Jt/j1s8+9hm6v+bSTxn0kSkvjfQhKS+M8giX8rSfxnksSLShL/G2xtbQFw33333cpVV1111VVXXfWvRXDVVVddddVVV/2b3HfffbcCbG5u8u9lG9v8e9nmP4Jt/j1s8+9hm38r21z1H08S/1tJQhL/0STxX0US/1tI4j/S5uYmAPfdd9+tXHXVVVddddVV/xYEV1111VVXXXXVv8nZs2dvBdja2sI2/xFs8+9lm/8Itvn3sM3/Nrb57yCJfy9J/GeQhCT+L5CEJP4jSeLfQhJXvWi2trYAOHv27K1cddVVV1111VX/FgRXXXXVVVddddV/CNvY5t/LNv9etrHNv5dt/j1s829lm38r21z17yeJ/4skIYn/KJL4t5DEv4YkXlSS+I8mif8Om5ubANx33323ctVVV1111VVX/VsQXHXVVVddddVV/yb33XffrQBbW1s8kG3+vWxjm38v2/x72ebfwzb/Vra56l8mif9IkpDE/3WSkMR/BEn8byWJq6666qqrrrrq/zSCq6666qqrrrrq3+S+++67FWBzc5PnZpv/CLb597LNv5dtrvqfSRL/kSTx/40k/iNI4l9LEv8aknhRSeL/gq2tLQDuu+++W7nqqquuuuqqq/4tCK666qqrrrrqqn+Ts2fPPgNga2uL58c2tvn3ss2/l23+vWzzb2Wbfyvb/FvY5t/CNv9fSeL/K0lI4t9LEv9akvjXkMT/J5ubmwCcPXv2GVx11VVXXXXVVf8WBFddddVVV1111b/JfffddyvA1tYWL4xt/r1s8+9lm38v2/xb2eaq5yWJfytJ/EeQhCSuAklI4t9DEv9akvjPIIkXhSReFJK46qqrrrrqqqv+1yG46qqrrrrqqqv+09nm38s2/162+d/INlf955DEVc9LEv8ekvjXksSLShL/k0niP8q1114LwD/8wz/8NlddddVVV1111b8Flauuuuqqq6666t/k7NmztwJsbW3xorCNJP49bCOJfw/bSOLfyjaS+LewjST+q9hGEv8XSeLfSxL/HSTx72Gb/wqSALDNv4UkbPPfTRK2+ZdIwjb/lSRhm6uuuuqqq6666j8VwVVXXXXVVVdd9W9y33333QqwtbXFi8o2tvn3sM2/l23+PWzzb2Wbfwvb/F8jiX8LSfx7SeK/giQkIQlJSOLfSxKSkIQkJPGfSRKS+LeQxL+GJF5UkvjvIIn/SltbWwDcd999t3LVVVddddVVV/1bEFx11VVXXXXVVf9m9913360AW1tb/GvY5t/DNv/dbHPV/06S+M8iCUlIQhL/VSQhCUlI4j+DJP4tJPGvIYkXlSReFJK46qqrrrrqqqv+3yK46qqrrrrqqqv+zc6ePXsrwNbWFv9atvn3sI1t/q1s89/FNlf920ji30MS/9EkIQlJ/E8hCUlI4j+SJCTxryWJfw1J/HeQxH8USfx7XXvttQD8wz/8w29z1VVXXXXVVVf9WxFcddVVV1111VX/bWzz72Wbfyvb/HvY5r+Sbf61bPM/kST+q0niP5IkJPE/nSQkIYn/KJL415LEv4YkXhSSeFFI4n+bzc1NAO67775bueqqq6666qqr/q0Irrrqqquuuuqqf7P77rvvVoCtrS3+rWzz38k2/x62+bewzf8VkvivIIl/C0lI4j+CJCQhif+NJCEJSfx7SeJfSxL/GSTxH0US/xJJXHXVVVddddVV/2sQXHXVVVddddVV/2b33XffrQCbm5v8e9jm38M2/x62ueq/jiT+tSTxbyGJ/wiSkMT/JZKQxL+HJCTxryGJF5Uk/iNJ4n8aSbwgW1tbANx33323ctVVV1111VVX/VsRXHXVVVddddVV/yPY5t/DNv8etvm3ss2/hW3+tWxz1YtGEv9ekpDE/2WSkMS/hyT+NSTxopLEi0IS/9NI4t9jc3MTgLNnzz6Dq6666qqrrrrq34rgqquuuuqqq676N/uHf/iH3wG47rrrsI1t/j1s8+9hm/8utrnqP4ck/rUk8e8lif9PJCEJSfxbSEISLypJvKgk8aKQxL9EEv8SSfxLJHHVVVddddVVV/2vQHDVVVddddVVV/2Hss2/h23+PWzzb2Wbq/5zSeJfQxL/WpL495CEJP4/k4Qk/i0k8aKSxItKEv/fbG1tAXDffffdylVXXXXVVVdd9W9F5aqrrrrqqquu+jc7e/bsrQBbW1s8kG0k8W9lG0n8W9lGEv8WtpHEv4VtJPGvYRtJ/G8lif9JJPFvJYn/bJL4z2Cb/wySsM2/liRs86KQhG3+o0jCNi+MJGzzwkjCNi+MJGzzn2VzcxOAs2fP3spVV1111VVXXfVvRXDVVVddddVVV/2nsM2/h23+PWzzf5Vt/jeSxL+GJP41JPFvJYn/aJKQhCQkIYn/LJKQhCQkIYn/KJKQxL+WJF5UknhRSOJFIYn/KSTxL5HE87O1tQXAfffddytXXXXVVVddddW/FcFVV1111VVXXfVvdt99990KsLW1xfNjm38P2/x72Obfwjb/Vrb517LNVc9JEv8VJCGJ/yiSkIQk/rtJQhKSkMS/lyQk8a8hCUm8KCTxopDEfwRJ/EskcdVVV1111VVX/a9HcNVVV1111VVX/bvcd999twJcd911PD+2+fewzX8H2/xfYZv/6yTxryWJ/wiSkIQk/ieThCQk8e8hCUn8a0jiRSGJF4Uk/iWS+JdI4t9LEv8ZNjc3ATh79uwzuOqqq6666qqr/j0Irrrqqquuuuqqf5f77rvvVv4Ftvn3sM2/lW3+q9nm/wNJvKgk8aKSxL+GJP61JPHvIQlJSOJ/I0lIQhL/VpL415DEi0ISLwpJ/Esk8e8liX8vSfxrbW1tAXDffffdylVXXXXVVVdd9e9BcNVVV1111VVX/bucPXv2VoCtrS1eGNv8e9jm38o2/xa2+f9GEv+dJPGvIYl/DUlI4t9KEpL4v0QSkvi3kIQkXlSSeFFI4kUhiX8vSfx7SeLfSxIPtLm5CcB99913K1ddddVVV1111b8HwVVXXXXVVVdd9e9y33333QqwtbXFv8Q2/x62+beyzf9ktvm/ShL/GSTxryGJfytJSOL/MklIQhL/WpKQxItCEpL4l0jiP4Ik/r0kcdVVV1111VVX/a9F5aqrrrrqqquu+i9lG0n8W9lGEv9VbCOJfy3bSOI/i20k8X+JJF5UkvjXkMS/hST+s0ni38o2/xkkAWCbfw1J2OZFIQnbvDCSsM0LIwnbvDCSsM0LIgnb/GeShG1eVNdeey0A991339O56qqrrrrqqqv+PahcddVVV1111VX/LmfPnr0V4LrrruNFZRtJ/FezjST+tWwjif+tJPEfTRIvCkn8R5PEv4Yk/rUk8R9NEv/RJPH82OY/giQAbPOikgSAbf4lkrDNCyMJ27wwkrDNv4ckbPOCSMI2L4gkbPMf7ezZs8/gqquuuuqqq6769yC46qqrrrrqqqv+Xe67775b+Tewzb+Vbf6tbPNfxTZXvWgk8aKQxItKEpL415CEJP4jSEISkpDEfyVJSEISkpDEv4ckJPGvIYkXhST+JZL4l0jihZHE/3SSuN/W1hYAZ8+evZWrrrrqqquuuurfg+Cqq6666qqrrvp3ue+++24F2Nra4l/LNv9WtvmvZJv/bLb5v0QSLwpJvCgk8aKSxL+WJP49JCEJSUjifxpJSEIS/1aSkMSLShIvCkn8SyTxL5HECyOJF0YSL4wkXhhJvDCSeFFtbm4CcN99993KVVddddVVV13170Fw1VVXXXXVVVf9t7LNv5Vt/i1sc9XzksSLQhL/k0niX0MSkvi3kIQkJPG/iSQkIYl/C0lI4kUhCUn8SyTxL5HEVVddddVVV1111b8SwVVXXXXVVVdd9e9y9uzZZwBsbW3xb2Wbq/5vkcSLQhIvCkm8KCTxryGJfwtJSOL/AklIQhL/WpKQxItCEv8SSUjihZHECyOJF0YSL4wkXhhJvDCSeGEk8cJIAmBrawuA++6771auuuqqq6666qp/D4Krrrrqqquuuurf7b777rsVYGtri/9qtvm3sM2/lm3+tWxz1fMniReFJF4UknhRSUIS/1qSkMR/JUn8V5GEJCTxryGJF4UkJPEvkcQLI4kXRhIvjCReGEn8d9rc3ATgvvvuu5Wrrrrqqquuuurfi+Cqq6666qqrrvp3O3v27K0Am5ub/FvZ5t/KNlf915DEv0QS/1Ek8aKQxItKEv8akpCEJP6jSEISkpCEJCQhCUlIQhKSAJCEJCQhCUlIQhKSkIQkJCGJ/wiSkMSLShKSeFFI4l8iiRdGEi+MJF4YSfxbSeKFkcS/x9bWFgBnz569lauuuuqqq6666t+L4Kqrrrrqqquu+g9lm38r2/xXss2/lm2u+veTxL9EEi8KSbwoJCGJF5UkJPHvJQlJSEISkvjPJglJSEISkvi3koQkXlSSkMS/RBL/Ekm8MJJ4YSTxbyWJ/yySeGG2trYAuO+++27lqquuuuqqq6769yK46qqrrrrqqqv+3e67775bAa677joAbPNvZZt/C9tc9W8niX+JJP4jSOI/iiReFJL415DEv5UkJCEJSfxPIQlJSOLfQhKSeFFJ4l8iiX+JJF4YSfxbSeLfShIvjCSuuuqqq6666qr/EQiuuuqqq6666qp/t/vuu+9Wnott/q1s829hm38t2/xns82Lyjb/m0niP4Ik/iWSeFFI4kUlCUn8a0lCEpL430ASkpCEJP41JCGJF4UkJPHCSEISL4wkXhhJvCCSeGEk8YJI4oWRxL+VJF6Qzc1NAO67775bueqqq6666qqr/r0Irrrqqquuuuqqf7ezZ88+A2B7e5v/D2xz1b+NJP4lkviXSOJFIYkXhSQk8a8hCUlI4n87SUhCEi8qSUjiRSGJf4kkXhhJvDCSeEEk8W8lif9qW1tbAJw9e/YZXHXVVVddddVV/15Urrrqqquuuuqqf7f77rvvVoCtrS0eyDaS+LewjST+tWwjiX8N20ji/yJJ/EeQxL9EEv9ekviXSOJfIokXlST+NSTxn0ES/1a2+Y8iCQDbvCgkAWCbF0YSALZ5QSRhmxdEErZ5QSRhm+dHErZ5fiRhm38LSdjm+ZGEbf61Njc3ueqqq6666qqr/sNQueqqq6666qqr/t3Onj17K8DW1hbPzTaS+LewjSSu+s8lif8KknhhJPEvkcS/RBIvCkn8a0ji30sS/xkk8YLY5t9CEvezzb9EEgC2eWEkYZsXRBK2eUEkYZt/C0nY5vmRhG2eH0nY5j+aJGzz3La2tgD4h3/4h9/mqquuuuqqq6769yK46qqrrrrqqqv+09nmv5Jt/rVs869hm6ueTRIvjCT+vSTxL5HEi0ISLypJSOLfQhKSkIQk/jtIQhKSkMS/hSQk8aKQxL9EEi+MJF4YSbwgkvi3ksQLIokXRBIviCSuuuqqq6666qr/VlSuuuqqq6666qp/t/vuu+9WgK2tLV4Q20jiX8s2kvjfzjaS+N9IEv/ZJPHCSOJfIol/iSReVJL415LE/3SSeCDbvKgkAWCbF0YSALZ5QSQBYJvnRxIAtnl+JGGb50cStnl+JGGb/ykkYZsH2tzcBOC+++67lauuuuqqq6666t+L4Kqrrrrqqquu+g9x33333QqwtbXFfzTb/GvZ5qp/mST+vSTxwkjihZHECyOJf4kk/iWSeFFIQhIvKklIQhL/G0lCEpJ4UUlCEv8SSUjihZHECyOJF0QSL4gkXhBJvCCSeEEk8YJI4gWRxItqc3OTq6666qqrrrrqPxTBVVddddVVV131H+Ls2bO3AmxtbfGC2OZ/Mtv8byGJ/wqS+M8kiRdGEv8SSbwwkpDEv0QSknhRSUIS/1EkIQlJSEISkpCEJCQhCUlIQhKSkIQk/iNIQhKSeFFIQhL/Ekm8MJJ4YSTxgkjiBZHECyKJF0QSL4gk/qNJ4n5bW1sA/MM//MNvc9VVV1111VVX/UegctVVV1111VVX/ZeyjST+tWwjiX8N20jiP4ttJPE/lST+s0nihZHEfyZJvDCSeFFI4kUliX8PSfxnkMQLYpt/LUkA2OZfIgkA27wgkgCwzfMjCQDbPD+SsM3zIwnbPD+SsM3zIwnb/EeRhG2eH0nY5l+yubkJwH333XcrV1111VVXXXXVfwSCq6666qqrrrrqP8R99913K8DW1hb/Ettc9X+fJF4YSbwwknhhJPHCSOJfIglJ/EskIQlJ/GtIQhKSkIQk/jtIQhKSkMS/hiQkIYl/iSQk8cJI4oWRxAsiiRdEEi+IJP61JPGCSOIFkcS/hSSuuuqqq6666qr/FARXXXXVVVddddV/iPvuu+9WgK2tLf6z2OZfyzb/Grb5/0ISL4wkXhhJ/FtJ4oWRxAsjiRdGEi+MJCTxL5GEJP41JCEJSfxPJQlJSEISLypJSOJfIokXRhKSeEEk8YJI4gWRxAsiiedHEi+IJP4jSeJfsrm5CcB99913K1ddddVVV1111X8Egquuuuqqq6666j/E2bNnnwGwvb3Ni8I2V/3fJYl/K0m8MJJ4YSTxwkjiXyIJSbyoJCEJSfxvJAlJSOJFIQlJvDCSkMQLI4kXRBIviCReEEn8a0niX0sSL4gkXhBJvDBbW1sAnD179hlcddVVV1111VX/EahcddVVV1111VX/Ie67775bAba2tvjPZBtJ/GvYRhL/n0jiP5Mk/q0k8YJI4oWRxAsiiX+JJP4lknhRSOI/iiT+o9jm30MS97PNCyMJANu8IJIAsM3zIwnbPD+SsM3zIwnbPD+SsM1zk4Rtnh9J2Oa5ScI2z48kbPMfRRJXXXXVVVddddV/OCpXXXXVVVddddV/G9tI4n8a20jiRWEbSfxvI4kXRhL/VpJ4QSTxgkjihZHECyKJF0YS/xJJvCgk8e8hif9Mknh+bPOvJQkA27wwkgCwzQsiCds8P5IAsM1zkwSAbZ6bJGzz/EjCNs9NErb515CEbf41JGGb50cStnl+rr32WgDuu+++W7nqqquuuuqqq/4jEFx11VVXXXXVVf8hzp49eyvA1tYW/xq2+deyzVX/fSTxgkjiP4MkXhBJvDCSeGEkIYl/iSQk8a8hCUlIQhKS+O8iCUlIQhL/GpKQhCReGElI4gWRhCReEEm8IJJ4fiTxgkji+ZHE8yOJF0QSz48k/jOcPXv2Vq666qqrrrrqqv8IBFddddVVV1111X+ora0t/ieyzf8VkvjPJIn/DJJ4QSTxgkjiBZHECyOJF0YS/xJJSOJFJQlJSOJ/MklIQhKSeFFJQhIvjCQk8YJI4gWRxAsiiedHEi+IJJ4fSTw/kvjXksTzI4kXRBLPz+bmJgD33XffrVx11VVXXXXVVf8RCK666qqrrrrqqv8Q991336333XffrQBbW1v8a9jmX8s2V/3bSOLfShIviCReEEm8IJJ4QSTxgkjiBZGEJF4QSUjihZGEJF4UkpCEJP49JCEJSUhCEpKQhCQkIQlJSEISkpCEJP49JCEJSbwoJCGJF0YSL4gkJPH8SEISz48knh9JvCCSeH4k8fxI4vmRxL+WJK666qqrrrrqqv9WBFddddVVV1111X+Ys2fP3gqwtbXF/3a2+d9KEv9WkviPJokXRBIviCReEEm8IJJ4YSTxwkhCEv8SSUhCEv9akpCEJCQhCUn8e0lCEpKQhCQkIYl/DUlIQhL/EklI4gWRhCReEEm8IJJ4fiTx/EjiP4oknh9JPD+S+NeSxANtbm4CcN99993KVVddddVVV131H4Xgqquuuuqqq676H8E2/1q2+dewzf90kvifShIviCT+I0niBZHECyKJF0QSknhBJCGJf4kkJPGvIQlJSEIS/x0kIQlJSOJFJQlJ/EskIYkXRBIviCReEEk8P5J4fiTx/Eji+ZHEfzZJvCiuvfZaAM6ePXsrV1111VVXXXXVfxSCq6666qqrrrrqP8x99913K8DW1hb/Fra56j+XJP6jSeIFkcQLIonnRxIviCReEEm8IJJ4YSTxL5GEJF4UkpCEJCTxP5EkJCEJSfxLJCEJSbwwkpDE8yMJSTw/kpDE8yOJ50cSz48knh9JPD+SeH4k8fxI4vmRxL+WJJ7bfffddytXXXXVVVddddV/FCpXXXXVVVddddV/mPvuu+9WgK2tLWwjif9stpHEVf9+knhBJPEfSRLPjyReEEm8IJJ4QSTxgkjiXyKJF4Uk/r0k8e9lm38LSdzPNi+MJABs84JIwjbPjyQAbPPcJGGb5yYJ2zw3SdjmuUnCNs9NErZ5bpKwzXOThG2emyRs89wkYZvnJgnbvDCbm5sA3Hfffbdy1VVXXXXVVVf9R6Fy1VVXXXXVVVf9v2IbSfxvJYkXRhL/lSTxgkji+ZHEv5YkXhBJPD+SeGEk8cJI4l8iiX8LSfxnkcQLYpsXhSTuZ5sXRBIAtnl+JAFgm+dHErZ5bpKwzXOThG2emyRs89wkYZvnJgnbPDdJ2Oa5ScI2/1kkYZvNzU0Azp49+wyuuuqqq6666qr/KARXXXXVVVddddV/mH/4h3/4HYDrr78eANv8a9nmfwrbvChs87+BJF4QSbwgkvjXksS/liSeH0m8IJJ4fiTxgkhCEi+IJCTxwkhCEi8qSUhCEpL47yIJSUhCEi8KSUjihZGEJF4QSUji+ZHE8yMJSTw3SUjiuUni+ZHE8yOJ50cSLypJPD+SeH4kcdVVV1111VVX/ZcjuOqqq6666qqr/tezzVX/9STxryWJ50cSz48knh9JSOL5kcQLIokXRBKSeGEkIYl/iSQkIQlJ/E8lCUlIQhIvjCQkIYkXRBKSeEEk8fxIQhLPjySeH0k8N0k8P5J4fiTxopLE8yOJ50cSz48knh9JbG5uAnDffffdylVXXXXVVVdd9R+FylVXXXXVVVdd9R/m7NmztwJsbW1xP9tI4l/DNpK46l9HEv/RJPGvJYnnRxLPjySeH0k8P5J4QSTx/EjihZHECyOJf4kk/q0k8Z/FNi8qSdzPNi+IJABs8/xIAsA2z00SALZ5bpKwzXOThG2emyRs80CSsM1zk4RtnpskbPNAkrDNc5OEbf6zbG1tAXD27Nlbueqqq6666qqr/qNQueqqq6666qqr/t+xjST+P5HECyKJfy1JPD+SeH4k8fxI4vmRxPMjiRdEEs+PJF4QSbwwkviXSOJFJYn/apJ4brb5l0jifrZ5fiQBYJvnRxK2eX4kYZvnJgnbPDdJ2Oa5ScI2DyQJ2zw3SdjmRSEJ27woJGGb5yYJ2zw3SdjmuW1ubgJw33333cpVV1111VVXXfUfheCqq6666qqrrvoPc999990KsLW1xQPZ5l/LNv8atvm/ThL/lSTxP4kkXhBJPD+SeEEk8YJIQhIviCQkIYl/iSQkIYn/KSQhCUlI4l8iCUm8IJKQxPMjCUk8P5KQxHOThCSemySeH0k8N0k8P5J4bpJ4fiTx3CTx/Eji+ZHEVVddddVVV13134rgqquuuuqqq676D3XffffdCrC1tcVV/zqS+K8miX8tSTw/knh+JPH8SOL5kcSLShKSeH4k8fxIQhLPjyQk8YJIQhIvjCQkIQlJ/GtJQhKSkIQkJCEJSUhCEpKQhCQkIQlJSOJfSxKSkMQLIwlJSOL5kYQknh9JSOL5kcTzI4nnJglJPDdJPDdJPD+SeG6SeFFJ4t9LEg+0ubkJwH333XcrV1111VVXXXXVfySCq6666qqrrrrqP9TZs2dvBdja2uKBbPOvZZurXjSSeEEk8a8liedHEs+PJJ4fSTw/knh+JPH8SOK5SeL5kYQknh9JvCCSeEEkIYkXRhKSeFFJQhKSkIQkJPEfQRKSkIQkJCGJF4UkJCGJF0YSknh+JCGJ50cSz48kJPHcJPH8SOK5SeK5SeL5kcRzk8Rzk8TzI4nnJonnRxLPjyTut7m5CcDZs2dv5aqrrrrqqquu+o9EcNVVV1111VVX/afY3t7mqqueH0k8P5J4fiTx3CTx/EjiBZHE8yMJSTw/kpDECyIJSUjiXyIJSUhCEv8dJCEJSUhCEi+MJCQhiRdEEpJ4fiQhiecmCUk8P5J4bpJ4fiTx3CTx3CTx/EjiuUniuUniRSWJf4vNzU0A7rvvvlu56qqrrrrqqqv+IxFcddVVV1111VX/of7+7//+twG2trZ4brb5z2Sbq150knh+JPH8SOL5kcTzI4kXlSSeH0k8N0k8P5J4fiQhiecmCUk8P5KQxAsiCUm8MJKQhCQk8W8hCUlIQhKSkIQkJCEJSUji30oSkpDECyMJSbwgkpDE8yOJ50cSz48knpskJPHcJPHcJPHcJPGiksRzk8Rzk8TzI4nnJonnRxJXXXXVVVddddV/KipXXXXVVVddddX/aLaRxH8020jifwtJvCCSeEEk8d9BEs+PJJ6bJJ4fSTw3STw/knh+JPH8SOL5kcQLI4kXRhL/WpL4jyCJF8Y2/xJJ3M82z48k7meb5yYJANs8kCQAbPNAkgCwzQNJAsA2DyQJ2zyQJGzzQJKwzQNJwjYPJAnbvCgkYZsHkoRtXhSSsM3zs7m5CcB99913K1ddddVVV1111X8kgquuuuqqq6666j/U2bNnnwGwtbXF82Ob/01s83+RJJ4fSTw/knh+JPGiksSLShLPTRLPjySeH0k8P5J4fiTxgkhCEs+PJCQhiX+JJCQhCUlI4r+KJCQhCUlI4oWRhCQk8YJIQhLPjySeH0k8P5J4fiTx3CTx3CTx3CTx3CTx3CTx3CTxopLEc5PEi0oSW1tbAJw9e/YZXHXVVVddddVV/5GoXHXVVVddddVV/6Huu+++WwG2tra46kUnif9tJPH8SOK5SeL5kcRzk8Rzk8TzI4nnRxLPTRLPjyReEEm8IJL4l0jiP4IkXhjb/FtI4oFs8/xI4n62eW6SALDNA0kCwDYPJAkA2zyQJGzz3CRhmweShG0eSBK2eSBJ2OaBJGGbB5KEbR5IErZ5IEnY5kUhCds8kCRs89w2NzcBuO+++27lqquuuuqqq676j0Tlqquuuuqqq676D3X27NlbAba3t3lBbCOJF5VtJPGisI0k/qeRxH81STw/knh+JPH8SOJFJYkXlSSemySemySeH0k8N0k8P5J4fiTx/EjiBZHECyOJfw1J/HtJ4l9im3+JJO5nm+dHEgC2eW6SALDNA0kCwDYPJAnbPJAkAGzzQJKwzQNJwjYPJAnbPJAkbPNAkrDNA0nCNg8kCds8kCRs80CSsM2LQhK2eaDNzU0Azp49eytXXXXVVVddddV/JIKrrrrqqquuuuqq/+Ek8YJI4r+DJF5Uknhuknhuknhuknh+JPHcJPH8SOK5SUISz00Sknh+JCGJF0QSkviXSEISkpDEfxVJSEISkpDECyMJSUji+ZGEJJ4fSUjiuUniuUlCEs9NEs9NEs9NEs9NEs9NEs9NEs9NEs9NEs9NEs9NEs9NElddddVVV1111X8rKlddddVVV1111X+o++6771aAra0t/r+QxP80kviPIIkXlSSemySemySemyReVJJ4bpJ4bpJ4fiTx/Eji+ZHECyKJf4kk/j0k8aKwzb+WJB7INs+PJABs89wkAWCb5yYJ2zyQJABs80CSsM0DScI2DyQJANvcTxK2eSBJ2OaBJGGbB5KEbR5IErb5jyIJ2zyQJGxzv83NTQDuu+++W7nqqquuuuqqq/4jEVx11VVXXXXVVf/h7rvvvlsBtra2eEFsc9V/PUk8P5J4UUniuUniP5oknpsknpsknpsknh9JPDdJSOK5SUISz48kJPGCSEISkviXSEISkpCEJCQhCUm8qCQhCUlIQhKSkIQkXhSSkIQknh9JSEISz00SknhukpDEc5OEJB5IEpJ4IElI4rlJ4oEkIYkHksRzk8Rzk8S/RBLPTRLPTRL/WpubmwCcPXv2GVx11VVXXXXVVf/RCK666qqrrrrqqv9w9913360AW1tb/EexzVXPSRL/mSTx7yGJ5yaJ5yaJ5yaJ5yaJ5yaJ5yaJ5yYJSTw3STw3SUji+ZGEJJ4fSUhCEi+MJCQhCUn8V5GEJCQhCUm8MJKQhCSeH0lI4rlJQhLPTRKSeG6SeG6SeG6SeG6SeG6SeCBJPDdJ/Esk8dwk8dwk8dwk8dwk8dwkAbC5uQnAfffddytXXXXVVVddddV/NCpXXXXVVVddddX/ObaRxP8WknhBJPGvJYnnRxLPjyReVJJ4bpJ4bpJ4bpJ4bpJ4bpJ4bpJ4bpJ4bpJ4bpJ4bpJ4fiTx/EjiBZHECyOJfytJ/FvY5kUhiQeyzfMjCQDbPDdJANjmgSQBYJsHkoRtHkgStnkgSdjmgSRhmweShG0eSBK2uZ8kbPNAkrDN/SRhmweShG0eSBK2eSBJ2ObfQhKbm5sA3Hfffbdy1VVXXXXVVVf9RyO46qqrrrrqqqv+w509e/ZWgO3tbV4Y2/x3ss1Vz58knpsk/q0k8dwk8dwk8dwk8dwk8dwk8dwk8dwk8dwkIYnnJglJPDdJSEISz48kJCGJf4kkJCEJSUhCEpL4t5KEJCQhCUlIQhIvjCQkIYnnRxKSkMRzk4QknpskJPFAkpDEA0lCEg8kCUk8kCSemySemyQeSBLPTRIPJInnJol/C0k8N0lcddVVV1111VX/5Qiuuuqqq6666qr/cPfdd9+tAFtbW1z1n0MS/xEk8e8hiecmiX+JJJ6bJJ6bJJ6bJJ6bJB5IEpJ4IElI4rlJ4rlJQhLPTRKSeH4kIQlJvCCSkIQkJCGJ/2qSkIQkJPGCSEISknh+JCGJ5yYJSTw3STw3STw3STw3STyQJJ6bJJ6bJB5IEs9NEg8kiecmiQeSxHOTxHOTxHOTxHPb3NwE4L777ns6V1111VVXXXXVfzQqV1111VVXXXXVf7izZ8/eCrC1tcV/JNtI4n8bSfxXkcTzI4kXlSSemySemySemySemyT+JZJ4bpJ4bpJ4bpJ4IEk8N0k8N0k8P5J4bpJ4QSTxwkjiX0MS/1Fs8y+RxAPZ5rlJ4n62eSBJANjmgSQBYJv7SQLANveTBIBt7icJANvcTxK2uZ8kAGxzP0nY5oEkYZv7ScI2L4wkbPPCSMI2DyQJ2zyQJGzzwmxubgJw9uzZZ3DVVVddddVVV/1HI7jqqquuuuqqq/7D3XfffbcCbG1t8S+xzf9nknhBJPGfSRL/2STx3CTxL5HEc5PEc5PEA0niuUniuUniuUlCEs9NEs+PJCTx/EhCEpJ4YSQhCUlIQhL/kSQhCUlIQhKSeGEkIQlJPD+SkMRzk4QknpsknpsknpsknpskHkgSz00SDySJ5yaJB5LEA0niuUnigSTx3CTxbyGJq6666qqrrrrqvwyVq6666qqrrrrqqv9lJPGvIYkXlSSemySemySemyT+JZJ4bpJ4IEk8N0k8N0k8kCSemyQeSBLPTRLPjySeH0k8P5L4l0ji30sSD2Sbfy1JPJBtnh9J3M82DyQJANs8kCQAbHM/SQDY5n6SALDN/SQBYJv7ScI295OEbR5IEra5nyRs80CSsM39JGGb+0nCNg8kCdvcTxK2eSBJ2OZ+krDNA0nCNg8kCdsAXHPNNQD8wz/8w29z1VVXXXXVVVf9R6Ny1VVXXXXVVVf9h7vvvvtuBdje3uaq/zqSeFFJ4j+SJJ6bJB5IEs9NEg8kiecmiecmiQeSxHOTxANJ4rlJ4rlJ4vmRxPMjiRdEEi8qSfxbSOJFYZsXRBIPZJvnJgkA2zyQJABs80CSALDN/SQBYJv7ScI2DyQJ29xPEra5nyQAbHM/SdjmfpKwzQNJwjb3k4Rt7icJ27wwkrDNCyMJ2zyQJGxz1VVXXXXVVVf9lyO46qqrrrrqqqv+w509e/YZAFtbW7wobPM/lST+O0jiP4IkXlSSeG6SeG6S+JdI4l8iiX+JJJ6bJB5IEg8kCUk8kCSemySemySemyQk8dwkIYnnJglJSOIFkYQkJCEJSfxnk4QkJCEJSbwgkpCEJJ6bJCTx3CQhiecmiecmiQeShCQeSBIPJAlJPJAkHkgSDySJ5yaJB5LEA0nigSTx3CTxQJJ4bpL4l0gCYHNzE4D77rvvVq666qqrrrrqqv9oBFddddVVV1111X+K++6771aAra0trvqPI4nnRxIvKkn8W0niuUniXyKJB5LEc5PEA0niuUnigSTxQJJ4bpJ4IElI4oEkIYkHkoQknpskJPHcJCGJ50cSkpCEJF4UkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpL4l0hCEpKQxPMjCUk8N0lIQhIPJAlJPJAkJPFAkpDEA0nigSTx3CTxQJJ4IEk8kCT+JZJ4IEk8kCT+JZL4l0jiuUniqquuuuqqq676T0Vw1VVXXXXVVVf9pzh79uytAFtbW/xHss2Lwjb/FSTxwkjiBZHE/xSSeG6S+JdI4rlJ4oEk8S+RxANJ4rlJ4oEk8UCSeCBJSOKBJPHcJPFAkpDEc5OEJB5IEpKQxHOThCQk8cJIQhKSkIQkJPEfQRKSkIQkJCGJF0QSkpDEc5OEJCTx3CQhiQeShCQeSBKSeCBJPJAkJHE/SUjigSTxQJJ4IEk8kCQeSBL/Ekk8kCQeSBL/Ekk8N0k80JkzZwD4h3/4h9/mqquuuuqqq676z0Dlqquuuuqqq6666v8oSfxbSeK5SeJfIol/iSQeSBL/Ekk8kCQeSBIPJInnJokHksRzk8Rzk8Rzk8QLIokXRhL/VpJ4QWzzopLEA9nmuUnifrZ5IEkA2OaBJAFgm/tJAsA295OEbe4nCQDb3E8StrmfJGxzP0nY5n6SsM39JGGb+0nCNveThG3uJwnbvDCSsM39JGGb+0nCNg8kCdu8IJubmwDcd999t3LVVVddddVVV/1nILjqqquuuuqqq/5T3HfffbcCbG9vc9W/jiSeH0k8P5J4UUniuUni30IS/xJJPJAkHkgSz00SDySJB5LEA0nigSTxQJKQxANJ4oEkIYkHkoQkHkgSknhukpCEJJ6bJCQhCUm8IJKQhCQkIQlJSEISknhhJCEJSUhCEpKQhCQk8YJIQhKSkMRzk4QkJPFAkpDEc5PEc5PEA0lCEg8kiQeSxANJ4oEk8UCSeCBJPJAkHkgSDySJB5LEv0QSDySJf4kkrrrqqquuuuqq/zIEV1111VVXXXXVf4r77rvvVoCtrS1eFLa56j+OJP6tJPHcJPEvkcQDSeKBJPEvkcQDSeKBJPFAknggSTyQJB5IEpJ4IEk8N0k8kCQk8dwkIYnnJglJSOL5kYQkJCEJSfxXkIQkJCEJSTw/kpCEJJ6bJCTxQJKQxANJQhIPJAlJPJAkHkgSDySJB5LEA0nigSTxQJJ4IEk8kCQeSBIPJIkHksS/RBIPJInnJgmAzc1NAO67775bueqqq6666qqr/jNQueqqq6666qqr/lNtbW1x1fOSxH81STw3SfxbSOKBJPGvJYkHksQDSeKBJPFAknggSTyQJB5IEg8kiecmiecmiecmiedHEi+IJF4UkviPZpsXRBL3s81zkwSAbR5IEgC2uZ8kAGxzP0kA2OZ+krDN/SQBYBsASQDYBkASALYBkASAbQAkYZv7ScI295OEbe4nCdvcTxK2uZ8kbHM/SdjmfpKwzf0kYZsXRhK2eW6bm5sAnD179hlcddVVV1111VX/GahcddVVV1111VX/Kf7hH/7hdwC2trb4/0oS/1qSeH4k8fxI4j+SJJ6bJB5IEv8SSTyQJB5IEg8kiQeSxANJ4oEk8UCSeCBJPJAkHkgSDySJ5yaJ5yaJ5yaJF0QSL4wk/itI4rnZ5rlJ4n62eSBJ3M8295MEgG3uJwkA29xPEgC2AZAEgG3uJwnb3E8StrmfJGxzP0nYBkAStrmfJGxzP0nY5n6SsM39JGGb+0nCNveThG3uJwnb3E8StrmfJGzzwkjiqquuuuqqq676T0flqquuuuqqq6666v8YSTw3STw3SfxLJPEvkcQDSeKBJPFAknggSTyQJB5IEg8kiQeSxANJ4oEk8UCSeCBJPJAknpsknpsknh9JvCCS+NeQxL+HbV4QSTyQbR5IEvezzQNJAsA295MEgG3uJwkA29xPEra5nyRscz9J2OZ+krDN/SRhm/tJwjYAkgCwDYAkbHM/SdjmfpKwzf0kYZv7ScI295OEbe4nCdvcTxK2uZ8kbHM/SdjmgTY3NwG47777buWqq6666qqrrvrPQOWqq6666qqrrvpPcfbs2VsBtre3+b9KEv+dJPEfSRL/Ekk8kCT+I0nigSTxQJJ4IEk8kCQeSBIPJIkHksQDSeKBJPHcJPH8SOL5kcS/RBL/GSTx/NjmuUnifrZ5IEnczzb3kwSAbe4nCQDb3E8StrmfJABsAyAJANsASALANgCSsM39JGGb+0nCNveThG0AJGGb+0nCNveThG3uJwnb/EeRhG3uJwnb3G9jYwOAs2fP3spVV1111VVXXfWfgcpVV1111VVXXfW/jm0k8b+VJP41JPGiksRzk8Rzk8S/RBL/WpJ4IEk8kCQeSBIviCQeSBIPJIkHksT9JPFAknggSTyQJJ6bJB5IEs9NEs+PJF4QSfxrSeJfwzYvjCQeyDYPJIn72eaBJAFgm/tJAsA295MEgG0AJAFgm/tJwjb3k4Rt7icJ2wBIAsA2AJKwzf0kYZv7ScI2AJKwzf0kYZv7ScI295OEbQAkYZv7ScI295OEbe4nCdu8MJKwDcDm5iYA9913361cddVVV1111VX/GQiuuuqqq6666qr/FPfdd9+tAFtbW2xtbfGisM1/JUn8TyKJ/y6S+JdI4oEk8UCSeCBJPJAkHkgSDySJF0QSDySJB5LE/STxQJJ4IEk8kCQeSBKSeCBJPJAkJPHcJCGJ5yYJSUjiBZGEJCQhCUlIQhL/WpKQhCQkIQlJSOL5kYQkJCGJB5KEJCTxQJKQxANJQhIPJIkHkoQk7icJSdxPEg8kiQeSxP0k8UCSeCBJ3E8SDySJB5LECyKJB5LEA0nigSTxQJK46qqrrrrqqqv+2xBcddVVV1111VX/af7hH/7htwG2trb430gS/1aS+M8kiX8rSfxLJPFAkvj3kMQDSeKBJPFAkrifJB5IEg8kiftJ4oEk8UCSeCBJPJAkHkgSknggSTw3SUjigSQhCUk8P5KQhCQk8V9FEpKQhCSeH0lIQhIPJAlJPJAkJPFAkpDE/SQhiQeSxANJ4n6SkMT9JPFAkrifJB5IEg8kiftJ4oEk8UCSuJ8kHkgSDySJB5LEA0nigSTxQJLY3NwE4L777ruVq6666qqrrrrqPwuVq6666qqrrrrqqv/BJPGiksRzk8S/RBL/WpJ4IEk8kCReVJJ4IEncTxIPJIkHksT9JPFAknggSdxPEg8kiQeSxHOTxANJ4vmRxPMjiReFJP4z2Ob5kcQD2eaBJAFgm/tJ4n62AZAEgG3uJwkA2wBIAsA2AJIAsA2AJGxzP0nYBkASALYBkIRtACQBYBsASdjmfpKwDYAkbHM/Sdjm+ZGEbe4nCdvcTxK2+bfa3NwE4OzZs7dy1VVXXXXVVVf9ZyG46qqrrrrqqqv+09x33323AmxtbXHVFZJ4fiTxX0ES/xJJPJAkHkgSDySJB5LEA0nigSRxP0k8kCReEEk8kCTuJ4kHksT9JCGJ+0nigSTxQJJ4IElI4oEk8UCSkIQkHkgSkpDE8yMJSUhCEpL4zyIJSUhCEpJ4fiQhCUk8kCQkIYkHkoQk7icJSTyQJB5IEg8kiftJQhL3k8QDSeJ+knggSdxPEg8kiftJ4oEkcT9JPJAkHkgSL4gkHkgSDySJB9rY2ADgvvvuu5Wrrrrqqquuuuo/C5Wrrrrqqquuuuo/zX333XcrwNbWFv/XSOK/iySemySemyT+JZL4zySJB5LECyKJB5LE/STxQJK4nyQeSBL3k8QDSeKBJHE/STyQJJ6bJB5IEs+PJJ4fSfxLJPGfwTbPTRIPZJsHksT9bHM/SQDY5n6SALANgCQAbAMgCQDbAEgCwDYAkrDN/SRhGwBJ2OZ+krANgCRscz9J2AZAErZ5fiRhm+dHEra5nyRs8/xIwjb3k4Rt7icJ29xPErYB2Nzc5Kqrrrrqqquu+k9H5aqrrrrqqquuuuo/mCT+I0jiP5Ik/iWSeCBJPJAkHkgSDySJF0QSDySJ+0nigSRxP0k8kCTuJ4kHksT9JPFAkrifJB5IEg8kiQeSxANJ4rlJ4vmRxAsiif8qknhutnkgSdzPNg8kCQDb3E8SALa5nyQAbAMgCQDbAEjCNveThG0AJAFgGwBJ2AZAEgC2AZCEbQAkYZv7ScI2AJKwDYAkbHM/SdgGQBK2uZ8kbHM/SdgGQBK2uZ8kbHM/SdjmX7KxsQHAP/zDP/wOV1111VVXXXXVfxaCq6666qqrrrrqP83Zs2efAXD99ddz1QsmiReVJF4UkviXSOI/kiQeSBIviCReEEncTxIPJIn7SeKBJHE/SdxPEpK4nyQeSBL3k4Qk7icJSdxPEpJ4IElI4rlJQhLPTRKSkMQLIglJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpJ4fiQhCUlI4oEkIQlJPJAkJCGJ+0lCEg8kiQeSxP0kIYn7SUIS95PE/STxQJK4nyTuJ4kHksT9JHE/STyQJO4niQeSxAsiiQeSxAsiiQeSxFVXXXXVVVdd9V+G4Kqrrrrqqquu+k9z33333cpVzyKJ/wyS+JdI4l8iiQeSxANJ4oEk8YJI4oEkcT9JPJAk7ieJF0QS95PEA0nifpK4nyQeSBL3k4Qk7ieJB5LEA0nigSQhiQeShCQk8UCSkIQknpskJCEJSUjiP4MkJCEJSUjiuUlCEpJ4IElIQhIPJAlJ3E8SkrifJCRxP0lI4n6SeCBJ3E8S95OEJO4niftJ4n6SeCBJ3E8S95PEA0nifpJ4IEncTxIPJIkXRBIPJIkHksTm5iYA9913361cddVVV1111VX/WahcddVVV1111VX/ac6ePXsrwPb2Nv/bSOK/kyT+rSTxL5HEv4ckHkgSL4gkXhBJ3E8SDySJ+0nifpJ4IEncTxL3k8QDSeJ+knggSdxPEg8kiQeSxHOTxHOTxPMjiX+JJP6j2ea5SeKBbHM/SdzPNveTBIBt7icJANsASALANgCSALANgCRsAyAJANsASMI2AJIAsA2AJGwDIAnbAEjCNgCSsM39JGEbAEnYBkAStrmfJGwDIAnbPD+SsM3zIwnb3E8StrmfJGxzv42NDQDOnj17K1ddddVVV1111X8Wgquuuuqqq6666r+EbV4UtvmfThIviCT+s0jiuUniP4IkHkgSDySJF0QSDySJF0QS95PECyKJ+0nifpJ4IEncTxL3k8T9JCGJ+0nifpKQxP0k8UCSuJ8kJPFAkpDEA0lCEg8kCUlI4rlJQhKSkIQk/jNIQhKSkIQknpskJCGJB5KEJB5IEpJ4IElI4n6SeCBJ3E8SkrifJO4niQeSxP0kcT9J3E8S95OEJO4niftJ4n6SeEEkcT9JPJAk7ieJB5LEi2pzc5Orrrrqqquuuuo/HZWrrrrqqquuuuo/zX333XcrwNbWFv/fSeL5kcR/Nkk8kCT+NSTxQJJ4QSTxQJK4nyReEEncTxL3k8QLIon7SeJ+krifJB5IEveTxP0k8UCSeCBJPJAkHkgSz00Sz48k/iWS+I9mm+cmiQeyzf0kcT/bAEjifrYBkASAbe4nCdsASALANgCSALANgCRsAyAJ2wBIAsA2AJKwDYAkbAMgCdsASMI295OEbQAkYRsASdgGQBK2AZCEbe4nCdsASMI2z48kbHM/SdgGQBK2uZ8kbPNA9913361cddVVV1111VX/WQiuuuqqq6666qr/VPfdd9+tANvb2/xXksQLI4n/qSTxbyWJfy1JPJAkXlSSeEEk8YJI4n6SuJ8kXhBJ3E8S95PE/SRxP0ncTxKSuJ8k7ieJB5LE/SQhiftJQhL3k4QkHkgSknggSUhCEs9NEpKQhCQk8Z9BEpKQhCQk8dwkIQlJPJAkJPFAkpDE/SQhiftJQhL3k4Qk7ieJ+0lCEgCSkMT9JHE/SdxPEveTxP0k8YJI4n6SuJ8k7ieJF0QS95PEA0niBZHEA0liY2MDgPvuu+9Wrrrqqquuuuqq/0wEV1111VVXXXXVf6qzZ8/eCrC1tcVV/3aSeG6S+JdI4oEk8cJI4oEk8UCSeEEk8YJI4n6SuJ8kXhBJ3E8S95PE/SRxP0ncTxL3k8QDSeJ+krifJCRxP0k8kCQeSBIPJAlJPJAkJPFAkpCEJCTx3CQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpDEc5OEJCQhiQeShCQkcT9JSEIS95OEJO4nCUncTxKSuJ8k7icJSdxPEveTxP0kcT9J3E8S95PE/SRxP0k8kCTuJ4n7SeJ+krifJB5IEveTxAsiiQeSxANtbm4CcPbs2Vu56qqrrrrqqqv+M1G56qqrrrrqqquu+g8iiX8NSfxHksS/liReVJJ4IEncTxIPJIn7SeJFIYn7SeJ+krifJO4niftJ4n6SuJ8k7ieJB5LE/SRxP0k8kCQeSBIPJIkHksRzk8QLIol/DUm8MLZ5QSTx3GxzP0nczzb3kwSAbe4nCQDbAEgCwDYAkgCwDYAkbAMgCQDbAEjCNgCSsA2AJGwDIAnbAEjCNgCSsA2AJGwDIAnbAEjCNs+PJGwDIAnbAEjCNgCSsM3zIwnbAEjCNveThG2en83NTQDuu+++W7nqqquuuuqqq/4zEVx11VVXXXXVVf+p/v7v//63Aa677jr+t5DECyKJfy1JvKgk8dwk8dwk8S+RxL+GJB5IEi+IJF4QSbwgkrifJO4niftJ4n6SuJ8k7ieJ+0nifpK4nyTuJ4n7SUIS95PE/SRxP0lI4n6SkMT9JCGJ+0lCEg8kCUk8kCQkIQlJPDdJSEISkpCEJCQhiX+JJCQhCUlIQhKSkMRzk4QkJCGJ+0lCEpK4nyQkIYn7SUIS95OEJO4niftJQhL3k8T9JHE/SdxPEveTxP0kcT9J3E8S95PE/SRxP0m8IJK4nyTuJ4n7SeKBJHE/Sbwgkrjqqquuuuqqq/7LUbnqqquuuuqqq676P0AS/xJJPJAkXlSSeEEk8YJI4n6SuJ8k7ieJ+0nifpK4nyTuJ4n7SeJ+krifJO4niftJ4n6SuJ8kHkgS95PEA0nigSTxQJJ4bpJ4fiTxopLEv4Ztnh9JPJBtHkgS97MNgCTuZxsASQDYBkASALYBkIRtACQBYBsASdgGQBIAtpEEgG0kAWAbSQDYRhIAtpEEgG0kYRsASdgGQBK2AZCEbQAkYRsASdjmXyIJ2wBIwjbPjyRsAyAJ29xPErbZ2NgA4L777ruVq6666qqrrrrqPxOVq6666qqrrrrqP9XZs2efAbC9vc1VzyaJ/0yS+NeQxANJ4gWRxAsiiftJ4n6S+LeSxP0kcT9J3E8S95PE/SRxP0ncTxL3k8QDSeJ+krifJB5IEg8kiecmiecmiRdEEv9RJPGC2OZ+kngg29xPEgC2uZ8kAGwDIAkA2wBIAsA2kgCwDYAkbAMgCQDbAEjCNgCSsA2AJGwDIAnbAEjCNgCSsI0kbAMgCdsASMI2AJKwDYAkbAMgCdsASMI2AJKwzfMjCdsASMI2z48kbPNAGxsbAJw9e/YZXHXVVVddddVV/5moXHXVVVddddVV/6nuu+++WwG2trb4v0wSz48kXlSSeG6SeG6S+NeSxANJ4kUliRdEEveTxItCEveTxP0kcT9JvDCSuJ8k7ieJ+0nifpK4nyTuJ4n7SeJ+knggSdxPEg8kiQeSxHOTxPMjiX+JJP49bPPcJPFAtrmfJO5nGwBJ3M82AJIAsA2AJABsAyAJ2wBIAsA2kgCwDYAkbAMgCdsASMI2AJKwDYAkbAMgCdsASMI2kgCwjSRsAyAJ2wBIwjYAkrANgCRsAyAJ2wBIwjYAkrDN/SRhGwBJ2AZAEra5nyRsAyCJjY0Nrrrqqquuuuqq/xIEV1111VVXXXXVf6qzZ8/eCrC9vc3/dpL4n0gS/x6SeCBJvCCSuJ8kXhBJ3E8S95PE/SRxP0ncTxL3k8T9JAEgiftJ4n6SuJ8k7ieJ+0nifpK4nyTuJ4n7SUIS95PE/SQhiftJQhIPJAlJPJAkJCGJB5KEJCQhCUlI4t9LEpKQhCQkIYkHkoQkJCGJ+0lCEpK4nyQkcT9JSOJ+kpAEgCQkcT9J3E8S95PE/SRxP0ncTxL3k8T9JHE/STw3SdxPEveTxP0kcT9J3E8S95PE/STxgkjifpJ4QTY3NwH4h3/4h9/mqquuuuqqq676z0Tlqquuuuqqq676f0cS/50k8W8liX+JJB5IEg8kiReVJO4niRdEEveTxP0kcT9J3E8S95PE/SRxP0ncTxLPTRL3k8T9JHE/SdxPEveTxP0kcT9J3E8S95PEA0nifpJ4IEk8N0k8N0m8MJL4j2SbB5LEA9nmfpK4n20AJAFgGwBJANgGQBIAtgGQhG0AJAFgG0kA2EYSALaRBIBtJAFgG0kA2EYStgGQhG0AJGEbAEnYRhK2AZCEbQAkYRsASdgGQBK2AZCEbQAkYRsASdgGQBK2AZCEbZ4fSdgGQBK2ueqqq6666qqr/ktRueqqq6666qqr/lPdd999twJsbW1hG0n8e0niP4sk/jtI4rlJ4l8iiX8PSTyQJF4UkviPJon7SeJ+krifJJ6bJO4niftJ4n6SAJDE/SRxP0ncTxIPJIn7SeJ+knggSTyQJJ6bJJ4fSfxrSOL5sc0LIonnZpv7SeJ+trmfJABsAyAJANsASALANgCSALCNJABsAyAJ2wBIwjYAkrANgCRsAyAJ2wBIwjaSsA2AJGwDIAnbAEjCNpKwDYAkbAMgCdsASMI2AJKwDYAkbPPCSMI2AJKwDYAkbPP8SMI2GxsbANx33323ctVVV1111VVX/WciuOqqq6666qqr/tPdd999twJsbW3xf5Eknh9J/FeTxANJ4oEk8aKSxP0k8YJI4n6SuJ8k7ieJ+0nifpJ4bpK4nyTuJ4n7SQJAEveTxP0kcT9JAEjifpK4nyTuJ4n7SUISAJKQxP0kcT9JSOJ+kpDE/SQhCUk8kCQkIYnnJglJSEISkpCEJCTxgkhCEpKQhCQkIQlJSOKBJCEJSUjifpKQhCTuJwlJ3E8SkrifJCRxP0ncTxL3k4QkACRxP0ncTxL3k8T9JAEgCUkASOJ+krifJAAkcT9J3E8S95PE/STx3CRxP0m8IJK4nyTuJ4kH2tjY4Kqrrrrqqquu+i9DcNVVV1111VVX/ac7e/bsrQDb29v8V5DE/1SSeFFI4rlJ4j+SJB5IEveTxAsiiftJ4n6SuJ8k7ieJ+0nifpK4nySemyTuJ4n7SQJAEveTxP0kcT9JAEjifpK4nyTuJ4n7SeJ+krifJCQBIAlJ3E8SkrifJCTxQJKQhCTuJwlJSEISknhukpCEJCQhCUlIQhKSkIQkJCEJSTw/kpCEJCTxQJKQhCTuJwlJSAJAEpKQBIAkJHE/SUgCQBKSAJCEJO4nCQBJSAJAEpIAkIQkACRxP0ncTxIAkrifJO4nCQBJ3E8S95PE/STx3CRxP0ncTxL3k8QLIon7SeJ+m5ubAPzDP/zDb3PVVVddddVVV/1nI7jqqquuuuqqq656EUjiP4sk/i0k8UCSeCBJPJAkXhBJvCCSuJ8k/iNI4n6SuJ8knpsk7ieJ5yaJ+0nifpIAkMT9JHE/SdxPEgCSkASAJCQBIAlJ3E8S95OEJO4nCUncTxKSkMT9JCEJSTyQJCQhCUlIQhL/VpKQhCQkIQlJPJAkJCEJSdxPEpKQxP0kIYn7SUISAJKQxP0kcT9J3E8S95PE/SRxP0ncTxIAkrifJO4nCQBJ3E8S95MEgCTuJ4n7SeK5SeJ+krifJO4niftJ4n6S+JdsbGwAcN99993KVVddddVVV131n43gqquuuuqqq676T3fffffdCrC1tcX/F5L4jySJ/0iSeEEk8aKQxP0kcT9J3E8S95PEc5PE/SRxP0kASOJ+krifJAAkcT9J3E8SAJK4nyTuJwkASUgCQBL3k8T9JHE/SUgCQBKSuJ8kJHE/SUjifpKQhCTuJwlJSEISz00SkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQxANJQhKSkIQk7icJSUjifpKQxP0kIYn7SUISAJKQBIAkJAEgCUkASEISAJKQBIAk7ieJ+0kCQBKSAJDE/SQBIIn7SeJ+kgCQxP0kcT9JAEjifpK4nyTuJ4n7SeJ+krifJO4niftJ4qqrrrrqqquu+i9H5aqrrrrqqquu+k9333333QqwtbXFfzdJvCCS+NeSxItKEi8KSfxLJPFAknggSTyQJF4QSbwgkrifJP41JHE/SdxPEs9NEveTxHOTxP0kASCJ+0nifpIAkMT9JHE/SQBI4n6SuJ8k7ieJ+0nifpK4nyQeSBIPJIkHksTzI4kXlSReENs8P5J4bra5nyTuZxsASQDYBkASALYBkASAbQAkYRsASQDYRhIAtpGEbQAkYRsASdhGEgC2kYRtACRhGwBJ2EYStgGQhG0kYRsASdjmgSRhGwBJ2OaBJGEbAEnYBkAStnlRScI2AJKwDYAkNjY2ALjvvvtu5aqrrrrqqquu+s9G5aqrrrrqqquu+k939uzZZwBsb29z1XOSxH81SbwgknhRSOJ+krifJF4YSdxPEs9NEveTBIAk7ieJ5yaJ+0kCQBL3kwSAJO4niftJAkAS95PE/SRxP0ncTxIPJIn7SeK5SeKBJPGCSOLfShIvjG3uJ4kHsg2AJO5nG0nczzaSuJ9tJAFgG0kA2AZAErYBkIRtJAFgG0kA2EYStgGQhG0kYRsASdgGQBK2kYRtACRhG0nYBkAStpGEbQAkYRsASdhGErYBkIRtACRhmweShG0AJGEbAEnY5l+ysbEBwNmzZ5/BVVddddVVV131n43KVVddddVVV131n+6+++67FWBra4v/jSTxryGJ/0iSeCBJ/GtI4gWRxAsiiftJ4vmRxP0kcT9J3E8Sz00S95PEc5PEc5PE/SQBIIn7SQJAEveTBIAk7ieJ+0kCQBL3k8T9JHE/SdxPEveTxP0k8UCSeCBJPD+SeGEk8W9lmweSxHOzDYAk7mcbAEkA2AZAEgC2AZAEgG0kAWAbSQDYRhIAtpGEbQAkYRsASdhGErYBkIRtJAFgG0nYBkAStpGEbQAkYRtJ2AZAEraRhG0AJGGbB5KEbQAkYZsHkoRtACRhGwBJ2AZAErYBkIRtACRhm6uuuuqqq6666r8cwVVXXXXVVVdd9T+KJP63kMSLShLPTRLPTRL/WpJ4IEn8W0jiRSGJF5Uk7ieJ5yaJ+0kCQBL3kwSAJO4nCQBJ3E8SAJK4nyQAJHE/SQBIQhIAkrifJAAkIQkASUgCQBKSAJCEJAAkIYn7SUIS95OEJO4nCUlIQhL3k4QkJCEJSUji30MSkpCEJCQhiQeShCQkcT9JSEISAJKQhCQAJCGJ+0nifpK4nyTuJwkASUgCQBKSAJAEgCQkASCJ+0kCQBL3kwSAJO4nCQBJ3E8SAJK4nyQAJHE/SdxPEgCSuJ8k7ieJ+0nifpK4nyTuJwmA06dPA/AP//APv81VV1111VVXXfWfjcpVV1111VVXXfWf7uzZs7cCbG9v859NEv8WkvifSBL/HpJ4IEncTxIviCTuJ4n7SeJ+krifJO4niecmiftJ4rlJ4rlJ4rlJ4rlJAkAS95MEgCTuJwkASdxPEgCSuJ8k7ieJ+0nifpK4nyTuJ4kHksQDSeK5SeL5kcR/NNvcTxIPZBsASdzPNgCSALANgCQAbCMJANtIAsA2kgCwjSQAbCMJANtIwjYAkrCNJGwDIAnbSMI2AJKwjSRsAyAJ20jCNgCSsI0kbAMgCdtIwjYAkrCNJGwDIAnbPJAkbAMgCdtcddVVV1111VX/K1C56qqrrrrqqqv+y2xtbfHfSRL/2STxbyWJf4kkHkgSDySJfwtJ/EeQxP0k8dwkcT9JAEjifpIAkMT9JAEgiftJAkASAJK4nyQAJHE/SQBI4n6SAJDE/SQBIIn7SeJ+krifJO4niftJ4oEk8UCSeH4k8S+RxIvKNs9NEs/NNgCSuJ9tACRxP9tIAsA2AJIAsI0kAGwjCQDbSALANpKwDYAkbCMJANtIwjaSALCNJGwjCdsASMI2krANgCRsIwnbAEjCNpKwzQNJwjYPJAnbAEjCNpKwDYAkbPNAkrANgCRsAyAJ2wBIwjYAktjY2ADgvvvuu5Wrrrrqqquuuuo/G8FVV1111VVXXfWf7r777rv1vvvuuxVga2uLfw9J/FeSxL+XJJ6bJP6rSeJFIYn7SeJ+krifJO4niecmiftJ4rlJ4rlJ4rlJAkAS95MEgCSemyQAJHE/SQBI4n6SAJDE/SQBIIn7SeJ+kgCQhCQAJCGJ+0nifpKQxP0kIYn7SUISkpDEA0lCEpKQhCQk8a8hCUlIQhKSkIQkHkgSkpDE/SQhCUncTxKSAJCEJO4nCUkASEISAJK4nyQAJCEJAEncTxIAkrifJAAkASAJSQBIAkAS95MEgCTuJwkASQBI4n6SAJDE/STx3CRxP0kASOJ+krifJO4niftJ4qqrrrrqqquu+m9BcNVVV1111VVX/Ze47777bgXY2tri/wJJ/GeTxANJ4oEk8UCSeCBJvCCSuJ8k/q0kcT9JvDCSeG6SeG6SAJDEc5MEgCTuJwkASTw3SQBI4n6SAJAEgCQkASAJAElIAkASkgCQxP0kcT9JSAJAEpIAkIQkJHE/SUjigSQhCUlI4oEkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCGJB5KEJCQhiftJQhKSuJ8kJHE/SUgCQBKSuJ8k7icJAElIAkASkgCQBIAkJAEgCQBJ3E8SAJK4nyQAJAEgiftJAkASz00SAJK4nyQAJHE/SQBI4n6SeG6SuJ8k7ieJ50cSp06dAuDs2bPP4Kqrrrrqqquu+q9A5aqrrrrqqquu+n9PEv/dJPGfSRIvCkncTxL3k8T9JPHCSOJ+kgCQxP0kASCJ+0kCQBLPTRIAknhukgCQxP0kASAJAEncTxIAkgCQxP0kASCJ+0kCQBL3k8T9JHE/SdxPEg8kiecmiecmiX+JJF4UtnkgSTw32wBI4oFsI4n72UYS97ONJABsIwkA20gCwDaSALCNJGwDIAnbSMI2AJKwjSRsIwkA20jCNpKwDYAkbCMJ20jCNgCSsI0kbCMJ2wBIwjaSsA2AJGwjCds8kCRs80CSsA2AJGzzgkjCNvfb2NgA4O///u9/m6uuuuqqq6666r8CwVVXXXXVVVdd9V/i7NmztwJsb2/zv4Uk/jUk8dwk8dwk8S+RxL+GJB5IEi+IJO4niftJ4l9DEveTxHOTxHOTxHOTxHOTBIAkACRxP0kASAJAEveTBIAkACRxP0kASAJAEveTBIAkACQhCQBJ3E8SAJKQBIAkJAEgCUncTxKSuJ8kJCEJAElIQhKSuJ8kJCEJSUhCEpJ4UUlCEpKQhCQkIYn7SUISkpDE/SQhiftJQhL3k4QkACQhCQBJSAJAEpIAkASAJCQBIAkASUgCQBIAkrifJAAkASCJ+0kCQBIAkrifJAAkASCJ+0kCQBLPTRIAkrifJAAkcT9JPDdJ3E8S95PE/SRx1VVXXXXVVVf9l6Jy1VVXXXXVVVf9l7jvvvtuBdja2uI/iyReEEn8R5HEfzVJPJAkXlSS+NeSxP0kcT9JPDdJ3E8Sz00Sz00SAJK4nyQAJAEgiecmCQBJPDdJAEgCQBL3kwSAJAAkASCJ+0kCQBL3kwSAJO4niftJ4n6SuJ8k7ieJB5LEc5PECyKJ/wi2uZ8kHsg2AJK4n20kcT/bSOJ+tpEEgG0kAWAbSdgGQBK2kQSAbSRhG0kA2EYStpGEbSQBYBtJ2EYStpGEbQAkYRtJ2EYStgGQhG0kYRtJ2OaBJGEbSdgGQBK2kYRtHkgStgGQhG0kYRsASdgGQBK2eaDFYgHAfffd93Suuuqqq6666qr/ClSuuuqqq6666qqr/ptJ4j+SJF4QSdxPEveTxP0k8fxI4n6SeG6SuJ8knpskACTx3CQBIInnJgkASQBI4n6SAJAEgCQAJHE/SQBIAkASAJK4nyQAJAEgiftJAkAS95PE/SRxP0ncTxIPJIkHksRzk8S/RBIvKtvcTxLPzTYAkrifbQAkcT/bSALANgCSALCNJABsIwnbSALANpIAsI0kbCMJANtIwjaSsI0kbAMgCdtIwjaSsI0kbAMgCdtIwjaSsM0DScI2krCNJGwDIAnbSMI2DyQJ20jCNgCSsM0DScI2AJKwzQNJwjYbGxsAnD179hlcddVVV1111VX/FQiuuuqqq6666qr/Ev/wD//w2wDXXXcd/5NI4j+CJJ6bJJ6bJP4lknggSTyQJB5IEi+IJP49JPHCSOK5SeJ+kgCQxHOTBIAknpskACQBIInnJgkASQBIAkAS95MEgCQAJAEgiftJAkASAJK4nyQAJHE/SQBIQhIAkpAEgCQkcT9JSAJAEpKQxP0kIQlJ3E8SkpCEJCQhCUn8a0hCEpKQhCQkcT9JSEISkgCQhCQkcT9JSAJAEpK4nyTuJwkASUgCQBKSAJAEgCTuJwkASQBIAkASkgCQBIAkACQBIIn7SQJAEgCSAJDE/SQBIAkASTw3SQBI4n6SAJDE/SQBIIn7SeK5SeJ+krjqqquuuuqqq/7LUbnqqquuuuqqq/7XkMR/FUn8V5DEfyRJvCCSuJ8k7ieJ+0ni+ZHE/STx3CTx3CTx3CQBIInnJgkASbwgkgCQBIAkACTx3CQBIAkASQBIAkAS95MEgCQAJHE/SQBI4n6SAJDE/STxQJK4nyQeSBIPJIkXRBL/UWwDIIkHsg2AJO5nG0nczzaSALCNJABsIwkA20gCwDaSALCNJGwjCdtIAsA2krCNJGwjCQDbSMI2krCNJGwjCdtIwjYAkrCNJGwjCdtIwjYAkrCNJGwjCdtIwjYAkrCNJGzzQJKwzQNJwjYPJAnbAEjCNgAbGxsAnD179lauuuqqq6666qr/ClSuuuqqq6666qr/Evfdd9+tANvb27wgkvjPIIn/KJL4zySJfw1JvCCS+PeQxAsjiecmiecmiRdEEgCSeG6SAJAEgCQAJPGCSAJAEgCSAJAEgCQAJHE/SQBIAkASAJK4nyQAJHE/SdxPEveTxP0kcT9JPJAknpskXhhJ/GvZ5n6SeG62kcQD2UYS97ONJABsIwkA20gCwDaSALCNJABsIwnbSMI2kgCwjSRsIwnbSMI2AJKwjSRsIwnbSMI2krCNJGwDIAnbSMI2krCNJGzzQJKwjSRsIwnbPJAkbCMJ2wBIwjaSsA2AJGwjCdsASMI2D7RYLAC47777buWqq6666qqrrvqvQHDVVVddddVVV/2fIIn/LpJ4bpJ4bpL415LEA0niBZHECyKJ+0ni+ZHE8yOJ+0niuUniuUniuUkCQBIAknhukgCQBIAkACTx3CQBIAkASQBIAkASAJIAkASAJO4nCQBJAEgCQBL3kwSAJAAkIQkASUgCQBKSAJCEJAAkIYn7SUIS95OEJCRxP0lIQhKSkIQk/i0kIQlJSEISkrifJCQhiftJQhL3k4QkACQhCQBJSAJAEpIAkIQkACQBIAkASUgCQBIAkgCQBIAkJAEgCQBJAEgCQBIAkgCQxHOTBIAkACQBIInnJgkASQBI4rlJ4rlJ4rlJ4rlJAmBjYwOA++6771auuuqqq6666qr/ClSuuuqqq6666qr/EmfPnn0GwNbWFv9TSOK/kyT+PSTxgkjiRSGJ50cSz00S95PEc5PEc5MEgCReEEkASAJAEi+IJAAkASAJAEkASAJAEgCSAJAEgCTuJwkASQBIAkASAJK4nyQAJHE/SQBI4n6SuJ8k7ieJB5LEA0ni+ZHEfzTbAEjigWwjifvZRhL3s40kAGwjCQDbSALANpKwDYAkbCMJ20gCwDaSsI0kbCMJ20gCwDaSsI0kbCMJ20jCNpKwjSRsIwnbSMI2AJKwjSRsIwnbSMI2krDNA0nCNpKwjSRsAyAJ20jCNg8kCdsASMI2krANgCSuuuqqq6666qr/cgRXXXXVVVddddV/mfvuu+9WgK2tLf4nk8TzI4l/K0n8SyTxQJJ4IEn8W0jifpJ4fiTx/EjihZHEc5MEgCSemyQAJAEgiRdEEgCSAJAEgCQAJAEgCQBJAEgCQBIAkgCQxP0kASAJAEkASAJAEgCSkASAJAAkIQkASQBIQhIAkpAEgCQkASAJSUgCQBKSkMT9JCEJSUjigSQhCUlIQhKSkIQkJCEJSUhCEpKQxANJQhKSkMT9JCEJSQBIQhKSAJCEJAAkIQkASUgCQBIAkpAEgCQkIQlJAEgCQBIAkpCEJCQBIAkASQBIAkASAJIAkASAJAAkASCJ5yYJAEkASAJAEgCSeG6SAJDEc5MEgCTuJ4nnJgmAxWIBwH333XcrV1111VVXXXXVfxWCq6666qqrrrrqv8zZs2dvBdja2uL/Ckk8N0n8V5PEv5Yknh9JPDdJ3E8Sz00SAJJ4bpIAkMQLIgkASQBIAkASAJIAkASAJAAkASAJAEkASAJAEs9NEgCSAJAEgCQAJAEgCQBJSAJAEgCSkASAJAAkIQkASUgCQBKSuJ8kJHE/SUhCEveThCQkIQlJPJAkJCEJSUhCEpKQhCQeSBKSkIQkJCEJAElIQhKSAJCEJCQBIAlJAEhCEgCSkASAJCQhCUkASOJ+kgCQBIAkACQhCQBJAEgCQBIAkgCQBIAkACQBIAkASQBIAkASAJJ4bpIAkASAJAAkASCJ5yYJAEk8N0k8N0ncTxIbGxsAnD179lauuuqqq6666qr/KgRXXXXVVVddddV/ue3tbf61JPFvIYn/iSTxryGJB5LECyKJ+0ni30oSz00S95MEgCSemyQAJPHcJAEgCQBJAEgCQBIAkviPIgkASQBIAkASAJIAkASAJAAkASAJSQBIAkASkgCQBIAkJAEgCUkASEISkgCQhCQkASAJSUhCEgCSkIQkJCEJSUjiRSEJSUhCEpKQhCTuJwlJSOJ+kpDE/SQhCQBJSAJAEpIAkIQkACQBIAlJSEISAJIAkIQkJCEJAEkASAJAEgCSAJAEgCQAJAEgCQBJAEgCQBIAkgCQBIAknpskACQBIAkASQBI4n6SAJAEgCTuJwkASdxPEvdbLBYA3Hfffbdy1VVXXXXVVVf9VyG46qqrrrrqqqv+y/z93//9bwNsbW3xH0kS/1qSeH4k8fxI4t9KEv8SSTyQJF5UknhRSOJ+krifJO4niecmiecmiecmiRdEEgCSAJDEi0oSAJIAkASAJAAkASAJAEkASAJAEgCSAJAEgCQAJAEgCQBJAEgCQBIAkpAEgCQAJCEJAEkASEISAJKQBIAkJCEJAElIQhIAkpCEJCRxP0lIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEIS95OEJCQhCQBJSEISAJKQhCQAJCEJAElIAkASkgCQBIAkJAEgCQBJAEhCEgCSAJAEgCQAJAEgCQBJAEgCQBIAkgCQBIAkACQBIAkASQBIAkASAJJ4QSQBIAkASTw3SQBI4rlJ4rlJ4qqrrrrqqquu+i9HcNVVV1111VVX/Y8gif9tJPHcJPEvkcS/hyReEEncTxL/VpJ4bpJ4bpJ4bpIAkMS/RBIAkgCQBIAkACQBIAkASQBIAkASAJIAkASAJAAkASAJAEkASAJAEgCSAJAEgCQAJAEgCQBJSAJAEgCSkASAJAAkIQkASUjifpKQBIAkJCGJ+0lCEpKQxANJQhKSkIQkJCEJSUhCEpKQhCQkcT9JSEISkpAEgCQkIQkASUhCEgCSkASAJCQBIAlJAEgCQBKSAJAEgCQAJCEJAEkASAJAEgCSAJAEgCQAJAEgCQBJAEgCQBIAkgCQBIAkACQBIAkASQBIAkASAJJ4bpIAkASAJJ6bJAAkcT9JAEgC4OTJkwDcd999t3LVVVddddVVV/1XoXLVVVddddVVV/2XOXv27DMAtra2uOrZJPFAknggSbwgknhRSOJ+krifJO4niecmiecmiecmCQBJPDdJAEgCQBIAkgCQBIAkACTx/EgCQBIAkgCQBIAkACQBIAkASQBIAkASAJIAkASAJAAkASAJAEkASAJAEveTBIAk7icJAEncTxIPJIkHksQDSeJFIYnnxzYPJInnZhsASdzPNpK4n20kAWAbSQDYRhIAtpHEA9lGEraRxAPZRhK2kYRtJGEbSdhGEraRhG0kYRtJ2EYStpGEbSRhG0nYRhK2kYRtJGEbSdhGEraRhG0kYRtJ2EYStpGEbZ4fSdhGErZ5IEnY5oEkcb+zZ88+g6uuuuqqq6666r8KwVVXXXXVVVdd9V/mvvvuuxVga2uL/wqS+NeQxPMjiX8rSfxHksQLIon/CJJ4bpJ4bpJ4QSQBIIl/K0kASOIFkQSAJAAkASAJAEkASAJAEgCSAJAEgCQAJAEgCQBJAEgCQBIAkpAEgCQAJCEJAEkASEISAJKQhCQAJCEJSQBIQhKSuJ8kJCEJSUhCEpKQxAsiCUlIQhKSkIQkJAEgCUlIQhIAkpCEJAAkIQkASUgCQBKSAJCEJAAkASAJSUhCEgCSAJAEgCQAJAEgCQBJAEgCQBIAkgCQBIAkACQBIAkASQBIAkASAJIAkMQDSQJAEgCSAJAEgCQAJAEgiecmCQBJPDdJ3G+xWABw33333cpVV1111VVXXfVfhcpVV1111VVXXfVf5uzZs7cCbG9v868hiRdEEv9akvj3ksRzk8S/RBL/GpL4t5DE/SRxP0ncTxL3k8Rzk8Rzk8RzkwSAJF4QSQBIAkASAJIAkASAJAAkASAJAEkASAJAEs9NEgCSAJAEgCQAJAEgCQBJAEhCEveTBIAkACQBIAkASQBIAkAS95PE/SQBIIn7SeKBJPFAknh+JPEfwTYAkngg20jifraRBIBtJPHcbCMJANtIwjaSALCNJGwjCdtIwjaSsI0kbCOJ52YbSdhGEraRhG0kYRtJ2EYStpGEbSRhG0nY5vmRhG1eGEnYRhK2kYRtJGEbSdjmgSRhG0nYBkASttnY2ADg7Nmzt3LVVVddddVVV/1XoXLVVVddddVVV13130gSDySJF5Uk7ieJ/wiSeG6SeG6SeEEkASAJAEkASOKFkcQDSQJAEgCSAJAEgCQAJHE/SQBIAkASAJIAkASAJAAkIYn7SUISAJIAkMT9JAEgCQBJAEjifpIAkMT9JHE/STyQJB5IEi+IJP4tbAMgiedmG0nczzaSeH5sI4kHso0kHsg2krCNJF4UtpGEbSTxQLaRhG0kYRtJ2EYStpGEbSRhG0nYBkAStpGEbSRhG0nYRhK2kYRtJGGb50cStpGEbSRhG0nY5oEkYZurrrrqqquuuuq/FcFVV1111VVXXfVf5r777rsVYGtri/9skviPIIkXhSSemyT+I0niRSGJ+0nifpK4nyTuJ4nnJonnJonnJgkASQBI4l8iCQBJAEjigSTxgkgCQBIAkgCQxP0kASAJAEkASAJAEgCSkASAJCQhCQBJAEgCQBKSkIQkACQBIAkASUgCQBIAkpAEgCQkASAJSUgCQBKSkMT9JCEJSUhCEg8kCUlIQhKSkIQkJPFAkpCEJCQhiftJQhKSAJCEJCQBIAlJAEhCEgCSAJCEJAAkASAJSUhCEgCSAJAEgCQAJAEgCQBJAEgCQBKSAJAEgCQAJAEgCQBJAEjifpIAkASAJAAkASAJAEkASAJAEgCSAJDECyIJAEkASOJ+kgCQxGKxAOC+++67lauuuuqqq6666r8KwVVXXXXVVVdd9V/qvvvuuxVga2uL+0niv4oknh9JvKgk8W8hiQeSxANJ4oEk8YJI4j+aJJ6bJJ6bJAAk8YJIAkASAJIAkASAJAAkASAJAEkASAJAEgCSeG6SAJAEgCTuJwkASQBIAkASAJK4nyQAJAEgCQBJAEgCQBIAkpCEJCQBIAkASUgCQBIAkpAEgCQkASAJSUgCQBKSkIQkACQhCUlIQhKSkMS/RBKSkIQkJCEJSQBIQhKSkASAJCQhCQBJSAJAEpIAkIQkJCEJAElIQhKSAJAEgCQAJAEgCQBJAEgCQBIAkgCQBIAkJAEgCQBJAEgCQBIAkrifJAAkASAJAEkASAJAEgCSAJAEgCQAJAEgCQBJAEjiuUkCQBIPtFgsALjvvvtu5aqrrrrqqquu+q9EcNVVV1111VVX/Zc6e/bsrQBbW1v8e0nifypJ/EeSxAsiiftJ4n6SuJ8k7ieJ+0niuUniuUniBZEEgCT+I0gCQBIAkgCQBIAk7icJAEkASOJ+kgCQBIAkACQBIAlJAEgCQBIAkgCQBIAkACQBIAkASUhCEpIAkIQkJCEJAElIAkASkgCQhCQkASAJSUhCEveThCQkIQlJSEISkpCEJCQhCUlIQhKSkIQk7icJSUhCEgCSkIQkACQhCQBJSAJAEpIAkIQkJCEJAEkASAJAEgCSkIQkJCEJAEkASAJAEgCSAJAEgCQkASAJAEkASAJAEveTBIAkACQBIAkASQBI4oEk8cJIAkASAJIAkMRzkwSAJBaLBQBnz569lauuuuqqq6666r8Slauuuuqqq6666n80Sfx3kcSLQhL/Ekn8a0jiBZHEfzRJPDdJPDdJAEjiBZEEgCQAJAEgCQBJAEgCQBIAknhBJAEgCQBJ3E8SAJIAkMT9JAEgCQBJAEjifpIAkASAJAAkASAJAEkASAJAEgCSAJDE/SQBIIn7SeJ+krifJJ6bJJ4fSfxb2AZAEg9kGwBJ3M82knhhbCMJANtIwjaSeGFsIwnbSOL5sY0kbCMJ20jCNpIAsI0kbCMJ20jCNpIAsI0kbCMJ20jCNpKwzQNJwjb3k4RtJGEbSdjm+ZGEbSRhG0nY5oE2NjYAuO+++27lqquuuuqqq676r0Rw1VVXXXXVVVf9l7rvvvtuBbj++uv5zyKJ50cSz48kXlSS+I8giQeSxL+FJO4niedHEveTxP0k8dwk8dwk8YJIAkASAJJ4UUgCQBIAkgCQBIAkACRxP0kASAJAEveTBIAkACRxP0kASAJAEgCSkASAJAAkASAJAEkASAJAEgCSAJAEgCQAJCEJSUgCQBKSAJCEJAAkIYn7SUISkgCQhCQkIQlJPJAkJCEJSUhCEpKQxANJQhKSkIQkACQhCUlIAkASkpAEgCQkASAJSUhCEgCSkIQkJAEgCQBJAEgCQBIAkgCQBIAkACQhCQBJAEgCQBIAkpAEgCQAJAEgiftJAkASAJIAkMT9JAEgCQBJAEgCQBIAkgCQBIAkACTxgkgCQBJXXXXVVVddddV/KypXXXXVVVddddV/qfvuu+9W/o+TxH8kSfxrSeJFJYnnJonnJgkASfxLJAEgCQBJAEjiXyIJAEkASOJ+kgCQBIAk7icJAEkASEISAJIAkASAJCQBIAkASQBIAkASkgCQBIAkACQBIIn7SQJAEgCSuJ8k7ieJ+0nigSTx3CTxbyGJF8Q2kngg20jifraRBIBtJAFgG0k8kG0kYRtJ2EYStpHE/WwjCdtIwjaSsI0kbCOJB7KNJGwjCdtIAsA2krCNJGwjCQDbSMI2krCNJGwDIAnbSMI2krCNJGwjCdtIwjaSsI0kbCMJ20jCNpKwjSRs80CSmM/nANx33323ctVVV1111VVX/VeictVVV1111VVX/Zc6e/bsMwC2trYAkMS/hST+M0niuUniuUniXyKJB5LEA0nigSTxgkjifpL415DE/STx3CTx3CTxgkgCQBIAkgCQBIAkACQBIAkASQBIAkASAJJ4bpIAkMRzkwSAJO4nCQBJ3E8SAJIAkMT9JAEgCQBJAEhCEgCSAJAEgCQAJAEgCQBJ3E8SAJK4nyTuJ4n7SeKBJPHcJPEfxTaSeCDbSOJ+tpEEgG0kAWAbSQDYRhK2kcQLYxtJPD+2kYRtJGEbSdhGEgC2kYRtJGEbSQDYRhK2kYRtACRhG0nYRhK2AZCEbSRhG0nYRhK2uZ8kbPOikoRtJGEbSdgGYLFYAHD27NlncNVVV1111VVX/VeictVVV1111VVX/Ze67777bgXY2triXyKJ/2yS+J9MEi8KSdxPEveTxAsjiecmiecmCQBJ/GeQBIAkACRxP0kASAJAEveTBIAk7icJAEncTxIAkgCQhCQAJAEgCQBJSAJAEgCSAJAEgCQAJAEgCQBJAEjifpIAkMT9JPFAknggSTw/kvi3sg2AJB7INpK4n20kAWAbSQDYRhIAtpHEA9lGEraRhG0kYRtJ2EYStpGEbSTxQLaRhG0kYRtJANhGEraRhG0AJGEbSdhGEgC2kYRtJGEbAEnYRhK2kYRtJGEbAEnY5n6SsI0kbCMJ20jCNpKwzfMjCdtI4qqrrrrqqquu+m9B5aqrrrrqqquu+m+xvb3NfwZJPD+S+K8giQeSxL+GJF4QSfxbSeJ+knhuknhuknhBJAEgCQBJAEgCQBIAkgCQBIAkACQBIInnJgkASdxPEgCSAJCEJAAkASAJSQBIAkASkgCQBIAkJAEgCQBJAEhCEgCSAJAEgCQAJCEJAEncTxIAkgCQxP0kASCJ+0nigSTxQJJ4fiTxr2UbSTw320jifraRxAtjG0kA2EYStpHEi8o2krCNJGwjCQDbSMI2krCNJABsIwnbSALANpKwjSRsAyAJ20jCNgCSsI0kbCMJ2zyQJGwjCdtIwjaSsI0kbCMJ20jCNpKwjSRsIwnb3O/EiRMA/MM//MNvc9VVV1111VVX/VeictVVV1111VVX/Zc6e/bsrfwPJ4nnJonnJol/LUk8kCReEEm8IJK4nyTuJ4n7SeJfSxLPTRIAkviPIAkASQBIAkAS95MEgCTuJwkASdxPEgCSuJ8kACRxP0kASOJ+kgCQBIAkJAEgCQBJAEhCEgCSAJAEgCQAJAEgiftJAkAS95PE/STxQJJ4IEm8MJJ4QWxzP0k8N9tI4gWxjSQAbCOJB7KNJB7INpKwjSRsIwnbSMI2kngg20jCNpJ4INtIwjaSALCNJGwjCQDbSMI2kgCwjSRsIwkA20jCNpKwDYAkbCMJ20jCNpKwjSRsIwnbSMI2z00StpGEbSRhG0lcddVVV1111VX/bahcddVVV1111VX/pe67775bAba2tvi3ksR/BEn8R5LEv4ckXhBJ/EeQxP0k8YJI4gWRBIAkACQBIAkASQBIAkASAJJ4QSQBIInnJon7SQJAEveTBIAk7icJAElIAkASAJKQBIAkACQhCQBJAEhCEgCSAJAEgCQAJAEgCQBJAEjifpIAkMT9JHE/SdxPEs9NEv8WknhBbCOJB7KNJABsIwkA20gCwDaSeCDbSMI2knhutpGEbSRhG0nYRhIAtpGEbSRhG0kA2EYStpEEgG0kYRtJANhGErYBkIRtJGEbAEnYRhK2kQSAbSRhG0nYRhK2eWEkYRtJ2OaFWSwWANx33323ctVVV1111VVX/VciuOqqq6666qqr/svdd999twJsb2/zgkjiX0sSz48k/qNJ4l8iiQeSxANJ4t9CEveTxP0kcT9J3E8SL4wkXhBJAEjiP4IkACQBIInnJgkASdxPEveTBIAk7icJAElIAkAS95MEgCQkASAJAElIAkASAJKQBIAkACQBIAkASUhCEpKQBIAkACQhCUlIAkASkpCEJCQBIAlJAEhCEpKQBIAkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCQBJSEISkgCQhCQkIQlJSEISkpCEJCQBIAlJSEISkpAEgCQAJCEJSUhCEpIAkASAJCQhCUkASAJAEpIAkMT9JAEgiftJAkASkgCQBIAkJAEgCQBJ3E8SAJIAkMT9JAEgCQBJAEgCQBIAkgCQBIAkACRx1VVXXXXVVVf9tyK46qqrrrrqqqv+y509e/ZWgK2tLf6nkcRzk8R/NUn8Z5LEc5MEgCReEEkASAJAEgCSAJAEgCQAJAEgiecmCQBJAEjifpIAkMT9JHE/SQBI4n6SuJ8kACQhCQBJ3E8SAJKQBIAkACQhCQBJAEgCQBKSkIQkACQBIAlJSEISAJIAkIQkJCEJAElIQhKSkIQkACQhCUlI4n6SkIQkJCEJSUhCEpKQhCQkIQlJSEISAJKQhCQkASAJSUgCQBKSAJCEJAAkIQlJSAJAEgCSAJAEgCQAJAEgCQBJSEISkgCQBIAkJAEgCQBJSAJAEpIAkASAJCQBIIn7SQJAEveTBIAk7icJAEk8N0kASAJAEgCSAJAEgCQAJAEgCQBJAJw8eRKAf/iHf/htrrrqqquuuuqq/2pUrrrqqquuuuqq/5ck8R9JEv8aknggSbwgkrifJP4lkrifJO4niecmiRdEEgCS+PeQBIAkACTx3CQBIIn7SQJAEveTxP0kASAJSQBI4n6SuJ8kACQhCQBJ3E8SAJKQBIAkACQhCQBJAEgCQBIAkgCQBIAkACRxP0kASOJ+krifJB5IEs+PJP61bAMgiQeyjSTuZxtJPDfbSALANpKwjST+tWwjCdtIAsA2krCNJABsIwnbSALANpIAsI0kbCMJANtIAsA2krCNJABsIwnbAEjCNpKwDYAkbCMJ20jCNpKwzb/FfD4H4L777ruVq6666qqrrrrqvxrBVVddddVVV131X+6+++67FWBra4t/LUk8P5J4fiTxH00S/xJJPJAkXlSSeFFI4n6SeFFJ4rlJAkASL4gkACQBIAkASQBIAkASAJJ4QSQBIIn7SQJAEveTBIAk7ieJ+0nifpIAkIQkACQhCQBJ3E8SAJKQBIAkJAEgCQBJSAJAEgCSAJAEgCQkIQlJSAJAEgCSkIQkJAEgCUkASEISAJKQhCQAJCEJSUhCEveThCQkIQlJSEISkpDE/SQhCUlIQhIAkpCEJCQhCUlIAkASkpCEJCQhCUlIQhIAkgCQBIAkACQBIAkASUhCEpIAkIQkJCEJAElIAkAS95MEgCQkASCJ+0kCQBKSAJDE/SQBIAlJAEjifpIAkASAJJ6bJAAkASAJAEkASAJAEgCSuOqqq6666qqr/ltRueqqq6666qqr/svdd999twJsbW3x/Ejiv4Mknpsk/iWS+PeQxAsiiX8rSdxPEs9NEi+IJP4jSAJAEgCSeG6SuJ8kACRxP0kASEISAJK4nyTuJ4n7SeJ+kgCQhCQAJCEJAElIAkASAJKQBIAkACQhCQBJAEgCQBIAkgCQBIAk7icJAEncTxIPJIkHksS/lSSeH9tI4oFsIwkA20gCwDaSALCNJGwjiX8t20jCNpIAsI0kbCMJANtIAsA2kgCwjSRsIwkA20gCwDaSsA2AJGwDIAnbSMI2AJKwjSQAbCMJ20jCNgCSsI0kbCMJ20jCNpKwjSRsIwnbSMI2i8UCgPvuu+9Wrrrqqquuuuqq/2pUrrrqqquuuuqq/zbb29v8d5DEfyZJPJAkHkgS/xaSuJ8k7ieJ+0nihZHEc5PECyIJAEkASAJAEgCSAJAEgCQAJPGCSAJAEveTxHOTxP0kcT9JAEhCEgCSkASAJCQBIAlJAEhCEgCSuJ8k7icJAElIAkASAJKQBIAkACQBIAkASQBIAkASAJIAkMT9JHE/STyQJB5IEv9RbCOJB7KNJF4Y20jigWwjCdtIwjaSsI0kbCMJ20gCwDaSsI0kAGwjCdtIAsA2kgCwjSQAbCMJ2wBIwjYAkrCNJABsIwkA20jCNgCSsI0kbAMgCdtIwjYAkrCNJGwjCdtIwjYvisViAcDZs2efwVVXXXXVVVdd9V+NylVXXXXVVVdd9V/uH/7hH34HYGtri38NSfxrSOJFJYnnJonnJon/TJK4nyT+rSRxP0k8N0k8N0kASOI/giQAJAEgiftJAkAS95MEgCTuJ4n7SeJ+krifJO4niftJ4n6SuJ8kACQhCQBJSAJAEpIAkASAJCQBIAkASUgCQBIAkgCQBIAk7icJAEncTxL3k8T9JPH8SOLfwzaSeCDbSOJ+tpEEgG0k8UC2kcSLyjaSsI0kHsg2kgCwjSRsIwkA20gCwDaSALCNJABsIwkA20jCNgCSsA2AJGwjCQDbSMI2AJKwjSRsAyAJ20jCNpKwzQNJwjaSsI0kbCMJ20jiqquuuuqqq676b0Xlqquuuuqqq676X08S/10k8a8hiQeSxItCEveTxP0kcT9JvDCSeG6SeEEkASAJAEkASAJAEgCSAJAEgCSemyQAJPHcJHE/SQBI4n6SuJ8k7ieJ+0nifpK4nyQkASAJSQBIQhIAkpAEgCQkASAJAElIAkASAJKQBIAkACQBIAkASQBIAkAS95MEgCQeSBL3k8TzI4l/C9tI4t/CNpJ4INtIwjaSsI0kbCMJ20jigWwjCdtIAsA2kngg20gCwDaSALCNJABsIwkA20gCwDaSALCNJABsIwnbAEjCNpIAsI0kbAMgCdtIwjYPJAnbSMI2krCNJGwjCdtIwjbz+RyA++6771auuuqqq6666qr/alSuuuqqq6666qr/cmfPnr0VYGtri+cmif9Mkvi3ksS/RBIPJIkXlST+o0niuUniuUkCQBL/ESQBIInnJgkASdxPEveTBIAkJAEgCUkASEISAJKQBIAkJAEgCUncTxL3k8T9JCEJAElIAkASAJKQBIAkJAEgCQBJAEhCEgCSAJDE/SQBIAkASdxPEveTxANJ4vmRxL+GbSTx3GwjifvZRhIAtpHEA9lGEi8q20jCNpJ4INtIAsA2krCNJABsIwkA20gCwDaSALANgCRsAyAJ2wBIwjaSALCNJABsIwnbAEjCNgCSsI0kbAMgCdtIwjaSsI0kbPPCLBYLAM6ePXsrV1111VVXXXXVfzUqV1111VVXXXXV/wqS+NeQxItKEs9NEv8SSfx7SOIFkcT9JPEvkcT9JPGikMQLIgkASQBIAkASAJIAkASAJAAk8dwkASCJ+0kCQBL3k8T9JHE/SdxPEveTxP0kcT9J3E8SkgCQhCQAJCGJ+0nifpIAkIQkACQhCQBJAEhCEgCSAJAEgCQAJAEgCQBJ3E8S95PE/STxQJJ4QSTxwtgGQBLPzTaSuJ9tJPHcbCOJB7KNJGwjCdtIwjaSsI0kHsg2krCNJABsI4kHso0kAGwjCQDbAEjCNgCSALCNJABsIwkA20jCNgCSsA2AJGwDIAnbSALANpKwDYAkbCMJ20jCNg8kCdtIwjaSsI0k5vM5APfdd9+tXHXVVVddddVV/9WoXHXVVVddddVV/+Xuu+++WwG2trbY2tri4OCAfytJ/E8hiQeSxANJ4gWRxItCEveTxItKEi+IJP4jSQJAEs9NEs9NEveTxP0kcT9J3E8S95PE/SQhCQBJSOJ+krifJCQBIAlJAEhCEgCSkASAJCQBIAkASUgCQBIAkgCQhCTuJwkASQBIAkAS95PEA0nigSTxbyGJ58c2knhBbCOJB7KNJP61bCOJB7KNJB7INpIAsI0kAGwDIAkA20gCwDaSALCNJABsAyAJ20gCwDaSALCNJABsIwnbAEjCNgCSsI0kbPNAkrCNJGwjCdtIwjZXXXXVVVddddX/CARXXXXVVVddddV/i3/4h3/4bYCtrS3+q0ji30oS/5Ek8YJI4t9KEveTxHOTxAsiCQBJAEgCQBIAkgCQBIAkACQBIInnJgkASdxPEgCSuJ8k7ieJ+0nifpK4nyQkASAJSdxPEveThCQAJCGJ+0lCEgCSkASAJCQBIAlJAEhCEpKQBIAkJCEJSUhCEgCSkIQkJCEJSQBIAkASkgCQhCQkIQlJSEISAJKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkASAJCQhCUkASEISkpCEJAAkIQlJSAJAEpKQhCQkIQlJAEgCQBKSkIQkACQhCQBJAEhCEgCSkMT9JCEJAElIAkASkgCQhCTuJwlJAEjifpK4nyTuJ4n7SQJAEpIAkMT9JAEgCQBJAEjiuUliPp8DcN99993KVVddddVVV13134HKVVddddVVV131P4Yk/iNI4kUliecmiX+JJP41JPFvIYn7SeJ+krifJF4YSTw3SQBI4j+SJAAk8dwkcT9JAEjifpK4nyTuJ4n7SUIS95PE/SRxP0lI4n6SkASAJCRxP0lIAkASkgCQhCQAJCEJAEkASEISAJIAkASAJAAkASAJAEkASOJ+krifJO4niecmiX8P20jigWwjifvZRhL/EttIwjaSsI0kHsg2krCNJABsIwkA20jCNpIAsI0k7mcbSQDYRhIAtgGQhG0AJAFgG0kA2EYSALaRBIBtACRhG0kA2EYStgGQhG0AJGEbSdhGErZ5IEnYRhK2WSwWAJw9e/ZWrrrqqquuuuqq/w4EV1111VVXXXXVf4v77rvvVoCtrS3+JZJ4fiTxopLEv5Uk/iWSeCBJvKgk8R9BEveTxHOTxAsiCQBJAEji+ZEEgCQAJAEgiecmCQBJ3E8Sz00S95PE/SRxP0lI4n6SuJ8kJAEgCUncTxKSuJ8kJAEgCUncTxKSAJCEJAAkIQkASQBIQhIAkgCQhCQkIQlJSEISkpCEJCQBIAlJSEISkpCEJCQBIAlJSEIS95OEJCQhCUlIQhKSkIQkJCEJSQBIQhKSkIQkJCEJSQBIQhIAkpAEgCQkIQlJSEISkpCEJCQhCQBJSEISkgCQhCQkIQlJSEISAJKQxP0kIQkASUgCQBKSkASAJCQBIAlJ3E8S95PE/SQhCQBJ3E8S95PE/SQBIInnJgkASQBIAkAS8/kcgPvuu+9Wrrrqqquuuuqq/w5Urrrqqquuuuqq/xb33XffrQBbW1v8TyKJf4kk/j0k8YJI4n6SuJ8k7ieJ+0nihZHEc5MEgCT+JZIAkMS/RBIAknhukrifJAAkcT9J3E8S95OEJO4niftJQhL3k8T9JCGJ+0lCEveThCQAJCGJ+0nifpKQBIAkACQhCQBJSAJAEgCSAJAEgCQAJAEgCQBJ3E8S95PEA0ni+ZHEi8o2knhutpHEi8o2krCNJGwjCdtIwjaSeCDbSOKBbCMJANtIAsA2krifbSQBYBtJANgGQBIAtpEEgG0AJAFgG0kA2AZAErYBkIRtACRhGwBJ2EYSALaRhG0AJGEbSdhGErZ5bvP5nKuuuuqqq6666r8Vlauuuuqqq6666n8ESfxHkMSLShL/ESTxQJJ4IEm8IJL4jyaJ5yaJF0QSAJJ4UUgCQBIAknhukgCQxP0k8dwkcT9J3E8SkrifJO4niQeSxP0kIYn7SUIS95OEJO4nCUkASEISAJKQxP0kASAJSQBIQhIAkgCQhCQAJAEgCQBJAEjifpK4nyTuJ4kHksQLIokXxDYAknhutpHE/WwjCQDbSALANpL417KNJB7INpIAsI0kAGwjCQDbSOJ+tpEEgG0AJAFgG0kA2AZAEgC2AZCEbQAkAWAbSQDYRhIAtpEEgG0kYRsASdgGQBK2kYRtHkgStpGEbebzOQD/8A//8DtcddVVV1111VX/HQiuuuqqq6666qr/Fv/wD//wOwDXX389L4wknh9JvKgk8W8lif9IknhBJHE/STw/krifJO4niecmiecmiX+JJAAkASAJAEm8IJIAkMRzk8T9JAEgiftJ4n6SkMT9JHE/SUgCQBKSuJ8kJHE/SUjifpKQxP0kIYn7SUISAJKQBIAkJAEgCUkASEISAJKQhCQkASAJAEkASAJAEgCSkIQkJCEJSUhCEpKQhCQkASAJSUhCEpKQxAsjCUlIQhKSkASAJCQhCUlIQhKSkIQkJCEJSQBIAkASkpCEJCQBIAkASUhCEpIAkIQkACQhCQBJSAJAEpK4nyQkASAJSUgCQBKSuJ8kJHE/SUgCQBKSAJCEJO4niftJ4n6SuJ8k7icJAEncTxIAkgCQBIAkrrrqqquuuuqq/3ZUrrrqqquuuuqq/5ck8dwk8S+RxANJ4oEk8UCSeEEk8aKQxItKEs9NEs9NEgCS+LeQBIAknpskACRxP0ncTxIAkrifJCRxP0ncTxIPJIn7SUIS95OEJO4nCUncTxKSuJ8kJHE/SUgCQBKSAJCEJAAkIQkASUgCQBIAkpAEgCQAJAEgiftJAkAS95PE/STx3CTxn8E2kgCwjSQAbCOJ58c2krCNJJ4f20gCwDaSALCNJABsIwkA20jifraRBIBtACQBYBsASQDYRhL3s40kAGwDIAnbAEgCwDaSALANgCRsAyAJ20gCwDaSsA2AJGwjCds8t/l8DsB99913K1ddddVVV1111X8HKlddddVVV1111X+Ls2fP3gqwtbWFJP4jSOI/kiT+q0jiX0MS95PEi0ISL4gkACQBIAkASQBIAkASz00SAJJ4bpK4nySemyQkcT9J3E8S95OEJO4nCUncTxKSuJ8kJHE/SUhCEgCSkIQkACQhiftJQhIAkpAEgCQkASAJSQBIQhIAkgCQBIAkACQBIAkASdxPEgCSeCBJPDdJ/HvYRhL3s40kXhjbSOJfYhtJ2EYSALaRBIBtJAFgG0kA2EYSALYBkASAbSRxP9tI4n62kQSAbQAkAWAbAEkA2AZAErYBkIRtACQBYBtJANhGErYBkIRtACRhG0nYBkAStpGEbebzOQBnz569lauuuuqqq6666r8Dlauuuuqqq6666n8sSTw/knhRSeJFIYl/iST+NSTxQJJ4UUjifpK4nyReVJJ4QSTx7yEJAEm8IJK4nySemyQeSBL3k8T9JCGJ+0nigSQhiftJQhL3k4QkHkgSkrifJCQBIAlJSAJAEpIAkIQkACQhCQBJSAJAEpIAkASAJAAkASCJ+0kCQBL3k8QDSeK5SeLfwjaSeEFsIwkA20jigWwjCdtIwjaSsI0kHsg2knhhbCMJANtI4n62kQSAbQAkAWAbAEkA2AZAEgC2AZAEgG0AJAFgG0kA2AZAErYBkIRtACRhGwBJ2AZAEraRhG0AJGEbSdhGEvP5nKuuuuqqq6666r8Vlauuuuqqq6666r/FfffddyvA1tYW/9Uk8R9BEg8kiReVJP4jSOJ+knhuknhBJAEgCQBJAEgCQBIAkgCQxAsiCQBJ3E8S95MEgCTuJwlJ3E8S95PEA0nifpKQxANJQhL3k4Qk7icJSUjifpKQxP0kIYn7SUISAJKQBIAkJCEJAEkASEISAJIAkASAJAAkASAJAEncTxL3k8T9JPH8SOJFZRsASTyQbSTxwthGEi8q20jigWwjCQDbSOL5sY0k7mcbSdzPNpK4n20kcT/bAEgCwDYAkgCwDYAkbAMgCQDbSALANgCSsA2AJGwDIAnbSMI2AJKwjSRs89zuu+++W7nqqquuuuqqq/47EFx11VVXXXXVVf9t7rvvvlsBtra2+PeSxHOTxL+VJP4jSeIFkcT9JHE/SdxPEveTxAsjiecmCQBJ/EeQBIAknpsk7ieJ5yaJB5LE/SRxP0lI4n6SkMT9JCGJB5KEJO4nCUlI4n6SkMT9JCEJSQBIQhKSAJCEJAAkIQlJAEhCEpKQBIAkACQhCUlIQhKSkIQkJAEgCUlIQhKSkIQkJAEgCUlIQhKSuJ8kJCEJSUhCEpKQBIAkJCEJSUgCQBKSkASAJCQBIAlJSEISAJKQhCQkIQkASQBIQhKSkASAJCQBIAlJAEhCEgCSkIQkACQhCUncTxKSuJ8kJHE/SUhCEgCSkIQk7icJSQBIQhL3k8T9JCEJAElIAkASkgCQxP0kASCJ+0liPp8DcPbs2Wdw1VVXXXXVVVf9dyG46qqrrrrqqqv+29x33323AmxtbfHcJPH8SOLfQxLPTRL/Ekk8kCQeSBIPJIkXRBL/0STx3CTxgkgCQBIAkgCQBIAkACQBIAkASTw3SQBI4n6SeG6SuJ8kJHE/SdxPEpK4nyQeSBKSuJ8kJPFAkpDEA0lCEveThCQkcT9JSOJ+kpAEgCQkIQkASUgCQBIAkpCEJCQBIAkASQBIAkASkpCEJAAkIQkASUhCEgCSkIQkJCEJSdxPEpKQxANJQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpAEgCQAJCEJSUhCEpIAkIQkJCEJSQBIQhIAkpDE/SQhiftJQhKSAJCEJCQBIAlJSOJ+kpDE/SQhCUkASEIS95OEJO4niftJ4n6SuJ8k7icJAEncTxIA8/kcgPvuu+9Wrrrqqquuuuqq/y5Urrrqqquuuuqq//Uk8R9JEv+RJPGCSOJ+knh+JHE/SdxPEs9NEs9NEv+RJAEgiecmiecmiftJ4oEkcT9JPJAk7icJSTyQJCRxP0lIQhL3k4QkJHE/SUhCEveThCQkASAJSUgCQBKSuJ8kJAEgCUkASAJAEpIAkASAJAAkASCJ+0kCQBIPJIkHksSLQhIvjG0kcT/bSALANpIAsI0kXlS2kcQD2UYSz49tJHE/20jifraRxP1sI4n72QZAEvezDYAkAGwDIAkA2wBIAsA2AJIAsI0kAGwDIAnbAEjCNgCSsI0kbAMgCdtIYjabAXDffffdylVXXXXVVVdd9d+F4Kqrrrrqqquu+m/zD//wD78NcN111/EfTRIvCkn8SyTxryGJF0QSLwpJvKgk8dwk8dwkASAJAEm8KCQBIInnJgkASdxPEgCSuJ8k7ieJB5LE/SQhiftJQhL3k4QkHkgSknggSUhCEveThCQkcT9JSEIS95OEJO4nCUkASEISkgCQhCQAJAEgCUkASAJAEgCSAJAEgCQkIQlJAEhCEpKQhCQkIQkASUhCEpKQhCQkIQlJSEISkpCEJCQhCQBJSEISkpCEJCQhCUlIQhKSAJAEgCQAJAEgCQBJSEISkgCQhCQAJCEJAElIQhIAkpCEJAAkIQlJ3E8SkrifJCQhiftJQhKSuJ8kJHE/SUjifpKQxP0kcT9JSOJ+krifJAAkcT9JXHXVVVddddVV/+NQueqqq6666qqr/seRxPMjiX8PSfxHkMQDSeLfQhL/GpK4nyReFJL4l0gCQBIAkgCQxAsiiecmiecmiftJ4n6SkMT9JPFAknggSTyQJCTxQJKQhCQeSBKSeCBJSEIS95OEJCQBIAlJSAJAEpKQBIAkJAEgCUkASAJAEpIAkASAJAAkASCJ+0nifpK4nySemyT+LWwjiQeyjSQAbCMJANtI4l/LNpIAsI0kAGwjCQDbSOJ+tpHE/WwjiQeyjSTuZxsASdzPNgCSuJ9tACQBYBsASQDYBkASALYBkIRtACQBYBtJANhGErYBkIRtACRhm/l8DsB99933dK666qqrrrrqqv8uVK666qqrrrrqqv82Z8+evRVga2uLfytJ/EeSxL+HJB5IEi8KSdxPEveTxItKEi+IJAAk8W8hCQBJPDdJPDdJ3E8S95PEA0nifpKQxP0kIYn7SUISDyQJSUjigSQhCUncTxKSkMQDSUISkrifJCRxP0lI4n6SkASAJCQBIAlJAEgCQBIAkgCQBIAkACQBIIn7SeKBJPHcJPGvYRtJPJBtJPHC2EYSL4htJGEbSQDYRhIvjG0kcT/bSOJ+tgGQxP1sAyCJ+9kGQBL3sw2AJO5nGwBJANgGQBIAtgGQBIBtACRhGwBJ2AZAErYBkIRtACRhG0nM53MAzp49+wyuuuqqq6666qr/LlSuuuqqq6666qr/Nvfdd9+tAFtbW/xLJPGiksRzk8Rzk8S/RBIPJIkHksSLShL/ESRxP0k8N0n8SyQBIAkASQBIAkASAJJ4bpIAkMRzk8T9JHE/SdxPEg8kiQeSxANJQhL3k4QkJPFAkpCEJB5IEpKQxP0kIQlJPJAkJCEJAElIQhIAkpCEJAAkIQkASUgCQBIAkpAEgCQAJAEgCQBJ3E8S95PEA0ni+ZHEv8Q2knhhbCMJANtI4oFsIwnbSMI2kviX2EYSALaRxP1sI4n72QZAEvezDYAk7mcbAEnczzYAkrifbQAkcT/bAEgCwDYAkgCwDYAkAGwDIAnbAEjCNgCSsA2AJGwjCdvMZjMAzp49eytXXXXVVVddddV/FypXXXXVVVddddV/m/vuu+9WgK2tLe4nif8ukviPJIkXRBL3k8T9JHE/SdxPEi+MJJ6bJAAk8R9BEs9NEgCSuJ8k7ieJ+0nifpKQxP0kIYn7SUISDyQJSTyQJCQhiQeShCQk8UCSkIQk7icJSUhCEveThCQkASAJSUgCQBKSAJCEJAAkIQkASQBIAkASkrifJAAkASCJB5LE/STxwkjigWxzP0k8N9tI4j+SbSQBYBtJANhGEgC2kcT9bCOJB7KNJB7INgCSuJ9tACRxP9vcTxIAtrmfJABsAyAJANsASALANgCSALCNJABsAyAJ2wBIwjaSsA3AfD4H4L777ruVq6666qqrrrrqvwuVq6666qqrrrrqfy1JPDdJvCgk8S+RxANJ4oEk8UCSeEEk8R9BEveTxHOTxAsiCQBJAEgCQBIAkgCQBIAkACTx3CTx3CRxP0ncTxL3k8QDSeKBJPFAkpDEA0lCEs9NEpKQxANJQhKSeCBJSEISDyQJSUjifpKQxP0kIQkASUgCQBKSAJCEJAAkASAJAEkASAJAEveTxP0k8UCSeFFJ4gWxjSTuZxtJANhGEgC2kYRtJPHcbCMJ20gCwDaSeG62kQSAbSRxP9sASOJ+tgGQxAPZBkAS97MNgCQeyDYAkrifbQAkAWCb+0nCNgCSALANgCRsAyAJANtIAsA2krANgCSuuuqqq6666qr/EahcddVVV1111VX/bc6ePfsMgK2tLV4YSfx7SOK/miReEEncTxLPjyTuJ4kXRhLPTRL/kSQBIInnJon7SeJ+krifJO4niQeSxANJQhIPJAlJPJAkJCGJ5yYJSUjigSQhCUlI4n6SkIQkJHE/SUhCEgCSkIQkACQhCQBJSAJAEpIAkASAJCQBIIn7SQJAEveTxP0k8dwk8W9lG0n8W9hGEraRxL/ENpK4n20kAWAbSTyQbSTxQLYBkMQD2QZAEvezzf0kcT/bAEjifrYBkMT9bAMgCdsASALANgCSsA2AJGwDIAnbAEjCNrPZDID77rvvVq666qqrrrrqqv8uBFddddVVV1111X+r++6771aAra0tJPGiksR/JEk8kCT+NSTxgkjiRSGJF5UknpsknpskACQBIIkXhSQAJPHcJAEgiftJ4n6SuJ8k7ieJ+0lCEveThCQeSBKSeCBJSOK5SUISknhukpCEJCTxQJKQhCQkcT9JSEIS95OEJCQBIAlJAEhCEgCSkASAJCQhCUkASAJAEpKQhCQAJCEJSUhCEgCSkIQkJAEgCUlIQhKSkIQkJCEJSUhCEpIAkIQkJCEJAElIAkASkgCQhCQkIQlJSEISkpCEJCQBIAlJAEhCEgCSkIQkACQhiftJQhKSuJ8kJCEJSdxPEpKQhCTuJwlJSEIS95OEJCTxQJKQxANJQhL3k8T9JCGJ+0nifpK4nyQAZrMZAPfdd9+tXHXVVVddddVV/50Irrrqqquuuuqq/1Znz569FWBra4t/L0k8N0k8N0n8a0nigSTxbyGJfw1J3E8SLwpJ/EskASAJAEkASOIFkcRzk8S/RBL3k8QDSeKBJPHcJCGJB5KEJCQhiQeShCQkIYnnJglJSEISDyQJSUjifpKQhCTuJwlJAEhCEpKQhCQkIQlJAEgCQBKSkIQkJAEgCUlIQhIAkpCEJAAkIQlJSAJAEpKQhCQkIQlJSEISkpAEgCQkIQlJAEhCEpKQhCQkIQlJAEgCQBKSkASAJAAkIQlJSEISkpCEJAAkIQlJAEhCEpIAkIQkJCGJ+0lCEpKQxP0kIQlJSOKBJCEJSTyQJCQhiftJQhKSuJ8kJHE/SdxPEpK4nyTuJ4n7zedzAM6ePXsrV1111VVXXXXVfycqV1111VVXXXXV/2iS+M8miX8PSTyQJF4UkrifJO4niReVJF4QSQBI4t9CEgCSeG6SeG6SuJ8kHkgS95OEJO4nCUncTxKSeG6SkIQknpskJCGJ5yYJSUhCEs9NEpKQhCTuJwlJSOJ+kpCEJAAkIQlJAEhCEgCSAJCEJAAkASAJAEkASOJ+krifJB5IEs+PJF4Q2wBI4oFsI4n72UYSALaRxPNjG0k8P7aRBIBtJHE/20jifraRxP1sI4nnZhsASTyQbe4niQeyDYAkHsg295MEgG3uJwkA2wBIAsA2AJKwDYAkAGwDIAnbAEhiNpsBcN99993KVVddddVVV13134ngqquuuuqqq676b3XffffdCrC9vc2LShLPTRIvCkn8SyTxQJJ4IEm8qCRxP0n8W0nifpJ4bpL4l0gCQBIAkgCQBIAkACTx3CQBIInnJon7SeJ+knggSTyQJB5IEg8kCUlI4rlJQhKSeG6SkIQkJPHcJCEJSUhCEg8kCUlIQhIAkpCEJCQBIAlJSAJAEpIAkIQkJCEJAElIQhKSkIQkJAEgCUlIQhKSkIQkJCEJSUhCEpKQhCReGElIQhKSkIQkJCEJSUhCEpKQhCQkASAJSUhCEpKQhCQkIQkASUgCQBKSAJCEJCQhCUlIQhIAkpCEJO4nCUlIQhKSuJ8kJCEJSUjigSQhCUk8kCQkIQlJ3E8SkpDE/SQhiftJQhL3k8T9JCEJAElIAkASV1111VVXXXXV/whUrrrqqquuuuqq/1b33XffrQCbm5v8R5PEv0QS/5Ek8aKQxP0kcT9J3E8SL4wknpskACTxH0ESz00SAJK4nyTuJ4n7SeKBJPFAknggSUjiuUlCEpJ4bpKQhCQk8dwkIQlJSEISz00SkpCEJB5IEpKQxP0kIYn7SUISAJKQBIAkJAEgCQBJAEgCQBIAkrifJO4niecmiX8P20jifraRBIBtJPFAtpGEbSRhG0nYRhIvjG0kAWAbAEnczzaSeCDbAEjiudnmfpJ4brYBkMQD2eZ+krifbe4nCQDb3E8StgGQBIBtACRhGwBJ2AZAEn3fA3DffffdylVXXXXVVVdd9d+JylVXXXXVVVdd9d/q7NmzzwDY2triuUniuUniP5MkHkgSDySJB5LECyKJ/wiSuJ8knpskXhBJAEgCQBIPJAkASQBIAkASz00Sz00S95PE/SRxP0lI4n6SkMT9JCGJB5KEJJ4fSUhCEs+PJCQhCUk8P5KQhCQkIYkHkoQkJCGJ+0lCEpIAkIQkJAEgCUkASEISAJIAkIQkACRxP0kASOJ+krifJJ6bJP4tbCOJ+9lGEs/NNpJ4UdlGEgC2kcQLYhtJ3M82AJJ4INvcTxLPzTb3k8QD2eaBJHE/29xPEvezDYAk7mcbAEnYBkASALYBkIRtACRhm9lsBsDZs2efwVVXXXXVVVdd9d+JylVXXXXVVVdd9d/qvvvuuxVga2uLfytJPDdJPDdJ/GeSxAsiiftJ4n6SuJ8k7ieJF0YSz00SLypJ/EskASCJ5yaJ+0nifpK4nyQeSBIPJIkHkoQkHkgSkpDE8yMJSUhCEs+PJCQhCUlIQhLPTRKSkIQkJHE/SUhCEveThCQkASAJSQBIQhIAkpAEgCQAJAEgCQBJ3E8SAJJ4IEk8N0m8qGwDIIkXxDaSeCDbSMI2krCNJGwjCdtIAsA2kgCwjSQAbCOJB7KNJB7INpJ4fmwDIInnxzYPJIkHss39JHE/29xPEgC2uZ8kAGwDIAnbAEgCwDYAkrANgCSuuuqqq6666qr/EahcddVVV1111VX/I0niP5skHkgSL4wkHkgSL4gk/qNJ4rlJ4rlJAkAS/xqSAJDEc5MEgCTuJ4n7SeJ+krifJB5IEg8kCUk8kCQk8dwkIQlJSOL5kYQkJCEJSUji+ZGEJCQhCUlI4oEkIQlJSAJAEpKQxP0kIQkASUgCQBKSAJAEgCQAJAEgCQBJAEjifpJ4IEk8P5J4QWwDIInnZhtJANhGEgC2kcSLyjaSeG62kQSAbSTxQLaRxAPZ5n6SeG62eSBJPD+2uZ8kHsg295PE/WxzP0kA2AZAEgC2AZCEbe4nCdsASGJ7exuAf/iHf/htrrrqqquuuuqq/05Urrrqqquuuuqq/1Znz569FWBra4t/iSSemyReFJL415LEi0oSL4gk7ieJf4kk7ieJF4UkXhBJAEgCQBIAkgCQxAsiiecmiX+JJO4niQeShCQeSBLPTRKSkMTzIwlJSEISknhBJCEJSUhCEpKQxHOThCQkIYkHkoQkJAEgCUlIAkASkgCQhCQAJCEJAEkASAJAEgCSuJ8k7ieJB5LEv4Yknh/bSOKFsY0kXhDbSOKBbCOJ58c2AJK4n20AJPHcbAMgiRfENg8kiedmm/tJ4oFscz9J3M82AJIAsA2AJABsAyAJANtIAsA2V1111VVXXXXV/xhUrrrqqquuuuqq/1b33XffrQBbW1v8R5HEv0QS/x6SeEEk8aKQxP0k8aKSxAsiiX8PSQBI4rlJ4rlJ4n6SeCBJ3E8SknggSTyQJCTx/EhCEpJ4YSQhCUlIQhKSeGEkIQlJSEISDyQJSUhCEveThCQkASAJSUgCQBKSAJAEgCQAJAEgCQBJAEjifpK4nyQeSBL/HraRxP1sIwkA20jigWwjCdtIwjaSeCDbSALANpIAsI0kHsg2kngg2wBI4rnZ5oEk8YLY5oEk8UC2eSBJ3M8295MEgG3uJwnb3E8StgGQhG0AJDGbzQC47777buWqq6666qqrrvrvROWqq6666qqrrvpvd9999916zTXXPHhra4uDgwMk8R9JEv8SSTyQJB5IEv8Wkvi3ksT9JPHcJPGCSAJAEgCSAJAEgCQAJAEgiRdEEs9NEveTxP0k8UCSeCBJPJAkJPFAkpCEJJ4fSUhCEpKQhCReGElIQhKSkIQkJCGJ5yYJSUhCEpK4nyQkIYn7SUIS95OEJAAkASAJSQBIAkASAJK4nyQAJPFAknggSfxb2EYS97ONJJ6bbSTxL7GNJF4Y20jigWwjiedmm/tJ4vmxzQNJ4gWxzQNJ4oFscz9J3M8295MEgG0AJAFgGwBJ2AZAEra56qqrrrrqqqv+xyC46qqrrrrqqqv+2509e/ZWgK2tLV4QSTw3STw3SfxLJPHvIYkHksSLQhL3k8T9JHE/SbwwknhukgCQxH8ESQBI4rlJ4n6SuJ8k7ieJB5LEA0lCEg8kCUk8N0lIQhKSeGEkIQlJSEISkpCEJF4YSUhCEpKQhCQeSBKSkIQkACQhCUkASEISkgCQhCQkIQkASQBIAkASAJKQhCQkASAJSUhCEpKQhCTuJwlJSEISkpCEJCQhCUncTxKSkASAJCQhCQBJSEISkgCQBIAkACQBIAlJSEISAJKQBIAkJCEJAElIQhKSuJ8kJCEJSUhCEveThCQkIQlJSEISknh+JCEJSUhCEpJ4IElIQhKSeCBJSEIS95OEJO4nCUncTxIA29vbANx33323ctVVV1111VVX/XejctVVV1111VVX/Y8iif9qknggSTyQJF5UkrifJP6tJHE/STw3SbwgkgCQxItCEgCSeG6SAJDE/SRxP0ncTxL3k8QDSeK5SeK5SUISL4gkJCEJSUjiRSUJSUhCEpKQhCQk8fxIQhKSkIQk7icJSUgCQBKSkASAJCQBIAkASUgCQBIAkgCQxP0kcT9JPJAkXhBJPJBt7ieJF8Y2kgCwjSReVLaRBIBtJAFgG0nczzYAkngg2wBI4vmxzXOTxAtjm+cmiQeyzQNJ4n62uZ8kAGwDIAkA2wBIAsA2ALPZDIB/+Id/+G2uuuqqq6666qr/bgRXXXXVVVddddV/u/vuu+9WgK2tLZ4fSTw3STw3STw3SfxnksSLQhL3k8T9JHE/SbwwknhukviXSAJAEgCSAJDECyKJ5yaJf4kk7icJSdxPEpJ4IElI4rlJQhKSkMQLIwlJSEISkpCEJCQhCUn8SyQhCUlIQhKSkMQDSUISkrifJCQhCQBJSAJAEpKQhCQAJAEgCQBJAEhCEgCSkASAJCQhCQBJSEISkpCEJJ6bJCQhCUlIQhL3k4QkJCEJSUhCEpIAkASAJCQhCQBJAEhCEgCSkASAJCQBIAlJSEISAJKQhCQkIYkHkoQkJCEJSUhCEpJ4QSQhCUlIQhKSkMRzk4QkJCGJB5KEJCTxQJJ4IEncTxKSuOqqq6666qqr/kehctVVV1111VVX/be77777bgXY3NzkP5skHkgSDySJB5LEA0niBZHEfzRJPDdJPDdJAEji30ISAJJ4bpJ4bpK4nyQeSBIPJIkHkoQkHkgSknhBJCEJSUhCEv9akpCEJCQhCUlIQhKSkIQknpskJCEJSdxPEpKQxP0kIQkASUgCQBIAkpAEgCQAJHE/SQBI4oEk8UCS+LewjSQeyDaSALCNJJ4f20jigWwjiedmG0kA2EYSD2QbAEk8P7Z5IEm8KGzz/EjiudnmgSRxP9vcTxL3sw2AJABsAyAJ2wD0fQ/AfffddytXXXXVVVddddV/NypXXXXVVVddddX/GJL4jySJ/0ySeEEkcT9J3E8S95PE/SRxP0m8KCTxgkgCQBIAkgCQBIAkACTxgkjiuUnifpK4nyQeSBIPJInnJonnJglJSOJfIglJSEISkpCEJCQhCUlIQhKSeFFJQhKSkIQkJHE/SUhCEpIAkIQkJAEgCUkASEISAJIAkASAJAAkASCJ+0nigSTx3CTxorKNJB7INpIAsI0kAGwjCdtI4rnZRhIPZBtJ3M82kgCwDYAkHsg2AJJ4YWzz3CTxorLNc5PEA9nmgSQBYJv7SQLANgCSALANgCRmsxkAZ8+efQZXXXXVVVddddV/NypXXXXVVVddddV/u3/4h3/4HYBrr72W5yaJ5yaJ5yaJf4kkHkgSL4wkHkgSL4gk/qNJ4n6SeEEk8R9BEgCSeG6SuJ8k7ieJ+0nigSTxQJKQxANJQhLPjyQkIQlJSOLfSxKSkIQkJCEJSUhCEpKQhCSemyQkIQlJ3E8SkrifJCQBIAlJAEgCQBKSAJDE/SQBIIn7SeKBJPGCSOK52eZ+kngg20jiudlGEg9kG0nYRhIPZBtJANhGEvezjSTuZxtJPDfb3E8SLwrb/Esk8YLY5oEk8UC2uZ8kAGxzP0nY5n6SsM1VV1111VVXXfU/CpWrrrrqqquuuur/JEn8a0niRSWJF0QS95PEv0QS95PECyOJF0QSAJIAkMTzIwkASQBI4rlJAkAS95PE/SRxP0ncTxIPJInnJonnJglJSOKFkYQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCTxopCEJCQhCUlI4n6SkIQkACQhCUkASEISAJKQBIAkACQBIAkASdxPEveTxANJ4kUliefHNpK4n20k8UC2kcQLYhtJANhGEgC2kcT9bCOJ+9kGQBLPj22emyT+LWzz/EjiudnmgSRxP9vcTxIAtgGQBIBtAGazGQD33XffrVx11VVXXXXVVf/dqFx11VVXXXXVVf/tzp49eyvA1tYWDySJ5yaJ5yaJf4kk/j0k8YJI4kUhiftJ4kUliecmCQBJ/EskASCJf4kknpsk/iWSuJ8kHkgSknggSUji+ZGEJCQhif8skpCEJCQhCUlIQhKSkIQknpskJCGJ+0lCEpIAkIQkACQhCQBJAEgCQBIAkgCQxP0kcT9JPDdJ/GvZBkAS97ONJABsI4kHso0kbCMJ20jihbGNJO5nG0k8kG0AJPEvsc2/RBIvKts8N0k8kG3uJ4n72QZAEgC2AZAEQN/3AJw9e/ZWrrrqqquuuuqq/25Urrrqqquuuuqq/5ck8UCSeCBJvCCSeEEk8W8liftJ4rlJ4gWRBIAk/jUkASCJ5yaJ5yaJ+0nigSRxP0lI4oEk8dwkIQlJvCCSkIQkJCEJSUhCEpKQxANJQhKSkIQkJCEJSUjiX0MSkpCEJCRxP0lIQhL3k4QkACQhCQBJAEhCEgCSAJDE/SRxP0ncTxLPjyT+JbYBkMQD2UYSALaRBIBtJPGC2EYStpEEgG0kcT/bSOJ+tpHEc7PN/STxb2WbF5UknpttHkgS97PN/SQBYJv7ScI2AH3fA3DffffdylVXXXXVVVdd9d+NylVXXXXVVVdd9d/uvvvuuxVga2uLF0YSLwpJPJAk/j0k8YJI4gWRxP0kcT9J3E8SL4wknpsk/iWSAJAEgCQAJAEgiRdEEs9NEveTxP0k8UCSeCBJPJAkJPH8SEISkvi3kIQkJPGikIQkJCEJSUhCEpKQhCQkIQlJPJAkJCEJSQBIQhKSAJCEJAAkIQkASQBIAkASAJK4nyTuJ4kHksS/liQeyDYAkgCwjSQAbCMJANtIwjaSsI0kHsg2kgCwjSTuZxtJ3M82AJJ4fmzzgkjiP4ptnpskHsg2DyQJANvcTxIAtgGQxFVXXXXVVVdd9T8KwVVXXXXVVVdd9T/CfffddyvAddddB4AkXhSS+NeSxANJ4oEk8W8hiX8rSdxPEs9NEs9NEgCS+PeQBIAknpsk7ieJ+0nifpJ4IEk8kCSemyQk8YJIQhKSkIQkJCGJfwtJSEISkpCEJCQhCUlIQhKSeEEkIQlJSOKBJCGJ+0lCEgCSkASAJAAkASAJAEkASEISkpCEJAAkIQlJAEhCEpKQhCQkIQlJSEISkpCEJCQhCQBJSEISAJKQhCQkIQkASUhCEpKQBIAkACQhCQBJSAJAEpKQBIAkJCEJSdxPEpKQhCQkIQlJSEISkpDEfxRJSEISkpCEJJ4fSUhCEg8kCUncTxKS6PsegPvuu+9Wrrrqqquuuuqq/wmoXHXVVVddddVV/yOcPXv21muuuebB/DtJ4j+SJB5IEi8KSdxPEveTxP0k8cJI4rlJ4gWRBIAkACQBIAkASQBIAkASz00SAJK4nySeH0ncTxIPJIkHkoQknpskJCGJF5UkJCEJSUhCEpKQhCQkIQlJSOJfSxKSkIQkJCEJSUjifpKQhCQkASAJSUgCQBKSAJAEgCQkASAJAEncTxL3k8T9JPHcJPGisg2AJO5nG0nczzaSeCDbSMI2kngg20jiudlGEvezDYAkHsg2DySJ/2y2eX4k8dxs80CSALDN/SRhG4C+7wE4e/bsrVx11VVXXXXVVf8TEFx11VVXXXXVVf8j3HfffbcCbG5uIonnJonnJol/iSQeSBIPJIkHksSLShL3k8R/BEm8KCTxH0kSz00Sz00SDySJ+0nigSQhiQeShCSeH0lIQhKS+I8mCUlIQhKSkIQkJCEJSUhCEpKQxPMjCUlIQhL3k4Qk7icJSQBIQhKSkASAJAAkASAJSQBIQhIAkpAEgCQkIQlJPDdJSEISz00SkpCEJAAkIQlJAEhCEgCSAJAEgCQAJAEgCUlIQhIAkpCEJAAkIQlJSOJ+kpCEJCQhCUn8a0lCEi+MJCQhCUlIQhKSkIQkJPH8SEISkpDEA0lCEveTRN/3ANx33323ctVVV1111VVX/U9A5aqrrrrqqquu+h/hvvvuuxVga2uLfytJ/GeSxItCEveTxP0kcT9J3E8SL4wkXhBJAEjiX0MSAJJ4bpJ4bpK4nyReEEk8N0k8N0lI4oWRhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCGJfytJSEISkpCEJB5IEpKQBIAkJCEJAElIAkASAJIAkASAJAAkcT9J3E8SDySJf4kkXhDbSOJ+tpEEgG0kYRtJvCC2kYRtJAFgG0nczzaSeG62AZDEv4dtACTxgtjmRSGJ52abB5LE/WxzP0nY5qqrrrrqqquu+h+HylVXXXXVVVdd9T+eJJ6bJP4lknggSTyQJB5IEg8kiRdEEv/RJHE/STw3SQBI4gWRBIAkACQBIAkASbwgknhukrifJO4niftJ4oEkIYkHksTzIwlJSOI/myQAJCEJSUhCEpKQhCQkIQlJSEISkpDEA0lCEpKQxP0kIYn7SUISAJIAkIQkACRxP0kASOJ+krifJJ6bJP41bAMgifvZRhIAtpHEA9lGEraRhG0k8UC2kQSAbSRxP9sASOK52eZ+kvjvZJvnRxL3s80DSQLANgBbW1sA3Hfffbdy1VVXXXXVVVf9T0Bw1VVXXXXVVVf9j3D27NlnAFx33XX8W0jiP5MkXhBJ3E8S95PE/SRxP0ncTxIvjCReEEn8e0gCQBLPTRL3k8T9JHE/SdxPEpJ4IEk8kCQk8YJIQhKSkIQkJCGJF0YSkpCEJCQhCUlIQhKSAJDEv4ckJCEJSUjifpKQhCQAJCGJ+0kCQBKSAJAEgCQkIQlJAEhCEgCSkASAJCQhCUk8N0lIQhKSeG6SkIQk7icJSQBIQhIAkgCQhCQkIQlJAEgCQBKSAJCEJO4nCUlI4n6SkIQkJCEJSfxPIAlJSEISknhukpCEJO4nCUnc7+zZs8/gqquuuuqqq676n4DKVVddddVVV131P8J99913K/+BJPFAknhhJPFAknhBJPGfSRLPTRIviCQAJAEgCQBJAEgCQBIAknhukgCQxL+GJB5IEg8kCUk8kCQkIYkXlSQkIQlJSEISkvjXkoQkJCEJSUhCEpKQhCQkIQlJSEISknhukpCEJO4nCUkASEISAJKQBIAkACQBIAkASdxPEveTxANJ4kUhiefHNpK4n20kAWAbSTyQbSRhG0k8kG0kAWAbSdzPNpJ4INsASOJ/Gts8P5K4n23uJwkA2wD0fQ/AfffddytXXXXVVVddddX/BFSuuuqqq6666qr/Ec6ePXsrwObmJg8kiecmiX8vSbyoJPGCSOJ+krifJJ4fSdxPEveTxHOTxHOTBIAk/iNI4gWRxP0kcT9JPJAkHkgSz00Sz48kJCEJSfxHkIQkJCEJSUhCEpL495KEJCQhCUncTxKSkASAJCQBIAlJAEgCQBIAkgCQBIAk7ieJ+0niuUniX8M2AJK4n20kAWAbSQDYRhK2kYRtJGEbSdhGEgC2kQSAbSRxP9sASOKBbPNAkvjXss1/JEk8P7Z5IEkA2OZ+kui6DoCzZ8/eylVXXXXVVVdd9T8Blauuuuqqq6666n+cN3zDN+RfIgnbPJAkbCOJfy1J2AZAEi+IJGzzQJKwjSReGEnY5n6SeH4kYZv7SeL5kYRtACTxgkjiXyKJ50cSz00Sz00StpHEc5PE/SRhG0ncTxLPTRIPJIkHksQDSeJ+knhuknggSdxPEg8kifvZBsA295PEc5PEc5PE8yOJF0YS/16SALDNfwTbvCC2eX5s89xs89xs80C2uZ8kACTxQLa5n20eyDYPZJsHss1zs839bPNAtnlutnlutgHo+56rrrrqqquuuup/FCpXXXXVVVddddX/CPfdd9+tX//1X/8+H/7hH/5dW1tbXHXV/xS2eSDbXPVfRxLPTRL/k33913/9+9x33323ctVVV1111VVX/U+AHvSgB3HVVVddddVVV/3P8WIv9mKvBYjnZEA8JwPiORkQz8mAeE4GxHMyIJ6TAfGcDIjnZEA8JwPiORkQz8mAeE4GxHMyIJ6TAfGcDIjnZEA8JwPiORkQz8mAeE4GxHMyIJ6TAfGcDIjnZEA8JwPiORkQz8mAeE4GxHMyIJ6TAfGcDIjnZEA8JwPiORkQz8mAeE4GxHMyIJ6TAfGcDIjnZEA8JwPiORkQz8mAeE4GxHMyIJ6TAfGcDIjnZEA8JwPiORkQz8mAeE4GxHMyIJ6TAfGcDIjnZEA8JwPiORkQz8mAeE7+h3/4h9/hqquuuuqqq676nwI96EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/Ff8IXqE79MgJn30AAAAASUVORK5CYII=) @@ -119,10 +119,10 @@ box = startSketchOn('XY') |> extrude(20, %) sketch001 = startSketchOn(box, "END") - |> circle({ center: [10, 10], radius: 4 }, %) + |> circle({ center = [10, 10], radius = 4 }, %) |> revolve({ - angle: 90, - axis: getOppositeEdge(revolveAxis) + angle = 90, + axis = getOppositeEdge(revolveAxis) }, %) ``` @@ -138,11 +138,11 @@ box = startSketchOn('XY') |> extrude(20, %) sketch001 = startSketchOn(box, "END") - |> circle({ center: [10, 10], radius: 4 }, %) + |> circle({ center = [10, 10], radius = 4 }, %) |> revolve({ - angle: 90, - axis: getOppositeEdge(revolveAxis), - tolerance: 0.0001 + angle = 90, + axis = getOppositeEdge(revolveAxis), + tolerance = 0.0001 }, %) ``` @@ -157,8 +157,11 @@ sketch001 = startSketchOn('XY') |> close(%) part001 = revolve({ - axis: { - custom: { axis: [0.0, 1.0], origin: [0.0, 0.0] } + axis = { + custom = { + axis = [0.0, 1.0], + origin = [0.0, 0.0] + } } }, sketch001) ``` diff --git a/docs/kcl/round.md b/docs/kcl/round.md new file mode 100644 index 000000000..e8d1ac4ff --- /dev/null +++ b/docs/kcl/round.md @@ -0,0 +1,46 @@ +--- +title: "round" +excerpt: "Round a number to the nearest integer." +layout: manual +--- + +Round a number to the nearest integer. + + + +```js +round(num: number) -> number +``` + +### Tags + +* `math` + + +### Arguments + +| Name | Type | Description | Required | +|----------|------|-------------|----------| +| `num` | `number` | | Yes | + +### Returns + +`number` + + +### Examples + +```js +sketch001 = startSketchOn('XZ') + |> startProfileAt([0, 0], %) + |> lineTo([12, 10], %) + |> line([round(7.02986), 0], %) + |> yLineTo(0, %) + |> close(%) + +extrude001 = extrude(5, sketch001) +``` + +![Rendered example of round 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAADjQUlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVf9H3XNNdc8+MVe7MVem6uu+h/ot37rt76bq6666qqrrvrPhx70oAdx1VVXXXXVVVddddVV/5dcc801D/7wD//w7zpz5syDr7nmmgdz1VX/w/zDP/zD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uuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9X8Y/fmSF2KkdqdQAAAABJRU5ErkJggg==) + + diff --git a/docs/kcl/segEnd.md b/docs/kcl/segEnd.md new file mode 100644 index 000000000..3d56aa7b2 --- /dev/null +++ b/docs/kcl/segEnd.md @@ -0,0 +1,58 @@ +--- +title: "segEnd" +excerpt: "Compute the ending point of the provided line segment." +layout: manual +--- + +Compute the ending point of the provided line segment. + + + +```js +segEnd(tag: TagIdentifier) -> [number] +``` + + +### Arguments + +| Name | Type | Description | Required | +|----------|------|-------------|----------| +| `tag` | [`TagIdentifier`](/docs/kcl/types#tag-identifier) | | Yes | + +### Returns + +`[number]` + + +### Examples + +```js +w = 15 +cube = startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line([w, 0], %, $line1) + |> line([0, w], %, $line2) + |> line([-w, 0], %, $line3) + |> line([0, -w], %, $line4) + |> close(%) + |> extrude(5, %) + +fn cylinder(radius, tag) { + return startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> circle({ + radius = radius, + center = segEnd(tag) + }, %) + |> extrude(radius, %) +} + +cylinder(1, line1) +cylinder(2, line2) +cylinder(3, line3) +cylinder(4, line4) +``` + +![Rendered example of segEnd 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAEFFUlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq/6dXud1Xue9ueqqq/7f+4d/+Iffvu+++27lqquuuuqqq676n4TK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kIQkACQhCUlIAkASkpCEJAAkIQlJSEISkpCEJCQhCUlEBJKQREQgiYggIogIIoKIICKICEoplFKICEop1FoppVBKodZKrZVaK7VWaq3UWqm1Umul1kophVorpRRKKZRSiAgigoggIlgulwzDwNHREfe77777bv2t3/qt7/7RH/3Rz+Gqq6666qqrrrrqqquu+s+AHvSgB3HVVVddddVV/1tcc801D37t137t93qd13md977mmmseDLC7u8vf/M3f8Lu/+7tIAkASAJK4nyQAJAEgiftJ4n6SuJ8k7ieJiEASkpCEJCQBIAlJSEISkpCEJAAkIQlJSAJAEpKQhCQkASAJSUhCEgCSkIQkJCEJSUhCEpKQhCQiAklIIiKQREQQEUQEEUFEEBFEBKUUIoJSCqUUSinUWimlUGul1kqtlVortVZqrdRaqbVSa6WUQq2VUgqlFEopRAQAq9WKw8NDHugf/uEffvu3fuu3vue3fuu3vpurrrrqqquuuuqqq6666j8TetCDHsRVV1111VVX/W9z5syZB734i7/467zjO77jZ11zzTUPBrh06RK33norf/u3f8sznvEMJAEgCQBJAEjifpIAkMT9JHE/SdxPEpKQhCQkIQlJSEISkpCEJCQhCQBJSEISkpAEgCQkIQlJAEhCEpKQBIAkJCEJSUhCEpKQhCQkIQlJRASSkEREIImIICKQRERQSiEiiAhKKUQEpRRKKZRSqLVSSqHWSq2VWiu1Vmqt1FqptVJrpdZKKYVaK6UUJDFNE6vVige67777bv2t3/qt7/7RH/3Rz+Gqq6666qqrrrrqqquu+q+CHvSgB3HVVVddddVV/5u9zuu8znu/zuu8znu92Iu92GvzTLu7u/zt3/4tt912G7fddhsAkrifJAAkcT9J3E8S95MEgCQkIQlJSEISkpCEJCQhCUlIAkASkpCEJCQBIAlJSEISkgCQhCQkIQkASUhCEpKQhCQkIQlJSEISkpBERCCJiEASEUFEIImIICIopRARlFKICEoplFIopVBrpZRCrZVaK7VWSil0XUetlVortVZqrUgiIpimiQe67777bv2t3/qt7/7t3/7t77nvvvtu5aqrrrrqqquuuuqqq676r4Ye9KAHcdVVV1111VX/F5w5c+ZBr/M6r/Per/M6r/Pe11xzzYN5pkuXLvG3f/u33Hbbbdx2220ASAJAEveTxP0kcT9JAEhCEpKQhCQkIQlJSEISkpAEgCQkIQlJSEISAJKQhCQkASAJSUhCEgCSkIQkJCEJSUhCEpKQhCQkIQlJRASSiAgkERFIIiKICCKCUgoRQURQSqGUQimFUgq1Vkop1FoppVBrpdZK13V0XUff95RSkMQD3Xfffbf+6I/+6Of8/d///W+dPXv2GVx11VVXXXXVVVddddVV/53Qgx70IK666qqrrrrq/5oXe7EXe+3XeZ3Xea/XeZ3XeW8e4NKlS9x2223cdttt/N3f/R0AkgCQxP0kcT9JAEhCEpKQhCQkIQlJSEISkgCQhCQkIQlJSAJAEpKQhCQkASAJSUhCEgCSkIQkJCEJSUhCEpKQhCQkIQlJRASSkEREEBFIIiKICCKCiKCUQkRQSqGUQimFUgqlFGqt1Frp+57t7W1msxld1/Hc/uEf/uG3//7v//63f/RHf/RzuOqqq6666qqrrrrqqqv+J0EPetCDuOqqq6666qr/q86cOfOga6655iGv8zqv816v8zqv8948wKVLlwC47bbb+Pu//3tuu+02JHE/SdxPEgARgSQkIQlJSEISkpAEgCQkIQlJSEISAJKQhCQkIQkASUhCEpIAkIQkJCEJSUhCEpKQhCQkIQlJSEISEYEkJBERRASSiAgigoggIiilEBGUUiilsFgs2N7epu97Njc3WSwWPLf77rvv1t/6rd/67n/4h3/4nX/4h3/4ba666qqrrrrqqquuuuqq/6nQgx70IK666qqrrrrq/4trrrnmwa/92q/9Xi/+4i/+2i/2Yi/22jyXS5cucfvtt3Pbbbext7fH7bffDoAkACQhiYhAEpKQhCQAJCEJSUhCEpKQhCQAJCEJSUhCEgCSkIQkJAEgCUlIQhKSkIQkACQhiYhAEpKQhCQkERFIIiKQREQQEUQEEcFiseDEiRPM53N2dnbY3t7m+bnvvvtu/a3f+q3vBvjRH/3Rz+Gqq6666qqrrrrqqquu+t8CPehBD+Kqq6666qqr/j+65pprHnzmzJkHv9iLvdhrvfiLv/hrv9iLvdhr83xcunSJ22+/HYA77riDvb097rzzTiQhCUlIQhKSkIQkJCEJSUgCQBKSkIQkJAEgCUlIQhIAkpCEJCQhCUlIAkASkpCEJCICSUhCEpKICDY2NtjY2ODkyZNI4uTJk8znc+bzOc/Pfffdd+vZs2dv/fu///vf/od/+Iff/od/+Iff4aqrrrrqqquuuuqqq6763wo96EEP4qqrrrrqqquugmuuuebBAC/2Yi/22i/2Yi/2Wtdcc82DX+zFXuy1eQH29vYAuPPOOwG48847kcT+/j6SODg44ODgAEkASEISkpCEJAAkIQlJSEISAJKQhCQkIQlJAEhic3MTSWxubrK5ucnm5iaS2NjYYGNjg42NDRaLBS/Mfffdd+s//MM//PZ999136z/8wz/89j/8wz/8DlddddVVV1111VVXXXXV/yXoQQ96EFddddVVV1111fN3zTXXPBjgxV7sxV77xV7sxV4L4Jprrnnwi73Yi702/wr7+/tIwjYHBwcASALg4OAAAEkASGJzc5P7SQJgc3OTzc1N/rXuu+++W8+ePXvrfffdd+t9991369mzZ59x3333Pf0f/uEffoerrrrqqquuuuqqq6666v869KAHPYirrrrqqquuuupf75prrnnwmTNnHnzNNdc8CNCLvdiLvRbANddc82CAM2fOPPiaa655MP9J7rvvvlsBzp49e+t9991363333XcrwNmzZ59x33333Xr27Nlb77vvvlu56qqrrrrqqquuuuqqq/4/Qw960IO46qqrrrrqqqv+c11zzTUPtm1JOnPmzIN5Nl9zzTUP4Tn5vvvuewbPyWfPnn3GfffddytXXXXVVVddddVVV1111VUvOvSgBz2Iq6666qqrrrrqqquuuuqqq6666qqrrrrq/yQqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r+IfAZI+8lXI0MuwAAAAAElFTkSuQmCC) + + diff --git a/docs/kcl/segLen.md b/docs/kcl/segLen.md index 723793bf3..33d720f8a 100644 --- a/docs/kcl/segLen.md +++ b/docs/kcl/segLen.md @@ -29,9 +29,9 @@ segLen(tag: TagIdentifier) -> number ```js exampleSketch = startSketchOn("XZ") |> startProfileAt([0, 0], %) - |> angledLine({ angle: 60, length: 10 }, %, $thing) - |> tangentialArc({ offset: -120, radius: 5 }, %) - |> angledLine({ angle: -60, length: segLen(thing) }, %) + |> angledLine({ angle = 60, length = 10 }, %, $thing) + |> tangentialArc({ offset = -120, radius = 5 }, %) + |> angledLine({ angle = -60, length = segLen(thing) }, %) |> close(%) example = extrude(5, exampleSketch) diff --git a/docs/kcl/segStart.md b/docs/kcl/segStart.md new file mode 100644 index 000000000..0977c10c3 --- /dev/null +++ b/docs/kcl/segStart.md @@ -0,0 +1,58 @@ +--- +title: "segStart" +excerpt: "Compute the starting point of the provided line segment." +layout: manual +--- + +Compute the starting point of the provided line segment. + + + +```js +segStart(tag: TagIdentifier) -> [number] +``` + + +### Arguments + +| Name | Type | Description | Required | +|----------|------|-------------|----------| +| `tag` | [`TagIdentifier`](/docs/kcl/types#tag-identifier) | | Yes | + +### Returns + +`[number]` + + +### Examples + +```js +w = 15 +cube = startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line([w, 0], %, $line1) + |> line([0, w], %, $line2) + |> line([-w, 0], %, $line3) + |> line([0, -w], %, $line4) + |> close(%) + |> extrude(5, %) + +fn cylinder(radius, tag) { + return startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> circle({ + radius = radius, + center = segStart(tag) + }, %) + |> extrude(radius, %) +} + +cylinder(1, line1) +cylinder(2, line2) +cylinder(3, line3) +cylinder(4, line4) +``` + +![Rendered example of segStart 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAADy4ElEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVdd9f/CNddc82CAM2fOPBjgmmuueTDAmTNnHsQzXXPNNQ/mAa655poH8wD33Xffrddcc82DeYD77rvvVh7gvvvuuxXg7Nmzz+CZ7rvvvlsBzp49e+t99913K1ddddVVV1111VVXXXXVfxX0oAc9iKuuuuqqq6666n+3a6655sFnzpx58DXXXPPgM2fOPAjgxV/8xV8b4MyZMw++5pprHswLcd999916zTXXPJj/Ivfdd9+tAGfPnr31vvvuu/W+++679ezZs8+47777bv2Hf/iH3+aqq6666qqrrrrqqquu+o+CHvSgB3HVVVddddVVV/3Pd8011zz4zJkzD36xF3ux1wJ48Rd/8dc+c+bMg6+55poH8yK4cOEC97tw4QIXLlwA4MKFC9zv4sWLPNCFCxf4l5w8eZIHOnHiBAAnT57kfidPngTg5MmTnDx5kn/JfffddyvAP/zDP/z2P/zDP/zOfffdd+vZs2dvve+++27lqquuuuqqq6666qqrrvrXQA960IO46qqrrrrqqqv+57jmmmseDPDar/3a7wVwzTXXPPh1Xud13psX4sKFC1y4cIELFy5w4cIFAJ761KcCcPHiRS5cuMD/JCdPngTgYQ97GAAPf/jDAThx4gQPf/jDeUHuu+++W8+ePXvrfffdd+tv/dZvfc8//MM//DZXXXXVVVddddVVV1111QuDHvSgB3HVVVddddVVV/33ueaaax782q/92u8F8OIv/uKv/WIv9mKvzfNx4cIFLly4wFOf+lQAnvKUp3Dx4kUuXLjA/zUnT57kxIkTnDx5koc//OGcOHGChz/84Tw/9913363/8A//8Nu/9Vu/9T3/8A//8NtcddVVV1111VVXXXXVVQ+EHvSgB3HVVVddddVVV/3Xueaaax782q/92u/14i/+4q/9Yi/2Yq/N83HhwgX+7M/+DICnPOUpPPWpT+UqOHnyJA972MM4efIkD3vYw3j4wx/Oc7vvvvtu/a3f+q3v/od/+Iff+Yd/+Iff5qqrrrrqqquuuuqqq/5/Qw960IO46qqrrrrqqqv+81xzzTUPfu3Xfu33evEX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62O+67u+62MODw93ueqqq676b3bffffd+pCHPOSlb7755gc//OEP52lPexrjOBIRSCIiiAgigoggIpCEJCICSUhCEpKICCQhiYhAEpKQhCQkIYmIICKQREQQEUgiIogIIgJJRAQRQUQQEUhCEveTxP1sYxvbANjGNraxjW1sYxvb2MY2trGNbWwDYBvbANgGwDYAtgGwjW0AbGMb29gmM7FNa43WGtM08YZv+Ib80R/90dfceuutf81VV1111VVX/etQjh8/zlVXXXXVVVdd9byOjo4u/cM//MPvHB4e7r78y7/8az/4wQ/m0Y9+NNdeey3z+ZyzZ89SSiEiiAgkIYmIICKICCKCiCAiiAgigoiglEKtla7r6Puevu+ZzWYA7O/vc+nSJc6dO0ff9/zDP/zDb//oj/7oZ3/913/9+9x6661/zVVXXXXV/xBHR0eX/uEf/uF3HvKQh7z0zTff/OCHPexhPP3pT2ccRyQREUhCEpKQREQgCUlEBJKICCQhiYhAEpKICCICSUgiIogIJCGJiCAikEREEBFEBJKICCKCiCAikEREACAJSTyQbQBsYxvb2MY2trGNbWxjG9vYxja2sQ2AbWwDYBsA29gGwDYAtrENgG0yE9tkJraxTWbSWuPGG2/kdV/3dfmSL/mSt+Gqq6666qqr/vXQgx70IK666qqrrrrqqhfummuuefBrv/Zrv9c7vdM7fTbPdOnSJfb29jg4OODuu+/m8PCQ++67j1IKpRRKKZRSqLVSSqHWSq2V7e1t+r7n9OnTbG1tsb29zXw+54Huu+++W3/rt37ru3/7t3/7e+67775bueqqq676H+yaa6558Id/+Id/14u92Iu99v7+Pk94whP4y7/8SyKCiCAiiAgigoggIpBERCCJiCAikEREEBFIIiKICCKCiCAiiAhKKUQEpRQiglIKpRRKKUQEpRRKKUQEEUFEEBFIQhIPZJvMxDaZSWuNzKS1RmbSWqO1RmuNzKS1RmbSWiMzyUwyk8zENplJZmKbzMQ2mUlmYpvMxDaZSWZim8yktUZm0lqjtcY0TYzjyDAMvNM7vRMbGxu3fsiHfMhDuOqqq6666qp/PfSgBz2Iq6666qqrrrrqRXPmzJkHvfiLv/jrvM7rvM57vdiLvdhr83wcHBwAIIn7SWJjY4Pn57777rv1mmuuefB9991362/91m999z/8wz/89j/8wz/8DlddddVV/4tcc801D37t137t93qnd3qnz97f3+eJT3wif/VXf0UphYggIpBERBARRASSiAgkERFEBJKICCICSUQEEUFEEBGUUogISilEBKUUSilEBKUUSimUUiilEBFEBBFBRCAJSdzPNraxTWaSmWQmrTUyk9YarTVaa2QmrTVaa2QmmUlrjcwkM8lMbJOZZCa2yUxsk5nYJjPJTGyTmWQmmUlmkplkJq01WmtM08Q4jlx33XW8y7u8C1//9V//Pr/1W7/13Vx11VVXXXXVvx560IMexFVXXXXVVVdd9a93zTXXPPjMmTMPfrEXe7HXuuaaax58zTXXPPjFXuzFXpvnct999916zTXXPJhnuu+++24F+Id/+Iffvu+++2797d/+7e+57777buWqq6666v+Ad3zHd/ysd3qnd/psgLvvvpvf+73f4+joiIggIpBERBARSCIiiAgkERFEBJKICCKCiCAiiAgigoiglEJEUEohIiilUEqhlEIphVIKEUEphYggIpBERAAgCdsA2CYzyUwyk8yktUZm0lqjtUZrjcyktUZrjcwkM2mtkZlkJpmJbTKTzMQ2mYltMhPbZCaZiW0yk8wkM8lMMpPMpLXGNE201pjP57z/+78/f//3f//bn/VZn/U6XHXVVVddddW/DXrQgx7EVVddddVVV131H+eaa6558H333XfrNddc82Ae4L777ruVq6666qr/B17sxV7stT/8wz/8u6655poHHxwc8JSnPIW//du/JSKICCQREUQEkogIIgJJRAQRgSQigoggIogIIoJSChFBKYWIoJRCKYVSCqUUSilEBKUUIoJSCpKICCQhifvZxja2yUwyk9YamUlrjdYarTVaa2QmrTVaa2QmmUlrjcwkM8lMbJOZZCa2yUxsk5nYJjPJTGyTmWQmmUlmkpm01shMpmliY2OD133d1+Xmm2/mMz/zM1/nH/7hH36bq6666qqrrvq3oRw/fpyrrrrqqquuuuo/zuHh4S7A4eHh7uHh4e7h4eHu4eHhLlddddVV/0+cPXv21j/7sz/7mYc85CEvfdNNNz34uuuuY2tri4sXLzJNExGBJCQREUhCEhGBJCQREUQEEUFEEBFEBJKICCQREUQEEYEkIoKIICKICCICSUQEEYEkACQBIAkA29jGNraxjW1sYxvb2MY2trGNbWxjG9sA2MY2tgGwDYBtAGxjGwDb2MY2trGNbTKTra0tXu/1Xo+bbrqJf/iHf/jtH/3RH/0crrrqqquuuurfjnL8+HGuuuqqq6666qqrrrrqqqv+Ix0eHu7+1m/91vcAXHPNNQ+++eabj99yyy30fc/Zs2eJCCQhiYhAEpKICCQhCUlIQhKSkEREIImIQBIRQUQQEUQEEUFEIImIICKICCQhCUkASOJ+trGNbQBsYxvb2AbANraxjW1sA2Ab2wDYxja2AbANgG0AbGMbANvYxja2sY1ttra2eJ3XeR1uvPFGfuu3fuu7v+RLvuRtuOqqq6666qp/H8rx48e56qqrrrrqqquuuuqqq676z/AP//APv/Onf/qnP33rrbf+zau/+qu/9bXXXstDHvIQ+r7n3LlzSEISEYEkJBERSEISkpBERBARSCIikEREEBFEBBFBRBARRAQRQUQQEUQEkpCEJCQBIAnb3M82trGNbWxjG9vYxjYAtrGNbWxjGwDb2MY2ALYBsA2AbWwDYBvb2MY2ttnc3OQ1X/M1ueGGG/it3/qt7/76r//69+Gqq6666qqr/v0ox48f56qrrrrqqquuuuqqq6666j/L0dHRpVtvvfWvf/u3f/t7HvKQh7z0jTfe+OBrrrmGBz3oQfR9z7lz55BERCAJSUQEEUFEEBFIQhIRgSQigoggIogIIoKIQBIRQUQgiYhAEhGBJO4nifvZxjYAtrGNbWwDYBvb2MY2trGNbWwDYBvb2MY2ALYBsA2AbWwDYBvb2MY21157LW/91m/N9vY29913362f9Vmf9TpcddVVV1111X8MyvHjx7nqqquuuuqqq6666qqrrvrPdnh4uPtbv/Vb33P27NlnPPjBD37pEydOHD9z5gwPetCD6LqOCxcuEBFIQhKSkIQkIoKIQBIRQUQgiYggIogIIoKIICKICCICSUQEEQGAJCQBIAnb2MY2trGNbQBsYxvb2MY2trGNbWwDYBvb2MY2ALaxDYBtAGxjGwDb2GZjY4PHPOYxvPqrvzoA//AP//DbH//xH/8yXHXVVVddddV/HMrx48e56qqrrrrqqquuuuqqq676r3Lrrbf+9Z/+6Z/+9K233vo3m5ubx2+88cYHnz59mptvvpljx44xTRPr9ZqIICKICCQhiYhAEhFBRBARRAQRQUQQEUQEEUFEEBFEBJKQhCQk8fzYxjYAtrGNbWxjG9vYxja2sY1tbGMb29gGwDa2AbANgG0AbGObF3/xF+e1Xuu1OHHiBLVWfuRHfuSzv/7rv/59uOqqq6666qr/WOhBD3oQV1111VVXXXXVVVddddVV/11e53Ve571f53Ve571e7MVe7LV5puVyyV133cU999zDMAxEBKUUIoJSCqUUSimUUiilUEqhlEIphVIKEUEphYggIpCEJO5nG9vYJjPJTFprZCatNVprtNZordFao7VGa43MpLVGZpKZZCaZSWaSmWQmtslMMhPbZCa2yUxs85jHPIYHP/jBbG5uAvAP//APv/31X//173PffffdylVXXXXVVVf9x0MPetCDuOqqq6666qqrrrrqqquu+u925syZB73O67zOe7/O67zOe19zzTUP5plWqxX33nsve3t7HBwcUEohIiilUEqhlEIphVorpRQiglIKEUEpBUlEBACSALCNbTKTzCQzyUxaa7TWaK3RWqO1RmuN1hqtNTKT1hqZSWaSmWQmmUlmkpnYJjPJTGyTmSwWC26++WYe+9jHcr/77rvv1h/90R/9nN/6rd/6bq666qqrrrrqPw960IMexFVXXXXVVVddddVVV1111f8U11xzzYNf7MVe7LXPnDnzoHd6p3f6bB5gvV6zv7/PwcEBu7u7lFIopVBKoZRCKYVSCqUUIoKIICKQhCQeKDOxTWbSWiMzaa3RWqO1RmuN1hqtNVprtNbITFprZCaZSWaSmWQmmUlmYpvMZD6fc9NNN3Hq1ClOnz7N/e67775bf+u3fuu7f/RHf/RzuOqqq6666qr/fOhBD3oQV1111VVXXXXVVVddddVV/xOdOXPmQS/+4i/+Oi/2Yi/2Wq/zOq/z3gD33Xffrddcc82DAYZhYLlcslwuyUyGYaCUQimFiCAiiAgkIYn72cY2mUlmkpm01mit0VqjtUZrjdYarTVaa7TWyExaa2QmmUlmkplkJrPZjNlsxokTJzh58iSnTp3igX7kR37ks3/7t3/7e+67775bueqqq6666qr/OuhBD3oQV1111VVXXXXVVVddddVV/xtcc801D37t137t93rxF3/x136xF3ux1+a5TNMEwDAMTNOEJGwzTRMAkrCNbWxjm9YamUlrjdYarTVaa7TWaK3RWqO1RmbSWqPWSmbS9z3Hjh1jNptx/fXX89zuu+++W8+ePXvr3//93//2j/7oj34OV1111VVXXfXfAz3oQQ/iqquuuuqqq6666qqrrrrqf5trrrnmwQAv9mIv9tov9mIv9lrXXHPNg8+cOfPga6655sE8H5kJQGZim8zENraZpgnbZCa2yUwyk1ortum6jtlsRt/3vDD33Xffrb/1W7/13f/wD//wO//wD//w21x11VVXXXXVfz/0oAc9iKuuuuqqq6666qqrrrrqqv8LrrnmmgefOXPmwddcc82DX+zFXuy1AK655poHnzlz5sHXXHPNg/kPct9999169uzZW//+7//+twH+4R/+4Xf+4R/+4be56qqrrrrqqv950IMe9CCuuuqqq6666qqrrrrqqqv+r7vmmmsebNvXXHPNQwCuueaaB3OFz5w582Cej7Nnzz4D4L777rsV8D/8wz/8DlddddVVV131vwt60IMexFVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Slauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V/FPwLyjoIMUJzIaQAAAABJRU5ErkJggg==) + + diff --git a/docs/kcl/segStartX.md b/docs/kcl/segStartX.md new file mode 100644 index 000000000..fbfea9d33 --- /dev/null +++ b/docs/kcl/segStartX.md @@ -0,0 +1,43 @@ +--- +title: "segStartX" +excerpt: "Compute the starting point of the provided line segment along the 'x' axis." +layout: manual +--- + +Compute the starting point of the provided line segment along the 'x' axis. + + + +```js +segStartX(tag: TagIdentifier) -> number +``` + + +### Arguments + +| Name | Type | Description | Required | +|----------|------|-------------|----------| +| `tag` | [`TagIdentifier`](/docs/kcl/types#tag-identifier) | | Yes | + +### Returns + +`number` + + +### Examples + +```js +exampleSketch = startSketchOn('XZ') + |> startProfileAt([0, 0], %) + |> line([20, 0], %, $thing) + |> line([0, 5], %) + |> line([20 - segStartX(thing), 0], %) + |> line([-20, 10], %) + |> close(%) + +example = extrude(5, exampleSketch) +``` + +![Rendered example of segStartX 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAADGZ0lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVdd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V1111VVXXfX/DpWrrrrqqquu+le45pprHvw6r/M67w3wDu/wDgDceeed/PRP/zSS+O8giReVJJ6bJJ6bJJ6bJP4lknggSTw3STyQJB5IEg8kiQeSxP0k8UCSuJ8kHkgS95PE/SRxP0k8kCTuJ4n7SeJ+krifJO4niftJ4n6SuJ8k7ieJ+0nifpK4nyTuJ4kHksQDSeK5SeL5kcS/hyReGNsASOJ+tgGQxP1sI4n72UYSALYBkASAbSQBYBtJANhGErYBkIRtACRx1VVXXXXVVVddddX/O1Suuuqqq6666l/hHd/xHT+LB9jf3+cJT3gCj3nMY/jXksTzI4l/DUm8KCTx/EjiXyKJ5yaJf4kkXhhJPJAkXhhJ3E8SL4gkXhBJ3E8Sz48k7ieJ50cSz48k7ieJ50cS95PE8yOJ50cSDySJF0QSz00S/91s89xs84LY5n62eX5s8/zY5n62ueqqq6666qqrrrrq/x0qV1111VVXXfWvcN99993KA2xvb/N6r/d6XHXVVf97/NZv/dZ3c9VVV1111VVXXXXV/xdUrrrqqquuuupf4bd/+7e/55prrnkwV1111f9aX//1X/8+XHXVVVddddVVV131/wV60IMexFVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Slauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KfwTbzoCaPX3oLQAAAABJRU5ErkJggg==) + + diff --git a/docs/kcl/segStartY.md b/docs/kcl/segStartY.md new file mode 100644 index 000000000..33dabd7dd --- /dev/null +++ b/docs/kcl/segStartY.md @@ -0,0 +1,44 @@ +--- +title: "segStartY" +excerpt: "Compute the starting point of the provided line segment along the 'y' axis." +layout: manual +--- + +Compute the starting point of the provided line segment along the 'y' axis. + + + +```js +segStartY(tag: TagIdentifier) -> number +``` + + +### Arguments + +| Name | Type | Description | Required | +|----------|------|-------------|----------| +| `tag` | [`TagIdentifier`](/docs/kcl/types#tag-identifier) | | Yes | + +### Returns + +`number` + + +### Examples + +```js +exampleSketch = startSketchOn('XZ') + |> startProfileAt([0, 0], %) + |> line([20, 0], %) + |> line([0, 3], %, $thing) + |> line([-10, 0], %) + |> line([0, 20 - segStartY(thing)], %) + |> line([-10, 0], %) + |> close(%) + +example = extrude(5, exampleSketch) +``` + +![Rendered example of segStartY 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAEXbUlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX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JP4z2OaBJPFfyTbPTRJXXXXVVVddddVVV131PwDBVVddddVVV/0n+od/+IffBrj++uv5t7CNbf69bGObfy/b2OY/gm1s8x/BNrb5j2Ib29jmP5JtbGOb/0y2sY1t/rvYxja2sY1trrrqqquuuuqqq6666r8Blauuuuqqq676X8A2AJL497ANgCT+PWwDIIl/L9sASOLfyzb3k8R/BNvcTxL/UWxzP0n8Z7HNA0niv4ttnh9JXHXVVVddddVVV1111X8Sgquuuuqqq676T3TffffdCnD99ddjm38v29jm38s2tvn3so1t/iPYxjb/UWxjm/9ItrHNfzTb2MY2/9lsYxvb2OZ/AtvYxja2sY1tbHPVVVddddVVV1111VX/TlSuuuqqq6666j/RfffddysPYBsASfx72AZAEv8etgGQxL+Hbe4niX8P29xPEv9etrmfJP4j2OZ+kviPZJv7SeI/m23uJ4n/aWzzwkjiqquuuuqqq6666qqrXggqV1111VVXXfWf6B/+4R9+B+D666/ngWwDIIl/D9sASOLfwzYAkvj3sg2AJP69bAMgif8ItgGQxH8U2wBI4j+abe4nif9stnkgSfxPZ5sXhSSuuuqqq6666qqrrvp/icpVV1111VVX/TeyjST+vWwDIIl/D9sASOLfyzYAkvj3sg2AJP4j2AZAEv9RbHM/SfxHs80DSeI/m20eSBL/W9nmqquuuuqqq6666qr/l6hcddVVV1111X+is2fP3gqwvb3NC2IbAEn8e9lGEv9etgGQxL+XbQAk8e9lGwBJ/Eewzf0k8R/FNveTxH8G29xPEv8VbPPcJHHVVVddddVVV1111VX/g1G56qqrrrrqqv9E9913360A29vb/EtsAyCJfw/bAEji38s2AJL497INgCT+vWxzP0n8R7ANgCT+I9nmfpL4z2Cb+0niv5JtHkgSV1111VVXXXXVVVdd9T8IwVVXXXXVVVf9J7vvvvtuBbj++ut5UdjGNv9etrHNfwTb2OY/gm1s8x/FNrb5j2Ib29jmP5ptbPOfyTa2sc1/B9vYxja2ueqqq6666qqrrrrqqv9mBFddddVVV131n+zs2bO38m9gG9v8e9nGNv8RbGOb/wi2sc1/FNvY5j+SbWzzH802trHNfybb2MY2/11sYxvb2MY2V1111VVXXXXVVVdd9V+I4Kqrrrrqqqv+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gCQAJAEgCQBJSAJAEgCSAJAEgCQkASAJAEkASOJ+kgCQBIAk7icJAEncTxLPTRL3k8T9JHE/SdxPEveTxP0kcT9J3E8SDySJ+0nigSRxv2uuuQaAf/iHf/htrrrqqquuuur/FoKrrrrqqquu+j/mvvvuuxXgpptu4t9DEv8RJPEvkcQLI4l/K0m8IJL415LE8yOJF5Uknpsknpsknpsk/iWSeCBJPJAkHkgSL4gkXhBJ3E8S95PE/SRxP0m8MJJ4bpK4nyQAJPHcJAEgCQBJvCCSAJAEgCQAJAEgCQBJAEgCQBL3kwSAJAAkASAJAEkASEISAJIAkMT9JAEgCUkASOJ+krifJCQBIAlJSAJAEpKQxP0kIQlJSEISkvjXkoQkJCEJSUjifpKQhCQAJCEJSQBIQhKSAJCEJAAkIQkASQBIQhIAkgCQhCQAJAEgCUkASAJAEgCSAJDE/SQBIAkASQBI4n6SAJAEgCQAJHE/SQBIAkAS95MEgCTuJwkASdxPEveTxP0kcT9J3E8S95PE/SRxP0ncTxIPJIn7SeKBJHHVVVddddVV/8dRueqqq6666qr/Y+67775bAV75lV+ZV37lV+aqq6666qqrXlT33XffrVx11VVXXXXV/y2U48ePc9VVV1111VX/l5w9e/YZt95669+84iu+4ltz1VVXXXXVVS+iH/mRH/nsH/3RH/0crrrqqquuuur/FvSgBz2Iq6666qqrrrrqqquuuuqqq6666qqrrrrq/yQqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9V/COde64P3hThZgAAAABJRU5ErkJggg==) + + diff --git a/docs/kcl/shell.md b/docs/kcl/shell.md index e9c97754c..a7f68eae8 100644 --- a/docs/kcl/shell.md +++ b/docs/kcl/shell.md @@ -38,7 +38,7 @@ firstSketch = startSketchOn('XY') |> extrude(6, %) // Remove the end face for the extrusion. -shell({ faces: ['end'], thickness: 0.25 }, firstSketch) +shell({ faces = ['end'], thickness = 0.25 }, firstSketch) ``` ![Rendered example of shell 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAEnBElEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuxzP/dzf4urrrrqqqv+z/iRH/mRz/mHf/iH3+aqq6666qqr/n9DD3rQg7jqqquuuuqq/89e53Ve570//MM//Lu46qqrrrrq/5wf+ZEf+ewf/dEf/Ryuuuqqq6666v8vgquuuuqqq676f+yaa6558Id/+Id/F8AP//AP88M//MMAXLhwgauuuuqqq/73uXDhAj/8wz/MD//wDwPwOq/zOu99zTXXPJirrrrqqquu+v+LylVXXXXVVVf9P/bhH/7h3wXw1Kc+lT//8z/nQz7kQwA4efIkT3nKUzg4OOAFkcS/hST+LSTxbyGJfy1J/GtJ4l9LEv9akvjXkMS/hiT+NSTxopLEi0oSLwpJvCgk8aKQxL9EEv8SSfxLJPEvkcQLI4l/iSReGEn8SyTxopDEi0oS/xqS+I8gif8JbPMfwTb3u+aaazh58iRv+IZvyBd8wRfwsIc9jFd4hVd48Id/+Id/12d+5me+DlddddVVV131/xOVq6666qqrrvp/6nVe53Xe+8Ve7MVeG+CbvumbePmXf3ke9rCHsbu7y/Hjx3nKU57CvffeywsjiRdEEi+IJF4QSbwgknhBJPGCSOIFkcTzI4kXRBLPjyReEEk8P5J4fiTx/Eji+ZHE8yOJ50cSL4gknpsknh9JPD+SeG6SeG6SeH4k8dwk8dwk8dwk8dwk8dwk8UCSeG6SeG6SeCBJPDdJPJAkHkgSz00SDySJB5LEA0nigSTx3CTxQJJ4IEk8kCSemyQeSBLPTRLPTRLPTRLPjySe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6qqrrrrqvxrBVVddddVV/y3+/u///rcBbr75Zv4ltrGNbf6r2MY2tvnvYBvb2Oa/m21sYxvb/E9lG9vYxja2+b/MNraxjW1sYxvb2MY2trnq/yfb2MY2trGNbWxjG9vY5v8q29jGNraxjW3+J7KNbWxjm/9OtrGNbWzzX8k2trGNbf4r2MY2tvnPdPPNNwPwD//wD7/DVVddddVV/x2oXHXVVVdd9d/i7NmztwLs7Ozwr2Gb+0niv4Jt7ieJ/2q2eSBJ/HeyzQNJ4n8q2zw/kvj/wjb/GpK46n8e21z1/NnmfxPb/E9im/8utvmvZpv/KrYB2NnZAeC+++67lauuuuqqq/47ULnqqquuuuq/xX333XcrwLFjx/i3ss39JPFfwTYPJIn/ara5nyT+u9nmuUnifzLbPD+S+P/ONv9ekrjqOdnmqn8f2/xvY5v/aWzz38k2/9Vs81/JNg908803A/AP//APv81VV1111VX/HahcddVVV1313+If/uEffhvg5ptv5j+Cbe4nif8qtrmfJP6r2eaBJPE/gW0eSBL/G9jm+ZHEVS8621x11b+Fbf43s83/NLb572ab/2q2+a9km6uuuuqqq/7HonLVVVddddV/i/vuu+9WgJ2dHf6j2eZ+kvivYpv7SeK/g20eSBL/E9jmuUnifwvbvCCSuOqqq/51bPO/nW3+p7LNfzfb/HewzX8V27wobr75ZgD+4R/+4be56qqrrrrqvwOVq6666qqr/lucPXv2GQDHjh3jxV7sxdjb2+M/myT+v5PE/2SS+L9EEldd9f+Vbf4vsc3/VLb5/8w2/5Vs869x7NgxAO67775bueqqq6666r8Dlauuuuqqq/7b/NZv/dZ3v87rvM57v8mbvAlXXXXVVVddddVV/1f9wz/8w29z1VVXXXXVfxcqV1111VVX/bf5+q//+vcBuOaaax7MVVddddVVV1111f9Bf//3f//bP/qjP/o5XHXVVVdd9d8FPehBD+Kqq6666qqrrrrqqquuuuqqq6666qqrrvo/icpVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/Ff8IKpPBonR3PeMAAAAASUVORK5CYII=) @@ -54,7 +54,7 @@ firstSketch = startSketchOn('-XZ') |> extrude(6, %) // Remove the start face for the extrusion. -shell({ faces: ['start'], thickness: 0.25 }, firstSketch) +shell({ faces = ['start'], thickness = 0.25 }, firstSketch) ``` ![Rendered example of shell 1](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAGSGklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVV/07XXHPNg1/sxV7stV/ndV7nvbjqqquuuuqqq/5D/NZv/db3/MM//MNv33fffbdy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ep4fSTw3SfxLJPGCHBwcAHDDDTfwX8k2L4ht/i1s869lm/+rbPMvsc1VV131v58kXhhJ/Ec4e/Ys/x0kIYnMBOAf/uEffpurrrrqqquu+o9FcNVVV1111VX/Sba3t3lu29vbSOLfShIvjCQeaH9/n+fHNi+Mba666qr/+2xz1X8eSbwgkvifYBxHzp8/z3+lRz7ykQDUWpEEgG0A7rvvvlu56qqrrrrqqv9YBFddddVVV131H+y+++679b777rsVYHt7G4C9vT3+JZJ4bpL499jf32d7e5v/aLb5n8I2/5PY5qqr/j+wzf93knhuknh+JPHCSOJfSxL/XsMwcO7cOf47SALANlddddVVV131n4jgqquuuuqqq/4TnD179laAnZ0dAPb39wHY2toCQBL/VpJ4IEm8MNvb2zw/tvnvYJsXxDb/FWzz/Njmqqv+I9jmqqv+vSTxgkjiP8I4jpw7d45/K9v8S2zzQKdOnQIgIpCEbQD+4R/+4be56qqrrrrqqv94BFddddVVV131n+C+++67FWB7e5v73XnnnQBcd911vCCSeG6S+NeQxP3uuusuALa3t/nXss2/lW3+o9nmX8s2/xFsc9VV/5Vs87+VbV4Q21z1/9sjH/lIACICSUjCNgD33XffrVx11VVXXXXVfzyCq6666qqrrvpPcN99990KsL29zQsiif8q29vb/Eezzf93tvmfwjZX/eezzX802/xnsc2/hm3+O9jm38M2V/3rHR4eAvCEJzyB/yqnTp0CoNaKJCSRmQDcd999t3LVVVddddVV//EIrrrqqquuuuo/wdmzZ58BcOONN3K/O++8E4Drr7+eF0YSz00SDySJB5LE83PXXXfxwtjmv4Nt/iPZ5n862zw32zw32/x3sc1VVz032/x3sc1Vz0sS/xGGYeB/AtsAnD179hlcddVVV1111X88gquuuuqqq676T3DffffdyotAEv8VbrjhBv4tbPNvZZt/C9tc9Zxs85/BNlf957LN/0W2+deyzVVXSOJfIon/KufPn+e/yiMf+UgAuq5DEpLITADuu+++W7nqqquuuuqq/3gEV1111VVXXfWf4OzZs7cC7OzscL+77roLgOuuu45/iST+PSQBsL+/z38m2/xXss1/FNv8Z7HN/wW2+e9im6teMNvczzYvCts8kG3+o9nmX8s2/xq2+dewzf90kviv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q6666qqrrvpvcN99990KsLOzw/329vYA2NraAkASDySJB5LEv5UkDg4O2N7e5t/KNv+RbPPfwTb/HrZ5bra56grb/HexzQtjmxfGNv/ZbANgGwDbANgGwDYAtgGwzb/ENgC2eW62eW62eW62uZ9t7meb+9nmfra5n23uZ5sHss39bHM/29jmfra5n21scz/b3M82trmfbe5nm/vZxjYAtrENgG3uZ5v72QbANvezDYBtAGwDYBsA2wDYBsA2ALYBsM39bANgG9sA2MY2ALaxzf1s80C2sc39bGMb2zw320zTxH+VU6dOAdD3PfcbhgGA++6771auuuqqq6666r8ewVVXXXXVVVf9Nzh79uwzAG688Ubut7e3B8Dm5ib/Ffb39wG44YYbeEFs829hmxfENv9b2eY/m23+Jbb5v8Y2/xvY5gWxzb/ENgC2+fewDYBt/iW2eW62eW62eW62uZ9t7meb+9nmfra5n20eyDb3s839bHM/29jmfra5n21scz/b3M82tgGwjW3uZ5v72eZ+trmfbQBsYxsA2wDYxjYAtgGwDYBtAGwDYBsA2wDYBsA2ALaxDYBt7meb+9nmfra5n21s80C2sc0D2cY2tgGYpgmAc+fO8V/hUY96FABd1yEJSYzjCMDZs2efwVVXXXXVVVf91yO46qqrrrrqqv8G99133608l/39fQC2trb4t5DE/SRxP0k8P/v7+/xvYZvnxzbPj23+vWzzf4ltHsg2D2SbB7LNi8o2/xa2+a9imxfGNv9WtvmX2OY/k20AbPOC2Oa52ea52eaFsc39bHM/29zPNvezjW3uZ5v72eZ+tnkg29zPNvezjW3uZ5v72eZ+trENgG1sA2Ab2wDYxjYAtrmfbQBscz/bANgGwDYAtgGwDYBtAGwDYBsA29zPNgC2sQ2Abe5nG9sA2MY297ONbR7INraxzQPZZrlcAnDu3Dn+vWzzour7nvsNwwDAfffddytXXXXVVVdd9V+P4Kqrrrrqqqv+G5w9e/ZWgJ2dHe63t7cHwNbWFveTxANJ4t9DEvfb398HYHt7mxfGNi+IbV4Q2/xr2eY/k23+O9nm38I2/1q2uer5s82/lm3+LWzz38E2L4htnpttnptt7meb52ab+9nmfra5n20eyDb3s839bHM/29jmfra5n23uZxvb3M8297PN/WxzP9vczzb3sw2AbWwD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P0kASAJAEveTBIAkJHE/SQBIAkAS95OEJAAkcT9JSAJAEveThCQAJPFAkpDEC2Ib20hCEgC2uZ9tJAFgGwBJSALANgCSAJCEJO4nCUkASOJ+kpAEgCTuJwlJAEjifpIAkASAJB5IEgCSAJDEc5PE/SRxP0k8P8MwIIlxHNnd3QXgH/7hH36bq6666qqrrvqficpVV1111VVX/Q919uzZW++7775br7nmmge/wzu8A1ddddVVV/3XsM39bHPVC/cP//APv81VV1111VVX/c+FHvSgB3HVVVddddVV/5N97ud+7m9x1VVXXXXVVf9DfeZnfubrcNVVV1111VX/c6EHPehBXHXVVVddddVVV1111VVXXXXVVVddddVV/ydRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V/GPH/pqCJabnBUAAAAASUVORK5CYII=) @@ -70,7 +70,7 @@ firstSketch = startSketchOn('XY') |> extrude(6, %) // Remove a tagged face for the extrusion. -shell({ faces: [myTag], thickness: 0.25 }, firstSketch) +shell({ faces = [myTag], thickness = 0.25 }, firstSketch) ``` ![Rendered example of shell 2](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAEOdElEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuxzP/dzf4urrrrqqqv+z/iRH/mRz/mHf/iH3+aqq6666qqr/n9DD3rQg7jqqquuuuqq/89e53Ve570//MM//Lu46qqrrrrq/5wf+ZEf+ewf/dEf/Ryuuuqqq6666v8v9KAHPYirrrrqqquu+v/qmmuuefA3fdM3PR3gh3/4h3nqU5/K/yeSuOqq/0y2ueqq/w4Pe9jDeOd3fmfuu+++Wz/rsz7rde67775bueqqq6666qr/n6hcddVVV1111f9jH/7hH/5dAE996lP58z//c/4nkMRVV131r2ebq/5z2OZ/mwsXLvCwhz2MV3iFV3jwh3/4h3/XZ37mZ74OV1111VVXXfX/E8FVV1111VVX/T/1Oq/zOu/9Yi/2Yq8N8E3f9E38a0lCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJHHVVVf920hCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJHEVSEISkpCEJCQhCUlIQhKSkIQk/if41V/9VS5cuMCLvdiLvfbrvM7rvDdXXXXVVVdd9f8T5fjx41x11VVXXXXV/zfXXHPNgz/3cz/3twC++Zu/mYsXLyIJSUhCEpKQhCQkIQlJSEISV1111f8PkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQxP83kpCEJCQhCUlIQhKSkIQkJPGfYblcslqtePEXf3Ee/OAHv/Sf/dmf/czh4eEuV1111VVXXfX/C8FVV1111VVX/T/04R/+4d8F8NSnPpWnPvWpXPVfTxKS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q6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/in8Ecao5Y1MyHjcAAAAASUVORK5CYII=) @@ -87,8 +87,8 @@ firstSketch = startSketchOn('XY') // Remove a tagged face and the end face for the extrusion. shell({ - faces: [myTag, 'end'], - thickness: 0.25 + faces = [myTag, 'end'], + thickness = 0.25 }, firstSketch) ``` @@ -107,20 +107,20 @@ case = startSketchOn('-XZ') thing1 = startSketchOn(case, 'end') |> circle({ - center: [-size / 2, -size / 2], - radius: 25 + center = [-size / 2, -size / 2], + radius = 25 }, %) |> extrude(50, %) thing2 = startSketchOn(case, 'end') |> circle({ - center: [size / 2, -size / 2], - radius: 25 + center = [size / 2, -size / 2], + radius = 25 }, %) |> extrude(50, %) // We put "case" in the shell function to shell the entire object. -shell({ faces: ['start'], thickness: 5 }, case) +shell({ faces = ['start'], thickness = 5 }, case) ``` ![Rendered example of shell 4](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAFKS0lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXV/1rXXHPNgwHOnDnzYIBrrrnmwQBnzpx5EM/lmmuueTDP5b777ruVZzp79uwzeKb77rvvVoCzZ8/eet99993KVVddddVVV1111VX/W1G56qqrrrrqqquuuup/pGuuuebBAC/2Yi/22mfOnHkQwIu/+Iu/NsCZM2cefM011zyYF2J3d5d/jePHj/P83Hfffbdec801D77vvvtuPXv27K333XffrQD/8A//8DsA9913363/8A//8NtcddVVV1111VVXXfU/EXrQgx7EVVddddVVV1111VX/fa655poHnzlz5sEv9mIv9loAL/7iL/7aL/ZiL/baPMDu7i4AFy9eZHd3l4sXLyKJ3d1dLl68yO7uLgC7u7v8a9jmuR0/fpz7nThxguPHjwNw/PhxTpw4wfHjxwF4yEMewgPdd999t/7DP/zDbwP8wz/8w+/cd999t/7DP/zDb3PVVVddddVVV1111X8n9KAHPYirrrrqqquuuuqqq/5rXHPNNQ8+c+bMg1/sxV7stV78xV/8tV/sxV7stXmm3d1dAJ7+9Kdz8eJFdnd32d3d5dZbb+W/g23+JceOHQPgIQ95CAAPechDOHHiBA95yEO433333Xfr2bNnb73vvvtu/Yd/+Iff+a3f+q3v5qqrrrrqqquuuuqq/yroQQ96EFddddVVV1111VVX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ABw/fpyXf/mX5w3e4A247777bv2t3/qt7/7RH/3Rz+Gqq6666qqrrrrq/yb0oAc9iKuuuuqqq6666qr/a97xHd/xs17ndV7nva+55poH/8Zv/Aa/8Ru/AYAk7ieJ+0nifpK4nyQeSBLPTRLPTRIviCReFJL472KbF5VtXhDbPDfbPDfbPDfb3M82D2Sb+9nmfra5n23uZxsA29zv+PHjvPzLvzxv8AZvwH333Xfrb/3Wb333j/7oj34OV1111VVXXXXVVf+3oAc96EFcddVVV1111VVX/V/xYi/2Yq/94R/+4d91zTXXPPjXf/3X+c3f/E3uJwkASdxPEveTxANJ4n6SeG6SeG6SeH4k8cJI4n862/xLbPP82Ob5sc0D2eaBbPNAtrmfbR7INvezDYBt7mcbANvczzYnTpzg5V7u5XjDN3xD7rvvvlt/9Ed/9HN+67d+67u56qqrrrrqqquu+r8BPehBD+Kqq6666qqrrrrqf7trrrnmwR/+4R/+XS/2Yi/22k972tP48R//cXZ3dwGQxP0kcT9J3E8S95PEA0nigSTxQJJ4fiTxgkjiX0MS/9ls869hmxfGNs+PbZ6bbR7INg9kmweyzf1scz/b3M8297MNgG0AbHM/2wAcP36cN3zDN+TlX/7lue+++279+q//+vf5h3/4h9/mqquuuuqqq6666n839KAHPYirrrrqqquuuuqq/62uueaaB7/2a7/2e73TO73TZ1+8eJEf//Ef52lPexqSAJDE/SQBIIn7SeJ+knggSTyQJB5IEs9NEi+IJP4lkvifxjYvCts8P7Z5fmzz3GzzQLZ5INvczzb3s839bHM/29zPNgC2uZ9tAGwDYJsTJ07wTu/0Tmxvb9/6D//wD7/9oz/6o59z33333cpVV1111VVXXXXV/07oQQ96EFddddVVV1111VX/G73jO77jZ73TO73TZ1+8eJEf//Ef52lPexqSuJ8kACRxP0ncTxL3k8T9JPFAknggSTw3STw/knhhJPGvJYn/KLb517LNv8Q2z49tnpttHsg2z80297PNA9nmfra5n20AbHM/2wDY5n62AbANgG0AXu7lXo43fMM3ZJqmW3/rt37ru3/0R3/0c7jqqquuuuqqq6763wc96EEP4qqrrrrqqquuuup/k2uuuebBn/M5n/Nb11xzzYN//dd/nd/4jd8AQBL3kwSA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SQBIAkASx48f56Ve6qV47dd+be539913c/78ecZx5IWRxAvS9z0nT57kuuuu44HW6zXnzp3j3LlzrNdrnpsk/rUk8R9JEv8T2OY/mm1msxmnTp1iZ2eH7e1t7jcMAwcHB1y8eJGDgwMAbPMvsc0D9X3PyZMnuf766wHY3d3l6U9/Or/xG7/B7u4utgGwDYBtAGxjGwDb2AbANrYBsI1tbGMb29jmxIkTfNRHfRR/+7d/+91f//Vf/z5cddVVV1111VVX/cdCD3rQg7jqqquuuuqqq676j/S5n/u5v3X99de/9g/90A/xtKc9DUlIQhKSAJCEJCQBIAkASUgCQBIAkgCQBMCJEyd4qZd6KV77tV+b+919992cP3+eYRh4bpL4l8xmM06ePMl1113HA63Xa86ePcu5c+dYr9dI4kUliX8rSfx/ZZsXxWw249SpU+zs7LC9vc39hmHgnnvuYRgGDg4OeG62eWFs0/c9p06d4vrrrwdgd3eXpz3tafzmb/4mFy9eBMA2ALaxDYBtAGxjGwDb2MY2ALaxjW1sY5sTJ07wUR/1Ufzt3/7td3/913/9+3DVVVddddVVV131Hwc96EEP4qqrrrrqqquuuuo/yud+7uf+1vXXX//an//5n48kJCEJSQBIQhKSAJCEJAAkIQkASQBIAkASx48f56Vf+qV57dd+be531113cf78eYZhAEAS/xJJ3O+6665je3ubra0t7rderzl79iznzp1jvV7zwkjiX0MS/16S+N/ONv8RbAMwm804ffo029vb7OzscL9hGLj77ru5cOECL4xtnp++7zl16hTXX389ABcvXuSv/uqv+Mu//EsuXryIbQBsYxsA29gGwDa2AbCNbWwDYBvb2MY2J06c4KM+6qNord36IR/yIQ/hqquuuuqqq6666j8GetCDHsRVV1111VVXXXXVf4TP/dzP/a3rr7/+tT//8z8fSUhCEgCSkIQkJAEgCUkASEISAJIAkASAJF77tV+b137t1+Z+d911F+fOnWMcR14QSTw/fd9z6tQprr/+eu63Xq85e/Yse3t77O3t8dwk8aKQxL+WJP6zSOK/km3+s9jmRTGbzTh9+jQ33ngj9xuGgfPnz3PhwgWGYQDANv8S2wD0fc+pU6e44YYbAHj605/O0572NH7zN38T29gGwDYAtrENgG1sA2Ab29jGNraxjW1s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+27lqquuuuqqq676n4bgqquuuuqqq676H+m+++67FWB7e5vntr+/D8D29jYAknhhJPFA+/v7XPW/hyT+N5DEv4Yk7ieJB5LEc5PEc5PE8yMJSfxLJCEJSUhCEi8KSUhCEpKQxPMjCUlI4rlJQhIPJIn7SUIS95MEgCQkASAJAEkASAJAEgCSAJBEa41z587xb3H69GkAWmsASEISkpDEVVddddVVV131PxrBVVddddVVV131P9LZs2dvBdja2uK57e/vA7C9vc0LIonnRxIA29vb3M82V/3XkcR/NUn8R5DEi0IS95PE/STxopLEc5PEc5OEJJ4fSUhCEi8qSUhCEpJ4UUlCEpKQxHOThCQk8UCSkMT9JCGJ+0nifpK4nyQAJAEgCQBJAEgCQBIA0zTxH0ES95NErRWA++6771auuuqqq6666qr/iahcddVVV1111VX/J0jCNi+Kvb09rvq3kcR/BUm8MJJ4bpL4zyKJF0QS/xEk8aKQxPMjiRdGEpKQxL+GJCQhCUlI4kUhCUlI4rlJQhIPJAlJ3E8SkgCQhCQAJHE/SQBIAkASAJIAkASAJADOnTvHA9lGEv+SU6dOAZCZSOKBaq0AnD179lauuuqqq6666qr/iQiuuuqqq6666qr/0ba3t3luBwcHAGxvb/NAknggSdxPEvfb399na2uL/262uerZJPGfTRIAknhRSOJfQxL/EkncTxIPJIkHksTzI4nnRxIvCklIQhKS+NeShCQkIQlJSOIFkYQknpskJPFAkpDE/SRxP0kASOJ+kgCQBIAkACQBIAmA1hr/VqdPnwZgmiYkIQlJSKLWCsB99913K1ddddVVV1111f9EBFddddVVV1111f9I9913360A29vb/GtI4l8iiReVbZ4f2zw/tvn/ShL/WpL47yQJAEkASAJAEv8SSbwwkrifJP6tJPH8SOL5kYQk/jUkIQlJSOLfShKSkMTzIwlJSOKBJCGJB5LE/SRxP0kASEISAJIAkASAJAAkASAJgHPnzvHvIQkASUhCElddddVVV1111f94BFddddVVV1111f9I99133628APv7+wBsb2/zL5HE/SQBsLe3B8DW1hZX/e8hiReFJP4zSeI/kiQeSBLPTRLPjyReEElIQhL/WpKQhCQkIQlJSOJFJQlJSOL5kYQkHkgSkrifJO4niftJ4n6SAJAEgCQA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QhKSkIQkJCEJSUhCEpKQxFUvnCQkIQlJSEISkvjXuvXWWzl9+jTPzTYPNI4jAPfdd9+tXHXVVVddddVV/5tRueqqq6666qqr/l946EMfCsBf//Vf859BEldd9W8liX8t21wFknh+bPP87O7uAvDoRz+a06dPA1BK4blN0wTA2bNnn8FVV1111VVXXfW/GZWrrrrqqquuuup/tbNnzz4DYGdnhweyzf7+PgBbW1sA7O7u8q8hiauu+p9KEi8q2/x/I4nnZ3d3l1tvvZVHP/rRnDlzBoBaK1ddddVVV1111f9ZVK666qqrrrrqqv/V7rvvvlsBtre3eW57e3sAbG5uAnDrrbcCIImrrvr/RBIvCtv8XycJgMc85jGcO3eOF2SaJgDuu+++W7nqqquuuuqqq/43I7jqqquuuuqqq/5P2NnZ4YW55ppreMYznoEkrrrqqudPEpKQhCQkIQlJSEIS/xfceuutnD59mtOnTwNQSuG5jeMIwNmzZ2/lqquuuuqqq67634zgqquuuuqqq676X+3s2bO38gLs7e0BsLm5yebmJs94xjO46qqr/n0kIQlJSEISkpCEJP43+Ju/+RtOnz7Nox/9aABqrVx11VVXXXXVVf9nUbnqqquuuuqqq/5P2N7e5gXZ3NwEYHd3l6uuuuo/lyReGNv8T2ebaZoAuO+++27lqquuuuqqq67634zKVVddddVVV131v9p99913Ky/A/v4+9/ubv/kbrnpOkrjqCttc9V9DEi+Ibf4r7O7ucuutt/LgBz8YgFor97ONJK666qqrrrrqqv8zCK666qqrrrrqqv/17rvvvlsBdnZ2eG57e3v8XyAJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSuOrZJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhJX/etJQhKSkIQkJCGJ/2i33norz802ANM0AXDffffdylVXXXXVVVdd9b8dlauuuuqqq6666n+9s2fP3nrNNdc8eHt7m729PZ6fl3qpl+KlXuqluOqqq656oForALaRBMA0TQCcPXv2Vq666qqrrrrqqv/tCK666qqrrrrqqv/Tfvqnf5o777yTq6666qrnNpvNuP7667HNA03TBMB99913K1ddddVVV1111f92VK666qqrrrrqqv/17rvvvltf7MVejO3tbZ7b/v4+P/3TP40knh9JPD+SeH4k8dwk8fxI4rlJ4rlJ4rlJ4oEk8dwk8UCSeCBJPJAkHkgSDySJB5LEA0nifpJ4IEncTxL3k8T9JHE/SdxPEveTxP0kcT9J3E8SAJK4nyTuJwkASdxPEgCSuJ8kACQBIAkASdxPEgCSAJAEgCQAJAEgCQBJAEgCQBIAkgCQhCQAJAEgCQBJSAJAEgCSkASAJAAkIQkASUgCQBKSAJCEJAAkIQlJAEhCEpIAkIQkJCEJAElIQhKSAJCEJCQhCUlIAkASkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSiAgkIQlJSEISkpCEJCQhCUkA2EYSV1111VVXXXXV/1lUrrrqqquuuuqq//Xuu+++WwG2t7e56qoXhST+JZL4jySJfy9J/GtI4v8T2/xrSOL5GccRgPvuu+9Wrrrqqquuuuqq/+0Irrrqqquuuuqqq/6dbHPV/12S+PeQxL9EEs9NEi+MJJ4fSbwgkrjqhbPNNE0AnD179hlcddVVV1111VX/21G56qqrrrrqqqv+1zt79uwzAG688Ub29/d5QSTxryGJ5yaJF5UkXhSSeG6S+JdI4oEk8cJI4oWRxANJ4gWRxANJ4vmRxPMjiftJ4vmRxP0k8dwk8dwkcT9JPDdJAEjiuUnigSQBIInnJgkASTyQJO4nCQBJPJAkACRxP0k8kCQk8UCSkMT9JHE/SQBI4n6SkMT9JHE/SUjifpKQxP0kASAJSdxPEpIAkMT9JCEJAElIAkASAJKQBIAkACQBIIkHso0kbANgG0lIAkASkgCQBIAkJAEgCUkASAJAEpIAkIQkACQBIAlJ3G+aJq666qqrrrrqqv8zqFx11VVXXXXVVf/r3Xfffbf+1m/91ne/zuu8znvfeOONXHXVVf+72QbANv9d/uEf/uG3/+Ef/uG3ueqqq6666qqr/rejctVVV1111VVX/a/3D//wD7/NVVddddV/oB/90R/9nPvuu+9Wrrrqqquuuuqq/+3Qgx70IK666qqrrrrqqquuuuqqq6666qqrrrrqqv+TqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6v4RxzErlDoKT09AAAAAElFTkSuQmCC) @@ -138,20 +138,20 @@ case = startSketchOn('XY') thing1 = startSketchOn(case, 'end') |> circle({ - center: [-size / 2, -size / 2], - radius: 25 + center = [-size / 2, -size / 2], + radius = 25 }, %) |> extrude(50, %) thing2 = startSketchOn(case, 'end') |> circle({ - center: [size / 2, -size / 2], - radius: 25 + center = [size / 2, -size / 2], + radius = 25 }, %) |> extrude(50, %) // We put "thing1" in the shell function to shell the end face of the object. -shell({ faces: ['end'], thickness: 5 }, thing1) +shell({ faces = ['end'], thickness = 5 }, thing1) ``` ![Rendered example of shell 5](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAADSR0lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuup/jGuuuebBAGfOnHkwwDXXXPPgM2fOPIhnuuaaax7MM11zzTUP5pnOnDnzYJ7LNddc82BeRPfdd9+tPB9nz569lWe67777buUB7rvvvlvPnj37DJ7pvvvuuxXg7Nmzt9533323ctVVV1111VVXXXXV/wToQQ96EFddddVVV1111VVX/ee55pprHnzmzJkHX3PNNQ8+c+bMgwCuueaaB19zzTUPBjhz5syDr7nmmgfzAPfdd9+t11xzzYP5N7hw4QL/HidPnuQ/wn333Xcrz3T27Nlb77vvvlsB/uEf/uF3AO67775bz549e+t99913K1ddddVVV1111VVX/WdBD3rQg7jqqquuuuqqq6666t/ummuuefCZM2ce/GIv9mKvBXDNNdc8+Jprrnnwi73Yi702L6ILFy4AcOHCBS5evAjAhQsXALhw4QIAFy5c4H4XL14E4MKFC/xnO3nyJA904sQJAE6ePMn9Tp48ycmTJwE4ceIEACdPnuTkyZO8KO67775bAf7hH/7htwH+4R/+4Xfuu+++WwH+4R/+4be56qqrrrrqqquuuurfCj3oQQ/iqquuuuqqq6666qoX7pprrnnw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duwYOzs7HDt2jJ2dHQCOHTvGsWPHuN/Ozg7329vbY2dnh729Pe536dIlAC5dusTe3h6XLl1ib2+PS5cu8fwcO3aMm2++mZtvvpljx45x8803c7+LFy/y9Kc/nb/6q7/i6U9/Olf957PNf4YTJ07wMi/zMrze670eD3Tp0iX+/u//nkuXLvH3f//3/Gewzb/WsWPHOHbsGDs7O9xyyy3ccsstHDt2jPtdvHiRpz/96TztaU/jL//yL/mP9nqv93q83uu9Hv/wD//w25/5mZ/5Olx11VVXXXXVVf/XoAc96EFcddVVV1111VX/9/zET/yEAb78y7+c3d1d/r2OHz/Oy77sy3L8+HFe9mVflvtdunSJv//7vwfgD//wD3lux44d4+abb2ZnZ4dbbrmFnZ0djh07xn+mS5cuAXD77bdz++23c+nSJW6//Xae27Fjx9jZ2eHmm2/mlltu4eabbwbg4sWL/NVf/RVPf/rTefrTn85V//MdP36cl3mZl+H1Xu/1uN+lS5f4+7//e2677TZuv/12/qexzQty7NgxbrnlFm6++WaOHTvGLbfcAsDFixd5+tOfztOf/nT+8i//kudmm3+t48eP84mf+Incd999t37Ih3zIQ7jqqquuuuqqq/6vQQ960IO46qqrrrrqqqv+b3md13md9/7wD//w7/rLv/xLfvInf5J/j+PHj/OyL/uyvO7rvi73u3TpEn//93/PP/zDP3Dp0iUe6NixY7zYi70Yt9xyCzfffDMvyNHREUdHRxwdHXF0dIRtjo6OODw85H4HBwcAZCa2yUw2NjawjW02NjawzXXXXYdttre32d7eZnt7m+d26dIl9vb2uO222/iHf/gHLl26xHM7duwYL/ZiL8aLv/iLc+zYMQD+8i//kr/6q7/i6U9/Olf9z3P8+HFe7/Vej5d5mZcB4NKlS/z93/89f/d3f8fe3h7/F9jm2LFj3HLLLbz4i784t9xyCwAXL17k6U9/On/5l3/J05/+dP41bPNA7//+789DH/pQPvMzP/N1/uEf/uG3ueqqq6666qqr/i9BD3rQg7jqqquuuuqqq/5v+dzP/dzferEXe7HX/omf+An+6q/+in+L133d1+VlXuZlOHHiBACXLl3i7//+7/nDP/xDntuxY8d4sRd7MV7t1V6N57ZarVgul5w/f56joyOOjo44d+4ctslMAGxj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FCdOnOCB9vb2eNzjHsfjHvc49vb2uOpFI4l/L9v8Z9vb2+OP//iP+eM//mN2dnZ47GMfy80338xNN93Ezs4Oj3nMY9jb22N/f5/9/X3uuusu7rzzTg4ODvjPIglJSEISz21zc5NrrrmGjY0NHvKQh7C5ucn99vb2+Id/+Af+4R/+gb29Pf6zSOIFsc1/pb29PW6//XZuvvnmB73Yi73Ya/3DP/zDb3PVVVddddVVV/1boAc96EFcddVVV1111VX/Nt/0Td/09GuuuebBv/Irv8LjHvc4/ieSxH+mnZ0dHvvYx3LTTTdx00038UB7e3vs7e2xv7/PnXfeyd7eHvv7+xwcHAAgCUkASAJAEgARgSQkIQlJSEISAJKICLa2ttja2uK6664D4Nprr+XMmTM8t729Pe644w7uuOMOHve4x3HV/062+ffY2dnhpptu4uabb+axj30sz21/f5/9/X329/e56667ODg4AOCuu+5CEi+MJCQhCUlIQhKSkEREIImtrS22tra49tprAbjmmmu45ppreG57e3v8wz/8A7fffjt33HEH/5PZ5j/DzTffzDu+4zty33333fohH/IhD+Gqq6666qqrrvq3oHLVVVddddVVV/2bvNiLvdhrX3PNNQ8GeNzjHsd/FUn8T7K3t8cf//EfA7Czs8NNN93ETTfdxM7ODjfddBM7OzsAPOYxj+GB9vf3Adjf32d/f58H2t/fRxIAktje3gZge3sbgK2tLba2tnhB9vb2AHjc4x4HwOMe9zj29va46n8/Sfxr2OaB9vb2eNzjHsfjHvc4fuVXfoWdnR1uuukmbr75ZnZ2drjpppuwzQ033MCjHvUoHmh/fx+A/f19AA4ODgCwzcHBAQCSANje3kYSANvb2wBce+21vCB7e3sA/MM//AN33HEHd9xxBw8kiedmm/8pJPH82Obf49KlSwBcc801D36xF3ux1/6Hf/iH3+aqq6666qqrrvrXonLVVVddddVVV/2bvM7rvM57ATzucY/j30sS/xfs7e3xuMc9jsc97nHcb2dnh5tuugmAm266iZ2dHQBuuukmALa3t/m32NvbA2Bvb4877rgDgDvuuIM77riDq666nyRemP39fR7/+Mfz+Mc/HtsA7OzssLOzw87ODjfffDM7OzsA7OzssLOzw/b2Nv8We3t7AOzt7XH77bcDcMcdd3DHHXfw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VVdd9e9mmweSxH812zw3SfxPZJsXRBJXXfXfyTb/m9jmfwLb/FeyzQ033ADA2bNnb+Wqq6666qqrrnpBCK666qqrrrrqqhfovvvuuxVgZ2eHfw3b2MY2tvnvYhvb2MY2tvmfzja2sY1tbGMb29jmqqv+vWxjG9vYxja2sY1t/iezjW1sYxvb/HexjW1sY5v/CraxjW0e6L777ruVq6666qqrrrrqBaFy1VVXXXXVVVe9QPfdd9+tANvb2/x72OaBJPHfxTbPTRL/W9jmXyKJq/5/ss3/Fbb5n8Q2/x1s84Jsb28DcN99993KVVddddVVV131glC56qqrrrrqqqv+y9nmgSTx38k2z48k/jeyzYtCElf972Cb/8ts8z+Nbf472OZFtbOzA8DZs2efwVVXXXXVVVdd9YJQueqqq6666qqrXqB/+Id/+B2AG264gf9MtnkgSfxPYJvnJon/K2zzryWJq/59bPP/lW3+J7LNfyfbXHXVVVddddVV/2moXHXVVVddddVV/+PY5rlJ4n8C2zw/kvj/wDb/kSTxP51trvrXsc3/ZLb572Sb/wg33ngjAPfdd9+tXHXVVVddddVVLwiVq6666qqrrrrqBTp79uytADs7O9jmfpL4r2abB5LE/yS2eUEkcdXzZ5ur/neyzf8WtvnvZJv/TGfPnr2Vq6666qqrrrrqBaFy1VVXXXXVVVf9i7a3t3kg29xPEv8dbPPcJPE/kW1eEElcddX/VLb538Y2/xPY5j/b9vY2APfdd9+tXHXVVVddddVVLwjBVVddddVVV131At1333233nfffbcCbG9v8/zYxja2sc1/J9vYxja2sc3/dLaxjW1sYxvb2MY2V131n802trGNbWxjG9v8T2cb29jGNrb572Ib29jGNlddddVVV1111f8YBFddddVVV1111Qt19uzZWwF2dnZ4UdjGNraxzX8329jGNraxzf8mtrGNbWxjG9vYxjZXXfXC2MY2trGNbWxjG9vY5n8L29jGNraxzX8n29jGNrb5r2Ib29xwww0A/MM//MNvc9VVV1111VVXvTBUrrrqqquuuuqq/1S2eW6S+O9km+cmif+NbPOikMRV/7fY5v8q2/xPY5v/LrZ5btvb2wDcd999t3LVVVddddVVV70wBFddddVVV1111Qt133333Qqwvb3NfxTb2MY2tvmfwDa2sY1tbGOb/ytsYxvb2MY2trGNbWxjG9tc9d/DNraxjW1sYxvb2MY2trGNbf4vsI1tbGMb29jmfwLb2MY2tvmvZBvb2MY2V1111VVXXXXVvwuVq6666qqrrrrqhbrvvvtuBdje3uY/i20eSBL/U9jm+ZHE/1W2+feQxP9Htrnq+bPN/2S2+e9km3+tnZ0dAO67775bueqqq6666qqrXhgqV1111VVXXXXVC3X27NlnAOzs7PBfxTbPTRL/k9jm+ZHE/3e2uer/J9v8b2Cb/262+ffY3t4G4OzZs8/gqquuuuqqq656YahcddVVV1111VUv1H333XcrwPb2NraRxH8H2zyQJP4nss0LIomrrvrfzjb/m9jmfwLbXHXVVVddddVV/y2oXHXVVVddddVVL5Lt7W0AbPNAkvjvYJvnJon/yWzzgkjiqqv+p7DN/0a2+Z/CNv+ZbrzxRgD+4R/+4be56qqrrrrqqqteGCpXXXXVVVddddULdfbs2Vt5IWzzQJL472Kb5yaJ/w1s88JI4qqr/qPY5n872/xPYpurrrrqqquuuup/JCpXXXXVVVddddULdd99990KsLOzw4vCNg8kif9Otnlukvjfxjb/EklcdZVt/q+xzf80tvnvtLOzA8B99913K1ddddVVV1111QtDcNVVV1111VVX/Yvuu+++WwF2dnb417KNbWxjm/8JbGMb29jGNrb53842trGNbWxjG9vYxja2sc1V/7vYxja2sY1tbGMb29jGNrb53842trGNbWzzP4FtbGMb2/x3sc3W1hZXXXXVVVddddWLjOCqq6666qqrrvoXnT179laA7e1t/r1sYxvb2OZ/EtvYxja2sY1t/i+yjW1sYxvb2MY2trGNbWxjG9tc9R/DNraxjW1sYxvb2MY2trGNbWzzf5FtbGMb29jGNv9T2MY2trHNfxfb2MY2tgHY2dkB4B/+4R9+m6uuuuqqq6666l9C5aqrrrrqqquu+m9lm+cmif9JbPP8SOL/E9v8R5LE/wa2uerfzjb/G9jmfwLb/Et2dnYAuO+++27lqquuuuqqq676lxBcddVVV1111VX/ovvuu+9WgBtvvJH/CraxjW1s8z+VbWxjG9vYxjZXvWhsYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGObq140trGNbWxjG9v8T2Qb29jGNrb572Qb29jmqquuuuqqq676D0flqquuuuqqq676F91333238t/INs9NEv9T2eYFkcRVV/1vZZv/bWzzP41t/j22t7cBuO+++27lqquuuuqqq676l1C56qqrrrrqqqv+RWfPnn0GwPb2Nv9T2Oa5SeJ/Otu8MJK46qr/Lrb538w2/xPZ5j/Szs4OAGfPnn0GV1111VVXXXXVv4TKVVddddVVV131L7rvvvtuBdjZ2cE2DySJ/yls89wk8b+JbV4YSVx11b+Vbf6vsM3/VLb5z7S9vQ3AfffddytXXXXVVVddddW/hMpVV1111VVXXfUvOnv27K0AOzs7PDfbPDdJ/E9hm+dHEv8b2eZFIYmr/v+wzf9ltvmfzDb/lXZ2dgA4e/bsrVx11VVXXXXVVf8SKlddddVVV1111X842zyQJP6nsc1zk8T/FbZ5UUniqv95bPP/jW3+N7DNVVddddVVV131vwaVq6666qqrrrrqX3TffffdCrC9vc2/hW0eSBL/E9nm+ZHE/2W2+beSxFUvmG2uev5s87+Fbf672eZ+Ozs7ANx33323ctVVV1111VVX/UuoXHXVVVddddVVL5L77rvv1muuuebBOzs77O3t8e9hm+cmif+pbPP8SOL/O9v8d5DEv4ZtrvqvZ5v/jWzz3802z8/Ozg4A9913361cddVVV1111VUvCoKrrrrqqquuuupFcvbs2VsBtre3+c9gG9vYxjb/G9jGNraxjW1sY5ur/nPZxja2sY1tbGMb29jGNraxzVX/uWxjG9vYxja2+d/ANraxjW1s89/BNraxjW1ekO3tbQDOnj17K1ddddVVV1111YuC4Kqrrrrqqquu+lfZ2dnhv4JtbGMb29jmfxPb2MY2trGNbWxz1VX/G9nGNraxjW1sY5v/LWxjG9vYxjb/nWxjG9u8qHZ2dgC47777buWqq6666qqrrnpREFx11VVXXXXVVS+Sv//7v/9tgO3tbf672MY2trGNbf43so1tbGMb29jGNra56qr/DraxjW1sYxvb2MY2/xvZxja2sc1/N9vYxja2ueqqq6666qqr/ktQueqqq6666qqr/tVsAyCJ/262eW6S+N/MNv8SSVx11YvKNv+X2eZ/Itv8R7vpppsAuO+++27lqquuuuqqq656UVC56qqrrrrqqqteJP/wD//wOwA33ngj97PNA0nifwLbPDdJ/F9imxeFJK76v8s2/9/Y5n8q2/xXOXv27DO46qqrrrrqqqteFFSuuuqqq6666qr/MLZ5IEn8T2Gb50cS/5fZ5l9DElf997LNVVfY5n8y2/xX297eBuC+++67lauuuuqqq6666kVB5aqrrrrqqquuepGcPXv2VoCdnR1eVLZ5bpL4n8Q2z48k/j+yzb+HJP6/s81V/zq2+Z/ONv8T7OzsAHD27Nlbueqqq6666qqrXhRUrrrqqquuuuqq/1K2eSBJ/E9km+dHEle9YLa56qoXxDb/W9jmfwLbPNDOzg4A9913361cddVVV1111VUvCipXXXXVVVddddWL5L777rsVYGdnh/9ItnlukvifyjbPjySuuuoqsM3/Nrb5n8I2V1111VVXXXXVfyiCq6666qqrrrrqRfb3f//3vw1w44038p/JNraxjW1s8z+dbWxjG9vYxja2ueqq/2tsYxvb2MY2trHN/wa2sY1tbPPfzTa2sc0Ls7OzA8DZs2efwVVXXXXVVVdd9aKictVVV1111VVX/a9gmweSxP8WtnlhJHHVVf/T2Ob/Atv8T2Obf4ubbroJgPvuu+9WrrrqqquuuuqqFxXBVVddddVVV131Ijt79uytADs7O/x3s41tbGMb29jmfyPb2MY2trGNbWxjm6uu+o9mG9vYxja2sY1tbGOb/41sYxvb2MY2/xPYxja2sc2/13333XcrV1111VVXXXXVi4rKVVddddVVV131IrvvvvtuBdje3sY295PE/xS2eW6S+N/MNi8KSVx1lW3+r7PN/2S2+c+wvb0NwH333fd0rrrqqquuuuqqFxWVq6666qqrrrrq3802DySJ/0ls8/xI4v8S27yoJHHV/x62+f/KNv+T2ea/ys7ODgBnz559BlddddVVV1111YuK4KqrrrrqqquuepH9wz/8w28D3HTTTbwwtrGNbWxjm/+JbGMb29jGNrb5/8A2trGNbWxjG9vYxja2sY1tbGObq/59bGMb29jGNraxjW1sYxvb2MY2tvn/wDa2sY1tbGOb/2lsYxvb2Oaqq6666qqrrvofj8pVV1111VVXXfVfwjYPJIn/qWzz/Eji/zvb/GeSxH8n21z1n8s2/5vY5n8C29x0000AnD179lauuuqqq6666qoXFZWrrrrqqquuuupFdt99990KsLOz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D2DbksQz3Xfffbdy1VVXXXXVVVf9e6EHPehBXHXVVVddddVVV1111VVXXXXVVVddddVV/ydRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q/hH5DLfERTSZ+IAAAAASUVORK5CYII=) @@ -172,20 +172,20 @@ case = startSketchOn('XY') thing1 = startSketchOn(case, 'end') |> circle({ - center: [-size / 2, -size / 2], - radius: 25 + center = [-size / 2, -size / 2], + radius = 25 }, %) |> extrude(50, %) thing2 = startSketchOn(case, 'end') |> circle({ - center: [size / 2, -size / 2], - radius: 25 + center = [size / 2, -size / 2], + radius = 25 }, %) |> extrude(50, %) // We put "thing1" and "thing2" in the shell function to shell the end face of the object. -shell({ faces: ['end'], thickness: 5 }, [thing1, thing2]) +shell({ faces = ['end'], thickness = 5 }, [thing1, thing2]) ``` ![Rendered example of shell 6](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAADZl0lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuup/jGuuuebBAGfOnHkwwDXXXPPgM2fOPIhnuuaaax7MM11zzTUP5pnOnDnzYJ7LNddc82BeRPfdd9+tPB9nz569lWe67777buUB7rvvvlvPnj37DJ7pvvvuuxXg7Nmzt9533323ctVVV1111VVXXXXV/wToQQ96EFddddVVV1111VVX/ee55pprHnzmzJkHX3PNNQ8+c+bMgwCuueaaB19zzTUPBjhz5syDr7nmmgfzAPfdd9+t11xzzYP5N7hw4QL/HidPnuQ/wn333Xcrz3T27Nlb77vvvlsB/uEf/uF3AO67775bz549e+t99913K1ddddVVV1111VVX/WdBD3rQg7jqqquuuuqqq6666t/ummuuefCZM2ce/GIv9mKvBXDNNdc8+Jprrnnwi73Yi702L6ILFy4AcOHCBS5evAjAhQsXALhw4QIAFy5c4H4XL14E4MKFC/xnO3nyJA904sQJAE6ePMn9Tp48ycmTJwE4ceIEACdPnuTkyZO8KO67775bAf7hH/7htwH+4R/+4Xfuu+++WwH+4R/+4be56qqrrrrqqquuuurfCj3oQQ/iqquuuuqqq6666qoX7pprrnnw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/2q2AZDEfzfbPDdJ/G9mm3+JJK666kVlm//LbPM/kW3+o910000A3Hfffbdy1VVXXXXVVVe9KKhcddVVV1111VUvkn/4h3/4HYAbb7yR+9nmgSTxP4Ftnpsk/i+xzYtCElf932Wb/29s8z+Vbf6rnD179hlcddVVV1111VUvCipXXXXVVVddddV/GNs8kCT+p7DN8yOJ/8ts868hiav+e9nmqits8z+Zbf6rbW9vA3DffffdylVXXXXVVVdd9aKgctVVV1111VVXvUjOnj17K8DOzg4vKts8N0n8T2Kb50cS/x/Z5t9DEv/f2eaqfx3b/E9nm/8JdnZ2ADh79uytXHXVVVddddVVLwoqV1111VVXXXXVfynbPJAk/ieyzfMjiateMNtcddULYpv/LWzzP4FtHmhnZweA++6771auuuqqq6666qoXBZWrrrrqqquuuupFct99990KsLOzw38k2zw3SfxPZZvnRxJXXXUV2OZ/G9v8T2Gbq6666qqrrrrqPxTBVVddddVVV131Ivv7v//73wa48cYb+c9kG9vYxja2+Z/ONraxjW1sYxvbXHXV/zW2sY1tbGMb29jmfwPb2MY2tvnvZhvb2OaF2dnZAeDs2bPP4KqrrrrqqquuelFRueqqq6666qqr/lewzQNJ4n8L27wwkrjqqv9pbPN/gW3+p7HNv8VNN90EwH333XcrV1111VVXXXXVi4rgqquuuuqqq656kZ09e/ZWgJ2dHf672cY2trGNbWzzv5FtbGMb29jGNraxzVVX/UezjW1sYxvb2MY2trHN/0a2sY1tbGOb/wlsYxvb2Obf67777ruVq6666qqrrrrqRUXlqquuuuqqq656kd133323Amxvb2Ob+0nifwrbPDdJ/G9mmxeFJK66yjb/19nmfzLb/GfY3t4G4L777ns6V1111VVXXXXVi4rKVVddddVVV13172abB5LE/yS2eX4k8X+JbV5Ukrjqfw/b/H9lm//JbPNfZWdnB4CzZ88+g6uuuuqqq6666kVFcNVVV1111VVXvcj+4R/+4bcBbrrpJl4Y29jGNraxzf9EtrGNbWxjG9v8f2Ab29jGNraxjW1sYxvb2MY2trHNVf8+trGNbWxjG9vYxja2sY1tbGMb2/x/YBvb2MY2trHN/zS2sY1tbHPVVVddddVVV/2PR+Wqq6666qqrrvovYZsHksT/VLZ5fiTx/51t/jNJ4r+Tba76z2Wb/01s8z+BbW666SYAzp49eytXXXXVVVddddWLispVV1111VVXXfUiu++++24F2NnZ4d/LNs9NEv+T2eb5kcRV/zFsc9X/frb538g2/5PY5vm57777buWqq6666qqrrnpRUbnqqquuuuqqq/7VdnZ2+M9gm+cmif/pbPOCSOKqq/4vss3/Zrb5n8Y2L8zOzg4A9913361cddVVV1111VUvKoKrrrrqqquuuupFdvbs2Wfcd999twLs7OzwX8E2trGNbWzzv4ltbGMb29jGNraxzVVX/U9lG9vYxja2sY1tbPO/iW1sYxvb2OZ/AtvYxja2ueqqq6666qqr/lMQXHXVVVddddVV/ypnz569FWBnZ4f/LraxjW1sY5v/rWxjG9vYxja2sY1tbHPVVf8ZbGMb29jGNraxjW3+t7KNbWxjG9v8T2Eb29jGNv8aN910EwD/8A//8NtcddVVV1111VX/GlSuuuqqq6666qp/E9v8T2Kb5yaJ/wts8y+RxFVXAdjm/wvb/E9mm/8oOzs7ANx33323ctVVV1111VVX/WsQXHXVVVddddVV/yr33XffrQA7OzvYxja2sc3/NLaxjW1sYxvb/F9kG9vYxja2sY1tbGMb29jGNlf972Ib29jGNraxjW1sYxvb2Ob/ItvYxja2sY1t/qexjW1sY5urrrrqqquuuup/BCpXXXXVVVddddW/yn333XcrwM7ODs/NNg8kif+JbPP8SOL/C9v8W0jiqn8721z1gtnmfwvb/Ffa2dkB4L777ruVq6666qqrrrrqX4PKVVddddVVV131r3L27NlnAOzs7PAvsc1zk8T/VLZ5fiRx1RW2+c8kif9OtrnqP59t/rexzX+nnZ0dAM6ePfsMrrrqqquuuuqqfw0qV1111VVXXXXVv8p99913K8DOzg7/FrZ5bpL4n8w2L4gkrvqPY5ur/u+wzf9GtvmfxDZXXXXVVVddddW/GZWrrrrqqquuuurfZGdnh/8otnlukvjfwDYviCSuuur/Otv8b2ab/4ls80A33XQTAP/wD//w21x11VVXXXXVVf8aVK666qqrrrrqqn+Vs2fP3sp/Ads8N0n8b2KbF0YSV131P51t/q+wzf9Utrnqqquuuuqqq/5TULnqqquuuuqqq/5V7rvvvlsBdnZ2+K9mm+cm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4gFsW5J4ANuWJB7AtiWJB7BtSeIBbFuSeADbliQewLYliQewbUniAWxbkngA25YkHsC2JYkHsG1J4gFsW5J4ANuWJB7AtiWJB7BtSeKZ7rvvvlu56qqrrrrqqqv+vdCDHvQgrrrqqquuuuqqq6666qqrrrrqqquuuuqq/5OoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VfwjG/yJ2r1lkpQAAAAASUVORK5CYII=) diff --git a/docs/kcl/sin.md b/docs/kcl/sin.md index 947c0df60..f3c1fd40e 100644 --- a/docs/kcl/sin.md +++ b/docs/kcl/sin.md @@ -34,8 +34,8 @@ sin(num: number) -> number exampleSketch = startSketchOn("XZ") |> startProfileAt([0, 0], %) |> angledLine({ - angle: 50, - length: 15 / sin(toDegrees(135)) + angle = 50, + length = 15 / sin(toDegrees(135)) }, %) |> yLineTo(0, %) |> close(%) diff --git a/docs/kcl/sqrt.md b/docs/kcl/sqrt.md index 1d8ead508..c268d5356 100644 --- a/docs/kcl/sqrt.md +++ b/docs/kcl/sqrt.md @@ -33,7 +33,7 @@ sqrt(num: number) -> number ```js exampleSketch = startSketchOn("XZ") |> startProfileAt([0, 0], %) - |> angledLine({ angle: 50, length: sqrt(2500) }, %) + |> angledLine({ angle = 50, length = sqrt(2500) }, %) |> yLineTo(0, %) |> close(%) diff --git a/docs/kcl/startSketchAt.md b/docs/kcl/startSketchAt.md index e73fbb399..570f6e416 100644 --- a/docs/kcl/startSketchAt.md +++ b/docs/kcl/startSketchAt.md @@ -4,6 +4,8 @@ excerpt: "Start a new 2-dimensional sketch at a given point on the 'XY' plane." layout: manual --- +**WARNING:** This function is deprecated. + Start a new 2-dimensional sketch at a given point on the 'XY' plane. diff --git a/docs/kcl/startSketchOn.md b/docs/kcl/startSketchOn.md index bfc77c786..0b06bf2bc 100644 --- a/docs/kcl/startSketchOn.md +++ b/docs/kcl/startSketchOn.md @@ -101,7 +101,7 @@ exampleSketch = startSketchOn('XY') |> line([-2, 0], %) |> close(%) -example = revolve({ axis: 'y', angle: 180 }, exampleSketch) +example = revolve({ axis = 'y', angle = 180 }, exampleSketch) exampleSketch002 = startSketchOn(example, 'end') |> startProfileAt([4.5, -5], %) @@ -117,11 +117,11 @@ example002 = extrude(5, exampleSketch002) ```js a1 = startSketchOn({ - plane: { - origin: { x: 0, y: 0, z: 0 }, - xAxis: { x: 1, y: 0, z: 0 }, - yAxis: { x: 0, y: 1, z: 0 }, - zAxis: { x: 0, y: 0, z: 1 } + plane = { + origin = { x = 0, y = 0, z = 0 }, + xAxis = { x = 1, y = 0, z = 0 }, + yAxis = { x = 0, y = 1, z = 0 }, + zAxis = { x = 0, y = 0, z = 1 } } }) |> startProfileAt([0, 0], %) diff --git a/docs/kcl/std.json b/docs/kcl/std.json index 6dcf0a703..b31e799af 100644 --- a/docs/kcl/std.json +++ b/docs/kcl/std.json @@ -6,6 +6,7 @@ "tags": [ "math" ], + "keywordArguments": false, "args": [ { "name": "num", @@ -16,7 +17,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -28,12 +30,13 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "myAngle = -120\n\nsketch001 = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([8, 0], %)\n |> angledLine({ angle: abs(myAngle), length: 5 }, %)\n |> line([-5, 0], %)\n |> angledLine({ angle: myAngle, length: 5 }, %)\n |> close(%)\n\nbaseExtrusion = extrude(5, sketch001)" + "myAngle = -120\n\nsketch001 = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([8, 0], %)\n |> angledLine({ angle = abs(myAngle), length = 5 }, %)\n |> line([-5, 0], %)\n |> angledLine({ angle = myAngle, length = 5 }, %)\n |> close(%)\n\nbaseExtrusion = extrude(5, sketch001)" ] }, { @@ -43,6 +46,7 @@ "tags": [ "math" ], + "keywordArguments": false, "args": [ { "name": "num", @@ -53,7 +57,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -65,19 +70,21 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "sketch001 = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> angledLine({\n angle: toDegrees(acos(0.5)),\n length: 10\n }, %)\n |> line([5, 0], %)\n |> lineTo([12, 0], %)\n |> close(%)\n\nextrude001 = extrude(5, sketch001)" + "sketch001 = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> angledLine({\n angle = toDegrees(acos(0.5)),\n length = 10\n }, %)\n |> line([5, 0], %)\n |> lineTo([12, 0], %)\n |> close(%)\n\nextrude001 = extrude(5, sketch001)" ] }, { "name": "angleToMatchLengthX", - "summary": "Compute the angle (in degrees) in o", + "summary": "Returns the angle to match the given length for x.", "description": "", "tags": [], + "keywordArguments": false, "args": [ { "name": "tag", @@ -383,7 +390,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -613,6 +620,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -641,6 +649,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -685,21 +697,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -713,6 +713,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -746,8 +756,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -953,7 +963,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "to", @@ -1237,7 +1248,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -1467,6 +1478,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -1495,6 +1507,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -1539,21 +1555,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -1567,6 +1571,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -1600,8 +1614,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -1807,7 +1821,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch", @@ -2142,7 +2157,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -2372,6 +2387,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -2400,6 +2416,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -2444,21 +2464,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -2472,6 +2480,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -2505,8 +2523,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -3174,7 +3192,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -3186,7 +3205,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -3199,6 +3219,7 @@ "summary": "Returns the angle to match the given length for y.", "description": "", "tags": [], + "keywordArguments": false, "args": [ { "name": "tag", @@ -3504,7 +3525,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -3734,6 +3755,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -3762,6 +3784,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -3806,21 +3832,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -3834,6 +3848,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -3867,8 +3891,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -4074,7 +4098,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "to", @@ -4358,7 +4383,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -4588,6 +4613,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -4616,6 +4642,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -4660,21 +4690,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -4688,6 +4706,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -4721,8 +4749,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -4928,7 +4956,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch", @@ -5263,7 +5292,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -5493,6 +5522,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -5521,6 +5551,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -5565,21 +5599,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -5593,6 +5615,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -5626,8 +5658,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -6295,7 +6327,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -6307,12 +6340,13 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "sketch001 = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([1, 2], %, $seg01)\n |> angledLine({\n angle: angleToMatchLengthY(seg01, 15, %),\n length: 5\n }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nextrusion = extrude(5, sketch001)" + "sketch001 = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([1, 2], %, $seg01)\n |> angledLine({\n angle = angleToMatchLengthY(seg01, 15, %),\n length = 5\n }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nextrusion = extrude(5, sketch001)" ] }, { @@ -6320,6 +6354,7 @@ "summary": "Draw a line segment relative to the current origin using the polar", "description": "measure of some angle and distance.", "tags": [], + "keywordArguments": false, "args": [ { "name": "data", @@ -6361,7 +6396,8 @@ } ] }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch", @@ -6658,7 +6694,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -6888,6 +6924,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -6916,6 +6953,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -6960,21 +7001,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -6988,6 +7017,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -7021,8 +7060,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -7728,11 +7767,12 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -7978,7 +8018,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -8208,6 +8248,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -8236,6 +8277,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -8280,21 +8325,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -8308,6 +8341,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -8341,8 +8384,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -9048,7 +9091,8 @@ } } }, - "required": false + "required": false, + "labelRequired": true } ], "returnValue": { @@ -9346,7 +9390,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -9576,6 +9620,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -9604,6 +9649,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -9648,21 +9697,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -9676,6 +9713,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -9709,8 +9756,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -10416,12 +10463,13 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> yLineTo(15, %)\n |> angledLine({ angle: 30, length: 15 }, %)\n |> line([8, -10], %)\n |> yLineTo(0, %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)" + "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> yLineTo(15, %)\n |> angledLine({ angle = 30, length = 15 }, %)\n |> line([8, -10], %)\n |> yLineTo(0, %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)" ] }, { @@ -10429,6 +10477,7 @@ "summary": "Create a line segment from the current 2-dimensional sketch origin", "description": "along some angle (in degrees) for some relative length in the 'x' dimension.", "tags": [], + "keywordArguments": false, "args": [ { "name": "data", @@ -10470,7 +10519,8 @@ } ] }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch", @@ -10767,7 +10817,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -10997,6 +11047,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -11025,6 +11076,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -11069,21 +11124,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -11097,6 +11140,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -11130,8 +11183,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -11837,11 +11890,12 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -12087,7 +12141,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -12317,6 +12371,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -12345,6 +12400,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -12389,21 +12448,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -12417,6 +12464,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -12450,8 +12507,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -13157,7 +13214,8 @@ } } }, - "required": false + "required": false, + "labelRequired": true } ], "returnValue": { @@ -13455,7 +13513,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -13685,6 +13743,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -13713,6 +13772,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -13757,21 +13820,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -13785,6 +13836,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -13818,8 +13879,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -14525,12 +14586,13 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "sketch001 = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> angledLineOfXLength({ angle: 45, length: 10 }, %, $edge1)\n |> angledLineOfXLength({ angle: -15, length: 20 }, %, $edge2)\n |> line([0, -5], %)\n |> close(%, $edge3)\n\nextrusion = extrude(10, sketch001)" + "sketch001 = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> angledLineOfXLength({ angle = 45, length = 10 }, %, $edge1)\n |> angledLineOfXLength({ angle = -15, length = 20 }, %, $edge2)\n |> line([0, -5], %)\n |> close(%, $edge3)\n\nextrusion = extrude(10, sketch001)" ] }, { @@ -14538,6 +14600,7 @@ "summary": "Create a line segment from the current 2-dimensional sketch origin", "description": "along some angle (in degrees) for some relative length in the 'y' dimension.", "tags": [], + "keywordArguments": false, "args": [ { "name": "data", @@ -14579,7 +14642,8 @@ } ] }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch", @@ -14876,7 +14940,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -15106,6 +15170,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -15134,6 +15199,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -15178,21 +15247,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -15206,6 +15263,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -15239,8 +15306,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -15946,11 +16013,12 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -16196,7 +16264,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -16426,6 +16494,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -16454,6 +16523,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -16498,21 +16571,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -16526,6 +16587,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -16559,8 +16630,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -17266,7 +17337,8 @@ } } }, - "required": false + "required": false, + "labelRequired": true } ], "returnValue": { @@ -17564,7 +17636,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -17794,6 +17866,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -17822,6 +17895,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -17866,21 +17943,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -17894,6 +17959,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -17927,8 +18002,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -18634,12 +18709,13 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([10, 0], %)\n |> angledLineOfYLength({ angle: 45, length: 10 }, %)\n |> line([0, 10], %)\n |> angledLineOfYLength({ angle: 135, length: 10 }, %)\n |> line([-10, 0], %)\n |> line([0, -30], %)\n\nexample = extrude(10, exampleSketch)" + "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([10, 0], %)\n |> angledLineOfYLength({ angle = 45, length = 10 }, %)\n |> line([0, 10], %)\n |> angledLineOfYLength({ angle = 135, length = 10 }, %)\n |> line([-10, 0], %)\n |> line([0, -30], %)\n\nexample = extrude(10, exampleSketch)" ] }, { @@ -18647,6 +18723,7 @@ "summary": "Draw an angled line from the current origin, constructing a line segment", "description": "such that the newly created line intersects the desired target line segment.", "tags": [], + "keywordArguments": false, "args": [ { "name": "data", @@ -18981,7 +19058,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -19211,6 +19288,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -19239,6 +19317,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -19283,21 +19365,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -19311,6 +19381,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -19344,8 +19424,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -19551,7 +19631,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch", @@ -19912,7 +19993,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -20142,6 +20223,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -20170,6 +20252,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -20214,21 +20300,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -20242,6 +20316,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -20275,8 +20359,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -20918,11 +21002,12 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -21232,7 +21317,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -21462,6 +21547,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -21490,6 +21576,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -21534,21 +21624,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -21562,6 +21640,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -21595,8 +21683,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -22238,7 +22326,8 @@ } } }, - "required": false + "required": false, + "labelRequired": true } ], "returnValue": { @@ -22536,7 +22625,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -22766,6 +22855,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -22794,6 +22884,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -22838,21 +22932,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -22866,6 +22948,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -22899,8 +22991,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -23606,12 +23698,13 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> lineTo([5, 10], %)\n |> lineTo([-10, 10], %, $lineToIntersect)\n |> lineTo([0, 20], %)\n |> angledLineThatIntersects({\n angle: 80,\n intersectTag: lineToIntersect,\n offset: 10\n }, %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)" + "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> lineTo([5, 10], %)\n |> lineTo([-10, 10], %, $lineToIntersect)\n |> lineTo([0, 20], %)\n |> angledLineThatIntersects({\n angle = 80,\n intersectTag = lineToIntersect,\n offset = 10\n }, %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)" ] }, { @@ -23619,6 +23712,7 @@ "summary": "Create a line segment from the current 2-dimensional sketch origin", "description": "along some angle (in degrees) for some length, ending at the provided value in the 'x' dimension.", "tags": [], + "keywordArguments": false, "args": [ { "name": "data", @@ -23645,7 +23739,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch", @@ -23942,7 +24037,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -24172,6 +24267,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -24200,6 +24296,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -24244,21 +24344,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -24272,6 +24360,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -24305,8 +24403,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -25012,11 +25110,12 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -25262,7 +25361,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -25492,6 +25591,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -25520,6 +25620,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -25564,21 +25668,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -25592,6 +25684,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -25625,8 +25727,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -26332,7 +26434,8 @@ } } }, - "required": false + "required": false, + "labelRequired": true } ], "returnValue": { @@ -26630,7 +26733,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -26860,6 +26963,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -26888,6 +26992,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -26932,21 +27040,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -26960,6 +27056,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -26993,8 +27099,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -27700,12 +27806,13 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> angledLineToX({ angle: 30, to: 10 }, %)\n |> line([0, 10], %)\n |> line([-10, 0], %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)" + "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> angledLineToX({ angle = 30, to = 10 }, %)\n |> line([0, 10], %)\n |> line([-10, 0], %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)" ] }, { @@ -27713,6 +27820,7 @@ "summary": "Create a line segment from the current 2-dimensional sketch origin", "description": "along some angle (in degrees) for some length, ending at the provided value in the 'y' dimension.", "tags": [], + "keywordArguments": false, "args": [ { "name": "data", @@ -27739,7 +27847,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch", @@ -28036,7 +28145,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -28266,6 +28375,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -28294,6 +28404,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -28338,21 +28452,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -28366,6 +28468,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -28399,8 +28511,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -29106,11 +29218,12 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -29356,7 +29469,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -29586,6 +29699,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -29614,6 +29728,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -29658,21 +29776,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -29686,6 +29792,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -29719,8 +29835,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -30426,7 +30542,8 @@ } } }, - "required": false + "required": false, + "labelRequired": true } ], "returnValue": { @@ -30724,7 +30841,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -30954,6 +31071,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -30982,6 +31100,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -31026,21 +31148,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -31054,6 +31164,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -31087,8 +31207,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -31794,12 +31914,2897 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> angledLineToY({ angle: 60, to: 20 }, %)\n |> line([-20, 0], %)\n |> angledLineToY({ angle: 70, to: 10 }, %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)" + "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> angledLineToY({ angle = 60, to = 20 }, %)\n |> line([-20, 0], %)\n |> angledLineToY({ angle = 70, to = 10 }, %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)" + ] + }, + { + "name": "appearance", + "summary": "Set the appearance of a solid. This only works on solids, not sketches or individual paths.", + "description": "This will work on any solid, including extruded solids, revolved solids, and shelled solids.", + "tags": [], + "keywordArguments": false, + "args": [ + { + "name": "data", + "type": "AppearanceData", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "AppearanceData", + "description": "Data for appearance.", + "type": "object", + "required": [ + "color" + ], + "properties": { + "color": { + "description": "Color of the new material, a hex string like \"#ff0000\".", + "type": "string", + "pattern": "#[0-9a-fA-F]{6}" + }, + "metalness": { + "description": "Metalness of the new material, a percentage like 95.7.", + "type": "number", + "format": "double", + "maximum": 100.0, + "minimum": 0.0, + "nullable": true + }, + "roughness": { + "description": "Roughness of the new material, a percentage like 95.7.", + "type": "number", + "format": "double", + "maximum": 100.0, + "minimum": 0.0, + "nullable": true + } + } + }, + "required": true, + "labelRequired": true + }, + { + "name": "solid_set", + "type": "SolidSet", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "SolidSet", + "description": "A solid or a group of solids.", + "oneOf": [ + { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "solid" + ] + }, + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": [ + "object", + "array" + ], + "items": { + "$ref": "#/components/schemas/Solid" + }, + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "solids" + ] + } + } + } + ], + "definitions": { + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + } + } + }, + "required": true, + "labelRequired": true + } + ], + "returnValue": { + "name": "", + "type": "SolidSet", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "SolidSet", + "description": "A solid or a group of solids.", + "oneOf": [ + { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "solid" + ] + }, + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": [ + "object", + "array" + ], + "items": { + "$ref": "#/components/schemas/Solid" + }, + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "solids" + ] + } + } + } + ], + "definitions": { + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + } + } + }, + "required": true, + "labelRequired": true + }, + "unpublished": false, + "deprecated": false, + "examples": [ + "// Add color to an extruded solid.\nexampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> lineTo([10, 0], %)\n |> lineTo([0, 10], %)\n |> lineTo([-10, 0], %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)\n |> appearance({\n color = '#ff0000',\n metalness = 50,\n roughness = 50\n }, %)", + "// Add color to a revolved solid.\nsketch001 = startSketchOn('XY')\n |> circle({ center = [15, 0], radius = 5 }, %)\n |> revolve({ angle = 360, axis = 'y' }, %)\n |> appearance({\n color = '#ff0000',\n metalness = 90,\n roughness = 90\n }, %)", + "// Add color to different solids.\nfn cube(center) {\n return startSketchOn('XY')\n |> startProfileAt([center[0] - 10, center[1] - 10], %)\n |> lineTo([center[0] + 10, center[1] - 10], %)\n |> lineTo([center[0] + 10, center[1] + 10], %)\n |> lineTo([center[0] - 10, center[1] + 10], %)\n |> close(%)\n |> extrude(10, %)\n}\n\nexample0 = cube([0, 0])\nexample1 = cube([20, 0])\nexample2 = cube([40, 0])\n\nappearance({\n color = '#ff0000',\n metalness = 50,\n roughness = 50\n}, [example0, example1])\nappearance({\n color = '#00ff00',\n metalness = 50,\n roughness = 50\n}, example2)", + "// You can set the appearance before or after you shell it will yield the same result.\n// This example shows setting the appearance _after_ the shell.\nfirstSketch = startSketchOn('XY')\n |> startProfileAt([-12, 12], %)\n |> line([24, 0], %)\n |> line([0, -24], %)\n |> line([-24, 0], %)\n |> close(%)\n |> extrude(6, %)\n\nshell({ faces = ['end'], thickness = 0.25 }, firstSketch)\n |> appearance({\n color = '#ff0000',\n metalness = 90,\n roughness = 90\n }, %)", + "// You can set the appearance before or after you shell it will yield the same result.\n// This example shows setting the appearance _before_ the shell.\nfirstSketch = startSketchOn('XY')\n |> startProfileAt([-12, 12], %)\n |> line([24, 0], %)\n |> line([0, -24], %)\n |> line([-24, 0], %)\n |> close(%)\n |> extrude(6, %)\n |> appearance({\n color = '#ff0000',\n metalness = 90,\n roughness = 90\n }, %)\n\nshell({ faces = ['end'], thickness = 0.25 }, firstSketch)", + "// Setting the appearance of a 3D pattern can be done _before_ or _after_ the pattern.\n// This example shows _before_ the pattern.\nexampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([0, 2], %)\n |> line([3, 1], %)\n |> line([0, -4], %)\n |> close(%)\n\nexample = extrude(1, exampleSketch)\n |> appearance({\n color = '#ff0000',\n metalness = 90,\n roughness = 90\n }, %)\n |> patternLinear3d({\n axis = [1, 0, 1],\n instances = 7,\n distance = 6\n }, %)", + "// Setting the appearance of a 3D pattern can be done _before_ or _after_ the pattern.\n// This example shows _after_ the pattern.\nexampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([0, 2], %)\n |> line([3, 1], %)\n |> line([0, -4], %)\n |> close(%)\n\nexample = extrude(1, exampleSketch)\n |> patternLinear3d({\n axis = [1, 0, 1],\n instances = 7,\n distance = 6\n }, %)\n |> appearance({\n color = '#ff0000',\n metalness = 90,\n roughness = 90\n }, %)", + "// Color the result of a 2D pattern that was extruded.\nexampleSketch = startSketchOn('XZ')\n |> startProfileAt([.5, 25], %)\n |> line([0, 5], %)\n |> line([-1, 0], %)\n |> line([0, -5], %)\n |> close(%)\n |> patternCircular2d({\n center = [0, 0],\n instances = 13,\n arcDegrees = 360,\n rotateDuplicates = true\n }, %)\n\nexample = extrude(1, exampleSketch)\n |> appearance({\n color = '#ff0000',\n metalness = 90,\n roughness = 90\n }, %)", + "// Color the result of a sweep.\n\n\n// Create a path for the sweep.\nsweepPath = startSketchOn('XZ')\n |> startProfileAt([0.05, 0.05], %)\n |> line([0, 7], %)\n |> tangentialArc({ offset = 90, radius = 5 }, %)\n |> line([-3, 0], %)\n |> tangentialArc({ offset = -90, radius = 5 }, %)\n |> line([0, 7], %)\n\npipeHole = startSketchOn('XY')\n |> circle({ center = [0, 0], radius = 1.5 }, %)\n\nsweepSketch = startSketchOn('XY')\n |> circle({ center = [0, 0], radius = 2 }, %)\n |> hole(pipeHole, %)\n |> sweep({ path = sweepPath }, %)\n |> appearance({\n color = \"#ff0000\",\n metalness = 50,\n roughness = 50\n }, %)" ] }, { @@ -31807,6 +34812,7 @@ "summary": "Draw a curved line segment along an imaginary circle.", "description": "The arc is constructed such that the current position of the sketch is placed along an imaginary circle of the specified radius, at angleStart degrees. The resulting arc is the segment of the imaginary circle from that origin point to angleEnd, radius away from the center of the imaginary circle.\n\nUnless this makes a lot of sense and feels like what you're looking for to construct your shape, you're likely looking for tangentialArc.", "tags": [], + "keywordArguments": false, "args": [ { "name": "data", @@ -31884,7 +34890,8 @@ } ] }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch", @@ -32181,7 +35188,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -32411,6 +35418,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -32439,6 +35447,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -32483,21 +35495,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -32511,6 +35511,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -32544,8 +35554,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -33251,11 +36261,12 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -33501,7 +36512,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -33731,6 +36742,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -33759,6 +36771,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -33803,21 +36819,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -33831,6 +36835,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -33864,8 +36878,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -34571,7 +37585,8 @@ } } }, - "required": false + "required": false, + "labelRequired": true } ], "returnValue": { @@ -34869,7 +37884,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -35099,6 +38114,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -35127,6 +38143,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -35171,21 +38191,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -35199,6 +38207,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -35232,8 +38250,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -35939,12 +38957,4131 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([10, 0], %)\n |> arc({\n angleStart: 0,\n angleEnd: 280,\n radius: 16\n }, %)\n |> close(%)" + "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([10, 0], %)\n |> arc({\n angleStart = 0,\n angleEnd = 280,\n radius = 16\n }, %)\n |> close(%)\nexample = extrude(10, exampleSketch)" + ] + }, + { + "name": "arcTo", + "summary": "Draw a 3 point arc.", + "description": "The arc is constructed such that the start point is the current position of the sketch and two more points defined as the end and interior point. The interior point is placed between the start point and end point. The radius of the arc will be controlled by how far the interior point is placed from the start and end.", + "tags": [], + "keywordArguments": false, + "args": [ + { + "name": "data", + "type": "ArcToData", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "ArcToData", + "description": "Data to draw a three point arc (arcTo).", + "type": "object", + "required": [ + "end", + "interior" + ], + "properties": { + "end": { + "description": "End point of the arc. A point in 3D space", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "interior": { + "description": "Interior point of the arc. A point in 3D space", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "required": true, + "labelRequired": true + }, + { + "name": "sketch", + "type": "Sketch", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Sketch", + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + }, + "definitions": { + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + } + } + }, + "required": true, + "labelRequired": true + }, + { + "name": "tag", + "type": "TagNode", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Nullable_TagDeclarator", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true, + "definitions": { + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + } + } + }, + "required": false, + "labelRequired": true + } + ], + "returnValue": { + "name": "", + "type": "Sketch", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Sketch", + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + }, + "definitions": { + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + } + } + }, + "required": true, + "labelRequired": true + }, + "unpublished": false, + "deprecated": false, + "examples": [ + "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> arcTo({ end = [10, 0], interior = [5, 5] }, %)\n |> close(%)\nexample = extrude(10, exampleSketch)" ] }, { @@ -35954,6 +43091,7 @@ "tags": [ "math" ], + "keywordArguments": false, "args": [ { "name": "num", @@ -35964,7 +43102,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -35976,12 +43115,13 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "sketch001 = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> angledLine({\n angle: toDegrees(asin(0.5)),\n length: 20\n }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nextrude001 = extrude(5, sketch001)" + "sketch001 = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> angledLine({\n angle = toDegrees(asin(0.5)),\n length = 20\n }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nextrude001 = extrude(5, sketch001)" ] }, { @@ -35989,6 +43129,7 @@ "summary": "Check a value at runtime, and raise an error if the argument provided", "description": "is false.", "tags": [], + "keywordArguments": false, "args": [ { "name": "data", @@ -35998,7 +43139,8 @@ "title": "Boolean", "type": "boolean" }, - "required": true + "required": true, + "labelRequired": true }, { "name": "message", @@ -36008,7 +43150,8 @@ "title": "String", "type": "string" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -36019,7 +43162,8 @@ "title": "Null", "type": "null" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -36032,6 +43176,7 @@ "summary": "Check that a numerical value equals another at runtime,", "description": "otherwise raise an error.", "tags": [], + "keywordArguments": false, "args": [ { "name": "left", @@ -36042,7 +43187,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, { "name": "right", @@ -36053,7 +43199,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, { "name": "epsilon", @@ -36064,7 +43211,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, { "name": "message", @@ -36074,7 +43222,8 @@ "title": "String", "type": "string" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -36085,7 +43234,8 @@ "title": "Null", "type": "null" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -36098,6 +43248,7 @@ "summary": "Check that a numerical value is greater than another at runtime,", "description": "otherwise raise an error.", "tags": [], + "keywordArguments": false, "args": [ { "name": "left", @@ -36108,7 +43259,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, { "name": "right", @@ -36119,7 +43271,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, { "name": "message", @@ -36129,7 +43282,8 @@ "title": "String", "type": "string" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -36140,7 +43294,8 @@ "title": "Null", "type": "null" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -36153,6 +43308,7 @@ "summary": "Check that a numerical value is greater than or equal to another at runtime,", "description": "otherwise raise an error.", "tags": [], + "keywordArguments": false, "args": [ { "name": "left", @@ -36163,7 +43319,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, { "name": "right", @@ -36174,7 +43331,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, { "name": "message", @@ -36184,7 +43342,8 @@ "title": "String", "type": "string" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -36195,7 +43354,8 @@ "title": "Null", "type": "null" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -36208,6 +43368,7 @@ "summary": "Check that a numerical value is less than to another at runtime,", "description": "otherwise raise an error.", "tags": [], + "keywordArguments": false, "args": [ { "name": "left", @@ -36218,7 +43379,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, { "name": "right", @@ -36229,7 +43391,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, { "name": "message", @@ -36239,7 +43402,8 @@ "title": "String", "type": "string" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -36250,7 +43414,8 @@ "title": "Null", "type": "null" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -36263,6 +43428,7 @@ "summary": "Check that a numerical value is less than or equal to another at runtime,", "description": "otherwise raise an error.", "tags": [], + "keywordArguments": false, "args": [ { "name": "left", @@ -36273,7 +43439,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, { "name": "right", @@ -36284,7 +43451,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, { "name": "message", @@ -36294,7 +43462,8 @@ "title": "String", "type": "string" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -36305,7 +43474,8 @@ "title": "Null", "type": "null" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -36320,6 +43490,7 @@ "tags": [ "math" ], + "keywordArguments": false, "args": [ { "name": "num", @@ -36330,7 +43501,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -36342,12 +43514,65 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "sketch001 = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> angledLine({\n angle: toDegrees(atan(1.25)),\n length: 20\n }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nextrude001 = extrude(5, sketch001)" + "sketch001 = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> angledLine({\n angle = toDegrees(atan(1.25)),\n length = 20\n }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nextrude001 = extrude(5, sketch001)" + ] + }, + { + "name": "atan2", + "summary": "Compute the four quadrant arctangent of Y and X (in radians).", + "description": "", + "tags": [ + "math" + ], + "keywordArguments": false, + "args": [ + { + "name": "y", + "type": "number", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "double", + "type": "number", + "format": "double" + }, + "required": true, + "labelRequired": true + }, + { + "name": "x", + "type": "number", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "double", + "type": "number", + "format": "double" + }, + "required": true, + "labelRequired": true + } + ], + "returnValue": { + "name": "", + "type": "number", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "double", + "type": "number", + "format": "double" + }, + "required": true, + "labelRequired": true + }, + "unpublished": false, + "deprecated": false, + "examples": [ + "sketch001 = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> angledLine({\n angle = toDegrees(atan2(1.25, 2)),\n length = 20\n }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nextrude001 = extrude(5, sketch001)" ] }, { @@ -36355,6 +43580,7 @@ "summary": "Draw a smooth, continuous, curved line segment from the current origin to", "description": "the desired (x, y), using a number of control points to shape the curve's shape.", "tags": [], + "keywordArguments": false, "args": [ { "name": "data", @@ -36402,7 +43628,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch", @@ -36699,7 +43926,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -36929,6 +44156,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -36957,6 +44185,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -37001,21 +44233,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -37029,6 +44249,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -37062,8 +44292,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -37769,11 +44999,12 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -38019,7 +45250,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -38249,6 +45480,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -38277,6 +45509,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -38321,21 +45557,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -38349,6 +45573,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -38382,8 +45616,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -39089,7 +46323,8 @@ } } }, - "required": false + "required": false, + "labelRequired": true } ], "returnValue": { @@ -39387,7 +46622,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -39617,6 +46852,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -39645,6 +46881,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -39689,21 +46929,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -39717,6 +46945,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -39750,8 +46988,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -40457,12 +47695,13 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([0, 10], %)\n |> bezierCurve({\n to: [10, 10],\n control1: [5, 0],\n control2: [5, 10]\n }, %)\n |> lineTo([10, 0], %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)" + "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([0, 10], %)\n |> bezierCurve({\n to = [10, 10],\n control1 = [5, 0],\n control2 = [5, 10]\n }, %)\n |> lineTo([10, 0], %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)" ] }, { @@ -40472,6 +47711,7 @@ "tags": [ "math" ], + "keywordArguments": false, "args": [ { "name": "num", @@ -40482,7 +47722,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -40494,7 +47735,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -40507,6 +47749,7 @@ "summary": "Cut a straight transitional edge along a tagged path.", "description": "Chamfer is similar in function and use to a fillet, except a fillet will blend the transition along an edge, rather than cut a sharp, straight transitional edge.", "tags": [], + "keywordArguments": false, "args": [ { "name": "data", @@ -40852,7 +48095,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -41082,6 +48325,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -41110,6 +48354,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -41154,21 +48402,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -41182,6 +48418,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -41215,8 +48461,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -41422,7 +48668,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "solid", @@ -41810,7 +49057,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -42040,6 +49287,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -42068,6 +49316,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -42112,21 +49364,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -42140,6 +49380,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -42173,8 +49423,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -42816,11 +50066,12 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -43148,7 +50399,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -43378,6 +50629,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -43406,6 +50658,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -43450,21 +50706,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -43478,6 +50722,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -43511,8 +50765,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -44154,7 +51408,8 @@ } } }, - "required": false + "required": false, + "labelRequired": true } ], "returnValue": { @@ -44414,21 +51669,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -44442,6 +51685,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -44452,8 +51705,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "Sketch": { "description": "A sketch is a collection of paths.", @@ -44745,7 +51998,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -44975,6 +52228,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -45003,6 +52257,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -45531,13 +52789,14 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "// Chamfer a mounting plate.\nwidth = 20\nlength = 10\nthickness = 1\nchamferLength = 2\n\nmountingPlateSketch = startSketchOn(\"XY\")\n |> startProfileAt([-width / 2, -length / 2], %)\n |> lineTo([width / 2, -length / 2], %, $edge1)\n |> lineTo([width / 2, length / 2], %, $edge2)\n |> lineTo([-width / 2, length / 2], %, $edge3)\n |> close(%, $edge4)\n\nmountingPlate = extrude(thickness, mountingPlateSketch)\n |> chamfer({\n length: chamferLength,\n tags: [\n getNextAdjacentEdge(edge1),\n getNextAdjacentEdge(edge2),\n getNextAdjacentEdge(edge3),\n getNextAdjacentEdge(edge4)\n ]\n }, %)", - "// Sketch on the face of a chamfer.\nfn cube = (pos, scale) => {\n sg = startSketchOn('XY')\n |> startProfileAt(pos, %)\n |> line([0, scale], %)\n |> line([scale, 0], %)\n |> line([0, -scale], %)\n\n return sg\n}\n\npart001 = cube([0, 0], 20)\n |> close(%, $line1)\n |> extrude(20, %)\n |> chamfer({\n length: 10,\n tags: [getOppositeEdge(line1)]\n }, %, $chamfer1) // We tag the chamfer to reference it later.\n\nsketch001 = startSketchOn(part001, chamfer1)\n |> startProfileAt([10, 10], %)\n |> line([2, 0], %)\n |> line([0, 2], %)\n |> line([-2, 0], %)\n |> lineTo([profileStartX(%), profileStartY(%)], %)\n |> close(%)\n |> extrude(10, %)" + "// Chamfer a mounting plate.\nwidth = 20\nlength = 10\nthickness = 1\nchamferLength = 2\n\nmountingPlateSketch = startSketchOn(\"XY\")\n |> startProfileAt([-width / 2, -length / 2], %)\n |> lineTo([width / 2, -length / 2], %, $edge1)\n |> lineTo([width / 2, length / 2], %, $edge2)\n |> lineTo([-width / 2, length / 2], %, $edge3)\n |> close(%, $edge4)\n\nmountingPlate = extrude(thickness, mountingPlateSketch)\n |> chamfer({\n length = chamferLength,\n tags = [\n getNextAdjacentEdge(edge1),\n getNextAdjacentEdge(edge2),\n getNextAdjacentEdge(edge3),\n getNextAdjacentEdge(edge4)\n ]\n }, %)", + "// Sketch on the face of a chamfer.\nfn cube(pos, scale) {\n sg = startSketchOn('XY')\n |> startProfileAt(pos, %)\n |> line([0, scale], %)\n |> line([scale, 0], %)\n |> line([0, -scale], %)\n\n return sg\n}\n\npart001 = cube([0, 0], 20)\n |> close(%, $line1)\n |> extrude(20, %)\n |> chamfer({\n length = 10,\n tags = [getOppositeEdge(line1)]\n }, %, $chamfer1) // We tag the chamfer to reference it later.\n\nsketch001 = startSketchOn(part001, chamfer1)\n |> startProfileAt([10, 10], %)\n |> line([2, 0], %)\n |> line([0, 2], %)\n |> line([-2, 0], %)\n |> lineTo([profileStartX(%), profileStartY(%)], %)\n |> close(%)\n |> extrude(10, %)" ] }, { @@ -45545,6 +52804,7 @@ "summary": "Construct a 2-dimensional circle, of the specified radius, centered at", "description": "the provided (x, y) origin point.", "tags": [], + "keywordArguments": false, "args": [ { "name": "data", @@ -45576,7 +52836,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch_surface_or_group", @@ -45802,8 +53063,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "Solid": { "description": "An solid is a collection of extrude surfaces.", @@ -46057,21 +53318,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -46085,6 +53334,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -46378,7 +53637,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -46608,6 +53867,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -46636,6 +53896,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -46899,11 +54163,12 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -47122,8 +54387,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "Solid": { "description": "An solid is a collection of extrude surfaces.", @@ -47377,21 +54642,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -47405,6 +54658,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -47698,7 +54961,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -47928,6 +55191,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -47956,6 +55220,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -48219,7 +55487,8 @@ } } }, - "required": false + "required": false, + "labelRequired": true } ], "returnValue": { @@ -48517,7 +55786,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -48747,6 +56016,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -48775,6 +56045,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -48819,21 +56093,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -48847,6 +56109,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -48880,8 +56152,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -49587,13 +56859,4106 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn(\"-XZ\")\n |> circle({ center: [0, 0], radius: 10 }, %)\n\nexample = extrude(5, exampleSketch)", - "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([-15, 0], %)\n |> line([30, 0], %)\n |> line([0, 30], %)\n |> line([-30, 0], %)\n |> close(%)\n |> hole(circle({ center: [0, 15], radius: 5 }, %), %)\n\nexample = extrude(5, exampleSketch)" + "exampleSketch = startSketchOn(\"-XZ\")\n |> circle({ center = [0, 0], radius = 10 }, %)\n\nexample = extrude(5, exampleSketch)", + "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([-15, 0], %)\n |> line([30, 0], %)\n |> line([0, 30], %)\n |> line([-30, 0], %)\n |> close(%)\n |> hole(circle({ center = [0, 15], radius = 5 }, %), %)\n\nexample = extrude(5, exampleSketch)" + ] + }, + { + "name": "circleThreePoint", + "summary": "Construct a circle derived from 3 points.", + "description": "", + "tags": [], + "keywordArguments": true, + "args": [ + { + "name": "p1", + "type": "[number]", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Array_size_2_of_double", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "required": true, + "description": "1st point to derive the circle.", + "labelRequired": false + }, + { + "name": "p2", + "type": "[number]", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Array_size_2_of_double", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "required": true, + "description": "2nd point to derive the circle.", + "labelRequired": true + }, + { + "name": "p3", + "type": "[number]", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Array_size_2_of_double", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "required": true, + "description": "3rd point to derive the circle.", + "labelRequired": true + }, + { + "name": "sketch_surface_or_group", + "type": "SketchOrSurface", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "SketchOrSurface", + "description": "A sketch surface or a sketch.", + "anyOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + }, + { + "$ref": "#/components/schemas/Sketch" + } + ], + "definitions": { + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + } + } + }, + "required": true, + "description": "Plane or surface to sketch on.", + "labelRequired": true + }, + { + "name": "tag", + "type": "TagNode", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Nullable_TagDeclarator", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true, + "definitions": { + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + } + } + }, + "required": false, + "description": "Identifier for the circle to reference elsewhere.", + "labelRequired": true + } + ], + "returnValue": { + "name": "", + "type": "Sketch", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Sketch", + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + }, + "definitions": { + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + } + } + }, + "required": true, + "labelRequired": true + }, + "unpublished": false, + "deprecated": false, + "examples": [ + "exampleSketch = startSketchOn(\"XY\")\n |> circleThreePoint(p1 = [10, 10], p2 = [20, 8], p3 = [15, 5])\n\nexample = extrude(5, exampleSketch)" ] }, { @@ -49601,6 +60966,7 @@ "summary": "Construct a line segment from the current origin back to the profile's", "description": "origin, ensuring the resulting 2-dimensional sketch is not open-ended.", "tags": [], + "keywordArguments": false, "args": [ { "name": "sketch", @@ -49897,7 +61263,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -50127,6 +61493,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -50155,6 +61522,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -50199,21 +61570,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -50227,6 +61586,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -50260,8 +61629,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -50967,11 +62336,12 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -51217,7 +62587,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -51447,6 +62817,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -51475,6 +62846,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -51519,21 +62894,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -51547,6 +62910,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -51580,8 +62953,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -52287,7 +63660,8 @@ } } }, - "required": false + "required": false, + "labelRequired": true } ], "returnValue": { @@ -52585,7 +63959,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -52815,6 +64189,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -52843,6 +64218,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -52887,21 +64266,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -52915,6 +64282,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -52948,8 +64325,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -53655,7 +65032,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -53671,6 +65049,7 @@ "tags": [ "units" ], + "keywordArguments": false, "args": [], "returnValue": { "name": "", @@ -53681,7 +65060,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -53696,6 +65076,7 @@ "tags": [ "math" ], + "keywordArguments": false, "args": [ { "name": "num", @@ -53706,7 +65087,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -53718,12 +65100,13 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> angledLine({\n angle: 30,\n length: 3 / cos(toRadians(30))\n }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" + "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> angledLine({\n angle = 30,\n length = 3 / cos(toRadians(30))\n }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" ] }, { @@ -53733,6 +65116,7 @@ "tags": [ "math" ], + "keywordArguments": false, "args": [], "returnValue": { "name": "", @@ -53743,12 +65127,13 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> angledLine({ angle: 30, length: 2 * e() ^ 2 }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)" + "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> angledLine({ angle = 30, length = 2 * e() ^ 2 }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)" ] }, { @@ -53756,6 +65141,7 @@ "summary": "Extend a 2-dimensional sketch through a third dimension in order to", "description": "create new 3-dimensional volume, or if extruded into an existing volume, cut into an existing solid.", "tags": [], + "keywordArguments": false, "args": [ { "name": "length", @@ -53766,7 +65152,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch_set", @@ -54095,7 +65482,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -54325,6 +65712,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -54353,6 +65741,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -54397,21 +65789,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -54425,6 +65805,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -54458,8 +65848,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -55165,7 +66555,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -55457,21 +66848,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -55485,6 +66864,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -55495,8 +66884,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "Sketch": { "description": "A sketch is a collection of paths.", @@ -55788,7 +67177,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -56018,6 +67407,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -56046,6 +67436,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -56574,13 +67968,14 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "example = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([10, 0], %)\n |> arc({\n angleStart: 120,\n angleEnd: 0,\n radius: 5\n }, %)\n |> line([5, 0], %)\n |> line([0, 10], %)\n |> bezierCurve({\n control1: [-10, 0],\n control2: [2, 10],\n to: [-5, 10]\n }, %)\n |> line([-5, -2], %)\n |> close(%)\n |> extrude(10, %)", - "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([-10, 0], %)\n |> arc({\n angleStart: 120,\n angleEnd: -60,\n radius: 5\n }, %)\n |> line([10, 0], %)\n |> line([5, 0], %)\n |> bezierCurve({\n control1: [-3, 0],\n control2: [2, 10],\n to: [-5, 10]\n }, %)\n |> line([-4, 10], %)\n |> line([-5, -2], %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)" + "example = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([10, 0], %)\n |> arc({\n angleStart = 120,\n angleEnd = 0,\n radius = 5\n }, %)\n |> line([5, 0], %)\n |> line([0, 10], %)\n |> bezierCurve({\n control1 = [-10, 0],\n control2 = [2, 10],\n to = [-5, 10]\n }, %)\n |> line([-5, -2], %)\n |> close(%)\n |> extrude(10, %)", + "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([-10, 0], %)\n |> arc({\n angleStart = 120,\n angleEnd = -60,\n radius = 5\n }, %)\n |> line([10, 0], %)\n |> line([5, 0], %)\n |> bezierCurve({\n control1 = [-3, 0],\n control2 = [2, 10],\n to = [-5, 10]\n }, %)\n |> line([-4, 10], %)\n |> line([-5, -2], %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)" ] }, { @@ -56588,6 +67983,7 @@ "summary": "Blend a transitional edge along a tagged path, smoothing the sharp edge.", "description": "Fillet is similar in function and use to a chamfer, except a chamfer will cut a sharp transition along an edge while fillet will smoothly blend the transition.", "tags": [], + "keywordArguments": false, "args": [ { "name": "data", @@ -56940,7 +68336,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -57170,6 +68566,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -57198,6 +68595,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -57242,21 +68643,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -57270,6 +68659,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -57303,8 +68702,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -57510,7 +68909,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "solid", @@ -57898,7 +69298,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -58128,6 +69528,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -58156,6 +69557,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -58200,21 +69605,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -58228,6 +69621,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -58261,8 +69664,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -58904,11 +70307,12 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -59236,7 +70640,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -59466,6 +70870,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -59494,6 +70899,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -59538,21 +70947,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -59566,6 +70963,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -59599,8 +71006,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -60242,7 +71649,8 @@ } } }, - "required": false + "required": false, + "labelRequired": true } ], "returnValue": { @@ -60502,21 +71910,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -60530,6 +71926,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -60540,8 +71946,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "Sketch": { "description": "A sketch is a collection of paths.", @@ -60833,7 +72239,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -61063,6 +72469,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -61091,6 +72498,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -61619,13 +73030,14 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "width = 20\nlength = 10\nthickness = 1\nfilletRadius = 2\n\nmountingPlateSketch = startSketchOn(\"XY\")\n |> startProfileAt([-width / 2, -length / 2], %)\n |> lineTo([width / 2, -length / 2], %, $edge1)\n |> lineTo([width / 2, length / 2], %, $edge2)\n |> lineTo([-width / 2, length / 2], %, $edge3)\n |> close(%, $edge4)\n\nmountingPlate = extrude(thickness, mountingPlateSketch)\n |> fillet({\n radius: filletRadius,\n tags: [\n getNextAdjacentEdge(edge1),\n getNextAdjacentEdge(edge2),\n getNextAdjacentEdge(edge3),\n getNextAdjacentEdge(edge4)\n ]\n }, %)", - "width = 20\nlength = 10\nthickness = 1\nfilletRadius = 1\n\nmountingPlateSketch = startSketchOn(\"XY\")\n |> startProfileAt([-width / 2, -length / 2], %)\n |> lineTo([width / 2, -length / 2], %, $edge1)\n |> lineTo([width / 2, length / 2], %, $edge2)\n |> lineTo([-width / 2, length / 2], %, $edge3)\n |> close(%, $edge4)\n\nmountingPlate = extrude(thickness, mountingPlateSketch)\n |> fillet({\n radius: filletRadius,\n tolerance: 0.000001,\n tags: [\n getNextAdjacentEdge(edge1),\n getNextAdjacentEdge(edge2),\n getNextAdjacentEdge(edge3),\n getNextAdjacentEdge(edge4)\n ]\n }, %)" + "width = 20\nlength = 10\nthickness = 1\nfilletRadius = 2\n\nmountingPlateSketch = startSketchOn(\"XY\")\n |> startProfileAt([-width / 2, -length / 2], %)\n |> lineTo([width / 2, -length / 2], %, $edge1)\n |> lineTo([width / 2, length / 2], %, $edge2)\n |> lineTo([-width / 2, length / 2], %, $edge3)\n |> close(%, $edge4)\n\nmountingPlate = extrude(thickness, mountingPlateSketch)\n |> fillet({\n radius = filletRadius,\n tags = [\n getNextAdjacentEdge(edge1),\n getNextAdjacentEdge(edge2),\n getNextAdjacentEdge(edge3),\n getNextAdjacentEdge(edge4)\n ]\n }, %)", + "width = 20\nlength = 10\nthickness = 1\nfilletRadius = 1\n\nmountingPlateSketch = startSketchOn(\"XY\")\n |> startProfileAt([-width / 2, -length / 2], %)\n |> lineTo([width / 2, -length / 2], %, $edge1)\n |> lineTo([width / 2, length / 2], %, $edge2)\n |> lineTo([-width / 2, length / 2], %, $edge3)\n |> close(%, $edge4)\n\nmountingPlate = extrude(thickness, mountingPlateSketch)\n |> fillet({\n radius = filletRadius,\n tolerance = 0.000001,\n tags = [\n getNextAdjacentEdge(edge1),\n getNextAdjacentEdge(edge2),\n getNextAdjacentEdge(edge3),\n getNextAdjacentEdge(edge4)\n ]\n }, %)" ] }, { @@ -61635,6 +73047,7 @@ "tags": [ "math" ], + "keywordArguments": false, "args": [ { "name": "num", @@ -61645,7 +73058,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -61657,7 +73071,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -61672,6 +73087,7 @@ "tags": [ "units" ], + "keywordArguments": false, "args": [], "returnValue": { "name": "", @@ -61682,7 +73098,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -61695,6 +73112,7 @@ "summary": "Get the next adjacent edge to the edge given.", "description": "", "tags": [], + "keywordArguments": false, "args": [ { "name": "tag", @@ -62000,7 +73418,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -62230,6 +73648,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -62258,6 +73677,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -62302,21 +73725,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -62330,6 +73741,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -62363,8 +73784,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -62570,7 +73991,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -62582,12 +74004,13 @@ "type": "string", "format": "uuid" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([10, 0], %)\n |> angledLine({ angle: 60, length: 10 }, %)\n |> angledLine({ angle: 120, length: 10 }, %)\n |> line([-10, 0], %)\n |> angledLine({ angle: 240, length: 10 }, %, $referenceEdge)\n |> close(%)\n\nexample = extrude(5, exampleSketch)\n |> fillet({\n radius: 3,\n tags: [getNextAdjacentEdge(referenceEdge)]\n }, %)" + "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([10, 0], %)\n |> angledLine({ angle = 60, length = 10 }, %)\n |> angledLine({ angle = 120, length = 10 }, %)\n |> line([-10, 0], %)\n |> angledLine({ angle = 240, length = 10 }, %, $referenceEdge)\n |> close(%)\n\nexample = extrude(5, exampleSketch)\n |> fillet({\n radius = 3,\n tags = [getNextAdjacentEdge(referenceEdge)]\n }, %)" ] }, { @@ -62595,6 +74018,7 @@ "summary": "Get the opposite edge to the edge given.", "description": "", "tags": [], + "keywordArguments": false, "args": [ { "name": "tag", @@ -62900,7 +74324,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -63130,6 +74554,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -63158,6 +74583,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -63202,21 +74631,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -63230,6 +74647,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -63263,8 +74690,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -63470,7 +74897,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -63482,12 +74910,13 @@ "type": "string", "format": "uuid" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([10, 0], %)\n |> angledLine({ angle: 60, length: 10 }, %)\n |> angledLine({ angle: 120, length: 10 }, %)\n |> line([-10, 0], %)\n |> angledLine({ angle: 240, length: 10 }, %, $referenceEdge)\n |> close(%)\n\nexample = extrude(5, exampleSketch)\n |> fillet({\n radius: 3,\n tags: [getOppositeEdge(referenceEdge)]\n }, %)" + "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([10, 0], %)\n |> angledLine({ angle = 60, length = 10 }, %)\n |> angledLine({ angle = 120, length = 10 }, %)\n |> line([-10, 0], %)\n |> angledLine({ angle = 240, length = 10 }, %, $referenceEdge)\n |> close(%)\n\nexample = extrude(5, exampleSketch)\n |> fillet({\n radius = 3,\n tags = [getOppositeEdge(referenceEdge)]\n }, %)" ] }, { @@ -63495,6 +74924,7 @@ "summary": "Get the previous adjacent edge to the edge given.", "description": "", "tags": [], + "keywordArguments": false, "args": [ { "name": "tag", @@ -63800,7 +75230,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -64030,6 +75460,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -64058,6 +75489,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -64102,21 +75537,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -64130,6 +75553,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -64163,8 +75596,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -64370,7 +75803,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -64382,12 +75816,13 @@ "type": "string", "format": "uuid" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([10, 0], %)\n |> angledLine({ angle: 60, length: 10 }, %)\n |> angledLine({ angle: 120, length: 10 }, %)\n |> line([-10, 0], %)\n |> angledLine({ angle: 240, length: 10 }, %, $referenceEdge)\n |> close(%)\n\nexample = extrude(5, exampleSketch)\n |> fillet({\n radius: 3,\n tags: [getPreviousAdjacentEdge(referenceEdge)]\n }, %)" + "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([10, 0], %)\n |> angledLine({ angle = 60, length = 10 }, %)\n |> angledLine({ angle = 120, length = 10 }, %)\n |> line([-10, 0], %)\n |> angledLine({ angle = 240, length = 10 }, %, $referenceEdge)\n |> close(%)\n\nexample = extrude(5, exampleSketch)\n |> fillet({\n radius = 3,\n tags = [getPreviousAdjacentEdge(referenceEdge)]\n }, %)" ] }, { @@ -64395,6 +75830,7 @@ "summary": "Create a helix on a cylinder.", "description": "", "tags": [], + "keywordArguments": false, "args": [ { "name": "data", @@ -64432,7 +75868,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "solid", @@ -64691,21 +76128,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -64719,6 +76144,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -64729,8 +76164,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "Sketch": { "description": "A sketch is a collection of paths.", @@ -65022,7 +76457,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -65252,6 +76687,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -65280,6 +76716,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -65808,7 +77248,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -66068,21 +77509,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -66096,6 +77525,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -66106,8 +77545,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "Sketch": { "description": "A sketch is a collection of paths.", @@ -66399,7 +77838,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -66629,6 +78068,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -66657,6 +78097,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -67185,12 +78629,13 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "part001 = startSketchOn('XY')\n |> circle({ center: [5, 5], radius: 10 }, %)\n |> extrude(10, %)\n |> helix({\n angleStart: 0,\n ccw: true,\n revolutions: 16\n }, %)" + "part001 = startSketchOn('XY')\n |> circle({ center = [5, 5], radius = 10 }, %)\n |> extrude(10, %)\n |> helix({\n angleStart = 0,\n ccw = true,\n revolutions = 16\n }, %)" ] }, { @@ -67198,6 +78643,7 @@ "summary": "Use a 2-dimensional sketch to cut a hole in another 2-dimensional sketch.", "description": "", "tags": [], + "keywordArguments": false, "args": [ { "name": "hole_sketch", @@ -67526,7 +78972,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -67756,6 +79202,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -67784,6 +79231,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -67828,21 +79279,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -67856,6 +79295,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -67889,8 +79338,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -68596,7 +80045,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch", @@ -68893,7 +80343,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -69123,6 +80573,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -69151,6 +80602,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -69195,21 +80650,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -69223,6 +80666,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -69256,8 +80709,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -69963,7 +81416,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -70261,7 +81715,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -70491,6 +81945,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -70519,6 +81974,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -70563,21 +82022,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -70591,6 +82038,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -70624,8 +82081,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -71331,13 +82788,14 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> line([0, 5], %)\n |> line([5, 0], %)\n |> line([0, -5], %)\n |> close(%)\n |> hole(circle({ center: [1, 1], radius: .25 }, %), %)\n |> hole(circle({ center: [1, 4], radius: .25 }, %), %)\n\nexample = extrude(1, exampleSketch)", - "fn squareHoleSketch = () => {\n squareSketch = startSketchOn('-XZ')\n |> startProfileAt([-1, -1], %)\n |> line([2, 0], %)\n |> line([0, 2], %)\n |> line([-2, 0], %)\n |> close(%)\n return squareSketch\n}\n\nexampleSketch = startSketchOn('-XZ')\n |> circle({ center: [0, 0], radius: 3 }, %)\n |> hole(squareHoleSketch(), %)\nexample = extrude(1, exampleSketch)" + "exampleSketch = startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> line([0, 5], %)\n |> line([5, 0], %)\n |> line([0, -5], %)\n |> close(%)\n |> hole(circle({ center = [1, 1], radius = .25 }, %), %)\n |> hole(circle({ center = [1, 4], radius = .25 }, %), %)\n\nexample = extrude(1, exampleSketch)", + "fn squareHoleSketch() {\n squareSketch = startSketchOn('-XZ')\n |> startProfileAt([-1, -1], %)\n |> line([2, 0], %)\n |> line([0, 2], %)\n |> line([-2, 0], %)\n |> close(%)\n return squareSketch\n}\n\nexampleSketch = startSketchOn('-XZ')\n |> circle({ center = [0, 0], radius = 3 }, %)\n |> hole(squareHoleSketch(), %)\nexample = extrude(1, exampleSketch)" ] }, { @@ -71345,6 +82803,7 @@ "summary": "Make the inside of a 3D object hollow.", "description": "Remove volume from a 3-dimensional shape such that a wall of the provided thickness remains around the exterior of the shape.", "tags": [], + "keywordArguments": false, "args": [ { "name": "thickness", @@ -71355,7 +82814,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, { "name": "solid", @@ -71614,21 +83074,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -71642,6 +83090,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -71652,8 +83110,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "Sketch": { "description": "A sketch is a collection of paths.", @@ -71945,7 +83403,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -72175,6 +83633,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -72203,6 +83662,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -72731,7 +84194,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -72991,21 +84455,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -73019,6 +84471,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -73029,8 +84491,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "Sketch": { "description": "A sketch is a collection of paths.", @@ -73322,7 +84784,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -73552,6 +85014,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -73580,6 +85043,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -74108,21 +85575,23 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ "// Hollow a basic sketch.\nfirstSketch = startSketchOn('XY')\n |> startProfileAt([-12, 12], %)\n |> line([24, 0], %)\n |> line([0, -24], %)\n |> line([-24, 0], %)\n |> close(%)\n |> extrude(6, %)\n |> hollow(0.25, %)", "// Hollow a basic sketch.\nfirstSketch = startSketchOn('-XZ')\n |> startProfileAt([-12, 12], %)\n |> line([24, 0], %)\n |> line([0, -24], %)\n |> line([-24, 0], %)\n |> close(%)\n |> extrude(6, %)\n |> hollow(0.5, %)", - "// Hollow a sketch on face object.\nsize = 100\ncase = startSketchOn('-XZ')\n |> startProfileAt([-size, -size], %)\n |> line([2 * size, 0], %)\n |> line([0, 2 * size], %)\n |> tangentialArcTo([-size, size], %)\n |> close(%)\n |> extrude(65, %)\n\nthing1 = startSketchOn(case, 'end')\n |> circle({\n center: [-size / 2, -size / 2],\n radius: 25\n }, %)\n |> extrude(50, %)\n\nthing2 = startSketchOn(case, 'end')\n |> circle({\n center: [size / 2, -size / 2],\n radius: 25\n }, %)\n |> extrude(50, %)\n\nhollow(0.5, case)" + "// Hollow a sketch on face object.\nsize = 100\ncase = startSketchOn('-XZ')\n |> startProfileAt([-size, -size], %)\n |> line([2 * size, 0], %)\n |> line([0, 2 * size], %)\n |> tangentialArcTo([-size, size], %)\n |> close(%)\n |> extrude(65, %)\n\nthing1 = startSketchOn(case, 'end')\n |> circle({\n center = [-size / 2, -size / 2],\n radius = 25\n }, %)\n |> extrude(50, %)\n\nthing2 = startSketchOn(case, 'end')\n |> circle({\n center = [size / 2, -size / 2],\n radius = 25\n }, %)\n |> extrude(50, %)\n\nhollow(0.5, case)" ] }, { "name": "import", "summary": "Import a CAD file.", - "description": "For formats lacking unit data (such as STL, OBJ, or PLY files), the default unit of measurement is millimeters. Alternatively you may specify the unit by passing your desired measurement unit in the options parameter. When importing a GLTF file, the bin file will be imported as well. Import paths are relative to the current project directory.\n\nNote: The import command currently only works when using the native Modeling App.", + "description": "For formats lacking unit data (such as STL, OBJ, or PLY files), the default unit of measurement is millimeters. Alternatively you may specify the unit by passing your desired measurement unit in the options parameter. When importing a GLTF file, the bin file will be imported as well. Import paths are relative to the current project directory.\n\nNote: The import command currently only works when using the native Modeling App.\n\nFor importing KCL functions using the `import` statement, see the docs on [KCL modules](/docs/kcl/modules).", "tags": [], + "keywordArguments": false, "args": [ { "name": "file_path", @@ -74132,7 +85601,8 @@ "title": "String", "type": "string" }, - "required": true + "required": true, + "labelRequired": true }, { "name": "options", @@ -74154,10 +85624,10 @@ "description": "Autodesk Filmbox (FBX) format", "type": "object", "required": [ - "type" + "format" ], "properties": { - "type": { + "format": { "type": "string", "enum": [ "fbx" @@ -74169,10 +85639,10 @@ "description": "Binary glTF 2.0. We refer to this as glTF since that is how our customers refer to it, but this can also import binary glTF (glb).", "type": "object", "required": [ - "type" + "format" ], "properties": { - "type": { + "format": { "type": "string", "enum": [ "gltf" @@ -74184,11 +85654,11 @@ "description": "Wavefront OBJ format.", "type": "object", "required": [ - "type", + "format", "units" ], "properties": { - "type": { + "format": { "type": "string", "enum": [ "obj" @@ -74217,11 +85687,11 @@ "description": "The PLY Polygon File Format.", "type": "object", "required": [ - "type", + "format", "units" ], "properties": { - "type": { + "format": { "type": "string", "enum": [ "ply" @@ -74250,10 +85720,10 @@ "description": "SolidWorks part (SLDPRT) format.", "type": "object", "required": [ - "type" + "format" ], "properties": { - "type": { + "format": { "type": "string", "enum": [ "sldprt" @@ -74265,10 +85735,10 @@ "description": "ISO 10303-21 (STEP) format.", "type": "object", "required": [ - "type" + "format" ], "properties": { - "type": { + "format": { "type": "string", "enum": [ "step" @@ -74280,11 +85750,11 @@ "description": "ST**ereo**L**ithography format.", "type": "object", "required": [ - "type", + "format", "units" ], "properties": { - "type": { + "format": { "type": "string", "enum": [ "stl" @@ -74450,7 +85920,8 @@ } } }, - "required": false + "required": false, + "labelRequired": true } ], "returnValue": { @@ -74511,21 +85982,23 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ "model = import(\"tests/inputs/cube.obj\")", - "model = import(\"tests/inputs/cube.obj\", { type: \"obj\", units: \"m\" })", + "model = import(\"tests/inputs/cube.obj\", { format = \"obj\", units = \"m\" })", "model = import(\"tests/inputs/cube.gltf\")", "model = import(\"tests/inputs/cube.sldprt\")", - "model = import(\"tests/inputs/cube.step\")" + "model = import(\"tests/inputs/cube.step\")", + "import height, buildSketch from \"common.kcl\"\n\nplane = 'XZ'\nmargin = 2\ns1 = buildSketch(plane, [0, 0])\ns2 = buildSketch(plane, [0, height() + margin])" ] }, { @@ -74535,6 +86008,7 @@ "tags": [ "units" ], + "keywordArguments": false, "args": [], "returnValue": { "name": "", @@ -74545,7 +86019,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -74556,10 +86031,11 @@ { "name": "int", "summary": "Convert a number to an integer.", - "description": "Callers should use floor(), ceil(), or other rounding function first if they care about how numbers with fractional parts are converted. If the number has a fractional part, it's truncated, moving the number towards zero.\n\nIf the number is NaN or has a magnitude, either positive or negative, that is too large to fit into the internal integer representation, the result is a runtime error.", + "description": "DEPRECATED use floor(), ceil(), or round().", "tags": [ "convert" ], + "keywordArguments": false, "args": [ { "name": "num", @@ -74570,24 +86046,26 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { "name": "", - "type": "i64", + "type": "number", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "int64", - "type": "integer", - "format": "int64" + "title": "double", + "type": "number", + "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "n = int(ceil(5 / 2))\nassertEqual(n, 3, 0.0001, \"5/2 = 2.5, rounded up makes 3\")\n// Draw n cylinders.\nstartSketchOn('XZ')\n |> circle({ center: [0, 0], radius: 2 }, %)\n |> extrude(5, %)\n |> patternTransform(n, (id) => {\n return { translate: [4 * id, 0, 0] }\n}, %)" + "n = int(ceil(5 / 2))\nassertEqual(n, 3, 0.0001, \"5/2 = 2.5, rounded up makes 3\")\n// Draw n cylinders.\nstartSketchOn('XZ')\n |> circle({ center = [0, 0], radius = 2 }, %)\n |> extrude(5, %)\n |> patternTransform(n, fn(id) {\n return { translate = [4 * id, 0, 0] }\n }, %)" ] }, { @@ -74595,6 +86073,7 @@ "summary": "Extract the 'x' axis value of the last line segment in the provided 2-d", "description": "sketch.", "tags": [], + "keywordArguments": false, "args": [ { "name": "sketch", @@ -74891,7 +86370,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -75121,6 +86600,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -75149,6 +86629,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -75193,21 +86677,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -75221,6 +86693,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -75254,8 +86736,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -75961,7 +87443,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -75973,7 +87456,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -75986,6 +87470,7 @@ "summary": "Extract the 'y' axis value of the last line segment in the provided 2-d", "description": "sketch.", "tags": [], + "keywordArguments": false, "args": [ { "name": "sketch", @@ -76282,7 +87767,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -76512,6 +87997,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -76540,6 +88026,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -76584,21 +88074,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -76612,6 +88090,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -76645,8 +88133,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -77352,7 +88840,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -77364,7 +88853,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -77379,6 +88869,7 @@ "tags": [ "utilities" ], + "keywordArguments": false, "args": [ { "name": "hypotenuse", @@ -77389,7 +88880,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, { "name": "leg", @@ -77400,7 +88892,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -77412,7 +88905,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -77427,6 +88921,7 @@ "tags": [ "utilities" ], + "keywordArguments": false, "args": [ { "name": "hypotenuse", @@ -77437,7 +88932,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, { "name": "leg", @@ -77448,7 +88944,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -77460,7 +88957,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -77475,6 +88973,7 @@ "tags": [ "utilities" ], + "keywordArguments": false, "args": [ { "name": "hypotenuse", @@ -77485,7 +88984,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, { "name": "leg", @@ -77496,7 +88996,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -77508,7 +89009,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -77521,6 +89023,7 @@ "summary": "Draw a line relative to the current origin to a specified (x, y) away", "description": "from the current position.", "tags": [], + "keywordArguments": false, "args": [ { "name": "delta", @@ -77536,7 +89039,8 @@ "maxItems": 2, "minItems": 2 }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch", @@ -77833,7 +89337,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -78063,6 +89567,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -78091,6 +89596,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -78135,21 +89644,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -78163,6 +89660,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -78196,8 +89703,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -78903,11 +90410,12 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -79153,7 +90661,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -79383,6 +90891,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -79411,6 +90920,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -79455,21 +90968,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -79483,6 +90984,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -79516,8 +91027,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -80223,7 +91734,8 @@ } } }, - "required": false + "required": false, + "labelRequired": true } ], "returnValue": { @@ -80521,7 +92033,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -80751,6 +92263,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -80779,6 +92292,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -80823,21 +92340,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -80851,6 +92356,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -80884,8 +92399,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -81591,7 +93106,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -81605,6 +93121,7 @@ "summary": "Draw a line from the current origin to some absolute (x, y) point.", "description": "", "tags": [], + "keywordArguments": false, "args": [ { "name": "to", @@ -81620,7 +93137,8 @@ "maxItems": 2, "minItems": 2 }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch", @@ -81917,7 +93435,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -82147,6 +93665,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -82175,6 +93694,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -82219,21 +93742,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -82247,6 +93758,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -82280,8 +93801,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -82987,11 +94508,12 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -83237,7 +94759,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -83467,6 +94989,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -83495,6 +95018,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -83539,21 +95066,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -83567,6 +95082,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -83600,8 +95125,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -84307,7 +95832,8 @@ } } }, - "required": false + "required": false, + "labelRequired": true } ], "returnValue": { @@ -84605,7 +96131,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -84835,6 +96361,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -84863,6 +96390,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -84907,21 +96438,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -84935,6 +96454,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -84968,8 +96497,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -85675,7 +97204,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -85690,6 +97220,7 @@ "tags": [ "math" ], + "keywordArguments": false, "args": [ { "name": "num", @@ -85700,7 +97231,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -85712,7 +97244,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -85725,6 +97258,7 @@ "summary": "Create a 3D surface or solid by interpolating between two or more sketches.", "description": "The sketches need to closed and on the same plane.", "tags": [], + "keywordArguments": true, "args": [ { "name": "sketches", @@ -86027,7 +97561,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -86257,6 +97791,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -86285,6 +97820,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -86329,21 +97868,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -86357,6 +97884,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -86390,8 +97927,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -87042,19 +98579,2661 @@ } } }, - "required": true + "required": true, + "description": "Which sketches to loft. Must include at least 2 sketches.", + "labelRequired": false }, { - "name": "data", - "type": "LoftData", + "name": "v_degree", + "type": "NonZeroU32", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_LoftData", - "allOf": [ - { - "$ref": "#/components/schemas/LoftData" + "title": "NonZeroU32", + "type": "integer", + "format": "uint32", + "minimum": 1.0, + "definitions": { + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } } - ], + } + }, + "required": true, + "description": "Degree of the interpolation. Must be greater than zero. For example, use 2 for quadratic, or 3 for cubic interpolation in the V direction. This defaults to 2, if not specified.", + "labelRequired": true + }, + { + "name": "bez_approximate_rational", + "type": "bool", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Boolean", + "type": "boolean", + "definitions": { + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + } + } + }, + "required": true, + "description": "Attempt to approximate rational curves (such as arcs) using a bezier. This will remove banding around interpolations between arcs and non-arcs. It may produce errors in other scenarios Over time, this field won't be necessary.", + "labelRequired": true + }, + { + "name": "base_curve_index", + "type": "integer", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Nullable_uint32", + "type": "integer", + "format": "uint32", + "minimum": 0.0, "nullable": true, "definitions": { "Sketch": { @@ -87347,7 +101526,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -87577,6 +101756,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -87605,6 +101785,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -87649,21 +101833,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -87677,6 +101849,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -87710,8 +101892,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -88359,44 +102541,1334 @@ "nullable": true } } - }, - "LoftData": { - "description": "Data for a loft.", + } + } + }, + "required": false, + "description": "This can be set to override the automatically determined topological base curve, which is usually the first section encountered.", + "labelRequired": true + }, + { + "name": "tolerance", + "type": "number", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Nullable_double", + "type": "number", + "format": "double", + "nullable": true, + "definitions": { + "Sketch": { + "description": "A sketch is a collection of paths.", "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], "properties": { - "vDegree": { - "description": "Degree of the interpolation. Must be greater than zero. For example, use 2 for quadratic, or 3 for cubic interpolation in the V direction. This defaults to 2, if not specified.", + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { "type": "integer", - "format": "uint32", - "minimum": 1.0, - "nullable": true + "format": "uint", + "minimum": 0.0 }, - "bezApproximateRational": { - "description": "Attempt to approximate rational curves (such as arcs) using a bezier. This will remove banding around interpolations between arcs and non-arcs. It may produce errors in other scenarios Over time, this field won't be necessary.", - "default": null, - "type": "boolean", - "nullable": true - }, - "baseCurveIndex": { - "description": "This can be set to override the automatically determined topological base curve, which is usually the first section encountered.", - "default": null, + "end": { "type": "integer", - "format": "uint32", - "minimum": 0.0, - "nullable": true + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" }, - "tolerance": { - "description": "Tolerance for the loft operation.", - "default": null, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { "type": "number", - "format": "double", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], "nullable": true } } } } }, - "required": false + "required": false, + "description": "Tolerance for the loft operation.", + "labelRequired": true } ], "returnValue": { @@ -88656,21 +104128,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -88684,6 +104144,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -88694,8 +104164,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "Sketch": { "description": "A sketch is a collection of paths.", @@ -88987,7 +104457,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -89217,6 +104687,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -89245,6 +104716,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -89773,14 +105248,15 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ "// Loft a square and a triangle.\nsquareSketch = startSketchOn('XY')\n |> startProfileAt([-100, 200], %)\n |> line([200, 0], %)\n |> line([0, -200], %)\n |> line([-200, 0], %)\n |> lineTo([profileStartX(%), profileStartY(%)], %)\n |> close(%)\n\ntriangleSketch = startSketchOn(offsetPlane('XY', 75))\n |> startProfileAt([0, 125], %)\n |> line([-15, -30], %)\n |> line([30, 0], %)\n |> lineTo([profileStartX(%), profileStartY(%)], %)\n |> close(%)\n\nloft([squareSketch, triangleSketch])", - "// Loft a square, a circle, and another circle.\nsquareSketch = startSketchOn('XY')\n |> startProfileAt([-100, 200], %)\n |> line([200, 0], %)\n |> line([0, -200], %)\n |> line([-200, 0], %)\n |> lineTo([profileStartX(%), profileStartY(%)], %)\n |> close(%)\n\ncircleSketch0 = startSketchOn(offsetPlane('XY', 75))\n |> circle({ center: [0, 100], radius: 50 }, %)\n\ncircleSketch1 = startSketchOn(offsetPlane('XY', 150))\n |> circle({ center: [0, 100], radius: 20 }, %)\n\nloft([\n squareSketch,\n circleSketch0,\n circleSketch1\n])", - "// Loft a square, a circle, and another circle with options.\nsquareSketch = startSketchOn('XY')\n |> startProfileAt([-100, 200], %)\n |> line([200, 0], %)\n |> line([0, -200], %)\n |> line([-200, 0], %)\n |> lineTo([profileStartX(%), profileStartY(%)], %)\n |> close(%)\n\ncircleSketch0 = startSketchOn(offsetPlane('XY', 75))\n |> circle({ center: [0, 100], radius: 50 }, %)\n\ncircleSketch1 = startSketchOn(offsetPlane('XY', 150))\n |> circle({ center: [0, 100], radius: 20 }, %)\n\nloft([\n squareSketch,\n circleSketch0,\n circleSketch1\n], {\n // This can be set to override the automatically determined\n // topological base curve, which is usually the first section encountered.\n baseCurveIndex: 0,\n // Attempt to approximate rational curves (such as arcs) using a bezier.\n // This will remove banding around interpolations between arcs and non-arcs.\n // It may produce errors in other scenarios Over time, this field won't be necessary.\n bezApproximateRational: false,\n // Tolerance for the loft operation.\n tolerance: 0.000001,\n // Degree of the interpolation. Must be greater than zero.\n // For example, use 2 for quadratic, or 3 for cubic interpolation in\n // the V direction. This defaults to 2, if not specified.\n vDegree: 2\n})" + "// Loft a square, a circle, and another circle.\nsquareSketch = startSketchOn('XY')\n |> startProfileAt([-100, 200], %)\n |> line([200, 0], %)\n |> line([0, -200], %)\n |> line([-200, 0], %)\n |> lineTo([profileStartX(%), profileStartY(%)], %)\n |> close(%)\n\ncircleSketch0 = startSketchOn(offsetPlane('XY', 75))\n |> circle({ center = [0, 100], radius = 50 }, %)\n\ncircleSketch1 = startSketchOn(offsetPlane('XY', 150))\n |> circle({ center = [0, 100], radius = 20 }, %)\n\nloft([\n squareSketch,\n circleSketch0,\n circleSketch1\n])", + "// Loft a square, a circle, and another circle with options.\nsquareSketch = startSketchOn('XY')\n |> startProfileAt([-100, 200], %)\n |> line([200, 0], %)\n |> line([0, -200], %)\n |> line([-200, 0], %)\n |> lineTo([profileStartX(%), profileStartY(%)], %)\n |> close(%)\n\ncircleSketch0 = startSketchOn(offsetPlane('XY', 75))\n |> circle({ center = [0, 100], radius = 50 }, %)\n\ncircleSketch1 = startSketchOn(offsetPlane('XY', 150))\n |> circle({ center = [0, 100], radius = 20 }, %)\n\nloft([\n squareSketch,\n circleSketch0,\n circleSketch1\n], baseCurveIndex = 0, bezApproximateRational = false, tolerance = 0.000001, vDegree = 2)" ] }, { @@ -89790,6 +105266,7 @@ "tags": [ "math" ], + "keywordArguments": false, "args": [ { "name": "num", @@ -89800,7 +105277,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, { "name": "base", @@ -89811,7 +105289,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -89823,7 +105302,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -89838,6 +105318,7 @@ "tags": [ "math" ], + "keywordArguments": false, "args": [ { "name": "num", @@ -89848,7 +105329,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -89860,7 +105342,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -89875,6 +105358,7 @@ "tags": [ "math" ], + "keywordArguments": false, "args": [ { "name": "num", @@ -89885,7 +105369,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -89897,7 +105382,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -89912,6 +105398,7 @@ "tags": [ "units" ], + "keywordArguments": false, "args": [], "returnValue": { "name": "", @@ -89922,7 +105409,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -89935,6 +105423,7 @@ "summary": "Apply a function to every element of a list.", "description": "Given a list like `[a, b, c]`, and a function like `f`, returns `[f(a), f(b), f(c)]`", "tags": [], + "keywordArguments": false, "args": [ { "name": "array", @@ -89961,10 +105450,171 @@ "type": { "type": "string", "enum": [ - "UserVal" + "Uuid" ] }, - "value": {}, + "value": { + "type": "string", + "format": "uuid" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Bool" + ] + }, + "value": { + "type": "boolean" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Number" + ] + }, + "value": { + "type": "number", + "format": "double" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Int" + ] + }, + "value": { + "type": "integer", + "format": "int64" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "String" + ] + }, + "value": { + "type": "string" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Array" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Object" + ] + }, + "value": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/KclValue" + } + }, "__meta": { "type": "array", "items": { @@ -90009,8 +105659,6 @@ { "type": "object", "required": [ - "end", - "start", "type", "value" ], @@ -90021,16 +105669,6 @@ "TagDeclarator" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -90044,6 +105682,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -90184,6 +105832,45 @@ } } }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketch" + ] + }, + "value": { + "$ref": "#/components/schemas/Sketch" + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketches" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Sketch" + } + } + } + }, { "description": "An solid is a collection of extrude surfaces.", "type": "object", @@ -90316,7 +106003,6 @@ "type": "object", "required": [ "__meta", - "expression", "memory", "type" ], @@ -90327,9 +106013,6 @@ "Function" ] }, - "expression": { - "$ref": "#/components/schemas/FunctionExpression" - }, "memory": { "$ref": "#/components/schemas/ProgramMemory" }, @@ -90340,6 +106023,56 @@ } } } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Module" + ] + }, + "value": { + "$ref": "#/components/schemas/ModuleId" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "KclNone" + ] + }, + "value": { + "$ref": "#/components/schemas/KclNone" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } } ] }, @@ -90367,8 +106100,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "TagEngineInfo": { "description": "Engine information for a tag.", @@ -90643,7 +106376,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -90873,6 +106606,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -90901,6 +106635,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -90945,21 +106683,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -90973,6 +106699,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -91646,2069 +107382,6 @@ } ] }, - "FunctionExpression": { - "type": "object", - "required": [ - "body", - "end", - "params", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "params": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Parameter" - } - }, - "body": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Parameter": { - "description": "Parameter of a KCL function.", - "type": "object", - "required": [ - "identifier", - "optional" - ], - "properties": { - "identifier": { - "description": "The parameter's label or name.", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ] - }, - "optional": { - "description": "Is the parameter optional?", - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Identifier": { - "type": "object", - "required": [ - "end", - "name", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Program": { - "description": "A KCL program top level, or function body.", - "type": "object", - "required": [ - "body", - "end", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "body": { - "type": "array", - "items": { - "$ref": "#/components/schemas/BodyItem" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "BodyItem": { - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "items", - "path", - "raw_path", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ImportStatement" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ImportItem" - } - }, - "path": { - "type": "string" - }, - "raw_path": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "expression", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ExpressionStatement" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "expression": { - "$ref": "#/components/schemas/Expr" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "declarations", - "end", - "kind", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "VariableDeclaration" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "declarations": { - "type": "array", - "items": { - "$ref": "#/components/schemas/VariableDeclarator" - } - }, - "visibility": { - "$ref": "#/components/schemas/ItemVisibility" - }, - "kind": { - "$ref": "#/components/schemas/VariableKind" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ReturnStatement" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "argument": { - "$ref": "#/components/schemas/Expr" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "ImportItem": { - "type": "object", - "required": [ - "end", - "name", - "start" - ], - "properties": { - "name": { - "description": "Name of the item to import.", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ] - }, - "alias": { - "description": "Rename the item using an identifier after \"as\".", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ], - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Expr": { - "description": "An expression can be evaluated to yield a single KCL value.", - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/LiteralValue" - }, - "raw": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TagDeclarator" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/BinaryOperator" - }, - "left": { - "$ref": "#/components/schemas/BinaryPart" - }, - "right": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "params", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "FunctionExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "params": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Parameter" - } - }, - "body": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "callee": { - "$ref": "#/components/schemas/Identifier" - }, - "arguments": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "optional": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "body": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeSubstitution" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "elements", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "elements": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "endElement", - "endInclusive", - "start", - "startElement", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayRangeExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "startElement": { - "$ref": "#/components/schemas/Expr" - }, - "endElement": { - "$ref": "#/components/schemas/Expr" - }, - "endInclusive": { - "description": "Is the `end_element` included in the range?", - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "properties", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ObjectExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "properties": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ObjectProperty" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "object": { - "$ref": "#/components/schemas/MemberObject" - }, - "property": { - "$ref": "#/components/schemas/LiteralIdentifier" - }, - "computed": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/UnaryOperator" - }, - "argument": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "cond": { - "$ref": "#/components/schemas/Expr" - }, - "then_val": { - "$ref": "#/components/schemas/Program" - }, - "else_ifs": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ElseIf" - } - }, - "final_else": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "description": "KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application).", - "type": "object", - "required": [ - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "None" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - } - ] - }, - "LiteralValue": { - "anyOf": [ - { - "type": "integer", - "format": "int64" - }, - { - "type": "number", - "format": "double" - }, - { - "type": "string" - }, - { - "type": "boolean" - } - ] - }, - "BinaryOperator": { - "oneOf": [ - { - "description": "Add two numbers.", - "type": "string", - "enum": [ - "+" - ] - }, - { - "description": "Subtract two numbers.", - "type": "string", - "enum": [ - "-" - ] - }, - { - "description": "Multiply two numbers.", - "type": "string", - "enum": [ - "*" - ] - }, - { - "description": "Divide two numbers.", - "type": "string", - "enum": [ - "/" - ] - }, - { - "description": "Modulo two numbers.", - "type": "string", - "enum": [ - "%" - ] - }, - { - "description": "Raise a number to a power.", - "type": "string", - "enum": [ - "^" - ] - }, - { - "description": "Are two numbers equal?", - "type": "string", - "enum": [ - "==" - ] - }, - { - "description": "Are two numbers not equal?", - "type": "string", - "enum": [ - "!=" - ] - }, - { - "description": "Is left greater than right", - "type": "string", - "enum": [ - ">" - ] - }, - { - "description": "Is left greater than or equal to right", - "type": "string", - "enum": [ - ">=" - ] - }, - { - "description": "Is left less than right", - "type": "string", - "enum": [ - "<" - ] - }, - { - "description": "Is left less than or equal to right", - "type": "string", - "enum": [ - "<=" - ] - } - ] - }, - "BinaryPart": { - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/LiteralValue" - }, - "raw": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/BinaryOperator" - }, - "left": { - "$ref": "#/components/schemas/BinaryPart" - }, - "right": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "callee": { - "$ref": "#/components/schemas/Identifier" - }, - "arguments": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "optional": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/UnaryOperator" - }, - "argument": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "object": { - "$ref": "#/components/schemas/MemberObject" - }, - "property": { - "$ref": "#/components/schemas/LiteralIdentifier" - }, - "computed": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "cond": { - "$ref": "#/components/schemas/Expr" - }, - "then_val": { - "$ref": "#/components/schemas/Program" - }, - "else_ifs": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ElseIf" - } - }, - "final_else": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "UnaryOperator": { - "oneOf": [ - { - "description": "Negate a number.", - "type": "string", - "enum": [ - "-" - ] - }, - { - "description": "Negate a boolean.", - "type": "string", - "enum": [ - "!" - ] - } - ] - }, - "MemberObject": { - "oneOf": [ - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "object": { - "$ref": "#/components/schemas/MemberObject" - }, - "property": { - "$ref": "#/components/schemas/LiteralIdentifier" - }, - "computed": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "LiteralIdentifier": { - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/LiteralValue" - }, - "raw": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "ElseIf": { - "type": "object", - "required": [ - "cond", - "end", - "start", - "then_val" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "cond": { - "$ref": "#/components/schemas/Expr" - }, - "then_val": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "NonCodeMeta": { - "type": "object", - "required": [ - "nonCodeNodes", - "start" - ], - "properties": { - "nonCodeNodes": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NonCodeNode" - } - } - }, - "start": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NonCodeNode" - } - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "NonCodeNode": { - "type": "object", - "required": [ - "end", - "start", - "value" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/NonCodeValue" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "NonCodeValue": { - "oneOf": [ - { - "description": "A shebang. This is a special type of comment that is at the top of the file. It looks like this: ```python,no_run #!/usr/bin/env python ```", - "type": "object", - "required": [ - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "shebang" - ] - }, - "value": { - "type": "string" - } - } - }, - { - "description": "An inline comment. Here are examples: `1 + 1 // This is an inline comment`. `1 + 1 /* Here's another */`.", - "type": "object", - "required": [ - "style", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "inlineComment" - ] - }, - "value": { - "type": "string" - }, - "style": { - "$ref": "#/components/schemas/CommentStyle" - } - } - }, - { - "description": "A block comment. An example of this is the following: ```python,no_run /* This is a block comment */ 1 + 1 ``` Now this is important. The block comment is attached to the next line. This is always the case. Also the block comment doesn't have a new line above it. If it did it would be a `NewLineBlockComment`.", - "type": "object", - "required": [ - "style", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "blockComment" - ] - }, - "value": { - "type": "string" - }, - "style": { - "$ref": "#/components/schemas/CommentStyle" - } - } - }, - { - "description": "A block comment that has a new line above it. The user explicitly added a new line above the block comment.", - "type": "object", - "required": [ - "style", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "newLineBlockComment" - ] - }, - "value": { - "type": "string" - }, - "style": { - "$ref": "#/components/schemas/CommentStyle" - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "newLine" - ] - } - } - } - ] - }, - "CommentStyle": { - "oneOf": [ - { - "description": "Like // foo", - "type": "string", - "enum": [ - "line" - ] - }, - { - "description": "Like /* foo */", - "type": "string", - "enum": [ - "block" - ] - } - ] - }, - "ObjectProperty": { - "type": "object", - "required": [ - "end", - "key", - "start", - "value" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "key": { - "$ref": "#/components/schemas/Identifier" - }, - "value": { - "$ref": "#/components/schemas/Expr" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "VariableDeclarator": { - "type": "object", - "required": [ - "end", - "id", - "init", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "id": { - "description": "The identifier of the variable.", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ] - }, - "init": { - "description": "The value of the variable.", - "allOf": [ - { - "$ref": "#/components/schemas/Expr" - } - ] - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "ItemVisibility": { - "type": "string", - "enum": [ - "default", - "export" - ] - }, - "VariableKind": { - "oneOf": [ - { - "description": "Declare a named constant.", - "type": "string", - "enum": [ - "const" - ] - }, - { - "description": "Declare a function.", - "type": "string", - "enum": [ - "fn" - ] - } - ] - }, "ProgramMemory": { "type": "object", "required": [ @@ -93723,7 +107396,9 @@ } }, "currentEnv": { - "$ref": "#/components/schemas/EnvironmentRef" + "type": "integer", + "format": "uint", + "minimum": 0.0 }, "return": { "allOf": [ @@ -93748,24 +107423,40 @@ } }, "parent": { - "allOf": [ - { - "$ref": "#/components/schemas/EnvironmentRef" - } - ], + "type": "integer", + "format": "uint", + "minimum": 0.0, "nullable": true } } }, - "EnvironmentRef": { - "description": "An index pointing to an environment.", + "ModuleId": { + "description": "Identifier of a source file. Uses a u32 to keep the size small.", "type": "integer", - "format": "uint", + "format": "uint32", "minimum": 0.0 + }, + "KclNone": { + "description": "KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application).", + "type": "object", + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + } + } } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "map_fn", @@ -93789,10 +107480,171 @@ "type": { "type": "string", "enum": [ - "UserVal" + "Uuid" ] }, - "value": {}, + "value": { + "type": "string", + "format": "uuid" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Bool" + ] + }, + "value": { + "type": "boolean" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Number" + ] + }, + "value": { + "type": "number", + "format": "double" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Int" + ] + }, + "value": { + "type": "integer", + "format": "int64" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "String" + ] + }, + "value": { + "type": "string" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Array" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Object" + ] + }, + "value": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/KclValue" + } + }, "__meta": { "type": "array", "items": { @@ -93837,8 +107689,6 @@ { "type": "object", "required": [ - "end", - "start", "type", "value" ], @@ -93849,16 +107699,6 @@ "TagDeclarator" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -93872,6 +107712,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -94012,6 +107862,45 @@ } } }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketch" + ] + }, + "value": { + "$ref": "#/components/schemas/Sketch" + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketches" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Sketch" + } + } + } + }, { "description": "An solid is a collection of extrude surfaces.", "type": "object", @@ -94144,7 +108033,6 @@ "type": "object", "required": [ "__meta", - "expression", "memory", "type" ], @@ -94155,9 +108043,6 @@ "Function" ] }, - "expression": { - "$ref": "#/components/schemas/FunctionExpression" - }, "memory": { "$ref": "#/components/schemas/ProgramMemory" }, @@ -94168,6 +108053,56 @@ } } } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Module" + ] + }, + "value": { + "$ref": "#/components/schemas/ModuleId" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "KclNone" + ] + }, + "value": { + "$ref": "#/components/schemas/KclNone" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } } ] }, @@ -94195,8 +108130,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "TagEngineInfo": { "description": "Engine information for a tag.", @@ -94471,7 +108406,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -94701,6 +108636,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -94729,6 +108665,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -94773,21 +108713,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -94801,6 +108729,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -95474,2069 +109412,6 @@ } ] }, - "FunctionExpression": { - "type": "object", - "required": [ - "body", - "end", - "params", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "params": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Parameter" - } - }, - "body": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Parameter": { - "description": "Parameter of a KCL function.", - "type": "object", - "required": [ - "identifier", - "optional" - ], - "properties": { - "identifier": { - "description": "The parameter's label or name.", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ] - }, - "optional": { - "description": "Is the parameter optional?", - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Identifier": { - "type": "object", - "required": [ - "end", - "name", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Program": { - "description": "A KCL program top level, or function body.", - "type": "object", - "required": [ - "body", - "end", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "body": { - "type": "array", - "items": { - "$ref": "#/components/schemas/BodyItem" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "BodyItem": { - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "items", - "path", - "raw_path", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ImportStatement" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ImportItem" - } - }, - "path": { - "type": "string" - }, - "raw_path": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "expression", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ExpressionStatement" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "expression": { - "$ref": "#/components/schemas/Expr" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "declarations", - "end", - "kind", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "VariableDeclaration" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "declarations": { - "type": "array", - "items": { - "$ref": "#/components/schemas/VariableDeclarator" - } - }, - "visibility": { - "$ref": "#/components/schemas/ItemVisibility" - }, - "kind": { - "$ref": "#/components/schemas/VariableKind" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ReturnStatement" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "argument": { - "$ref": "#/components/schemas/Expr" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "ImportItem": { - "type": "object", - "required": [ - "end", - "name", - "start" - ], - "properties": { - "name": { - "description": "Name of the item to import.", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ] - }, - "alias": { - "description": "Rename the item using an identifier after \"as\".", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ], - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Expr": { - "description": "An expression can be evaluated to yield a single KCL value.", - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/LiteralValue" - }, - "raw": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TagDeclarator" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/BinaryOperator" - }, - "left": { - "$ref": "#/components/schemas/BinaryPart" - }, - "right": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "params", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "FunctionExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "params": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Parameter" - } - }, - "body": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "callee": { - "$ref": "#/components/schemas/Identifier" - }, - "arguments": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "optional": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "body": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeSubstitution" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "elements", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "elements": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "endElement", - "endInclusive", - "start", - "startElement", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayRangeExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "startElement": { - "$ref": "#/components/schemas/Expr" - }, - "endElement": { - "$ref": "#/components/schemas/Expr" - }, - "endInclusive": { - "description": "Is the `end_element` included in the range?", - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "properties", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ObjectExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "properties": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ObjectProperty" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "object": { - "$ref": "#/components/schemas/MemberObject" - }, - "property": { - "$ref": "#/components/schemas/LiteralIdentifier" - }, - "computed": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/UnaryOperator" - }, - "argument": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "cond": { - "$ref": "#/components/schemas/Expr" - }, - "then_val": { - "$ref": "#/components/schemas/Program" - }, - "else_ifs": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ElseIf" - } - }, - "final_else": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "description": "KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application).", - "type": "object", - "required": [ - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "None" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - } - ] - }, - "LiteralValue": { - "anyOf": [ - { - "type": "integer", - "format": "int64" - }, - { - "type": "number", - "format": "double" - }, - { - "type": "string" - }, - { - "type": "boolean" - } - ] - }, - "BinaryOperator": { - "oneOf": [ - { - "description": "Add two numbers.", - "type": "string", - "enum": [ - "+" - ] - }, - { - "description": "Subtract two numbers.", - "type": "string", - "enum": [ - "-" - ] - }, - { - "description": "Multiply two numbers.", - "type": "string", - "enum": [ - "*" - ] - }, - { - "description": "Divide two numbers.", - "type": "string", - "enum": [ - "/" - ] - }, - { - "description": "Modulo two numbers.", - "type": "string", - "enum": [ - "%" - ] - }, - { - "description": "Raise a number to a power.", - "type": "string", - "enum": [ - "^" - ] - }, - { - "description": "Are two numbers equal?", - "type": "string", - "enum": [ - "==" - ] - }, - { - "description": "Are two numbers not equal?", - "type": "string", - "enum": [ - "!=" - ] - }, - { - "description": "Is left greater than right", - "type": "string", - "enum": [ - ">" - ] - }, - { - "description": "Is left greater than or equal to right", - "type": "string", - "enum": [ - ">=" - ] - }, - { - "description": "Is left less than right", - "type": "string", - "enum": [ - "<" - ] - }, - { - "description": "Is left less than or equal to right", - "type": "string", - "enum": [ - "<=" - ] - } - ] - }, - "BinaryPart": { - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/LiteralValue" - }, - "raw": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/BinaryOperator" - }, - "left": { - "$ref": "#/components/schemas/BinaryPart" - }, - "right": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "callee": { - "$ref": "#/components/schemas/Identifier" - }, - "arguments": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "optional": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/UnaryOperator" - }, - "argument": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "object": { - "$ref": "#/components/schemas/MemberObject" - }, - "property": { - "$ref": "#/components/schemas/LiteralIdentifier" - }, - "computed": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "cond": { - "$ref": "#/components/schemas/Expr" - }, - "then_val": { - "$ref": "#/components/schemas/Program" - }, - "else_ifs": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ElseIf" - } - }, - "final_else": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "UnaryOperator": { - "oneOf": [ - { - "description": "Negate a number.", - "type": "string", - "enum": [ - "-" - ] - }, - { - "description": "Negate a boolean.", - "type": "string", - "enum": [ - "!" - ] - } - ] - }, - "MemberObject": { - "oneOf": [ - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "object": { - "$ref": "#/components/schemas/MemberObject" - }, - "property": { - "$ref": "#/components/schemas/LiteralIdentifier" - }, - "computed": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "LiteralIdentifier": { - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/LiteralValue" - }, - "raw": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "ElseIf": { - "type": "object", - "required": [ - "cond", - "end", - "start", - "then_val" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "cond": { - "$ref": "#/components/schemas/Expr" - }, - "then_val": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "NonCodeMeta": { - "type": "object", - "required": [ - "nonCodeNodes", - "start" - ], - "properties": { - "nonCodeNodes": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NonCodeNode" - } - } - }, - "start": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NonCodeNode" - } - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "NonCodeNode": { - "type": "object", - "required": [ - "end", - "start", - "value" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/NonCodeValue" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "NonCodeValue": { - "oneOf": [ - { - "description": "A shebang. This is a special type of comment that is at the top of the file. It looks like this: ```python,no_run #!/usr/bin/env python ```", - "type": "object", - "required": [ - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "shebang" - ] - }, - "value": { - "type": "string" - } - } - }, - { - "description": "An inline comment. Here are examples: `1 + 1 // This is an inline comment`. `1 + 1 /* Here's another */`.", - "type": "object", - "required": [ - "style", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "inlineComment" - ] - }, - "value": { - "type": "string" - }, - "style": { - "$ref": "#/components/schemas/CommentStyle" - } - } - }, - { - "description": "A block comment. An example of this is the following: ```python,no_run /* This is a block comment */ 1 + 1 ``` Now this is important. The block comment is attached to the next line. This is always the case. Also the block comment doesn't have a new line above it. If it did it would be a `NewLineBlockComment`.", - "type": "object", - "required": [ - "style", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "blockComment" - ] - }, - "value": { - "type": "string" - }, - "style": { - "$ref": "#/components/schemas/CommentStyle" - } - } - }, - { - "description": "A block comment that has a new line above it. The user explicitly added a new line above the block comment.", - "type": "object", - "required": [ - "style", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "newLineBlockComment" - ] - }, - "value": { - "type": "string" - }, - "style": { - "$ref": "#/components/schemas/CommentStyle" - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "newLine" - ] - } - } - } - ] - }, - "CommentStyle": { - "oneOf": [ - { - "description": "Like // foo", - "type": "string", - "enum": [ - "line" - ] - }, - { - "description": "Like /* foo */", - "type": "string", - "enum": [ - "block" - ] - } - ] - }, - "ObjectProperty": { - "type": "object", - "required": [ - "end", - "key", - "start", - "value" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "key": { - "$ref": "#/components/schemas/Identifier" - }, - "value": { - "$ref": "#/components/schemas/Expr" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "VariableDeclarator": { - "type": "object", - "required": [ - "end", - "id", - "init", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "id": { - "description": "The identifier of the variable.", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ] - }, - "init": { - "description": "The value of the variable.", - "allOf": [ - { - "$ref": "#/components/schemas/Expr" - } - ] - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "ItemVisibility": { - "type": "string", - "enum": [ - "default", - "export" - ] - }, - "VariableKind": { - "oneOf": [ - { - "description": "Declare a named constant.", - "type": "string", - "enum": [ - "const" - ] - }, - { - "description": "Declare a function.", - "type": "string", - "enum": [ - "fn" - ] - } - ] - }, "ProgramMemory": { "type": "object", "required": [ @@ -97551,7 +109426,9 @@ } }, "currentEnv": { - "$ref": "#/components/schemas/EnvironmentRef" + "type": "integer", + "format": "uint", + "minimum": 0.0 }, "return": { "allOf": [ @@ -97576,24 +109453,40 @@ } }, "parent": { - "allOf": [ - { - "$ref": "#/components/schemas/EnvironmentRef" - } - ], + "type": "integer", + "format": "uint", + "minimum": 0.0, "nullable": true } } }, - "EnvironmentRef": { - "description": "An index pointing to an environment.", + "ModuleId": { + "description": "Identifier of a source file. Uses a u32 to keep the size small.", "type": "integer", - "format": "uint", + "format": "uint32", "minimum": 0.0 + }, + "KclNone": { + "description": "KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application).", + "type": "object", + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + } + } } } }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -97621,10 +109514,171 @@ "type": { "type": "string", "enum": [ - "UserVal" + "Uuid" ] }, - "value": {}, + "value": { + "type": "string", + "format": "uuid" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Bool" + ] + }, + "value": { + "type": "boolean" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Number" + ] + }, + "value": { + "type": "number", + "format": "double" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Int" + ] + }, + "value": { + "type": "integer", + "format": "int64" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "String" + ] + }, + "value": { + "type": "string" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Array" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Object" + ] + }, + "value": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/KclValue" + } + }, "__meta": { "type": "array", "items": { @@ -97669,8 +109723,6 @@ { "type": "object", "required": [ - "end", - "start", "type", "value" ], @@ -97681,16 +109733,6 @@ "TagDeclarator" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -97704,6 +109746,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -97844,6 +109896,45 @@ } } }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketch" + ] + }, + "value": { + "$ref": "#/components/schemas/Sketch" + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketches" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Sketch" + } + } + } + }, { "description": "An solid is a collection of extrude surfaces.", "type": "object", @@ -97976,7 +110067,6 @@ "type": "object", "required": [ "__meta", - "expression", "memory", "type" ], @@ -97987,9 +110077,6 @@ "Function" ] }, - "expression": { - "$ref": "#/components/schemas/FunctionExpression" - }, "memory": { "$ref": "#/components/schemas/ProgramMemory" }, @@ -98000,6 +110087,56 @@ } } } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Module" + ] + }, + "value": { + "$ref": "#/components/schemas/ModuleId" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "KclNone" + ] + }, + "value": { + "$ref": "#/components/schemas/KclNone" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } } ] }, @@ -98027,8 +110164,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "TagEngineInfo": { "description": "Engine information for a tag.", @@ -98303,7 +110440,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -98533,6 +110670,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -98561,6 +110699,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -98605,21 +110747,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -98633,6 +110763,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -99306,2069 +111446,6 @@ } ] }, - "FunctionExpression": { - "type": "object", - "required": [ - "body", - "end", - "params", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "params": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Parameter" - } - }, - "body": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Parameter": { - "description": "Parameter of a KCL function.", - "type": "object", - "required": [ - "identifier", - "optional" - ], - "properties": { - "identifier": { - "description": "The parameter's label or name.", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ] - }, - "optional": { - "description": "Is the parameter optional?", - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Identifier": { - "type": "object", - "required": [ - "end", - "name", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Program": { - "description": "A KCL program top level, or function body.", - "type": "object", - "required": [ - "body", - "end", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "body": { - "type": "array", - "items": { - "$ref": "#/components/schemas/BodyItem" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "BodyItem": { - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "items", - "path", - "raw_path", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ImportStatement" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ImportItem" - } - }, - "path": { - "type": "string" - }, - "raw_path": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "expression", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ExpressionStatement" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "expression": { - "$ref": "#/components/schemas/Expr" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "declarations", - "end", - "kind", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "VariableDeclaration" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "declarations": { - "type": "array", - "items": { - "$ref": "#/components/schemas/VariableDeclarator" - } - }, - "visibility": { - "$ref": "#/components/schemas/ItemVisibility" - }, - "kind": { - "$ref": "#/components/schemas/VariableKind" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ReturnStatement" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "argument": { - "$ref": "#/components/schemas/Expr" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "ImportItem": { - "type": "object", - "required": [ - "end", - "name", - "start" - ], - "properties": { - "name": { - "description": "Name of the item to import.", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ] - }, - "alias": { - "description": "Rename the item using an identifier after \"as\".", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ], - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Expr": { - "description": "An expression can be evaluated to yield a single KCL value.", - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/LiteralValue" - }, - "raw": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TagDeclarator" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/BinaryOperator" - }, - "left": { - "$ref": "#/components/schemas/BinaryPart" - }, - "right": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "params", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "FunctionExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "params": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Parameter" - } - }, - "body": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "callee": { - "$ref": "#/components/schemas/Identifier" - }, - "arguments": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "optional": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "body": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeSubstitution" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "elements", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "elements": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "endElement", - "endInclusive", - "start", - "startElement", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayRangeExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "startElement": { - "$ref": "#/components/schemas/Expr" - }, - "endElement": { - "$ref": "#/components/schemas/Expr" - }, - "endInclusive": { - "description": "Is the `end_element` included in the range?", - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "properties", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ObjectExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "properties": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ObjectProperty" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "object": { - "$ref": "#/components/schemas/MemberObject" - }, - "property": { - "$ref": "#/components/schemas/LiteralIdentifier" - }, - "computed": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/UnaryOperator" - }, - "argument": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "cond": { - "$ref": "#/components/schemas/Expr" - }, - "then_val": { - "$ref": "#/components/schemas/Program" - }, - "else_ifs": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ElseIf" - } - }, - "final_else": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "description": "KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application).", - "type": "object", - "required": [ - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "None" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - } - ] - }, - "LiteralValue": { - "anyOf": [ - { - "type": "integer", - "format": "int64" - }, - { - "type": "number", - "format": "double" - }, - { - "type": "string" - }, - { - "type": "boolean" - } - ] - }, - "BinaryOperator": { - "oneOf": [ - { - "description": "Add two numbers.", - "type": "string", - "enum": [ - "+" - ] - }, - { - "description": "Subtract two numbers.", - "type": "string", - "enum": [ - "-" - ] - }, - { - "description": "Multiply two numbers.", - "type": "string", - "enum": [ - "*" - ] - }, - { - "description": "Divide two numbers.", - "type": "string", - "enum": [ - "/" - ] - }, - { - "description": "Modulo two numbers.", - "type": "string", - "enum": [ - "%" - ] - }, - { - "description": "Raise a number to a power.", - "type": "string", - "enum": [ - "^" - ] - }, - { - "description": "Are two numbers equal?", - "type": "string", - "enum": [ - "==" - ] - }, - { - "description": "Are two numbers not equal?", - "type": "string", - "enum": [ - "!=" - ] - }, - { - "description": "Is left greater than right", - "type": "string", - "enum": [ - ">" - ] - }, - { - "description": "Is left greater than or equal to right", - "type": "string", - "enum": [ - ">=" - ] - }, - { - "description": "Is left less than right", - "type": "string", - "enum": [ - "<" - ] - }, - { - "description": "Is left less than or equal to right", - "type": "string", - "enum": [ - "<=" - ] - } - ] - }, - "BinaryPart": { - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/LiteralValue" - }, - "raw": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/BinaryOperator" - }, - "left": { - "$ref": "#/components/schemas/BinaryPart" - }, - "right": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "callee": { - "$ref": "#/components/schemas/Identifier" - }, - "arguments": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "optional": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/UnaryOperator" - }, - "argument": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "object": { - "$ref": "#/components/schemas/MemberObject" - }, - "property": { - "$ref": "#/components/schemas/LiteralIdentifier" - }, - "computed": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "cond": { - "$ref": "#/components/schemas/Expr" - }, - "then_val": { - "$ref": "#/components/schemas/Program" - }, - "else_ifs": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ElseIf" - } - }, - "final_else": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "UnaryOperator": { - "oneOf": [ - { - "description": "Negate a number.", - "type": "string", - "enum": [ - "-" - ] - }, - { - "description": "Negate a boolean.", - "type": "string", - "enum": [ - "!" - ] - } - ] - }, - "MemberObject": { - "oneOf": [ - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "object": { - "$ref": "#/components/schemas/MemberObject" - }, - "property": { - "$ref": "#/components/schemas/LiteralIdentifier" - }, - "computed": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "LiteralIdentifier": { - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/LiteralValue" - }, - "raw": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "ElseIf": { - "type": "object", - "required": [ - "cond", - "end", - "start", - "then_val" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "cond": { - "$ref": "#/components/schemas/Expr" - }, - "then_val": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "NonCodeMeta": { - "type": "object", - "required": [ - "nonCodeNodes", - "start" - ], - "properties": { - "nonCodeNodes": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NonCodeNode" - } - } - }, - "start": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NonCodeNode" - } - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "NonCodeNode": { - "type": "object", - "required": [ - "end", - "start", - "value" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/NonCodeValue" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "NonCodeValue": { - "oneOf": [ - { - "description": "A shebang. This is a special type of comment that is at the top of the file. It looks like this: ```python,no_run #!/usr/bin/env python ```", - "type": "object", - "required": [ - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "shebang" - ] - }, - "value": { - "type": "string" - } - } - }, - { - "description": "An inline comment. Here are examples: `1 + 1 // This is an inline comment`. `1 + 1 /* Here's another */`.", - "type": "object", - "required": [ - "style", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "inlineComment" - ] - }, - "value": { - "type": "string" - }, - "style": { - "$ref": "#/components/schemas/CommentStyle" - } - } - }, - { - "description": "A block comment. An example of this is the following: ```python,no_run /* This is a block comment */ 1 + 1 ``` Now this is important. The block comment is attached to the next line. This is always the case. Also the block comment doesn't have a new line above it. If it did it would be a `NewLineBlockComment`.", - "type": "object", - "required": [ - "style", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "blockComment" - ] - }, - "value": { - "type": "string" - }, - "style": { - "$ref": "#/components/schemas/CommentStyle" - } - } - }, - { - "description": "A block comment that has a new line above it. The user explicitly added a new line above the block comment.", - "type": "object", - "required": [ - "style", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "newLineBlockComment" - ] - }, - "value": { - "type": "string" - }, - "style": { - "$ref": "#/components/schemas/CommentStyle" - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "newLine" - ] - } - } - } - ] - }, - "CommentStyle": { - "oneOf": [ - { - "description": "Like // foo", - "type": "string", - "enum": [ - "line" - ] - }, - { - "description": "Like /* foo */", - "type": "string", - "enum": [ - "block" - ] - } - ] - }, - "ObjectProperty": { - "type": "object", - "required": [ - "end", - "key", - "start", - "value" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "key": { - "$ref": "#/components/schemas/Identifier" - }, - "value": { - "$ref": "#/components/schemas/Expr" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "VariableDeclarator": { - "type": "object", - "required": [ - "end", - "id", - "init", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "id": { - "description": "The identifier of the variable.", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ] - }, - "init": { - "description": "The value of the variable.", - "allOf": [ - { - "$ref": "#/components/schemas/Expr" - } - ] - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "ItemVisibility": { - "type": "string", - "enum": [ - "default", - "export" - ] - }, - "VariableKind": { - "oneOf": [ - { - "description": "Declare a named constant.", - "type": "string", - "enum": [ - "const" - ] - }, - { - "description": "Declare a function.", - "type": "string", - "enum": [ - "fn" - ] - } - ] - }, "ProgramMemory": { "type": "object", "required": [ @@ -101383,7 +111460,9 @@ } }, "currentEnv": { - "$ref": "#/components/schemas/EnvironmentRef" + "type": "integer", + "format": "uint", + "minimum": 0.0 }, "return": { "allOf": [ @@ -101408,30 +111487,46 @@ } }, "parent": { - "allOf": [ - { - "$ref": "#/components/schemas/EnvironmentRef" - } - ], + "type": "integer", + "format": "uint", + "minimum": 0.0, "nullable": true } } }, - "EnvironmentRef": { - "description": "An index pointing to an environment.", + "ModuleId": { + "description": "Identifier of a source file. Uses a u32 to keep the size small.", "type": "integer", - "format": "uint", + "format": "uint32", "minimum": 0.0 + }, + "KclNone": { + "description": "KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application).", + "type": "object", + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + } + } } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "r = 10 // radius\nfn drawCircle = (id) => {\n return startSketchOn(\"XY\")\n |> circle({ center: [id * 2 * r, 0], radius: r }, %)\n}\n\n// Call `drawCircle`, passing in each element of the array.\n// The outputs from each `drawCircle` form a new array,\n// which is the return value from `map`.\ncircles = map([1..3], drawCircle)", - "r = 10 // radius\n// Call `map`, using an anonymous function instead of a named one.\ncircles = map([1..3], (id) => {\n return startSketchOn(\"XY\")\n |> circle({ center: [id * 2 * r, 0], radius: r }, %)\n})" + "r = 10 // radius\nfn drawCircle(id) {\n return startSketchOn(\"XY\")\n |> circle({ center = [id * 2 * r, 0], radius = r }, %)\n}\n\n// Call `drawCircle`, passing in each element of the array.\n// The outputs from each `drawCircle` form a new array,\n// which is the return value from `map`.\ncircles = map([1..3], drawCircle)", + "r = 10 // radius\n// Call `map`, using an anonymous function instead of a named one.\ncircles = map([1..3], fn(id) {\n return startSketchOn(\"XY\")\n |> circle({ center = [id * 2 * r, 0], radius = r }, %)\n})" ] }, { @@ -101441,6 +111536,7 @@ "tags": [ "math" ], + "keywordArguments": false, "args": [ { "name": "args", @@ -101454,7 +111550,8 @@ "format": "double" } }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -101466,12 +111563,13 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> angledLine({\n angle: 70,\n length: max(15, 31, 4, 13, 22)\n }, %)\n |> line([20, 0], %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" + "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> angledLine({\n angle = 70,\n length = max(15, 31, 4, 13, 22)\n }, %)\n |> line([20, 0], %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" ] }, { @@ -101481,6 +111579,7 @@ "tags": [ "math" ], + "keywordArguments": false, "args": [ { "name": "args", @@ -101494,7 +111593,8 @@ "format": "double" } }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -101506,12 +111606,13 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> angledLine({\n angle: 70,\n length: min(15, 31, 4, 13, 22)\n }, %)\n |> line([20, 0], %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" + "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> angledLine({\n angle = 70,\n length = min(15, 31, 4, 13, 22)\n }, %)\n |> line([20, 0], %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" ] }, { @@ -101519,6 +111620,7 @@ "summary": "Mirror a sketch.", "description": "Only works on unclosed sketches for now.\n\nMirror occurs around a local sketch axis rather than a global axis.", "tags": [], + "keywordArguments": false, "args": [ { "name": "data", @@ -101951,7 +112053,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -102181,6 +112283,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -102209,6 +112312,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -102253,21 +112360,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -102281,6 +112376,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -102314,8 +112419,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -102521,7 +112626,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch_set", @@ -103024,7 +113130,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -103254,6 +113360,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -103282,6 +113389,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -103326,21 +113437,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -103354,6 +113453,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -103387,8 +113496,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -104030,7 +114139,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -104334,7 +114444,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -104564,6 +114674,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -104592,6 +114703,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -104636,21 +114751,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -104664,6 +114767,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -104697,8 +114810,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -105349,15 +115462,16 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "// Mirror an un-closed sketch across the Y axis.\nsketch001 = startSketchOn('XZ')\n |> startProfileAt([0, 10], %)\n |> line([15, 0], %)\n |> line([-7, -3], %)\n |> line([9, -1], %)\n |> line([-8, -5], %)\n |> line([9, -3], %)\n |> line([-8, -3], %)\n |> line([9, -1], %)\n |> line([-19, -0], %)\n |> mirror2d({ axis: 'Y' }, %)\n\nexample = extrude(10, sketch001)", - "// Mirror a un-closed sketch across the Y axis.\nsketch001 = startSketchOn('XZ')\n |> startProfileAt([0, 8.5], %)\n |> line([20, -8.5], %)\n |> line([-20, -8.5], %)\n |> mirror2d({ axis: 'Y' }, %)\n\nexample = extrude(10, sketch001)", - "// Mirror a un-closed sketch across an edge.\nhelper001 = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([0, 10], %, $edge001)\n\nsketch001 = startSketchOn('XZ')\n |> startProfileAt([0, 8.5], %)\n |> line([20, -8.5], %)\n |> line([-20, -8.5], %)\n |> mirror2d({ axis: edge001 }, %)\n\nexample = extrude(10, sketch001)", - "// Mirror an un-closed sketch across a custom axis.\nsketch001 = startSketchOn('XZ')\n |> startProfileAt([0, 8.5], %)\n |> line([20, -8.5], %)\n |> line([-20, -8.5], %)\n |> mirror2d({\n axis: {\n custom: { axis: [0.0, 1.0], origin: [0.0, 0.0] }\n }\n }, %)\n\nexample = extrude(10, sketch001)" + "// Mirror an un-closed sketch across the Y axis.\nsketch001 = startSketchOn('XZ')\n |> startProfileAt([0, 10], %)\n |> line([15, 0], %)\n |> line([-7, -3], %)\n |> line([9, -1], %)\n |> line([-8, -5], %)\n |> line([9, -3], %)\n |> line([-8, -3], %)\n |> line([9, -1], %)\n |> line([-19, -0], %)\n |> mirror2d({ axis = 'Y' }, %)\n\nexample = extrude(10, sketch001)", + "// Mirror a un-closed sketch across the Y axis.\nsketch001 = startSketchOn('XZ')\n |> startProfileAt([0, 8.5], %)\n |> line([20, -8.5], %)\n |> line([-20, -8.5], %)\n |> mirror2d({ axis = 'Y' }, %)\n\nexample = extrude(10, sketch001)", + "// Mirror a un-closed sketch across an edge.\nhelper001 = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([0, 10], %, $edge001)\n\nsketch001 = startSketchOn('XZ')\n |> startProfileAt([0, 8.5], %)\n |> line([20, -8.5], %)\n |> line([-20, -8.5], %)\n |> mirror2d({ axis = edge001 }, %)\n\nexample = extrude(10, sketch001)", + "// Mirror an un-closed sketch across a custom axis.\nsketch001 = startSketchOn('XZ')\n |> startProfileAt([0, 8.5], %)\n |> line([20, -8.5], %)\n |> line([-20, -8.5], %)\n |> mirror2d({\n axis = {\n custom = {\n axis = [0.0, 1.0],\n origin = [0.0, 0.0]\n }\n }\n }, %)\n\nexample = extrude(10, sketch001)" ] }, { @@ -105367,6 +115481,7 @@ "tags": [ "units" ], + "keywordArguments": false, "args": [], "returnValue": { "name": "", @@ -105377,7 +115492,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -105390,6 +115506,7 @@ "summary": "Offset a plane by a distance along its normal.", "description": "For example, if you offset the 'XZ' plane by 10, the new plane will be parallel to the 'XZ' plane and 10 units away from it.", "tags": [], + "keywordArguments": false, "args": [ { "name": "std_plane", @@ -105443,7 +115560,8 @@ } ] }, - "required": true + "required": true, + "labelRequired": true }, { "name": "offset", @@ -105454,114 +115572,96 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { "name": "", - "type": "PlaneData", + "type": "Plane", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "PlaneData", - "description": "Data for a plane.", - "oneOf": [ - { - "description": "The XY plane.", - "type": "string", - "enum": [ - "XY" - ] - }, - { - "description": "The opposite side of the XY plane.", - "type": "string", - "enum": [ - "-XY" - ] - }, - { - "description": "The XZ plane.", - "type": "string", - "enum": [ - "XZ" - ] - }, - { - "description": "The opposite side of the XZ plane.", - "type": "string", - "enum": [ - "-XZ" - ] - }, - { - "description": "The YZ plane.", - "type": "string", - "enum": [ - "YZ" - ] - }, - { - "description": "The opposite side of the YZ plane.", - "type": "string", - "enum": [ - "-YZ" - ] - }, - { - "description": "A defined plane.", - "type": "object", - "required": [ - "plane" - ], - "properties": { - "plane": { - "type": "object", - "required": [ - "origin", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane’s X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane’s Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "zAxis": { - "description": "The z-axis (normal).", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - } - }, - "additionalProperties": false - } + "title": "Plane", + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "value", + "xAxis", + "yAxis", + "zAxis" ], + "properties": { + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + }, "definitions": { + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, "Point3d": { "type": "object", "required": [ @@ -105583,18 +115683,47 @@ "format": "double" } } + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "// Loft a square and a circle on the `XY` plane using offset.\nsquareSketch = startSketchOn('XY')\n |> startProfileAt([-100, 200], %)\n |> line([200, 0], %)\n |> line([0, -200], %)\n |> line([-200, 0], %)\n |> lineTo([profileStartX(%), profileStartY(%)], %)\n |> close(%)\n\ncircleSketch = startSketchOn(offsetPlane('XY', 150))\n |> circle({ center: [0, 100], radius: 50 }, %)\n\nloft([squareSketch, circleSketch])", - "// Loft a square and a circle on the `XZ` plane using offset.\nsquareSketch = startSketchOn('XZ')\n |> startProfileAt([-100, 200], %)\n |> line([200, 0], %)\n |> line([0, -200], %)\n |> line([-200, 0], %)\n |> lineTo([profileStartX(%), profileStartY(%)], %)\n |> close(%)\n\ncircleSketch = startSketchOn(offsetPlane('XZ', 150))\n |> circle({ center: [0, 100], radius: 50 }, %)\n\nloft([squareSketch, circleSketch])", - "// Loft a square and a circle on the `YZ` plane using offset.\nsquareSketch = startSketchOn('YZ')\n |> startProfileAt([-100, 200], %)\n |> line([200, 0], %)\n |> line([0, -200], %)\n |> line([-200, 0], %)\n |> lineTo([profileStartX(%), profileStartY(%)], %)\n |> close(%)\n\ncircleSketch = startSketchOn(offsetPlane('YZ', 150))\n |> circle({ center: [0, 100], radius: 50 }, %)\n\nloft([squareSketch, circleSketch])", - "// Loft a square and a circle on the `-XZ` plane using offset.\nsquareSketch = startSketchOn('-XZ')\n |> startProfileAt([-100, 200], %)\n |> line([200, 0], %)\n |> line([0, -200], %)\n |> line([-200, 0], %)\n |> lineTo([profileStartX(%), profileStartY(%)], %)\n |> close(%)\n\ncircleSketch = startSketchOn(offsetPlane('-XZ', -150))\n |> circle({ center: [0, 100], radius: 50 }, %)\n\nloft([squareSketch, circleSketch])" + "// Loft a square and a circle on the `XY` plane using offset.\nsquareSketch = startSketchOn('XY')\n |> startProfileAt([-100, 200], %)\n |> line([200, 0], %)\n |> line([0, -200], %)\n |> line([-200, 0], %)\n |> lineTo([profileStartX(%), profileStartY(%)], %)\n |> close(%)\n\ncircleSketch = startSketchOn(offsetPlane('XY', 150))\n |> circle({ center = [0, 100], radius = 50 }, %)\n\nloft([squareSketch, circleSketch])", + "// Loft a square and a circle on the `XZ` plane using offset.\nsquareSketch = startSketchOn('XZ')\n |> startProfileAt([-100, 200], %)\n |> line([200, 0], %)\n |> line([0, -200], %)\n |> line([-200, 0], %)\n |> lineTo([profileStartX(%), profileStartY(%)], %)\n |> close(%)\n\ncircleSketch = startSketchOn(offsetPlane('XZ', 150))\n |> circle({ center = [0, 100], radius = 50 }, %)\n\nloft([squareSketch, circleSketch])", + "// Loft a square and a circle on the `YZ` plane using offset.\nsquareSketch = startSketchOn('YZ')\n |> startProfileAt([-100, 200], %)\n |> line([200, 0], %)\n |> line([0, -200], %)\n |> line([-200, 0], %)\n |> lineTo([profileStartX(%), profileStartY(%)], %)\n |> close(%)\n\ncircleSketch = startSketchOn(offsetPlane('YZ', 150))\n |> circle({ center = [0, 100], radius = 50 }, %)\n\nloft([squareSketch, circleSketch])", + "// Loft a square and a circle on the `-XZ` plane using offset.\nsquareSketch = startSketchOn('-XZ')\n |> startProfileAt([-100, 200], %)\n |> line([200, 0], %)\n |> line([0, -200], %)\n |> line([-200, 0], %)\n |> lineTo([profileStartX(%), profileStartY(%)], %)\n |> close(%)\n\ncircleSketch = startSketchOn(offsetPlane('-XZ', -150))\n |> circle({ center = [0, 100], radius = 50 }, %)\n\nloft([squareSketch, circleSketch])", + "// A circle on the XY plane\nstartSketchOn(\"XY\")\n |> startProfileAt([0, 0], %)\n |> circle({ radius = 10, center = [0, 0] }, %)\n\n// Triangle on the plane 4 units above\nstartSketchOn(offsetPlane(\"XY\", 4))\n |> startProfileAt([0, 0], %)\n |> line([10, 0], %)\n |> line([0, 10], %)\n |> close(%)" ] }, { @@ -105602,6 +115731,7 @@ "summary": "Repeat a 2-dimensional sketch some number of times along a partial or", "description": "complete circle some specified number of times. Each object may additionally be rotated along the circle, ensuring orentation of the solid with respect to the center of the circle is maintained.", "tags": [], + "keywordArguments": false, "args": [ { "name": "data", @@ -105620,11 +115750,9 @@ "properties": { "instances": { "description": "The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect.", - "allOf": [ - { - "$ref": "#/components/schemas/Uint" - } - ] + "type": "integer", + "format": "uint32", + "minimum": 0.0 }, "center": { "description": "The center about which to make the pattern. This is a 2D vector.", @@ -105645,16 +115773,10 @@ "description": "Whether or not to rotate the duplicates as they are copied.", "type": "boolean" } - }, - "definitions": { - "Uint": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 - } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch_set", @@ -105748,11 +115870,6 @@ } ], "definitions": { - "Uint": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 - }, "Path": { "description": "A path.", "oneOf": [ @@ -105988,7 +116105,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -106218,6 +116335,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -106246,6 +116364,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -106290,21 +116412,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -106318,6 +116428,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -106351,8 +116471,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -107058,7 +117178,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -107362,7 +117483,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -107592,6 +117713,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -107620,6 +117742,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -107664,21 +117790,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -107692,6 +117806,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -107725,8 +117849,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -108377,12 +118501,13 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([.5, 25], %)\n |> line([0, 5], %)\n |> line([-1, 0], %)\n |> line([0, -5], %)\n |> close(%)\n |> patternCircular2d({\n center: [0, 0],\n instances: 13,\n arcDegrees: 360,\n rotateDuplicates: true\n }, %)\n\nexample = extrude(1, exampleSketch)" + "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([.5, 25], %)\n |> line([0, 5], %)\n |> line([-1, 0], %)\n |> line([0, -5], %)\n |> close(%)\n |> patternCircular2d({\n center = [0, 0],\n instances = 13,\n arcDegrees = 360,\n rotateDuplicates = true\n }, %)\n\nexample = extrude(1, exampleSketch)" ] }, { @@ -108390,6 +118515,7 @@ "summary": "Repeat a 3-dimensional solid some number of times along a partial or", "description": "complete circle some specified number of times. Each object may additionally be rotated along the circle, ensuring orentation of the solid with respect to the center of the circle is maintained.", "tags": [], + "keywordArguments": false, "args": [ { "name": "data", @@ -108409,11 +118535,9 @@ "properties": { "instances": { "description": "The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect.", - "allOf": [ - { - "$ref": "#/components/schemas/Uint" - } - ] + "type": "integer", + "format": "uint32", + "minimum": 0.0 }, "axis": { "description": "The axis around which to make the pattern. This is a 3D vector.", @@ -108444,16 +118568,10 @@ "description": "Whether or not to rotate the duplicates as they are copied.", "type": "boolean" } - }, - "definitions": { - "Uint": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 - } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "solid_set", @@ -108556,11 +118674,6 @@ } ], "definitions": { - "Uint": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 - }, "ExtrudeSurface": { "description": "An extrude surface.", "oneOf": [ @@ -108749,21 +118862,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -108777,6 +118878,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -108787,8 +118898,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "Sketch": { "description": "A sketch is a collection of paths.", @@ -109080,7 +119191,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -109310,6 +119421,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -109338,6 +119450,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -109866,7 +119982,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -110132,21 +120249,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -110160,6 +120265,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -110170,8 +120285,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "Sketch": { "description": "A sketch is a collection of paths.", @@ -110463,7 +120578,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -110693,6 +120808,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -110721,6 +120837,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -111185,12 +121305,13 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn('XZ')\n |> circle({ center: [0, 0], radius: 1 }, %)\n\nexample = extrude(-5, exampleSketch)\n |> patternCircular3d({\n axis: [1, -1, 0],\n center: [10, -20, 0],\n instances: 11,\n arcDegrees: 360,\n rotateDuplicates: true\n }, %)" + "exampleSketch = startSketchOn('XZ')\n |> circle({ center = [0, 0], radius = 1 }, %)\n\nexample = extrude(-5, exampleSketch)\n |> patternCircular3d({\n axis = [1, -1, 0],\n center = [10, -20, 0],\n instances = 11,\n arcDegrees = 360,\n rotateDuplicates = true\n }, %)" ] }, { @@ -111198,6 +121319,7 @@ "summary": "Repeat a 2-dimensional sketch along some dimension, with a dynamic amount", "description": "of distance between each repetition, some specified number of times.", "tags": [], + "keywordArguments": false, "args": [ { "name": "data", @@ -111215,11 +121337,9 @@ "properties": { "instances": { "description": "The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect.", - "allOf": [ - { - "$ref": "#/components/schemas/Uint" - } - ] + "type": "integer", + "format": "uint32", + "minimum": 0.0 }, "distance": { "description": "The distance between each repetition. This can also be referred to as spacing.", @@ -111236,16 +121356,10 @@ "maxItems": 2, "minItems": 2 } - }, - "definitions": { - "Uint": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 - } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch_set", @@ -111339,11 +121453,6 @@ } ], "definitions": { - "Uint": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 - }, "Path": { "description": "A path.", "oneOf": [ @@ -111579,7 +121688,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -111809,6 +121918,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -111837,6 +121947,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -111881,21 +121995,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -111909,6 +122011,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -111942,8 +122054,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -112649,7 +122761,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -112953,7 +123066,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -113183,6 +123296,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -113211,6 +123325,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -113255,21 +123373,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -113283,6 +123389,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -113316,8 +123432,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -113968,12 +124084,13 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn('XZ')\n |> circle({ center: [0, 0], radius: 1 }, %)\n |> patternLinear2d({\n axis: [1, 0],\n instances: 7,\n distance: 4\n }, %)\n\nexample = extrude(1, exampleSketch)" + "exampleSketch = startSketchOn('XZ')\n |> circle({ center = [0, 0], radius = 1 }, %)\n |> patternLinear2d({\n axis = [1, 0],\n instances = 7,\n distance = 4\n }, %)\n\nexample = extrude(1, exampleSketch)" ] }, { @@ -113981,6 +124098,7 @@ "summary": "Repeat a 3-dimensional solid along a linear path, with a dynamic amount", "description": "of distance between each repetition, some specified number of times.", "tags": [], + "keywordArguments": false, "args": [ { "name": "data", @@ -113998,11 +124116,9 @@ "properties": { "instances": { "description": "The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect.", - "allOf": [ - { - "$ref": "#/components/schemas/Uint" - } - ] + "type": "integer", + "format": "uint32", + "minimum": 0.0 }, "distance": { "description": "The distance between each repetition. This can also be referred to as spacing.", @@ -114019,16 +124135,10 @@ "maxItems": 3, "minItems": 3 } - }, - "definitions": { - "Uint": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 - } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "solid_set", @@ -114131,11 +124241,6 @@ } ], "definitions": { - "Uint": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 - }, "ExtrudeSurface": { "description": "An extrude surface.", "oneOf": [ @@ -114324,21 +124429,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -114352,6 +124445,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -114362,8 +124465,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "Sketch": { "description": "A sketch is a collection of paths.", @@ -114655,7 +124758,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -114885,6 +124988,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -114913,6 +125017,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -115441,7 +125549,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -115707,21 +125816,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -115735,6 +125832,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -115745,8 +125852,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "Sketch": { "description": "A sketch is a collection of paths.", @@ -116038,7 +126145,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -116268,6 +126375,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -116296,6 +126404,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -116760,12 +126872,13 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([0, 2], %)\n |> line([3, 1], %)\n |> line([0, -4], %)\n |> close(%)\n\nexample = extrude(1, exampleSketch)\n |> patternLinear3d({\n axis: [1, 0, 1],\n instances: 7,\n distance: 6\n }, %)" + "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([0, 2], %)\n |> line([3, 1], %)\n |> line([0, -4], %)\n |> close(%)\n\nexample = extrude(1, exampleSketch)\n |> patternLinear3d({\n axis = [1, 0, 1],\n instances = 7,\n distance = 6\n }, %)" ] }, { @@ -116773,10 +126886,11 @@ "summary": "Repeat a 3-dimensional solid, changing it each time.", "description": "Replicates the 3D solid, applying a transformation function to each replica. Transformation function could alter rotation, scale, visibility, position, etc.\n\nThe `patternTransform` call itself takes a number for how many total instances of the shape should be. For example, if you use a circle with `patternTransform(4, transform)` then there will be 4 circles: the original, and 3 created by replicating the original and calling the transform function on each.\n\nThe transform function takes a single parameter: an integer representing which number replication the transform is for. E.g. the first replica to be transformed will be passed the argument `1`. This simplifies your math: the transform function can rely on id `0` being the original instance passed into the `patternTransform`. See the examples.\n\nThe transform function returns a transform object. All properties of the object are optional, they each default to \"no change\". So the overall transform object defaults to \"no change\" too. Its properties are:\n\n - `translate` (3D point)\n\n Translates the replica, moving its position in space.\n\n - `replicate` (bool)\n\n If false, this ID will not actually copy the object. It'll be skipped.\n\n - `scale` (3D point)\n\n Stretches the object, multiplying its width in the given dimension by the point's component in that direction.\n\n - `rotation` (object, with the following properties)\n\n - `rotation.axis` (a 3D point, defaults to the Z axis)\n\n - `rotation.angle` (number of degrees)\n\n - `rotation.origin` (either \"local\" i.e. rotate around its own center, \"global\" i.e. rotate around the scene's center, or a 3D point, defaults to \"local\")", "tags": [], + "keywordArguments": false, "args": [ { "name": "total_instances", - "type": "u32", + "type": "integer", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "uint32", @@ -116784,7 +126898,8 @@ "format": "uint32", "minimum": 0.0 }, - "required": true + "required": true, + "labelRequired": true }, { "name": "transform_function", @@ -116794,7 +126909,8 @@ "title": "FunctionParam", "type": "null" }, - "required": true + "required": true, + "labelRequired": true }, { "name": "solid_set", @@ -117085,21 +127201,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -117113,6 +127217,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -117123,8 +127237,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "Sketch": { "description": "A sketch is a collection of paths.", @@ -117416,7 +127530,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -117646,6 +127760,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -117674,6 +127789,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -118202,7 +128321,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -118468,21 +128588,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -118496,6 +128604,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -118506,8 +128624,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "Sketch": { "description": "A sketch is a collection of paths.", @@ -118799,7 +128917,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -119029,6 +129147,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -119057,6 +129176,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -119521,16 +129644,2781 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "// Each instance will be shifted along the X axis.\nfn transform = (id) => {\n return { translate: [4 * id, 0, 0] }\n}\n\n// Sketch 4 cylinders.\nsketch001 = startSketchOn('XZ')\n |> circle({ center: [0, 0], radius: 2 }, %)\n |> extrude(5, %)\n |> patternTransform(4, transform, %)", - "// Each instance will be shifted along the X axis,\n// with a gap between the original (at x = 0) and the first replica\n// (at x = 8). This is because `id` starts at 1.\nfn transform = (id) => {\n return { translate: [4 * (1 + id), 0, 0] }\n}\n\nsketch001 = startSketchOn('XZ')\n |> circle({ center: [0, 0], radius: 2 }, %)\n |> extrude(5, %)\n |> patternTransform(4, transform, %)", - "fn cube = (length, center) => {\n l = length / 2\n x = center[0]\n y = center[1]\n p0 = [-l + x, -l + y]\n p1 = [-l + x, l + y]\n p2 = [l + x, l + y]\n p3 = [l + x, -l + y]\n\n return startSketchAt(p0)\n |> lineTo(p1, %)\n |> lineTo(p2, %)\n |> lineTo(p3, %)\n |> lineTo(p0, %)\n |> close(%)\n |> extrude(length, %)\n}\n\nwidth = 20\nfn transform = (i) => {\n return {\n // Move down each time.\n translate: [0, 0, -i * width],\n // Make the cube longer, wider and flatter each time.\n scale: [pow(1.1, i), pow(1.1, i), pow(0.9, i)],\n // Turn by 15 degrees each time.\n rotation: { angle: 15 * i, origin: \"local\" }\n}\n}\n\nmyCubes = cube(width, [100, 0])\n |> patternTransform(25, transform, %)", - "fn cube = (length, center) => {\n l = length / 2\n x = center[0]\n y = center[1]\n p0 = [-l + x, -l + y]\n p1 = [-l + x, l + y]\n p2 = [l + x, l + y]\n p3 = [l + x, -l + y]\n\n return startSketchAt(p0)\n |> lineTo(p1, %)\n |> lineTo(p2, %)\n |> lineTo(p3, %)\n |> lineTo(p0, %)\n |> close(%)\n |> extrude(length, %)\n}\n\nwidth = 20\nfn transform = (i) => {\n return {\n translate: [0, 0, -i * width],\n rotation: {\n angle: 90 * i,\n // Rotate around the overall scene's origin.\n origin: \"global\"\n }\n}\n}\nmyCubes = cube(width, [100, 100])\n |> patternTransform(4, transform, %)", - "// Parameters\nr = 50 // base radius\nh = 10 // layer height\nt = 0.005 // taper factor [0-1)\n// Defines how to modify each layer of the vase.\n// Each replica is shifted up the Z axis, and has a smoothly-varying radius\nfn transform = (replicaId) => {\n scale = r * abs(1 - (t * replicaId)) * (5 + cos(replicaId / 8))\n return {\n translate: [0, 0, replicaId * 10],\n scale: [scale, scale, 0]\n}\n}\n// Each layer is just a pretty thin cylinder.\nfn layer = () => {\n return startSketchOn(\"XY\")\n // or some other plane idk\n |> circle({ center: [0, 0], radius: 1 }, %, $tag1)\n |> extrude(h, %)\n}\n// The vase is 100 layers tall.\n// The 100 layers are replica of each other, with a slight transformation applied to each.\nvase = layer()\n |> patternTransform(100, transform, %)" + "// Each instance will be shifted along the X axis.\nfn transform(id) {\n return { translate = [4 * id, 0, 0] }\n}\n\n// Sketch 4 cylinders.\nsketch001 = startSketchOn('XZ')\n |> circle({ center = [0, 0], radius = 2 }, %)\n |> extrude(5, %)\n |> patternTransform(4, transform, %)", + "// Each instance will be shifted along the X axis,\n// with a gap between the original (at x = 0) and the first replica\n// (at x = 8). This is because `id` starts at 1.\nfn transform(id) {\n return { translate = [4 * (1 + id), 0, 0] }\n}\n\nsketch001 = startSketchOn('XZ')\n |> circle({ center = [0, 0], radius = 2 }, %)\n |> extrude(5, %)\n |> patternTransform(4, transform, %)", + "fn cube(length, center) {\n l = length / 2\n x = center[0]\n y = center[1]\n p0 = [-l + x, -l + y]\n p1 = [-l + x, l + y]\n p2 = [l + x, l + y]\n p3 = [l + x, -l + y]\n\n return startSketchOn('XY')\n |> startProfileAt(p0, %)\n |> lineTo(p1, %)\n |> lineTo(p2, %)\n |> lineTo(p3, %)\n |> lineTo(p0, %)\n |> close(%)\n |> extrude(length, %)\n}\n\nwidth = 20\nfn transform(i) {\n return {\n // Move down each time.\n translate = [0, 0, -i * width],\n // Make the cube longer, wider and flatter each time.\n scale = [pow(1.1, i), pow(1.1, i), pow(0.9, i)],\n // Turn by 15 degrees each time.\n rotation = { angle = 15 * i, origin = \"local\" }\n }\n}\n\nmyCubes = cube(width, [100, 0])\n |> patternTransform(25, transform, %)", + "fn cube(length, center) {\n l = length / 2\n x = center[0]\n y = center[1]\n p0 = [-l + x, -l + y]\n p1 = [-l + x, l + y]\n p2 = [l + x, l + y]\n p3 = [l + x, -l + y]\n\n return startSketchOn('XY')\n |> startProfileAt(p0, %)\n |> lineTo(p1, %)\n |> lineTo(p2, %)\n |> lineTo(p3, %)\n |> lineTo(p0, %)\n |> close(%)\n |> extrude(length, %)\n}\n\nwidth = 20\nfn transform(i) {\n return {\n translate = [0, 0, -i * width],\n rotation = {\n angle = 90 * i,\n // Rotate around the overall scene's origin.\n origin = \"global\"\n }\n }\n}\nmyCubes = cube(width, [100, 100])\n |> patternTransform(4, transform, %)", + "// Parameters\nr = 50 // base radius\nh = 10 // layer height\nt = 0.005 // taper factor [0-1)\n// Defines how to modify each layer of the vase.\n// Each replica is shifted up the Z axis, and has a smoothly-varying radius\nfn transform(replicaId) {\n scale = r * abs(1 - (t * replicaId)) * (5 + cos(replicaId / 8))\n return {\n translate = [0, 0, replicaId * 10],\n scale = [scale, scale, 0]\n }\n}\n// Each layer is just a pretty thin cylinder.\nfn layer() {\n return startSketchOn(\"XY\")\n // or some other plane idk\n |> circle({ center = [0, 0], radius = 1 }, %, $tag1)\n |> extrude(h, %)\n}\n// The vase is 100 layers tall.\n// The 100 layers are replica of each other, with a slight transformation applied to each.\nvase = layer()\n |> patternTransform(100, transform, %)", + "fn transform(i) {\n // Transform functions can return multiple transforms. They'll be applied in order.\n return [\n { translate = [30 * i, 0, 0] },\n { rotation = { angle = 45 * i } }\n ]\n}\nstartSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> polygon({\n radius = 10,\n numSides = 4,\n center = [0, 0],\n inscribed = false\n }, %)\n |> extrude(4, %)\n |> patternTransform(3, transform, %)" + ] + }, + { + "name": "patternTransform2d", + "summary": "Just like patternTransform, but works on 2D sketches not 3D solids.", + "description": "", + "tags": [], + "keywordArguments": false, + "args": [ + { + "name": "total_instances", + "type": "integer", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "uint32", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "required": true, + "labelRequired": true + }, + { + "name": "transform_function", + "type": "FunctionParam", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "FunctionParam", + "type": "null" + }, + "required": true, + "labelRequired": true + }, + { + "name": "solid_set", + "type": "SketchSet", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "SketchSet", + "description": "A sketch or a group of sketches.", + "oneOf": [ + { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "sketch" + ] + }, + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": [ + "object", + "array" + ], + "items": { + "$ref": "#/components/schemas/Sketch" + }, + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "sketches" + ] + } + } + } + ], + "definitions": { + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + } + } + }, + "required": true, + "labelRequired": true + } + ], + "returnValue": { + "name": "", + "type": "[Sketch]", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Array_of_Sketch", + "type": "array", + "items": { + "$ref": "#/components/schemas/Sketch" + }, + "definitions": { + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + } + } + }, + "required": true, + "labelRequired": true + }, + "unpublished": false, + "deprecated": false, + "examples": [ + "// Each instance will be shifted along the X axis.\nfn transform(id) {\n return { translate = [4 * id, 0] }\n}\n\n// Sketch 4 circles.\nsketch001 = startSketchOn('XZ')\n |> circle({ center = [0, 0], radius = 2 }, %)\n |> patternTransform2d(4, transform, %)" ] }, { @@ -119540,6 +132428,7 @@ "tags": [ "math" ], + "keywordArguments": false, "args": [], "returnValue": { "name": "", @@ -119550,12 +132439,13 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "circumference = 70\n\nexampleSketch = startSketchOn(\"XZ\")\n |> circle({\n center: [0, 0],\n radius: circumference / (2 * pi())\n }, %)\n\nexample = extrude(5, exampleSketch)" + "circumference = 70\n\nexampleSketch = startSketchOn(\"XZ\")\n |> circle({\n center = [0, 0],\n radius = circumference / (2 * pi())\n }, %)\n\nexample = extrude(5, exampleSketch)" ] }, { @@ -119563,6 +132453,7 @@ "summary": "Convert polar/sphere (azimuth, elevation, distance) coordinates to", "description": "cartesian (x/y/z grid) coordinates.", "tags": [], + "keywordArguments": false, "args": [ { "name": "data", @@ -119589,7 +132480,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -119606,729 +132498,83 @@ "maxItems": 2, "minItems": 2 }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line(polar({ angle: 30, length: 5 }), %, $thing)\n |> line([0, 5], %)\n |> line([segEndX(thing), 0], %)\n |> line([-20, 10], %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" + "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line(polar({ angle = 30, length = 5 }), %, $thing)\n |> line([0, 5], %)\n |> line([segEndX(thing), 0], %)\n |> line([-20, 10], %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" ] }, { - "name": "pow", - "summary": "Compute the number to a power.", + "name": "polygon", + "summary": "Create a regular polygon with the specified number of sides that is either inscribed or circumscribed around a circle of the specified radius.", "description": "", - "tags": [ - "math" - ], - "args": [ - { - "name": "num", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "double", - "type": "number", - "format": "double" - }, - "required": true - }, - { - "name": "pow", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "double", - "type": "number", - "format": "double" - }, - "required": true - } - ], - "returnValue": { - "name": "", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "double", - "type": "number", - "format": "double" - }, - "required": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> angledLine({ angle: 50, length: pow(5, 2) }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" - ] - }, - { - "name": "profileStart", - "summary": "Extract the provided 2-dimensional sketch's profile's origin", - "description": "value.", "tags": [], + "keywordArguments": false, "args": [ { - "name": "sketch", - "type": "Sketch", + "name": "data", + "type": "PolygonData", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "description": "A sketch is a collection of paths.", + "title": "PolygonData", + "description": "Data for drawing a polygon", "type": "object", "required": [ - "__meta", - "id", - "on", - "paths", - "start" + "center", + "numSides", + "radius" ], "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" + "radius": { + "description": "The radius of the polygon", + "type": "number", + "format": "double" }, - "paths": { - "description": "The paths in the sketch.", + "numSides": { + "description": "The number of sides in the polygon", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "center": { + "description": "The center point of the polygon", "type": "array", "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "center", - "from", - "radius", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "end", - "start", - "value" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 + "type": "number", + "format": "double" }, "maxItems": 2, "minItems": 2 }, + "inscribed": { + "description": "Whether the polygon is inscribed (true) or circumscribed (false) about a circle with the specified radius", + "default": true, + "type": "boolean" + } + } + }, + "required": true, + "labelRequired": true + }, + { + "name": "sketch_surface_or_group", + "type": "SketchOrSurface", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "SketchOrSurface", + "description": "A sketch surface or a sketch.", + "anyOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + }, + { + "$ref": "#/components/schemas/Sketch" + } + ], + "definitions": { "SketchSurface": { "description": "A sketch type.", "oneOf": [ @@ -120530,6 +132776,16 @@ } } }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, "Solid": { "description": "An solid is a collection of extrude surfaces.", "type": "object", @@ -120779,6 +133035,38 @@ } ] }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, "Sketch": { "description": "A sketch is a collection of paths.", "type": "object", @@ -120834,296 +133122,6 @@ } } }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "__meta", - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "info": { - "allOf": [ - { - "$ref": "#/components/schemas/TagEngineInfo" - } - ], - "nullable": true - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - "TagEngineInfo": { - "description": "Engine information for a tag.", - "type": "object", - "required": [ - "id", - "sketch" - ], - "properties": { - "id": { - "description": "The id of the tagged object.", - "type": "string", - "format": "uuid" - }, - "sketch": { - "description": "The sketch the tag is on.", - "type": "string", - "format": "uuid" - }, - "path": { - "description": "The path the tag is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Path" - } - ], - "nullable": true - }, - "surface": { - "description": "The surface information for the tag.", - "allOf": [ - { - "$ref": "#/components/schemas/ExtrudeSurface" - } - ], - "nullable": true - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "type": "number", - "format": "double" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "type": "number", - "format": "double" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - } - } - }, - "required": true - } - ], - "returnValue": { - "name": "", - "type": "[number]", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Array_size_2_of_double", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "required": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - "sketch001 = startSketchOn('XY')\n |> startProfileAt([5, 2], %)\n |> angledLine({ angle: 120, length: 50 }, %, $seg01)\n |> angledLine({\n angle: segAng(seg01) + 120,\n length: 50\n }, %)\n |> lineTo(profileStart(%), %)\n |> close(%)\n |> extrude(20, %)" - ] - }, - { - "name": "profileStartX", - "summary": "Extract the provided 2-dimensional sketch's profile's origin's 'x'", - "description": "value.", - "tags": [], - "args": [ - { - "name": "sketch", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "description": "A sketch is a collection of paths.", - "type": "object", - "required": [ - "__meta", - "id", - "on", - "paths", - "start" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - }, - "definitions": { "Path": { "description": "A path.", "oneOf": [ @@ -121359,7 +133357,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -121589,6 +133587,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -121617,6 +133616,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -121658,40 +133661,6 @@ } ] }, - "TagDeclarator": { - "type": "object", - "required": [ - "end", - "start", - "value" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, "GeoMeta": { "description": "Geometry metadata.", "type": "object", @@ -121715,16 +133684,221 @@ } } }, - "SourceRange": { - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + } + } + }, + "required": true, + "labelRequired": true + }, + { + "name": "tag", + "type": "TagNode", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Nullable_TagDeclarator", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true, + "definitions": { "SketchSurface": { "description": "A sketch type.", "oneOf": [ @@ -121926,6 +134100,16 @@ } } }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, "Solid": { "description": "An solid is a collection of extrude surfaces.", "type": "object", @@ -122175,6 +134359,38 @@ } ] }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, "Sketch": { "description": "A sketch is a collection of paths.", "type": "object", @@ -122230,291 +134446,6 @@ } } }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "__meta", - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "info": { - "allOf": [ - { - "$ref": "#/components/schemas/TagEngineInfo" - } - ], - "nullable": true - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - "TagEngineInfo": { - "description": "Engine information for a tag.", - "type": "object", - "required": [ - "id", - "sketch" - ], - "properties": { - "id": { - "description": "The id of the tagged object.", - "type": "string", - "format": "uuid" - }, - "sketch": { - "description": "The sketch the tag is on.", - "type": "string", - "format": "uuid" - }, - "path": { - "description": "The path the tag is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Path" - } - ], - "nullable": true - }, - "surface": { - "description": "The surface information for the tag.", - "allOf": [ - { - "$ref": "#/components/schemas/ExtrudeSurface" - } - ], - "nullable": true - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "type": "number", - "format": "double" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "type": "number", - "format": "double" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - } - } - }, - "required": true - } - ], - "returnValue": { - "name": "", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "double", - "type": "number", - "format": "double" - }, - "required": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - "sketch001 = startSketchOn('XY')\n |> startProfileAt([5, 2], %)\n |> angledLine([-26.6, 50], %)\n |> angledLine([90, 50], %)\n |> angledLineToX({ angle: 30, to: profileStartX(%) }, %)" - ] - }, - { - "name": "profileStartY", - "summary": "Extract the provided 2-dimensional sketch's profile's origin's 'y'", - "description": "value.", - "tags": [], - "args": [ - { - "name": "sketch", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "description": "A sketch is a collection of paths.", - "type": "object", - "required": [ - "__meta", - "id", - "on", - "paths", - "start" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - }, - "definitions": { "Path": { "description": "A path.", "oneOf": [ @@ -122750,7 +134681,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -122980,6 +134911,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -123008,6 +134940,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -123049,40 +134985,6 @@ } ] }, - "TagDeclarator": { - "type": "object", - "required": [ - "end", - "start", - "value" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, "GeoMeta": { "description": "Geometry metadata.", "type": "object", @@ -123106,521 +135008,6 @@ } } }, - "SourceRange": { - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "description": "A plane.", - "type": "object", - "required": [ - "__meta", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane’s X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane’s Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "zAxis": { - "description": "The z-axis (normal).", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "__meta", - "id", - "solid", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face’s X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face’s Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "zAxis": { - "description": "The z-axis (normal).", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "Metadata": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "Solid": { - "description": "An solid is a collection of extrude surfaces.", - "type": "object", - "required": [ - "__meta", - "height", - "id", - "sketch", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "description": "A sketch is a collection of paths.", - "type": "object", - "required": [ - "__meta", - "id", - "on", - "paths", - "start" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, "BasePath": { "description": "A base path.", "type": "object", @@ -123820,31 +135207,1394 @@ } } }, - "required": true + "required": false, + "labelRequired": true } ], "returnValue": { "name": "", - "type": "number", + "type": "Sketch", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "double", - "type": "number", - "format": "double" + "title": "Sketch", + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + }, + "definitions": { + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + } + } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "sketch001 = startSketchOn('XY')\n |> startProfileAt([5, 2], %)\n |> angledLine({ angle: -60, length: 14 }, %)\n |> angledLineToY({ angle: 30, to: profileStartY(%) }, %)" + "// Create a regular hexagon inscribed in a circle of radius 10\nhex = startSketchOn('XY')\n |> polygon({\n radius = 10,\n numSides = 6,\n center = [0, 0],\n inscribed = true\n }, %)\n\nexample = extrude(5, hex)", + "// Create a square circumscribed around a circle of radius 5\nsquare = startSketchOn('XY')\n |> polygon({\n radius = 5.0,\n numSides = 4,\n center = [10, 10],\n inscribed = false\n }, %)\nexample = extrude(5, square)" ] }, { - "name": "reduce", - "summary": "Take a starting value. Then, for each element of an array, calculate the next value,", - "description": "using the previous value and the element.", + "name": "pop", + "summary": "Remove the last element from an array.", + "description": "Returns a new array with the last element removed.", "tags": [], + "keywordArguments": true, "args": [ { "name": "array", @@ -123871,10 +136621,171 @@ "type": { "type": "string", "enum": [ - "UserVal" + "Uuid" ] }, - "value": {}, + "value": { + "type": "string", + "format": "uuid" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Bool" + ] + }, + "value": { + "type": "boolean" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Number" + ] + }, + "value": { + "type": "number", + "format": "double" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Int" + ] + }, + "value": { + "type": "integer", + "format": "int64" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "String" + ] + }, + "value": { + "type": "string" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Array" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Object" + ] + }, + "value": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/KclValue" + } + }, "__meta": { "type": "array", "items": { @@ -123919,8 +136830,6 @@ { "type": "object", "required": [ - "end", - "start", "type", "value" ], @@ -123931,16 +136840,6 @@ "TagDeclarator" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -123954,6 +136853,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -124094,6 +137003,45 @@ } } }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketch" + ] + }, + "value": { + "$ref": "#/components/schemas/Sketch" + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketches" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Sketch" + } + } + } + }, { "description": "An solid is a collection of extrude surfaces.", "type": "object", @@ -124226,7 +137174,6 @@ "type": "object", "required": [ "__meta", - "expression", "memory", "type" ], @@ -124237,9 +137184,6 @@ "Function" ] }, - "expression": { - "$ref": "#/components/schemas/FunctionExpression" - }, "memory": { "$ref": "#/components/schemas/ProgramMemory" }, @@ -124250,6 +137194,56 @@ } } } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Module" + ] + }, + "value": { + "$ref": "#/components/schemas/ModuleId" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "KclNone" + ] + }, + "value": { + "$ref": "#/components/schemas/KclNone" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } } ] }, @@ -124277,8 +137271,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "TagEngineInfo": { "description": "Engine information for a tag.", @@ -124553,7 +137547,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -124783,6 +137777,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -124811,6 +137806,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -124855,21 +137854,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -124883,6 +137870,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -125556,2069 +138553,6 @@ } ] }, - "FunctionExpression": { - "type": "object", - "required": [ - "body", - "end", - "params", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "params": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Parameter" - } - }, - "body": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Parameter": { - "description": "Parameter of a KCL function.", - "type": "object", - "required": [ - "identifier", - "optional" - ], - "properties": { - "identifier": { - "description": "The parameter's label or name.", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ] - }, - "optional": { - "description": "Is the parameter optional?", - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Identifier": { - "type": "object", - "required": [ - "end", - "name", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Program": { - "description": "A KCL program top level, or function body.", - "type": "object", - "required": [ - "body", - "end", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "body": { - "type": "array", - "items": { - "$ref": "#/components/schemas/BodyItem" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "BodyItem": { - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "items", - "path", - "raw_path", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ImportStatement" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ImportItem" - } - }, - "path": { - "type": "string" - }, - "raw_path": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "expression", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ExpressionStatement" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "expression": { - "$ref": "#/components/schemas/Expr" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "declarations", - "end", - "kind", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "VariableDeclaration" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "declarations": { - "type": "array", - "items": { - "$ref": "#/components/schemas/VariableDeclarator" - } - }, - "visibility": { - "$ref": "#/components/schemas/ItemVisibility" - }, - "kind": { - "$ref": "#/components/schemas/VariableKind" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ReturnStatement" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "argument": { - "$ref": "#/components/schemas/Expr" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "ImportItem": { - "type": "object", - "required": [ - "end", - "name", - "start" - ], - "properties": { - "name": { - "description": "Name of the item to import.", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ] - }, - "alias": { - "description": "Rename the item using an identifier after \"as\".", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ], - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Expr": { - "description": "An expression can be evaluated to yield a single KCL value.", - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/LiteralValue" - }, - "raw": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TagDeclarator" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/BinaryOperator" - }, - "left": { - "$ref": "#/components/schemas/BinaryPart" - }, - "right": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "params", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "FunctionExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "params": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Parameter" - } - }, - "body": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "callee": { - "$ref": "#/components/schemas/Identifier" - }, - "arguments": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "optional": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "body": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeSubstitution" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "elements", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "elements": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "endElement", - "endInclusive", - "start", - "startElement", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayRangeExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "startElement": { - "$ref": "#/components/schemas/Expr" - }, - "endElement": { - "$ref": "#/components/schemas/Expr" - }, - "endInclusive": { - "description": "Is the `end_element` included in the range?", - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "properties", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ObjectExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "properties": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ObjectProperty" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "object": { - "$ref": "#/components/schemas/MemberObject" - }, - "property": { - "$ref": "#/components/schemas/LiteralIdentifier" - }, - "computed": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/UnaryOperator" - }, - "argument": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "cond": { - "$ref": "#/components/schemas/Expr" - }, - "then_val": { - "$ref": "#/components/schemas/Program" - }, - "else_ifs": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ElseIf" - } - }, - "final_else": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "description": "KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application).", - "type": "object", - "required": [ - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "None" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - } - ] - }, - "LiteralValue": { - "anyOf": [ - { - "type": "integer", - "format": "int64" - }, - { - "type": "number", - "format": "double" - }, - { - "type": "string" - }, - { - "type": "boolean" - } - ] - }, - "BinaryOperator": { - "oneOf": [ - { - "description": "Add two numbers.", - "type": "string", - "enum": [ - "+" - ] - }, - { - "description": "Subtract two numbers.", - "type": "string", - "enum": [ - "-" - ] - }, - { - "description": "Multiply two numbers.", - "type": "string", - "enum": [ - "*" - ] - }, - { - "description": "Divide two numbers.", - "type": "string", - "enum": [ - "/" - ] - }, - { - "description": "Modulo two numbers.", - "type": "string", - "enum": [ - "%" - ] - }, - { - "description": "Raise a number to a power.", - "type": "string", - "enum": [ - "^" - ] - }, - { - "description": "Are two numbers equal?", - "type": "string", - "enum": [ - "==" - ] - }, - { - "description": "Are two numbers not equal?", - "type": "string", - "enum": [ - "!=" - ] - }, - { - "description": "Is left greater than right", - "type": "string", - "enum": [ - ">" - ] - }, - { - "description": "Is left greater than or equal to right", - "type": "string", - "enum": [ - ">=" - ] - }, - { - "description": "Is left less than right", - "type": "string", - "enum": [ - "<" - ] - }, - { - "description": "Is left less than or equal to right", - "type": "string", - "enum": [ - "<=" - ] - } - ] - }, - "BinaryPart": { - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/LiteralValue" - }, - "raw": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/BinaryOperator" - }, - "left": { - "$ref": "#/components/schemas/BinaryPart" - }, - "right": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "callee": { - "$ref": "#/components/schemas/Identifier" - }, - "arguments": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "optional": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/UnaryOperator" - }, - "argument": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "object": { - "$ref": "#/components/schemas/MemberObject" - }, - "property": { - "$ref": "#/components/schemas/LiteralIdentifier" - }, - "computed": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "cond": { - "$ref": "#/components/schemas/Expr" - }, - "then_val": { - "$ref": "#/components/schemas/Program" - }, - "else_ifs": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ElseIf" - } - }, - "final_else": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "UnaryOperator": { - "oneOf": [ - { - "description": "Negate a number.", - "type": "string", - "enum": [ - "-" - ] - }, - { - "description": "Negate a boolean.", - "type": "string", - "enum": [ - "!" - ] - } - ] - }, - "MemberObject": { - "oneOf": [ - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "object": { - "$ref": "#/components/schemas/MemberObject" - }, - "property": { - "$ref": "#/components/schemas/LiteralIdentifier" - }, - "computed": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "LiteralIdentifier": { - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/LiteralValue" - }, - "raw": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "ElseIf": { - "type": "object", - "required": [ - "cond", - "end", - "start", - "then_val" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "cond": { - "$ref": "#/components/schemas/Expr" - }, - "then_val": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "NonCodeMeta": { - "type": "object", - "required": [ - "nonCodeNodes", - "start" - ], - "properties": { - "nonCodeNodes": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NonCodeNode" - } - } - }, - "start": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NonCodeNode" - } - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "NonCodeNode": { - "type": "object", - "required": [ - "end", - "start", - "value" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/NonCodeValue" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "NonCodeValue": { - "oneOf": [ - { - "description": "A shebang. This is a special type of comment that is at the top of the file. It looks like this: ```python,no_run #!/usr/bin/env python ```", - "type": "object", - "required": [ - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "shebang" - ] - }, - "value": { - "type": "string" - } - } - }, - { - "description": "An inline comment. Here are examples: `1 + 1 // This is an inline comment`. `1 + 1 /* Here's another */`.", - "type": "object", - "required": [ - "style", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "inlineComment" - ] - }, - "value": { - "type": "string" - }, - "style": { - "$ref": "#/components/schemas/CommentStyle" - } - } - }, - { - "description": "A block comment. An example of this is the following: ```python,no_run /* This is a block comment */ 1 + 1 ``` Now this is important. The block comment is attached to the next line. This is always the case. Also the block comment doesn't have a new line above it. If it did it would be a `NewLineBlockComment`.", - "type": "object", - "required": [ - "style", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "blockComment" - ] - }, - "value": { - "type": "string" - }, - "style": { - "$ref": "#/components/schemas/CommentStyle" - } - } - }, - { - "description": "A block comment that has a new line above it. The user explicitly added a new line above the block comment.", - "type": "object", - "required": [ - "style", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "newLineBlockComment" - ] - }, - "value": { - "type": "string" - }, - "style": { - "$ref": "#/components/schemas/CommentStyle" - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "newLine" - ] - } - } - } - ] - }, - "CommentStyle": { - "oneOf": [ - { - "description": "Like // foo", - "type": "string", - "enum": [ - "line" - ] - }, - { - "description": "Like /* foo */", - "type": "string", - "enum": [ - "block" - ] - } - ] - }, - "ObjectProperty": { - "type": "object", - "required": [ - "end", - "key", - "start", - "value" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "key": { - "$ref": "#/components/schemas/Identifier" - }, - "value": { - "$ref": "#/components/schemas/Expr" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "VariableDeclarator": { - "type": "object", - "required": [ - "end", - "id", - "init", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "id": { - "description": "The identifier of the variable.", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ] - }, - "init": { - "description": "The value of the variable.", - "allOf": [ - { - "$ref": "#/components/schemas/Expr" - } - ] - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "ItemVisibility": { - "type": "string", - "enum": [ - "default", - "export" - ] - }, - "VariableKind": { - "oneOf": [ - { - "description": "Declare a named constant.", - "type": "string", - "enum": [ - "const" - ] - }, - { - "description": "Declare a function.", - "type": "string", - "enum": [ - "fn" - ] - } - ] - }, "ProgramMemory": { "type": "object", "required": [ @@ -127633,7 +138567,9 @@ } }, "currentEnv": { - "$ref": "#/components/schemas/EnvironmentRef" + "type": "integer", + "format": "uint", + "minimum": 0.0 }, "return": { "allOf": [ @@ -127658,8073 +138594,41 @@ } }, "parent": { - "allOf": [ - { - "$ref": "#/components/schemas/EnvironmentRef" - } - ], + "type": "integer", + "format": "uint", + "minimum": 0.0, "nullable": true } } }, - "EnvironmentRef": { - "description": "An index pointing to an environment.", + "ModuleId": { + "description": "Identifier of a source file. Uses a u32 to keep the size small.", "type": "integer", - "format": "uint", + "format": "uint32", "minimum": 0.0 + }, + "KclNone": { + "description": "KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application).", + "type": "object", + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + } + } } } }, - "required": true - }, - { - "name": "start", - "type": "KclValue", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "KclValue", - "description": "Any KCL value.", - "oneOf": [ - { - "type": "object", - "required": [ - "__meta", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UserVal" - ] - }, - "value": {}, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - { - "type": "object", - "required": [ - "__meta", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TagIdentifier" - ] - }, - "value": { - "type": "string" - }, - "info": { - "allOf": [ - { - "$ref": "#/components/schemas/TagEngineInfo" - } - ], - "nullable": true - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TagDeclarator" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "description": "A plane.", - "type": "object", - "required": [ - "__meta", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane’s X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane’s Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "zAxis": { - "description": "The z-axis (normal).", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "__meta", - "id", - "solid", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face’s X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face’s Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "zAxis": { - "description": "The z-axis (normal).", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - { - "description": "An solid is a collection of extrude surfaces.", - "type": "object", - "required": [ - "__meta", - "height", - "id", - "sketch", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Solid" - ] - }, - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - { - "type": "object", - "required": [ - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Solids" - ] - }, - "value": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Solid" - } - } - } - }, - { - "description": "Data for an imported geometry.", - "type": "object", - "required": [ - "__meta", - "id", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ImportedGeometry" - ] - }, - "id": { - "description": "The ID of the imported geometry.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The original file paths.", - "type": "array", - "items": { - "type": "string" - } - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - { - "type": "object", - "required": [ - "__meta", - "expression", - "memory", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Function" - ] - }, - "expression": { - "$ref": "#/components/schemas/FunctionExpression" - }, - "memory": { - "$ref": "#/components/schemas/ProgramMemory" - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - } - ], - "definitions": { - "KclValue": { - "description": "Any KCL value.", - "oneOf": [ - { - "type": "object", - "required": [ - "__meta", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UserVal" - ] - }, - "value": {}, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - { - "type": "object", - "required": [ - "__meta", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TagIdentifier" - ] - }, - "value": { - "type": "string" - }, - "info": { - "allOf": [ - { - "$ref": "#/components/schemas/TagEngineInfo" - } - ], - "nullable": true - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TagDeclarator" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "description": "A plane.", - "type": "object", - "required": [ - "__meta", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane’s X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane’s Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "zAxis": { - "description": "The z-axis (normal).", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "__meta", - "id", - "solid", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face’s X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face’s Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "zAxis": { - "description": "The z-axis (normal).", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - { - "description": "An solid is a collection of extrude surfaces.", - "type": "object", - "required": [ - "__meta", - "height", - "id", - "sketch", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Solid" - ] - }, - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - { - "type": "object", - "required": [ - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Solids" - ] - }, - "value": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Solid" - } - } - } - }, - { - "description": "Data for an imported geometry.", - "type": "object", - "required": [ - "__meta", - "id", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ImportedGeometry" - ] - }, - "id": { - "description": "The ID of the imported geometry.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The original file paths.", - "type": "array", - "items": { - "type": "string" - } - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - { - "type": "object", - "required": [ - "__meta", - "expression", - "memory", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Function" - ] - }, - "expression": { - "$ref": "#/components/schemas/FunctionExpression" - }, - "memory": { - "$ref": "#/components/schemas/ProgramMemory" - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - } - ] - }, - "Metadata": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - }, - "TagEngineInfo": { - "description": "Engine information for a tag.", - "type": "object", - "required": [ - "id", - "sketch" - ], - "properties": { - "id": { - "description": "The id of the tagged object.", - "type": "string", - "format": "uuid" - }, - "sketch": { - "description": "The sketch the tag is on.", - "type": "string", - "format": "uuid" - }, - "path": { - "description": "The path the tag is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Path" - } - ], - "nullable": true - }, - "surface": { - "description": "The surface information for the tag.", - "allOf": [ - { - "$ref": "#/components/schemas/ExtrudeSurface" - } - ], - "nullable": true - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "center", - "from", - "radius", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "end", - "start", - "value" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "Solid": { - "description": "An solid is a collection of extrude surfaces.", - "type": "object", - "required": [ - "__meta", - "height", - "id", - "sketch", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - "Sketch": { - "description": "A sketch is a collection of paths.", - "type": "object", - "required": [ - "__meta", - "id", - "on", - "paths", - "start" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "description": "A plane.", - "type": "object", - "required": [ - "__meta", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane’s X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane’s Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "zAxis": { - "description": "The z-axis (normal).", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "__meta", - "id", - "solid", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face’s X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face’s Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "zAxis": { - "description": "The z-axis (normal).", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - } - ] - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "__meta", - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "info": { - "allOf": [ - { - "$ref": "#/components/schemas/TagEngineInfo" - } - ], - "nullable": true - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "type": "number", - "format": "double" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "type": "number", - "format": "double" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "FunctionExpression": { - "type": "object", - "required": [ - "body", - "end", - "params", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "params": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Parameter" - } - }, - "body": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Parameter": { - "description": "Parameter of a KCL function.", - "type": "object", - "required": [ - "identifier", - "optional" - ], - "properties": { - "identifier": { - "description": "The parameter's label or name.", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ] - }, - "optional": { - "description": "Is the parameter optional?", - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Identifier": { - "type": "object", - "required": [ - "end", - "name", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Program": { - "description": "A KCL program top level, or function body.", - "type": "object", - "required": [ - "body", - "end", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "body": { - "type": "array", - "items": { - "$ref": "#/components/schemas/BodyItem" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "BodyItem": { - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "items", - "path", - "raw_path", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ImportStatement" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ImportItem" - } - }, - "path": { - "type": "string" - }, - "raw_path": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "expression", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ExpressionStatement" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "expression": { - "$ref": "#/components/schemas/Expr" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "declarations", - "end", - "kind", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "VariableDeclaration" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "declarations": { - "type": "array", - "items": { - "$ref": "#/components/schemas/VariableDeclarator" - } - }, - "visibility": { - "$ref": "#/components/schemas/ItemVisibility" - }, - "kind": { - "$ref": "#/components/schemas/VariableKind" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ReturnStatement" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "argument": { - "$ref": "#/components/schemas/Expr" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "ImportItem": { - "type": "object", - "required": [ - "end", - "name", - "start" - ], - "properties": { - "name": { - "description": "Name of the item to import.", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ] - }, - "alias": { - "description": "Rename the item using an identifier after \"as\".", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ], - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Expr": { - "description": "An expression can be evaluated to yield a single KCL value.", - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/LiteralValue" - }, - "raw": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TagDeclarator" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/BinaryOperator" - }, - "left": { - "$ref": "#/components/schemas/BinaryPart" - }, - "right": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "params", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "FunctionExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "params": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Parameter" - } - }, - "body": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "callee": { - "$ref": "#/components/schemas/Identifier" - }, - "arguments": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "optional": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "body": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeSubstitution" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "elements", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "elements": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "endElement", - "endInclusive", - "start", - "startElement", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayRangeExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "startElement": { - "$ref": "#/components/schemas/Expr" - }, - "endElement": { - "$ref": "#/components/schemas/Expr" - }, - "endInclusive": { - "description": "Is the `end_element` included in the range?", - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "properties", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ObjectExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "properties": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ObjectProperty" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "object": { - "$ref": "#/components/schemas/MemberObject" - }, - "property": { - "$ref": "#/components/schemas/LiteralIdentifier" - }, - "computed": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/UnaryOperator" - }, - "argument": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "cond": { - "$ref": "#/components/schemas/Expr" - }, - "then_val": { - "$ref": "#/components/schemas/Program" - }, - "else_ifs": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ElseIf" - } - }, - "final_else": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "description": "KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application).", - "type": "object", - "required": [ - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "None" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - } - ] - }, - "LiteralValue": { - "anyOf": [ - { - "type": "integer", - "format": "int64" - }, - { - "type": "number", - "format": "double" - }, - { - "type": "string" - }, - { - "type": "boolean" - } - ] - }, - "BinaryOperator": { - "oneOf": [ - { - "description": "Add two numbers.", - "type": "string", - "enum": [ - "+" - ] - }, - { - "description": "Subtract two numbers.", - "type": "string", - "enum": [ - "-" - ] - }, - { - "description": "Multiply two numbers.", - "type": "string", - "enum": [ - "*" - ] - }, - { - "description": "Divide two numbers.", - "type": "string", - "enum": [ - "/" - ] - }, - { - "description": "Modulo two numbers.", - "type": "string", - "enum": [ - "%" - ] - }, - { - "description": "Raise a number to a power.", - "type": "string", - "enum": [ - "^" - ] - }, - { - "description": "Are two numbers equal?", - "type": "string", - "enum": [ - "==" - ] - }, - { - "description": "Are two numbers not equal?", - "type": "string", - "enum": [ - "!=" - ] - }, - { - "description": "Is left greater than right", - "type": "string", - "enum": [ - ">" - ] - }, - { - "description": "Is left greater than or equal to right", - "type": "string", - "enum": [ - ">=" - ] - }, - { - "description": "Is left less than right", - "type": "string", - "enum": [ - "<" - ] - }, - { - "description": "Is left less than or equal to right", - "type": "string", - "enum": [ - "<=" - ] - } - ] - }, - "BinaryPart": { - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/LiteralValue" - }, - "raw": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/BinaryOperator" - }, - "left": { - "$ref": "#/components/schemas/BinaryPart" - }, - "right": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "callee": { - "$ref": "#/components/schemas/Identifier" - }, - "arguments": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "optional": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/UnaryOperator" - }, - "argument": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "object": { - "$ref": "#/components/schemas/MemberObject" - }, - "property": { - "$ref": "#/components/schemas/LiteralIdentifier" - }, - "computed": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "cond": { - "$ref": "#/components/schemas/Expr" - }, - "then_val": { - "$ref": "#/components/schemas/Program" - }, - "else_ifs": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ElseIf" - } - }, - "final_else": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "UnaryOperator": { - "oneOf": [ - { - "description": "Negate a number.", - "type": "string", - "enum": [ - "-" - ] - }, - { - "description": "Negate a boolean.", - "type": "string", - "enum": [ - "!" - ] - } - ] - }, - "MemberObject": { - "oneOf": [ - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "object": { - "$ref": "#/components/schemas/MemberObject" - }, - "property": { - "$ref": "#/components/schemas/LiteralIdentifier" - }, - "computed": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "LiteralIdentifier": { - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/LiteralValue" - }, - "raw": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "ElseIf": { - "type": "object", - "required": [ - "cond", - "end", - "start", - "then_val" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "cond": { - "$ref": "#/components/schemas/Expr" - }, - "then_val": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "NonCodeMeta": { - "type": "object", - "required": [ - "nonCodeNodes", - "start" - ], - "properties": { - "nonCodeNodes": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NonCodeNode" - } - } - }, - "start": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NonCodeNode" - } - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "NonCodeNode": { - "type": "object", - "required": [ - "end", - "start", - "value" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/NonCodeValue" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "NonCodeValue": { - "oneOf": [ - { - "description": "A shebang. This is a special type of comment that is at the top of the file. It looks like this: ```python,no_run #!/usr/bin/env python ```", - "type": "object", - "required": [ - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "shebang" - ] - }, - "value": { - "type": "string" - } - } - }, - { - "description": "An inline comment. Here are examples: `1 + 1 // This is an inline comment`. `1 + 1 /* Here's another */`.", - "type": "object", - "required": [ - "style", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "inlineComment" - ] - }, - "value": { - "type": "string" - }, - "style": { - "$ref": "#/components/schemas/CommentStyle" - } - } - }, - { - "description": "A block comment. An example of this is the following: ```python,no_run /* This is a block comment */ 1 + 1 ``` Now this is important. The block comment is attached to the next line. This is always the case. Also the block comment doesn't have a new line above it. If it did it would be a `NewLineBlockComment`.", - "type": "object", - "required": [ - "style", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "blockComment" - ] - }, - "value": { - "type": "string" - }, - "style": { - "$ref": "#/components/schemas/CommentStyle" - } - } - }, - { - "description": "A block comment that has a new line above it. The user explicitly added a new line above the block comment.", - "type": "object", - "required": [ - "style", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "newLineBlockComment" - ] - }, - "value": { - "type": "string" - }, - "style": { - "$ref": "#/components/schemas/CommentStyle" - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "newLine" - ] - } - } - } - ] - }, - "CommentStyle": { - "oneOf": [ - { - "description": "Like // foo", - "type": "string", - "enum": [ - "line" - ] - }, - { - "description": "Like /* foo */", - "type": "string", - "enum": [ - "block" - ] - } - ] - }, - "ObjectProperty": { - "type": "object", - "required": [ - "end", - "key", - "start", - "value" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "key": { - "$ref": "#/components/schemas/Identifier" - }, - "value": { - "$ref": "#/components/schemas/Expr" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "VariableDeclarator": { - "type": "object", - "required": [ - "end", - "id", - "init", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "id": { - "description": "The identifier of the variable.", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ] - }, - "init": { - "description": "The value of the variable.", - "allOf": [ - { - "$ref": "#/components/schemas/Expr" - } - ] - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "ItemVisibility": { - "type": "string", - "enum": [ - "default", - "export" - ] - }, - "VariableKind": { - "oneOf": [ - { - "description": "Declare a named constant.", - "type": "string", - "enum": [ - "const" - ] - }, - { - "description": "Declare a function.", - "type": "string", - "enum": [ - "fn" - ] - } - ] - }, - "ProgramMemory": { - "type": "object", - "required": [ - "currentEnv", - "environments" - ], - "properties": { - "environments": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Environment" - } - }, - "currentEnv": { - "$ref": "#/components/schemas/EnvironmentRef" - }, - "return": { - "allOf": [ - { - "$ref": "#/components/schemas/KclValue" - } - ], - "nullable": true - } - } - }, - "Environment": { - "type": "object", - "required": [ - "bindings" - ], - "properties": { - "bindings": { - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/KclValue" - } - }, - "parent": { - "allOf": [ - { - "$ref": "#/components/schemas/EnvironmentRef" - } - ], - "nullable": true - } - } - }, - "EnvironmentRef": { - "description": "An index pointing to an environment.", - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "required": true - }, - { - "name": "reduce_fn", - "type": "FunctionParam", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "FunctionParam", - "type": "null", - "definitions": { - "KclValue": { - "description": "Any KCL value.", - "oneOf": [ - { - "type": "object", - "required": [ - "__meta", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UserVal" - ] - }, - "value": {}, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - { - "type": "object", - "required": [ - "__meta", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TagIdentifier" - ] - }, - "value": { - "type": "string" - }, - "info": { - "allOf": [ - { - "$ref": "#/components/schemas/TagEngineInfo" - } - ], - "nullable": true - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TagDeclarator" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "description": "A plane.", - "type": "object", - "required": [ - "__meta", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane’s X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane’s Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "zAxis": { - "description": "The z-axis (normal).", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "__meta", - "id", - "solid", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face’s X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face’s Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "zAxis": { - "description": "The z-axis (normal).", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - { - "description": "An solid is a collection of extrude surfaces.", - "type": "object", - "required": [ - "__meta", - "height", - "id", - "sketch", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Solid" - ] - }, - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - { - "type": "object", - "required": [ - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Solids" - ] - }, - "value": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Solid" - } - } - } - }, - { - "description": "Data for an imported geometry.", - "type": "object", - "required": [ - "__meta", - "id", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ImportedGeometry" - ] - }, - "id": { - "description": "The ID of the imported geometry.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The original file paths.", - "type": "array", - "items": { - "type": "string" - } - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - { - "type": "object", - "required": [ - "__meta", - "expression", - "memory", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Function" - ] - }, - "expression": { - "$ref": "#/components/schemas/FunctionExpression" - }, - "memory": { - "$ref": "#/components/schemas/ProgramMemory" - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - } - ] - }, - "Metadata": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - }, - "TagEngineInfo": { - "description": "Engine information for a tag.", - "type": "object", - "required": [ - "id", - "sketch" - ], - "properties": { - "id": { - "description": "The id of the tagged object.", - "type": "string", - "format": "uuid" - }, - "sketch": { - "description": "The sketch the tag is on.", - "type": "string", - "format": "uuid" - }, - "path": { - "description": "The path the tag is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Path" - } - ], - "nullable": true - }, - "surface": { - "description": "The surface information for the tag.", - "allOf": [ - { - "$ref": "#/components/schemas/ExtrudeSurface" - } - ], - "nullable": true - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "center", - "from", - "radius", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "end", - "start", - "value" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "Solid": { - "description": "An solid is a collection of extrude surfaces.", - "type": "object", - "required": [ - "__meta", - "height", - "id", - "sketch", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - "Sketch": { - "description": "A sketch is a collection of paths.", - "type": "object", - "required": [ - "__meta", - "id", - "on", - "paths", - "start" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "description": "A plane.", - "type": "object", - "required": [ - "__meta", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane’s X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane’s Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "zAxis": { - "description": "The z-axis (normal).", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "__meta", - "id", - "solid", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face’s X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face’s Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "zAxis": { - "description": "The z-axis (normal).", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - } - ] - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "__meta", - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "info": { - "allOf": [ - { - "$ref": "#/components/schemas/TagEngineInfo" - } - ], - "nullable": true - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "type": "number", - "format": "double" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "type": "number", - "format": "double" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "FunctionExpression": { - "type": "object", - "required": [ - "body", - "end", - "params", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "params": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Parameter" - } - }, - "body": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Parameter": { - "description": "Parameter of a KCL function.", - "type": "object", - "required": [ - "identifier", - "optional" - ], - "properties": { - "identifier": { - "description": "The parameter's label or name.", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ] - }, - "optional": { - "description": "Is the parameter optional?", - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Identifier": { - "type": "object", - "required": [ - "end", - "name", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Program": { - "description": "A KCL program top level, or function body.", - "type": "object", - "required": [ - "body", - "end", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "body": { - "type": "array", - "items": { - "$ref": "#/components/schemas/BodyItem" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "BodyItem": { - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "items", - "path", - "raw_path", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ImportStatement" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ImportItem" - } - }, - "path": { - "type": "string" - }, - "raw_path": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "expression", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ExpressionStatement" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "expression": { - "$ref": "#/components/schemas/Expr" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "declarations", - "end", - "kind", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "VariableDeclaration" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "declarations": { - "type": "array", - "items": { - "$ref": "#/components/schemas/VariableDeclarator" - } - }, - "visibility": { - "$ref": "#/components/schemas/ItemVisibility" - }, - "kind": { - "$ref": "#/components/schemas/VariableKind" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ReturnStatement" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "argument": { - "$ref": "#/components/schemas/Expr" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "ImportItem": { - "type": "object", - "required": [ - "end", - "name", - "start" - ], - "properties": { - "name": { - "description": "Name of the item to import.", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ] - }, - "alias": { - "description": "Rename the item using an identifier after \"as\".", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ], - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Expr": { - "description": "An expression can be evaluated to yield a single KCL value.", - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/LiteralValue" - }, - "raw": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TagDeclarator" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/BinaryOperator" - }, - "left": { - "$ref": "#/components/schemas/BinaryPart" - }, - "right": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "params", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "FunctionExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "params": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Parameter" - } - }, - "body": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "callee": { - "$ref": "#/components/schemas/Identifier" - }, - "arguments": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "optional": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "body": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeSubstitution" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "elements", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "elements": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "endElement", - "endInclusive", - "start", - "startElement", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayRangeExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "startElement": { - "$ref": "#/components/schemas/Expr" - }, - "endElement": { - "$ref": "#/components/schemas/Expr" - }, - "endInclusive": { - "description": "Is the `end_element` included in the range?", - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "properties", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ObjectExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "properties": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ObjectProperty" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "object": { - "$ref": "#/components/schemas/MemberObject" - }, - "property": { - "$ref": "#/components/schemas/LiteralIdentifier" - }, - "computed": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/UnaryOperator" - }, - "argument": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "cond": { - "$ref": "#/components/schemas/Expr" - }, - "then_val": { - "$ref": "#/components/schemas/Program" - }, - "else_ifs": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ElseIf" - } - }, - "final_else": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "description": "KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application).", - "type": "object", - "required": [ - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "None" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - } - ] - }, - "LiteralValue": { - "anyOf": [ - { - "type": "integer", - "format": "int64" - }, - { - "type": "number", - "format": "double" - }, - { - "type": "string" - }, - { - "type": "boolean" - } - ] - }, - "BinaryOperator": { - "oneOf": [ - { - "description": "Add two numbers.", - "type": "string", - "enum": [ - "+" - ] - }, - { - "description": "Subtract two numbers.", - "type": "string", - "enum": [ - "-" - ] - }, - { - "description": "Multiply two numbers.", - "type": "string", - "enum": [ - "*" - ] - }, - { - "description": "Divide two numbers.", - "type": "string", - "enum": [ - "/" - ] - }, - { - "description": "Modulo two numbers.", - "type": "string", - "enum": [ - "%" - ] - }, - { - "description": "Raise a number to a power.", - "type": "string", - "enum": [ - "^" - ] - }, - { - "description": "Are two numbers equal?", - "type": "string", - "enum": [ - "==" - ] - }, - { - "description": "Are two numbers not equal?", - "type": "string", - "enum": [ - "!=" - ] - }, - { - "description": "Is left greater than right", - "type": "string", - "enum": [ - ">" - ] - }, - { - "description": "Is left greater than or equal to right", - "type": "string", - "enum": [ - ">=" - ] - }, - { - "description": "Is left less than right", - "type": "string", - "enum": [ - "<" - ] - }, - { - "description": "Is left less than or equal to right", - "type": "string", - "enum": [ - "<=" - ] - } - ] - }, - "BinaryPart": { - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/LiteralValue" - }, - "raw": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/BinaryOperator" - }, - "left": { - "$ref": "#/components/schemas/BinaryPart" - }, - "right": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "callee": { - "$ref": "#/components/schemas/Identifier" - }, - "arguments": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "optional": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/UnaryOperator" - }, - "argument": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "object": { - "$ref": "#/components/schemas/MemberObject" - }, - "property": { - "$ref": "#/components/schemas/LiteralIdentifier" - }, - "computed": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "cond": { - "$ref": "#/components/schemas/Expr" - }, - "then_val": { - "$ref": "#/components/schemas/Program" - }, - "else_ifs": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ElseIf" - } - }, - "final_else": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "UnaryOperator": { - "oneOf": [ - { - "description": "Negate a number.", - "type": "string", - "enum": [ - "-" - ] - }, - { - "description": "Negate a boolean.", - "type": "string", - "enum": [ - "!" - ] - } - ] - }, - "MemberObject": { - "oneOf": [ - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "object": { - "$ref": "#/components/schemas/MemberObject" - }, - "property": { - "$ref": "#/components/schemas/LiteralIdentifier" - }, - "computed": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "LiteralIdentifier": { - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/LiteralValue" - }, - "raw": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "ElseIf": { - "type": "object", - "required": [ - "cond", - "end", - "start", - "then_val" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "cond": { - "$ref": "#/components/schemas/Expr" - }, - "then_val": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "NonCodeMeta": { - "type": "object", - "required": [ - "nonCodeNodes", - "start" - ], - "properties": { - "nonCodeNodes": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NonCodeNode" - } - } - }, - "start": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NonCodeNode" - } - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "NonCodeNode": { - "type": "object", - "required": [ - "end", - "start", - "value" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/NonCodeValue" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "NonCodeValue": { - "oneOf": [ - { - "description": "A shebang. This is a special type of comment that is at the top of the file. It looks like this: ```python,no_run #!/usr/bin/env python ```", - "type": "object", - "required": [ - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "shebang" - ] - }, - "value": { - "type": "string" - } - } - }, - { - "description": "An inline comment. Here are examples: `1 + 1 // This is an inline comment`. `1 + 1 /* Here's another */`.", - "type": "object", - "required": [ - "style", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "inlineComment" - ] - }, - "value": { - "type": "string" - }, - "style": { - "$ref": "#/components/schemas/CommentStyle" - } - } - }, - { - "description": "A block comment. An example of this is the following: ```python,no_run /* This is a block comment */ 1 + 1 ``` Now this is important. The block comment is attached to the next line. This is always the case. Also the block comment doesn't have a new line above it. If it did it would be a `NewLineBlockComment`.", - "type": "object", - "required": [ - "style", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "blockComment" - ] - }, - "value": { - "type": "string" - }, - "style": { - "$ref": "#/components/schemas/CommentStyle" - } - } - }, - { - "description": "A block comment that has a new line above it. The user explicitly added a new line above the block comment.", - "type": "object", - "required": [ - "style", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "newLineBlockComment" - ] - }, - "value": { - "type": "string" - }, - "style": { - "$ref": "#/components/schemas/CommentStyle" - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "newLine" - ] - } - } - } - ] - }, - "CommentStyle": { - "oneOf": [ - { - "description": "Like // foo", - "type": "string", - "enum": [ - "line" - ] - }, - { - "description": "Like /* foo */", - "type": "string", - "enum": [ - "block" - ] - } - ] - }, - "ObjectProperty": { - "type": "object", - "required": [ - "end", - "key", - "start", - "value" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "key": { - "$ref": "#/components/schemas/Identifier" - }, - "value": { - "$ref": "#/components/schemas/Expr" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "VariableDeclarator": { - "type": "object", - "required": [ - "end", - "id", - "init", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "id": { - "description": "The identifier of the variable.", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ] - }, - "init": { - "description": "The value of the variable.", - "allOf": [ - { - "$ref": "#/components/schemas/Expr" - } - ] - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "ItemVisibility": { - "type": "string", - "enum": [ - "default", - "export" - ] - }, - "VariableKind": { - "oneOf": [ - { - "description": "Declare a named constant.", - "type": "string", - "enum": [ - "const" - ] - }, - { - "description": "Declare a function.", - "type": "string", - "enum": [ - "fn" - ] - } - ] - }, - "ProgramMemory": { - "type": "object", - "required": [ - "currentEnv", - "environments" - ], - "properties": { - "environments": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Environment" - } - }, - "currentEnv": { - "$ref": "#/components/schemas/EnvironmentRef" - }, - "return": { - "allOf": [ - { - "$ref": "#/components/schemas/KclValue" - } - ], - "nullable": true - } - } - }, - "Environment": { - "type": "object", - "required": [ - "bindings" - ], - "properties": { - "bindings": { - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/KclValue" - } - }, - "parent": { - "allOf": [ - { - "$ref": "#/components/schemas/EnvironmentRef" - } - ], - "nullable": true - } - } - }, - "EnvironmentRef": { - "description": "An index pointing to an environment.", - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "required": true + "required": true, + "description": "The array to pop from. Must not be empty.", + "labelRequired": false } ], "returnValue": { @@ -135746,10 +138650,171 @@ "type": { "type": "string", "enum": [ - "UserVal" + "Uuid" ] }, - "value": {}, + "value": { + "type": "string", + "format": "uuid" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Bool" + ] + }, + "value": { + "type": "boolean" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Number" + ] + }, + "value": { + "type": "number", + "format": "double" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Int" + ] + }, + "value": { + "type": "integer", + "format": "int64" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "String" + ] + }, + "value": { + "type": "string" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Array" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Object" + ] + }, + "value": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/KclValue" + } + }, "__meta": { "type": "array", "items": { @@ -135794,8 +138859,6 @@ { "type": "object", "required": [ - "end", - "start", "type", "value" ], @@ -135806,16 +138869,6 @@ "TagDeclarator" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -135829,6 +138882,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -135969,6 +139032,45 @@ } } }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketch" + ] + }, + "value": { + "$ref": "#/components/schemas/Sketch" + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketches" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Sketch" + } + } + } + }, { "description": "An solid is a collection of extrude surfaces.", "type": "object", @@ -136101,7 +139203,6 @@ "type": "object", "required": [ "__meta", - "expression", "memory", "type" ], @@ -136112,9 +139213,6 @@ "Function" ] }, - "expression": { - "$ref": "#/components/schemas/FunctionExpression" - }, "memory": { "$ref": "#/components/schemas/ProgramMemory" }, @@ -136125,6 +139223,56 @@ } } } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Module" + ] + }, + "value": { + "$ref": "#/components/schemas/ModuleId" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "KclNone" + ] + }, + "value": { + "$ref": "#/components/schemas/KclNone" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } } ], "definitions": { @@ -136152,8 +139300,648 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 + }, + "KclValue": { + "description": "Any KCL value.", + "oneOf": [ + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Uuid" + ] + }, + "value": { + "type": "string", + "format": "uuid" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Bool" + ] + }, + "value": { + "type": "boolean" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Number" + ] + }, + "value": { + "type": "number", + "format": "double" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Int" + ] + }, + "value": { + "type": "integer", + "format": "int64" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "String" + ] + }, + "value": { + "type": "string" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Array" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Object" + ] + }, + "value": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagIdentifier" + ] + }, + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagDeclarator" + ] + }, + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketch" + ] + }, + "value": { + "$ref": "#/components/schemas/Sketch" + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketches" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Sketch" + } + } + } + }, + { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Solid" + ] + }, + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Solids" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Solid" + } + } + } + }, + { + "description": "Data for an imported geometry.", + "type": "object", + "required": [ + "__meta", + "id", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ImportedGeometry" + ] + }, + "id": { + "description": "The ID of the imported geometry.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The original file paths.", + "type": "array", + "items": { + "type": "string" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "memory", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Function" + ] + }, + "memory": { + "$ref": "#/components/schemas/ProgramMemory" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Module" + ] + }, + "value": { + "$ref": "#/components/schemas/ModuleId" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "KclNone" + ] + }, + "value": { + "$ref": "#/components/schemas/KclNone" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] }, "TagEngineInfo": { "description": "Engine information for a tag.", @@ -136428,7 +140216,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -136658,6 +140446,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -136686,6 +140475,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -136730,21 +140523,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -136758,6 +140539,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -137431,2069 +141222,6 @@ } ] }, - "FunctionExpression": { - "type": "object", - "required": [ - "body", - "end", - "params", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "params": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Parameter" - } - }, - "body": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Parameter": { - "description": "Parameter of a KCL function.", - "type": "object", - "required": [ - "identifier", - "optional" - ], - "properties": { - "identifier": { - "description": "The parameter's label or name.", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ] - }, - "optional": { - "description": "Is the parameter optional?", - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Identifier": { - "type": "object", - "required": [ - "end", - "name", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Program": { - "description": "A KCL program top level, or function body.", - "type": "object", - "required": [ - "body", - "end", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "body": { - "type": "array", - "items": { - "$ref": "#/components/schemas/BodyItem" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "BodyItem": { - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "items", - "path", - "raw_path", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ImportStatement" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ImportItem" - } - }, - "path": { - "type": "string" - }, - "raw_path": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "expression", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ExpressionStatement" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "expression": { - "$ref": "#/components/schemas/Expr" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "declarations", - "end", - "kind", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "VariableDeclaration" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "declarations": { - "type": "array", - "items": { - "$ref": "#/components/schemas/VariableDeclarator" - } - }, - "visibility": { - "$ref": "#/components/schemas/ItemVisibility" - }, - "kind": { - "$ref": "#/components/schemas/VariableKind" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ReturnStatement" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "argument": { - "$ref": "#/components/schemas/Expr" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "ImportItem": { - "type": "object", - "required": [ - "end", - "name", - "start" - ], - "properties": { - "name": { - "description": "Name of the item to import.", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ] - }, - "alias": { - "description": "Rename the item using an identifier after \"as\".", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ], - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "Expr": { - "description": "An expression can be evaluated to yield a single KCL value.", - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/LiteralValue" - }, - "raw": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TagDeclarator" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/BinaryOperator" - }, - "left": { - "$ref": "#/components/schemas/BinaryPart" - }, - "right": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "params", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "FunctionExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "params": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Parameter" - } - }, - "body": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "callee": { - "$ref": "#/components/schemas/Identifier" - }, - "arguments": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "optional": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "body": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeSubstitution" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "elements", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "elements": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "endElement", - "endInclusive", - "start", - "startElement", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayRangeExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "startElement": { - "$ref": "#/components/schemas/Expr" - }, - "endElement": { - "$ref": "#/components/schemas/Expr" - }, - "endInclusive": { - "description": "Is the `end_element` included in the range?", - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "properties", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ObjectExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "properties": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ObjectProperty" - } - }, - "nonCodeMeta": { - "$ref": "#/components/schemas/NonCodeMeta" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "object": { - "$ref": "#/components/schemas/MemberObject" - }, - "property": { - "$ref": "#/components/schemas/LiteralIdentifier" - }, - "computed": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/UnaryOperator" - }, - "argument": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "cond": { - "$ref": "#/components/schemas/Expr" - }, - "then_val": { - "$ref": "#/components/schemas/Program" - }, - "else_ifs": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ElseIf" - } - }, - "final_else": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "description": "KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application).", - "type": "object", - "required": [ - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "None" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - } - ] - }, - "LiteralValue": { - "anyOf": [ - { - "type": "integer", - "format": "int64" - }, - { - "type": "number", - "format": "double" - }, - { - "type": "string" - }, - { - "type": "boolean" - } - ] - }, - "BinaryOperator": { - "oneOf": [ - { - "description": "Add two numbers.", - "type": "string", - "enum": [ - "+" - ] - }, - { - "description": "Subtract two numbers.", - "type": "string", - "enum": [ - "-" - ] - }, - { - "description": "Multiply two numbers.", - "type": "string", - "enum": [ - "*" - ] - }, - { - "description": "Divide two numbers.", - "type": "string", - "enum": [ - "/" - ] - }, - { - "description": "Modulo two numbers.", - "type": "string", - "enum": [ - "%" - ] - }, - { - "description": "Raise a number to a power.", - "type": "string", - "enum": [ - "^" - ] - }, - { - "description": "Are two numbers equal?", - "type": "string", - "enum": [ - "==" - ] - }, - { - "description": "Are two numbers not equal?", - "type": "string", - "enum": [ - "!=" - ] - }, - { - "description": "Is left greater than right", - "type": "string", - "enum": [ - ">" - ] - }, - { - "description": "Is left greater than or equal to right", - "type": "string", - "enum": [ - ">=" - ] - }, - { - "description": "Is left less than right", - "type": "string", - "enum": [ - "<" - ] - }, - { - "description": "Is left less than or equal to right", - "type": "string", - "enum": [ - "<=" - ] - } - ] - }, - "BinaryPart": { - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/LiteralValue" - }, - "raw": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/BinaryOperator" - }, - "left": { - "$ref": "#/components/schemas/BinaryPart" - }, - "right": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "callee": { - "$ref": "#/components/schemas/Identifier" - }, - "arguments": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Expr" - } - }, - "optional": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "operator": { - "$ref": "#/components/schemas/UnaryOperator" - }, - "argument": { - "$ref": "#/components/schemas/BinaryPart" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "object": { - "$ref": "#/components/schemas/MemberObject" - }, - "property": { - "$ref": "#/components/schemas/LiteralIdentifier" - }, - "computed": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "cond": { - "$ref": "#/components/schemas/Expr" - }, - "then_val": { - "$ref": "#/components/schemas/Program" - }, - "else_ifs": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ElseIf" - } - }, - "final_else": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "UnaryOperator": { - "oneOf": [ - { - "description": "Negate a number.", - "type": "string", - "enum": [ - "-" - ] - }, - { - "description": "Negate a boolean.", - "type": "string", - "enum": [ - "!" - ] - } - ] - }, - "MemberObject": { - "oneOf": [ - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "object": { - "$ref": "#/components/schemas/MemberObject" - }, - "property": { - "$ref": "#/components/schemas/LiteralIdentifier" - }, - "computed": { - "type": "boolean" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "LiteralIdentifier": { - "oneOf": [ - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/LiteralValue" - }, - "raw": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - } - ] - }, - "ElseIf": { - "type": "object", - "required": [ - "cond", - "end", - "start", - "then_val" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "cond": { - "$ref": "#/components/schemas/Expr" - }, - "then_val": { - "$ref": "#/components/schemas/Program" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "NonCodeMeta": { - "type": "object", - "required": [ - "nonCodeNodes", - "start" - ], - "properties": { - "nonCodeNodes": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NonCodeNode" - } - } - }, - "start": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NonCodeNode" - } - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "NonCodeNode": { - "type": "object", - "required": [ - "end", - "start", - "value" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "$ref": "#/components/schemas/NonCodeValue" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "NonCodeValue": { - "oneOf": [ - { - "description": "A shebang. This is a special type of comment that is at the top of the file. It looks like this: ```python,no_run #!/usr/bin/env python ```", - "type": "object", - "required": [ - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "shebang" - ] - }, - "value": { - "type": "string" - } - } - }, - { - "description": "An inline comment. Here are examples: `1 + 1 // This is an inline comment`. `1 + 1 /* Here's another */`.", - "type": "object", - "required": [ - "style", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "inlineComment" - ] - }, - "value": { - "type": "string" - }, - "style": { - "$ref": "#/components/schemas/CommentStyle" - } - } - }, - { - "description": "A block comment. An example of this is the following: ```python,no_run /* This is a block comment */ 1 + 1 ``` Now this is important. The block comment is attached to the next line. This is always the case. Also the block comment doesn't have a new line above it. If it did it would be a `NewLineBlockComment`.", - "type": "object", - "required": [ - "style", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "blockComment" - ] - }, - "value": { - "type": "string" - }, - "style": { - "$ref": "#/components/schemas/CommentStyle" - } - } - }, - { - "description": "A block comment that has a new line above it. The user explicitly added a new line above the block comment.", - "type": "object", - "required": [ - "style", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "newLineBlockComment" - ] - }, - "value": { - "type": "string" - }, - "style": { - "$ref": "#/components/schemas/CommentStyle" - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "newLine" - ] - } - } - } - ] - }, - "CommentStyle": { - "oneOf": [ - { - "description": "Like // foo", - "type": "string", - "enum": [ - "line" - ] - }, - { - "description": "Like /* foo */", - "type": "string", - "enum": [ - "block" - ] - } - ] - }, - "ObjectProperty": { - "type": "object", - "required": [ - "end", - "key", - "start", - "value" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "key": { - "$ref": "#/components/schemas/Identifier" - }, - "value": { - "$ref": "#/components/schemas/Expr" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "VariableDeclarator": { - "type": "object", - "required": [ - "end", - "id", - "init", - "start" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "id": { - "description": "The identifier of the variable.", - "allOf": [ - { - "$ref": "#/components/schemas/Identifier" - } - ] - }, - "init": { - "description": "The value of the variable.", - "allOf": [ - { - "$ref": "#/components/schemas/Expr" - } - ] - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "ItemVisibility": { - "type": "string", - "enum": [ - "default", - "export" - ] - }, - "VariableKind": { - "oneOf": [ - { - "description": "Declare a named constant.", - "type": "string", - "enum": [ - "const" - ] - }, - { - "description": "Declare a function.", - "type": "string", - "enum": [ - "fn" - ] - } - ] - }, "ProgramMemory": { "type": "object", "required": [ @@ -139508,7 +141236,9 @@ } }, "currentEnv": { - "$ref": "#/components/schemas/EnvironmentRef" + "type": "integer", + "format": "uint", + "minimum": 0.0 }, "return": { "allOf": [ @@ -139533,15 +141263,9675 @@ } }, "parent": { - "allOf": [ - { - "$ref": "#/components/schemas/EnvironmentRef" - } - ], + "type": "integer", + "format": "uint", + "minimum": 0.0, "nullable": true } } }, + "ModuleId": { + "description": "Identifier of a source file. Uses a u32 to keep the size small.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "KclNone": { + "description": "KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application).", + "type": "object", + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + } + } + } + } + }, + "required": true, + "labelRequired": true + }, + "unpublished": false, + "deprecated": false, + "examples": [ + "arr = [1, 2, 3, 4]\nnew_arr = pop(arr)\nassertEqual(new_arr[0], 1, 0.00001, \"1 is the first element of the array\")\nassertEqual(new_arr[1], 2, 0.00001, \"2 is the second element of the array\")\nassertEqual(new_arr[2], 3, 0.00001, \"3 is the third element of the array\")" + ] + }, + { + "name": "pow", + "summary": "Compute the number to a power.", + "description": "", + "tags": [ + "math" + ], + "keywordArguments": false, + "args": [ + { + "name": "num", + "type": "number", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "double", + "type": "number", + "format": "double" + }, + "required": true, + "labelRequired": true + }, + { + "name": "pow", + "type": "number", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "double", + "type": "number", + "format": "double" + }, + "required": true, + "labelRequired": true + } + ], + "returnValue": { + "name": "", + "type": "number", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "double", + "type": "number", + "format": "double" + }, + "required": true, + "labelRequired": true + }, + "unpublished": false, + "deprecated": false, + "examples": [ + "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> angledLine({ angle = 50, length = pow(5, 2) }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" + ] + }, + { + "name": "profileStart", + "summary": "Extract the provided 2-dimensional sketch's profile's origin", + "description": "value.", + "tags": [], + "keywordArguments": false, + "args": [ + { + "name": "sketch", + "type": "Sketch", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Sketch", + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + }, + "definitions": { + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + } + } + }, + "required": true, + "labelRequired": true + } + ], + "returnValue": { + "name": "", + "type": "[number]", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Array_size_2_of_double", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "required": true, + "labelRequired": true + }, + "unpublished": false, + "deprecated": false, + "examples": [ + "sketch001 = startSketchOn('XY')\n |> startProfileAt([5, 2], %)\n |> angledLine({ angle = 120, length = 50 }, %, $seg01)\n |> angledLine({\n angle = segAng(seg01) + 120,\n length = 50\n }, %)\n |> lineTo(profileStart(%), %)\n |> close(%)\n |> extrude(20, %)" + ] + }, + { + "name": "profileStartX", + "summary": "Extract the provided 2-dimensional sketch's profile's origin's 'x'", + "description": "value.", + "tags": [], + "keywordArguments": false, + "args": [ + { + "name": "sketch", + "type": "Sketch", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Sketch", + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + }, + "definitions": { + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + } + } + }, + "required": true, + "labelRequired": true + } + ], + "returnValue": { + "name": "", + "type": "number", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "double", + "type": "number", + "format": "double" + }, + "required": true, + "labelRequired": true + }, + "unpublished": false, + "deprecated": false, + "examples": [ + "sketch001 = startSketchOn('XY')\n |> startProfileAt([5, 2], %)\n |> angledLine([-26.6, 50], %)\n |> angledLine([90, 50], %)\n |> angledLineToX({ angle = 30, to = profileStartX(%) }, %)" + ] + }, + { + "name": "profileStartY", + "summary": "Extract the provided 2-dimensional sketch's profile's origin's 'y'", + "description": "value.", + "tags": [], + "keywordArguments": false, + "args": [ + { + "name": "sketch", + "type": "Sketch", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Sketch", + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + }, + "definitions": { + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + } + } + }, + "required": true, + "labelRequired": true + } + ], + "returnValue": { + "name": "", + "type": "number", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "double", + "type": "number", + "format": "double" + }, + "required": true, + "labelRequired": true + }, + "unpublished": false, + "deprecated": false, + "examples": [ + "sketch001 = startSketchOn('XY')\n |> startProfileAt([5, 2], %)\n |> angledLine({ angle = -60, length = 14 }, %)\n |> angledLineToY({ angle = 30, to = profileStartY(%) }, %)" + ] + }, + { + "name": "push", + "summary": "Append an element to the end of an array.", + "description": "Returns a new array with the element appended.", + "tags": [], + "keywordArguments": false, + "args": [ + { + "name": "array", + "type": "[KclValue]", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Array_of_KclValue", + "type": "array", + "items": { + "$ref": "#/components/schemas/KclValue" + }, + "definitions": { + "KclValue": { + "description": "Any KCL value.", + "oneOf": [ + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Uuid" + ] + }, + "value": { + "type": "string", + "format": "uuid" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Bool" + ] + }, + "value": { + "type": "boolean" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Number" + ] + }, + "value": { + "type": "number", + "format": "double" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Int" + ] + }, + "value": { + "type": "integer", + "format": "int64" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "String" + ] + }, + "value": { + "type": "string" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Array" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Object" + ] + }, + "value": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagIdentifier" + ] + }, + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagDeclarator" + ] + }, + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketch" + ] + }, + "value": { + "$ref": "#/components/schemas/Sketch" + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketches" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Sketch" + } + } + } + }, + { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Solid" + ] + }, + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Solids" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Solid" + } + } + } + }, + { + "description": "Data for an imported geometry.", + "type": "object", + "required": [ + "__meta", + "id", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ImportedGeometry" + ] + }, + "id": { + "description": "The ID of the imported geometry.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The original file paths.", + "type": "array", + "items": { + "type": "string" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "memory", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Function" + ] + }, + "memory": { + "$ref": "#/components/schemas/ProgramMemory" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Module" + ] + }, + "value": { + "$ref": "#/components/schemas/ModuleId" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "KclNone" + ] + }, + "value": { + "$ref": "#/components/schemas/KclNone" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + }, + "ProgramMemory": { + "type": "object", + "required": [ + "currentEnv", + "environments" + ], + "properties": { + "environments": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Environment" + } + }, + "currentEnv": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "return": { + "allOf": [ + { + "$ref": "#/components/schemas/KclValue" + } + ], + "nullable": true + } + } + }, + "Environment": { + "type": "object", + "required": [ + "bindings" + ], + "properties": { + "bindings": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/KclValue" + } + }, + "parent": { + "type": "integer", + "format": "uint", + "minimum": 0.0, + "nullable": true + } + } + }, + "ModuleId": { + "description": "Identifier of a source file. Uses a u32 to keep the size small.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "KclNone": { + "description": "KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application).", + "type": "object", + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + } + } + } + } + }, + "required": true, + "labelRequired": true + }, + { + "name": "elem", + "type": "KclValue", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "KclValue", + "description": "Any KCL value.", + "oneOf": [ + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Uuid" + ] + }, + "value": { + "type": "string", + "format": "uuid" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Bool" + ] + }, + "value": { + "type": "boolean" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Number" + ] + }, + "value": { + "type": "number", + "format": "double" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Int" + ] + }, + "value": { + "type": "integer", + "format": "int64" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "String" + ] + }, + "value": { + "type": "string" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Array" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Object" + ] + }, + "value": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagIdentifier" + ] + }, + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagDeclarator" + ] + }, + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketch" + ] + }, + "value": { + "$ref": "#/components/schemas/Sketch" + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketches" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Sketch" + } + } + } + }, + { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Solid" + ] + }, + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Solids" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Solid" + } + } + } + }, + { + "description": "Data for an imported geometry.", + "type": "object", + "required": [ + "__meta", + "id", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ImportedGeometry" + ] + }, + "id": { + "description": "The ID of the imported geometry.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The original file paths.", + "type": "array", + "items": { + "type": "string" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "memory", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Function" + ] + }, + "memory": { + "$ref": "#/components/schemas/ProgramMemory" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Module" + ] + }, + "value": { + "$ref": "#/components/schemas/ModuleId" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "KclNone" + ] + }, + "value": { + "$ref": "#/components/schemas/KclNone" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ], + "definitions": { + "KclValue": { + "description": "Any KCL value.", + "oneOf": [ + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Uuid" + ] + }, + "value": { + "type": "string", + "format": "uuid" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Bool" + ] + }, + "value": { + "type": "boolean" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Number" + ] + }, + "value": { + "type": "number", + "format": "double" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Int" + ] + }, + "value": { + "type": "integer", + "format": "int64" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "String" + ] + }, + "value": { + "type": "string" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Array" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Object" + ] + }, + "value": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagIdentifier" + ] + }, + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagDeclarator" + ] + }, + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketch" + ] + }, + "value": { + "$ref": "#/components/schemas/Sketch" + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketches" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Sketch" + } + } + } + }, + { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Solid" + ] + }, + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Solids" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Solid" + } + } + } + }, + { + "description": "Data for an imported geometry.", + "type": "object", + "required": [ + "__meta", + "id", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ImportedGeometry" + ] + }, + "id": { + "description": "The ID of the imported geometry.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The original file paths.", + "type": "array", + "items": { + "type": "string" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "memory", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Function" + ] + }, + "memory": { + "$ref": "#/components/schemas/ProgramMemory" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Module" + ] + }, + "value": { + "$ref": "#/components/schemas/ModuleId" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "KclNone" + ] + }, + "value": { + "$ref": "#/components/schemas/KclNone" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + }, + "ProgramMemory": { + "type": "object", + "required": [ + "currentEnv", + "environments" + ], + "properties": { + "environments": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Environment" + } + }, + "currentEnv": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "return": { + "allOf": [ + { + "$ref": "#/components/schemas/KclValue" + } + ], + "nullable": true + } + } + }, + "Environment": { + "type": "object", + "required": [ + "bindings" + ], + "properties": { + "bindings": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/KclValue" + } + }, + "parent": { + "type": "integer", + "format": "uint", + "minimum": 0.0, + "nullable": true + } + } + }, + "ModuleId": { + "description": "Identifier of a source file. Uses a u32 to keep the size small.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "KclNone": { + "description": "KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application).", + "type": "object", + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + } + } + } + } + }, + "required": true, + "labelRequired": true + } + ], + "returnValue": { + "name": "", + "type": "KclValue", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "KclValue", + "description": "Any KCL value.", + "oneOf": [ + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Uuid" + ] + }, + "value": { + "type": "string", + "format": "uuid" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Bool" + ] + }, + "value": { + "type": "boolean" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Number" + ] + }, + "value": { + "type": "number", + "format": "double" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Int" + ] + }, + "value": { + "type": "integer", + "format": "int64" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "String" + ] + }, + "value": { + "type": "string" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Array" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Object" + ] + }, + "value": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagIdentifier" + ] + }, + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagDeclarator" + ] + }, + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketch" + ] + }, + "value": { + "$ref": "#/components/schemas/Sketch" + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketches" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Sketch" + } + } + } + }, + { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Solid" + ] + }, + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Solids" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Solid" + } + } + } + }, + { + "description": "Data for an imported geometry.", + "type": "object", + "required": [ + "__meta", + "id", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ImportedGeometry" + ] + }, + "id": { + "description": "The ID of the imported geometry.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The original file paths.", + "type": "array", + "items": { + "type": "string" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "memory", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Function" + ] + }, + "memory": { + "$ref": "#/components/schemas/ProgramMemory" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Module" + ] + }, + "value": { + "$ref": "#/components/schemas/ModuleId" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "KclNone" + ] + }, + "value": { + "$ref": "#/components/schemas/KclNone" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ], + "definitions": { + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, "KclValue": { "description": "Any KCL value.", "oneOf": [ @@ -139556,10 +150946,171 @@ "type": { "type": "string", "enum": [ - "UserVal" + "Uuid" ] }, - "value": {}, + "value": { + "type": "string", + "format": "uuid" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Bool" + ] + }, + "value": { + "type": "boolean" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Number" + ] + }, + "value": { + "type": "number", + "format": "double" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Int" + ] + }, + "value": { + "type": "integer", + "format": "int64" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "String" + ] + }, + "value": { + "type": "string" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Array" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Object" + ] + }, + "value": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/KclValue" + } + }, "__meta": { "type": "array", "items": { @@ -139604,8 +151155,6 @@ { "type": "object", "required": [ - "end", - "start", "type", "value" ], @@ -139616,16 +151165,6 @@ "TagDeclarator" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -139639,6 +151178,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -139779,6 +151328,45 @@ } } }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketch" + ] + }, + "value": { + "$ref": "#/components/schemas/Sketch" + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketches" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Sketch" + } + } + } + }, { "description": "An solid is a collection of extrude surfaces.", "type": "object", @@ -139911,7 +151499,6 @@ "type": "object", "required": [ "__meta", - "expression", "memory", "type" ], @@ -139922,9 +151509,6 @@ "Function" ] }, - "expression": { - "$ref": "#/components/schemas/FunctionExpression" - }, "memory": { "$ref": "#/components/schemas/ProgramMemory" }, @@ -139935,25 +151519,10831 @@ } } } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Module" + ] + }, + "value": { + "$ref": "#/components/schemas/ModuleId" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "KclNone" + ] + }, + "value": { + "$ref": "#/components/schemas/KclNone" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } } ] }, - "EnvironmentRef": { - "description": "An index pointing to an environment.", + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + }, + "ProgramMemory": { + "type": "object", + "required": [ + "currentEnv", + "environments" + ], + "properties": { + "environments": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Environment" + } + }, + "currentEnv": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "return": { + "allOf": [ + { + "$ref": "#/components/schemas/KclValue" + } + ], + "nullable": true + } + } + }, + "Environment": { + "type": "object", + "required": [ + "bindings" + ], + "properties": { + "bindings": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/KclValue" + } + }, + "parent": { + "type": "integer", + "format": "uint", + "minimum": 0.0, + "nullable": true + } + } + }, + "ModuleId": { + "description": "Identifier of a source file. Uses a u32 to keep the size small.", "type": "integer", - "format": "uint", + "format": "uint32", "minimum": 0.0 + }, + "KclNone": { + "description": "KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application).", + "type": "object", + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + } + } } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "fn decagon = (radius) => {\n step = 1 / 10 * tau()\n sketch001 = startSketchAt([cos(0) * radius, sin(0) * radius])\n return reduce([1..10], sketch001, (i, sg) => {\n x = cos(step * i) * radius\n y = sin(step * i) * radius\n return lineTo([x, y], sg)\n})\n}\ndecagon(5.0)\n |> close(%)", - "array = [1, 2, 3]\nsum = reduce(array, 0, (i, result_so_far) => {\n return i + result_so_far\n})\nassertEqual(sum, 6, 0.00001, \"1 + 2 + 3 summed is 6\")", - "fn add = (a, b) => {\n return a + b\n}\nfn sum = (array) => {\n return reduce(array, 0, add)\n}\nassertEqual(sum([1, 2, 3]), 6, 0.00001, \"1 + 2 + 3 summed is 6\")" + "arr = [1, 2, 3]\nnew_arr = push(arr, 4)\nassertEqual(new_arr[3], 4, 0.00001, \"4 was added to the end of the array\")" + ] + }, + { + "name": "reduce", + "summary": "Take a starting value. Then, for each element of an array, calculate the next value,", + "description": "using the previous value and the element.", + "tags": [], + "keywordArguments": false, + "args": [ + { + "name": "array", + "type": "[KclValue]", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Array_of_KclValue", + "type": "array", + "items": { + "$ref": "#/components/schemas/KclValue" + }, + "definitions": { + "KclValue": { + "description": "Any KCL value.", + "oneOf": [ + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Uuid" + ] + }, + "value": { + "type": "string", + "format": "uuid" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Bool" + ] + }, + "value": { + "type": "boolean" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Number" + ] + }, + "value": { + "type": "number", + "format": "double" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Int" + ] + }, + "value": { + "type": "integer", + "format": "int64" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "String" + ] + }, + "value": { + "type": "string" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Array" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Object" + ] + }, + "value": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagIdentifier" + ] + }, + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagDeclarator" + ] + }, + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketch" + ] + }, + "value": { + "$ref": "#/components/schemas/Sketch" + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketches" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Sketch" + } + } + } + }, + { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Solid" + ] + }, + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Solids" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Solid" + } + } + } + }, + { + "description": "Data for an imported geometry.", + "type": "object", + "required": [ + "__meta", + "id", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ImportedGeometry" + ] + }, + "id": { + "description": "The ID of the imported geometry.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The original file paths.", + "type": "array", + "items": { + "type": "string" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "memory", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Function" + ] + }, + "memory": { + "$ref": "#/components/schemas/ProgramMemory" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Module" + ] + }, + "value": { + "$ref": "#/components/schemas/ModuleId" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "KclNone" + ] + }, + "value": { + "$ref": "#/components/schemas/KclNone" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + }, + "ProgramMemory": { + "type": "object", + "required": [ + "currentEnv", + "environments" + ], + "properties": { + "environments": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Environment" + } + }, + "currentEnv": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "return": { + "allOf": [ + { + "$ref": "#/components/schemas/KclValue" + } + ], + "nullable": true + } + } + }, + "Environment": { + "type": "object", + "required": [ + "bindings" + ], + "properties": { + "bindings": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/KclValue" + } + }, + "parent": { + "type": "integer", + "format": "uint", + "minimum": 0.0, + "nullable": true + } + } + }, + "ModuleId": { + "description": "Identifier of a source file. Uses a u32 to keep the size small.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "KclNone": { + "description": "KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application).", + "type": "object", + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + } + } + } + } + }, + "required": true, + "labelRequired": true + }, + { + "name": "start", + "type": "KclValue", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "KclValue", + "description": "Any KCL value.", + "oneOf": [ + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Uuid" + ] + }, + "value": { + "type": "string", + "format": "uuid" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Bool" + ] + }, + "value": { + "type": "boolean" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Number" + ] + }, + "value": { + "type": "number", + "format": "double" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Int" + ] + }, + "value": { + "type": "integer", + "format": "int64" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "String" + ] + }, + "value": { + "type": "string" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Array" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Object" + ] + }, + "value": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagIdentifier" + ] + }, + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagDeclarator" + ] + }, + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketch" + ] + }, + "value": { + "$ref": "#/components/schemas/Sketch" + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketches" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Sketch" + } + } + } + }, + { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Solid" + ] + }, + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Solids" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Solid" + } + } + } + }, + { + "description": "Data for an imported geometry.", + "type": "object", + "required": [ + "__meta", + "id", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ImportedGeometry" + ] + }, + "id": { + "description": "The ID of the imported geometry.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The original file paths.", + "type": "array", + "items": { + "type": "string" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "memory", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Function" + ] + }, + "memory": { + "$ref": "#/components/schemas/ProgramMemory" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Module" + ] + }, + "value": { + "$ref": "#/components/schemas/ModuleId" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "KclNone" + ] + }, + "value": { + "$ref": "#/components/schemas/KclNone" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ], + "definitions": { + "KclValue": { + "description": "Any KCL value.", + "oneOf": [ + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Uuid" + ] + }, + "value": { + "type": "string", + "format": "uuid" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Bool" + ] + }, + "value": { + "type": "boolean" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Number" + ] + }, + "value": { + "type": "number", + "format": "double" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Int" + ] + }, + "value": { + "type": "integer", + "format": "int64" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "String" + ] + }, + "value": { + "type": "string" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Array" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Object" + ] + }, + "value": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagIdentifier" + ] + }, + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagDeclarator" + ] + }, + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketch" + ] + }, + "value": { + "$ref": "#/components/schemas/Sketch" + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketches" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Sketch" + } + } + } + }, + { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Solid" + ] + }, + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Solids" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Solid" + } + } + } + }, + { + "description": "Data for an imported geometry.", + "type": "object", + "required": [ + "__meta", + "id", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ImportedGeometry" + ] + }, + "id": { + "description": "The ID of the imported geometry.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The original file paths.", + "type": "array", + "items": { + "type": "string" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "memory", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Function" + ] + }, + "memory": { + "$ref": "#/components/schemas/ProgramMemory" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Module" + ] + }, + "value": { + "$ref": "#/components/schemas/ModuleId" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "KclNone" + ] + }, + "value": { + "$ref": "#/components/schemas/KclNone" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + }, + "ProgramMemory": { + "type": "object", + "required": [ + "currentEnv", + "environments" + ], + "properties": { + "environments": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Environment" + } + }, + "currentEnv": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "return": { + "allOf": [ + { + "$ref": "#/components/schemas/KclValue" + } + ], + "nullable": true + } + } + }, + "Environment": { + "type": "object", + "required": [ + "bindings" + ], + "properties": { + "bindings": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/KclValue" + } + }, + "parent": { + "type": "integer", + "format": "uint", + "minimum": 0.0, + "nullable": true + } + } + }, + "ModuleId": { + "description": "Identifier of a source file. Uses a u32 to keep the size small.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "KclNone": { + "description": "KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application).", + "type": "object", + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + } + } + } + } + }, + "required": true, + "labelRequired": true + }, + { + "name": "reduce_fn", + "type": "FunctionParam", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "FunctionParam", + "type": "null", + "definitions": { + "KclValue": { + "description": "Any KCL value.", + "oneOf": [ + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Uuid" + ] + }, + "value": { + "type": "string", + "format": "uuid" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Bool" + ] + }, + "value": { + "type": "boolean" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Number" + ] + }, + "value": { + "type": "number", + "format": "double" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Int" + ] + }, + "value": { + "type": "integer", + "format": "int64" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "String" + ] + }, + "value": { + "type": "string" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Array" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Object" + ] + }, + "value": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagIdentifier" + ] + }, + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagDeclarator" + ] + }, + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketch" + ] + }, + "value": { + "$ref": "#/components/schemas/Sketch" + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketches" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Sketch" + } + } + } + }, + { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Solid" + ] + }, + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Solids" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Solid" + } + } + } + }, + { + "description": "Data for an imported geometry.", + "type": "object", + "required": [ + "__meta", + "id", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ImportedGeometry" + ] + }, + "id": { + "description": "The ID of the imported geometry.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The original file paths.", + "type": "array", + "items": { + "type": "string" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "memory", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Function" + ] + }, + "memory": { + "$ref": "#/components/schemas/ProgramMemory" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Module" + ] + }, + "value": { + "$ref": "#/components/schemas/ModuleId" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "KclNone" + ] + }, + "value": { + "$ref": "#/components/schemas/KclNone" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + }, + "ProgramMemory": { + "type": "object", + "required": [ + "currentEnv", + "environments" + ], + "properties": { + "environments": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Environment" + } + }, + "currentEnv": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "return": { + "allOf": [ + { + "$ref": "#/components/schemas/KclValue" + } + ], + "nullable": true + } + } + }, + "Environment": { + "type": "object", + "required": [ + "bindings" + ], + "properties": { + "bindings": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/KclValue" + } + }, + "parent": { + "type": "integer", + "format": "uint", + "minimum": 0.0, + "nullable": true + } + } + }, + "ModuleId": { + "description": "Identifier of a source file. Uses a u32 to keep the size small.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "KclNone": { + "description": "KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application).", + "type": "object", + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + } + } + } + } + }, + "required": true, + "labelRequired": true + } + ], + "returnValue": { + "name": "", + "type": "KclValue", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "KclValue", + "description": "Any KCL value.", + "oneOf": [ + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Uuid" + ] + }, + "value": { + "type": "string", + "format": "uuid" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Bool" + ] + }, + "value": { + "type": "boolean" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Number" + ] + }, + "value": { + "type": "number", + "format": "double" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Int" + ] + }, + "value": { + "type": "integer", + "format": "int64" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "String" + ] + }, + "value": { + "type": "string" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Array" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Object" + ] + }, + "value": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagIdentifier" + ] + }, + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagDeclarator" + ] + }, + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketch" + ] + }, + "value": { + "$ref": "#/components/schemas/Sketch" + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketches" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Sketch" + } + } + } + }, + { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Solid" + ] + }, + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Solids" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Solid" + } + } + } + }, + { + "description": "Data for an imported geometry.", + "type": "object", + "required": [ + "__meta", + "id", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ImportedGeometry" + ] + }, + "id": { + "description": "The ID of the imported geometry.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The original file paths.", + "type": "array", + "items": { + "type": "string" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "memory", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Function" + ] + }, + "memory": { + "$ref": "#/components/schemas/ProgramMemory" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Module" + ] + }, + "value": { + "$ref": "#/components/schemas/ModuleId" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "KclNone" + ] + }, + "value": { + "$ref": "#/components/schemas/KclNone" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ], + "definitions": { + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "KclValue": { + "description": "Any KCL value.", + "oneOf": [ + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Uuid" + ] + }, + "value": { + "type": "string", + "format": "uuid" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Bool" + ] + }, + "value": { + "type": "boolean" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Number" + ] + }, + "value": { + "type": "number", + "format": "double" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Int" + ] + }, + "value": { + "type": "integer", + "format": "int64" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "String" + ] + }, + "value": { + "type": "string" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Array" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Object" + ] + }, + "value": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/KclValue" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagIdentifier" + ] + }, + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagDeclarator" + ] + }, + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketch" + ] + }, + "value": { + "$ref": "#/components/schemas/Sketch" + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Sketches" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Sketch" + } + } + } + }, + { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Solid" + ] + }, + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Solids" + ] + }, + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Solid" + } + } + } + }, + { + "description": "Data for an imported geometry.", + "type": "object", + "required": [ + "__meta", + "id", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ImportedGeometry" + ] + }, + "id": { + "description": "The ID of the imported geometry.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The original file paths.", + "type": "array", + "items": { + "type": "string" + } + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "memory", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Function" + ] + }, + "memory": { + "$ref": "#/components/schemas/ProgramMemory" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Module" + ] + }, + "value": { + "$ref": "#/components/schemas/ModuleId" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "type": "object", + "required": [ + "__meta", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "KclNone" + ] + }, + "value": { + "$ref": "#/components/schemas/KclNone" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + }, + "ProgramMemory": { + "type": "object", + "required": [ + "currentEnv", + "environments" + ], + "properties": { + "environments": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Environment" + } + }, + "currentEnv": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "return": { + "allOf": [ + { + "$ref": "#/components/schemas/KclValue" + } + ], + "nullable": true + } + } + }, + "Environment": { + "type": "object", + "required": [ + "bindings" + ], + "properties": { + "bindings": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/KclValue" + } + }, + "parent": { + "type": "integer", + "format": "uint", + "minimum": 0.0, + "nullable": true + } + } + }, + "ModuleId": { + "description": "Identifier of a source file. Uses a u32 to keep the size small.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "KclNone": { + "description": "KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application).", + "type": "object", + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + } + } + } + } + }, + "required": true, + "labelRequired": true + }, + "unpublished": false, + "deprecated": false, + "examples": [ + "// This function adds two numbers.\nfn add(a, b) {\n return a + b\n}\n\n// This function adds an array of numbers.\n// It uses the `reduce` function, to call the `add` function on every\n// element of the `arr` parameter. The starting value is 0.\nfn sum(arr) {\n return reduce(arr, 0, add)\n}\n\n/* The above is basically like this pseudo-code:\nfn sum(arr):\n sumSoFar = 0\n for i in arr:\n sumSoFar = add(sumSoFar, i)\n return sumSoFar */\n\n\n// We use `assertEqual` to check that our `sum` function gives the\n// expected result. It's good to check your work!\nassertEqual(sum([1, 2, 3]), 6, 0.00001, \"1 + 2 + 3 summed is 6\")", + "// This example works just like the previous example above, but it uses\n// an anonymous `add` function as its parameter, instead of declaring a\n// named function outside.\narr = [1, 2, 3]\nsum = reduce(arr, 0, fn(i, result_so_far) {\n return i + result_so_far\n})\n\n// We use `assertEqual` to check that our `sum` function gives the\n// expected result. It's good to check your work!\nassertEqual(sum, 6, 0.00001, \"1 + 2 + 3 summed is 6\")", + "// Declare a function that sketches a decagon.\nfn decagon(radius) {\n // Each side of the decagon is turned this many degrees from the previous angle.\n stepAngle = 1 / 10 * tau()\n\n // Start the decagon sketch at this point.\n startOfDecagonSketch = startSketchOn('XY')\n |> startProfileAt([cos(0) * radius, sin(0) * radius], %)\n\n // Use a `reduce` to draw the remaining decagon sides.\n // For each number in the array 1..10, run the given function,\n // which takes a partially-sketched decagon and adds one more edge to it.\n fullDecagon = reduce([1..10], startOfDecagonSketch, fn(i, partialDecagon) {\n // Draw one edge of the decagon.\n x = cos(stepAngle * i) * radius\n y = sin(stepAngle * i) * radius\n return lineTo([x, y], partialDecagon)\n })\n\n return fullDecagon\n}\n\n/* The `decagon` above is basically like this pseudo-code:\nfn decagon(radius):\n stepAngle = (1/10) * tau()\n plane = startSketchOn('XY')\n startOfDecagonSketch = startProfileAt([(cos(0)*radius), (sin(0) * radius)], plane)\n\n // Here's the reduce part.\n partialDecagon = startOfDecagonSketch\n for i in [1..10]:\n x = cos(stepAngle * i) * radius\n y = sin(stepAngle * i) * radius\n partialDecagon = lineTo([x, y], partialDecagon)\n fullDecagon = partialDecagon // it's now full\n return fullDecagon */\n\n\n// Use the `decagon` function declared above, to sketch a decagon with radius 5.\ndecagon(5.0)\n |> close(%)" ] }, { @@ -139963,45 +162353,51 @@ "tags": [ "math" ], + "keywordArguments": true, "args": [ { "name": "num", - "type": "i64", + "type": "number", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "int64", - "type": "integer", - "format": "int64" + "title": "double", + "type": "number", + "format": "double" }, - "required": true + "required": true, + "description": "The number which will be divided by `divisor`.", + "labelRequired": false }, { "name": "divisor", - "type": "i64", + "type": "number", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "int64", - "type": "integer", - "format": "int64" + "title": "double", + "type": "number", + "format": "double" }, - "required": true + "required": true, + "description": "The number which will divide `num`.", + "labelRequired": true } ], "returnValue": { "name": "", - "type": "i64", + "type": "number", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "int64", - "type": "integer", - "format": "int64" + "title": "double", + "type": "number", + "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "assertEqual(rem(int(7), int(4)), 3, 0.01, \"remainder is 3\")\nassertEqual(rem(int(-7), int(4)), -3, 0.01, \"remainder is 3\")\nassertEqual(rem(int(7), int(-4)), 3, 0.01, \"remainder is 3\")" + "assertEqual(rem(7, divisor = 4), 3, 0.01, \"remainder is 3\")\nassertEqual(rem(-7, divisor = 4), -3, 0.01, \"remainder is -3\")\nassertEqual(rem(7, divisor = -4), 3, 0.01, \"remainder is 3\")\nassertEqual(rem(6, divisor = 2.5), 1, 0.01, \"remainder is 1\")\nassertEqual(rem(6.5, divisor = 2.5), 1.5, 0.01, \"remainder is 1.5\")\nassertEqual(rem(6.5, divisor = 2), 0.5, 0.01, \"remainder is 0.5\")" ] }, { @@ -140009,6 +162405,7 @@ "summary": "Rotate a sketch around some provided axis, creating a solid from its extent.", "description": "This, like extrude, is able to create a 3-dimensional solid from a 2-dimensional sketch. However, unlike extrude, this creates a solid by using the extent of the sketch as its revolved around an axis rather than using the extent of the sketch linearly translated through a third dimension.\n\nRevolve occurs around a local sketch axis rather than a global axis.", "tags": [], + "keywordArguments": false, "args": [ { "name": "data", @@ -140457,7 +162854,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -140687,6 +163084,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -140715,6 +163113,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -140759,21 +163161,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -140787,6 +163177,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -140820,8 +163220,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -141027,7 +163427,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch", @@ -141498,7 +163899,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -141728,6 +164129,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -141756,6 +164158,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -141800,21 +164206,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -141828,6 +164222,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -141861,8 +164265,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -142504,7 +164908,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -142764,21 +165169,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -142792,6 +165185,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -142802,8 +165205,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "Sketch": { "description": "A sketch is a collection of paths.", @@ -143095,7 +165498,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -143325,6 +165728,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -143353,6 +165757,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -143881,19 +166289,60 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "part001 = startSketchOn('XY')\n |> startProfileAt([4, 12], %)\n |> line([2, 0], %)\n |> line([0, -6], %)\n |> line([4, -6], %)\n |> line([0, -6], %)\n |> line([-3.75, -4.5], %)\n |> line([0, -5.5], %)\n |> line([-2, 0], %)\n |> close(%)\n |> revolve({ axis: 'y' }, %) // default angle is 360", - "// A donut shape.\nsketch001 = startSketchOn('XY')\n |> circle({ center: [15, 0], radius: 5 }, %)\n |> revolve({ angle: 360, axis: 'y' }, %)", - "part001 = startSketchOn('XY')\n |> startProfileAt([4, 12], %)\n |> line([2, 0], %)\n |> line([0, -6], %)\n |> line([4, -6], %)\n |> line([0, -6], %)\n |> line([-3.75, -4.5], %)\n |> line([0, -5.5], %)\n |> line([-2, 0], %)\n |> close(%)\n |> revolve({ axis: 'y', angle: 180 }, %)", - "part001 = startSketchOn('XY')\n |> startProfileAt([4, 12], %)\n |> line([2, 0], %)\n |> line([0, -6], %)\n |> line([4, -6], %)\n |> line([0, -6], %)\n |> line([-3.75, -4.5], %)\n |> line([0, -5.5], %)\n |> line([-2, 0], %)\n |> close(%)\n |> revolve({ axis: 'y', angle: 180 }, %)\npart002 = startSketchOn(part001, 'end')\n |> startProfileAt([4.5, -5], %)\n |> line([0, 5], %)\n |> line([5, 0], %)\n |> line([0, -5], %)\n |> close(%)\n |> extrude(5, %)", - "box = startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> line([0, 20], %)\n |> line([20, 0], %)\n |> line([0, -20], %)\n |> close(%)\n |> extrude(20, %)\n\nsketch001 = startSketchOn(box, \"END\")\n |> circle({ center: [10, 10], radius: 4 }, %)\n |> revolve({ angle: -90, axis: 'y' }, %)", - "box = startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> line([0, 20], %)\n |> line([20, 0], %)\n |> line([0, -20], %, $revolveAxis)\n |> close(%)\n |> extrude(20, %)\n\nsketch001 = startSketchOn(box, \"END\")\n |> circle({ center: [10, 10], radius: 4 }, %)\n |> revolve({\n angle: 90,\n axis: getOppositeEdge(revolveAxis)\n }, %)", - "box = startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> line([0, 20], %)\n |> line([20, 0], %)\n |> line([0, -20], %, $revolveAxis)\n |> close(%)\n |> extrude(20, %)\n\nsketch001 = startSketchOn(box, \"END\")\n |> circle({ center: [10, 10], radius: 4 }, %)\n |> revolve({\n angle: 90,\n axis: getOppositeEdge(revolveAxis),\n tolerance: 0.0001\n }, %)", - "sketch001 = startSketchOn('XY')\n |> startProfileAt([10, 0], %)\n |> line([5, -5], %)\n |> line([5, 5], %)\n |> lineTo([profileStartX(%), profileStartY(%)], %)\n |> close(%)\n\npart001 = revolve({\n axis: {\n custom: { axis: [0.0, 1.0], origin: [0.0, 0.0] }\n }\n}, sketch001)" + "part001 = startSketchOn('XY')\n |> startProfileAt([4, 12], %)\n |> line([2, 0], %)\n |> line([0, -6], %)\n |> line([4, -6], %)\n |> line([0, -6], %)\n |> line([-3.75, -4.5], %)\n |> line([0, -5.5], %)\n |> line([-2, 0], %)\n |> close(%)\n |> revolve({ axis = 'y' }, %) // default angle is 360", + "// A donut shape.\nsketch001 = startSketchOn('XY')\n |> circle({ center = [15, 0], radius = 5 }, %)\n |> revolve({ angle = 360, axis = 'y' }, %)", + "part001 = startSketchOn('XY')\n |> startProfileAt([4, 12], %)\n |> line([2, 0], %)\n |> line([0, -6], %)\n |> line([4, -6], %)\n |> line([0, -6], %)\n |> line([-3.75, -4.5], %)\n |> line([0, -5.5], %)\n |> line([-2, 0], %)\n |> close(%)\n |> revolve({ axis = 'y', angle = 180 }, %)", + "part001 = startSketchOn('XY')\n |> startProfileAt([4, 12], %)\n |> line([2, 0], %)\n |> line([0, -6], %)\n |> line([4, -6], %)\n |> line([0, -6], %)\n |> line([-3.75, -4.5], %)\n |> line([0, -5.5], %)\n |> line([-2, 0], %)\n |> close(%)\n |> revolve({ axis = 'y', angle = 180 }, %)\npart002 = startSketchOn(part001, 'end')\n |> startProfileAt([4.5, -5], %)\n |> line([0, 5], %)\n |> line([5, 0], %)\n |> line([0, -5], %)\n |> close(%)\n |> extrude(5, %)", + "box = startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> line([0, 20], %)\n |> line([20, 0], %)\n |> line([0, -20], %)\n |> close(%)\n |> extrude(20, %)\n\nsketch001 = startSketchOn(box, \"END\")\n |> circle({ center = [10, 10], radius = 4 }, %)\n |> revolve({ angle = -90, axis = 'y' }, %)", + "box = startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> line([0, 20], %)\n |> line([20, 0], %)\n |> line([0, -20], %, $revolveAxis)\n |> close(%)\n |> extrude(20, %)\n\nsketch001 = startSketchOn(box, \"END\")\n |> circle({ center = [10, 10], radius = 4 }, %)\n |> revolve({\n angle = 90,\n axis = getOppositeEdge(revolveAxis)\n }, %)", + "box = startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> line([0, 20], %)\n |> line([20, 0], %)\n |> line([0, -20], %, $revolveAxis)\n |> close(%)\n |> extrude(20, %)\n\nsketch001 = startSketchOn(box, \"END\")\n |> circle({ center = [10, 10], radius = 4 }, %)\n |> revolve({\n angle = 90,\n axis = getOppositeEdge(revolveAxis),\n tolerance = 0.0001\n }, %)", + "sketch001 = startSketchOn('XY')\n |> startProfileAt([10, 0], %)\n |> line([5, -5], %)\n |> line([5, 5], %)\n |> lineTo([profileStartX(%), profileStartY(%)], %)\n |> close(%)\n\npart001 = revolve({\n axis = {\n custom = {\n axis = [0.0, 1.0],\n origin = [0.0, 0.0]\n }\n }\n}, sketch001)" + ] + }, + { + "name": "round", + "summary": "Round a number to the nearest integer.", + "description": "", + "tags": [ + "math" + ], + "keywordArguments": false, + "args": [ + { + "name": "num", + "type": "number", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "double", + "type": "number", + "format": "double" + }, + "required": true, + "labelRequired": true + } + ], + "returnValue": { + "name": "", + "type": "number", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "double", + "type": "number", + "format": "double" + }, + "required": true, + "labelRequired": true + }, + "unpublished": false, + "deprecated": false, + "examples": [ + "sketch001 = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> lineTo([12, 10], %)\n |> line([round(7.02986), 0], %)\n |> yLineTo(0, %)\n |> close(%)\n\nextrude001 = extrude(5, sketch001)" ] }, { @@ -143901,6 +166350,7 @@ "summary": "Compute the angle (in degrees) of the provided line segment.", "description": "", "tags": [], + "keywordArguments": false, "args": [ { "name": "tag", @@ -144206,7 +166656,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -144436,6 +166886,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -144464,6 +166915,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -144508,21 +166963,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -144536,6 +166979,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -144569,8 +167022,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -144776,7 +167229,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -144788,7 +167242,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -144797,10 +167252,11 @@ ] }, { - "name": "segEndX", - "summary": "Compute the ending point of the provided line segment along the 'x' axis.", + "name": "segEnd", + "summary": "Compute the ending point of the provided line segment.", "description": "", "tags": [], + "keywordArguments": false, "args": [ { "name": "tag", @@ -145106,7 +167562,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -145336,6 +167792,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -145364,6 +167821,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -145408,21 +167869,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -145436,6 +167885,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -145469,8 +167928,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -145676,7 +168135,919 @@ } } }, - "required": true + "required": true, + "labelRequired": true + } + ], + "returnValue": { + "name": "", + "type": "[number]", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Array_size_2_of_double", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "required": true, + "labelRequired": true + }, + "unpublished": false, + "deprecated": false, + "examples": [ + "w = 15\ncube = startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> line([w, 0], %, $line1)\n |> line([0, w], %, $line2)\n |> line([-w, 0], %, $line3)\n |> line([0, -w], %, $line4)\n |> close(%)\n |> extrude(5, %)\n\nfn cylinder(radius, tag) {\n return startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> circle({\n radius = radius,\n center = segEnd(tag)\n }, %)\n |> extrude(radius, %)\n}\n\ncylinder(1, line1)\ncylinder(2, line2)\ncylinder(3, line3)\ncylinder(4, line4)" + ] + }, + { + "name": "segEndX", + "summary": "Compute the ending point of the provided line segment along the 'x' axis.", + "description": "", + "tags": [], + "keywordArguments": false, + "args": [ + { + "name": "tag", + "type": "TagIdentifier", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "TagIdentifier", + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + }, + "definitions": { + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + } + }, + "required": true, + "labelRequired": true } ], "returnValue": { @@ -145688,7 +169059,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -145701,6 +169073,7 @@ "summary": "Compute the ending point of the provided line segment along the 'y' axis.", "description": "", "tags": [], + "keywordArguments": false, "args": [ { "name": "tag", @@ -146006,7 +169379,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -146236,6 +169609,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -146264,6 +169638,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -146308,21 +169686,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -146336,6 +169702,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -146369,8 +169745,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -146576,7 +169952,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -146588,7 +169965,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -146601,6 +169979,7 @@ "summary": "Compute the length of the provided line segment.", "description": "", "tags": [], + "keywordArguments": false, "args": [ { "name": "tag", @@ -146906,7 +170285,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -147136,6 +170515,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -147164,6 +170544,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -147208,21 +170592,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -147236,6 +170608,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -147269,8 +170651,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -147476,7 +170858,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -147488,12 +170871,2736 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> angledLine({ angle: 60, length: 10 }, %, $thing)\n |> tangentialArc({ offset: -120, radius: 5 }, %)\n |> angledLine({ angle: -60, length: segLen(thing) }, %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" + "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> angledLine({ angle = 60, length = 10 }, %, $thing)\n |> tangentialArc({ offset = -120, radius = 5 }, %)\n |> angledLine({ angle = -60, length = segLen(thing) }, %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" + ] + }, + { + "name": "segStart", + "summary": "Compute the starting point of the provided line segment.", + "description": "", + "tags": [], + "keywordArguments": false, + "args": [ + { + "name": "tag", + "type": "TagIdentifier", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "TagIdentifier", + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + }, + "definitions": { + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + } + }, + "required": true, + "labelRequired": true + } + ], + "returnValue": { + "name": "", + "type": "[number]", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Array_size_2_of_double", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "required": true, + "labelRequired": true + }, + "unpublished": false, + "deprecated": false, + "examples": [ + "w = 15\ncube = startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> line([w, 0], %, $line1)\n |> line([0, w], %, $line2)\n |> line([-w, 0], %, $line3)\n |> line([0, -w], %, $line4)\n |> close(%)\n |> extrude(5, %)\n\nfn cylinder(radius, tag) {\n return startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> circle({\n radius = radius,\n center = segStart(tag)\n }, %)\n |> extrude(radius, %)\n}\n\ncylinder(1, line1)\ncylinder(2, line2)\ncylinder(3, line3)\ncylinder(4, line4)" + ] + }, + { + "name": "segStartX", + "summary": "Compute the starting point of the provided line segment along the 'x' axis.", + "description": "", + "tags": [], + "keywordArguments": false, + "args": [ + { + "name": "tag", + "type": "TagIdentifier", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "TagIdentifier", + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + }, + "definitions": { + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + } + }, + "required": true, + "labelRequired": true + } + ], + "returnValue": { + "name": "", + "type": "number", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "double", + "type": "number", + "format": "double" + }, + "required": true, + "labelRequired": true + }, + "unpublished": false, + "deprecated": false, + "examples": [ + "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([20, 0], %, $thing)\n |> line([0, 5], %)\n |> line([20 - segStartX(thing), 0], %)\n |> line([-20, 10], %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" + ] + }, + { + "name": "segStartY", + "summary": "Compute the starting point of the provided line segment along the 'y' axis.", + "description": "", + "tags": [], + "keywordArguments": false, + "args": [ + { + "name": "tag", + "type": "TagIdentifier", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "TagIdentifier", + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + }, + "definitions": { + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + } + }, + "required": true, + "labelRequired": true + } + ], + "returnValue": { + "name": "", + "type": "number", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "double", + "type": "number", + "format": "double" + }, + "required": true, + "labelRequired": true + }, + "unpublished": false, + "deprecated": false, + "examples": [ + "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([20, 0], %)\n |> line([0, 3], %, $thing)\n |> line([-10, 0], %)\n |> line([0, 20 - segStartY(thing)], %)\n |> line([-10, 0], %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" ] }, { @@ -147501,6 +173608,7 @@ "summary": "Remove volume from a 3-dimensional shape such that a wall of the", "description": "provided thickness remains, taking volume starting at the provided face, leaving it open in that direction.", "tags": [], + "keywordArguments": false, "args": [ { "name": "data", @@ -147862,7 +173970,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -148092,6 +174200,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -148120,6 +174229,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -148164,21 +174277,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -148192,6 +174293,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -148225,8 +174336,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -148432,7 +174543,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "solid_set", @@ -148868,7 +174980,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -149098,6 +175210,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -149126,6 +175239,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -149170,21 +175287,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -149198,6 +175303,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -149231,8 +175346,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "ExtrudeSurface": { "description": "An extrude surface.", @@ -149874,7 +175989,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -150166,21 +176282,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -150194,6 +176298,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -150204,8 +176318,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "Sketch": { "description": "A sketch is a collection of paths.", @@ -150497,7 +176611,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -150727,6 +176841,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -150755,6 +176870,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -151283,18 +177402,19 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "// Remove the end face for the extrusion.\nfirstSketch = startSketchOn('XY')\n |> startProfileAt([-12, 12], %)\n |> line([24, 0], %)\n |> line([0, -24], %)\n |> line([-24, 0], %)\n |> close(%)\n |> extrude(6, %)\n\n// Remove the end face for the extrusion.\nshell({ faces: ['end'], thickness: 0.25 }, firstSketch)", - "// Remove the start face for the extrusion.\nfirstSketch = startSketchOn('-XZ')\n |> startProfileAt([-12, 12], %)\n |> line([24, 0], %)\n |> line([0, -24], %)\n |> line([-24, 0], %)\n |> close(%)\n |> extrude(6, %)\n\n// Remove the start face for the extrusion.\nshell({ faces: ['start'], thickness: 0.25 }, firstSketch)", - "// Remove a tagged face and the end face for the extrusion.\nfirstSketch = startSketchOn('XY')\n |> startProfileAt([-12, 12], %)\n |> line([24, 0], %)\n |> line([0, -24], %)\n |> line([-24, 0], %, $myTag)\n |> close(%)\n |> extrude(6, %)\n\n// Remove a tagged face for the extrusion.\nshell({ faces: [myTag], thickness: 0.25 }, firstSketch)", - "// Remove multiple faces at once.\nfirstSketch = startSketchOn('XY')\n |> startProfileAt([-12, 12], %)\n |> line([24, 0], %)\n |> line([0, -24], %)\n |> line([-24, 0], %, $myTag)\n |> close(%)\n |> extrude(6, %)\n\n// Remove a tagged face and the end face for the extrusion.\nshell({\n faces: [myTag, 'end'],\n thickness: 0.25\n}, firstSketch)", - "// Shell a sketch on face.\nsize = 100\ncase = startSketchOn('-XZ')\n |> startProfileAt([-size, -size], %)\n |> line([2 * size, 0], %)\n |> line([0, 2 * size], %)\n |> tangentialArcTo([-size, size], %)\n |> close(%)\n |> extrude(65, %)\n\nthing1 = startSketchOn(case, 'end')\n |> circle({\n center: [-size / 2, -size / 2],\n radius: 25\n }, %)\n |> extrude(50, %)\n\nthing2 = startSketchOn(case, 'end')\n |> circle({\n center: [size / 2, -size / 2],\n radius: 25\n }, %)\n |> extrude(50, %)\n\n// We put \"case\" in the shell function to shell the entire object.\nshell({ faces: ['start'], thickness: 5 }, case)", - "// Shell a sketch on face object on the end face.\nsize = 100\ncase = startSketchOn('XY')\n |> startProfileAt([-size, -size], %)\n |> line([2 * size, 0], %)\n |> line([0, 2 * size], %)\n |> tangentialArcTo([-size, size], %)\n |> close(%)\n |> extrude(65, %)\n\nthing1 = startSketchOn(case, 'end')\n |> circle({\n center: [-size / 2, -size / 2],\n radius: 25\n }, %)\n |> extrude(50, %)\n\nthing2 = startSketchOn(case, 'end')\n |> circle({\n center: [size / 2, -size / 2],\n radius: 25\n }, %)\n |> extrude(50, %)\n\n// We put \"thing1\" in the shell function to shell the end face of the object.\nshell({ faces: ['end'], thickness: 5 }, thing1)", - "// Shell sketched on face objects on the end face, include all sketches to shell\n// the entire object.\n\n\nsize = 100\ncase = startSketchOn('XY')\n |> startProfileAt([-size, -size], %)\n |> line([2 * size, 0], %)\n |> line([0, 2 * size], %)\n |> tangentialArcTo([-size, size], %)\n |> close(%)\n |> extrude(65, %)\n\nthing1 = startSketchOn(case, 'end')\n |> circle({\n center: [-size / 2, -size / 2],\n radius: 25\n }, %)\n |> extrude(50, %)\n\nthing2 = startSketchOn(case, 'end')\n |> circle({\n center: [size / 2, -size / 2],\n radius: 25\n }, %)\n |> extrude(50, %)\n\n// We put \"thing1\" and \"thing2\" in the shell function to shell the end face of the object.\nshell({ faces: ['end'], thickness: 5 }, [thing1, thing2])" + "// Remove the end face for the extrusion.\nfirstSketch = startSketchOn('XY')\n |> startProfileAt([-12, 12], %)\n |> line([24, 0], %)\n |> line([0, -24], %)\n |> line([-24, 0], %)\n |> close(%)\n |> extrude(6, %)\n\n// Remove the end face for the extrusion.\nshell({ faces = ['end'], thickness = 0.25 }, firstSketch)", + "// Remove the start face for the extrusion.\nfirstSketch = startSketchOn('-XZ')\n |> startProfileAt([-12, 12], %)\n |> line([24, 0], %)\n |> line([0, -24], %)\n |> line([-24, 0], %)\n |> close(%)\n |> extrude(6, %)\n\n// Remove the start face for the extrusion.\nshell({ faces = ['start'], thickness = 0.25 }, firstSketch)", + "// Remove a tagged face and the end face for the extrusion.\nfirstSketch = startSketchOn('XY')\n |> startProfileAt([-12, 12], %)\n |> line([24, 0], %)\n |> line([0, -24], %)\n |> line([-24, 0], %, $myTag)\n |> close(%)\n |> extrude(6, %)\n\n// Remove a tagged face for the extrusion.\nshell({ faces = [myTag], thickness = 0.25 }, firstSketch)", + "// Remove multiple faces at once.\nfirstSketch = startSketchOn('XY')\n |> startProfileAt([-12, 12], %)\n |> line([24, 0], %)\n |> line([0, -24], %)\n |> line([-24, 0], %, $myTag)\n |> close(%)\n |> extrude(6, %)\n\n// Remove a tagged face and the end face for the extrusion.\nshell({\n faces = [myTag, 'end'],\n thickness = 0.25\n}, firstSketch)", + "// Shell a sketch on face.\nsize = 100\ncase = startSketchOn('-XZ')\n |> startProfileAt([-size, -size], %)\n |> line([2 * size, 0], %)\n |> line([0, 2 * size], %)\n |> tangentialArcTo([-size, size], %)\n |> close(%)\n |> extrude(65, %)\n\nthing1 = startSketchOn(case, 'end')\n |> circle({\n center = [-size / 2, -size / 2],\n radius = 25\n }, %)\n |> extrude(50, %)\n\nthing2 = startSketchOn(case, 'end')\n |> circle({\n center = [size / 2, -size / 2],\n radius = 25\n }, %)\n |> extrude(50, %)\n\n// We put \"case\" in the shell function to shell the entire object.\nshell({ faces = ['start'], thickness = 5 }, case)", + "// Shell a sketch on face object on the end face.\nsize = 100\ncase = startSketchOn('XY')\n |> startProfileAt([-size, -size], %)\n |> line([2 * size, 0], %)\n |> line([0, 2 * size], %)\n |> tangentialArcTo([-size, size], %)\n |> close(%)\n |> extrude(65, %)\n\nthing1 = startSketchOn(case, 'end')\n |> circle({\n center = [-size / 2, -size / 2],\n radius = 25\n }, %)\n |> extrude(50, %)\n\nthing2 = startSketchOn(case, 'end')\n |> circle({\n center = [size / 2, -size / 2],\n radius = 25\n }, %)\n |> extrude(50, %)\n\n// We put \"thing1\" in the shell function to shell the end face of the object.\nshell({ faces = ['end'], thickness = 5 }, thing1)", + "// Shell sketched on face objects on the end face, include all sketches to shell\n// the entire object.\n\n\nsize = 100\ncase = startSketchOn('XY')\n |> startProfileAt([-size, -size], %)\n |> line([2 * size, 0], %)\n |> line([0, 2 * size], %)\n |> tangentialArcTo([-size, size], %)\n |> close(%)\n |> extrude(65, %)\n\nthing1 = startSketchOn(case, 'end')\n |> circle({\n center = [-size / 2, -size / 2],\n radius = 25\n }, %)\n |> extrude(50, %)\n\nthing2 = startSketchOn(case, 'end')\n |> circle({\n center = [size / 2, -size / 2],\n radius = 25\n }, %)\n |> extrude(50, %)\n\n// We put \"thing1\" and \"thing2\" in the shell function to shell the end face of the object.\nshell({ faces = ['end'], thickness = 5 }, [thing1, thing2])" ] }, { @@ -151304,6 +177424,7 @@ "tags": [ "math" ], + "keywordArguments": false, "args": [ { "name": "num", @@ -151314,7 +177435,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -151326,12 +177448,13 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> angledLine({\n angle: 50,\n length: 15 / sin(toDegrees(135))\n }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" + "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> angledLine({\n angle = 50,\n length = 15 / sin(toDegrees(135))\n }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" ] }, { @@ -151341,6 +177464,7 @@ "tags": [ "math" ], + "keywordArguments": false, "args": [ { "name": "num", @@ -151351,7 +177475,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -151363,12 +177488,13 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> angledLine({ angle: 50, length: sqrt(2500) }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" + "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> angledLine({ angle = 50, length = sqrt(2500) }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" ] }, { @@ -151376,6 +177502,7 @@ "summary": "Start a new profile at a given point.", "description": "", "tags": [], + "keywordArguments": false, "args": [ { "name": "to", @@ -151391,7 +177518,8 @@ "maxItems": 2, "minItems": 2 }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch_surface", @@ -151606,8 +177734,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "Solid": { "description": "An solid is a collection of extrude surfaces.", @@ -151861,21 +177989,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -151889,6 +178005,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -152182,7 +178308,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -152412,6 +178538,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -152440,6 +178567,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -152845,11 +178976,12 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -152926,8 +179058,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "Solid": { "description": "An solid is a collection of extrude surfaces.", @@ -153181,21 +179313,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -153209,6 +179329,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -153502,7 +179632,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -153732,6 +179862,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -153760,6 +179891,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -154165,7 +180300,8 @@ } } }, - "required": false + "required": false, + "labelRequired": true } ], "returnValue": { @@ -154463,7 +180599,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -154693,6 +180829,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -154721,6 +180858,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -154765,21 +180906,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -154793,6 +180922,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -154826,8 +180965,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -155533,7 +181672,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, @@ -155548,6 +181688,7 @@ "summary": "Start a new 2-dimensional sketch at a given point on the 'XY' plane.", "description": "", "tags": [], + "keywordArguments": false, "args": [ { "name": "data", @@ -155563,7 +181704,8 @@ "maxItems": 2, "minItems": 2 }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -155861,7 +182003,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -156091,6 +182233,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -156119,6 +182262,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -156163,21 +182310,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -156191,6 +182326,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -156224,8 +182369,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -156931,10 +183076,11 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, - "deprecated": false, + "deprecated": true, "examples": [ "exampleSketch = startSketchAt([0, 0])\n |> line([10, 0], %)\n |> line([0, 10], %)\n |> line([-10, 0], %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)", "exampleSketch = startSketchAt([10, 10])\n |> line([10, 0], %)\n |> line([0, 10], %)\n |> line([-10, 0], %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)", @@ -156946,6 +183092,7 @@ "summary": "Start a new 2-dimensional sketch on a specific plane or face.", "description": "", "tags": [], + "keywordArguments": false, "args": [ { "name": "data", @@ -156958,13 +183105,16 @@ { "$ref": "#/components/schemas/PlaneData" }, + { + "$ref": "#/components/schemas/Plane" + }, { "$ref": "#/components/schemas/Solid" } ], "definitions": { "PlaneData": { - "description": "Data for a plane.", + "description": "Orientation data that can be used to construct a plane, not a plane in itself.", "oneOf": [ { "description": "The XY plane.", @@ -157085,6 +183235,114 @@ } } }, + "Plane": { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, "Solid": { "description": "An solid is a collection of extrude surfaces.", "type": "object", @@ -157337,21 +183595,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -157365,19 +183611,19 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, - "SourceRange": { - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - }, "Sketch": { "description": "A sketch is a collection of paths.", "type": "object", @@ -157668,7 +183914,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -157898,6 +184144,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -157926,6 +184173,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -158132,43 +184383,6 @@ } ] }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - } - ] - }, - "Metadata": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, "BasePath": { "description": "A base path.", "type": "object", @@ -158368,7 +184582,8 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "tag", @@ -158384,7 +184599,7 @@ "nullable": true, "definitions": { "PlaneData": { - "description": "Data for a plane.", + "description": "Orientation data that can be used to construct a plane, not a plane in itself.", "oneOf": [ { "description": "The XY plane.", @@ -158505,6 +184720,114 @@ } } }, + "Plane": { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, "Solid": { "description": "An solid is a collection of extrude surfaces.", "type": "object", @@ -158757,21 +185080,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -158785,19 +185096,19 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, - "SourceRange": { - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - }, "Sketch": { "description": "A sketch is a collection of paths.", "type": "object", @@ -159088,7 +185399,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -159318,6 +185629,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -159346,6 +185658,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -159552,43 +185868,6 @@ } ] }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - } - ] - }, - "Metadata": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, "BasePath": { "description": "A base path.", "type": "object", @@ -159822,7 +186101,8 @@ } } }, - "required": false + "required": false, + "labelRequired": true } ], "returnValue": { @@ -160038,8 +186318,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "Solid": { "description": "An solid is a collection of extrude surfaces.", @@ -160293,21 +186573,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -160321,6 +186589,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -160614,7 +186892,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -160844,6 +187122,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -160872,6 +187151,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -161277,15 +187560,4126 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ "exampleSketch = startSketchOn(\"XY\")\n |> startProfileAt([0, 0], %)\n |> line([10, 0], %)\n |> line([0, 10], %)\n |> line([-10, 0], %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)\n\nexampleSketch002 = startSketchOn(example, 'end')\n |> startProfileAt([1, 1], %)\n |> line([8, 0], %)\n |> line([0, 8], %)\n |> line([-8, 0], %)\n |> close(%)\n\nexample002 = extrude(5, exampleSketch002)\n\nexampleSketch003 = startSketchOn(example002, 'end')\n |> startProfileAt([2, 2], %)\n |> line([6, 0], %)\n |> line([0, 6], %)\n |> line([-6, 0], %)\n |> close(%)\n\nexample003 = extrude(5, exampleSketch003)", "exampleSketch = startSketchOn(\"XY\")\n |> startProfileAt([0, 0], %)\n |> line([10, 0], %)\n |> line([0, 10], %, $sketchingFace)\n |> line([-10, 0], %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)\n\nexampleSketch002 = startSketchOn(example, sketchingFace)\n |> startProfileAt([1, 1], %)\n |> line([8, 0], %)\n |> line([0, 8], %)\n |> line([-8, 0], %)\n |> close(%, $sketchingFace002)\n\nexample002 = extrude(10, exampleSketch002)\n\nexampleSketch003 = startSketchOn(example002, sketchingFace002)\n |> startProfileAt([-8, 12], %)\n |> line([0, 6], %)\n |> line([6, 0], %)\n |> line([0, -6], %)\n |> close(%)\n\nexample003 = extrude(5, exampleSketch003)", - "exampleSketch = startSketchOn('XY')\n |> startProfileAt([4, 12], %)\n |> line([2, 0], %)\n |> line([0, -6], %)\n |> line([4, -6], %)\n |> line([0, -6], %)\n |> line([-3.75, -4.5], %)\n |> line([0, -5.5], %)\n |> line([-2, 0], %)\n |> close(%)\n\nexample = revolve({ axis: 'y', angle: 180 }, exampleSketch)\n\nexampleSketch002 = startSketchOn(example, 'end')\n |> startProfileAt([4.5, -5], %)\n |> line([0, 5], %)\n |> line([5, 0], %)\n |> line([0, -5], %)\n |> close(%)\n\nexample002 = extrude(5, exampleSketch002)", - "a1 = startSketchOn({\n plane: {\n origin: { x: 0, y: 0, z: 0 },\n xAxis: { x: 1, y: 0, z: 0 },\n yAxis: { x: 0, y: 1, z: 0 },\n zAxis: { x: 0, y: 0, z: 1 }\n }\n })\n |> startProfileAt([0, 0], %)\n |> line([100.0, 0], %)\n |> yLine(-100.0, %)\n |> xLine(-100.0, %)\n |> yLine(100.0, %)\n |> close(%)\n |> extrude(3.14, %)" + "exampleSketch = startSketchOn('XY')\n |> startProfileAt([4, 12], %)\n |> line([2, 0], %)\n |> line([0, -6], %)\n |> line([4, -6], %)\n |> line([0, -6], %)\n |> line([-3.75, -4.5], %)\n |> line([0, -5.5], %)\n |> line([-2, 0], %)\n |> close(%)\n\nexample = revolve({ axis = 'y', angle = 180 }, exampleSketch)\n\nexampleSketch002 = startSketchOn(example, 'end')\n |> startProfileAt([4.5, -5], %)\n |> line([0, 5], %)\n |> line([5, 0], %)\n |> line([0, -5], %)\n |> close(%)\n\nexample002 = extrude(5, exampleSketch002)", + "a1 = startSketchOn({\n plane = {\n origin = { x = 0, y = 0, z = 0 },\n xAxis = { x = 1, y = 0, z = 0 },\n yAxis = { x = 0, y = 1, z = 0 },\n zAxis = { x = 0, y = 0, z = 1 }\n }\n })\n |> startProfileAt([0, 0], %)\n |> line([100.0, 0], %)\n |> yLine(-100.0, %)\n |> xLine(-100.0, %)\n |> yLine(100.0, %)\n |> close(%)\n |> extrude(3.14, %)" + ] + }, + { + "name": "sweep", + "summary": "Extrude a sketch along a path.", + "description": "This, like extrude, is able to create a 3-dimensional solid from a 2-dimensional sketch. However, unlike extrude, this creates a solid by using the extent of the sketch as its path. This is useful for creating more complex shapes that can't be created with a simple extrusion.", + "tags": [], + "keywordArguments": false, + "args": [ + { + "name": "data", + "type": "SweepData", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "SweepData", + "description": "Data for a sweep.", + "type": "object", + "required": [ + "path" + ], + "properties": { + "path": { + "description": "The path to sweep along.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "sectional": { + "description": "If true, the sweep will be broken up into sub-sweeps (extrusions, revolves, sweeps) based on the trajectory path components.", + "type": "boolean", + "nullable": true + }, + "tolerance": { + "description": "Tolerance for the sweep operation.", + "default": null, + "type": "number", + "format": "double", + "nullable": true + } + }, + "definitions": { + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + } + } + }, + "required": true, + "labelRequired": true + }, + { + "name": "sketch", + "type": "Sketch", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Sketch", + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + }, + "definitions": { + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + } + } + }, + "required": true, + "labelRequired": true + } + ], + "returnValue": { + "name": "", + "type": "Solid", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Solid", + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + }, + "definitions": { + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "paths", + "start" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + } + } + }, + "required": true, + "labelRequired": true + }, + "unpublished": false, + "deprecated": false, + "examples": [ + "// Create a pipe using a sweep.\n\n\n// Create a path for the sweep.\nsweepPath = startSketchOn('XZ')\n |> startProfileAt([0.05, 0.05], %)\n |> line([0, 7], %)\n |> tangentialArc({ offset = 90, radius = 5 }, %)\n |> line([-3, 0], %)\n |> tangentialArc({ offset = -90, radius = 5 }, %)\n |> line([0, 7], %)\n\n// Create a hole for the pipe.\npipeHole = startSketchOn('XY')\n |> circle({ center = [0, 0], radius = 1.5 }, %)\n\nsweepSketch = startSketchOn('XY')\n |> circle({ center = [0, 0], radius = 2 }, %)\n |> hole(pipeHole, %)\n |> sweep({ path = sweepPath }, %)" ] }, { @@ -161295,6 +191689,7 @@ "tags": [ "math" ], + "keywordArguments": false, "args": [ { "name": "num", @@ -161305,7 +191700,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -161317,12 +191713,923 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> angledLine({ angle: 50, length: 50 * tan(1 / 2) }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" + "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> angledLine({ angle = 50, length = 50 * tan(1 / 2) }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" + ] + }, + { + "name": "tangentToEnd", + "summary": "Returns the angle coming out of the end of the segment in degrees.", + "description": "", + "tags": [], + "keywordArguments": false, + "args": [ + { + "name": "tag", + "type": "TagIdentifier", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "TagIdentifier", + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + }, + "definitions": { + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + } + }, + "required": true, + "labelRequired": true + } + ], + "returnValue": { + "name": "", + "type": "number", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "double", + "type": "number", + "format": "double" + }, + "required": true, + "labelRequired": true + }, + "unpublished": false, + "deprecated": false, + "examples": [ + "// Horizontal pill.\npillSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([20, 0], %)\n |> tangentialArcToRelative([0, 10], %, $arc1)\n |> angledLine({\n angle = tangentToEnd(arc1),\n length = 20\n }, %)\n |> tangentialArcToRelative([0, -10], %)\n |> close(%)\n\npillExtrude = extrude(10, pillSketch)", + "// Vertical pill. Use absolute coordinate for arc.\npillSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([0, 20], %)\n |> tangentialArcTo([10, 20], %, $arc1)\n |> angledLine({\n angle = tangentToEnd(arc1),\n length = 20\n }, %)\n |> tangentialArcToRelative([-10, 0], %)\n |> close(%)\n\npillExtrude = extrude(10, pillSketch)", + "rectangleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([10, 0], %, $seg1)\n |> angledLine({\n angle = tangentToEnd(seg1),\n length = 10\n }, %)\n |> line([0, 10], %)\n |> line([-20, 0], %)\n |> close(%)\n\nrectangleExtrude = extrude(10, rectangleSketch)", + "bottom = startSketchOn(\"XY\")\n |> startProfileAt([0, 0], %)\n |> arcTo({ end = [10, 10], interior = [5, 1] }, %, $arc1)\n |> angledLine([tangentToEnd(arc1), 20], %)\n |> close(%)", + "circSketch = startSketchOn(\"XY\")\n |> circle({ center = [0, 0], radius = 3 }, %, $circ)\n\ntriangleSketch = startSketchOn(\"XY\")\n |> startProfileAt([-5, 0], %)\n |> angledLine([tangentToEnd(circ), 10], %)\n |> line([-15, 0], %)\n |> close(%)" ] }, { @@ -161330,6 +192637,7 @@ "summary": "Draw a curved line segment along part of an imaginary circle.", "description": "The arc is constructed such that the last line segment is placed tangent to the imaginary circle of the specified radius. The resulting arc is the segment of the imaginary circle from that tangent point for 'offset' degrees along the imaginary circle.", "tags": [], + "keywordArguments": false, "args": [ { "name": "data", @@ -161360,7 +192668,8 @@ } ] }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch", @@ -161657,7 +192966,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -161887,6 +193196,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -161915,6 +193225,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -161959,21 +193273,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -161987,6 +193289,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -162020,8 +193332,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -162727,11 +194039,12 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -162977,7 +194290,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -163207,6 +194520,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -163235,6 +194549,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -163279,21 +194597,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -163307,6 +194613,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -163340,8 +194656,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -164047,7 +195363,8 @@ } } }, - "required": false + "required": false, + "labelRequired": true } ], "returnValue": { @@ -164345,7 +195662,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -164575,6 +195892,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -164603,6 +195921,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -164647,21 +195969,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -164675,6 +195985,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -164708,8 +196028,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -165415,12 +196735,13 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> angledLine({ angle: 60, length: 10 }, %)\n |> tangentialArc({ radius: 10, offset: -120 }, %)\n |> angledLine({ angle: -60, length: 10 }, %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)" + "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> angledLine({ angle = 60, length = 10 }, %)\n |> tangentialArc({ radius = 10, offset = -120 }, %)\n |> angledLine({ angle = -60, length = 10 }, %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)" ] }, { @@ -165428,6 +196749,7 @@ "summary": "Starting at the current sketch's origin, draw a curved line segment along", "description": "some part of an imaginary circle until it reaches the desired (x, y) coordinates.", "tags": [], + "keywordArguments": false, "args": [ { "name": "to", @@ -165443,7 +196765,8 @@ "maxItems": 2, "minItems": 2 }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch", @@ -165740,7 +197063,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -165970,6 +197293,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -165998,6 +197322,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -166042,21 +197370,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -166070,6 +197386,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -166103,8 +197429,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -166810,11 +198136,12 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -167060,7 +198387,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -167290,6 +198617,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -167318,6 +198646,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -167362,21 +198694,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -167390,6 +198710,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -167423,8 +198753,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -168130,7 +199460,8 @@ } } }, - "required": false + "required": false, + "labelRequired": true } ], "returnValue": { @@ -168428,7 +199759,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -168658,6 +199989,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -168686,6 +200018,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -168730,21 +200066,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -168758,6 +200082,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -168791,8 +200125,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -169498,12 +200832,13 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> angledLine({ angle: 60, length: 10 }, %)\n |> tangentialArcTo([15, 15], %)\n |> line([10, -15], %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)" + "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> angledLine({ angle = 60, length = 10 }, %)\n |> tangentialArcTo([15, 15], %)\n |> line([10, -15], %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)" ] }, { @@ -169511,6 +200846,7 @@ "summary": "Starting at the current sketch's origin, draw a curved line segment along", "description": "some part of an imaginary circle until it reaches a point the given (x, y) distance away.", "tags": [], + "keywordArguments": false, "args": [ { "name": "delta", @@ -169526,7 +200862,8 @@ "maxItems": 2, "minItems": 2 }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch", @@ -169823,7 +201160,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -170053,6 +201390,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -170081,6 +201419,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -170125,21 +201467,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -170153,6 +201483,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -170186,8 +201526,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -170893,11 +202233,12 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -171143,7 +202484,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -171373,6 +202714,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -171401,6 +202743,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -171445,21 +202791,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -171473,6 +202807,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -171506,8 +202850,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -172213,7 +203557,8 @@ } } }, - "required": false + "required": false, + "labelRequired": true } ], "returnValue": { @@ -172511,7 +203856,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -172741,6 +204086,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -172769,6 +204115,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -172813,21 +204163,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -172841,6 +204179,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -172874,8 +204222,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -173581,12 +204929,13 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> angledLine({ angle: 45, length: 10 }, %)\n |> tangentialArcToRelative([0, -10], %)\n |> line([-10, 0], %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)" + "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> angledLine({ angle = 45, length = 10 }, %)\n |> tangentialArcToRelative([0, -10], %)\n |> line([-10, 0], %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)" ] }, { @@ -173596,6 +204945,7 @@ "tags": [ "math" ], + "keywordArguments": false, "args": [], "returnValue": { "name": "", @@ -173606,12 +204956,13 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> angledLine({ angle: 50, length: 10 * tau() }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" + "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> angledLine({ angle = 50, length = 10 * tau() }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" ] }, { @@ -173621,6 +204972,7 @@ "tags": [ "math" ], + "keywordArguments": false, "args": [ { "name": "num", @@ -173631,7 +204983,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -173643,12 +204996,13 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> angledLine({\n angle: 50,\n length: 70 * cos(toDegrees(pi() / 4))\n }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" + "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> angledLine({\n angle = 50,\n length = 70 * cos(toDegrees(pi() / 4))\n }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" ] }, { @@ -173658,6 +205012,7 @@ "tags": [ "math" ], + "keywordArguments": false, "args": [ { "name": "num", @@ -173668,7 +205023,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true } ], "returnValue": { @@ -173680,12 +205036,13 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> angledLine({\n angle: 50,\n length: 70 * cos(toRadians(45))\n }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" + "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> angledLine({\n angle = 50,\n length = 70 * cos(toRadians(45))\n }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" ] }, { @@ -173693,6 +205050,7 @@ "summary": "Draw a line relative to the current origin to a specified distance away", "description": "from the current position along the 'x' axis.", "tags": [], + "keywordArguments": false, "args": [ { "name": "length", @@ -173703,7 +205061,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch", @@ -174000,7 +205359,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -174230,6 +205589,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -174258,6 +205618,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -174302,21 +205666,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -174330,6 +205682,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -174363,8 +205725,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -175070,11 +206432,12 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -175320,7 +206683,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -175550,6 +206913,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -175578,6 +206942,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -175622,21 +206990,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -175650,6 +207006,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -175683,8 +207049,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -176390,7 +207756,8 @@ } } }, - "required": false + "required": false, + "labelRequired": true } ], "returnValue": { @@ -176688,7 +208055,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -176918,6 +208285,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -176946,6 +208314,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -176990,21 +208362,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -177018,6 +208378,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -177051,8 +208421,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -177758,12 +209128,13 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> xLine(15, %)\n |> angledLine({ angle: 80, length: 15 }, %)\n |> line([8, -10], %)\n |> xLine(10, %)\n |> angledLine({ angle: 120, length: 30 }, %)\n |> xLine(-15, %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)" + "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> xLine(15, %)\n |> angledLine({ angle = 80, length = 15 }, %)\n |> line([8, -10], %)\n |> xLine(10, %)\n |> angledLine({ angle = 120, length = 30 }, %)\n |> xLine(-15, %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)" ] }, { @@ -177771,6 +209142,7 @@ "summary": "Draw a line parallel to the X axis, that ends at the given X.", "description": "E.g. if the previous line ended at (1, 1), then xLineTo(4) draws a line from (1, 1) to (4, 1)", "tags": [], + "keywordArguments": false, "args": [ { "name": "to", @@ -177781,7 +209153,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch", @@ -178078,7 +209451,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -178308,6 +209681,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -178336,6 +209710,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -178380,21 +209758,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -178408,6 +209774,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -178441,8 +209817,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -179148,11 +210524,12 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -179398,7 +210775,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -179628,6 +211005,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -179656,6 +211034,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -179700,21 +211082,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -179728,6 +211098,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -179761,8 +211141,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -180468,7 +211848,8 @@ } } }, - "required": false + "required": false, + "labelRequired": true } ], "returnValue": { @@ -180766,7 +212147,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -180996,6 +212377,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -181024,6 +212406,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -181068,21 +212454,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -181096,6 +212470,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -181129,8 +212513,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -181836,12 +213220,13 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> xLineTo(15, %)\n |> angledLine({ angle: 80, length: 15 }, %)\n |> line([8, -10], %)\n |> xLineTo(40, %)\n |> angledLine({ angle: 135, length: 30 }, %)\n |> xLineTo(10, %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)" + "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> xLineTo(15, %)\n |> angledLine({ angle = 80, length = 15 }, %)\n |> line([8, -10], %)\n |> xLineTo(40, %)\n |> angledLine({ angle = 135, length = 30 }, %)\n |> xLineTo(10, %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)" ] }, { @@ -181849,6 +213234,7 @@ "summary": "Draw a line relative to the current origin to a specified distance away", "description": "from the current position along the 'y' axis.", "tags": [], + "keywordArguments": false, "args": [ { "name": "length", @@ -181859,7 +213245,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch", @@ -182156,7 +213543,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -182386,6 +213773,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -182414,6 +213802,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -182458,21 +213850,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -182486,6 +213866,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -182519,8 +213909,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -183226,11 +214616,12 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -183476,7 +214867,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -183706,6 +215097,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -183734,6 +215126,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -183778,21 +215174,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -183806,6 +215190,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -183839,8 +215233,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -184546,7 +215940,8 @@ } } }, - "required": false + "required": false, + "labelRequired": true } ], "returnValue": { @@ -184844,7 +216239,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -185074,6 +216469,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -185102,6 +216498,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -185146,21 +216546,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -185174,6 +216562,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -185207,8 +216605,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -185914,12 +217312,13 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> yLine(15, %)\n |> angledLine({ angle: 30, length: 15 }, %)\n |> line([8, -10], %)\n |> yLine(-5, %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)" + "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> yLine(15, %)\n |> angledLine({ angle = 30, length = 15 }, %)\n |> line([8, -10], %)\n |> yLine(-5, %)\n |> close(%)\n\nexample = extrude(10, exampleSketch)" ] }, { @@ -185927,6 +217326,7 @@ "summary": "Draw a line parallel to the Y axis, that ends at the given Y.", "description": "E.g. if the previous line ended at (1, 1), then yLineTo(4) draws a line from (1, 1) to (1, 4)", "tags": [], + "keywordArguments": false, "args": [ { "name": "to", @@ -185937,7 +217337,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, { "name": "sketch", @@ -186234,7 +217635,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -186464,6 +217865,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -186492,6 +217894,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -186536,21 +217942,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -186564,6 +217958,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -186597,8 +218001,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -187304,11 +218708,12 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -187554,7 +218959,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -187784,6 +219189,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -187812,6 +219218,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -187856,21 +219266,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -187884,6 +219282,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -187917,8 +219325,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -188624,7 +220032,8 @@ } } }, - "required": false + "required": false, + "labelRequired": true } ], "returnValue": { @@ -188922,7 +220331,7 @@ "format": "double" }, "ccw": { - "description": "arc's direction", + "description": "arc's direction This is used to compute the tangential angle.", "type": "boolean" }, "from": { @@ -189152,6 +220561,7 @@ "type": "object", "required": [ "__geoMeta", + "ccw", "center", "from", "radius", @@ -189180,6 +220590,10 @@ "type": "number", "format": "double" }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, "from": { "description": "The from point.", "type": "array", @@ -189224,21 +220638,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -189252,6 +220654,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -189285,8 +220697,8 @@ "format": "uint", "minimum": 0.0 }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "SketchSurface": { "description": "A sketch type.", @@ -189992,12 +221404,13 @@ } } }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> angledLine({ angle: 50, length: 45 }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" + "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> angledLine({ angle = 50, length = 45 }, %)\n |> yLineTo(0, %)\n |> close(%)\n\nexample = extrude(5, exampleSketch)" ] }, { @@ -190007,6 +221420,7 @@ "tags": [ "units" ], + "keywordArguments": false, "args": [], "returnValue": { "name": "", @@ -190017,7 +221431,8 @@ "type": "number", "format": "double" }, - "required": true + "required": true, + "labelRequired": true }, "unpublished": false, "deprecated": false, diff --git a/docs/kcl/sweep.md b/docs/kcl/sweep.md new file mode 100644 index 000000000..0b7e5191d --- /dev/null +++ b/docs/kcl/sweep.md @@ -0,0 +1,55 @@ +--- +title: "sweep" +excerpt: "Extrude a sketch along a path." +layout: manual +--- + +Extrude a sketch along a path. + +This, like extrude, is able to create a 3-dimensional solid from a 2-dimensional sketch. However, unlike extrude, this creates a solid by using the extent of the sketch as its path. This is useful for creating more complex shapes that can't be created with a simple extrusion. + +```js +sweep(data: SweepData, sketch: Sketch) -> Solid +``` + + +### Arguments + +| Name | Type | Description | Required | +|----------|------|-------------|----------| +| `data` | [`SweepData`](/docs/kcl/types/SweepData) | Data for a sweep. | Yes | +| `sketch` | [`Sketch`](/docs/kcl/types/Sketch) | A sketch is a collection of paths. | Yes | + +### Returns + +[`Solid`](/docs/kcl/types/Solid) - An solid is a collection of extrude surfaces. + + +### Examples + +```js +// Create a pipe using a sweep. + + +// Create a path for the sweep. +sweepPath = startSketchOn('XZ') + |> startProfileAt([0.05, 0.05], %) + |> line([0, 7], %) + |> tangentialArc({ offset = 90, radius = 5 }, %) + |> line([-3, 0], %) + |> tangentialArc({ offset = -90, radius = 5 }, %) + |> line([0, 7], %) + +// Create a hole for the pipe. +pipeHole = startSketchOn('XY') + |> circle({ center = [0, 0], radius = 1.5 }, %) + +sweepSketch = startSketchOn('XY') + |> circle({ center = [0, 0], radius = 2 }, %) + |> hole(pipeHole, %) + |> sweep({ path = sweepPath }, %) +``` + +![Rendered example of sweep 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAElIUlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVS+Sa6655sE805kzZx4McM011zyYZzpz5syDeC7XXHPNg3k+rrnmmgfzAtx333238gLcd999t/JMZ8+efQbPdN99993KM509e/bW++6771auuuqqq6666qqrrrrqqqsAPehBD+Kqq6666qqr/r+55pprHgxw5syZB19zzTUPPnPmzIN4pmuuuebB11xzzYMBzpw58+BrrrnmwTyX++6779ZrrrnmwTzA7u4uu7u73G93d5fjx4/z/Ozu7vKCHD9+HIDd3V2e2/Hjx3mgBz/4wbww9913360AZ8+evfW+++67FeAf/uEffgfgvvvuu/Xs2bO33nfffbdy1VVXXXXVVVddddVVV/1fhR70oAdx1VVXXXXVVf/XXHPNNQ8+c+bMg6+55poHnzlz5kEAL/7iL/7aZ86cefA111zzYJ6PW2+9ld3dXQB2d3c5fvw4u7u7ABw/fpzjx49z6623AnD8+HGOHz/O/Y4fPw7A8ePH+c+wu7vL/XZ3dwHY3d0FYHd3l0uXLnG/3d1ddnd3OX78OMePHwfg2LFjHD9+HIDjx4/z4Ac/mPvdd999twL8wz/8w28D/MM//MPv/MM//MNv33fffbdy1VVXXXXVVVddddVVV/1vhx70oAdx1VVXXXXVVf9bXXPNNQ8+c+bMg1/sxV7sta655poH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A9nGNraxjW2em21s868hiQeSxItCEpJ4fiTxb9F13YO56qqrrrrqqquuuuqqq/4nI7jqqquuuuqq/2Vaa9jGNraxDYBtnpttAGxzP9v8S2zzwtjmBbGNbe5nm/vZxja2sc39bGObF5Uk/q0k8R9BElddddVVV1111VVXXXXV/3gEV1111VVXXfW/zzMAbHM/2/x72OYFsc0LYhvb2AbANgC2sY1tAGxjm+dmmxfENv+VJHE/SQBI4oWRxFVXXXXVVVddddVVV131PxrBVVddddVVV/0vI+nWzMQ2tnkg29zPNi+IbZ6bbR7INs/NNvezzQPZBsA297ONbWxjG9vYxja2AbDNfzVJ/FtJ4n6z2ezBXHXVVVddddVVV1111VX/kxFcddVVV1111f8ykm61zf1s80C2sc39bANgmweyzXOzzQtiGwDbPJBtbANgGwDb2AbANi8q27wgknhBJPGvJYl/K0lIwjZXXXXVVVddddVVV1111f9oVK666qqrrrrqfyHb2MY2ALaxzX8E20gCwDaSsI0k7mcbANvczzYAtrmfbQBsYxvb2Oa52eZ+trHN/ySSkMRzm81mD+aqq6666qqrrrrqqquu+p+M4Kqrrrrqqqv+l4mIWwFsA2CbF8Q2D2SbB7LNv5VtnpttAGxjGwDb3M82tnkg2wDY5r+aJB5IEi+MJB5IElddddVVV1111VVXXXXV/2gEV1111VVXXfW/0DRNt9rGNg9km+fHNi+IbZ6bbe5nm/vZxjYPZBvb2AbANgC2sQ2AbWxzP9vYxjb/USTxH0kS/xLbXHXVVVddddVVV1111VX/oxFcddVVV1111f9CwzDcahsA29jGNgC2sY1tnh/bPDfb/Etscz/bANjmgWwDYBsA29jGNraxjW2em23+LSTxn00Sz48kJFFKeTBXXXXVVVddddVVV1111f9UBFddddVVV131v1Bm3mob27yobHM/2zw32zyQbV4Y29zPNvezDYBtAGzz3GxjGwDb3M82/x6SkASAJCTxL5HEA0nihZGEJK666qqrrrrqqquuuuqq/xUIrrrqqquuuup/ocy81Ta2AbANgG2em21eVLZ5INsA2OYFsQ2AbWwDYBsA2wDYxja2sc39bHM/2/xHkcT9JCEJSfxHk0Qp5cFcddVVV1111VVXXXXVVf9TEVx11VVXXXXV/0KtNWwDYBsA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5n62eWFs8y+xzf1scz/b2OZFYRsA29gGwDa2sQ2Abf69JHE/STw3SdxPEveTxL9G13UP5qqrrrrqqquuuuqqq676n4Lgqquuuuqqq/4PysxbbXM/29gGwDa2eW62eW62+deyzYvKNi8q2/xHkASAJO4niftJ4gWRxAsjia7rHsRVV1111VVXXXXVVVdd9T8FwVVXXXXVVVf9H9Rawza2sc0LY5sXxjYvjG3uZ5vnZhvb2MY2trGNbe5nG9vYxjYPZJv72ebfQxIPJIkXRhL/WhHBVVddddVVV1111VVXXfU/BsFVV1111VVX/R8UEb9jG9v8a9jm+bGNbV4Q2zw329jmX2Kb52abF8Q2LwpJSEISL4wk7ieJF0QSDySJ+0nifl3XPZirrrrqqquuuuqqq6666n8Kgquuuuqqq676P8g2mYltbGMb29jmgWwDYJv72eYFsc0LYpv72eZFYRsA2zw329jmX0sSknggSfxLJPFAkviXSOJ+kpDEbDZ7MFddddVVV1111VVXXXXV/xQEV1111VVXXfV/UETcahsA2zyQbf49bGObF8Q2z802trGNbWxjmweyjW1s89xs80C2+beShCQk8YJI4oEk8UCSuJ8kHmhjY+PBXHXVVVddddVVV1111VX/UxBcddVVV1111f9BEXFrZmIbANs8kG1s84LY5l9iG9v8S2zzwtjmudnmRWWbF4UknpskACTxH6W1xlVXXXXVVVddddVVV131PwbBVVddddVVV/0fNQzDb9vGNgC2sc1zsw2AbR7INi8K29zPNvezjW1eENvYBsA2z802trENgG3+K0jigSTxQJJ4bpKQhCRms9mDueqqq6666qqrrrrqqqv+pyC46qqrrrrqqv+jMpPMBMA297PNi8o2/xa2eX5sYxvbPDfb2MY2Lwrb/GtJ4rlJ4n6S+I8wm81em6uuuuqqq6666qqrrrrqfwKCq6666qqrrvo/KjNvtY1tAGxzP9vYxjYPZJvnZhvbvDC2eWFsY5vnxzYvKtv8V5LEA0nihZGEJDY2Nl6Lq6666qqrrrrqqquuuup/AoKrrrrqqquu+j+qtXZrZmIb2wDY5vmxzf1s8/zYxjYviG0AbHM/29jm+bGNbQBs80C2eSDb/GeTxL+WJO4nCQBJbG9vvzZXXXXVVVddddVVV1111f8EBFddddVVV131f9fv2MY2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rrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V/GPBgdzx+zfmPsAAAAASUVORK5CYII=) + + diff --git a/docs/kcl/tan.md b/docs/kcl/tan.md index 8c14c9521..4586272a6 100644 --- a/docs/kcl/tan.md +++ b/docs/kcl/tan.md @@ -33,7 +33,7 @@ tan(num: number) -> number ```js exampleSketch = startSketchOn("XZ") |> startProfileAt([0, 0], %) - |> angledLine({ angle: 50, length: 50 * tan(1 / 2) }, %) + |> angledLine({ angle = 50, length = 50 * tan(1 / 2) }, %) |> yLineTo(0, %) |> close(%) diff --git a/docs/kcl/tangentToEnd.md b/docs/kcl/tangentToEnd.md new file mode 100644 index 000000000..4ba39e7c0 --- /dev/null +++ b/docs/kcl/tangentToEnd.md @@ -0,0 +1,105 @@ +--- +title: "tangentToEnd" +excerpt: "Returns the angle coming out of the end of the segment in degrees." +layout: manual +--- + +Returns the angle coming out of the end of the segment in degrees. + + + +```js +tangentToEnd(tag: TagIdentifier) -> number +``` + + +### Arguments + +| Name | Type | Description | Required | +|----------|------|-------------|----------| +| `tag` | [`TagIdentifier`](/docs/kcl/types#tag-identifier) | | Yes | + +### Returns + +`number` + + +### Examples + +```js +// Horizontal pill. +pillSketch = startSketchOn('XZ') + |> startProfileAt([0, 0], %) + |> line([20, 0], %) + |> tangentialArcToRelative([0, 10], %, $arc1) + |> angledLine({ + angle = tangentToEnd(arc1), + length = 20 + }, %) + |> tangentialArcToRelative([0, -10], %) + |> close(%) + +pillExtrude = extrude(10, pillSketch) +``` + +![Rendered example of tangentToEnd 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAADJ+0lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV131n+aaa6558JkzZx58zTXXPPjMmTMPuuaaax58zTXXPBjgzJkzD77mmmsezFVXXXXV/3H33XffrQBnz569FeC+++67FeAf/uEffue+++679ezZs7fed999t3LVVVddddVVV/1nQA960IO46qqrrrrqqqv+/a655poH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BC/5ki/JsWPHuN8//MM//Pbf//3f//aP/uiPfg5XXXXVVVdd9b8TetCDHsRVV1111VVX/W93zTXXPPgd3/EdP+t1Xud13psHuHTpErfddht/93d/x2233cYLI4n/ySTxf50krrrqudnm/yrb/E9km/9OtvmvcOzYMV7iJV6Cl3zJl+TYsWPc77777rv1t37rt777H/7hH37nH/7hH36bq6666qqrrvrfDT3oQQ/iqquuuuqqq/6vuOaaax78Yi/2Yq/9Yi/2Yq/1Oq/zOu/NA1y6dInbbruN2267jUuXLnHbbbfxwkjifwNJ/H8jiav+97PN/ye2+Z/KNv+dbPNf4dixY7zES7wED3rQg7jlllt4oPvuu+/W3/qt3/rus2fPPuO3fuu3vpurrrrqqquu+r8DPehBD+Kqq6666qqr/i+65pprHnzmzJkHv9iLvdhrvfiLv/hrv9iLvdhr8wCXLl3i0qVLXLp0idtuu43bbruNS5cu8YJI4n8LSVz1bJK46r+Gbf6/s83/dLb572ab/0zHjh3j2LFj3HLLLTzoQQ/illtu4bndd999t/7Wb/3Wd//DP/zDb//DP/zD73DVVVddddVV/zehBz3oQVx11VVXXXXV/wfXXHPNg1/sxV7stV/sxV7sta655poHv9iLvdhr81wuXbrEpUuXuHTpErfddhsAly5d4rbbbuO5SeJ/G0lc9W8jif/rbHPVv45t/jewzf8EtvmPdOzYMQCOHTvGLbfcAsCDHvQgbrnlFp6f++6779bf+q3f+u6zZ88+47d+67e+m6uuuuqqq676/wE96EEP4qqrrrrqqqv+P7rmmmse/GIv9mKvfebMmQe9+Iu/+Gu/2Iu92GvzQly6dAmAS5cucenSJe536dIlAC5duoQkrrrqqqv+u9nmfwLb/FsdO3aMBzp+/DgAx44d49ixYxw7dowX5r777rv1H/7hH377vvvuu/Uf/uEffucf/uEffpurrrrqqquu+v8JPehBD+Kqq6666qqrrrrimmuuefCZM2cefM011zz4xV7sxV7rmmuueTDAi73Yi702V1111VVX/Y9y33333Qpw9uzZW//+7//+twH+4R/+4Xf+4R/+4be56qqrrrrqqqvuhx70oAdx1VVXXXXVVVf9y6655poH2/Y111zzkGuuuebBPNOZM2ceBHDNNdc8mKuuuuqqq/5D3HfffbfyAGfPnn0GwH333Xfrfffd9/SzZ88+g6uuuuqqq6666kWBHvSgB3HVVVddddVVV1111VVXXXXVVVddddVVV/2fROWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V/GP3HIKxpfn6p4AAAAASUVORK5CYII=) + +```js +// Vertical pill. Use absolute coordinate for arc. +pillSketch = startSketchOn('XZ') + |> startProfileAt([0, 0], %) + |> line([0, 20], %) + |> tangentialArcTo([10, 20], %, $arc1) + |> angledLine({ + angle = tangentToEnd(arc1), + length = 20 + }, %) + |> tangentialArcToRelative([-10, 0], %) + |> close(%) + +pillExtrude = extrude(10, pillSketch) +``` + +![Rendered example of tangentToEnd 1](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAC5RElEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqr/te75pprHgxw5syZB7/Yi73Ya/FM11xzzYOvueaaB/NM9913363XXHPNgwHuu+++W6+55poH33fffbcC3HfffbeePXv2GQD33XffrWfPnr31vvvuu5Wrrrrqqquuuuqqq/43Qw960IO46qqrrrrqqquuuup/h2uuuebBZ86cefCLvdiLvdY111zzYIDXeZ3XeW+eaXd3F4BLly6xu7sLwO7uLi/I8ePHAbDN8ePHAXjwgx/M/e67775bAf7hH/7ht//hH/7hd+67775b/+Ef/uG3ueqqq6666qqrrrrqfwv0oAc9iKuuuuqqq6666qqr/me65pprHvzar/3a7wXwTu/0Tp/NM+3u7vK3f/u3ADzjGc/g0qVL7O7u8vzY5gWxzXOzzfHjxwE4fvw4x44d48EPfjDHjx/nwQ9+MAD33Xffrf/wD//w2//wD//wO/fdd9+t//AP//DbXHXVVVddddVVV131PxF60IMexFVXXXXVVVddddVV/3O82Iu92Gu/2Iu92Gu90zu902cD7O7u8rd/+7cAPOMZz+AZz3gG/162eW62eSDbPJBtjh8/jm0e/OAH85CHPIRjx47xkIc8hPvuu+/Wf/iHf/jtf/iHf/id3/qt3/purrrqqquuuuqqq676nwI96EEP4qqrrrrqqquuuuqq/16v8zqv894v9mIv9lqv8zqv8967u7tcunSJZzzjGfzu7/4uDySJfyvbvCC2eSDb3M8297PN/WwDcOzYMR7ykIfw4Ac/mJd5mZfhvvvuu/Uf/uEffvsf/uEffue3fuu3vpurrrrqqquuuuqqq/47oQc96EFcddVVV1111VVXXfVf75prrnnwa7/2a7/XO73TO3327u4uf/u3f8sznvEMnvGMZ3A/SfxLJPFAtnlR2Oa52eaBbHM/29zPNgC2uZ9tjh8/zvHjx3mZl3kZXuZlXob77rvv1n/4h3/47d/6rd/6nn/4h3/4ba666qqrrrrqqquu+q+GHvSgB3HVVVddddVVV1111X+Na6655sGv/dqv/V6v8zqv894Ay+XywX/zN3/D3/7t33I/STw3SfxHsc1zs81zs839bHM/2wDY5n62AbANgG2OHz/Ogx/8YB7ykIfwsi/7stx33323/tZv/dZ3/+iP/ujncNVVV1111VVXXXXVfxX0oAc9iKuuuuqqq6666qqr/nNdc801D37t137t93qnd3qnz97d3eVv/uZv+L3f+z3uJ4kHksQLIol/Ddu8ILZ5brZ5INvczzb3sw2AbQBsA2AbANsA2Ob48eO8zMu8DDfffPOtx48f57d+67e++7d/+7e/57777ruVq6666qqrrrrqqqv+M6EHPehBXHXVVVddddVVV131n+Oaa6558Gu/9mu/1zu90zt99u7uLr/7u7/L3/7t33I/SdxPEs9NEv8ZbPPcbPNAtnkg29zPNgC2AbANgG0AbANgGwDb2ObEiRM8+MEP5mVf9mXZ2tq69R/+4R9++0d/9Ec/57777ruVq6666qqrrrrqqqv+M6AHPehBXHXVVVddddVVV131H+uaa6558Gu/9mu/1zu90zt99u7uLj/7sz/Lbbfdxv0kcT9JPJAknh9J/HvY5vmxzXOzzf1scz/b3M82ALa5n20AbANgG9sA2MY2ALY5fvw4b//2b8/W1tat//AP//DbP/qjP/o59913361cddVVV1111VVXXfUfCT3oQQ/iqquuuuqqq6666qr/OK/zOq/z3h/+4R/+Xbu7u/zsz/4sz3jGM5AEgCTuJ4n7SeK5SeKFkcQLYpt/iW2em20eyDb3s839bHM/2wDYBsA2ALYBsI1tAGxjGwDb2ObEiRO8/du/PVtbW7f+1m/91nf/6I/+6Odw1VVXXXXVVVddddV/FPSgBz2Iq6666qqrrrrqqqv+/V7sxV7stT/3cz/3t3Z3d/nZn/1ZnvGMZyCJ+0kCQBL3k8QDSeK5SeI/km2em20eyDYPZJv72eZ+tgGwDYBtAGwDYBsA29gGwDa2AbCNbWzzci/3crz+678+4zje+lu/9Vvf/aM/+qOfw1VXXXXVVVddddVV/17oQQ96EFddddVVV1111VVX/dtdc801D/7wD//w77rxxhtf+2/+5m/43d/9XQAkASAJAEncTxL3k8QDSeIFkcS/lm1eENs8N9s8kG3uZxsA29zPNgC2AbANgG0AbANgG9sA2MY2ALaxjW2OHz/Oy73cy/EGb/AG3Hfffbd+1md91uvcd999t3LVVVddddVVV1111b8V5fjx41x11VVXXXXVVVdd9W/zju/4jp/1SZ/0ST99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z00S/xls88JI4qr/HLb5r2ab/0i2+ZdsbW0BcN99993KVVddddVVV1111X8fKlddddVVV1111VX/g9nmuUniP5tt/iWSuOrZbPPfzTb/GWxz1VVXXXXVVVdd9b8Ulauuuuqqq6666qr/ZWzz/Ejiv5Jt/q0k8T+Vbf6ns81/Jtv8e21ubgJw33333cpVV1111VVXXXXVfx8qV1111VVXXXXVVf+N7rvvvltf7MVejM3NTf69bPOCSOJ/Ettc9S+zzX822/xHs81VV1111VVXXXXV/xBUrrrqqquuuuqqq/4HsI1tJPGfwTYvjCSu+q9nm/9KtvnPYJurrrrqqquuuuqq/6GoXHXVVVddddVVV/03uu+++24F2NraAsA2z48k/jPZ5l8iiatedLb572Sb/yy2+Zdsbm4CcN999z2dq6666qqrrrrqqv8+VK666qqrrrrqqqv+F7DNc5PEfyXb/GtI4v8S2/xPZJv/bLa56qqrrrrqqquu+l+KylVXXXXVVVddddX/UrZ5QSTx3802V/3Hsc1/Fdv8e21tbQFw9uzZZ3DVVVddddVVV13134fKVVddddVVV1111X+js2fPPgNgc3OT/0i2eUEkcdX/TLb5r2ab/0i2ueqqq6666qqrrvofhMpVV1111VVXXXXV/xC2kcR/Ntu8MJK46j+Hbf472eY/g22uuuqqq6666qqr/oeictVVV1111VVXXfXf6L777rsVYGtrCwDbPDdJ/FeyzYtKEleBbf6nsc1/Btu8KDY3NwE4e/bsrVx11VVXXXXVVVf996Fy1VVXXXXVVVdd9T+cbZ4fSfx3s82/lST+p7DN/1a2+c9km6uuuuqqq6666qr/xahcddVVV1111VVX/S9lmxdEEv/T2eaqF41t/qvY5j/C1tYWAPfdd9+tXHXVVVddddVVV/33oXLVVVddddVVV1313+js2bO3AmxubvIfyTYviCSu+p/HNv/VbPMfzTZXXXXVVVddddVV/4NQueqqq6666qqrrvofwjaS+M9mmxdGElf9x7PNfyfb/GewzVVXXXXVVVddddX/YFSuuuqqq6666qqr/gexzfMjif8qtnlRSeL/M9v8T2Ob/0y2eVFsbW0BcN99993KVVddddVVV1111X8fKlddddVVV1111VX/je67775bAba2tnhhbPP8SOK/k23+I0jiv5pt/jez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qquuuuqqq/77Ubnqqquuuuqqq676H+Ds2bPPANja2uI/g21eFJK46t/PNv/T2eaqq6666qqrrrrq/wEqV1111VVXXXXVVVc9i23+tSTxf5lt/rezzVVXXXXVVVddddX/U1Suuuqqq6666qqr/ge47777bgXY3t7mfxvbXPXfzzb/XWxzv62tLQDuu+++W7nqqquuuuqqq67670flqquuuuqqq6666n8Y27wgkrjq/zfb/HeyzVVXXXXVVVddddX/IlSuuuqqq6666qqr/hexzQsiiav+97PN/yS2+dfY3t4G4OzZs7dy1VVXXXXVVVdd9d+PylVXXXXVVVddddX/AGfPnr0VYGtri38r2/xLJHHVfx/b/E9mm6uuuuqqq6666qr/Y6hcddVVV1111VVX/T9imxeVJK560djmfxPbXHXVVVddddVVV/0/QeWqq6666qqrrrrqqufLNv8ekvjfwjb/F9nmv9r29jYA9913361cddVVV1111VVX/fejctVVV1111VVXXfU/wH333XcrwPb2Nv9X2Oaq/xq2+e9km6uuuuqqq6666qr/oahcddVVV1111VVX/Q9jmxdEElf9/2Sb/wlsc9VVV1111VVXXfW/CMFVV1111VVXXXXV/xD33XffrQDb29u8ILaxjW1sYxvb2MY2trnqfyfb2MY2trGNbWxjm/8utrGNbWzzwmxvbwNw33333cpVV1111VVXXXXV/wxUrrrqqquuuuqqq/6Psc2/RBJX/dexzf90trnqqquuuuqqq676P4jgqquuuuqqq6666n+Is2fP3gqwtbXFfzbb2MY2trGNbWxjG9vYxja2ueo52cY2trGNbWxjG9vYxja2sc3/NLaxjW1sY5v/CNvb21x11VVXXXXVVVf9D0Plqquuuuqqq6666qp/kW3+o0jiv4tt/j+xzX+Hs2fP3spVV1111VVXXXXV/wxUrrrqqquuuuqqq676L2Wbq/5j2ea/m21sc9VVV1111VVXXfU/DMFVV1111VVXXXXV/zDb29vYxja2sY1tbHPV/0+2sY1tbGMb29jGNv/VbGMb29jGNgDb29sA3Hfffbdy1VVXXXXVVVdd9T8DwVVXXXXVVVddddX/EPfdd9+t/AtsYxvb2MY2trGNba7638k2trGNbWxjG9vY5r+TbWxjG9vY5qqrrrrqqquuuup/ESpXXXXVVVddddVV/4fY5kUhiav+a9jmfwvbXHXVVVddddVVV/0fQ+Wqq6666qqrrrrqf4j77rvvVoCtrS3+s9nmX0MSV11hm/8LbPMfbXt7G4D77rvvVq666qqrrrrqqqv+Z6By1VVXXXXVVVddddW/yDb/0STxn802/9/Z5qqrrrrqqquuuur/MSpXXXXVVVddddVVV/23sM1V/zFs8z/B9vY2AGfPnn0GV1111VVXXXXVVf8zULnqqquuuuqqq676H+Ls2bPPANje3sY2z00SV/3/ZZv/aWxz1VVXXXXVVVdd9T8clauuuuqqq6666qr/JWzzwkjiqv+9bPM/mW2uuuqqq6666qqr/heictVVV1111VVXXfU/xH333XcrwPb2Nv8WtvmXSOKq/3q2+d/ENv8WW1tbANx33323ctVVV1111VVXXfU/A5Wrrrrqqquuuuqq/0ds868liauek23+L7DNVVddddVVV1111f9xVK666qqrrrrqqquueqFs8x9JEv/VbPP/mW3+K+zs7ABw9uzZW7nqqquuuuqqq676n4HKVVddddVVV1111f8QZ8+evRVge3ub/8tsc9V/DttcddVVV1111VVXXfUcqFx11VVXXXXVVVf9D2QbAElcddUD2eZ/GttcddVVV1111VVX/Q9F5aqrrrrqqquuuup/MNu8MJK46v8W2/xPZpsXZHt7G4D77rvvVq666qqrrrrqqqv+Z6By1VVXXXXVVVdd9T/EfffddyvA9vY2Lyrb/EskcdX/DLb538Q2V1111VVXXXXVVf/LUbnqqquuuuqqq676P842/xqSuOpFY5v/C2xz1VVXXXXVVVdd9X8UwVVXXXXVVVddddX/IPfdd9+tANvb2/x3sY1tbGMb29jGNraxjW1sYxvb2MY2trHN/wa2sY1tbGMb29jGNraxjW1sYxvb2MY2tvnfyDa2sY1tbPMfYXt7G4D77rvvVq666qqrrrrqqqv+56By1VVXXXXVVVddddV/ONtc9d/HNlddddVVV1111VVXXUZw1VVXXXXVVVdd9T/I2bNnbwXY3t7mqqteGNvYxja2sY1tbPPfYXt7G4CzZ8/eylVXXXXVVVddddX/HFSuuuqqq6666qqr/geyjW2emySu+v/DNv+T2eaqq6666qqrrrrqfzgqV1111VVXXXXVVf+L2OZfIomr/uezzf8mtrnqqquuuuqqq676X4jgqquuuuqqq6666n+Q++6771aAnZ0d/q1sYxvb2MY2trGNbWxjG9tc9R/PNraxjW1sYxvb2MY2tvmfzDa2sY1tbPMv2d7eBuC+++67lauuuuqqq6666qr/OahcddVVV1111VVX/T9mm38LSfxfZpv/D2xz1VVXXXXVVVdd9X8clauuuuqqq6666qqr/tVsc9X/Hra56qqrrrrqqquu+n+KylVXXXXVVVddddX/IPfdd9+tANvb21x11b+Gbf47bW9vA3DffffdylVXXXXVVVddddX/HFSuuuqqq6666qqr/geyzVVXPTfbXHXVVVddddVVV131r0Llqquuuuqqq6666n8o27wwkrjq/xbb/G9hmwfa3t4G4OzZs8/gqquuuuqqq6666n8OKlddddVVV1111VX/g5w9e/YZADs7O/xLbPOikMRV/71s87+Zba666qqrrrrqqqv+l6Jy1VVXXXXVVVdd9X+cbf41JHHVC2eb/4tsc9VVV1111VVXXfV/DJWrrrrqqquuuuqq/0Huu+++WwG2t7f572Kb/yiS+J/CNlddYZv/aDs7OwDcd999t3LVVVddddVVV131PweVq6666qqrrrrqqqv+09jmqv8+trnqqquuuuqqq676f47KVVddddVVV1111VVX/S9mm/8Jtre3ATh79uytXHXVVVddddVVV/3PQeWqq6666qqrrrrqf5CzZ8/eCrC9vY1tJHHVVba56qqrrrrqqquuuurfhMpVV1111VVXXXXV/2C2+ZdI4qr/vWzzv5ltrrrqqquuuuqqq/4Ho3LVVVddddVVV131v5xtXhSSuOq/jm3+r7HNC7KzswPAfffddytXXXXVVVddddVV/3NQueqqq6666qqrrvof5L777rsVYGdnh/9otvm3kMT/Z7b5/8Y2V1111VVXXXXVVf9HULnqqquuuuqqq6666oWyzVX/N9nmqquuuuqqq6666v84gquuuuqqq6666qr/Ye67775bAba3t7nqqv8ItrGNbWxjG9v8R9nZ2QHg7Nmzz+Cqq6666qqrrrrqfxYqV1111VVXXXXVVVdd9X+Aba666qqrrrrqqquueh4EV1111VVXXXXVVf/D3HfffbcC7OzscNVVD2Qb29jGNraxjW3+O21vbwNw33333cpVV1111VVXXXXV/yxUrrrqqquuuuqqq/6Hso1tnpskrvq/yTb/29jGNlddddVVV1111VX/Q1G56qqrrrrqqquu+l/GNi8KSVz1P4Nt/i+wzVVXXXXVVVddddX/MlSuuuqqq6666qqr/oc5e/bsrQA7Ozvceeed/FvZ5l9LEle9cLb5/8A2L6qdnR0A7rvvvlu56qqrrrrqqquu+p+FylVXXXXVVVddddVVz2Kb/2iS+O9im6teONtcddVVV1111VVX/R9G5aqrrrrqqquuuuqq/1S2ueq/n22uuuqqq6666qqr/h+ictVVV1111VVXXfU/zH333XcrwPb2Nldd9a9hm/8OOzs7ANx3331P56qrrrrqqquuuup/FipXXXXVVVddddVVV131v4Rtrrrqqquuuuqqq676V6Fy1VVXXXXVVVdd9T+YbR5IElf932Wb/412dnYAOHv27DO46qqrrrrqqquu+p+FylVXXXXVVVddddX/MGfPnr0VYGdnh+dmmxeVJK76n8E2/5fY5oFsc9VVV1111VVXXfU/FJWrrrrqqquuuuqq/6Ns868hiav+Zbb5/8I2V1111VVXXXXVVf/LUbnqqquuuuqqq676H+a+++67FWB7e5v/Srb5jyaJ/062uepfZpt/j52dHQDOnj17K1ddddVVV1111VX/s1C56qqrrrrqqquuuuo/jW2u+p/DNlddddVVV1111VX/z1C56qqrrrrqqquuuuqq/0Ns819tZ2cHgPvuu+9Wrrrqqquuuuqqq/5noXLVVVddddVVV131P8x99913K8DOzg5XXfX82Oaqq6666qqrrrrqqhcJlauuuuqqq6666qr/wWwDIImr/n+wzVVXXXXVVVddddVV/2GoXHXVVVddddVVV/0vYJsXhSSu+p/JNv/X2AZgZ2cHgPvuu+9Wrrrqqquuuuqqq/5noXLVVVddddVVV131P8zZs2efAbCzs8O/lm3+NSRx1b+Nbf6/sM1VV1111VVXXXXV/1JUrrrqqquuuuqqq/4fs81/FEn8b2Cbq14w21x11VVXXXXVVVf9H0Llqquuuuqqq6666n+g++6779ZrrrnmwTs7O+zt7fG/gW2u+t/BNv9RdnZ2ALjvvvtu5aqrrrrqqquuuup/HipXXXXVVVddddVVV131f5Rtrrrqqquuuuqqq/6fI7jqqquuuuqqq676H+js2bO3Auzs7HDVVS+IbWxjG9vYxja2sc1/hZ2dHQDOnj17K1ddddVVV1111VX/81C56qqrrrrqqquuuuqq/6Fsc9VVV1111VVXXXXVvwuVq6666qqrrrrqqv/BbGObF0QSV/3vZJurrrrqqquuuuqqq/7TEVx11VVXXXXVVVf9D3TffffdCrCzs8MLYxvb2MY2trGNbWxjG9vY5qr/fLaxjW1sYxvb2MY2trGNbf43s41tbLO9vQ3AfffddytXXXXVVVddddVV//NQueqqq6666qqrrvp/wjb/HpL4v842Vz2bba666qqrrrrqqqv+l6Ny1VVXXXXVVVdd9T/Yzs4O/1PY5qr/m2xz1VVXXXXVVVdd9X8Ulauuuuqqq6666qr/ge67775bueqq/2C2+Y+2s7MDwH333XcrV1111VVXXXXVVf/zULnqqquuuuqqq6666qr/I2xz1VVXXXXVVVddddVzoHLVVVddddVVV131P9jOzg5XXfVAtvmf5NixYwCcPXv2GVx11VVXXXXVVVf9z0Plqquuuuqqq6666n+gs2fPPoNnso0krvq/zzZXXXXVVVddddVVV/2HonLVVVddddVVV131P9jOzg4AtnlRSOKq/1lsc9VVV1111VVXXXXVfxsqV1111VVXXXXVVf8D3Xfffbfyb2CbfwtJXPUvs83/Z7Z5btvb2wDcd999t3LVVVddddVVV131Pw+Vq6666qqrrrrqqquwzX8GSfx3sM1V/3a2ueqqq6666qqrrvo/gspVV1111VVXXXXV/2A7Ozv8b2abq/7nss2/17FjxwA4e/bsrVx11VVXXXXVVVf9z0Plqquuuuqqq6666n+gs2fP3spVV/0HsM1VV1111VVXXXXV/2NUrrrqqquuuuqqq6666n8521x11VVXXXXVVVdd9XxRueqqq6666qqrrrrqqv/hbPM/1c7ODgD33XffrVx11VVXXXXVVVf9z0Plqquuuuqqq6666n+g++6771aAnZ0dbHM/SVz1f4dtrrrqqquuuuqqq676T0Xlqquuuuqqq6666n8R2/xrSOKq/1q2ueqqq6666qqrrrrqfwyCq6666qqrrrrqqv+h7rvvvlsBdnZ2+LeyjW1sYxvb2MY2trGNbWxjG9vYxjb/n9nGNraxjW1sYxvb2MY2trGNbWxjm//LbGMb29hme3sbgPvuu+9Wrrrqqquuuuqqq/5nonLVVVddddVVV1111fNlm6v+f7LNVVddddVVV1111f8RBFddddVVV1111VX/Q509e/ZWgJ2dHa666j+abWxjG9vYxja2eVEdO3YMgLNnz97KVVddddVVV1111f9MVK666qqrrrrqqquuuur/KNtcddVVV1111VVX/T9H5aqrrrrqqquuuuqqq/4Xs81VV1111VVXXXXVVS8QwVVXXXXVVVddddX/UPfdd9+tAMeOHeOq/59sYxvb2MY2trGNbWzz32lnZweA++6771auuuqqq6666qqr/meictVVV1111VVXXfU/nG1s80CSuOp/N9tcddVVV1111VVXXfWfjspVV1111VVXXXXV/1D33XffrQA7Ozs8N9v8a0jiqv9ctrnqqquuuuqqq6666n8cKlddddVVV1111VX/D9jm30sS/1fZ5qp/mW0eaGdnB4D77rvvVq666qqrrrrqqqv+Z6Jy1VVXXXXVVVddddWLxDZX/f9gm6uuuuqqq6666qr/I6hcddVVV1111VVX/Q919uzZZwAcO3aMq676z2Cbf4+dnR0Azp49+wyuuuqqq6666qqr/meictVVV1111VVXXXXVVf+H2eaqq6666qqrrrrq/zEqV1111VVXXXXVVf9D3XfffbcC7OzscNVVL4htrrrqqquuuuqqq656gahcddVVV1111VVXXXXV/1C2+Z/s2LFjANx33323ctVVV1111VVXXfU/E5Wrrrrqqquuuuqq/wVscz9JXPW/m22uuuqqq6666qqrrvovQeWqq6666qqrrrrqf6izZ8/eCrCzs8MD2eZfSxJX/eexzf9HOzs7AJw9e/ZWrrrqqquuuuqqq/5nonLVVVddddVVV131/4Bt/iNI4v8S21z1r2ebq6666qqrrrrqqv8lqFx11VVXXXXVVVdd9SKzzVX/P9jmqquuuuqqq6666v8AKlddddVVV1111VVXXfX/mG3+rY4dOwbAfffddytXXXXVVVddddVV/zNRueqqq6666qqrrvof6r777rsV4NixY1x11b+Hba666qqrrrrqqqv+n6Jy1VVXXXXVVVddddVV/8vZ5qqrrrrqqquuuuqq54vgqquuuuqqq6666n+w++6771aAY8eOcdX/T7axjW1sYxvb2MY2tvnvsLOzA8B99913K1ddddVVV1111VX/c1G56qqrrrrqqquu+l/ANraRxFX/d9jmqquuuuqqq6666qr/VARXXXXVVVddddVV/4OdPXv2VoCdnR0AbGMb29jGNraxjW1sYxvb2Oaq/zq2sY1tbGMb29jGNraxjW1sY5v/zY4dOwbA2bNnb+Wqq6666qqrrrrqfy4qV1111VVXXXXVVf+H2ebfSxL/H9jmqquuuuqqq6666qr/c6hcddVVV1111VVXXfVC2eaq/99s89xsc9VVV1111VVXXfW/AMFVV1111VVXXXXV/2D33XffrQDHjh3jqqv+M9nGNraxjW1sY5vn59ixYwDcd999t3LVVVddddVVV131PxeVq6666qqrrrrqqquu+n/CNlddddVVV1111VX/z1C56qqrrrrqqquu+h/svvvuuxVgZ2eHq656Udjmqquuuuqqq6666qpnoXLVVVddddVVV1111VX/S9jmf4pjx44BcN99993KVVddddVVV1111f9cVK666qqrrrrqqquuuup/ANtcddVVV1111VVXXfUfjspVV1111VVXXXXV/2Bnz559BsCxY8ewzb9EElf9z2Cb/8uOHTsGwNmzZ5/BVVddddVVV1111f9cVK666qqrrrrqqqv+D7HNv5UkrnpOtrnqqquuuuqqq6666n81KlddddVVV1111VX/g9133323Ahw7doz/bLa56qp/iW0AbHPVVVddddVVV131vwCVq6666qqrrrrqqquuuup52OaFOXbsGAD33XffrVx11VVXXXXVVVf9z0Xlqquuuuqqq6666qqr/p+yzVVXXXXVVVddddX/cVSuuuqqq6666qqr/gc7e/bsrQA7OztcddW/lm3+sxw7dgyAs2fP3spVV1111VVXXXXV/1xUrrrqqquuuuqqq6666n8p21x11VVXXXXVVVdd9UJRueqqq6666qqrrrrqqv+BbHPVVVddddVVV1111b8blauuuuqqq6666qr/JWxzP0lc9b+Pbf6vOHbsGAD33XffrVx11VVXXXXVVVf9z0Xlqquuuuqqq6666n+w++6771aAY8eO8UC2+beQxFX/MWxz1VVXXXXVVVddddX/eFSuuuqqq6666qqr/h+xzX80SfxPZpurrrrqqquuuuqqq/7fIrjqqquuuuqqq676H+6+++67FeDYsWP8T2Qb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxz1X8M29jGNjs7OwDcd999t3LVVVddddVVV131PxuVq6666qqrrrrqqquuuuoy21x11VVXXXXVVVf9H0Nw1VVXXXXVVVdd9T/c2bNnbwU4duwYV13172Ub29jGNraxjW1eVMeOHQPg7Nmzt3LVVVddddVVV131PxuVq6666qqrrrrqqquu+j/ENlddddVVV1111VVXPQuVq6666qqrrrrqqquu+l/CNv8THDt2jKuuuuqqq6666qr/JQiuuuqqq6666qqr/oe77777bgU4duwYV/3fZRvb2MY2trGNbWxjm/9p7rvvvlu56qqrrrrqqquu+p+NylVXXXXVVVddddX/EraxzQsiiav+57DNVVddddVVV1111VX/7ahcddVVV1111VVX/Q9333333Qpw7NgxXhjb/HtI4qpns81VV1111VVXXXXVVf/rUbnqqquuuuqqq6666jLbXHXVi+LYsWMA3Hfffbdy1VVXXXXVVVdd9T8blauuuuqqq6666qqrrrrqhbLNA9nmqquuuuqqq6666n8JKlddddVVV1111VX/w509e/YZAMeOHeOqq/6z2OZFdfz4cQDOnj37DK666qqrrrrqqqv+Z6Ny1VVXXXXVVVddddVV/w/Y5qqrrrrqqquuuur/ISpXXXXVVVddddVV/8Pdd999twIcO3aMq656QWxz1VVXXXXVVVddddXzoHLVVVddddVVV1111VX/w9nmf5Jjx44BcN99993KVVddddVVV1111f9sVK666qqrrrrqqquuuuq/gW2uuuqqq6666qqrrvpPR+Wqq6666qqrrrrqf7izZ8/eCnDs2DFs86KSxFX/NWzz/8mxY8cAOHv27K1cddVVV1111VVX/c9G5aqrrrrqqquuuur/KNv8R5HE/zW2ueqqq6666qqrrrrq/zwqV1111VVXXXXVVVf9i2xz1VVXXXXVVVddddVV/wtRueqqq6666qqrrvpf4tixY1x11X812zy3Y8eOAXDffffdylVXXXXVVVddddX/bFSuuuqqq6666qqr/oe77777buWqq/4T2eaqq6666qqrrrrq/ygqV1111VVXXXXVVVdd9X+cba666qqrrrrqqqv+nyK46qqrrrrqqquu+l/gvvvuuxXg2LFjXHXVc7ONbWxjG9vYxja2+Y907NgxAM6ePfsMrrrqqquuuuqqq/7no3LVVVddddVVV1111VX/g9nmqquuuuqqq6666qp/M4Krrrrqqquuuuqq/wXuu+++WwGOHTvGVf/72cY2trGNbWxjG9vYxja2+Z/m2LFjANx33323ctVVV1111VVXXfU/H5Wrrrrqqquuuuqq/0VsY5t/LUlc9R/PNlddddVVV1111VVX/Y9G5aqrrrrqqquuuur/Adv8R5PE/xa2ueo/xvHjx7nqqquuuuqqq676X4TKVVddddVVV1111f8CZ8+evRXg+PHj3HbbbfxPYJur/v+67777buWqq6666qqrrrrqfz4qV1111VVXXXXVVVddddULZZv72eaqq6666qqrrrrqfxEqV1111VVXXXXVVf8L3HfffbcCHDt2jKuu+s9gm6uuuuqqq6666qr/g6hcddVVV1111VVXXXXV/wO2+Y9w7NgxAO67776nc9VVV1111VVXXfU/H5Wrrrrqqquuuuqqq676X842V1111VVXXXXVVVc9X1Suuuqqq6666qqr/hc4e/bsrQDHjh3jqv9fbPM/yfHjxwE4e/bsM7jqqquuuuqqq676n4/KVVddddVVV1111VVX/ReyzVVXXXXVVVddddVV/2WoXHXVVVddddVVV/0vcN99990KcOzYMWzzryWJq/5j2eaqq6666qqrrrrqqv/xqFx11VVXXXXVVVf9P2Cb/yyS+J/KNlf9xzp27BgAZ8+evZWrrrrqqquuuuqq//moXHXVVVddddVVV13172Kbq6666qqrrrrqqquu+h+KylVXXXXVVVddddX/Avfdd9+tAMePH+eqq/472Abg2LFjANx33323ctVVV1111VVXXfU/H5Wrrrrqqquuuuqqq6666jLbXHXVVVddddVVV/0fQ+Wqq6666qqrrrrqqqv+n7DNVVddddVVV1111f8zVK666qqrrrrqqqv+Fzh79uwzAI4dO8ZVV70gtvnPdvz4cQDuu+++W7nqqquuuuqqq676n4/KVVddddVVV1111VVX/Q9nm6uuuuqqq6666qqr/k2oXHXVVVddddVVV1111X8D21x11VVXXXXVVVdd9Z+O4Kqrrrrqqquuuup/ifvuu+9WgGPHjmEb29jGNraxjW1sYxvbXPWfzza2sY1tbGMb29jGNraxjW1sY5v/jY4fPw7AfffddytXXXXVVVddddVV/ztQueqqq6666qqrrvo/zDb/GSTxv41trrrqqquuuuqqq676f4fgqquuuuqqq6666n+Js2fP3gpw7Ngx/rvZxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNba7697vlllsAOHv27K1cddVVV1111VVX/e9A5aqrrrrqqquuuuqqq656kVy6dImrrrrqqquuuuqq/2WoXHXVVVddddVVV1111VX/ItscO3YMgPvuu+9Wrrrqqquuuuqqq/53ILjqqquuuuqqq676X+K+++67FeDYsWNcddV/NNvYxja2sY1tbGObq6666qqrrrrqqv+lqFx11VVXXXXVVVf9L3HffffdCnD8+HGuuupfyzb/XseOHQPgvvvuu5Wrrrrqqquuuuqq/x2oXHXVVVddddVVV/0vc+zYMa666oFs81/h+PHjAJw9e/YZXHXVVVddddVVV/3vQOWqq6666qqrrrrqf4l/+Id/+B2A48ePc9X/D7b5n+T48eNcddVVV1111VVX/S9D5aqrrrrqqquuuup/ibNnz94KcOzYMa7638k2/5sdO3YMgH/4h3/4ba666qqrrrrqqqv+d6By1VVXXXXVVVdd9b/EfffddyvA8ePHsc2/hSSu+vexzf9Xx48fB+C+++67lauuuuqqq6666qr/HQiuuuqqq6666qqr/hf5h3/4h98GeNCDHsS/hW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sY5v/SraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW3+v3qpl3opAP7hH/7ht7nqqquuuuqqq67634Pgqquuuuqqq6666n+Rv//7v/9tgAc96EH8T2cb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jmqv86f//3f//bXHXVVVddddVVV/3vQXDVVVddddVVV131v8g//MM//A7Agx/8YK666r/Sgx70IADOnj37DK666qqrrrrqqqv+96By1VVXXXXVVVdd9b/I2bNnbwU4duwYV131n8k2D/SgBz0IgH/4h3/4ba666qqrrrrqqqv+9yC46qqrrrrqqquu+l/kvvvuu/Uf/uEffvv48eM86EEP4qqr/q1sYxvb2MY2trGNbR7opV7qpTh+/DgA9913361cddVVV1111VVX/e9BcNVVV1111VVXXfW/zN///d//NsCDHvQgrrrq+bGNbWxjG9vYxja2sc2/xvHjxwH4rd/6re/mqquuuuqqq6666n8Xgquuuuqqq6666qr/Zf7hH/7hdwBe+qVfmqv+f7GNbWxjG9vYxja2sY1t/qO91Eu9FAC/9Vu/9T1cddVVV1111VVX/e9CcNVVV1111VVXXfW/zNmzZ28FOHbsGA960IO46n8329jGNraxjW1sYxvb2MY2/12OHz8OwD/8wz/8NlddddVVV1111VX/uxBcddVVV1111VVX/S9z33333fpbv/Vb3w3woAc9CNvYxja2sc1V//VsYxvb2MY2trGNbWxjG9vYxja2+Z/utV7rtQD4rd/6re/mqquuuuqqq6666n8fgquuuuqqq6666qr/hX7rt37rewBe6qVeiufHNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1t/i+yjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGOb/6te6qVeCoDf+q3f+h6uuuqqq6666qqr/vchuOqqq6666qqrrvpf6B/+4R9+++///u9/+/jx4zzoQQ/iP5ttbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jmqn/ZS73US3H8+HEA/uEf/uG3ueqqq6666qqrrvrfh+Cqq6666qqrrrrqf6nf/u3f/h6A13qt1+Kqq/4zvNRLvRQAX//1X/8+XHXVVVddddVVV/3vRHDVVVddddVVV131v9Tf//3f/9Z999136/Hjx3nQgx7EVVf9Rzp+/DgPfvCDAfiHf/iH3+aqq6666qqrrrrqfyeCq6666qqrrrrqqv+lzp49+4x/+Id/+O3jx4/z0i/90lx11b+HbWxjG9u85mu+JgC/9Vu/9d333XffrVx11VVXXXXVVVf970Rw1VVXXXXVVVdd9b/Yj/7oj34OwIMe9CCOHz/OVVe9ILaxjW1sYxvb2MY2z+2lX/qlAfjRH/3Rz+Gqq6666qqrrrrqfy+Cq6666qqrrrrqqv/F7rvvvlv/4R/+4bePHz/Oa73Wa3HV/0+2sY1tbGMb29jGNrb513irt3orAH7rt37ru++7775bueqqq6666qqrrvrfi+Cqq6666qqrrrrqf7mv//qvfx+ABz3oQTz4wQ/mqv8bbGMb29jGNraxjW1sYxvb/Ec6fvw4L/3SLw3Aj/7oj34OV1111VVXXXXVVf+7EVx11VVXXXXVVVf9L3fffffd+lu/9Vvfffz4cV7rtV6Lq/7nsY1tbGMb29jGNraxjW1sYxvb/Hd5q7d6KwB+67d+67vvu+++W7nqqquuuuqqq676343gqquuuuqqq6666v+AH/3RH/0cgAc96EE86EEPwja2sY1tbGMb29jGNle96GxjG9vYxja2sY1tbGMb29jGNraxjW3+t3jwgx/Mgx/8YAB+9Ed/9HO46qqrrrrqqquu+t+Pcvz4ca666qqrrrrqqqv+tzs8PNw9e/bsM17xFV/xrR/84AfzJ3/yJ1x11b/WW73VW3H8+HF+5Ed+5LP/9E//9Ge46qqrrrrqqquu+t+Pcvz4ca666qqrrrrqqqv+Lzg6Otp98IMf/NK33HLLgwGe8YxncNVVL6rXeq3X4qVf+qW57777bv3SL/3St+Gqq6666qqrrrrq/waCq6666qqrrrrqqv8j7rvvvlt/9Ed/9LMBXvqlX5oHP/jBXHXVi+LBD34wr/3ar819991369d//de/D1ddddVVV1111VX/dxBcddVVV1111VVX/R/yD//wD7/zIz/yI599/Phx3uqt3oqrrnpRvNZrvRYA//AP//Db//AP//DbXHXVVVddddVVV/3fQTl+/DhXXXXVVVddddVV/5ecPXv2GQ95yENe+pZbbnnw8ePHeeITn8hVV70gb/VWb8WjH/1o7rvvvls/67M+63W46qqrrrrqqquu+r+F4Kqrrrrqqquuuur/mPvuu+/Wr//6r38fgJd+6ZfmpV/6pbnq/yfb2MY2trGNbWxjmwc96EG89Eu/NABf//Vf/z5cddVVV1111VVX/d9DOX78OFddddVVV1111VX/1xweHu6ePXv2Ga/4iq/41tdddx1PfOITWa1WXPV/g23+vY4fP84Hf/AHA/AjP/Ijn/3bv/3b38NVV1111VVXXXXV/z2U48ePc9VVV1111VVXXfV/0a233vrXAC//8i//2o9+9KP5kz/5E676n8k2/9Xe+Z3fmePHj/MP//APv/31X//178NVV1111VVXXXXV/02U48ePc9VVV1111VVXXfV/1dmzZ5/x4Ac/+KVvueWWBz/4wQ/m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2Iu91ju+4zt+9jXXXPNggN3dXf76r/+a3/qt3+L/Ctv8Zzh+/Dgv8zIvw+u8zutwv/vuu+/W3/qt3/ruH/3RH/0crrrqqquuuuqqq67690APetCDuOqqq6666qqrrrrq3++aa6558Iu92Iu99uu8zuu814033vjax48fZ3d3l6c//en81V/9FbfeeitXPdvx48d5mZd5GV7ndV6H+9133323/tZv/dZ3/+iP/ujncNVVV1111VVXXXXVfwT0oAc9iKuuuuqqq6666qqr/mO92Iu92Gu/zuu8znu9zuu8znvzTLu7u/zVX/0Vf/VXf8Xu7i7/Hx0/fpyXeZmX4WVe5mU4fvw497vvvvtu/dEf/dHP+a3f+q3v5qqrrrrqqquuuuqq/0joQQ96EFddddVVV1111VVX/ee45pprHvzar/3a7/U6r/M6733NNdc8mGfa3d3lr/7qr/irv/ordnd3+b/s+PHjvMzLvAwPfvCDechDHgLAfffddyvAb/3Wb333b//2b3/PfffddytXXXXVVVddddVVV/1nQA960IO46qqrrrrqqquuuuo/1zXXXPPgF3uxF3vtF3uxF3ut13md13lvHmB3d5e/+qu/4ulPfzq33nor/xccP36cl3mZl+FlXuZlOH78OA/0Iz/yI5999uzZZ/zWb/3Wd3PVVVddddVVV1111X829KAHPYirrrrqqquuuuqqq/7rXHPNNQ9+sRd7sdd+sRd7sdd6ndd5nffmAXZ3d7l48SK33norT3/607n11lv53+D48eO8zMu8DA9+8IN5yEMewgPdd999t/7DP/zDb9933323/uiP/ujncNVVV1111VVXXXXVfyX0oAc9iKuuuuqqq6666qqr/ntcc801Dz5z5syDXud1Xue9r7nmmge/2Iu92GvzALu7uwA8/elP59Zbb+XixYvceuut/Hc5fvw4AC/zMi8DwIMf/GAe8pCH8Nzuu+++W3/rt37ru//hH/7ht//hH/7hd7jqqquuuuqqq6666r8LetCDHsRVV1111VVXXXXVVf8zXHPNNQ9+sRd7sdd+sRd7sde65pprHvxiL/Zir83zsbu7y8WLF9nd3WV3d5fd3V0uXrwIwO7uLru7u/xbHD9+HIDjx49z4sQJjh8/DsCDH/xgHvKQh/CC3Hfffbf+1m/91ncD/OiP/ujncNVVV1111VVXXXXV/xToQQ96EFddddVVV1111VVX/c90zTXXPPjMmTMPvuaaax78Yi/2Yq91zTXXPPjFXuzFXpsX0e7uLi+K48eP86K67777bv2Hf/iH377vvvtu/Yd/+Iff+Yd/+Iff5qqrrrrqqquuuuqq/6nQgx70IK666qqrrrrqqquu+t/lmmuuefCZM2cefM011zzozJkzD77mmmsefM011zwY4MyZMw8GuOaaax7Mv9J99913K8A//MM//DbAfffddyvAP/zDP/zOP/zDP/w2V1111VVXXXXVVVf9b4Me9KAHcdVVV1111VVXXXXV/03XXHPNgwFsW5J4ANuWJID77rvvVq666qqrrrrqqquu+r8IPehBD+Kqq6666qqrrrrqqquuuuqqq6666qqrrvo/icpVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8V/wjP5O30bIQwkgAAAABJRU5ErkJggg==) + +```js +rectangleSketch = startSketchOn('XZ') + |> startProfileAt([0, 0], %) + |> line([10, 0], %, $seg1) + |> angledLine({ + angle = tangentToEnd(seg1), + length = 10 + }, %) + |> line([0, 10], %) + |> line([-20, 0], %) + |> close(%) + +rectangleExtrude = extrude(10, rectangleSketch) +``` + +![Rendered example of tangentToEnd 2](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAEH1ElEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVc9l2uuuebBXHXVVVddddVV/+vcd999t3LVVVddddVVz4nKVVddddVVVz3Ah3/4h3/XNddc8+AXe7EX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f/h3XXPNNQ/mqquuuuqqq6666v+Rv//7v//tH/3RH/0crrrqqquu+q+EHvSgB3HVVVddddVVV1111VVXXXXVVVddddVVV/2fROWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9X8Y8Vx8Ib8+mvoQAAAABJRU5ErkJggg==) + +```js +bottom = startSketchOn("XY") + |> startProfileAt([0, 0], %) + |> arcTo({ end = [10, 10], interior = [5, 1] }, %, $arc1) + |> angledLine([tangentToEnd(arc1), 20], %) + |> close(%) +``` + +![Rendered example of tangentToEnd 3](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAByXklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1UEV1111VVXXXXVVVdd9b/YNddc82Cuuuqqq6666qqrrnpBCK666qqrrrrqqquuuup/qRd7sRd77c/5nM/5rW/6pm96+ou92Iu9NlddddVVV1111VVXPTeCq6666qqrrrrqqquu+l/ommuuefDnfu7n/tYTnvCE33rCE57wW6/zOq/zXlx11VVXXXXVVVdd9dyoXHXVVVddddVVV1111f9CH/7hH/5dv/u7v/tdPNOLvdiLvTZXXXXVVVddddVVVz03gquuuuqqq6666qqrrvpf5h3f8R0/68Ve7MVemwe45pprHvyO7/iOn8VVV1111VVXXXXVVQ9EcNVVV1111VVXXXXVVf+LvNiLvdhrv9M7vdNn/+7v/u538QC/+7u/+12v8zqv895cddVVV1111VVXXfVABFddddVVV1111VVXXfW/yDu90zt91u/+7u9+F8/HNddc8+AXe7EXe22uuuqqq6666qqrrrofwVVXXXXVVVddddVVV/0v8eEf/uHf9WIv9mKvzQvwu7/7u9/1Tu/0Tp/FVVddddVVV1111VX3I7jqqquuuuqqq6666qr/BV7sxV7stV/ndV7nvX/3d3/3u3ghXuzFXuy1X+zFXuy1ueqqq6666qqrrroKAD3oQQ/iqquuuuqqq6666qqr/ie75pprHvxN3/RNT//d3/3d7+JF0FrT13/9178PV1111VVXXXXVVVdRueqqq6666qqrrrrqqv/hPvzDP/y7+Fd4sRd7sdfmqquuuuqqq6666ioAgquuuuqqq6666qqrrvof7HVe53Xe+8Ve7MVe+3d/93e/ixfRNddc8+B3fMd3/Cyuuuqqq6666qqrrkIPetCDuOqqq6666qqrrrrqqv+Jrrnmmgd/0zd909N/93d/97v4V3r0ox/9Oh/yIR/yEK666qqrrrrqqqv+fyO46qqrrrrqqquuuuqq/6E+/MM//Lt+93d/97v4N7jmmmse/GIv9mKvzVVXXXXVVVddddX/bwRXXXXVVVddddVVV131P9A7vuM7ftaLvdiLvTb/Rr/7u7/7Xe/0Tu/0WVx11VVXXXXVVVf9/0Zw1VVXXXXVVVddddVV/8O82Iu92Gu/0zu902f/7u/+7nfx7/BiL/Zir/1iL/Zir81VV1111VVXXXXV/1/oQQ96EFddddVVV1111VVXXfU/yTd90zc9/QlPeMJv8R+gtaav//qvfx+uuuqqq6666qqr/n8iuOqqq6666qqrrrrqqv9BPvdzP/e3rrnmmgfzH+TFXuzFXpurrrrqqquuuuqq/78Irrrqqquuuuqqq6666n+IF3uxF3vtF3uxF3vt3/3d3/0u/oNcc801D37Hd3zHz+Kqq6666qqrrrrq/yf0oAc9iKuuuuqqq6666qqrrvrvds011zz4m77pm57+u7/7u9/Ff7BHP/rRr/MhH/IhD+Gqq6666qqrrrrq/x+Cq6666qqrrrrqqquu+h/gwz/8w7/rd3/3d7+L/wTXXHPNg1/sxV7stbnqqquuuuqqq676/4fgqquuuuqqq6666qqr/pu94zu+42e92Iu92Gvzn+R3f/d3v+ud3umdPourrrrqqquuuuqq/38Irrrqqquuuuqqq6666r/Ri73Yi732O73TO3327/7u734X/4le7MVe7LVf7MVe7LW56qqrrrrqqquu+v8FPehBD+Kqq6666qqrrrrqqqv+u3zu537ub50/f/7p/Bdorenrv/7r34errrrqqquuuuqq/z8Irrrqqquuuuqqq6666r/J537u5/7Wi73Yi702/0Ve7MVe7LW56qqrrrrqqquu+v+F4Kqrrrrqqquuuuqqq/4bvNiLvdhrv9iLvdhr/+7v/u538V/kmmuuefA7vuM7fhZXXXXVVVddddVV/3+gBz3oQVx11VVXXXXVVVddddV/pWuuuebB3/RN3/T03/3d3/0u/os9+tGPfp0P+ZAPeQhXXXXVVVddddVV/z8QXHXVVVddddVVV1111X+xD//wD/+u3/3d3/0u/htcc801D36xF3ux1+aqq6666qqrrrrq/weCq6666qqrrrrqqquu+i/0ju/4jp/1Yi/2Yq/Nf5Pf/d3f/a53eqd3+iyuuuqqq6666qqr/n8guOqqq6666qqrrrrqqv8i11xzzYPf6Z3e6bN/93d/97v4b/RiL/Zir/1iL/Zir81VV1111VVXXXXV/33oQQ96EFddddVVV1111VVXXfVf4XM/93N/6/z580/nf4DWmr7+67/+fbjqqquuuuqqq676v43gqquuuuqqq6666qqr/gu84zu+42e92Iu92GvzP8SLvdiLvTZXXXXVVVddddVV//dRjh8/zlVXXXXVVVddddVVV/1nerEXe7HX/oiP+Ijv/t3f/d3v4n+Ixz72sa8D8A//8A+/w1VXXXXVVVddddX/XehBD3oQV1111VVXXXXVVVdd9Z/pm77pm57+hCc84bf4H+bRj37063zIh3zIQ7jqqquuuuqqq676v4vgqquuuuqqq6666qqr/hN97ud+7m9dc801D+Z/oGuuuebBL/ZiL/baXHXVVVddddVVV/3fRXDVVVddddVVV1111VX/SV7ndV7nvV/sxV7stX/3d3/3u/gf6Hd/93e/653e6Z0+i6uuuuqqq6666qr/uwiuuuqqq6666qqrrrrqP8E111zz4A//8A//rt/93d/9Lv4He7EXe7HXfrEXe7HX5qqrrrrqqquuuur/JvSgBz2Iq6666qqrrrrqqquu+o/2uZ/7ub91/vz5p/O/QGtNX//1X/8+XHXVVVddddVVV/3fQ3DVVVddddVVV1111VX/wd7xHd/xs17sxV7stflf4sVe7MVem6uuuuqqq6666qr/myjHjx/nqquuuuqqq6666qqr/qO82Iu92Gt/xEd8xHf/7u/+7nfxv8RjH/vY1wH4h3/4h9/hqquuuuqqq6666v8W9KAHPYirrrrqqquuuuqqq676j/JN3/RNT3/CE57wW/wv8+hHP/p1PuRDPuQhXHXVVVddddVVV/3fQnDVVVddddVVV1111VX/QT73cz/3t6655poH87/QNddc8+AXe7EXe22uuuqqq6666qqr/m8huOqqq6666qqrrrrqqv8AL/ZiL/baL/ZiL/bav/u7v/td/C/0u7/7u9/1Tu/0Tp/FVVddddVVV1111f8tBFddddVVV1111VVXXfXvdM011zz4cz/3c3/rd3/3d7+L/8Ve7MVe7LVf7MVe7LW56qqrrrrqqquu+r8DPehBD+Kqq6666qqrrrrqqqv+PT73cz/3t86fP/90/g9orenrv/7r34errrrqqquuuuqq/xsIrrrqqquuuuqqq6666t/hHd/xHT/rxV7sxV6b/yNe7MVe7LW56qqrrrrqqquu+r+Dcvz4ca666qqrrrrqqquuuurf4sVe7MVe+yM+4iO++3d/93e/i/8jHvvYx74OwD/8wz/8DlddddVVV1111VX/+6EHPehBXHXVVVddddVVV1111b/F537u5/7W+fPnn87/MY9+9KNf50M+5EMewlVXXXXVVVddddX/fgRXXXXVVVddddVVV131b/DhH/7h3/ViL/Zir83/Qddcc82DX+zFXuy1ueqqq6666qqrrvrfj+Cqq6666qqrrrrqqqv+lV7sxV7stV/ndV7nvX/3d3/3u/g/6Hd/93e/653e6Z0+i6uuuuqqq6666qr//Qiuuuqqq6666qqrrrrqX+lzP/dzf+t3f/d3v4v/w17sxV7stV/sxV7stbnqqquuuuqqq676343gqquuuuqqq6666qqr/hU+93M/97f4f+B3f/d3v+t1Xud13ourrrrqqquuuuqq/92oXHXVVVddddVVV1111YvodV7ndd77xV7sxV77d3/3d7+L/wde7MVe7LW56qqrrrrqqquu+t+Ncvz4ca666qqrrrrqqquuuupfcs011zz4cz/3c3/rd3/3d7+L/yce+9jHvg7AP/zDP/wOV1111VVXXXXVVf87oQc96EFcddVVV1111VVXXXXVv+RzP/dzf+v8+fNP5/+ZRz/60a/zIR/yIQ/hqquuuuqqq6666n8ngquuuuqqq6666qqrrvoXvOM7vuNnvdiLvdhr8//QNddc8+AXe7EXe22uuuqqq6666qqr/nciuOqqq6666qqrrrrqqhfixV7sxV77nd7pnT77d3/3d7+L/4d+93d/97ve6Z3e6bO56qqrrrrqqquu+t+J4Kqrrrrqqquuuuqqq16ID//wD/+u3/3d3/0u/h97sRd7sdd6sRd7sdfmqquuuuqqq6666n8fgquuuuqqq6666qqrrnoBPvdzP/e3rrnmmgfz/9zv/u7vftfrvM7rvBdXXXXVVVddddVV//sQXHXVVVddddVVV1111fPxYi/2Yq/9Yi/2Yq/9u7/7u9/FVbzYi73Ya19zzTUP5qqrrrrqqquuuup/F4Krrrrqqquuuuqqq656Ltdcc82DP/dzP/e3fvd3f/e7uOqya6655sGv/dqv/V5cddVVV1111VVX/e+CHvSgB3HVVVddddVVV1111VUP9Lmf+7m/df78+adz1XN49KMf/Tof8iEf8hCuuuqqq6666qqr/vcguOqqq6666qqrrrrqqgd4x3d8x896sRd7sdfmqudxzTXXPPjFXuzFXpurrrrqqquuuuqq/z0Irrrqqquuuuqqq6666ple7MVe7LXf6Z3e6bN/93d/97u46nn87u/+7ne90zu902dx1VVXXXXVVVdd9b8HwVVXXXXVVVddddVVVz3TO73TO33W7/7u734XV71AL/ZiL/baL/ZiL/baXHXVVVddddVVV/3vQHDVVVddddVVV1111VXA537u5/7Wi73Yi702V71Qv/u7v/tdr/M6r/NeXHXVVVddddVVV/3vQHDVVVddddVVV1111f97L/ZiL/baL/ZiL/bav/u7v/tdXPUverEXe7HXvuaaax7MVVddddVVV1111f98BFddddVVV1111VVX/b92zTXXPPhzP/dzf+t3f/d3v4urXiTXXHPNg1/7tV/7vbjqqquuuuqqq676n4/gqquuuuqqq6666qr/1z78wz/8u7jqX+V3f/d3v+t1X/d134errrrqqquuuuqq//kIrrrqqquuuuqqq676f+t1Xud13vvFXuzFXvt3f/d3v4ur/lXOnDnzoBd7sRd7ba666qqrrrrqqqv+Z0MPetCDuOqqq6666qqrrrrq/59rrrnmwd/0Td/09N/93d/9Lq76Nzl16tRDPvMzP/N1uOqqq6666qqrrvqfi+Cqq6666qqrrrrqqv+XPvzDP/y7fvd3f/e7uOrf7MVe7MVe+8Ve7MVem6uuuuqqq6666qr/uQiuuuqqq6666qqrrvp/5x3f8R0/68Ve7MVem6v+XX73d3/3u17ndV7nvbjqqquuuuqqq676n4vgqquuuuqqq6666qr/V17sxV7std/pnd7ps3/3d3/3u7jq3+3FXuzFXvuaa655MFddddVVV1111VX/MxFcddVVV1111VVXXfX/yod/+Id/1+/+7u9+F1f9h7jmmmse/Nqv/drvxVVXXXXVVVddddX/TARXXXXVVVddddVVV/2/8bmf+7m/dc011zyYq/7D/O7v/u53vc7rvM57c9VVV1111VVXXfU/E8FVV1111VVXXXXVVf8vvNiLvdhrv9iLvdhr/+7v/u53cdV/qGuuuebBL/ZiL/baXHXVVVddddVVV/3Pgx70oAdx1VVXXXXVVVddddX/bddcc82Dv+mbvunpv/u7v/tdXPWf4tSpUw/5zM/8zNfhqquuuuqqq6666n8Wgquuuuqqq6666qqr/s/78A//8O/63d/93e/iqv80L/ZiL/baL/7iL/7aXHXVVVddddVVV/3PQnDVVVddddVVV1111f9p7/iO7/hZL/ZiL/baXPWf6nd/93e/67Vf+7Xfi6uuuuqqq6666qr/WQiuuuqqq6666qqrrvo/68Ve7MVe+53e6Z0++3d/93e/i6v+0734i7/461xzzTUP5qqrrrrqqquuuup/DoKrrrrqqquuuuqqq/7Peqd3eqfP+t3f/d3v4qr/EmfOnHnQa7/2a78XV1111VVXXXXVVf9zEFx11VVXXXXVVVdd9X/S537u5/7Wi73Yi702V/2X+d3f/d3vep3XeZ335qqrrrrqqquuuup/DoKrrrrqqquuuuqqq/7PebEXe7HXfrEXe7HX/t3f/d3v4qr/Utdcc82DX+zFXuy1ueqqq6666qqrrvqfAT3oQQ/iqquuuuqqq6666qr/O6655poHf9M3fdPTf/d3f/e7uOq/xalTpx7ymZ/5ma/DVVddddVVV1111X8/gquuuuqqq6666qqr/k/58A//8O/63d/93e/iqv82L/ZiL/baL/ZiL/baXHXVVVddddVVV/33I7jqqquuuuqqq6666v+Md3zHd/ysF3uxF3ttrvpv9bu/+7vf9Tqv8zrvxVVXXXXVVVddddV/P4Krrrrqqquuuuqqq/5PeLEXe7HXfqd3eqfP/t3f/d3v4qr/di/2Yi/22tdcc82Dueqqq6666qqrrvrvRXDVVVddddVVV1111f8J7/RO7/RZv/u7v/tdXPU/wjXXXPPg137t134vrrrqqquuuuqqq/57EVx11VVXXXXVVVdd9b/eO77jO37Wi73Yi702V/2P8bu/+7vf9Tqv8zrvzVVXXXXVVVddddV/L4Krrrrqqquuuuqqq/5Xe7EXe7HXfqd3eqfP/t3f/d3v4qr/Ua655poHv/iLv/hrc9VVV1111VVXXfXfBz3oQQ/iqquuuuqqq6666qr/vb7pm77p6U94whN+i6v+Rzp16tRDP/MzP/O1ueqqq6666qqrrvrvQXDVVVddddVVV1111f9an/u5n/tb11xzzYO56n+sF3uxF3utF3uxF3ttrrrqqquuuuqqq/57EFx11VVXXXXVVVdd9b/S67zO67z3i73Yi7327/7u734XV/2P9bu/+7vf9Tqv8zrvxVVXXXXVVVddddV/D4Krrrrqqquuuuqqq/7Xueaaax784R/+4d/1u7/7u9/FVf/jvdiLvdhrX3PNNQ/mqquuuuqqq6666r8e5fjx41x11VVXXXXVVVdd9b/LJ33SJ/3UE57whN/iqv8VHvvYx77O5ubm8T/90z/9Ga666qqrrrrqqqv+axFcddVVV1111VVXXfW/yju+4zt+1ou92Iu9Nlf9r/G7v/u73/ViL/Zir81VV1111VVXXXXVfz2Cq6666qqrrrrqqqv+13ixF3ux136nd3qnz/7d3/3d7+Kq/1WuueaaB7/O67zOe3PVVVddddVVV131Xws96EEP4qqrrrrqqquuuuqq/x2+6Zu+6elPeMITfour/ld69KMf/Tof8iEf8hCuuuqqq6666qqr/usQXHXVVVddddVVV131v8Lnfu7n/tY111zzYK76X+uaa6558Iu92Iu9NlddddVVV1111VX/dQiuuuqqq6666qqrrvof78Ve7MVe+8Ve7MVe+3d/93e/i6v+1/rd3/3d73qnd3qnz+Kqq6666qqrrrrqvw7BVVddddVVV1111VX/o11zzTUP/tzP/dzf+t3f/d3v4qr/9c6cOfPga6655sFcddVVV1111VVX/degHD9+nKuuuuqqq6666qqr/uf6pE/6pJ96whOe8Ftc9X/CYx/72NfZ3Nw8/qd/+qc/w1VXXXXVVVddddV/PoKrrrrqqquuuuqqq/7Hesd3fMfPerEXe7HX5qr/M373d3/3u178xV/8dbjqqquuuuqqq676r0Fw1VVXXXXVVVddddX/SC/2Yi/22u/0Tu/02b/7u7/7XVz1f8qZM2ce9Dqv8zrvzVVXXXXVVVddddV/PvSgBz2Iq6666qqrrrrqqqv+5/ncz/3c3zp//vzTuer/pEc/+tGv8yEf8iEP4aqrrrrqqquuuuo/F8FVV1111VVXXXXVVf/jfPiHf/h3vdiLvdhrc9X/Wddcc82DX+zFXuy1ueqqq6666qqrrvrPRXDVVVddddVVV1111f8oL/ZiL/bar/M6r/Pev/u7v/tdXPV/1u/+7u9+1zu90zt9FlddddVVV1111VX/uQiuuuqqq6666qqrrvof5XM/93N/63d/93e/i6v+zztz5syDr7nmmgdz1VVXXXXVVVdd9Z+H4Kqrrrrqqquuuuqq/zE+93M/97e46v+Na6655sHv+I7v+FlcddVVV1111VVX/echuOqqq6666qqrrrrqf4TXeZ3Xee8Xe7EXe+3f/d3f/S6u+n/hd3/3d7/rxV7sxV6bq6666qqrrrrqqv88BFddddVVV1111VVX/be75pprHvzhH/7h3/W7v/u738VV/69cc801D36d13md9+aqq6666qqrrrrqPwd60IMexFVXXXXVVVddddVV/70+93M/97fOnz//dK76f+nRj37063zIh3zIQ7jqqquuuuqqq676j0dw1VVXXXXVVVddddV/q3d8x3f8rBd7sRd7ba76f+uaa6558Iu/+Iu/NlddddVVV1111VX/8Qiuuuqqq6666qqrrvpv82Iv9mKv/U7v9E6f/bu/+7vfxVX/b/3u7/7ud73jO77jZ3PVVVddddVVV131H4/gqquuuuqqq6666qr/Nh/+4R/+Xb/7u7/7XVz1/94111zz4GuuuebBXHXVVVddddVVV/3HIrjqqquuuuqqq6666r/F537u5/7WNddc82Cuugo4c+bMg97xHd/xs7jqqquuuuqqq676j0Vw1VVXXXXVVVddddV/uRd7sRd77Rd7sRd77d/93d/9Lq66Cvjd3/3d73qxF3ux1+aqq6666qqrrrrqPxbBVVddddVVV1111VX/pa655poHf+7nfu5v/e7v/u53cdVVD3DNNdc8+HVe53Xem6uuuuqqq6666qr/OOhBD3oQV1111VVXXXXVVVf91/ncz/3c3zp//vzTueqq5+PRj37063zIh3zIQ7jqqquuuuqqq676j0Fw1VVXXXXVVVddddV/mXd8x3f8rBd7sRd7ba666gW45pprHvxiL/Zir81VV1111VVXXXXVfwyCq6666qqrrrrqqqv+S7zYi73Ya7/TO73TZ//u7/7ud3HVVS/A7/7u737XO73TO30WV1111VVXXXXVVf8xCK666qqrrrrqqquu+i/xTu/0Tp/1u7/7u9/FVVf9C86cOfPga6655sFcddVVV1111VVX/fsRXHXVVVddddVVV131n+5zP/dzf+vFXuzFXpurrnoRXHPNNQ9+x3d8x8/iqquuuuqqq6666t+P4Kqrrrrqqquuuuqq/1Qv9mIv9tov9mIv9tq/+7u/+11cddWL4Hd/93e/68Ve7MVem6uuuuqqq6666qp/P4Krrrrqqquuuuqqq/7TXHPNNQ/+3M/93N/63d/93e/iqqv+Fa655poHv87rvM57c9VVV1111VVXXfXvQ3DVVVddddVVV1111X+aD//wD/8urrrq3+B3f/d3v+ud3umdPpurrrrqqquuuuqqfx+Cq6666qqrrrrqqqv+U7zO67zOe73Yi73Ya//u7/7ud3HVVf8GZ86cedCLvdiLvTZXXXXVVVddddVV/3boQQ96EFddddVVV1111VVX/ce65pprHvxN3/RNT//d3/3d7+Kqq/4dTp069ZDP/MzPfB2uuuqqq6666qqr/m0Irrrqqquuuuqqq676D/fhH/7h3/W7v/u738VVV/07nTlz5sHXXHPNg7nqqquuuuqqq676tyG46qqrrrrqqquuuuo/1Du+4zt+1ou92Iu9Nldd9R/gmmuuefA7vuM7fhZXXXXVVVddddVV/zYEV1111VVXXXXVVVf9h3mxF3ux136nd3qnz/7d3/3d7+Kqq/4D/O7v/u53vdiLvdhrc9VVV1111VVXXfVvQ3DVVVddddVVV1111X+YD//wD/+u3/3d3/0urrrqP9A111zz4Nd5ndd5b6666qqrrrrqqqv+9Qiuuuqqq6666qqrrvoP8bmf+7m/dc011zyYq676D/a7v/u73/WO7/iOn8VVV1111VVXXXXVvx7BVVddddVVV1111VX/bq/zOq/zXi/2Yi/22r/7u7/7XVx11X+Ca6655sEv9mIv9tpcddVVV1111VVX/eugBz3oQVx11VVXXXXVVVdd9W93zTXXPPibvumbnv67v/u738VVV/0nOnXq1EM+8zM/83W46qqrrrrqqquuetERXHXVVVddddVVV1317/LhH/7h3/W7v/u738VVV/0nO3PmzINf/MVf/LW56qqrrrrqqquuetERXHXVVVddddVVV131b/aO7/iOn/ViL/Zir81VV/0XuOaaax782q/92u/FVVddddVVV1111YuO4Kqrrrrqqquuuuqqf5MXe7EXe+13eqd3+uzf/d3f/S6uuuq/wO/+7u9+14u/+Iu/DlddddVVV1111VUvOoKrrrrqqquuuuqqq/5NPvzDP/y7fvd3f/e7uOqq/0Jnzpx50Ou8zuu8N1ddddVVV1111VUvGoKrrrrqqquuuuqqq/7VPvdzP/e3rrnmmgdz1VX/xX73d3/3u97xHd/xs7jqqquuuuqqq6560RBcddVVV1111VVXXfWv8mIv9mKv/WIv9mKv/bu/+7vfxVVX/Te45pprHvxiL/Zir81VV1111VVXXXXVvww96EEP4qqrrrrqqquuuuqqF80111zz4G/6pm96+u/+7u9+F1dd9d/o1KlTD/nMz/zM1+Gqq6666qqrrrrqhSO46qqrrrrqqquuuupF9uEf/uHf9bu/+7vfxVVX/Tc7c+bMg1/sxV7stbnqqquuuuqqq6564Qiuuuqqq6666qqrrnqRvOM7vuNnvdiLvdhrc9VV/wNcc801D36d13md9+Kqq6666qqrrrrqhSO46qqrrrrqqquuuupf9GIv9mKv/U7v9E6f/bu/+7vfxVVX/Q/wu7/7u9/1Yi/2Yq/NVVddddVVV1111QtHcNVVV1111VVXXXXVv+id3umdPut3f/d3v4urrvof5Jprrnnw67zO67w3V1111VVXXXXVVS8YwVVXXXXVVVddddVVL9Q7vuM7ftaLvdiLvTZXXfU/zO/+7u9+1zu+4zt+FlddddVVV1111VUvGMFVV1111VVXXXXVVS/Qi73Yi732O73TO3327/7u734XV131P9A111zz4Bd/8Rd/ba666qqrrrrqqqueP/SgBz2Iq6666qqrrrrqqquev2/6pm96+hOe8ITf4qqr/gdrrenrv/7r34errrrqqquuuuqq50Vw1VVXXXXVVVddddXz9bmf+7m/dc011zyYq676H+7FX/zFX4errrrqqquuuuqq54/gqquuuuqqq6666qrn8Tqv8zrv/WIv9mKv/bu/+7vfxVVX/Q935syZB73Yi73Ya3PVVVddddVVV131vNCDHvQgrrrqqquuuuqqq656tmuuuebB3/RN3/T03/3d3/0urrrqf4lTp0495DM/8zNfh6uuuuqqq6666qrnRHDVVVddddVVV1111XP48A//8O/63d/93e/iqqv+Fzlz5syDr7nmmgdz1VVXXXXVVVdd9ZwIrrrqqquuuuqqq656lnd8x3f8rBd7sRd7ba666n+Za6655sFnzpx5MFddddVVV1111VXPieCqq6666qqrrrrqqste7MVe7LXf6Z3e6bN/93d/97u46qr/ZX73d3/3u97pnd7ps7jqqquuuuqqq656TlSuuuqqq6666qqrrrrswz/8w7/rd3/3d7+Lq676X+rMmTMP5qqrrrrqqquuuuo5EVx11VVXXXXVVVddxed+7uf+1jXXXPNgrrrqf7FrrrnmwS/2Yi/22lx11VVXXXXVVVc9G8FVV1111VVXXXXV/3Mv9mIv9tov9mIv9tq/+7u/+11cddX/ci/2Yi/2Wlx11VVXXXXVVVc9G8FVV1111VVXXXXV/2PXXHPNgz/3cz/3t373d3/3u7jqqv/lfvd3f/e7XvzFX/y1ueqqq6666qqrrno2KlddddVVV1111VX/j334h3/4d/3u7/7ud3HVVf9HnDlz5sFcddVVV1111VVXPRvBVVddddVVV1111f9T7/iO7/hZL/ZiL/baXHXVVVddddVVV1111f9dBFddddVVV1111VX/D73Yi73Ya7/TO73TZ//u7/7ud3HVVf+HXHPNNQ9+sRd7sdfmqquuuuqqq6666goqV1111VVXXXXVVf8PvdM7vdNn/e7v/u53cdVVV1111VVXXXXVVf+3EVx11VVXXXXVVVf9P/PhH/7h3/ViL/Zir81VV/0f9WIv9mKvxVVXXXXVVVddddUVVK666qqrrrrqqqv+H3mxF3ux136d13md9/7d3/3d7+Kqq/4P+t3f/d3v4qqrrrrqqquuuurZqFx11VVXXXXVVVf9P/K5n/u5v/W7v/u738VVV/0fds011zyYq6666qqrrrrqqiuoXHXVVVddddVVV/0/8bmf+7m/xVVXXXXVVVddddVVV/3/QuWqq6666qqrrrrq/4HXeZ3Xee8Xe7EXe+3f/d3f/S6uuur/uGuuuebBXHXVVVddddVVV11B5aqrrrrqqquuuur/uGuuuebBH/7hH/5dv/u7v/tdXHXVVVddddVVV1111f8vVK666qqrrrrqqqv+j/vwD//w7/rd3/3d7+Kqq6666qqrrrrqqqv+/yG46qqrrrrqqquu+j/sHd/xHT/rxV7sxV6bq6666qqrrrrqqquu+v+JylVXXXXVVVddddX/US/2Yi/22u/0Tu/02b/7u7/7XVx11f8j9913361cddVVV1111VVXXUHlqquuuuqqq6666v+oD//wD/+u3/3d3/0urrrqqquuuuqqq6666v8vgquuuuqqq6666qr/gz73cz/3t6655poHc9VVV1111VVXXXXVVf+/Ubnqqquuuuqqq676P+bFXuzFXvvFXuzFXvt3f/d3v4urrvp/6L777ruVq6666qqrrrrqqisIrrrqqquuuuqqq/4Pueaaax78uZ/7ub/1u7/7u9/FVVf9P/Sar/ma73P27NlncNVVV1111VVXXXUFlauuuuqqq6666qr/Qz78wz/8u373d3/3u7jqqquuuuqqq6666qqrAAiuuuqqq6666qqr/o94x3d8x896sRd7sdfmqqv+n/uHf/iH3+aqq6666qqrrrrqCipXXXXVVVddddVV/we82Iu92Gu/0zu902f/7u/+7ndx1VX/z9133323ctVVV1111VVXXXUFlauuuuqqq6666qr/A97pnd7ps373d3/3u7jqqv/n7rvvvlu56qqrrrrqqquuejaCq6666qqrrrrqqv/lPvdzP/e3XuzFXuy1ueqqq/iHf/iH3+aqq6666qqrrrrq2Qiuuuqqq6666qqr/hd7sRd7sdd+sRd7sdf+3d/93e/iqqv+n3vN13zN97nvvvtu5aqrrrrqqquuuurZqFx11VVXXXXVVVf9L3XNNdc8+HM/93N/63d/93e/i6uuuuqy3/7t3/4errrqqquuuuqqq56NylVXXXXVVVddddX/Uh/+4R/+Xb/7u7/7XVx11VXPct99993KVVddddVVV1111bMRXHXVVVddddVVV/0v9Dqv8zrv/WIv9mKvzVVXXfUsv/Vbv/XdXHXVVVddddVVVz0ngquuuuqqq6666qr/Za655poHf/iHf/h3/e7v/u53cdVVV132mq/5mu/zD//wD7/DVVddddVVV1111XOictVVV1111VVXXfW/zId/+Id/1+/+7u9+F1ddddWz3Hfffbf+wz/8w29z1VVXXXXVVVdd9ZwIrrrqqquuuuqqq/4Xecd3fMfPerEXe7HX5qqrrnoO11xzzYPvu+++W7nqqquuuuqqq656TlSuuuqqq6666qqr/pd4sRd7sdd+p3d6p8/+3d/93e/iqquuepbXfM3XfJ8f+ZEf+Wyuuuqqq6666qqrnheVq6666qqrrrrqqv8lPvzDP/y7fvd3f/e7uOqqq57Hb//2b38PV1111VVXXXXVVc+L4Kqrrrrqqquuuup/gc/93M/9rWuuuebBXHXVVc/jt37rt77nvvvuu5Wrrrrqqquuuuqq50Vw1VVXXXXVVVdd9T/c67zO67z3i73Yi7327/7u734XV1111XN4zdd8zff5h3/4h9/mqquuuuqqq6666vmjctVVV1111VVXXfU/2DXXXPPgD//wD/+u3/3d3/0urrrqqudx33333foP//APv81VV1111VVXXXXV80dw1VVXXXXVVVdd9T/Yh3/4h3/X7/7u734XV1111fN4zdd8zff5h3/4h9++7777buWqq6666qqrrrrq+SO46qqrrrrqqquu+h/qHd/xHT/rxV7sxV6bq6666gX60R/90c/hqquuuuqqq6666gWjctVVV1111VVXXfU/0Iu92Iu99ju90zt99u/+7u9+F1ddddXz9Vu/9Vvffd99993KVVddddVVV1111QtGcNVVV1111VVXXfU/0Id/+Id/1+/+7u9+F1ddddXz9Zqv+Zrv81u/9Vvfw1VXXXXVVVddddULR3DVVVddddVVV131P8znfu7n/tY111zzYK666qoX6Ld+67e++x/+4R9+m6uuuuqqq6666qoXjuCqq6666qqrrrrqf5AXe7EXe+0Xe7EXe+3f/d3f/S6uuuqq5+s1X/M13+e3fuu3voerrrrqqquuuuqqfxmVq6666qqrrrrqqv8hrrnmmgd/7ud+7m/97u/+7ndx1VVXvUD/8A//8Nv/8A//8NtcddVVV1111VVX/cuoXHXVVVddddVVV/0P8eEf/uHf9bu/+7vfxVVXXfUCveZrvub7fMiHfMhDuOqqq6666qqrrnrREFx11VVXXXXVVVf9D/CO7/iOn/ViL/Zir81VV131Ar3ma77m+/zoj/7o59x33323ctVVV1111VVXXfWioXLVVVddddVVV1313+zFXuzFXvud3umdPvt3f/d3v4urrrrqBbrvvvtu/ZEf+ZHP5qqrrrrqqquuuupFR3DVVVddddVVV1313+yd3umdPut3f/d3v4urrrrqBXrN13zN9/n6r//69+Gqq6666qqrrrrqX4fgqquuuuqqq6666r/RO77jO37Wi73Yi702V1111Qv1W7/1W9/9D//wD7/NVVddddVVV1111b8OwVVXXXXVVVddddV/kxd7sRd77Xd6p3f67N/93d/9Lq666qoX6DVf8zXf57d+67e+h6uuuuqqq6666qp/PfSgBz2Iq6666qqrrrrqqv8OP/ETP+Hf/d3f/S6uuuqqF+g1X/M13+czP/MzX+cf/uEffpurrrrqqquuuuqqfz0qV1111VVXXXXVVf8NPvdzP/e3uOqqq16o13zN13yff/iHf/jtf/iHf/htrrrqqquuuuqqq/5tqFx11VVXXXXVVVf9F3ud13md936xF3ux1/7d3/3d7+Kqq656ge67775bP/MzP/N1uOqqq6666qqrrvq3I7jqqquuuuqqq676L3TNNdc8+MM//MO/63d/93e/i6uuuuoFes3XfM33+fqv//r34aqrrrrqqquuuurfh8pVV1111VVXXXXVf6EP//AP/67f/d3f/S6uuuqqF+g1X/M13+e3fuu3vvsf/uEffpurrrrqqquuuuqq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NV/zfX7kR37ks3/0R3/0c7jqqquuuuqqq6763ws96EEP4qqrrrrqqquuuuq5XXPNNQ/+pm/6pqf/7u/+7ndx1VX/j7zma77m+9x33323fv3Xf/37/MM//MNvc9VVV1111VVXXfW/G3rQgx7EVVddddVVV1111XP73M/93N86f/7807nqqv9HXvM1X/N9fuRHfuSzf/RHf/RzuOqqq6666qqrrvq/gcpVV1111VVXXXXVc3nHd3zHz3qxF3ux1/7d3/3dp3PVVf8PvOZrvub73Hfffbd+5md+5uv8wz/8w29z1VVXXXXVVVdd9X8Hlauuuuqqq6666qoHuOaaax78Tu/0Tp/9u7/7u9/FVVf9P/Car/ma7/MjP/Ijn/2jP/qjn8NVV1111VVXXXXV/z1Urrrqqquuuuqqqx7gwz/8w7/rd3/3d7+Lq676P+41X/M13+e+++679UM+5EMect99993KVVddddVVV1111f9NBFddddVVV1111VXP9I7v+I6f9WIv9mKvzVVX/R/2mq/5mu/z6Ec/+nV+5Ed+5LM/5EM+5CH33XffrVx11VVXXXXVVVf930Xlqquuuuqqq666CnixF3ux136nd3qnz/7d3/3d7+Kqq/6Pes3XfM33+ZEf+ZHP/tEf/dHP4aqrrrrqqquuuur/B/SgBz2Iq6666qqrrrrqqm/6pm96+hOe8ITf4qqr/g96zdd8zfe57777bv36r//69/mHf/iH3+aqq6666qqrrrrq/w8qV1111VVXXXXV/3uf+7mf+1vXXHPNg5/whCdw1VX/l7zma77m+9x33323/siP/Mhn/+iP/ujncNVVV1111VVXXfX/D5Wrrrrqqquuuur/tdd5ndd57xd7sRd77d/93d/9Lq666v+Q13zN13yfH/mRH/nsH/3RH/0crrrqqquuuuqqq/7/onLVVVddddVVV/2/dc011zz4wz/8w7/rd3/3d7+Lq676P+I1X/M13+cf/uEffvtDPuRDHnLffffdylVXXXXVVVddddX/b+hBD3oQV1111VVXXXXV/0+f+7mf+1vnz59/Oldd9X/Aa77ma77Pfffdd+vXf/3Xv88//MM//DZXXXXVVVddddVVVwFQueqqq6666qqr/l96x3d8x896sRd7sdf+3d/93adz1VX/i73ma77m+9x33323fv3Xf/37/NZv/dZ3c9VVV1111VVXXXXVA1G56qqrrrrqqqv+33mxF3ux136nd3qnz/7d3/3d7+Kqq/6Xes3XfM33ue+++279kR/5kc/+0R/90c/hqquuuuqqq6666qrnBz3oQQ/iqquuuuqqq676/+Wbvumbnv6EJzzht7jqqv+FXvM1X/N97rvvvlt/67d+67t/9Ed/9HO46qqrrrrqqquuuuqFoXLVVVddddVVV/2/8rmf+7m/dc011zz4CU94Aldd9b/Ja77ma77Pfffdd+uP/MiPfPaP/uiPfg5XXXXVVVddddVVV70oqFx11VVXXXXVVf9vvNiLvdhrv9iLvdhr/+7v/u53cdVV/0u85mu+5vvcd999t/7Ij/zIZ//oj/7o53DVVVddddVVV1111b8GetCDHsRVV1111VVXXfV/3zXXXPPgb/qmb3r67/7u734XV131v8BrvuZrvs99991362/91m9994/+6I9+DlddddVVV1111VVX/VugBz3oQVx11VVXXXXVVf/3fe7nfu5vnT9//ulcddX/cK/5mq/5Pvfdd9+tv/Vbv/XdP/qjP/o5XHXVVVddddVVV13170Hlqquuuuqqq676P+8d3/EdP+vFXuzFXvt3f/d3n85VV/0P9Zqv+Zrvc99999369V//9e/zW7/1W9/NVVddddVVV1111VX/EahcddVVV1111VX/p73Yi73Ya7/TO73TZ//u7/7ud3HVVf8DveZrvub73Hfffbd+5md+5uv8wz/8w29z1VVXXXXVVVddddV/JPSgBz2Iq6666qqrrrrq/67P/dzP/a3z588/nauu+h/kNV/zNd8H4Ed+5Ec++7d/+7e/57777ruVq6666qqrrrrqqqv+M1C56qqrrrrqqqv+z/rwD//w73qxF3ux1/7d3/3dp3PVVf8DvOZrvub73Hfffbf+yI/8yGf/6I/+6Odw1VVXXXXVVVddddV/NipXXXXVVVddddX/SS/2Yi/22q/zOq/z3r/7u7/7XVx11X+j13zN13wfgPvuu+/Wr//6r3+f3/qt3/purrrqqquuuuqqq676r4Ie9KAHcdVVV1111VVX/d/zEz/xE/7d3/3d7+Kqq/6bvOZrvub73Hfffbf+1m/91nf/9m//9vfcd999t3LVVVddddVVV1111X81KlddddVVV1111f85n/u5n/tbXHXVf4PXfM3XfB+A++6779Yf+ZEf+ewf/dEf/Ryuuuqqq6666qqrrvrvROWqq6666qqrrvo/5XVe53Xe+8Ve7MVe+3d/93e/i6uu+i/ymq/5mu9z33333fojP/Ijn/3bv/3b33PffffdylVXXXXVVVddddVV/xOgBz3oQVx11VVXXXXVVf83XHPNNQ/+pm/6pqf/7u/+7ndx1VX/yV7zNV/zfQDuu+++W3/0R3/0c37rt37ru7nqqquuuuqqq6666n8a9KAHPYirrrrqqquuuur/hs/93M/9rfPnzz+dq676T/Sar/ma73Pffffd+lu/9Vvf/aM/+qOfw1VXXXXVVVddddVV/5NRueqqq6666qqr/k94x3d8x896sRd7sdf+3d/93adz1VX/wV7zNV/zfe67775bf+u3fuu7P+RDPuQh9913361cddVVV1111VVXXfW/AXrQgx7EVVddddVVV131v9uLvdiLvfbnfu7n/tbv/u7vfhdXXfUf5DVf8zXf57777rv1t37rt7777Nmzz/it3/qt7+aqq6666qqrrrrqqv9t0IMe9CCuuuqqq6666qr/3b7pm77p6U94whN+i6uu+nd6zdd8zfe57777bv2t3/qt7z579uwzfuu3fuu7ueqqq6666qqrrrrqfzMqV1111VVXXXXV/2qf+7mf+1vXXHPNg5/whCdw1VX/Fq/5mq/5Pvfdd9+tv/Vbv/XdX//1X//ev/Vbv/U9XHXVVVddddVVV131fwWVq6666qqrrrrqf60Xe7EXe+0Xe7EXe+3f/d3f/S6uuupf4TVf8zXf57777rv1t37rt77767/+69/nt37rt76bq6666qqrrrrqqqv+L0IPetCDuOqqq6666qqr/ve55pprHvxN3/RNT//d3/3d7+Kqq/4Fr/mar/k+APfdd9+tv/Vbv/XdZ8+efcZv/dZvfTdXXXXVVVddddVVV/1fhx70oAdx1VVXXXXVVVf97/O5n/u5v3X+/Pmnc9VVL8BrvuZrvg/Afffdd+tv/dZvffc//MM//M4//MM//DZXXXXVVVddddVVV/1/QuWqq6666qqrrvpf5x3f8R0/68Ve7MVe+3d/93efzlVXPcBrvuZrvs99991369mzZ2/9kR/5kc/+0R/90c/hqquuuuqqq6666qr/z9CDHvQgrrrqqquuuuqq/z1e7MVe7LU/93M/97d+93d/97u46v+913zN13wfgPvuu+/W3/qt3/ruf/iHf/idf/iHf/htrrrqqquuuuqqq6666gr0oAc9iKuuuuqqq6666n+Pz/3cz/2t8+fPP52r/l96zdd8zfcBuO+++249e/bsrX//93//27/927/9Pffdd9+tXHXVVVddddVVV1111fOictVVV1111VVX/a/x4R/+4d/1Yi/2Yq/9u7/7u0/nqv8XXvM1X/N9AO67775bz549e+uP/MiPfPY//MM//M4//MM//DZXXXXVVVddddVVV131L6Ny1VVXXXXVVVf9r/BiL/Zir/06r/M67/27v/u738VV/2e95mu+5vvwTPfdd9+tP/IjP/LZ//AP//A7//AP//DbXHXVVVddddVVV1111b8eetCDHsRVV1111VVXXfU/2zXXXPPgb/qmb3r67/7u734XV/2f8pqv+ZrvA3DffffdCvBbv/Vb3/0P//APv/MP//APv81VV1111VVXXXXVVVf9+1G56qqrrrrqqqv+x/vwD//w7+Kq//Ve8zVf8314pvvuu+/Wf/iHf/jtH/mRH/nsf/iHf/jtf/iHf/gdrrrqqquuuuqqq6666j8elauuuuqqq6666n+013md13nvF3uxF3vt3/3d3/0urvpf5TVf8zXfB+C+++67FeBHfuRHPvsf/uEffvsf/uEffoerrrrqqquuuuqqq676r4Ee9KAHcdVVV1111VVX/c90zTXXPPibvumbnv67v/u738VV/6O95mu+5vvwTPfdd9+t//AP//Db9913363/8A//8Dv/8A//8NtcddVVV1111VVXXXXVfw/0oAc9iKuuuuqqq6666n+mz/3cz/2t8+fPP52r/sd4zdd8zffhme67775bAX7rt37ruwH+4R/+4Xf+4R/+4be56qqrrrrqqquuuuqq/zmoXHXVVVddddVV/yO94zu+42e92Iu92Gv/7u/+7tO56r/Fa77ma74Pz3Tffffdevbs2Vt/5Ed+5LP/4R/+4bf/4R/+4Xe46qqrrrrqqquuuuqq//nQgx70IK666qqrrrrqqv9ZXuzFXuy1P/dzP/e3fvd3f/e7uOo/1Wu+5mu+Dw9w33333Xr27Nlb//7v//63Af7hH/7ht//hH/7hd7jqqquuuuqqq6666qr/ndCDHvQgrrrqqquuuuqq/1m+6Zu+6elPeMITfour/sO85mu+5vvwTPfdd9+tAP/wD//w2/fdd9+tZ8+efcZ999136z/8wz/8NlddddVVV1111VVXXfV/C3rQgx7EVVddddVVV131P8fnfu7n/taLvdiLvfbv/u7vfhdXvche8zVf8314gPvuu+9WgH/4h3/47fvuu+9WgH/4h3/4nX/4h3/4ba666qqrrrrqqquuuur/D/SgBz2Iq6666qqrrrrqf4YXe7EXe+3P/dzP/a3f/d3f/S6uepbXfM3XfB+ey3333XcrwD/8wz/89n333XcrwD/8wz/8zn333ff0s2fPPoOrrrrqqquuuuqqq666CgA96EEP4qqrrrrqqquu+p/hJ37iJ/y7v/u738X/A6/5mq/5Pjwf9913360AZ8+evfW+++679b777rsV4OzZs7fed999zzh79uyt9913361cddVVV1111VVXXXXVVS8K9KAHPYirrrrqqquuuup/htd5ndd57w//8A//Lp6P3/3d3/0u/pu95mu+5vvwIrrvvvtu5ZnOnj17K8B9991363333Xcrz3T27Nln3HfffU8/e/bsM+67775bueqqq6666qqrrrrqqqv+o6EHPehBXHXVVVddddVV/zNcc801Dz5z5syDrrnmmofwAGfOnHkQz3TNNdc8mAe45pprHsx/sPvuu+9WHuC+++67ledy9uzZZwDcd999twIGdPbs2Vvvu+++W7nqqquuuuqqq6666qqr/qdAD3rQg7jqqquuuuqqq6666qqrrrrqqquuuuqqq/5PonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8q/hEVd94RkJj7vwAAAABJRU5ErkJggg==) + +```js +circSketch = startSketchOn("XY") + |> circle({ center = [0, 0], radius = 3 }, %, $circ) + +triangleSketch = startSketchOn("XY") + |> startProfileAt([-5, 0], %) + |> angledLine([tangentToEnd(circ), 10], %) + |> line([-15, 0], %) + |> close(%) +``` + +![Rendered example of tangentToEnd 4](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAABxVElEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111Yvgm77pm55+zTXXPJirrrrqqv8nvv7rv/59/uEf/uG377vvvlu56qqrrrrqqquu+t+LylVXXXXVVVe9CK655poHA/zu7/7ud3HVVVdd9f/Ah3/4h3/XZ37mZ77OfffddytXXXXVVVddddVV/3tRjh8/zlVXXXXVVVf9S377t3/7e2699da/eexjH/var/AKr/A2D3rQg17mGc94xl9z1VVXXfV/2DAMq3/4h3/4Ha666qqrrrrqqqv+90IPetCDuOqqq6666qp/jWuuuebBZ86cefDrvM7rvNc111zz4Bd7sRd7bYDf/d3f/S6uuuqqq/6POHbs2HXXX3/9Yz7kQz7kIVx11VVXXXXVVVf970Xlqquuuuqqq/6V7rvvvlvvu+++W//hH/7htwGuueaaB7/Yi73Ya7/O67zOe73Yi73YawP87u/+7ndx1VVXXfW/2Hq9PuCqq6666qqrrrrqfz/0oAc9iKuuuuqqq676j3LNNdc8+MVe7MVe+8Ve7MVe68Ve7MVe+5prrnkwwO/+7u9+F1ddddVV/8u85mu+5vt85md+5uv8wz/8w29z1VVXXXXVVVdd9b8Tlauuuuqqq676D3Tffffdet999333b/3Wb303wDXXXPPg137t136vF3/xF3/tF3uxF3ttgN/93d/9Lq666qqr/pd4sRd7sdf6h3/4h9/mqquuuuqqq6666n8n9KAHPYirrrrqqquu+q9wzTXXPPjFXuzFXvvFXuzFXut1Xud13ptn+t3f/d3v4qqrrrrqf6Bjx45dV2tdfOZnfubrcNVVV1111VVXXfW/E3rQgx7EVVddddVVV/13uOaaax782q/92u/14i/+4q/9Yi/2Yq8N8Lu/+7vfxVVXXXXV/xDz+XzrwQ9+8Ct8yId8yEO46qqrrrrqqquu+t8JPehBD+Kqq6666qqr/rtdc801D36xF3ux136xF3ux13qd13md9+aZfvd3f/e7uOqqq676b/Sar/ma7/MhH/IhD7nvvvtu5aqrrrrqqquuuup/H/SgBz2Iq6666qqrrvqf5JprrnkwwGu/9mu/14u/+Iu/9ou92Iu9NsDv/u7vfhdXXXXVVf/FXvM1X/N9PvMzP/N1/uEf/uG3ueqqq6666qqrrvrfh3L8+HGuuuqqq6666n+Sw8PD3cPDw91/+Id/+J3f+q3f+p7f/u3f/p5bb731b06fPv3g137t136fBz3oQS/zjGc846+56qqrrvov8KAHPehl7rvvvlv/4R/+4Xe46qqrrrrqqquu+t8HPehBD+Kqq6666qqr/re45pprHnzmzJkHv9iLvdhrvfiLv/hrv9iLvdhrA/zu7/7ud3HVVVdd9Z/g2LFj19VaF5/5mZ/5Olx11VVXXXXVVVf974Me9KAHcdVVV1111VX/W11zzTUPfrEXe7HXfp3XeZ33erEXe7HXBvjd3/3d7+Kqq6666j/IfD7fevCDH/wKH/IhH/IQrrrqqquuuuqqq/73QQ960IO46qqrrrrqqv8LrrnmmgefOXPmwa/zOq/zXtdcc82DX+zFXuy1AX73d3/3u7jqqquu+nd4zdd8zff5zM/8zNf5h3/4h9/mqquuuuqqq6666n8XKlddddVVV131f8R9991363333XfrP/zDP/w2wDXXXPPgF3uxF3vt13md13mvF3uxF3ttgN/93d/9Lq666qqr/g2uueaaB//DP/wDV1111VVXXXXVVf/LoAc96EFcddVVV1111f9111xzzYNf7MVe7LVf7MVe7LVe7MVe7LWvueaaBwP87u/+7ndx1VVXXfUveNCDHvTST3va0/7m67/+69+Hq6666qqrrrrqqv9d0IMe9CCuuuqqq6666v+ba6655sEv9mIv9tqv8zqv814v9mIv9toAv/u7v/tdXHXVVVc9H8eOHbvu+uuvf8yHfMiHPISrrrrqqquuuuqq/12oXHXVVVddddX/Q/fdd9+t991333f/1m/91ndfc801D36xF3ux136xF3ux13qd13md9+aZfvd3f/e7uOqqq64C1uv1AVddddVVV1111VX/O6EHPehBXHXVVVddddVVz3bNNdc8+LVf+7Xf68Vf/MVf+8Ve7MVeG+B3f/d3v4urrrrq/7XXfM3XfJ/P/MzPfJ1/+Id/+G2uuuqqq6666qqr/vdAD3rQ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ddVVV/3XuOaaax78Yi/2Yq/9Oq/zOu/1Yi/2Yq8N8Lu/+7vfxVX/Jxw7duy6WuviMz/zM1+Hq/5Xueaaax4McObMmQcDXHPNNQ8+c+bMg3iAa6655iGAeaZrrrnmwYAA80z33XffrYAA80z33XffrQBnz559BsB99913K8909uzZW++7775bueqqq6666qr/POhBD3oQV1111VVXXXXVVVf917vmmmse/GIv9mKv/WIv9mKv9Tqv8zrvzTP97u/+7ndx1f9K8/l868EPfvArfMiHfMhDuOp/lGuuuebBZ86cefA111zz4DNnzjwI4MVf/MVf+8yZMw++5pprHswL8Td/8ze/xL/B2bNnbz1z5syDAV7qpV7qTXgh7rvvvlsBzp49+4z77rvv6ffdd9+tZ8+efcZ9991369mzZ2+97777buWqq6666qqr/m3Qgx70IK666qqrrrrqqquu+u93zTXXPPi1X/u13+vFX/zFX/vFXuzFXhvgd3/3d7+Lq/5Xec3XfM33+czP/MzX+Yd/+Iff5qr/ctdcc82DAV77tV/7vQBe/MVf/LVf7MVe7LV5gN/93d/9Lv4XeM3XfM334QHuu+++W8+ePXvrfffdd+s//MM//M59991369mzZ2+97777buWqq6666qqrXjD0oAc9iKuuuuqqq6666qqr/me55pprHvxiL/Zir/1iL/Zir/U6r/M6780z/e7v/u53cdX/aK/5mq/5Pp/5mZ/5Ov/wD//w21z1n+6aa6558Gu/9mu/F8CLv/iLv/aLvdiLvTbP9Lu/+7vfxf9Rr/mar/k+PNN99913K8A//MM//M4//MM//PZ999136z/8wz/8NlddddVVV111BXrQgx7EVVddddVVV1111VX/c11zzTUPBnjt137t93rxF3/x136xF3ux1wb43d/93e/iqv9xHvSgB730H//xH//Mj/7oj34OV/2Hu+aaax782q/92u8F8E7v9E6fzTP97u/+7ndxFa/5mq/5PjzTfffdd+s//MM//M4//MM//PZ999136z/8wz/8NlddddVVV/1/hB70oAdx1VVXXXXVVVddddX/Htdcc82DX+zFXuy1X+zFXuy1Xud1Xue9AX73d3/3u7jqf4Rjx45dV2tdfOZnfubrcNV/iGuuuebBr/3ar/1eL/7iL/7aL/ZiL/baAL/7u7/7XVz1InnN13zN9wG47777bj179uyt99133zN+67d+67v/4R/+4be56qqrrrrq/wP0oAc9iKuuuuqqq6666qqr/nc6c+bMg6655pqHvNiLvdhrvfiLv/hrv9iLvdhrA/zu7/7ud3HVf4v5fL714Ac/+BU+5EM+5CFc9W92zTXXPPi1X/u13+t1X/d13+fMmTMPAvjd3/3d7+Kqf7fXfM3XfB+A++6771aAf/iHf/jt3/qt3/qef/iHf/htrrrqqquu+r8IPehBD+Kqq6666qqrrrrqqv8brrnmmge/2Iu92Gu92Iu92Gu/zuu8znsD/O7v/u53cdV/qdd8zdd8n8/8zM98nX/4h3/4ba76V3md13md936xF3ux13qd13md9wb43d/93e/iqv9Ur/mar/k+APfdd9+tZ8+evfW3fuu3vue+++679R/+4R9+m6uuuuqqq/4vQA960IO46qqrrrrqqquuuur/nmuuuebBZ86cefDrvM7rvNc111zz4Bd7sRd7bYDf/d3f/S6u+k/1mq/5mu/zIz/yI5/9oz/6o5/DVf+ia6655sGv/dqv/V6v+7qv+z5nzpx50O/+7u9+F1f9t3nN13zN9wE4e/bsM/7+7//+t370R3/0c+67775bueqqq6666n8r9KAHPYirrrrqqquuuuqqq/7vu+aaax78Yi/2Yq/9Oq/zOu/1Yi/2Yq8N8Lu/+7vfxVX/4Y4dO3ZdrXXxmZ/5ma/DVS/QNddc8+DXfu3Xfq93eqd3+myA3/3d3/0urvof5zVf8zXf57777rv1H/7hH377t37rt77nH/7hH36bq6666qqr/jdBD3rQg7jqqquuuuqqq6666v+Xa6655sEv9mIv9lov9mIv9tov9mIv9trXXHPNgwF+93d/97u46t9tPp9vPfjBD36FD/mQD3kIVz1f7/iO7/hZ7/RO7/TZAL/7u7/7XVz1v8JrvuZrvs9999136z/8wz/89m/91m99zz/8wz/8NlddddVVV/1Phx70oAdx1VVXXXXVVVddddX/b9dcc82DX+zFXuy1X+d1Xue9XuzFXuy1AX73d3/3u7jq3+w1X/M13+ft3u7txFXP4cVe7MVe+8M//MO/65prrnnw7/7u734XV/2v9Zqv+Zrv8w//8A+//Q//8A+/81u/9Vvffd99993KVVddddVV/xOhBz3oQVx11VVXXXXVVVddddX9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XfVAVK666qqrrrrqqquuuuqqf5X77rvv1vvuu+/W3/qt3/qea6655sEv9mIv9tov9mIv9lov9mIv9trXXHPNgwF+93d/97t4gPV6fXD99dc/hv9jzp49e+uxY8euu3Tp0j1cddV/oz/90z/9sXd8x3f8rL//+7//7X/4h3/4ba666qqrrrof5fjx41x11VVXXXXVVVddddVV/zaHh4e7t95661//6Z/+6c/8wi/8wtf89m//9vccHh7uPvjBD36ZV3iFV3ibBz3oQS/zjGc846+naRoe+9jHvs4//MM//M7Zs2dv5f8OveVbvuXHP+MZz/hrrrrqv9E0TcO99977lDd8wzf80D/7sz/7mcPDw12uuuqqq64CQA960IO46qqrrrrqqquuuuqqq/7jXXPNNQ9+sRd7sdd6sRd7sdd+ndd5nff+zM/8zNf5h3/4h9/m/5Brrrnmwd/0Td/09N/93d/9Lq666n+ABz3oQS99cHBw6TM/8zNfh6uuuuqqqwDQgx70IK666qqrrrrqqquuuuqqq/6tPvzDP/y7Tp48ee2lS5fu4aqr/pvN5/OtV3zFV3yHr//6r3+f3/qt3/purrrqqquuIrjqqquuuuqqq6666qqrrvp3+K3f+q3veamXeqk34aqr/gdYrVYHf/qnf/pj7/iO7/hZXHXVVVddBUBw1VVXXXXVVVddddVVV1317/AP//APv/0P//APv81VV/0PsVqtDq655poHv87rvM57c9VVV111FcFVV1111VVXXXXVVVddddW/04/8yI98zmu+5mu+D1dd9T/E7/7u737XO77jO34WV1111VVXEVx11VVXXXXVVVddddVVV/07/cM//MNv/8M//MNvc9VV/4Ncc801D37xF3/x1+aqq6666v839KAHPYirrrrqqquuuuqqq6666qp/r2uuuebB3/RN3/T03/3d3/0urrrqf4hTp0499DM/8zNfm6uuuuqq/78Irrrqqquuuuqqq6666qqr/gPcd999t37913/9+7zma77m+3DVVf9DXHPNNQ/mqquuuur/N8rx48e56qqrrrrqqquuuuqqq676j3Drrbf+NcCbvdmbfcwznvGMv+aqq/6bPfaxj33tf/iHf/ids2fP3spVV1111f9PBFddddVVV1111VVXXXXVVf+Bfvu3f/t7/uEf/uG3X/M1X/N9uOqq/wGu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n/vuu+/W3/qt3/ruH/3RH/0crrrqqquu+vdCD3rQg7jqqquuuuqqq6666qqrrroKrrnmmge/2Iu92Gu/2Iu92Gu92Iu92Gtfc801Dwb43d/93e/iqv80r/mar/k+AL/1W7/13f/wD//w27/1W7/1PVx11VVXXfUfBT3oQQ/iqquuuuqqq6666qqrrrrqqud1zTXXPPjFXuzFXvvFXuzFXut1Xud13ptn+t3f/d3v4qp/l9d8zdd8H4D77rvv1t/6rd/67h/90R/9HK666qqrrvrPgB70oAdx1VVXXXXVVVddddVVV1111b/smmuuefCLvdiLvfaLvdiLvRbA67zO67w3z/S7v/u738VVL9RrvuZrvs99991369mzZ2/9+7//+9/+0R/90c/hqquuuuqq/2zoQQ96EFddddVVV1111VVXXXXVVVf96505c+ZB11xzzUOuueaaB7/O67zOe505c+bB11xzzYN5pt/93d/9Lv6fes3XfM334Znuu+++W3/rt37ru//hH/7hd/7hH/7ht7nqqquuuuq/EnrQgx7EVVddddVVV1111VVXXXXVVf8xzpw586BrrrnmIddcc82DX+zFXuy1rrnmmge/2Iu92GvzAL/7u7/7Xfwf8pqv+ZrvwzP9wz/8w28D/P3f//1v/8M//MPv/MM//MNvc9VVV1111X8n9KAHPYirrrrqqquuuuqqq6666qqr/nNdc801Dz5z5syDr7nmmge/2Iu92Gtdc801DwZ4sRd7sdfmufzu7/7ud/E/zGu+5mu+Dw9w33333QrwD//wD79933333foP//APv/MP//APv81VV1111VX/06AHPehBXHXVVVddddVVV1111VVXXfXf55prrnkwwIu92Iu91n333feMF3uxF3uta6655sHXXHPNgwHOnDnz4GuuuebB/Be57777bgU4e/bsrffdd9+t9913360AZ8+evfW+++57xj/8wz/8NlddddVVV/1vgR70oAdx1VVXXXXVVVddddVVV1111f8O11xzzYNt+5prrnkIz3TNNdc8GDAgnunMmTMP4vk4e/bsrYAA7rvvvlu5wmfPnn3GfffddytXXXXVVVf9X4Me9KAHcdVVV1111VVXXXXVVVddddVVV1111VVX/Z9E5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/Vfwjw/kgkMF32xgAAAAASUVORK5CYII=) + + diff --git a/docs/kcl/tangentialArc.md b/docs/kcl/tangentialArc.md index a6089749d..7c4cefcaf 100644 --- a/docs/kcl/tangentialArc.md +++ b/docs/kcl/tangentialArc.md @@ -31,9 +31,9 @@ tangentialArc(data: TangentialArcData, sketch: Sketch, tag?: TagDeclarator) -> S ```js exampleSketch = startSketchOn('XZ') |> startProfileAt([0, 0], %) - |> angledLine({ angle: 60, length: 10 }, %) - |> tangentialArc({ radius: 10, offset: -120 }, %) - |> angledLine({ angle: -60, length: 10 }, %) + |> angledLine({ angle = 60, length = 10 }, %) + |> tangentialArc({ radius = 10, offset = -120 }, %) + |> angledLine({ angle = -60, length = 10 }, %) |> close(%) example = extrude(10, exampleSketch) diff --git a/docs/kcl/tangentialArcTo.md b/docs/kcl/tangentialArcTo.md index c0a24b0b0..3dbaa32cb 100644 --- a/docs/kcl/tangentialArcTo.md +++ b/docs/kcl/tangentialArcTo.md @@ -31,7 +31,7 @@ tangentialArcTo(to: [number], sketch: Sketch, tag?: TagDeclarator) -> Sketch ```js exampleSketch = startSketchOn('XZ') |> startProfileAt([0, 0], %) - |> angledLine({ angle: 60, length: 10 }, %) + |> angledLine({ angle = 60, length = 10 }, %) |> tangentialArcTo([15, 15], %) |> line([10, -15], %) |> close(%) diff --git a/docs/kcl/tangentialArcToRelative.md b/docs/kcl/tangentialArcToRelative.md index 076fc44c1..b92ae7586 100644 --- a/docs/kcl/tangentialArcToRelative.md +++ b/docs/kcl/tangentialArcToRelative.md @@ -31,7 +31,7 @@ tangentialArcToRelative(delta: [number], sketch: Sketch, tag?: TagDeclarator) -> ```js exampleSketch = startSketchOn('XZ') |> startProfileAt([0, 0], %) - |> angledLine({ angle: 45, length: 10 }, %) + |> angledLine({ angle = 45, length = 10 }, %) |> tangentialArcToRelative([0, -10], %) |> line([-10, 0], %) |> close(%) diff --git a/docs/kcl/tau.md b/docs/kcl/tau.md index 5180a49ae..eaf7ea9ab 100644 --- a/docs/kcl/tau.md +++ b/docs/kcl/tau.md @@ -28,7 +28,7 @@ tau() -> number ```js exampleSketch = startSketchOn("XZ") |> startProfileAt([0, 0], %) - |> angledLine({ angle: 50, length: 10 * tau() }, %) + |> angledLine({ angle = 50, length = 10 * tau() }, %) |> yLineTo(0, %) |> close(%) diff --git a/docs/kcl/toDegrees.md b/docs/kcl/toDegrees.md index 81670a7f9..758264b6d 100644 --- a/docs/kcl/toDegrees.md +++ b/docs/kcl/toDegrees.md @@ -34,8 +34,8 @@ toDegrees(num: number) -> number exampleSketch = startSketchOn("XZ") |> startProfileAt([0, 0], %) |> angledLine({ - angle: 50, - length: 70 * cos(toDegrees(pi() / 4)) + angle = 50, + length = 70 * cos(toDegrees(pi() / 4)) }, %) |> yLineTo(0, %) |> close(%) diff --git a/docs/kcl/toRadians.md b/docs/kcl/toRadians.md index 93206bcb8..ba1c9d325 100644 --- a/docs/kcl/toRadians.md +++ b/docs/kcl/toRadians.md @@ -34,8 +34,8 @@ toRadians(num: number) -> number exampleSketch = startSketchOn("XZ") |> startProfileAt([0, 0], %) |> angledLine({ - angle: 50, - length: 70 * cos(toRadians(45)) + angle = 50, + length = 70 * cos(toRadians(45)) }, %) |> yLineTo(0, %) |> close(%) diff --git a/docs/kcl/types.md b/docs/kcl/types.md index ff7d43d4b..5e786e0af 100644 --- a/docs/kcl/types.md +++ b/docs/kcl/types.md @@ -41,7 +41,7 @@ If you want to get a value from an array you can use the index like so: An object is defined with `{}` braces. Here is an example object: ``` -myObj = {a: 0, b: "thing"} +myObj = { a = 0, b = "thing" } ``` We support two different ways of getting properties from objects, you can call @@ -54,7 +54,7 @@ We also have support for defining your own functions. Functions can take in any type of argument. Below is an example of the syntax: ``` -fn myFn = (x) => { +fn myFn(x) { return x } ``` @@ -90,12 +90,12 @@ startSketchOn('XZ') |> startProfileAt(origin, %) |> angledLine([0, 191.26], %, $rectangleSegmentA001) |> angledLine([ - segAng(rectangleSegmentA001, %) - 90, + segAng(rectangleSegmentA001) - 90, 196.99 ], %, $rectangleSegmentB001) |> angledLine([ - segAng(rectangleSegmentA001, %), - -segLen(rectangleSegmentA001, %) + segAng(rectangleSegmentA001), + -segLen(rectangleSegmentA001) ], %, $rectangleSegmentC001) |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%) @@ -118,20 +118,20 @@ use the tag `rectangleSegmentA001` in any function or expression in the file. However if the code was written like this: ``` -fn rect = (origin) => { +fn rect(origin) { return startSketchOn('XZ') - |> startProfileAt(origin, %) - |> angledLine([0, 191.26], %, $rectangleSegmentA001) - |> angledLine([ - segAng(rectangleSegmentA001, %) - 90, - 196.99 - ], %, $rectangleSegmentB001) - |> angledLine([ - segAng(rectangleSegmentA001, %), - -segLen(rectangleSegmentA001, %) - ], %, $rectangleSegmentC001) - |> lineTo([profileStartX(%), profileStartY(%)], %) - |> close(%) + |> startProfileAt(origin, %) + |> angledLine([0, 191.26], %, $rectangleSegmentA001) + |> angledLine([ + segAng(rectangleSegmentA001) - 90, + 196.99 + ], %, $rectangleSegmentB001) + |> angledLine([ + segAng(rectangleSegmentA001), + -segLen(rectangleSegmentA001) + ], %, $rectangleSegmentC001) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) } rect([0, 0]) @@ -146,28 +146,31 @@ Tags are accessible through the sketch group they are declared in. For example the following code works. ``` -fn rect = (origin) => { +fn rect(origin) { return startSketchOn('XZ') - |> startProfileAt(origin, %) - |> angledLine([0, 191.26], %, $rectangleSegmentA001) - |> angledLine([ - segAng(rectangleSegmentA001, %) - 90, - 196.99 - ], %, $rectangleSegmentB001) - |> angledLine([ - segAng(rectangleSegmentA001, %), - -segLen(rectangleSegmentA001, %) - ], %, $rectangleSegmentC001) - |> lineTo([profileStartX(%), profileStartY(%)], %) - |> close(%) + |> startProfileAt(origin, %) + |> angledLine([0, 191.26], %, $rectangleSegmentA001) + |> angledLine([ + segAng(rectangleSegmentA001) - 90, + 196.99 + ], %, $rectangleSegmentB001) + |> angledLine([ + segAng(rectangleSegmentA001), + -segLen(rectangleSegmentA001) + ], %, $rectangleSegmentC001) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) } rect([0, 0]) myRect = rect([20, 0]) -myRect +myRect |> extrude(10, %) - |> fillet({radius: 0.5, tags: [myRect.tags.rectangleSegmentA001]}, %) + |> fillet({ + radius = 0.5, + tags = [myRect.tags.rectangleSegmentA001] + }, %) ``` See how we use the tag `rectangleSegmentA001` in the `fillet` function outside diff --git a/docs/kcl/types/AngledLineData.md b/docs/kcl/types/AngledLineData.md index 8b75d8b48..f49fc8c5c 100644 --- a/docs/kcl/types/AngledLineData.md +++ b/docs/kcl/types/AngledLineData.md @@ -13,13 +13,18 @@ Data to draw an angled line. An angle and length with explicitly named parameters -[`PolarCoordsData`](/docs/kcl/types/PolarCoordsData) +**Type:** `object` +## Properties +| Property | Type | Description | Required | +|----------|------|-------------|----------| +| `angle` |`number`| The angle of the line (in degrees). | No | +| `length` |`number`| The length of the line. | No | ---- diff --git a/docs/kcl/types/AppearanceData.md b/docs/kcl/types/AppearanceData.md new file mode 100644 index 000000000..a2bed5f3c --- /dev/null +++ b/docs/kcl/types/AppearanceData.md @@ -0,0 +1,23 @@ +--- +title: "AppearanceData" +excerpt: "Data for appearance." +layout: manual +--- + +Data for appearance. + +**Type:** `object` + + + + + +## Properties + +| Property | Type | Description | Required | +|----------|------|-------------|----------| +| `color` |`string`| Color of the new material, a hex string like "#ff0000". | No | +| `metalness` |`number` (**maximum:** 100.0)| Metalness of the new material, a percentage like 95.7. | No | +| `roughness` |`number` (**maximum:** 100.0)| Roughness of the new material, a percentage like 95.7. | No | + + diff --git a/docs/kcl/types/ArcToData.md b/docs/kcl/types/ArcToData.md new file mode 100644 index 000000000..31727dcea --- /dev/null +++ b/docs/kcl/types/ArcToData.md @@ -0,0 +1,22 @@ +--- +title: "ArcToData" +excerpt: "Data to draw a three point arc (arcTo)." +layout: manual +--- + +Data to draw a three point arc (arcTo). + +**Type:** `object` + + + + + +## Properties + +| Property | Type | Description | Required | +|----------|------|-------------|----------| +| `end` |`[number, number]`| End point of the arc. A point in 3D space | No | +| `interior` |`[number, number]`| Interior point of the arc. A point in 3D space | No | + + diff --git a/docs/kcl/types/BinaryOperator.md b/docs/kcl/types/BinaryOperator.md deleted file mode 100644 index e380905a4..000000000 --- a/docs/kcl/types/BinaryOperator.md +++ /dev/null @@ -1,161 +0,0 @@ ---- -title: "BinaryOperator" -excerpt: "" -layout: manual ---- - - - - - - -**This schema accepts exactly one of the following:** - -Add two numbers. - -**enum:** `+` - - - - - - - - ----- -Subtract two numbers. - -**enum:** `-` - - - - - - - - ----- -Multiply two numbers. - -**enum:** `*` - - - - - - - - ----- -Divide two numbers. - -**enum:** `/` - - - - - - - - ----- -Modulo two numbers. - -**enum:** `%` - - - - - - - - ----- -Raise a number to a power. - -**enum:** `^` - - - - - - - - ----- -Are two numbers equal? - -**enum:** `==` - - - - - - - - ----- -Are two numbers not equal? - -**enum:** `!=` - - - - - - - - ----- -Is left greater than right - -**enum:** `>` - - - - - - - - ----- -Is left greater than or equal to right - -**enum:** `>=` - - - - - - - - ----- -Is left less than right - -**enum:** `<` - - - - - - - - ----- -Is left less than or equal to right - -**enum:** `<=` - - - - - - - - ----- - - - - diff --git a/docs/kcl/types/BinaryPart.md b/docs/kcl/types/BinaryPart.md deleted file mode 100644 index 87b0b7722..000000000 --- a/docs/kcl/types/BinaryPart.md +++ /dev/null @@ -1,161 +0,0 @@ ---- -title: "BinaryPart" -excerpt: "" -layout: manual ---- - - - - - - -**This schema accepts exactly one of the following:** - - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Literal`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `value` |[`LiteralValue`](/docs/kcl/types/LiteralValue)| | No | -| `raw` |`string`| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: [`Identifier`](/docs/kcl/types/Identifier)| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `name` |`string`| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `BinaryExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `operator` |[`BinaryOperator`](/docs/kcl/types/BinaryOperator)| | No | -| `left` |[`BinaryPart`](/docs/kcl/types/BinaryPart)| | No | -| `right` |[`BinaryPart`](/docs/kcl/types/BinaryPart)| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `CallExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `callee` |[`Identifier`](/docs/kcl/types/Identifier)| | No | -| `arguments` |`[` [`Expr`](/docs/kcl/types/Expr) `]`| | No | -| `optional` |`boolean`| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `UnaryExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `operator` |[`UnaryOperator`](/docs/kcl/types/UnaryOperator)| | No | -| `argument` |[`BinaryPart`](/docs/kcl/types/BinaryPart)| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `MemberExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `object` |[`MemberObject`](/docs/kcl/types/MemberObject)| | No | -| `property` |[`LiteralIdentifier`](/docs/kcl/types/LiteralIdentifier)| | No | -| `computed` |`boolean`| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `IfExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `cond` |[`Expr`](/docs/kcl/types/Expr)| | No | -| `then_val` |[`Program`](/docs/kcl/types/Program)| | No | -| `else_ifs` |`[` [`ElseIf`](/docs/kcl/types/ElseIf) `]`| | No | -| `final_else` |[`Program`](/docs/kcl/types/Program)| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - - - - diff --git a/docs/kcl/types/BodyItem.md b/docs/kcl/types/BodyItem.md deleted file mode 100644 index 38982b74a..000000000 --- a/docs/kcl/types/BodyItem.md +++ /dev/null @@ -1,97 +0,0 @@ ---- -title: "BodyItem" -excerpt: "" -layout: manual ---- - - - - - - -**This schema accepts exactly one of the following:** - - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `ImportStatement`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `items` |`[` [`ImportItem`](/docs/kcl/types/ImportItem) `]`| | No | -| `path` |`string`| | No | -| `raw_path` |`string`| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `ExpressionStatement`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `expression` |[`Expr`](/docs/kcl/types/Expr)| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `VariableDeclaration`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `declarations` |`[` [`VariableDeclarator`](/docs/kcl/types/VariableDeclarator) `]`| | No | -| `visibility` |[`ItemVisibility`](/docs/kcl/types/ItemVisibility)| | No | -| `kind` |[`VariableKind`](/docs/kcl/types/VariableKind)| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `ReturnStatement`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `argument` |[`Expr`](/docs/kcl/types/Expr)| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - - - - diff --git a/docs/kcl/types/CircleThreePointData.md b/docs/kcl/types/CircleThreePointData.md new file mode 100644 index 000000000..d5f9a8044 --- /dev/null +++ b/docs/kcl/types/CircleThreePointData.md @@ -0,0 +1,23 @@ +--- +title: "CircleThreePointData" +excerpt: "Data for drawing a 3-point circle" +layout: manual +--- + +Data for drawing a 3-point circle + +**Type:** `object` + + + + + +## Properties + +| Property | Type | Description | Required | +|----------|------|-------------|----------| +| `p1` |`[number, number]`| Point one for circle derivation. | No | +| `p2` |`[number, number]`| Point two for circle derivation. | No | +| `p3` |`[number, number]`| Point three for circle derivation. | No | + + diff --git a/docs/kcl/types/CircularPattern2dData.md b/docs/kcl/types/CircularPattern2dData.md index 8077e3dc0..cfa0702b5 100644 --- a/docs/kcl/types/CircularPattern2dData.md +++ b/docs/kcl/types/CircularPattern2dData.md @@ -16,7 +16,7 @@ Data for a circular pattern on a 2D sketch. | Property | Type | Description | Required | |----------|------|-------------|----------| -| `instances` |[`Uint`](/docs/kcl/types/Uint)| The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect. | No | +| `instances` |`integer`| The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect. | No | | `center` |`[number, number]`| The center about which to make the pattern. This is a 2D vector. | No | | `arcDegrees` |`number`| The arc angle (in degrees) to place the repetitions. Must be greater than 0. | No | | `rotateDuplicates` |`boolean`| Whether or not to rotate the duplicates as they are copied. | No | diff --git a/docs/kcl/types/CircularPattern3dData.md b/docs/kcl/types/CircularPattern3dData.md index a2e7a8f4e..b4bbd7d52 100644 --- a/docs/kcl/types/CircularPattern3dData.md +++ b/docs/kcl/types/CircularPattern3dData.md @@ -16,7 +16,7 @@ Data for a circular pattern on a 3D model. | Property | Type | Description | Required | |----------|------|-------------|----------| -| `instances` |[`Uint`](/docs/kcl/types/Uint)| The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect. | No | +| `instances` |`integer`| The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect. | No | | `axis` |`[number, number, number]`| The axis around which to make the pattern. This is a 3D vector. | No | | `center` |`[number, number, number]`| The center about which to make the pattern. This is a 3D vector. | No | | `arcDegrees` |`number`| The arc angle (in degrees) to place the repetitions. Must be greater than 0. | No | diff --git a/docs/kcl/types/CommentStyle.md b/docs/kcl/types/CommentStyle.md deleted file mode 100644 index 368811a88..000000000 --- a/docs/kcl/types/CommentStyle.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: "CommentStyle" -excerpt: "" -layout: manual ---- - - - - - - -**This schema accepts exactly one of the following:** - -Like // foo - -**enum:** `line` - - - - - - - - ----- -Like /* foo */ - -**enum:** `block` - - - - - - - - ----- - - - - diff --git a/docs/kcl/types/ElseIf.md b/docs/kcl/types/ElseIf.md deleted file mode 100644 index 20f3f6bbe..000000000 --- a/docs/kcl/types/ElseIf.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "ElseIf" -excerpt: "" -layout: manual ---- - - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `cond` |[`Expr`](/docs/kcl/types/Expr)| | No | -| `then_val` |[`Program`](/docs/kcl/types/Program)| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - diff --git a/docs/kcl/types/Environment.md b/docs/kcl/types/Environment.md index d2ed592d9..0a02b3970 100644 --- a/docs/kcl/types/Environment.md +++ b/docs/kcl/types/Environment.md @@ -16,6 +16,6 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| | `bindings` |`object`| | No | -| `parent` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | +| `parent` |`integer`| | No | diff --git a/docs/kcl/types/EnvironmentRef.md b/docs/kcl/types/EnvironmentRef.md deleted file mode 100644 index 229306509..000000000 --- a/docs/kcl/types/EnvironmentRef.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: "EnvironmentRef" -excerpt: "An index pointing to an environment." -layout: manual ---- - -An index pointing to an environment. - -**Type:** `integer` (`uint`) - - - - - - - diff --git a/docs/kcl/types/Expr.md b/docs/kcl/types/Expr.md deleted file mode 100644 index 6f708b237..000000000 --- a/docs/kcl/types/Expr.md +++ /dev/null @@ -1,318 +0,0 @@ ---- -title: "Expr" -excerpt: "An expression can be evaluated to yield a single KCL value." -layout: manual ---- - -An expression can be evaluated to yield a single KCL value. - - - - - -**This schema accepts exactly one of the following:** - - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Literal`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `value` |[`LiteralValue`](/docs/kcl/types/LiteralValue)| An expression can be evaluated to yield a single KCL value. | No | -| `raw` |`string`| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: [`Identifier`](/docs/kcl/types/Identifier)| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `name` |`string`| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: [`TagDeclarator`](/docs/kcl/types#tag-declaration)| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `value` |`string`| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `BinaryExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `operator` |[`BinaryOperator`](/docs/kcl/types/BinaryOperator)| An expression can be evaluated to yield a single KCL value. | No | -| `left` |[`BinaryPart`](/docs/kcl/types/BinaryPart)| An expression can be evaluated to yield a single KCL value. | No | -| `right` |[`BinaryPart`](/docs/kcl/types/BinaryPart)| An expression can be evaluated to yield a single KCL value. | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: [`FunctionExpression`](/docs/kcl/types/FunctionExpression)| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `params` |`[` [`Parameter`](/docs/kcl/types/Parameter) `]`| | No | -| `body` |[`Program`](/docs/kcl/types/Program)| An expression can be evaluated to yield a single KCL value. | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `CallExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `callee` |[`Identifier`](/docs/kcl/types/Identifier)| An expression can be evaluated to yield a single KCL value. | No | -| `arguments` |`[` [`Expr`](/docs/kcl/types/Expr) `]`| | No | -| `optional` |`boolean`| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `PipeExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `body` |`[` [`Expr`](/docs/kcl/types/Expr) `]`| | No | -| `nonCodeMeta` |[`NonCodeMeta`](/docs/kcl/types/NonCodeMeta)| An expression can be evaluated to yield a single KCL value. | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `PipeSubstitution`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `ArrayExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `elements` |`[` [`Expr`](/docs/kcl/types/Expr) `]`| | No | -| `nonCodeMeta` |[`NonCodeMeta`](/docs/kcl/types/NonCodeMeta)| An expression can be evaluated to yield a single KCL value. | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `ArrayRangeExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `startElement` |[`Expr`](/docs/kcl/types/Expr)| An expression can be evaluated to yield a single KCL value. | No | -| `endElement` |[`Expr`](/docs/kcl/types/Expr)| An expression can be evaluated to yield a single KCL value. | No | -| `endInclusive` |`boolean`| Is the `end_element` included in the range? | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `ObjectExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `properties` |`[` [`ObjectProperty`](/docs/kcl/types/ObjectProperty) `]`| | No | -| `nonCodeMeta` |[`NonCodeMeta`](/docs/kcl/types/NonCodeMeta)| An expression can be evaluated to yield a single KCL value. | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `MemberExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `object` |[`MemberObject`](/docs/kcl/types/MemberObject)| An expression can be evaluated to yield a single KCL value. | No | -| `property` |[`LiteralIdentifier`](/docs/kcl/types/LiteralIdentifier)| An expression can be evaluated to yield a single KCL value. | No | -| `computed` |`boolean`| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `UnaryExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `operator` |[`UnaryOperator`](/docs/kcl/types/UnaryOperator)| An expression can be evaluated to yield a single KCL value. | No | -| `argument` |[`BinaryPart`](/docs/kcl/types/BinaryPart)| An expression can be evaluated to yield a single KCL value. | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `IfExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `cond` |[`Expr`](/docs/kcl/types/Expr)| An expression can be evaluated to yield a single KCL value. | No | -| `then_val` |[`Program`](/docs/kcl/types/Program)| An expression can be evaluated to yield a single KCL value. | No | -| `else_ifs` |`[` [`ElseIf`](/docs/kcl/types/ElseIf) `]`| | No | -| `final_else` |[`Program`](/docs/kcl/types/Program)| An expression can be evaluated to yield a single KCL value. | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- -KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application). - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `None`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | - - ----- - - - - diff --git a/docs/kcl/types/FunctionExpression.md b/docs/kcl/types/FunctionExpression.md deleted file mode 100644 index 5ad84fc1d..000000000 --- a/docs/kcl/types/FunctionExpression.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "FunctionExpression" -excerpt: "" -layout: manual ---- - - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `params` |`[` [`Parameter`](/docs/kcl/types/Parameter) `]`| | No | -| `body` |[`Program`](/docs/kcl/types/Program)| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - diff --git a/docs/kcl/types/Identifier.md b/docs/kcl/types/Identifier.md deleted file mode 100644 index a07e5a9ae..000000000 --- a/docs/kcl/types/Identifier.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: "Identifier" -excerpt: "" -layout: manual ---- - - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `name` |`string`| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - diff --git a/docs/kcl/types/ImportFormat.md b/docs/kcl/types/ImportFormat.md index 6ecc54824..5dcf97d6d 100644 --- a/docs/kcl/types/ImportFormat.md +++ b/docs/kcl/types/ImportFormat.md @@ -24,7 +24,7 @@ Autodesk Filmbox (FBX) format | Property | Type | Description | Required | |----------|------|-------------|----------| -| `type` |enum: `fbx`| | No | +| `format` |enum: `fbx`| | No | ---- @@ -40,7 +40,7 @@ Binary glTF 2.0. We refer to this as glTF since that is how our customers refer | Property | Type | Description | Required | |----------|------|-------------|----------| -| `type` |enum: `gltf`| | No | +| `format` |enum: `gltf`| | No | ---- @@ -56,7 +56,7 @@ Wavefront OBJ format. | Property | Type | Description | Required | |----------|------|-------------|----------| -| `type` |enum: `obj`| | No | +| `format` |enum: `obj`| | No | | `coords` |[`System`](/docs/kcl/types/System)| Co-ordinate system of input data. Defaults to the [KittyCAD co-ordinate system. | No | | `units` |[`UnitLength`](/docs/kcl/types/UnitLength)| The units of the input data. This is very important for correct scaling and when calculating physics properties like mass, etc. Defaults to millimeters. | No | @@ -74,7 +74,7 @@ The PLY Polygon File Format. | Property | Type | Description | Required | |----------|------|-------------|----------| -| `type` |enum: `ply`| | No | +| `format` |enum: `ply`| | No | | `coords` |[`System`](/docs/kcl/types/System)| Co-ordinate system of input data. Defaults to the [KittyCAD co-ordinate system. | No | | `units` |[`UnitLength`](/docs/kcl/types/UnitLength)| The units of the input data. This is very important for correct scaling and when calculating physics properties like mass, etc. Defaults to millimeters. | No | @@ -92,7 +92,7 @@ SolidWorks part (SLDPRT) format. | Property | Type | Description | Required | |----------|------|-------------|----------| -| `type` |enum: `sldprt`| | No | +| `format` |enum: `sldprt`| | No | ---- @@ -108,7 +108,7 @@ ISO 10303-21 (STEP) format. | Property | Type | Description | Required | |----------|------|-------------|----------| -| `type` |enum: `step`| | No | +| `format` |enum: `step`| | No | ---- @@ -124,7 +124,7 @@ ST**ereo**L**ithography format. | Property | Type | Description | Required | |----------|------|-------------|----------| -| `type` |enum: `stl`| | No | +| `format` |enum: `stl`| | No | | `coords` |[`System`](/docs/kcl/types/System)| Co-ordinate system of input data. Defaults to the [KittyCAD co-ordinate system. | No | | `units` |[`UnitLength`](/docs/kcl/types/UnitLength)| The units of the input data. This is very important for correct scaling and when calculating physics properties like mass, etc. Defaults to millimeters. | No | diff --git a/docs/kcl/types/ItemVisibility.md b/docs/kcl/types/ItemVisibility.md deleted file mode 100644 index a24f9aa59..000000000 --- a/docs/kcl/types/ItemVisibility.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: "ItemVisibility" -excerpt: "" -layout: manual ---- - - -**enum:** `default`, `export` - - - - - - - - diff --git a/docs/kcl/types/ImportItem.md b/docs/kcl/types/KclNone.md similarity index 58% rename from docs/kcl/types/ImportItem.md rename to docs/kcl/types/KclNone.md index 393fe9fd9..1e7c7f8a4 100644 --- a/docs/kcl/types/ImportItem.md +++ b/docs/kcl/types/KclNone.md @@ -1,9 +1,10 @@ --- -title: "ImportItem" -excerpt: "" +title: "KclNone" +excerpt: "KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application)." layout: manual --- +KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application). **Type:** `object` @@ -15,10 +16,6 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| -| `name` |[`Identifier`](/docs/kcl/types/Identifier)| Name of the item to import. | No | -| `alias` |[`Identifier`](/docs/kcl/types/Identifier)| Rename the item using an identifier after "as". | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | diff --git a/docs/kcl/types/KclValue.md b/docs/kcl/types/KclValue.md index 280a85263..cabf63161 100644 --- a/docs/kcl/types/KclValue.md +++ b/docs/kcl/types/KclValue.md @@ -23,8 +23,110 @@ Any KCL value. | Property | Type | Description | Required | |----------|------|-------------|----------| -| `type` |enum: `UserVal`| | No | -| `value` |``| | No | +| `type` |enum: `Uuid`| | No | +| `value` |`string`| | No | +| `__meta` |`[` [`Metadata`](/docs/kcl/types/Metadata) `]`| | No | + + +---- + +**Type:** `object` + + + + + +## Properties + +| Property | Type | Description | Required | +|----------|------|-------------|----------| +| `type` |enum: `Bool`| | No | +| `value` |`boolean`| | No | +| `__meta` |`[` [`Metadata`](/docs/kcl/types/Metadata) `]`| | No | + + +---- + +**Type:** `object` + + + + + +## Properties + +| Property | Type | Description | Required | +|----------|------|-------------|----------| +| `type` |enum: `Number`| | No | +| `value` |`number`| | No | +| `__meta` |`[` [`Metadata`](/docs/kcl/types/Metadata) `]`| | No | + + +---- + +**Type:** `object` + + + + + +## Properties + +| Property | Type | Description | Required | +|----------|------|-------------|----------| +| `type` |enum: `Int`| | No | +| `value` |`integer`| | No | +| `__meta` |`[` [`Metadata`](/docs/kcl/types/Metadata) `]`| | No | + + +---- + +**Type:** `object` + + + + + +## Properties + +| Property | Type | Description | Required | +|----------|------|-------------|----------| +| `type` |enum: `String`| | No | +| `value` |`string`| | No | +| `__meta` |`[` [`Metadata`](/docs/kcl/types/Metadata) `]`| | No | + + +---- + +**Type:** `object` + + + + + +## Properties + +| Property | Type | Description | Required | +|----------|------|-------------|----------| +| `type` |enum: `Array`| | No | +| `value` |`[` [`KclValue`](/docs/kcl/types/KclValue) `]`| | No | +| `__meta` |`[` [`Metadata`](/docs/kcl/types/Metadata) `]`| | No | + + +---- + +**Type:** `object` + + + + + +## Properties + +| Property | Type | Description | Required | +|----------|------|-------------|----------| +| `type` |enum: `Object`| | No | +| `value` |`object`| | No | | `__meta` |`[` [`Metadata`](/docs/kcl/types/Metadata) `]`| | No | @@ -59,10 +161,10 @@ Any KCL value. | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: [`TagDeclarator`](/docs/kcl/types#tag-declaration)| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `value` |`string`| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- @@ -78,7 +180,7 @@ A plane. | Property | Type | Description | Required | |----------|------|-------------|----------| -| `type` |enum: `Plane`| | No | +| `type` |enum: [`Plane`](/docs/kcl/types/Plane)| | No | | `id` |`string`| The id of the plane. | No | | `value` |[`PlaneType`](/docs/kcl/types/PlaneType)| Any KCL value. | No | | `origin` |[`Point3d`](/docs/kcl/types/Point3d)| Origin of the plane. | No | @@ -111,6 +213,38 @@ A face. | `__meta` |`[` [`Metadata`](/docs/kcl/types/Metadata) `]`| | No | +---- + +**Type:** `object` + + + + + +## Properties + +| Property | Type | Description | Required | +|----------|------|-------------|----------| +| `type` |enum: [`Sketch`](/docs/kcl/types/Sketch)| | No | +| `value` |[`Sketch`](/docs/kcl/types/Sketch)| Any KCL value. | No | + + +---- + +**Type:** `object` + + + + + +## Properties + +| Property | Type | Description | Required | +|----------|------|-------------|----------| +| `type` |enum: `Sketches`| | No | +| `value` |`[` [`Sketch`](/docs/kcl/types/Sketch) `]`| | No | + + ---- An solid is a collection of extrude surfaces. @@ -183,13 +317,46 @@ Data for an imported geometry. | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: `Function`| | No | -| `expression` |[`FunctionExpression`](/docs/kcl/types/FunctionExpression)| Any KCL value. | No | | `memory` |[`ProgramMemory`](/docs/kcl/types/ProgramMemory)| Any KCL value. | No | | `__meta` |`[` [`Metadata`](/docs/kcl/types/Metadata) `]`| | No | ---- +**Type:** `object` + + + + + +## Properties + +| Property | Type | Description | Required | +|----------|------|-------------|----------| +| `type` |enum: `Module`| | No | +| `value` |[`ModuleId`](/docs/kcl/types/ModuleId)| Any KCL value. | No | +| `__meta` |`[` [`Metadata`](/docs/kcl/types/Metadata) `]`| | No | + + +---- + +**Type:** `object` + + + + + +## Properties + +| Property | Type | Description | Required | +|----------|------|-------------|----------| +| `type` |enum: [`KclNone`](/docs/kcl/types/KclNone)| | No | +| `value` |[`KclNone`](/docs/kcl/types/KclNone)| Any KCL value. | No | +| `__meta` |`[` [`Metadata`](/docs/kcl/types/Metadata) `]`| | No | + + +---- + diff --git a/docs/kcl/types/LinearPattern2dData.md b/docs/kcl/types/LinearPattern2dData.md index aab649277..7f05b0cbf 100644 --- a/docs/kcl/types/LinearPattern2dData.md +++ b/docs/kcl/types/LinearPattern2dData.md @@ -16,7 +16,7 @@ Data for a linear pattern on a 2D sketch. | Property | Type | Description | Required | |----------|------|-------------|----------| -| `instances` |[`Uint`](/docs/kcl/types/Uint)| The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect. | No | +| `instances` |`integer`| The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect. | No | | `distance` |`number`| The distance between each repetition. This can also be referred to as spacing. | No | | `axis` |`[number, number]`| The axis of the pattern. This is a 2D vector. | No | diff --git a/docs/kcl/types/LinearPattern3dData.md b/docs/kcl/types/LinearPattern3dData.md index 878a66ec8..33118250d 100644 --- a/docs/kcl/types/LinearPattern3dData.md +++ b/docs/kcl/types/LinearPattern3dData.md @@ -16,7 +16,7 @@ Data for a linear pattern on a 3D model. | Property | Type | Description | Required | |----------|------|-------------|----------| -| `instances` |[`Uint`](/docs/kcl/types/Uint)| The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect. | No | +| `instances` |`integer`| The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect. | No | | `distance` |`number`| The distance between each repetition. This can also be referred to as spacing. | No | | `axis` |`[number, number, number]`| The axis of the pattern. | No | diff --git a/docs/kcl/types/LiteralIdentifier.md b/docs/kcl/types/LiteralIdentifier.md deleted file mode 100644 index 654d7e501..000000000 --- a/docs/kcl/types/LiteralIdentifier.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: "LiteralIdentifier" -excerpt: "" -layout: manual ---- - - - - - - -**This schema accepts exactly one of the following:** - - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: [`Identifier`](/docs/kcl/types/Identifier)| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `name` |`string`| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Literal`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `value` |[`LiteralValue`](/docs/kcl/types/LiteralValue)| | No | -| `raw` |`string`| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - - - - diff --git a/docs/kcl/types/LiteralValue.md b/docs/kcl/types/LiteralValue.md deleted file mode 100644 index 1535d501c..000000000 --- a/docs/kcl/types/LiteralValue.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -title: "LiteralValue" -excerpt: "" -layout: manual ---- - - - - - -**This schema accepts any of the following:** - - -**Type:** `integer` (`int64`) - - - - - - - ----- - -**Type:** `number` (`double`) - - - - - - - ----- - -**Type:** `string` - - - - - - - ----- - -**Type:** `boolean` - - - - - - - ----- - - - - - diff --git a/docs/kcl/types/MemberObject.md b/docs/kcl/types/MemberObject.md deleted file mode 100644 index 568ab0bc2..000000000 --- a/docs/kcl/types/MemberObject.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -title: "MemberObject" -excerpt: "" -layout: manual ---- - - - - - - -**This schema accepts exactly one of the following:** - - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `MemberExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `object` |[`MemberObject`](/docs/kcl/types/MemberObject)| | No | -| `property` |[`LiteralIdentifier`](/docs/kcl/types/LiteralIdentifier)| | No | -| `computed` |`boolean`| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: [`Identifier`](/docs/kcl/types/Identifier)| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `name` |`string`| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - ----- - - - - diff --git a/docs/kcl/types/ModuleId.md b/docs/kcl/types/ModuleId.md new file mode 100644 index 000000000..9ed25fcfe --- /dev/null +++ b/docs/kcl/types/ModuleId.md @@ -0,0 +1,16 @@ +--- +title: "ModuleId" +excerpt: "Identifier of a source file. Uses a u32 to keep the size small." +layout: manual +--- + +Identifier of a source file. Uses a u32 to keep the size small. + +**Type:** `integer` (`uint32`) + + + + + + + diff --git a/docs/kcl/types/NonCodeMeta.md b/docs/kcl/types/NonCodeMeta.md deleted file mode 100644 index 14b14d4c8..000000000 --- a/docs/kcl/types/NonCodeMeta.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: "NonCodeMeta" -excerpt: "" -layout: manual ---- - - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `nonCodeNodes` |`object`| | No | -| `start` |`[` [`NonCodeNode`](/docs/kcl/types/NonCodeNode) `]`| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - diff --git a/docs/kcl/types/NonCodeNode.md b/docs/kcl/types/NonCodeNode.md deleted file mode 100644 index 2209de97a..000000000 --- a/docs/kcl/types/NonCodeNode.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: "NonCodeNode" -excerpt: "" -layout: manual ---- - - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `value` |[`NonCodeValue`](/docs/kcl/types/NonCodeValue)| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - diff --git a/docs/kcl/types/NonCodeValue.md b/docs/kcl/types/NonCodeValue.md deleted file mode 100644 index 87a7c5611..000000000 --- a/docs/kcl/types/NonCodeValue.md +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: "NonCodeValue" -excerpt: "" -layout: manual ---- - - - - - - -**This schema accepts exactly one of the following:** - -A shebang. This is a special type of comment that is at the top of the file. It looks like this: ```python,no_run #!/usr/bin/env python ``` - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `shebang`| | No | -| `value` |`string`| | No | - - ----- -An inline comment. Here are examples: `1 + 1 // This is an inline comment`. `1 + 1 /* Here's another */`. - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `inlineComment`| | No | -| `value` |`string`| | No | -| `style` |[`CommentStyle`](/docs/kcl/types/CommentStyle)| | No | - - ----- -A block comment. An example of this is the following: ```python,no_run /* This is a block comment */ 1 + 1 ``` Now this is important. The block comment is attached to the next line. This is always the case. Also the block comment doesn't have a new line above it. If it did it would be a `NewLineBlockComment`. - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `blockComment`| | No | -| `value` |`string`| | No | -| `style` |[`CommentStyle`](/docs/kcl/types/CommentStyle)| | No | - - ----- -A block comment that has a new line above it. The user explicitly added a new line above the block comment. - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `newLineBlockComment`| | No | -| `value` |`string`| | No | -| `style` |[`CommentStyle`](/docs/kcl/types/CommentStyle)| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `newLine`| | No | - - ----- - - - - diff --git a/docs/kcl/types/ObjectProperty.md b/docs/kcl/types/ObjectProperty.md deleted file mode 100644 index 57b1ea331..000000000 --- a/docs/kcl/types/ObjectProperty.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "ObjectProperty" -excerpt: "" -layout: manual ---- - - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `key` |[`Identifier`](/docs/kcl/types/Identifier)| | No | -| `value` |[`Expr`](/docs/kcl/types/Expr)| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - diff --git a/docs/kcl/types/Parameter.md b/docs/kcl/types/Parameter.md deleted file mode 100644 index 770060138..000000000 --- a/docs/kcl/types/Parameter.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: "Parameter" -excerpt: "Parameter of a KCL function." -layout: manual ---- - -Parameter of a KCL function. - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `identifier` |[`Identifier`](/docs/kcl/types/Identifier)| The parameter's label or name. | No | -| `optional` |`boolean`| Is the parameter optional? | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - diff --git a/docs/kcl/types/Path.md b/docs/kcl/types/Path.md index 4484b1abe..ba49c0228 100644 --- a/docs/kcl/types/Path.md +++ b/docs/kcl/types/Path.md @@ -91,7 +91,7 @@ a complete arc | `type` |enum: `Circle`| | No | | `center` |`[number, number]`| the arc's center | No | | `radius` |`number`| the arc's radius | No | -| `ccw` |`boolean`| arc's direction | No | +| `ccw` |`boolean`| arc's direction This is used to compute the tangential angle. | No | | `from` |`[number, number]`| The from point. | No | | `to` |`[number, number]`| The to point. | No | | `tag` |[`TagDeclarator`](/docs/kcl/types#tag-declaration)| The tag of the path. | No | @@ -177,6 +177,7 @@ A circular arc, not necessarily tangential to the current point. | `type` |enum: `Arc`| | No | | `center` |`[number, number]`| Center of the circle that this arc is drawn on. | No | | `radius` |`number`| Radius of the circle that this arc is drawn on. | No | +| `ccw` |`boolean`| True if the arc is counterclockwise. | No | | `from` |`[number, number]`| The from point. | No | | `to` |`[number, number]`| The to point. | No | | `tag` |[`TagDeclarator`](/docs/kcl/types#tag-declaration)| The tag of the path. | No | diff --git a/docs/kcl/types/Plane.md b/docs/kcl/types/Plane.md new file mode 100644 index 000000000..f1aa17aba --- /dev/null +++ b/docs/kcl/types/Plane.md @@ -0,0 +1,27 @@ +--- +title: "Plane" +excerpt: "A plane." +layout: manual +--- + +A plane. + +**Type:** `object` + + + + + +## Properties + +| Property | Type | Description | Required | +|----------|------|-------------|----------| +| `id` |`string`| The id of the plane. | No | +| `value` |[`PlaneType`](/docs/kcl/types/PlaneType)| A plane. | No | +| `origin` |[`Point3d`](/docs/kcl/types/Point3d)| Origin of the plane. | No | +| `xAxis` |[`Point3d`](/docs/kcl/types/Point3d)| What should the plane’s X axis be? | No | +| `yAxis` |[`Point3d`](/docs/kcl/types/Point3d)| What should the plane’s Y axis be? | No | +| `zAxis` |[`Point3d`](/docs/kcl/types/Point3d)| The z-axis (normal). | No | +| `__meta` |`[` [`Metadata`](/docs/kcl/types/Metadata) `]`| | No | + + diff --git a/docs/kcl/types/PlaneData.md b/docs/kcl/types/PlaneData.md index f16cfd9d2..8cc4707c2 100644 --- a/docs/kcl/types/PlaneData.md +++ b/docs/kcl/types/PlaneData.md @@ -1,10 +1,10 @@ --- title: "PlaneData" -excerpt: "Data for a plane." +excerpt: "Orientation data that can be used to construct a plane, not a plane in itself." layout: manual --- -Data for a plane. +Orientation data that can be used to construct a plane, not a plane in itself. diff --git a/docs/kcl/types/PolygonData.md b/docs/kcl/types/PolygonData.md new file mode 100644 index 000000000..1f7a05429 --- /dev/null +++ b/docs/kcl/types/PolygonData.md @@ -0,0 +1,24 @@ +--- +title: "PolygonData" +excerpt: "Data for drawing a polygon" +layout: manual +--- + +Data for drawing a polygon + +**Type:** `object` + + + + + +## Properties + +| Property | Type | Description | Required | +|----------|------|-------------|----------| +| `radius` |`number`| The radius of the polygon | No | +| `numSides` |`integer`| The number of sides in the polygon | No | +| `center` |`[number, number]`| The center point of the polygon | No | +| `inscribed` |`boolean`| Whether the polygon is inscribed (true) or circumscribed (false) about a circle with the specified radius | No | + + diff --git a/docs/kcl/types/Program.md b/docs/kcl/types/Program.md deleted file mode 100644 index b33b63e9b..000000000 --- a/docs/kcl/types/Program.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: "Program" -excerpt: "A KCL program top level, or function body." -layout: manual ---- - -A KCL program top level, or function body. - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `body` |`[` [`BodyItem`](/docs/kcl/types/BodyItem) `]`| | No | -| `nonCodeMeta` |[`NonCodeMeta`](/docs/kcl/types/NonCodeMeta)| A KCL program top level, or function body. | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - diff --git a/docs/kcl/types/ProgramMemory.md b/docs/kcl/types/ProgramMemory.md index b6bd5c095..f69bec185 100644 --- a/docs/kcl/types/ProgramMemory.md +++ b/docs/kcl/types/ProgramMemory.md @@ -16,7 +16,7 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| | `environments` |`[` [`Environment`](/docs/kcl/types/Environment) `]`| | No | -| `currentEnv` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | +| `currentEnv` |`integer`| | No | | `return` |[`KclValue`](/docs/kcl/types/KclValue)| | No | diff --git a/docs/kcl/types/SketchData.md b/docs/kcl/types/SketchData.md index 53ee3ef0c..fbb01aa85 100644 --- a/docs/kcl/types/SketchData.md +++ b/docs/kcl/types/SketchData.md @@ -22,6 +22,18 @@ Data for start sketch on. You can start a sketch on a plane or an solid. +---- +Data for start sketch on. You can start a sketch on a plane or an solid. + +[`Plane`](/docs/kcl/types/Plane) + + + + + + + + ---- Data for start sketch on. You can start a sketch on a plane or an solid. diff --git a/docs/kcl/types/SweepData.md b/docs/kcl/types/SweepData.md new file mode 100644 index 000000000..df2d5915c --- /dev/null +++ b/docs/kcl/types/SweepData.md @@ -0,0 +1,23 @@ +--- +title: "SweepData" +excerpt: "Data for a sweep." +layout: manual +--- + +Data for a sweep. + +**Type:** `object` + + + + + +## Properties + +| Property | Type | Description | Required | +|----------|------|-------------|----------| +| `path` |[`Sketch`](/docs/kcl/types/Sketch)| The path to sweep along. | No | +| `sectional` |`boolean`| If true, the sweep will be broken up into sub-sweeps (extrusions, revolves, sweeps) based on the trajectory path components. | No | +| `tolerance` |`number`| Tolerance for the sweep operation. | No | + + diff --git a/docs/kcl/types/Uint.md b/docs/kcl/types/Uint.md deleted file mode 100644 index 25c3e0fdc..000000000 --- a/docs/kcl/types/Uint.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: "Uint" -excerpt: "" -layout: manual ---- - - -**Type:** `integer` (`uint32`) - - - - - - - diff --git a/docs/kcl/types/UnaryOperator.md b/docs/kcl/types/UnaryOperator.md deleted file mode 100644 index 6a2e8fbd4..000000000 --- a/docs/kcl/types/UnaryOperator.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: "UnaryOperator" -excerpt: "" -layout: manual ---- - - - - - - -**This schema accepts exactly one of the following:** - -Negate a number. - -**enum:** `-` - - - - - - - - ----- -Negate a boolean. - -**enum:** `!` - - - - - - - - ----- - - - - diff --git a/docs/kcl/types/VariableDeclarator.md b/docs/kcl/types/VariableDeclarator.md deleted file mode 100644 index 5af68d91a..000000000 --- a/docs/kcl/types/VariableDeclarator.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "VariableDeclarator" -excerpt: "" -layout: manual ---- - - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `id` |[`Identifier`](/docs/kcl/types/Identifier)| The identifier of the variable. | No | -| `init` |[`Expr`](/docs/kcl/types/Expr)| The value of the variable. | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - diff --git a/docs/kcl/types/VariableKind.md b/docs/kcl/types/VariableKind.md deleted file mode 100644 index 4ff9d2881..000000000 --- a/docs/kcl/types/VariableKind.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: "VariableKind" -excerpt: "" -layout: manual ---- - - - - - - -**This schema accepts exactly one of the following:** - -Declare a named constant. - -**enum:** `const` - - - - - - - - ----- -Declare a function. - -**enum:** `fn` - - - - - - - - ----- - - - - diff --git a/docs/kcl/xLine.md b/docs/kcl/xLine.md index 6e754bc37..05c142c0c 100644 --- a/docs/kcl/xLine.md +++ b/docs/kcl/xLine.md @@ -32,10 +32,10 @@ xLine(length: number, sketch: Sketch, tag?: TagDeclarator) -> Sketch exampleSketch = startSketchOn('XZ') |> startProfileAt([0, 0], %) |> xLine(15, %) - |> angledLine({ angle: 80, length: 15 }, %) + |> angledLine({ angle = 80, length = 15 }, %) |> line([8, -10], %) |> xLine(10, %) - |> angledLine({ angle: 120, length: 30 }, %) + |> angledLine({ angle = 120, length = 30 }, %) |> xLine(-15, %) |> close(%) diff --git a/docs/kcl/xLineTo.md b/docs/kcl/xLineTo.md index 0c6c575b0..8e74961d3 100644 --- a/docs/kcl/xLineTo.md +++ b/docs/kcl/xLineTo.md @@ -32,10 +32,10 @@ xLineTo(to: number, sketch: Sketch, tag?: TagDeclarator) -> Sketch exampleSketch = startSketchOn('XZ') |> startProfileAt([0, 0], %) |> xLineTo(15, %) - |> angledLine({ angle: 80, length: 15 }, %) + |> angledLine({ angle = 80, length = 15 }, %) |> line([8, -10], %) |> xLineTo(40, %) - |> angledLine({ angle: 135, length: 30 }, %) + |> angledLine({ angle = 135, length = 30 }, %) |> xLineTo(10, %) |> close(%) diff --git a/docs/kcl/yLine.md b/docs/kcl/yLine.md index f298c4fa9..f82ab4a90 100644 --- a/docs/kcl/yLine.md +++ b/docs/kcl/yLine.md @@ -32,7 +32,7 @@ yLine(length: number, sketch: Sketch, tag?: TagDeclarator) -> Sketch exampleSketch = startSketchOn('XZ') |> startProfileAt([0, 0], %) |> yLine(15, %) - |> angledLine({ angle: 30, length: 15 }, %) + |> angledLine({ angle = 30, length = 15 }, %) |> line([8, -10], %) |> yLine(-5, %) |> close(%) diff --git a/docs/kcl/yLineTo.md b/docs/kcl/yLineTo.md index 320853a92..1aab50165 100644 --- a/docs/kcl/yLineTo.md +++ b/docs/kcl/yLineTo.md @@ -31,7 +31,7 @@ yLineTo(to: number, sketch: Sketch, tag?: TagDeclarator) -> Sketch ```js exampleSketch = startSketchOn("XZ") |> startProfileAt([0, 0], %) - |> angledLine({ angle: 50, length: 45 }, %) + |> angledLine({ angle = 50, length = 45 }, %) |> yLineTo(0, %) |> close(%) diff --git a/e2e/playwright/app-header-tests.spec.ts b/e2e/playwright/app-header-tests.spec.ts index 9402886d3..c663c83a8 100644 --- a/e2e/playwright/app-header-tests.spec.ts +++ b/e2e/playwright/app-header-tests.spec.ts @@ -1,22 +1,11 @@ -import { test, expect } from '@playwright/test' - -import { setupElectron, tearDown } from './test-utils' - -test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) +import { test, expect } from './zoo-test' test.describe('Electron app header tests', () => { test( 'Open Command Palette button has correct shortcut', { tag: '@electron' }, - async ({ browserName }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async () => {}, - }) - - await page.setViewportSize({ width: 1200, height: 500 }) + async ({ page }, testInfo) => { + await page.setBodyDimensions({ width: 1200, height: 500 }) // No space before the shortcut since it checks textContent. let text @@ -34,21 +23,14 @@ test.describe('Electron app header tests', () => { const commandsButton = page.getByRole('button', { name: 'Commands' }) await expect(commandsButton).toBeVisible() await expect(commandsButton).toHaveText(text) - - await electronApp.close() } ) test( 'User settings has correct shortcut', { tag: '@electron' }, - async ({ browserName }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async () => {}, - }) - - await page.setViewportSize({ width: 1200, height: 500 }) + async ({ page }, testInfo) => { + await page.setBodyDimensions({ width: 1200, height: 500 }) // Open the user sidebar menu. await page.getByTestId('user-sidebar-toggle').click() @@ -59,8 +41,6 @@ test.describe('Electron app header tests', () => { const userSettingsButton = page.getByTestId('user-settings') await expect(userSettingsButton).toBeVisible() await expect(userSettingsButton).toHaveText(text) - - await electronApp.close() } ) }) diff --git a/e2e/playwright/basic-sketch.spec.ts b/e2e/playwright/basic-sketch.spec.ts index 09c1d3a7d..40d453346 100644 --- a/e2e/playwright/basic-sketch.spec.ts +++ b/e2e/playwright/basic-sketch.spec.ts @@ -1,29 +1,26 @@ -import { test, expect, Page } from '@playwright/test' +import { test, expect, Page } from './zoo-test' import { getUtils, TEST_COLORS, - setup, - tearDown, commonPoints, PERSIST_MODELING_CONTEXT, } from './test-utils' - -test.beforeEach(async ({ context, page }, testInfo) => { - await setup(context, page, testInfo) -}) - -test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) +import { HomePageFixture } from './fixtures/homePageFixture' test.setTimeout(120000) -async function doBasicSketch(page: Page, openPanes: string[]) { +async function doBasicSketch( + page: Page, + homePage: HomePageFixture, + openPanes: string[] +) { const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) const PUR = 400 / 37.5 //pixeltoUnitRatio - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() + await page.waitForTimeout(1000) await u.openDebugPanel() // If we have the code pane open, we should see the code. @@ -67,15 +64,15 @@ async function doBasicSketch(page: Page, openPanes: string[]) { if (openPanes.includes('code')) { await expect(u.codeLocator).toHaveText(`sketch001 = startSketchOn('XZ') |> startProfileAt(${commonPoints.startAt}, %) - |> line([${commonPoints.num1}, 0], %)`) + |> xLine(${commonPoints.num1}, %)`) } await page.waitForTimeout(500) await page.mouse.click(startXPx + PUR * 20, 500 - PUR * 20) if (openPanes.includes('code')) { await expect(u.codeLocator).toHaveText(`sketch001 = startSketchOn('XZ') |> startProfileAt(${commonPoints.startAt}, %) - |> line([${commonPoints.num1}, 0], %) - |> line([0, ${commonPoints.num1 + 0.01}], %)`) + |> xLine(${commonPoints.num1}, %) + |> yLine(${commonPoints.num1 + 0.01}, %)`) } else { await page.waitForTimeout(500) } @@ -84,9 +81,9 @@ async function doBasicSketch(page: Page, openPanes: string[]) { if (openPanes.includes('code')) { await expect(u.codeLocator).toHaveText(`sketch001 = startSketchOn('XZ') |> startProfileAt(${commonPoints.startAt}, %) - |> line([${commonPoints.num1}, 0], %) - |> line([0, ${commonPoints.num1 + 0.01}], %) - |> line([-${commonPoints.num2}, 0], %)`) + |> xLine(${commonPoints.num1}, %) + |> yLine(${commonPoints.num1 + 0.01}, %) + |> xLine(${commonPoints.num2 * -1}, %)`) } // deselect line tool @@ -142,19 +139,17 @@ async function doBasicSketch(page: Page, openPanes: string[]) { await u.openKclCodePanel() await expect(u.codeLocator).toHaveText(`sketch001 = startSketchOn('XZ') |> startProfileAt(${commonPoints.startAt}, %) - |> line([${commonPoints.num1}, 0], %, $seg01) - |> line([0, ${commonPoints.num1 + 0.01}], %) - |> angledLine([180, segLen(seg01)], %)`) + |> xLine(${commonPoints.num1}, %, $seg01) + |> yLine(${commonPoints.num1 + 0.01}, %) + |> xLine(-segLen(seg01), %)`) } test.describe('Basic sketch', () => { - test('code pane open at start', { tag: ['@skipWin'] }, async ({ page }) => { - // Skip on windows it is being weird. - test.skip(process.platform === 'win32', 'Skip on windows') - await doBasicSketch(page, ['code']) + test.fixme('code pane open at start', async ({ page, homePage }) => { + await doBasicSketch(page, homePage, ['code']) }) - test('code pane closed at start', async ({ page }) => { + test('code pane closed at start', async ({ page, homePage }) => { // Load the app with the code panes await page.addInitScript(async (persistModelingContext) => { localStorage.setItem( @@ -162,6 +157,6 @@ test.describe('Basic sketch', () => { JSON.stringify({ openPanes: [] }) ) }, PERSIST_MODELING_CONTEXT) - await doBasicSketch(page, []) + await doBasicSketch(page, homePage, []) }) }) diff --git a/e2e/playwright/can-create-sketches-on-all-planes-and-their-back-sides.spec.ts b/e2e/playwright/can-create-sketches-on-all-planes-and-their-back-sides.spec.ts index fab014015..aa9333013 100644 --- a/e2e/playwright/can-create-sketches-on-all-planes-and-their-back-sides.spec.ts +++ b/e2e/playwright/can-create-sketches-on-all-planes-and-their-back-sides.spec.ts @@ -1,27 +1,21 @@ -import { test, expect } from '@playwright/test' -import { getUtils, setup, tearDown } from './test-utils' +import { test, expect, Page } from './zoo-test' +import { HomePageFixture } from './fixtures/homePageFixture' +import { getUtils } from './test-utils' import { EngineCommand } from 'lang/std/artifactGraph' import { uuidv4 } from 'lib/utils' -test.beforeEach(async ({ context, page }, testInfo) => { - await setup(context, page, testInfo) -}) - -test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) - test.describe('Can create sketches on all planes and their back sides', () => { const sketchOnPlaneAndBackSideTest = async ( - page: any, + page: Page, + homePage: HomePageFixture, plane: string, clickCoords: { x: number; y: number } ) => { const u = await getUtils(page) const PUR = 400 / 37.5 //pixeltoUnitRatio - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await u.openDebugPanel() const coord = @@ -83,32 +77,39 @@ test.describe('Can create sketches on all planes and their back sides', () => { await u.clearCommandLogs() await u.removeCurrentCode() } - test('XY', async ({ page }) => { + test('XY', async ({ page, homePage }) => { await sketchOnPlaneAndBackSideTest( page, + homePage, 'XY', { x: 600, y: 388 } // red plane // { x: 600, y: 400 }, // red plane // clicks grid helper and that causes problems, should fix so that these coords work too. ) }) - test('YZ', async ({ page }) => { - await sketchOnPlaneAndBackSideTest(page, 'YZ', { x: 700, y: 250 }) // green plane + test('YZ', async ({ page, homePage }) => { + await sketchOnPlaneAndBackSideTest(page, homePage, 'YZ', { x: 700, y: 250 }) // green plane }) - test('XZ', async ({ page }) => { - await sketchOnPlaneAndBackSideTest(page, '-XZ', { x: 700, y: 80 }) // blue plane + test('XZ', async ({ page, homePage }) => { + await sketchOnPlaneAndBackSideTest(page, homePage, '-XZ', { x: 700, y: 80 }) // blue plane }) - test('-XY', async ({ page }) => { - await sketchOnPlaneAndBackSideTest(page, '-XY', { x: 600, y: 118 }) // back of red plane + test('-XY', async ({ page, homePage }) => { + await sketchOnPlaneAndBackSideTest(page, homePage, '-XY', { + x: 600, + y: 118, + }) // back of red plane }) - test('-YZ', async ({ page }) => { - await sketchOnPlaneAndBackSideTest(page, '-YZ', { x: 700, y: 219 }) // back of green plane + test('-YZ', async ({ page, homePage }) => { + await sketchOnPlaneAndBackSideTest(page, homePage, '-YZ', { + x: 700, + y: 219, + }) // back of green plan }) - test('-XZ', async ({ page }) => { - await sketchOnPlaneAndBackSideTest(page, 'XZ', { x: 700, y: 427 }) // back of blue plane + test('-XZ', async ({ page, homePage }) => { + await sketchOnPlaneAndBackSideTest(page, homePage, 'XZ', { x: 700, y: 427 }) // back of blue plane }) }) diff --git a/e2e/playwright/code-pane-and-errors.spec.ts b/e2e/playwright/code-pane-and-errors.spec.ts index 8bfe6d194..0e8706c8e 100644 --- a/e2e/playwright/code-pane-and-errors.spec.ts +++ b/e2e/playwright/code-pane-and-errors.spec.ts @@ -1,28 +1,15 @@ -import { test, expect } from '@playwright/test' +import { test, expect } from './zoo-test' -import { - getUtils, - setup, - setupElectron, - tearDown, - executorInputPath, -} from './test-utils' +import { getUtils, executorInputPath } from './test-utils' import { join } from 'path' import { bracket } from 'lib/exampleKcl' import { TEST_CODE_LONG_WITH_ERROR_OUT_OF_VIEW } from './storageStates' import fsp from 'fs/promises' -test.beforeEach(async ({ context, page }, testInfo) => { - await setup(context, page, testInfo) -}) - -test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) - test.describe('Code pane and errors', () => { test('Typing KCL errors induces a badge on the code pane button', async ({ page, + homePage, }) => { const u = await getUtils(page) @@ -31,18 +18,18 @@ test.describe('Code pane and errors', () => { localStorage.setItem( 'persistCode', `// Extruded Triangle -sketch001 = startSketchOn('XZ') - |> startProfileAt([0, 0], %) - |> line([10, 0], %) - |> line([-5, 10], %) - |> lineTo([profileStartX(%), profileStartY(%)], %) - |> close(%) -extrude001 = extrude(5, sketch001)` + sketch001 = startSketchOn('XZ') + |> startProfileAt([0, 0], %) + |> line([10, 0], %) + |> line([-5, 10], %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) + extrude001 = extrude(5, sketch001)` ) }) - await page.setViewportSize({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() // wait for execution done await u.openDebugPanel() @@ -62,11 +49,11 @@ extrude001 = extrude(5, sketch001)` await expect(codePaneButtonHolder).toContainText('notification') }) - test('Opening and closing the code pane will consistently show error diagnostics', async ({ + test.skip('Opening and closing the code pane will consistently show error diagnostics', async ({ page, + homePage, + editor, }) => { - await page.goto('http://localhost:3000') - const u = await getUtils(page) // Load the app with the working starter code @@ -74,8 +61,8 @@ extrude001 = extrude(5, sketch001)` localStorage.setItem('persistCode', code) }, bracket) - await page.setViewportSize({ width: 1200, height: 900 }) - await u.waitForAuthSkipAppStart() + await page.setBodyDimensions({ width: 1200, height: 900 }) + await homePage.goToModelingScene() // wait for execution done await u.openDebugPanel() @@ -91,8 +78,9 @@ extrude001 = extrude(5, sketch001)` await expect(codePaneButtonHolder).not.toContainText('notification') // Delete a character to break the KCL - await u.openKclCodePanel() - await page.getByText('thickness, bracketLeg1Sketch)').click() + await editor.openPane() + await editor.scrollToText('thickness, bracketLeg1Sketch)') + await page.getByText('extrude(thickness, bracketLeg1Sketch)').click() await page.keyboard.press('Backspace') // Ensure that a badge appears on the button @@ -116,7 +104,10 @@ extrude001 = extrude(5, sketch001)` await expect(page.locator('.cm-lint-marker-error')).not.toBeVisible() // Open the code pane - await u.openKclCodePanel() + await editor.openPane() + + // Go to our problematic code again (missing closing paren!) + await editor.scrollToText('extrude(thickness, bracketLeg1Sketch') // Ensure that a badge appears on the button await expect(codePaneButtonHolder).toContainText('notification') @@ -129,59 +120,58 @@ extrude001 = extrude(5, sketch001)` await expect(page.locator('.cm-tooltip').first()).toBeVisible() }) - test('When error is not in view you can click the badge to scroll to it', async ({ - page, - }) => { - const u = await getUtils(page) + test.fixme( + 'When error is not in view you can click the badge to scroll to it', + async ({ page, homePage, context }) => { + // Load the app with the working starter code + await context.addInitScript((code) => { + localStorage.setItem('persistCode', code) + }, TEST_CODE_LONG_WITH_ERROR_OUT_OF_VIEW) - // Load the app with the working starter code - await page.addInitScript((code) => { - localStorage.setItem('persistCode', code) - }, TEST_CODE_LONG_WITH_ERROR_OUT_OF_VIEW) + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() - await page.setViewportSize({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await page.waitForTimeout(1000) - await page.waitForTimeout(1000) + // Ensure badge is present + const codePaneButtonHolder = page.locator('#code-button-holder') + await expect(codePaneButtonHolder).toContainText('notification') - // Ensure badge is present - const codePaneButtonHolder = page.locator('#code-button-holder') - await expect(codePaneButtonHolder).toContainText('notification') + // Ensure we have no errors in the gutter, since error out of view. + await expect(page.locator('.cm-lint-marker-error')).not.toBeVisible() - // Ensure we have no errors in the gutter, since error out of view. - await expect(page.locator('.cm-lint-marker-error')).not.toBeVisible() + // Click the badge. + const badge = page.locator('#code-badge') + await expect(badge).toBeVisible() + await badge.click() - // Click the badge. - const badge = page.locator('#code-badge') - await expect(badge).toBeVisible() - await badge.click() + // Ensure we have an error diagnostic. + await expect(page.locator('.cm-lint-marker-error').first()).toBeVisible() - // Ensure we have an error diagnostic. - await expect(page.locator('.cm-lint-marker-error').first()).toBeVisible() - - // Hover over the error to see the error message - await page.hover('.cm-lint-marker-error') - await expect( - page - .getByText( - 'sketch profile must lie entirely on one side of the revolution axis' - ) - .first() - ).toBeVisible() - }) + // Hover over the error to see the error message + await page.hover('.cm-lint-marker-error') + await expect( + page + .getByText( + 'Modeling command failed: [ApiError { error_code: InternalEngine, message: "Solid3D revolve failed: sketch profile must lie entirely on one side of the revolution axis" }]' + ) + .first() + ).toBeVisible() + } + ) test('When error is not in view WITH LINTS you can click the badge to scroll to it', async ({ + context, page, + homePage, }) => { - const u = await getUtils(page) - // Load the app with the working starter code - await page.addInitScript((code) => { + await context.addInitScript((code) => { localStorage.setItem('persistCode', code) }, TEST_CODE_LONG_WITH_ERROR_OUT_OF_VIEW) - await page.setViewportSize({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() await page.waitForTimeout(1000) @@ -241,32 +231,29 @@ extrude001 = extrude(5, sketch001)` test( 'Opening multiple panes persists when switching projects', { tag: '@electron' }, - async ({ browserName }, testInfo) => { + async ({ context, page }, testInfo) => { // Setup multiple projects. - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - const routerTemplateDir = join(dir, 'router-template-slate') - const bracketDir = join(dir, 'bracket') - await Promise.all([ - fsp.mkdir(routerTemplateDir, { recursive: true }), - fsp.mkdir(bracketDir, { recursive: true }), - ]) - await Promise.all([ - fsp.copyFile( - executorInputPath('router-template-slate.kcl'), - join(routerTemplateDir, 'main.kcl') - ), - fsp.copyFile( - executorInputPath('focusrite_scarlett_mounting_braket.kcl'), - join(bracketDir, 'main.kcl') - ), - ]) - }, + await context.folderSetupFn(async (dir) => { + const routerTemplateDir = join(dir, 'router-template-slate') + const bracketDir = join(dir, 'bracket') + await Promise.all([ + fsp.mkdir(routerTemplateDir, { recursive: true }), + fsp.mkdir(bracketDir, { recursive: true }), + ]) + await Promise.all([ + fsp.copyFile( + executorInputPath('router-template-slate.kcl'), + join(routerTemplateDir, 'main.kcl') + ), + fsp.copyFile( + executorInputPath('focusrite_scarlett_mounting_braket.kcl'), + join(bracketDir, 'main.kcl') + ), + ]) }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) await test.step('Opening the bracket project should load', async () => { await expect(page.getByText('bracket')).toBeVisible() @@ -309,30 +296,21 @@ test( await expect(page.locator('#variables-pane')).toBeVisible() await expect(page.locator('#logs-pane')).toBeVisible() }) - - await electronApp.close() } ) test( 'external change of file contents are reflected in editor', { tag: '@electron' }, - async ({ browserName }, testInfo) => { + async ({ context, page }, testInfo) => { const PROJECT_DIR_NAME = 'lee-was-here' - const { - electronApp, - page, - dir: projectsDir, - } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - const aProjectDir = join(dir, PROJECT_DIR_NAME) - await fsp.mkdir(aProjectDir, { recursive: true }) - }, + const { dir: projectsDir } = await context.folderSetupFn(async (dir) => { + const aProjectDir = join(dir, PROJECT_DIR_NAME) + await fsp.mkdir(aProjectDir, { recursive: true }) }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) await test.step('Open the project', async () => { await expect(page.getByText(PROJECT_DIR_NAME)).toBeVisible() @@ -351,7 +329,5 @@ test( ) await u.editorTextMatches(content) }) - - await electronApp.close() } ) diff --git a/e2e/playwright/command-bar-tests.spec.ts b/e2e/playwright/command-bar-tests.spec.ts index 061f8a897..4ba16bdfa 100644 --- a/e2e/playwright/command-bar-tests.spec.ts +++ b/e2e/playwright/command-bar-tests.spec.ts @@ -1,37 +1,30 @@ -import { test, expect } from '@playwright/test' +import { test, expect } from './zoo-test' -import { getUtils, setup, tearDown } from './test-utils' +import { getUtils } from './test-utils' import { KCL_DEFAULT_LENGTH } from 'lib/constants' -test.beforeEach(async ({ context, page }, testInfo) => { - await setup(context, page, testInfo) -}) - -test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) - test.describe('Command bar tests', () => { test('Extrude from command bar selects extrude line after', async ({ page, + homePage, }) => { await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `sketch001 = startSketchOn('XY') - |> startProfileAt([-10, -10], %) - |> line([20, 0], %) - |> line([0, 20], %) - |> xLine(-20, %) - |> close(%) - ` + |> startProfileAt([-10, -10], %) + |> line([20, 0], %) + |> line([0, 20], %) + |> xLine(-20, %) + |> close(%) + ` ) }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await u.openDebugPanel() await u.expectCmdLog('[data-message-type="execution-done"]') @@ -52,24 +45,25 @@ test.describe('Command bar tests', () => { ) }) - test('Fillet from command bar', async ({ page }) => { + // TODO: fix this test after the electron migration + test.fixme('Fillet from command bar', async ({ page, homePage }) => { await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `sketch001 = startSketchOn('XY') - |> startProfileAt([-5, -5], %) - |> line([0, 10], %) - |> line([10, 0], %) - |> line([0, -10], %) - |> lineTo([profileStartX(%), profileStartY(%)], %) - |> close(%) -extrude001 = extrude(-10, sketch001)` + |> startProfileAt([-5, -5], %) + |> line([0, 10], %) + |> line([10, 0], %) + |> line([0, -10], %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) + extrude001 = extrude(-10, sketch001)` ) }) const u = await getUtils(page) - await page.setViewportSize({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await page.setBodyDimensions({ width: 1000, height: 500 }) + await homePage.goToModelingScene() await u.openDebugPanel() await u.expectCmdLog('[data-message-type="execution-done"]') await u.closeDebugPanel() @@ -87,16 +81,16 @@ extrude001 = extrude(-10, sketch001)` await page.keyboard.press('Enter') // submit await page.waitForTimeout(100) await expect(page.locator('.cm-activeLine')).toContainText( - `fillet({ radius: ${KCL_DEFAULT_LENGTH}, tags: [seg01] }, %)` + `fillet({ radius = ${KCL_DEFAULT_LENGTH}, tags = [seg01] }, %)` ) }) test('Command bar can change a setting, and switch back and forth between arguments', async ({ page, + homePage, }) => { - const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() const commandBarButton = page.getByRole('button', { name: 'Commands' }) const cmdSearchBar = page.getByPlaceholder('Search commands') @@ -153,7 +147,7 @@ extrude001 = extrude(-10, sketch001)` // Check that the visibility changed await expect(paneSelector).not.toBeVisible() - commandOptionInput = page.getByPlaceholder('off') + commandOptionInput = page.locator('[id="option-input"]') // Test case for https://github.com/KittyCAD/modeling-app/issues/2882 await commandBarButton.click() @@ -174,10 +168,10 @@ extrude001 = extrude(-10, sketch001)` test('Command bar keybinding works from code editor and can change a setting', async ({ page, + homePage, }) => { - const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() await expect( page.getByRole('button', { name: 'Start Sketch' }) @@ -221,25 +215,25 @@ extrude001 = extrude(-10, sketch001)` await expect(page.locator('body')).not.toHaveClass(`body-bg dark`) }) - test('Can extrude from the command bar', async ({ page }) => { + test('Can extrude from the command bar', async ({ page, homePage }) => { await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `distance = sqrt(20) - sketch001 = startSketchOn('XZ') - |> startProfileAt([-6.95, 10.98], %) - |> line([25.1, 0.41], %) - |> line([0.73, -20.93], %) - |> line([-23.44, 0.52], %) - |> close(%) - ` + sketch001 = startSketchOn('XZ') + |> startProfileAt([-6.95, 10.98], %) + |> line([25.1, 0.41], %) + |> line([0.73, -20.93], %) + |> line([-23.44, 0.52], %) + |> close(%) + ` ) }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() // Make sure the stream is up await u.openDebugPanel() @@ -293,26 +287,19 @@ extrude001 = extrude(-10, sketch001)` await continueButton.click() await submitButton.click() - // Check that the code was updated await u.waitForCmdReceive('extrude') - // Unfortunately this indentation seems to matter for the test - await expect(page.locator('.cm-content')).toHaveText( - `distance = sqrt(20) -distance001 = ${KCL_DEFAULT_LENGTH} -sketch001 = startSketchOn('XZ') - |> startProfileAt([-6.95, 10.98], %) - |> line([25.1, 0.41], %) - |> line([0.73, -20.93], %) - |> line([-23.44, 0.52], %) - |> close(%) -extrude001 = extrude(distance001, sketch001)`.replace(/(\r\n|\n|\r)/gm, '') // remove newlines + + await expect(page.locator('.cm-content')).toContainText( + 'extrude001 = extrude(distance001, sketch001)' ) }) - test('Can switch between sketch tools via command bar', async ({ page }) => { - const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + test('Can switch between sketch tools via command bar', async ({ + page, + homePage, + }) => { + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() const sketchButton = page.getByRole('button', { name: 'Start Sketch' }) const cmdBarButton = page.getByRole('button', { name: 'Commands' }) diff --git a/e2e/playwright/copilot-ghost-test.spec.ts b/e2e/playwright/copilot-ghost-test.spec.ts index e2afe8f7c..ad96f1110 100644 --- a/e2e/playwright/copilot-ghost-test.spec.ts +++ b/e2e/playwright/copilot-ghost-test.spec.ts @@ -1,23 +1,16 @@ -import { test, expect } from '@playwright/test' -import { getUtils, setup, tearDown } from './test-utils' +import { test, expect } from './zoo-test' +import { getUtils } from './test-utils' -test.beforeEach(async ({ context, page }, testInfo) => { - await setup(context, page, testInfo) -}) - -test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) test.describe('Copilot ghost text', () => { // eslint-disable-next-line jest/valid-title test.skip(true, 'Needs to get covered again') - test('completes code in empty file', async ({ page }) => { + test('completes code in empty file', async ({ page, homePage }) => { const u = await getUtils(page) // const PUR = 400 / 37.5 //pixeltoUnitRatio - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await u.codeLocator.click() await expect(page.locator('.cm-content')).toHaveText(``) @@ -52,12 +45,13 @@ test.describe('Copilot ghost text', () => { test.skip('copilot disabled in sketch mode no select plane', async ({ page, + homePage, }) => { const u = await getUtils(page) // const PUR = 400 / 37.5 //pixeltoUnitRatio - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await u.codeLocator.click() await expect(page.locator('.cm-content')).toHaveText(``) @@ -101,12 +95,13 @@ test.describe('Copilot ghost text', () => { test('copilot disabled in sketch mode after selecting plane', async ({ page, + homePage, }) => { const u = await getUtils(page) // const PUR = 400 / 37.5 //pixeltoUnitRatio - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await u.codeLocator.click() await expect(page.locator('.cm-content')).toHaveText(``) @@ -184,12 +179,12 @@ test.describe('Copilot ghost text', () => { await expect(page.locator('.cm-ghostText')).not.toBeVisible() }) - test('ArrowUp in code rejects the suggestion', async ({ page }) => { + test('ArrowUp in code rejects the suggestion', async ({ page, homePage }) => { const u = await getUtils(page) // const PUR = 400 / 37.5 //pixeltoUnitRatio - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await u.codeLocator.click() await expect(page.locator('.cm-content')).toHaveText(``) @@ -212,12 +207,15 @@ test.describe('Copilot ghost text', () => { await expect(page.locator('.cm-content')).toHaveText(``) }) - test('ArrowDown in code rejects the suggestion', async ({ page }) => { + test('ArrowDown in code rejects the suggestion', async ({ + page, + homePage, + }) => { const u = await getUtils(page) // const PUR = 400 / 37.5 //pixeltoUnitRatio - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await u.codeLocator.click() await expect(page.locator('.cm-content')).toHaveText(``) @@ -240,12 +238,15 @@ test.describe('Copilot ghost text', () => { await expect(page.locator('.cm-content')).toHaveText(``) }) - test('ArrowLeft in code rejects the suggestion', async ({ page }) => { + test('ArrowLeft in code rejects the suggestion', async ({ + page, + homePage, + }) => { const u = await getUtils(page) // const PUR = 400 / 37.5 //pixeltoUnitRatio - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await u.codeLocator.click() await expect(page.locator('.cm-content')).toHaveText(``) @@ -268,12 +269,15 @@ test.describe('Copilot ghost text', () => { await expect(page.locator('.cm-content')).toHaveText(``) }) - test('ArrowRight in code rejects the suggestion', async ({ page }) => { + test('ArrowRight in code rejects the suggestion', async ({ + page, + homePage, + }) => { const u = await getUtils(page) // const PUR = 400 / 37.5 //pixeltoUnitRatio - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await u.codeLocator.click() await expect(page.locator('.cm-content')).toHaveText(``) @@ -296,12 +300,12 @@ test.describe('Copilot ghost text', () => { await expect(page.locator('.cm-content')).toHaveText(``) }) - test('Enter in code scoots it down', async ({ page }) => { + test('Enter in code scoots it down', async ({ page, homePage }) => { const u = await getUtils(page) // const PUR = 400 / 37.5 //pixeltoUnitRatio - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await u.codeLocator.click() await expect(page.locator('.cm-content')).toHaveText(``) @@ -326,12 +330,15 @@ test.describe('Copilot ghost text', () => { ) }) - test('Ctrl+shift+z in code rejects the suggestion', async ({ page }) => { + test('Ctrl+shift+z in code rejects the suggestion', async ({ + page, + homePage, + }) => { const u = await getUtils(page) // const PUR = 400 / 37.5 //pixeltoUnitRatio - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await u.codeLocator.click() await expect(page.locator('.cm-content')).toHaveText(``) @@ -360,12 +367,13 @@ test.describe('Copilot ghost text', () => { test('Ctrl+z in code rejects the suggestion and undos the last code', async ({ page, + homePage, }) => { const u = await getUtils(page) // const PUR = 400 / 37.5 //pixeltoUnitRatio - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await page.waitForTimeout(800) await u.codeLocator.click() @@ -420,98 +428,107 @@ test.describe('Copilot ghost text', () => { await expect(page.locator('.cm-ghostText').first()).not.toBeVisible() // TODO when we make codemirror a widget, we can test this. - //await expect(page.locator('.cm-content')).toHaveText(``) - }) + //await expect(page.locator('.cm-content')).toHaveText(``) }) - test('delete in code rejects the suggestion', async ({ page }) => { - const u = await getUtils(page) - // const PUR = 400 / 37.5 //pixeltoUnitRatio - await page.setViewportSize({ width: 1200, height: 500 }) + test('delete in code rejects the suggestion', async ({ + page, + homePage, + }) => { + const u = await getUtils(page) + // const PUR = 400 / 37.5 //pixeltoUnitRatio + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() - await u.codeLocator.click() - await expect(page.locator('.cm-content')).toHaveText(``) + await u.codeLocator.click() + await expect(page.locator('.cm-content')).toHaveText(``) - await expect(page.locator('.cm-ghostText')).not.toBeVisible() - await page.waitForTimeout(500) - await page.keyboard.press('Enter') - await page.keyboard.press('Enter') - await page.keyboard.press('Enter') - await expect(page.locator('.cm-ghostText').first()).toBeVisible() - await expect(page.locator('.cm-content')).toHaveText( - `fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) |> line([scale, 0], %) |> line([0, -scale], %) return sg}part001 = cube([0,0], 20) |> close(%) |> extrude(20, %)` - ) - await expect(page.locator('.cm-ghostText').first()).toHaveText( - `fn cube = (pos, scale) => {` - ) + await expect(page.locator('.cm-ghostText')).not.toBeVisible() + await page.waitForTimeout(500) + await page.keyboard.press('Enter') + await page.keyboard.press('Enter') + await page.keyboard.press('Enter') + await expect(page.locator('.cm-ghostText').first()).toBeVisible() + await expect(page.locator('.cm-content')).toHaveText( + `fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) |> line([scale, 0], %) |> line([0, -scale], %) return sg}part001 = cube([0,0], 20) |> close(%) |> extrude(20, %)` + ) + await expect(page.locator('.cm-ghostText').first()).toHaveText( + `fn cube = (pos, scale) => {` + ) - // Going elsewhere in the code should hide the ghost text. - await page.keyboard.press('Delete') - await expect(page.locator('.cm-ghostText').first()).not.toBeVisible() + // Going elsewhere in the code should hide the ghost text. + await page.keyboard.press('Delete') + await expect(page.locator('.cm-ghostText').first()).not.toBeVisible() - await expect(page.locator('.cm-content')).toHaveText(``) - }) + await expect(page.locator('.cm-content')).toHaveText(``) + }) - test('backspace in code rejects the suggestion', async ({ page }) => { - const u = await getUtils(page) - // const PUR = 400 / 37.5 //pixeltoUnitRatio - await page.setViewportSize({ width: 1200, height: 500 }) + test('backspace in code rejects the suggestion', async ({ + page, + homePage, + }) => { + const u = await getUtils(page) + // const PUR = 400 / 37.5 //pixeltoUnitRatio + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() - await u.codeLocator.click() - await expect(page.locator('.cm-content')).toHaveText(``) + await u.codeLocator.click() + await expect(page.locator('.cm-content')).toHaveText(``) - await expect(page.locator('.cm-ghostText')).not.toBeVisible() - await page.waitForTimeout(500) - await page.keyboard.press('Enter') - await page.keyboard.press('Enter') - await page.keyboard.press('Enter') - await expect(page.locator('.cm-ghostText').first()).toBeVisible() - await expect(page.locator('.cm-content')).toHaveText( - `fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) |> line([scale, 0], %) |> line([0, -scale], %) return sg}part001 = cube([0,0], 20) |> close(%) |> extrude(20, %)` - ) - await expect(page.locator('.cm-ghostText').first()).toHaveText( - `fn cube = (pos, scale) => {` - ) + await expect(page.locator('.cm-ghostText')).not.toBeVisible() + await page.waitForTimeout(500) + await page.keyboard.press('Enter') + await page.keyboard.press('Enter') + await page.keyboard.press('Enter') + await expect(page.locator('.cm-ghostText').first()).toBeVisible() + await expect(page.locator('.cm-content')).toHaveText( + `fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) |> line([scale, 0], %) |> line([0, -scale], %) return sg}part001 = cube([0,0], 20) |> close(%) |> extrude(20, %)` + ) + await expect(page.locator('.cm-ghostText').first()).toHaveText( + `fn cube = (pos, scale) => {` + ) - // Going elsewhere in the code should hide the ghost text. - await page.keyboard.press('Backspace') - await expect(page.locator('.cm-ghostText').first()).not.toBeVisible() + // Going elsewhere in the code should hide the ghost text. + await page.keyboard.press('Backspace') + await expect(page.locator('.cm-ghostText').first()).not.toBeVisible() - await expect(page.locator('.cm-content')).toHaveText(``) - }) + await expect(page.locator('.cm-content')).toHaveText(``) + }) - test('focus outside code pane rejects the suggestion', async ({ page }) => { - const u = await getUtils(page) - // const PUR = 400 / 37.5 //pixeltoUnitRatio - await page.setViewportSize({ width: 1200, height: 500 }) + test('focus outside code pane rejects the suggestion', async ({ + page, + homePage, + }) => { + const u = await getUtils(page) + // const PUR = 400 / 37.5 //pixeltoUnitRatio + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() - await u.codeLocator.click() - await expect(page.locator('.cm-content')).toHaveText(``) + await u.codeLocator.click() + await expect(page.locator('.cm-content')).toHaveText(``) - await expect(page.locator('.cm-ghostText')).not.toBeVisible() - await page.waitForTimeout(500) - await page.keyboard.press('Enter') - await expect(page.locator('.cm-ghostText').first()).toBeVisible() - await expect(page.locator('.cm-content')).toHaveText( - `fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) |> line([scale, 0], %) |> line([0, -scale], %) return sg}part001 = cube([0,0], 20) |> close(%) |> extrude(20, %)` - ) - await expect(page.locator('.cm-ghostText').first()).toHaveText( - `fn cube = (pos, scale) => {` - ) + await expect(page.locator('.cm-ghostText')).not.toBeVisible() + await page.waitForTimeout(500) + await page.keyboard.press('Enter') + await expect(page.locator('.cm-ghostText').first()).toBeVisible() + await expect(page.locator('.cm-content')).toHaveText( + `fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) |> line([scale, 0], %) |> line([0, -scale], %) return sg}part001 = cube([0,0], 20) |> close(%) |> extrude(20, %)` + ) + await expect(page.locator('.cm-ghostText').first()).toHaveText( + `fn cube = (pos, scale) => {` + ) - // Going outside the editor should hide the ghost text. - await page.mouse.move(0, 0) - await page - .getByRole('button', { name: 'Start Sketch' }) - .waitFor({ state: 'visible' }) - await page.getByRole('button', { name: 'Start Sketch' }).click() - await expect(page.locator('.cm-ghostText').first()).not.toBeVisible() + // Going outside the editor should hide the ghost text. + await page.mouse.move(0, 0) + await page + .getByRole('button', { name: 'Start Sketch' }) + .waitFor({ state: 'visible' }) + await page.getByRole('button', { name: 'Start Sketch' }).click() + await expect(page.locator('.cm-ghostText').first()).not.toBeVisible() - await expect(page.locator('.cm-content')).toHaveText(``) + await expect(page.locator('.cm-content')).toHaveText(``) + }) }) }) diff --git a/e2e/playwright/debug-pane.spec.ts b/e2e/playwright/debug-pane.spec.ts index c59a354f9..3d7cf111a 100644 --- a/e2e/playwright/debug-pane.spec.ts +++ b/e2e/playwright/debug-pane.spec.ts @@ -1,14 +1,6 @@ -import { test, expect } from '@playwright/test' +import { test, expect } from './zoo-test' -import { getUtils, setup, tearDown } from './test-utils' - -test.beforeEach(async ({ context, page }, testInfo) => { - await setup(context, page, testInfo) -}) - -test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) +import { getUtils } from './test-utils' function countNewlines(input: string): number { let count = 0 @@ -24,13 +16,14 @@ test.describe('Debug pane', () => { test('Artifact IDs in the artifact graph are stable across code edits', async ({ page, context, + homePage, }) => { const code = `sketch001 = startSketchOn('XZ') - |> startProfileAt([0, 0], %) -|> line([1, 1], %) -` + |> startProfileAt([0, 0], %) + |> line([1, 1], %) + ` const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) const tree = page.getByTestId('debug-feature-tree') const segment = tree.locator('li', { @@ -39,7 +32,7 @@ test.describe('Debug pane', () => { }) await test.step('Test setup', async () => { - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await u.openKclCodePanel() await u.openDebugPanel() // Set the code in the code editor. diff --git a/e2e/playwright/desktop-export.spec.ts b/e2e/playwright/desktop-export.spec.ts index ad694b11d..0d6eebfef 100644 --- a/e2e/playwright/desktop-export.spec.ts +++ b/e2e/playwright/desktop-export.spec.ts @@ -1,39 +1,31 @@ -import { test, expect } from '@playwright/test' -import { join } from 'path' +import { test, expect } from './zoo-test' +import path from 'path' import { getUtils, - setupElectron, - tearDown, executorInputPath, + getPlaywrightDownloadDir, } from './test-utils' import fsp from 'fs/promises' -test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) - test( 'export works on the first try', { tag: '@electron' }, - async ({ browserName }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - const bracketDir = join(dir, 'bracket') - await Promise.all([fsp.mkdir(bracketDir, { recursive: true })]) - await Promise.all([ - fsp.copyFile( - executorInputPath('router-template-slate.kcl'), - join(bracketDir, 'other.kcl') - ), - fsp.copyFile( - executorInputPath('focusrite_scarlett_mounting_braket.kcl'), - join(bracketDir, 'main.kcl') - ), - ]) - }, + async ({ page, context }, testInfo) => { + await context.folderSetupFn(async (dir) => { + const bracketDir = path.join(dir, 'bracket') + await Promise.all([fsp.mkdir(bracketDir, { recursive: true })]) + await Promise.all([ + fsp.copyFile( + executorInputPath('router-template-slate.kcl'), + path.join(bracketDir, 'other.kcl') + ), + fsp.copyFile( + executorInputPath('focusrite_scarlett_mounting_braket.kcl'), + path.join(bracketDir, 'main.kcl') + ), + ]) }) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) page.on('console', console.log) @@ -62,6 +54,8 @@ test( const errorToastMessage = page.getByText(`Error while exporting`) const engineErrorToastMessage = page.getByText(`Nothing to export`) const alreadyExportingToastMessage = page.getByText(`Already exporting`) + // The open file's name is `main.kcl`, so the export file name should be `main.gltf` + const exportFileName = `main.gltf` // Click the export button await exportButton.click() @@ -91,12 +85,16 @@ test( await expect(successToastMessage).toBeVisible() await expect(exportingToastMessage).not.toBeVisible() + const firstFileFullPath = path.resolve( + getPlaywrightDownloadDir(page), + exportFileName + ) await test.step('Check the export size', async () => { await expect .poll( async () => { try { - const outputGltf = await fsp.readFile('output.gltf') + const outputGltf = await fsp.readFile(firstFileFullPath) return outputGltf.byteLength } catch (e) { return 0 @@ -105,9 +103,6 @@ test( { timeout: 15_000 } ) .toBeGreaterThan(300_000) - - // clean up output.gltf - await fsp.rm('output.gltf') }) }) @@ -138,6 +133,8 @@ test( const errorToastMessage = page.getByText(`Error while exporting`) const engineErrorToastMessage = page.getByText(`Nothing to export`) const alreadyExportingToastMessage = page.getByText(`Already exporting`) + // The open file's name is `other.kcl`, so the export file name should be `other.gltf` + const exportFileName = `other.gltf` // Click the export button await exportButton.click() @@ -166,12 +163,16 @@ test( expect(exportingToastMessage).not.toBeVisible(), ])) + const secondFileFullPath = path.resolve( + getPlaywrightDownloadDir(page), + exportFileName + ) await test.step('Check the export size', async () => { await expect .poll( async () => { try { - const outputGltf = await fsp.readFile('output.gltf') + const outputGltf = await fsp.readFile(secondFileFullPath) return outputGltf.byteLength } catch (e) { return 0 @@ -180,13 +181,7 @@ test( { timeout: 15_000 } ) .toBeGreaterThan(100_000) - - // clean up output.gltf - await fsp.rm('output.gltf') }) - await electronApp.close() }) - - await electronApp.close() } ) diff --git a/e2e/playwright/editor-tests.spec.ts b/e2e/playwright/editor-tests.spec.ts index b787118a5..7bfb41636 100644 --- a/e2e/playwright/editor-tests.spec.ts +++ b/e2e/playwright/editor-tests.spec.ts @@ -1,4 +1,4 @@ -import { test, expect } from '@playwright/test' +import { test, expect } from './zoo-test' import fsp from 'fs/promises' import { uuidv4 } from 'lib/utils' import { @@ -6,37 +6,27 @@ import { darkModePlaneColorXZ, executorInputPath, getUtils, - setup, - setupElectron, - tearDown, } from './test-utils' + import { join } from 'path' -test.beforeEach(async ({ context, page }, testInfo) => { - await setup(context, page, testInfo) -}) - -test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) - test.describe('Editor tests', () => { - test('can comment out code with ctrl+/', async ({ page }) => { + test('can comment out code with ctrl+/', async ({ page, homePage }) => { const u = await getUtils(page) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() // check no error to begin with await expect(page.locator('.cm-lint-marker-error')).not.toBeVisible() await u.codeLocator.click() await page.keyboard.type(`sketch001 = startSketchOn('XY') - |> startProfileAt([-10, -10], %) - |> line([20, 0], %) - |> line([0, 20], %) - |> line([-20, 0], %) - |> close(%)`) + |> startProfileAt([-10, -10], %) + |> line([20, 0], %) + |> line([0, 20], %) + |> line([-20, 0], %) + |> close(%)`) await page.keyboard.down('ControlOrMeta') await page.keyboard.press('/') @@ -44,11 +34,11 @@ test.describe('Editor tests', () => { await expect(page.locator('.cm-content')) .toHaveText(`sketch001 = startSketchOn('XY') - |> startProfileAt([-10, -10], %) - |> line([20, 0], %) - |> line([0, 20], %) - |> line([-20, 0], %) - // |> close(%)`) + |> startProfileAt([-10, -10], %) + |> line([20, 0], %) + |> line([0, 20], %) + |> line([-20, 0], %) + // |> close(%)`) // uncomment the code await page.keyboard.down('ControlOrMeta') @@ -57,23 +47,22 @@ test.describe('Editor tests', () => { await expect(page.locator('.cm-content')) .toHaveText(`sketch001 = startSketchOn('XY') - |> startProfileAt([-10, -10], %) - |> line([20, 0], %) - |> line([0, 20], %) - |> line([-20, 0], %) - |> close(%)`) + |> startProfileAt([-10, -10], %) + |> line([20, 0], %) + |> line([0, 20], %) + |> line([-20, 0], %) + |> close(%)`) }) - test('if you click the format button it formats your code', async ({ + test('ensure we use the cache, and do not re-execute', async ({ + homePage, page, }) => { const u = await getUtils(page) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() - - // check no error to begin with - await expect(page.locator('.cm-lint-marker-error')).not.toBeVisible() + await homePage.goToModelingScene() + await u.waitForPageLoad() await u.codeLocator.click() await page.keyboard.type(`sketch001 = startSketchOn('XY') @@ -82,36 +71,141 @@ test.describe('Editor tests', () => { |> line([0, 20], %) |> line([-20, 0], %) |> close(%)`) - await page.locator('#code-pane button:first-child').click() - await page.locator('button:has-text("Format code")').click() - await expect(page.locator('.cm-content')) - .toHaveText(`sketch001 = startSketchOn('XY') + // Ensure we execute the first time. + await u.openDebugPanel() + await expect( + page.locator('[data-receive-command-type="scene_clear_all"]') + ).toHaveCount(1) + await expect( + page.locator('[data-message-type="execution-done"]') + ).toHaveCount(2) + + // Add whitespace to the end of the code. + await u.codeLocator.click() + await page.keyboard.press('ArrowUp') + await page.keyboard.press('ArrowUp') + await page.keyboard.press('ArrowUp') + await page.keyboard.press('ArrowUp') + await page.keyboard.press('Home') + await page.keyboard.type(' ') + await page.keyboard.press('Enter') + await page.keyboard.type(' ') + + // Ensure we don't execute the second time. + await u.openDebugPanel() + // Make sure we didn't clear the scene. + await expect( + page.locator('[data-message-type="execution-done"]') + ).toHaveCount(3) + await expect( + page.locator('[data-receive-command-type="scene_clear_all"]') + ).toHaveCount(1) + }) + + test('ensure we use the cache, and do not clear on append', async ({ + homePage, + page, + }) => { + const u = await getUtils(page) + await page.setBodyDimensions({ width: 1000, height: 500 }) + + await homePage.goToModelingScene() + await u.waitForPageLoad() + + await u.codeLocator.click() + await page.keyboard.type(`sketch001 = startSketchOn('XY') + |> startProfileAt([-10, -10], %) + |> line([20, 0], %) + |> line([0, 20], %) + |> line([-20, 0], %) + |> close(%)`) + + // Ensure we execute the first time. + await u.openDebugPanel() + await expect( + page.locator('[data-receive-command-type="scene_clear_all"]') + ).toHaveCount(1) + await expect( + page.locator('[data-message-type="execution-done"]') + ).toHaveCount(2) + + // Add whitespace to the end of the code. + await u.codeLocator.click() + await page.keyboard.press('ArrowDown') + await page.keyboard.press('ArrowDown') + await page.keyboard.press('ArrowDown') + await page.keyboard.press('ArrowDown') + await page.keyboard.press('ArrowDown') + await page.keyboard.press('ArrowDown') + await page.keyboard.press('ArrowDown') + await page.keyboard.press('ArrowDown') + await page.keyboard.press('ArrowDown') + await page.keyboard.press('End') + await page.keyboard.press('Enter') + await page.keyboard.press('Enter') + await page.keyboard.type('const x = 1') + await page.keyboard.press('Enter') + + await u.openDebugPanel() + await expect( + page.locator('[data-message-type="execution-done"]') + ).toHaveCount(3) + await expect( + page.locator('[data-receive-command-type="scene_clear_all"]') + ).toHaveCount(1) + }) + + test('if you click the format button it formats your code', async ({ + page, + homePage, + }) => { + const u = await getUtils(page) + await page.setBodyDimensions({ width: 1000, height: 500 }) + + await homePage.goToModelingScene() + + // check no error to begin with + await expect(page.locator('.cm-lint-marker-error')).not.toBeVisible() + + await u.codeLocator.click() + await page.keyboard.type(`sketch001 = startSketchOn('XY') |> startProfileAt([-10, -10], %) |> line([20, 0], %) |> line([0, 20], %) |> line([-20, 0], %) |> close(%)`) + await page.locator('#code-pane button:first-child').click() + await page.locator('button:has-text("Format code")').click() + + await expect(page.locator('.cm-content')) + .toHaveText(`sketch001 = startSketchOn('XY') + |> startProfileAt([-10, -10], %) + |> line([20, 0], %) + |> line([0, 20], %) + |> line([-20, 0], %) + |> close(%)`) }) test('if you click the format button it formats your code and executes so lints are still there', async ({ page, + homePage, }) => { const u = await getUtils(page) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() // check no error to begin with await expect(page.locator('.cm-lint-marker-error')).not.toBeVisible() await u.codeLocator.click() await page.keyboard.type(`sketch_001 = startSketchOn('XY') - |> startProfileAt([-10, -10], %) - |> line([20, 0], %) - |> line([0, 20], %) - |> line([-20, 0], %) - |> close(%)`) + |> startProfileAt([-10, -10], %) + |> line([20, 0], %) + |> line([0, 20], %) + |> line([-20, 0], %) + |> close(%)`) await u.openDebugPanel() await u.expectCmdLog('[data-message-type="execution-done"]') @@ -135,11 +229,11 @@ test.describe('Editor tests', () => { await expect(page.locator('.cm-content')) .toHaveText(`sketch_001 = startSketchOn('XY') - |> startProfileAt([-10, -10], %) - |> line([20, 0], %) - |> line([0, 20], %) - |> line([-20, 0], %) - |> close(%)`) + |> startProfileAt([-10, -10], %) + |> line([20, 0], %) + |> line([0, 20], %) + |> line([-20, 0], %) + |> close(%)`) // error in guter await expect(page.locator('.cm-lint-marker-info').first()).toBeVisible() @@ -151,29 +245,27 @@ test.describe('Editor tests', () => { ).toBeVisible() }) - test('fold gutters work', async ({ page }) => { - const u = await getUtils(page) - + test('fold gutters work', async ({ page, homePage }) => { const fullCode = `sketch001 = startSketchOn('XY') - |> startProfileAt([-10, -10], %) - |> line([20, 0], %) - |> line([0, 20], %) - |> line([-20, 0], %) - |> close(%)` + |> startProfileAt([-10, -10], %) + |> line([20, 0], %) + |> line([0, 20], %) + |> line([-20, 0], %) + |> close(%)` await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `sketch001 = startSketchOn('XY') - |> startProfileAt([-10, -10], %) - |> line([20, 0], %) - |> line([0, 20], %) - |> line([-20, 0], %) - |> close(%)` + |> startProfileAt([-10, -10], %) + |> line([20, 0], %) + |> line([0, 20], %) + |> line([-20, 0], %) + |> close(%)` ) }) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() // TODO: Jess needs to fix this but you have to mod the code to get them to show // up, its an annoying codemirror thing. @@ -224,22 +316,25 @@ test.describe('Editor tests', () => { await expect(foldGutterFoldLine).not.toBeVisible() }) - test('hover over functions shows function description', async ({ page }) => { + test('hover over functions shows function description', async ({ + page, + homePage, + }) => { const u = await getUtils(page) await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `sketch001 = startSketchOn('XY') - |> startProfileAt([-10, -10], %) - |> line([20, 0], %) - |> line([0, 20], %) - |> line([-20, 0], %) - |> close(%)` + |> startProfileAt([-10, -10], %) + |> line([20, 0], %) + |> line([0, 20], %) + |> line([-20, 0], %) + |> close(%)` ) }) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() // check no error to begin with await expect(page.locator('.cm-lint-marker-error')).not.toBeVisible() @@ -268,23 +363,24 @@ test.describe('Editor tests', () => { test('if you use the format keyboard binding it formats your code', async ({ page, + homePage, }) => { const u = await getUtils(page) await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `sketch001 = startSketchOn('XY') - |> startProfileAt([-10, -10], %) - |> line([20, 0], %) - |> line([0, 20], %) - |> line([-20, 0], %) - |> close(%)` + |> startProfileAt([-10, -10], %) + |> line([20, 0], %) + |> line([0, 20], %) + |> line([-20, 0], %) + |> close(%)` ) localStorage.setItem('disableAxis', 'true') }) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() // check no error to begin with await expect(page.locator('.cm-lint-marker-error')).not.toBeVisible() @@ -301,32 +397,33 @@ test.describe('Editor tests', () => { await expect(page.locator('.cm-content')) .toHaveText(`sketch001 = startSketchOn('XY') - |> startProfileAt([-10, -10], %) - |> line([20, 0], %) - |> line([0, 20], %) - |> line([-20, 0], %) - |> close(%)`) + |> startProfileAt([-10, -10], %) + |> line([20, 0], %) + |> line([0, 20], %) + |> line([-20, 0], %) + |> close(%)`) }) test('if you use the format keyboard binding it formats your code and executes so lints are shown', async ({ page, + homePage, }) => { const u = await getUtils(page) await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `sketch_001 = startSketchOn('XY') - |> startProfileAt([-10, -10], %) - |> line([20, 0], %) - |> line([0, 20], %) - |> line([-20, 0], %) - |> close(%)` + |> startProfileAt([-10, -10], %) + |> line([20, 0], %) + |> line([0, 20], %) + |> line([-20, 0], %) + |> close(%)` ) localStorage.setItem('disableAxis', 'true') }) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await u.openDebugPanel() await u.expectCmdLog('[data-message-type="execution-done"]') @@ -353,11 +450,11 @@ test.describe('Editor tests', () => { await expect(page.locator('.cm-content')) .toHaveText(`sketch_001 = startSketchOn('XY') - |> startProfileAt([-10, -10], %) - |> line([20, 0], %) - |> line([0, 20], %) - |> line([-20, 0], %) - |> close(%)`) + |> startProfileAt([-10, -10], %) + |> line([20, 0], %) + |> line([0, 20], %) + |> line([-20, 0], %) + |> close(%)`) // error in guter await expect(page.locator('.cm-lint-marker-info').first()).toBeVisible() @@ -369,11 +466,14 @@ test.describe('Editor tests', () => { ).toBeVisible() }) - test('if you write kcl with lint errors you get lints', async ({ page }) => { + test('if you write kcl with lint errors you get lints', async ({ + page, + homePage, + }) => { const u = await getUtils(page) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() // check no error to begin with await expect(page.locator('.cm-lint-marker-info')).not.toBeVisible() @@ -409,23 +509,26 @@ test.describe('Editor tests', () => { await expect(page.locator('.cm-lint-marker-info')).not.toBeVisible() }) - test('if you fixup kcl errors you clear lints', async ({ page }) => { + test('if you fixup kcl errors you clear lints', async ({ + page, + homePage, + }) => { const u = await getUtils(page) await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `sketch001 = startSketchOn('XZ') - |> startProfileAt([3.29, 7.86], %) - |> line([2.48, 2.44], %) - |> line([2.66, 1.17], %) - |> close(%) - ` + |> startProfileAt([3.29, 7.86], %) + |> line([2.48, 2.44], %) + |> line([2.66, 1.17], %) + |> close(%) + ` ) }) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() // check no error to begin with await expect(page.locator('.cm-lint-marker-error')).not.toBeVisible() @@ -447,22 +550,27 @@ test.describe('Editor tests', () => { ).not.toBeVisible() }) - test('if you write invalid kcl you get inlined errors', async ({ page }) => { + test('if you write invalid kcl you get inlined errors', async ({ + page, + homePage, + }) => { const u = await getUtils(page) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() // check no error to begin with await expect(page.locator('.cm-lint-marker-error')).not.toBeVisible() - /* add the following code to the editor ($ error is not a valid line) - $ error - const topAng = 30 - const bottomAng = 25 - */ + /* add the following code to the editor (~ error is not a valid line) + * the old check here used $ but this is for tags so it changed meaning. + * hopefully ~ doesn't change meaning + ~ error + const topAng = 30 + const bottomAng = 25 + */ await u.codeLocator.click() - await page.keyboard.type('$ error') + await page.keyboard.type('~ error') // press arrows to clear autocomplete await page.keyboard.press('ArrowLeft') @@ -479,10 +587,12 @@ test.describe('Editor tests', () => { // error text on hover await page.hover('.cm-lint-marker-error') - await expect(page.getByText('Unexpected token: $').first()).toBeVisible() + await expect( + page.getByText("found unknown token '~'").first() + ).toBeVisible() // select the line that's causing the error and delete it - await page.getByText('$ error').click() + await page.getByText('~ error').click() await page.keyboard.press('End') await page.keyboard.down('Shift') await page.keyboard.press('Home') @@ -518,103 +628,108 @@ test.describe('Editor tests', () => { await expect(page.locator('.cm-lint-marker-error')).not.toBeVisible() }) - test('error with 2 source ranges gets 2 diagnostics', async ({ page }) => { - const u = await getUtils(page) - await page.addInitScript(async () => { - localStorage.setItem( - 'persistCode', - `length = .750 - width = 0.500 - height = 0.500 - dia = 4 + test.fixme( + 'error with 2 source ranges gets 2 diagnostics', + async ({ page, homePage }) => { + const u = await getUtils(page) + await page.addInitScript(async () => { + localStorage.setItem( + 'persistCode', + `length = .750 + width = 0.500 + height = 0.500 + dia = 4 + + fn squareHole = (l, w) => { + squareHoleSketch = startSketchOn('XY') + |> startProfileAt([-width / 2, -length / 2], %) + |> lineTo([width / 2, -length / 2], %) + |> lineTo([width / 2, length / 2], %) + |> lineTo([-width / 2, length / 2], %) + |> close(%) + return squareHoleSketch + } + ` + ) + }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - fn squareHole = (l, w) => { - squareHoleSketch = startSketchOn('XY') - |> startProfileAt([-width / 2, -length / 2], %) - |> lineTo([width / 2, -length / 2], %) - |> lineTo([width / 2, length / 2], %) - |> lineTo([-width / 2, length / 2], %) - |> close(%) - return squareHoleSketch - } - ` - ) - }) - await page.setViewportSize({ width: 1000, height: 500 }) + await homePage.goToModelingScene() + await u.waitForPageLoad() + await page.waitForTimeout(1000) - await u.waitForAuthSkipAppStart() + await u.openDebugPanel() + await u.expectCmdLog('[data-message-type="execution-done"]') + await u.closeDebugPanel() - await u.openDebugPanel() - await u.expectCmdLog('[data-message-type="execution-done"]') - await u.closeDebugPanel() + // check no error to begin with + await expect(page.locator('.cm-lint-marker-error')).not.toBeVisible() - // check no error to begin with - await expect(page.locator('.cm-lint-marker-error')).not.toBeVisible() + // Click on the bottom of the code editor to add a new line + await u.codeLocator.click() + await page.keyboard.press('ArrowDown') + await page.keyboard.press('ArrowDown') + await page.keyboard.press('ArrowDown') + await page.keyboard.press('ArrowDown') + await page.keyboard.press('ArrowDown') + await page.keyboard.press('ArrowDown') + await page.keyboard.press('ArrowDown') + await page.keyboard.press('ArrowDown') + await page.keyboard.press('ArrowDown') + await page.keyboard.press('ArrowDown') + await page.keyboard.press('ArrowDown') + await page.keyboard.press('ArrowDown') + await page.keyboard.press('ArrowDown') + await page.keyboard.press('Enter') + await page.keyboard.type(`extrusion = startSketchOn('XY') + |> circle({ center: [0, 0], radius: dia/2 }, %) + |> hole(squareHole(length, width, height), %) + |> extrude(height, %)`) - // Click on the bottom of the code editor to add a new line - await u.codeLocator.click() - await page.keyboard.press('ArrowDown') - await page.keyboard.press('ArrowDown') - await page.keyboard.press('ArrowDown') - await page.keyboard.press('ArrowDown') - await page.keyboard.press('ArrowDown') - await page.keyboard.press('ArrowDown') - await page.keyboard.press('ArrowDown') - await page.keyboard.press('ArrowDown') - await page.keyboard.press('ArrowDown') - await page.keyboard.press('ArrowDown') - await page.keyboard.press('ArrowDown') - await page.keyboard.press('ArrowDown') - await page.keyboard.press('ArrowDown') - await page.keyboard.press('Enter') - await page.keyboard.type(`extrusion = startSketchOn('XY') - |> circle({ center: [0, 0], radius: dia/2 }, %) - |> hole(squareHole(length, width, height), %) - |> extrude(height, %)`) + // error in gutter + await expect(page.locator('.cm-lint-marker-error').first()).toBeVisible() + await page.hover('.cm-lint-marker-error:first-child') + await expect( + page.getByText('Expected 2 arguments, got 3').first() + ).toBeVisible() - // error in gutter - await expect(page.locator('.cm-lint-marker-error').first()).toBeVisible() - await page.hover('.cm-lint-marker-error:first-child') - await expect( - page.getByText('Expected 2 arguments, got 3').first() - ).toBeVisible() - - // Make sure there are two diagnostics - await expect(page.locator('.cm-lint-marker-error')).toHaveCount(2) - }) + // Make sure there are two diagnostics + await expect(page.locator('.cm-lint-marker-error')).toHaveCount(2) + } + ) test('if your kcl gets an error from the engine it is inlined', async ({ + context, page, + homePage, }) => { - const u = await getUtils(page) - await page.addInitScript(async () => { + await context.addInitScript(async () => { localStorage.setItem( 'persistCode', `box = startSketchOn('XY') - |> startProfileAt([0, 0], %) - |> line([0, 10], %) - |> line([10, 0], %) - |> line([0, -10], %, $revolveAxis) - |> close(%) - |> extrude(10, %) - - sketch001 = startSketchOn(box, revolveAxis) - |> startProfileAt([5, 10], %) - |> line([0, -10], %) - |> line([2, 0], %) - |> line([0, -10], %) - |> close(%) - |> revolve({ - axis: revolveAxis, - angle: 90 - }, %) - ` + |> startProfileAt([0, 0], %) + |> line([0, 10], %) + |> line([10, 0], %) + |> line([0, -10], %, $revolveAxis) + |> close(%) + |> extrude(10, %) + + sketch001 = startSketchOn(box, revolveAxis) + |> startProfileAt([5, 10], %) + |> line([0, -10], %) + |> line([2, 0], %) + |> line([0, -10], %) + |> close(%) + |> revolve({ + axis: revolveAxis, + angle: 90 + }, %) + ` ) }) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await page.goto('/') - await u.waitForPageLoad() + await homePage.goToModelingScene() await expect(page.locator('.cm-lint-marker-error')).toBeVisible() @@ -625,23 +740,28 @@ test.describe('Editor tests', () => { await expect(page.getByText(searchText)).toBeVisible() }) test.describe('Autocomplete works', () => { - test('with enter/click to accept the completion', async ({ page }) => { + test('with enter/click to accept the completion', async ({ + page, + homePage, + }) => { const u = await getUtils(page) // const PUR = 400 / 37.5 //pixeltoUnitRatio - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() - // this test might be brittle as we add and remove functions - // but should also be easy to update. // tests clicking on an option, selection the first option // and arrowing down to an option await u.codeLocator.click() await page.keyboard.type('sketch001 = start') - // expect there to be six auto complete options - await expect(page.locator('.cm-completionLabel')).toHaveCount(8) + // expect there to be some auto complete options + // exact number depends on the KCL stdlib, so let's just check it's > 0 for now. + await expect(async () => { + const children = await page.locator('.cm-completionLabel').count() + expect(children).toBeGreaterThan(0) + }).toPass() // this makes sure we can accept a completion with click await page.getByText('startSketchOn').click() await page.keyboard.type("'XZ'") @@ -690,16 +810,19 @@ test.describe('Editor tests', () => { await expect(page.locator('.cm-content')) .toHaveText(`sketch001 = startSketchOn('XZ') - |> startProfileAt([3.14, 12], %) - |> xLine(5, %) // lin`) + |> startProfileAt([3.14, 12], %) + |> xLine(5, %) // lin`) + + // expect there to be no KCL errors + await expect(page.locator('.cm-lint-marker-error')).toHaveCount(0) }) - test('with tab to accept the completion', async ({ page }) => { + test('with tab to accept the completion', async ({ page, homePage }) => { const u = await getUtils(page) // const PUR = 400 / 37.5 //pixeltoUnitRatio - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() // this test might be brittle as we add and remove functions // but should also be easy to update. @@ -761,26 +884,30 @@ test.describe('Editor tests', () => { await expect(page.locator('.cm-content')) .toHaveText(`sketch001 = startSketchOn('XZ') - |> startProfileAt([3.14, 12], %) - |> xLine(5, %) // lin`) + |> startProfileAt([3.14, 12], %) + |> xLine(5, %) // lin`) }) }) - test('Can undo a click and point extrude with ctrl+z', async ({ page }) => { + test('Can undo a click and point extrude with ctrl+z', async ({ + page, + context, + homePage, + }) => { const u = await getUtils(page) - await page.addInitScript(async () => { + await context.addInitScript(async () => { localStorage.setItem( 'persistCode', `sketch001 = startSketchOn('XZ') - |> startProfileAt([4.61, -14.01], %) - |> line([12.73, -0.09], %) - |> tangentialArcTo([24.95, -5.38], %) - |> close(%)` + |> startProfileAt([4.61, -14.01], %) + |> line([12.73, -0.09], %) + |> tangentialArcTo([24.95, -5.38], %) + |> close(%)` ) }) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await expect( page.getByRole('button', { name: 'Start Sketch' }) ).not.toBeDisabled() @@ -833,29 +960,32 @@ test.describe('Editor tests', () => { await page.waitForTimeout(100) await expect(page.locator('.cm-content')) .toHaveText(`sketch001 = startSketchOn('XZ') - |> startProfileAt([4.61, -14.01], %) - |> line([12.73, -0.09], %) - |> tangentialArcTo([24.95, -5.38], %) - |> close(%)`) + |> startProfileAt([4.61, -14.01], %) + |> line([12.73, -0.09], %) + |> tangentialArcTo([24.95, -5.38], %) + |> close(%)`) }) - test('Can undo a sketch modification with ctrl+z', async ({ page }) => { + test('Can undo a sketch modification with ctrl+z', async ({ + page, + homePage, + }) => { const u = await getUtils(page) await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `sketch001 = startSketchOn('XZ') - |> startProfileAt([4.61, -10.01], %) - |> line([12.73, -0.09], %) - |> tangentialArcTo([24.95, -0.38], %) - |> close(%) - |> extrude(5, %)` + |> startProfileAt([4.61, -10.01], %) + |> line([12.73, -0.09], %) + |> tangentialArcTo([24.95, -0.38], %) + |> close(%) + |> extrude(5, %)` ) }) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await expect( page.getByRole('button', { name: 'Start Sketch' }) ).not.toBeDisabled() @@ -882,7 +1012,7 @@ test.describe('Editor tests', () => { }) await page.waitForTimeout(100) - const startPX = [665, 397] + const startPX = [1200 / 2, 500 / 2] const dragPX = 40 @@ -896,9 +1026,9 @@ test.describe('Editor tests', () => { await expect(page.getByTestId('segment-overlay')).toHaveCount(2) - // drag startProfieAt handle + // drag startProfileAt handle await page.dragAndDrop('#stream', '#stream', { - sourcePosition: { x: startPX[0], y: startPX[1] }, + sourcePosition: { x: startPX[0] + 68, y: startPX[1] + 147 }, targetPosition: { x: startPX[0] + dragPX, y: startPX[1] + dragPX }, }) await page.waitForTimeout(100) @@ -936,12 +1066,12 @@ test.describe('Editor tests', () => { // expect the code to have changed await expect(page.locator('.cm-content')) .toHaveText(`sketch001 = startSketchOn('XZ') - |> startProfileAt([7.12, -12.68], %) - |> line([15.39, -2.78], %) - |> tangentialArcTo([27.6, -3.05], %) - |> close(%) - |> extrude(5, %) -`) + |> startProfileAt([2.71, -2.71], %) + |> line([15.4, -2.78], %) + |> tangentialArcTo([27.6, -3.05], %) + |> close(%) + |> extrude(5, %) + `) // Hit undo await page.keyboard.down('Control') @@ -950,11 +1080,11 @@ test.describe('Editor tests', () => { await expect(page.locator('.cm-content')) .toHaveText(`sketch001 = startSketchOn('XZ') - |> startProfileAt([7.12, -12.68], %) - |> line([15.39, -2.78], %) - |> tangentialArcTo([24.95, -0.38], %) - |> close(%) - |> extrude(5, %)`) + |> startProfileAt([2.71, -2.71], %) + |> line([15.4, -2.78], %) + |> tangentialArcTo([24.95, -0.38], %) + |> close(%) + |> extrude(5, %)`) // Hit undo again. await page.keyboard.down('Control') @@ -963,12 +1093,12 @@ test.describe('Editor tests', () => { await expect(page.locator('.cm-content')) .toHaveText(`sketch001 = startSketchOn('XZ') - |> startProfileAt([7.12, -12.68], %) - |> line([12.73, -0.09], %) - |> tangentialArcTo([24.95, -0.38], %) - |> close(%) - |> extrude(5, %) -`) + |> startProfileAt([2.71, -2.71], %) + |> line([12.73, -0.09], %) + |> tangentialArcTo([24.95, -0.38], %) + |> close(%) + |> extrude(5, %) + `) // Hit undo again. await page.keyboard.down('Control') @@ -978,31 +1108,29 @@ test.describe('Editor tests', () => { await page.waitForTimeout(100) await expect(page.locator('.cm-content')) .toHaveText(`sketch001 = startSketchOn('XZ') - |> startProfileAt([4.61, -10.01], %) - |> line([12.73, -0.09], %) - |> tangentialArcTo([24.95, -0.38], %) - |> close(%) - |> extrude(5, %)`) + |> startProfileAt([4.61, -10.01], %) + |> line([12.73, -0.09], %) + |> tangentialArcTo([24.95, -0.38], %) + |> close(%) + |> extrude(5, %)`) }) - test( + test.fixme( `Can use the import stdlib function on a local OBJ file`, { tag: '@electron' }, - async ({ browserName }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - const bracketDir = join(dir, 'cube') - await fsp.mkdir(bracketDir, { recursive: true }) - await fsp.copyFile( - executorInputPath('cube.obj'), - join(bracketDir, 'cube.obj') - ) - await fsp.writeFile(join(bracketDir, 'main.kcl'), '') - }, + async ({ page, context }, testInfo) => { + await context.folderSetupFn(async (dir) => { + const bracketDir = join(dir, 'cube') + await fsp.mkdir(bracketDir, { recursive: true }) + await fsp.copyFile( + executorInputPath('cube.obj'), + join(bracketDir, 'cube.obj') + ) + await fsp.writeFile(join(bracketDir, 'main.kcl'), '') }) + const viewportSize = { width: 1200, height: 500 } - await page.setViewportSize(viewportSize) + await page.setBodyDimensions(viewportSize) // Locators and constants const u = await getUtils(page) @@ -1060,8 +1188,6 @@ test.describe('Editor tests', () => { }) .toBeGreaterThan(15) }) - - await electronApp.close() } ) }) diff --git a/e2e/playwright/feature-tree-pane.spec.ts b/e2e/playwright/feature-tree-pane.spec.ts new file mode 100644 index 000000000..04140aa5d --- /dev/null +++ b/e2e/playwright/feature-tree-pane.spec.ts @@ -0,0 +1,127 @@ +import { test, expect } from './zoo-test' +import * as fsp from 'fs/promises' +import { join } from 'path' + +const FEATURE_TREE_EXAMPLE_CODE = `export fn timesFive(x) { + return 5 * x +} +export fn triangle() { + return startSketchOn('XZ') + |> startProfileAt([0, 0], %) + |> xLine(10, %) + |> line([-10, -5], %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) +} + +length001 = timesFive(1) * 5 +sketch001 = startSketchOn('XZ') + |> startProfileAt([20, 10], %) + |> line([10, 10], %) + |> angledLine([-45, length001], %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) +revolve001 = revolve({ axis = "X" }, sketch001) +triangle() + |> extrude(30, %) +plane001 = offsetPlane('XY', 10) +sketch002 = startSketchOn(plane001) + |> startProfileAt([-20, 0], %) + |> line([5, -15], %) + |> xLine(-10, %) + |> lineTo([-40, 0], %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) +extrude001 = extrude(10, sketch002) +` + +test.describe('Feature Tree pane', () => { + test( + 'User can go to definition and go to function definition', + { tag: '@electron' }, + async ({ context, homePage, scene, editor, toolbar }) => { + await context.folderSetupFn(async (dir) => { + const bracketDir = join(dir, 'test-sample') + await fsp.mkdir(bracketDir, { recursive: true }) + await fsp.writeFile( + join(bracketDir, 'main.kcl'), + FEATURE_TREE_EXAMPLE_CODE, + 'utf-8' + ) + }) + + await test.step('setup test', async () => { + await homePage.expectState({ + projectCards: [ + { + title: 'test-sample', + fileCount: 1, + }, + ], + sortBy: 'last-modified-desc', + }) + await homePage.openProject('test-sample') + await scene.waitForExecutionDone() + await editor.closePane() + await toolbar.openFeatureTreePane() + }) + + async function testViewSource({ + operationName, + operationIndex, + expectedActiveLine, + }: { + operationName: string + operationIndex: number + expectedActiveLine: string + }) { + await test.step(`Go to definition of the ${operationName}`, async () => { + await toolbar.viewSourceOnOperation(operationName, operationIndex) + await editor.expectState({ + highlightedCode: '', + diagnostics: [], + activeLines: [expectedActiveLine], + }) + await expect( + editor.activeLine.first(), + `${operationName} code should be scrolled into view` + ).toBeVisible() + }) + } + + await testViewSource({ + operationName: 'Offset Plane', + operationIndex: 0, + expectedActiveLine: "plane001 = offsetPlane('XY', 10)", + }) + await testViewSource({ + operationName: 'Extrude', + operationIndex: 1, + expectedActiveLine: 'extrude001 = extrude(10, sketch002)', + }) + await testViewSource({ + operationName: 'Revolve', + operationIndex: 0, + expectedActiveLine: 'revolve001 = revolve({ axis = "X" }, sketch001)', + }) + await testViewSource({ + operationName: 'Triangle', + operationIndex: 0, + expectedActiveLine: 'triangle()', + }) + + await test.step('Go to definition on the triangle function', async () => { + await toolbar.goToDefinitionOnOperation('Triangle', 0) + await editor.expectState({ + highlightedCode: '', + diagnostics: [], + activeLines: ['export fn triangle() {'], + }) + await expect( + editor.activeLine.first(), + 'Triangle function definition should be scrolled into view' + ).toBeVisible() + }) + } + ) +}) diff --git a/e2e/playwright/file-tree.spec.ts b/e2e/playwright/file-tree.spec.ts index b9b75756a..dc5d7b8b0 100644 --- a/e2e/playwright/file-tree.spec.ts +++ b/e2e/playwright/file-tree.spec.ts @@ -1,45 +1,24 @@ -import { _test, _expect } from './playwright-deprecated' -import { test, expect } from './fixtures/fixtureSetup' +import { test, expect } from './zoo-test' import * as fsp from 'fs/promises' import * as fs from 'fs' -import { - executorInputPath, - getUtils, - setup, - setupElectron, - tearDown, -} from './test-utils' +import { createProject, executorInputPath, getUtils } from './test-utils' import { join } from 'path' import { FILE_EXT } from 'lib/constants' -_test.beforeEach(async ({ context, page }, testInfo) => { - await setup(context, page, testInfo) -}) - -_test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) - test.describe('integrations tests', () => { test( 'Creating a new file or switching file while in sketchMode should exit sketchMode', { tag: '@electron' }, - async ({ tronApp, homePage, scene, editor, toolbar }) => { - test.skip( - process.platform === 'win32', - 'windows times out will waiting for the execution indicator?' - ) - await tronApp.initialise({ - fixtures: { homePage, scene, editor, toolbar }, - folderSetupFn: async (dir) => { - const bracketDir = join(dir, 'test-sample') - await fsp.mkdir(bracketDir, { recursive: true }) - await fsp.copyFile( - executorInputPath('e2e-can-sketch-on-chamfer.kcl'), - join(bracketDir, 'main.kcl') - ) - }, + async ({ page, context, homePage, scene, editor, toolbar }) => { + await context.folderSetupFn(async (dir) => { + const bracketDir = join(dir, 'test-sample') + await fsp.mkdir(bracketDir, { recursive: true }) + await fsp.copyFile( + executorInputPath('e2e-can-sketch-on-chamfer.kcl'), + join(bracketDir, 'main.kcl') + ) }) + const [clickObj] = await scene.makeMouseHelpers(600, 300) await test.step('setup test', async () => { @@ -48,13 +27,11 @@ test.describe('integrations tests', () => { { title: 'test-sample', fileCount: 1, - folderCount: 1, }, ], sortBy: 'last-modified-desc', }) await homePage.openProject('test-sample') - // windows times out here, hence the skip above await scene.waitForExecutionDone() }) await test.step('enter sketch mode', async () => { @@ -70,10 +47,13 @@ test.describe('integrations tests', () => { await toolbar.editSketch() await expect(toolbar.exitSketchBtn).toBeVisible() }) + + const fileName = 'Untitled.kcl' await test.step('check sketch mode is exited when creating new file', async () => { await toolbar.fileTreeBtn.click() await toolbar.expectFileTreeState(['main.kcl']) - await toolbar.createFile({ wait: true }) + + await toolbar.createFile({ fileName, waitForToastToDisappear: true }) // check we're out of sketch mode await expect(toolbar.exitSketchBtn).not.toBeVisible() @@ -92,10 +72,10 @@ test.describe('integrations tests', () => { }) await toolbar.editSketch() await expect(toolbar.exitSketchBtn).toBeVisible() - await toolbar.expectFileTreeState(['main.kcl', 'Untitled.kcl']) + await toolbar.expectFileTreeState(['main.kcl', fileName]) }) await test.step('check sketch mode is exited when opening a different file', async () => { - await toolbar.openFile('untitled.kcl', { wait: false }) + await toolbar.openFile(fileName, { wait: false }) // check we're out of sketch mode await expect(toolbar.exitSketchBtn).not.toBeVisible() @@ -111,23 +91,18 @@ test.describe('when using the file tree to', () => { test( `rename ${fromFile} to ${toFile}, and doesn't crash on reload and settings load`, { tag: '@electron' }, - async ({ browser: _, tronApp }, testInfo) => { - await tronApp.initialise() + async ({ page }, testInfo) => { + // TODO: fix this test on windows after the electron migration + test.skip(process.platform === 'win32', 'Skip on windows') + const { panesOpen, pasteCodeInEditor, renameFile, editorTextMatches } = + await getUtils(page, test) - const { - panesOpen, - createAndSelectProject, - pasteCodeInEditor, - renameFile, - editorTextMatches, - } = await getUtils(tronApp.page, test) - - await tronApp.page.setViewportSize({ width: 1200, height: 500 }) - tronApp.page.on('console', console.log) + await page.setBodyDimensions({ width: 1200, height: 500 }) + page.on('console', console.log) await panesOpen(['files', 'code']) - await createAndSelectProject('project-000') + await createProject({ name: 'project-000', page }) // File the main.kcl with contents const kclCube = await fsp.readFile( @@ -137,146 +112,136 @@ test.describe('when using the file tree to', () => { await pasteCodeInEditor(kclCube) // TODO: We have a timeout of 1s between edits to write to disk. If you reload the page too quickly it won't write to disk. - await tronApp.page.waitForTimeout(2000) + await page.waitForTimeout(2000) await renameFile(fromFile, toFile) - await tronApp.page.reload() + await page.reload() await test.step('Postcondition: editor has same content as before the rename', async () => { await editorTextMatches(kclCube) }) await test.step('Postcondition: opening and closing settings works', async () => { - const settingsOpenButton = tronApp.page.getByRole('link', { + const settingsOpenButton = page.getByRole('link', { name: 'settings Settings', }) - const settingsCloseButton = tronApp.page.getByTestId( - 'settings-close-button' - ) + const settingsCloseButton = page.getByTestId('settings-close-button') await settingsOpenButton.click() await settingsCloseButton.click() }) - - await tronApp.close() } ) test( - `create many new untitled files they increment their names`, + `create many new files of the same name, incrementing their names`, { tag: '@electron' }, - async ({ browser: _, tronApp }, testInfo) => { - await tronApp.initialise() + async ({ page }, testInfo) => { + // TODO: fix this test on windows after the electron migration + test.skip(process.platform === 'win32', 'Skip on windows') + const { panesOpen, createNewFile } = await getUtils(page, test) - const { panesOpen, createAndSelectProject, createNewFile } = - await getUtils(tronApp.page, test) - - await tronApp.page.setViewportSize({ width: 1200, height: 500 }) - tronApp.page.on('console', console.log) + await page.setBodyDimensions({ width: 1200, height: 500 }) + page.on('console', console.log) await panesOpen(['files']) - await createAndSelectProject('project-000') + await createProject({ name: 'project-000', page }) - await createNewFile('') - await createNewFile('') - await createNewFile('') - await createNewFile('') - await createNewFile('') + await createNewFile('lee') + await createNewFile('lee') + await createNewFile('lee') + await createNewFile('lee') + await createNewFile('lee') - await test.step('Postcondition: there are 5 new Untitled-*.kcl files', async () => { + await test.step('Postcondition: there are 5 new lee-*.kcl files', async () => { await expect( - tronApp.page + page .locator('[data-testid="file-pane-scroll-container"] button') - .filter({ hasText: /Untitled[-]?[0-5]?/ }) + .filter({ hasText: /lee[-]?[0-5]?/ }) ).toHaveCount(5) }) - - await tronApp.close() } ) test( 'create a new file with the same name as an existing file cancels the operation', { tag: '@electron' }, - async ({ browser: _, tronApp }, testInfo) => { - await tronApp.initialise() + async ({ context, page, homePage, scene, editor, toolbar }, testInfo) => { + const projectName = 'cube' + const mainFile = 'main.kcl' + const secondFile = 'cylinder.kcl' + const kclCube = await fsp.readFile(executorInputPath('cube.kcl'), 'utf-8') + const kclCylinder = await fsp.readFile( + executorInputPath('cylinder.kcl'), + 'utf-8' + ) + + await context.folderSetupFn(async (dir) => { + const cubeDir = join(dir, projectName) + await fsp.mkdir(cubeDir, { recursive: true }) + await fsp.copyFile( + executorInputPath('cube.kcl'), + join(cubeDir, mainFile) + ) + await fsp.copyFile( + executorInputPath('cylinder.kcl'), + join(cubeDir, secondFile) + ) + }) const { - openKclCodePanel, openFilePanel, - createAndSelectProject, - pasteCodeInEditor, - createNewFileAndSelect, renameFile, selectFile, editorTextMatches, - } = await getUtils(tronApp.page, _test) + waitForPageLoad, + } = await getUtils(page, test) - await tronApp.page.setViewportSize({ width: 1200, height: 500 }) - tronApp.page.on('console', console.log) + await test.step(`Setup: Open project and navigate to ${secondFile}`, async () => { + await homePage.expectState({ + projectCards: [ + { + title: projectName, + fileCount: 2, + }, + ], + sortBy: 'last-modified-desc', + }) + await homePage.openProject(projectName) + await waitForPageLoad() + await openFilePanel() + await selectFile(secondFile) + }) - await createAndSelectProject('project-000') - await openKclCodePanel() - await openFilePanel() - // File the main.kcl with contents - const kclCube = await fsp.readFile( - 'src/wasm-lib/tests/executor/inputs/cube.kcl', - 'utf-8' - ) - await pasteCodeInEditor(kclCube) + await test.step(`Attempt to rename ${secondFile} to ${mainFile}`, async () => { + await renameFile(secondFile, mainFile) + }) - // TODO: We have a timeout of 1s between edits to write to disk. If you reload the page too quickly it won't write to disk. - await tronApp.page.waitForTimeout(2000) - - const kcl1 = 'main.kcl' - const kcl2 = '2.kcl' - await createNewFileAndSelect(kcl2) - const kclCylinder = await fsp.readFile( - 'src/wasm-lib/tests/executor/inputs/cylinder.kcl', - 'utf-8' - ) - await pasteCodeInEditor(kclCylinder) - - // TODO: We have a timeout of 1s between edits to write to disk. If you reload the page too quickly it won't write to disk. - await tronApp.page.waitForTimeout(2000) - - await renameFile(kcl2, kcl1) - - await test.step(`Postcondition: ${kcl1} still has the original content`, async () => { - await selectFile(kcl1) + await test.step(`Postcondition: ${mainFile} still has the original content`, async () => { + await selectFile(mainFile) await editorTextMatches(kclCube) }) - await tronApp.page.waitForTimeout(500) - await test.step(`Postcondition: ${kcl2} still exists with the original content`, async () => { - await selectFile(kcl2) + await test.step(`Postcondition: ${secondFile} still exists with the original content`, async () => { + await selectFile(secondFile) await editorTextMatches(kclCylinder) }) - - await tronApp?.close?.() } ) test( 'deleting all files recreates a default main.kcl with no code', { tag: '@electron' }, - async ({ browser: _, tronApp }, testInfo) => { - await tronApp.initialise() + async ({ page }, testInfo) => { + const { panesOpen, pasteCodeInEditor, deleteFile, editorTextMatches } = + await getUtils(page, test) - const { - panesOpen, - createAndSelectProject, - pasteCodeInEditor, - deleteFile, - editorTextMatches, - } = await getUtils(tronApp.page, _test) - - await tronApp.page.setViewportSize({ width: 1200, height: 500 }) - tronApp.page.on('console', console.log) + await page.setBodyDimensions({ width: 1200, height: 500 }) + page.on('console', console.log) await panesOpen(['files', 'code']) - await createAndSelectProject('project-000') + await createProject({ name: 'project-000', page }) // File the main.kcl with contents const kclCube = await fsp.readFile( 'src/wasm-lib/tests/executor/inputs/cube.kcl', @@ -284,41 +249,36 @@ test.describe('when using the file tree to', () => { ) await pasteCodeInEditor(kclCube) - const kcl1 = 'main.kcl' + const mainFile = 'main.kcl' - await deleteFile(kcl1) + await deleteFile(mainFile) - await test.step(`Postcondition: ${kcl1} is recreated but has no content`, async () => { + await test.step(`Postcondition: ${mainFile} is recreated but has no content`, async () => { await editorTextMatches('') }) - - await tronApp.close() } ) - test( + test.fixme( 'loading small file, then large, then back to small', { tag: '@electron', }, - async ({ browser: _, tronApp }, testInfo) => { - await tronApp.initialise() - + async ({ page }, testInfo) => { const { panesOpen, - createAndSelectProject, pasteCodeInEditor, createNewFile, openDebugPanel, closeDebugPanel, expectCmdLog, - } = await getUtils(tronApp.page, test) + } = await getUtils(page, test) - await tronApp.page.setViewportSize({ width: 1200, height: 500 }) - tronApp.page.on('console', console.log) + await page.setViewportSize({ width: 1200, height: 500 }) + page.on('console', console.log) await panesOpen(['files', 'code']) - await createAndSelectProject('project-000') + await createProject({ name: 'project-000', page }) // Create a small file const kclCube = await fsp.readFile( @@ -330,30 +290,30 @@ test.describe('when using the file tree to', () => { // Create a large lego file await createNewFile('lego') - const legoFile = tronApp.page.getByRole('listitem').filter({ - has: tronApp.page.getByRole('button', { name: 'lego.kcl' }), + const legoFile = page.getByRole('listitem').filter({ + has: page.getByRole('button', { name: 'lego.kcl' }), }) - await _expect(legoFile).toBeVisible({ timeout: 60_000 }) + await expect(legoFile).toBeVisible({ timeout: 60_000 }) await legoFile.click() const kclLego = await fsp.readFile( 'src/wasm-lib/tests/executor/inputs/lego.kcl', 'utf-8' ) await pasteCodeInEditor(kclLego) - const mainFile = tronApp.page.getByRole('listitem').filter({ - has: tronApp.page.getByRole('button', { name: 'main.kcl' }), + const mainFile = page.getByRole('listitem').filter({ + has: page.getByRole('button', { name: 'main.kcl' }), }) // Open settings and enable the debug panel - await tronApp.page + await page .getByRole('link', { name: 'settings Settings', }) .click() - await tronApp.page.locator('#showDebugPanel').getByText('OffOn').click() - await tronApp.page.getByTestId('settings-close-button').click() + await page.locator('#showDebugPanel').getByText('OffOn').click() + await page.getByTestId('settings-close-button').click() - await _test.step('swap between small and large files', async () => { + await test.step('swap between small and large files', async () => { await openDebugPanel() // Previously created a file so we need to start back at main.kcl await mainFile.click() @@ -365,30 +325,25 @@ test.describe('when using the file tree to', () => { await expectCmdLog('[data-message-type="execution-done"]', 60_000) await closeDebugPanel() }) - - await tronApp.close() } ) }) -_test.describe('Renaming in the file tree', () => { - _test( +test.describe('Renaming in the file tree', () => { + test( 'A file you have open', { tag: '@electron' }, - async ({ browser: _ }, testInfo) => { - const { electronApp, page, dir } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - await fsp.mkdir(join(dir, 'Test Project'), { recursive: true }) - await fsp.copyFile( - executorInputPath('basic_fillet_cube_end.kcl'), - join(dir, 'Test Project', 'main.kcl') - ) - await fsp.copyFile( - executorInputPath('cylinder.kcl'), - join(dir, 'Test Project', 'fileToRename.kcl') - ) - }, + async ({ context, page }, testInfo) => { + const { dir } = await context.folderSetupFn(async (dir) => { + await fsp.mkdir(join(dir, 'Test Project'), { recursive: true }) + await fsp.copyFile( + executorInputPath('basic_fillet_cube_end.kcl'), + join(dir, 'Test Project', 'main.kcl') + ) + await fsp.copyFile( + executorInputPath('cylinder.kcl'), + join(dir, 'Test Project', 'fileToRename.kcl') + ) }) const u = await getUtils(page) await page.setViewportSize({ width: 1200, height: 500 }) @@ -417,72 +372,67 @@ _test.describe('Renaming in the file tree', () => { const renameInput = page.getByPlaceholder('fileToRename.kcl') const codeLocator = page.locator('.cm-content') - await _test.step('Open project and file pane', async () => { - await _expect(projectLink).toBeVisible() + await test.step('Open project and file pane', async () => { + await expect(projectLink).toBeVisible() await projectLink.click() - await _expect(projectMenuButton).toBeVisible() - await _expect(projectMenuButton).toContainText('main.kcl') + await expect(projectMenuButton).toBeVisible() + await expect(projectMenuButton).toContainText('main.kcl') await u.openFilePanel() - await _expect(fileToRename).toBeVisible() - _expect(checkUnRenamedFS()).toBeTruthy() - _expect(checkRenamedFS()).toBeFalsy() + await expect(fileToRename).toBeVisible() + expect(checkUnRenamedFS()).toBeTruthy() + expect(checkRenamedFS()).toBeFalsy() await fileToRename.click() - await _expect(projectMenuButton).toContainText('fileToRename.kcl') + await expect(projectMenuButton).toContainText('fileToRename.kcl') await u.openKclCodePanel() - await _expect(codeLocator).toContainText('circle(') + await expect(codeLocator).toContainText('circle(') await u.closeKclCodePanel() }) - await _test.step('Rename the file', async () => { + await test.step('Rename the file', async () => { await fileToRename.click({ button: 'right' }) await renameMenuItem.click() - await _expect(renameInput).toBeVisible() + await expect(renameInput).toBeVisible() await renameInput.fill(newFileName) await page.keyboard.press('Enter') }) - await _test.step('Verify the file is renamed', async () => { - await _expect(fileToRename).not.toBeAttached() - await _expect(renamedFile).toBeVisible() - _expect(checkUnRenamedFS()).toBeFalsy() - _expect(checkRenamedFS()).toBeTruthy() + await test.step('Verify the file is renamed', async () => { + await expect(fileToRename).not.toBeAttached() + await expect(renamedFile).toBeVisible() + expect(checkUnRenamedFS()).toBeFalsy() + expect(checkRenamedFS()).toBeTruthy() }) - await _test.step('Verify we navigated', async () => { - await _expect(projectMenuButton).toContainText(newFileName + FILE_EXT) + await test.step('Verify we navigated', async () => { + await expect(projectMenuButton).toContainText(newFileName + FILE_EXT) const url = page.url() - _expect(url).toContain(newFileName) - await _expect(projectMenuButton).not.toContainText('fileToRename.kcl') - await _expect(projectMenuButton).not.toContainText('main.kcl') - _expect(url).not.toContain('fileToRename.kcl') - _expect(url).not.toContain('main.kcl') + expect(url).toContain(newFileName) + await expect(projectMenuButton).not.toContainText('fileToRename.kcl') + await expect(projectMenuButton).not.toContainText('main.kcl') + expect(url).not.toContain('fileToRename.kcl') + expect(url).not.toContain('main.kcl') await u.openKclCodePanel() - await _expect(codeLocator).toContainText('circle(') + await expect(codeLocator).toContainText('circle(') }) - - await electronApp.close() } ) - _test( + test( 'A file you do not have open', { tag: '@electron' }, - async ({ browser: _ }, testInfo) => { - const { electronApp, page, dir } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - await fsp.mkdir(join(dir, 'Test Project'), { recursive: true }) - await fsp.copyFile( - executorInputPath('basic_fillet_cube_end.kcl'), - join(dir, 'Test Project', 'main.kcl') - ) - await fsp.copyFile( - executorInputPath('cylinder.kcl'), - join(dir, 'Test Project', 'fileToRename.kcl') - ) - }, + async ({ context, page }, testInfo) => { + const { dir } = await context.folderSetupFn(async (dir) => { + await fsp.mkdir(join(dir, 'Test Project'), { recursive: true }) + await fsp.copyFile( + executorInputPath('basic_fillet_cube_end.kcl'), + join(dir, 'Test Project', 'main.kcl') + ) + await fsp.copyFile( + executorInputPath('cylinder.kcl'), + join(dir, 'Test Project', 'fileToRename.kcl') + ) }) const u = await getUtils(page) await page.setViewportSize({ width: 1200, height: 500 }) @@ -510,73 +460,68 @@ _test.describe('Renaming in the file tree', () => { const renameInput = page.getByPlaceholder('fileToRename.kcl') const codeLocator = page.locator('.cm-content') - await _test.step('Open project and file pane', async () => { - await _expect(projectLink).toBeVisible() + await test.step('Open project and file pane', async () => { + await expect(projectLink).toBeVisible() await projectLink.click() - await _expect(projectMenuButton).toBeVisible() - await _expect(projectMenuButton).toContainText('main.kcl') + await expect(projectMenuButton).toBeVisible() + await expect(projectMenuButton).toContainText('main.kcl') await u.openFilePanel() - await _expect(fileToRename).toBeVisible() - _expect(checkUnRenamedFS()).toBeTruthy() - _expect(checkRenamedFS()).toBeFalsy() + await expect(fileToRename).toBeVisible() + expect(checkUnRenamedFS()).toBeTruthy() + expect(checkRenamedFS()).toBeFalsy() }) - await _test.step('Rename the file', async () => { + await test.step('Rename the file', async () => { await fileToRename.click({ button: 'right' }) await renameMenuItem.click() - await _expect(renameInput).toBeVisible() + await expect(renameInput).toBeVisible() await renameInput.fill(newFileName) await page.keyboard.press('Enter') }) - await _test.step('Verify the file is renamed', async () => { - await _expect(fileToRename).not.toBeAttached() - await _expect(renamedFile).toBeVisible() - _expect(checkUnRenamedFS()).toBeFalsy() - _expect(checkRenamedFS()).toBeTruthy() + await test.step('Verify the file is renamed', async () => { + await expect(fileToRename).not.toBeAttached() + await expect(renamedFile).toBeVisible() + expect(checkUnRenamedFS()).toBeFalsy() + expect(checkRenamedFS()).toBeTruthy() }) - await _test.step('Verify we have not navigated', async () => { - await _expect(projectMenuButton).toContainText('main.kcl') - await _expect(projectMenuButton).not.toContainText( + await test.step('Verify we have not navigated', async () => { + await expect(projectMenuButton).toContainText('main.kcl') + await expect(projectMenuButton).not.toContainText( newFileName + FILE_EXT ) - await _expect(projectMenuButton).not.toContainText('fileToRename.kcl') + await expect(projectMenuButton).not.toContainText('fileToRename.kcl') const url = page.url() - _expect(url).toContain('main.kcl') - _expect(url).not.toContain(newFileName) - _expect(url).not.toContain('fileToRename.kcl') + expect(url).toContain('main.kcl') + expect(url).not.toContain(newFileName) + expect(url).not.toContain('fileToRename.kcl') await u.openKclCodePanel() - await _expect(codeLocator).toContainText('fillet(') + await expect(codeLocator).toContainText('fillet(') }) - - await electronApp.close() } ) - _test( + test( `A folder you're not inside`, { tag: '@electron' }, - async ({ browser: _ }, testInfo) => { - const { electronApp, page, dir } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - await fsp.mkdir(join(dir, 'Test Project'), { recursive: true }) - await fsp.mkdir(join(dir, 'Test Project', 'folderToRename'), { - recursive: true, - }) - await fsp.copyFile( - executorInputPath('basic_fillet_cube_end.kcl'), - join(dir, 'Test Project', 'main.kcl') - ) - await fsp.copyFile( - executorInputPath('cylinder.kcl'), - join(dir, 'Test Project', 'folderToRename', 'someFileWithin.kcl') - ) - }, + async ({ context, page }, testInfo) => { + const { dir } = await context.folderSetupFn(async (dir) => { + await fsp.mkdir(join(dir, 'Test Project'), { recursive: true }) + await fsp.mkdir(join(dir, 'Test Project', 'folderToRename'), { + recursive: true, + }) + await fsp.copyFile( + executorInputPath('basic_fillet_cube_end.kcl'), + join(dir, 'Test Project', 'main.kcl') + ) + await fsp.copyFile( + executorInputPath('cylinder.kcl'), + join(dir, 'Test Project', 'folderToRename', 'someFileWithin.kcl') + ) }) const u = await getUtils(page) @@ -603,70 +548,62 @@ _test.describe('Renaming in the file tree', () => { return fs.existsSync(folderPath) } - await _test.step('Open project and file pane', async () => { - await _expect(projectLink).toBeVisible() + await test.step('Open project and file pane', async () => { + await expect(projectLink).toBeVisible() await projectLink.click() - await _expect(projectMenuButton).toBeVisible() - await _expect(projectMenuButton).toContainText('main.kcl') + await expect(projectMenuButton).toBeVisible() + await expect(projectMenuButton).toContainText('main.kcl') const url = page.url() - _expect(url).toContain('main.kcl') - _expect(url).not.toContain('folderToRename') + expect(url).toContain('main.kcl') + expect(url).not.toContain('folderToRename') await u.openFilePanel() - await _expect(folderToRename).toBeVisible() - _expect(checkUnRenamedFolderFS()).toBeTruthy() - _expect(checkRenamedFolderFS()).toBeFalsy() + await expect(folderToRename).toBeVisible() + expect(checkUnRenamedFolderFS()).toBeTruthy() + expect(checkRenamedFolderFS()).toBeFalsy() }) - await _test.step('Rename the folder', async () => { + await test.step('Rename the folder', async () => { await folderToRename.click({ button: 'right' }) - await _expect(renameMenuItem).toBeVisible() + await expect(renameMenuItem).toBeVisible() await renameMenuItem.click() - await _expect(renameInput).toBeVisible() + await expect(renameInput).toBeVisible() await renameInput.fill(newFolderName) await page.keyboard.press('Enter') }) - await _test.step( - 'Verify the folder is renamed, and no navigation occurred', - async () => { - const url = page.url() - _expect(url).toContain('main.kcl') - _expect(url).not.toContain('folderToRename') + await test.step('Verify the folder is renamed, and no navigation occurred', async () => { + const url = page.url() + expect(url).toContain('main.kcl') + expect(url).not.toContain('folderToRename') - await _expect(projectMenuButton).toContainText('main.kcl') - await _expect(renamedFolder).toBeVisible() - await _expect(folderToRename).not.toBeAttached() - _expect(checkUnRenamedFolderFS()).toBeFalsy() - _expect(checkRenamedFolderFS()).toBeTruthy() - } - ) - - await electronApp.close() + await expect(projectMenuButton).toContainText('main.kcl') + await expect(renamedFolder).toBeVisible() + await expect(folderToRename).not.toBeAttached() + expect(checkUnRenamedFolderFS()).toBeFalsy() + expect(checkRenamedFolderFS()).toBeTruthy() + }) } ) - _test( + test( `A folder you are inside`, { tag: '@electron' }, - async ({ browser: _ }, testInfo) => { - const { electronApp, page, dir } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - await fsp.mkdir(join(dir, 'Test Project'), { recursive: true }) - await fsp.mkdir(join(dir, 'Test Project', 'folderToRename'), { - recursive: true, - }) - await fsp.copyFile( - executorInputPath('basic_fillet_cube_end.kcl'), - join(dir, 'Test Project', 'main.kcl') - ) - await fsp.copyFile( - executorInputPath('cylinder.kcl'), - join(dir, 'Test Project', 'folderToRename', 'someFileWithin.kcl') - ) - }, + async ({ page, context }, testInfo) => { + const { dir } = await context.folderSetupFn(async (dir) => { + await fsp.mkdir(join(dir, 'Test Project'), { recursive: true }) + await fsp.mkdir(join(dir, 'Test Project', 'folderToRename'), { + recursive: true, + }) + await fsp.copyFile( + executorInputPath('basic_fillet_cube_end.kcl'), + join(dir, 'Test Project', 'main.kcl') + ) + await fsp.copyFile( + executorInputPath('cylinder.kcl'), + join(dir, 'Test Project', 'folderToRename', 'someFileWithin.kcl') + ) }) const u = await getUtils(page) @@ -696,86 +633,78 @@ _test.describe('Renaming in the file tree', () => { return fs.existsSync(folderPath) } - await _test.step('Open project and navigate into folder', async () => { - await _expect(projectLink).toBeVisible() + await test.step('Open project and navigate into folder', async () => { + await expect(projectLink).toBeVisible() await projectLink.click() - await _expect(projectMenuButton).toBeVisible() - await _expect(projectMenuButton).toContainText('main.kcl') + await expect(projectMenuButton).toBeVisible() + await expect(projectMenuButton).toContainText('main.kcl') const url = page.url() - _expect(url).toContain('main.kcl') - _expect(url).not.toContain('folderToRename') + expect(url).toContain('main.kcl') + expect(url).not.toContain('folderToRename') await u.openFilePanel() - await _expect(folderToRename).toBeVisible() + await expect(folderToRename).toBeVisible() await folderToRename.click() - await _expect(fileWithinFolder).toBeVisible() + await expect(fileWithinFolder).toBeVisible() await fileWithinFolder.click() - await _expect(projectMenuButton).toContainText('someFileWithin.kcl') + await expect(projectMenuButton).toContainText('someFileWithin.kcl') const newUrl = page.url() - _expect(newUrl).toContain('folderToRename') - _expect(newUrl).toContain('someFileWithin.kcl') - _expect(newUrl).not.toContain('main.kcl') - _expect(checkUnRenamedFolderFS()).toBeTruthy() - _expect(checkRenamedFolderFS()).toBeFalsy() + expect(newUrl).toContain('folderToRename') + expect(newUrl).toContain('someFileWithin.kcl') + expect(newUrl).not.toContain('main.kcl') + expect(checkUnRenamedFolderFS()).toBeTruthy() + expect(checkRenamedFolderFS()).toBeFalsy() }) - await _test.step('Rename the folder', async () => { - await page.waitForTimeout(60000) + await test.step('Rename the folder', async () => { + await page.waitForTimeout(1000) await folderToRename.click({ button: 'right' }) - await _expect(renameMenuItem).toBeVisible() + await expect(renameMenuItem).toBeVisible() await renameMenuItem.click() - await _expect(renameInput).toBeVisible() + await expect(renameInput).toBeVisible() await renameInput.fill(newFolderName) await page.keyboard.press('Enter') }) - await _test.step( - 'Verify the folder is renamed, and navigated to new path', - async () => { - const urlSnippet = encodeURIComponent( - join(newFolderName, 'someFileWithin.kcl') - ) - await page.waitForURL(new RegExp(urlSnippet)) - await _expect(projectMenuButton).toContainText('someFileWithin.kcl') - await _expect(renamedFolder).toBeVisible() - await _expect(folderToRename).not.toBeAttached() + await test.step('Verify the folder is renamed, and navigated to new path', async () => { + const urlSnippet = encodeURIComponent( + join(newFolderName, 'someFileWithin.kcl') + ) + await page.waitForURL(new RegExp(urlSnippet)) + await expect(projectMenuButton).toContainText('someFileWithin.kcl') + await expect(renamedFolder).toBeVisible() + await expect(folderToRename).not.toBeAttached() - // URL is synchronous, so we check the other stuff first - const url = page.url() - _expect(url).not.toContain('main.kcl') - _expect(url).toContain(newFolderName) - _expect(url).toContain('someFileWithin.kcl') - _expect(checkUnRenamedFolderFS()).toBeFalsy() - _expect(checkRenamedFolderFS()).toBeTruthy() - } - ) - - await electronApp.close() + // URL is synchronous, so we check the other stuff first + const url = page.url() + expect(url).not.toContain('main.kcl') + expect(url).toContain(newFolderName) + expect(url).toContain('someFileWithin.kcl') + expect(checkUnRenamedFolderFS()).toBeFalsy() + expect(checkRenamedFolderFS()).toBeTruthy() + }) } ) }) -_test.describe('Deleting items from the file pane', () => { - _test( +test.describe('Deleting items from the file pane', () => { + test( `delete file when main.kcl exists, navigate to main.kcl`, { tag: '@electron' }, - async ({ browserName }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - const testDir = join(dir, 'testProject') - await fsp.mkdir(testDir, { recursive: true }) - await fsp.copyFile( - executorInputPath('cylinder.kcl'), - join(testDir, 'main.kcl') - ) - await fsp.copyFile( - executorInputPath('basic_fillet_cube_end.kcl'), - join(testDir, 'fileToDelete.kcl') - ) - }, + async ({ page, context }, testInfo) => { + await context.folderSetupFn(async (dir) => { + const testDir = join(dir, 'testProject') + await fsp.mkdir(testDir, { recursive: true }) + await fsp.copyFile( + executorInputPath('cylinder.kcl'), + join(testDir, 'main.kcl') + ) + await fsp.copyFile( + executorInputPath('basic_fillet_cube_end.kcl'), + join(testDir, 'fileToDelete.kcl') + ) }) const u = await getUtils(page) await page.setViewportSize({ width: 1200, height: 500 }) @@ -790,67 +719,59 @@ _test.describe('Deleting items from the file pane', () => { const deleteMenuItem = page.getByRole('button', { name: 'Delete' }) const deleteConfirmation = page.getByTestId('delete-confirmation') - await _test.step( - 'Open project and navigate to fileToDelete.kcl', - async () => { - await projectCard.click() - await u.waitForPageLoad() - await u.openFilePanel() + await test.step('Open project and navigate to fileToDelete.kcl', async () => { + await projectCard.click() + await u.waitForPageLoad() + await u.openFilePanel() - await fileToDelete.click() - await u.waitForPageLoad() - await u.openKclCodePanel() - await _expect(u.codeLocator).toContainText('getOppositeEdge(thing)') - await u.closeKclCodePanel() - } - ) + await fileToDelete.click() + await u.waitForPageLoad() + await u.openKclCodePanel() + await expect(u.codeLocator).toContainText('getOppositeEdge(thing)') + await u.closeKclCodePanel() + }) - await _test.step('Delete fileToDelete.kcl', async () => { + await test.step('Delete fileToDelete.kcl', async () => { await fileToDelete.click({ button: 'right' }) - await _expect(deleteMenuItem).toBeVisible() + await expect(deleteMenuItem).toBeVisible() await deleteMenuItem.click() - await _expect(deleteConfirmation).toBeVisible() + await expect(deleteConfirmation).toBeVisible() await deleteConfirmation.click() }) - await _test.step('Check deletion and navigation', async () => { + await test.step('Check deletion and navigation', async () => { await u.waitForPageLoad() - await _expect(fileToDelete).not.toBeVisible() + await expect(fileToDelete).not.toBeVisible() await u.closeFilePanel() await u.openKclCodePanel() - await _expect(u.codeLocator).toContainText('circle(') - await _expect(projectMenuButton).toContainText('main.kcl') + await expect(u.codeLocator).toContainText('circle(') + await expect(projectMenuButton).toContainText('main.kcl') }) - - await electronApp.close() } ) - _test.fixme( + test.fixme( 'TODO - delete file we have open when main.kcl does not exist', async () => {} ) - _test( + test( `Delete folder we are not in, don't navigate`, { tag: '@electron' }, - async ({ browserName }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - await fsp.mkdir(join(dir, 'Test Project'), { recursive: true }) - await fsp.mkdir(join(dir, 'Test Project', 'folderToDelete'), { - recursive: true, - }) - await fsp.copyFile( - executorInputPath('basic_fillet_cube_end.kcl'), - join(dir, 'Test Project', 'main.kcl') - ) - await fsp.copyFile( - executorInputPath('cylinder.kcl'), - join(dir, 'Test Project', 'folderToDelete', 'someFileWithin.kcl') - ) - }, + async ({ context, page }, testInfo) => { + await context.folderSetupFn(async (dir) => { + await fsp.mkdir(join(dir, 'Test Project'), { recursive: true }) + await fsp.mkdir(join(dir, 'Test Project', 'folderToDelete'), { + recursive: true, + }) + await fsp.copyFile( + executorInputPath('basic_fillet_cube_end.kcl'), + join(dir, 'Test Project', 'main.kcl') + ) + await fsp.copyFile( + executorInputPath('cylinder.kcl'), + join(dir, 'Test Project', 'folderToDelete', 'someFileWithin.kcl') + ) }) const u = await getUtils(page) await page.setViewportSize({ width: 1200, height: 500 }) @@ -865,51 +786,46 @@ _test.describe('Deleting items from the file pane', () => { const deleteMenuItem = page.getByRole('button', { name: 'Delete' }) const deleteConfirmation = page.getByTestId('delete-confirmation') - await _test.step('Open project and open project pane', async () => { + await test.step('Open project and open project pane', async () => { await projectCard.click() await u.waitForPageLoad() - await _expect(projectMenuButton).toContainText('main.kcl') + await expect(projectMenuButton).toContainText('main.kcl') await u.closeKclCodePanel() await u.openFilePanel() }) - await _test.step('Delete folderToDelete', async () => { + await test.step('Delete folderToDelete', async () => { await folderToDelete.click({ button: 'right' }) - await _expect(deleteMenuItem).toBeVisible() + await expect(deleteMenuItem).toBeVisible() await deleteMenuItem.click() - await _expect(deleteConfirmation).toBeVisible() + await expect(deleteConfirmation).toBeVisible() await deleteConfirmation.click() }) - await _test.step('Check deletion and no navigation', async () => { - await _expect(folderToDelete).not.toBeAttached() - await _expect(projectMenuButton).toContainText('main.kcl') + await test.step('Check deletion and no navigation', async () => { + await expect(folderToDelete).not.toBeAttached() + await expect(projectMenuButton).toContainText('main.kcl') }) - - await electronApp.close() } ) - _test( + test( `Delete folder we are in, navigate to main.kcl`, { tag: '@electron' }, - async ({ browserName }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - await fsp.mkdir(join(dir, 'Test Project'), { recursive: true }) - await fsp.mkdir(join(dir, 'Test Project', 'folderToDelete'), { - recursive: true, - }) - await fsp.copyFile( - executorInputPath('basic_fillet_cube_end.kcl'), - join(dir, 'Test Project', 'main.kcl') - ) - await fsp.copyFile( - executorInputPath('cylinder.kcl'), - join(dir, 'Test Project', 'folderToDelete', 'someFileWithin.kcl') - ) - }, + async ({ context, page }, testInfo) => { + await context.folderSetupFn(async (dir) => { + await fsp.mkdir(join(dir, 'Test Project'), { recursive: true }) + await fsp.mkdir(join(dir, 'Test Project', 'folderToDelete'), { + recursive: true, + }) + await fsp.copyFile( + executorInputPath('basic_fillet_cube_end.kcl'), + join(dir, 'Test Project', 'main.kcl') + ) + await fsp.copyFile( + executorInputPath('cylinder.kcl'), + join(dir, 'Test Project', 'folderToDelete', 'someFileWithin.kcl') + ) }) const u = await getUtils(page) await page.setViewportSize({ width: 1200, height: 500 }) @@ -927,61 +843,45 @@ _test.describe('Deleting items from the file pane', () => { const deleteMenuItem = page.getByRole('button', { name: 'Delete' }) const deleteConfirmation = page.getByTestId('delete-confirmation') - await _test.step( - 'Open project and navigate into folderToDelete', - async () => { - await projectCard.click() - await u.waitForPageLoad() - await _expect(projectMenuButton).toContainText('main.kcl') - await u.closeKclCodePanel() - await u.openFilePanel() + await test.step('Open project and navigate into folderToDelete', async () => { + await projectCard.click() + await u.waitForPageLoad() + await expect(projectMenuButton).toContainText('main.kcl') + await u.closeKclCodePanel() + await u.openFilePanel() - await folderToDelete.click() - await _expect(fileWithinFolder).toBeVisible() - await fileWithinFolder.click() - await _expect(projectMenuButton).toContainText('someFileWithin.kcl') - } - ) + await folderToDelete.click() + await expect(fileWithinFolder).toBeVisible() + await fileWithinFolder.click() + await expect(projectMenuButton).toContainText('someFileWithin.kcl') + }) - await _test.step('Delete folderToDelete', async () => { + await test.step('Delete folderToDelete', async () => { await folderToDelete.click({ button: 'right' }) - await _expect(deleteMenuItem).toBeVisible() + await expect(deleteMenuItem).toBeVisible() await deleteMenuItem.click() - await _expect(deleteConfirmation).toBeVisible() + await expect(deleteConfirmation).toBeVisible() await deleteConfirmation.click() }) - await _test.step( - 'Check deletion and navigation to main.kcl', - async () => { - await _expect(folderToDelete).not.toBeAttached() - await _expect(fileWithinFolder).not.toBeAttached() - await _expect(projectMenuButton).toContainText('main.kcl') - } - ) - - await electronApp.close() + await test.step('Check deletion and navigation to main.kcl', async () => { + await expect(folderToDelete).not.toBeAttached() + await expect(fileWithinFolder).not.toBeAttached() + await expect(projectMenuButton).toContainText('main.kcl') + }) } ) - _test.fixme( - 'TODO - delete folder we are in, with no main.kcl', - async () => {} - ) + test.fixme('TODO - delete folder we are in, with no main.kcl', async () => {}) // Copied from tests above. - _test( + test( `external deletion of project navigates back home`, { tag: '@electron' }, - async ({ browserName }, testInfo) => { + async ({ context, page }, testInfo) => { const TEST_PROJECT_NAME = 'Test Project' - const { - electronApp, - page, - dir: projectsDirName, - } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { + const { dir: projectsDirName } = await context.folderSetupFn( + async (dir) => { await fsp.mkdir(join(dir, TEST_PROJECT_NAME), { recursive: true }) await fsp.mkdir(join(dir, TEST_PROJECT_NAME, 'folderToDelete'), { recursive: true, @@ -994,8 +894,8 @@ _test.describe('Deleting items from the file pane', () => { executorInputPath('cylinder.kcl'), join(dir, TEST_PROJECT_NAME, 'folderToDelete', 'someFileWithin.kcl') ) - }, - }) + } + ) const u = await getUtils(page) await page.setViewportSize({ width: 1200, height: 500 }) @@ -1009,56 +909,43 @@ _test.describe('Deleting items from the file pane', () => { has: page.getByRole('button', { name: 'someFileWithin.kcl' }), }) - await _test.step( - 'Open project and navigate into folderToDelete', - async () => { - await projectCard.click() - await u.waitForPageLoad() - await _expect(projectMenuButton).toContainText('main.kcl') - await u.closeKclCodePanel() - await u.openFilePanel() + await test.step('Open project and navigate into folderToDelete', async () => { + await projectCard.click() + await u.waitForPageLoad() + await expect(projectMenuButton).toContainText('main.kcl') + await u.closeKclCodePanel() + await u.openFilePanel() - await folderToDelete.click() - await _expect(fileWithinFolder).toBeVisible() - await fileWithinFolder.click() - await _expect(projectMenuButton).toContainText('someFileWithin.kcl') - } - ) + await folderToDelete.click() + await expect(fileWithinFolder).toBeVisible() + await fileWithinFolder.click() + await expect(projectMenuButton).toContainText('someFileWithin.kcl') + }) // Point of divergence. Delete the project folder and see if it goes back // to the home view. - await _test.step( - 'Delete projectsDirName/ externally', - async () => { - await fsp.rm(join(projectsDirName, TEST_PROJECT_NAME), { - recursive: true, - force: true, - }) - } - ) - - await _test.step('Check the app is back on the home view', async () => { - const projectsDirLink = page.getByText('Loaded from') - await _expect(projectsDirLink).toBeVisible() + await test.step('Delete projectsDirName/ externally', async () => { + await fsp.rm(join(projectsDirName, TEST_PROJECT_NAME), { + recursive: true, + force: true, + }) }) - await electronApp.close() + await test.step('Check the app is back on the home view', async () => { + const projectsDirLink = page.getByText('Loaded from') + await expect(projectsDirLink).toBeVisible() + }) } ) // Similar to the above - _test( + test( `external deletion of file in sub-directory updates the file tree and recreates it on code editor typing`, { tag: '@electron' }, - async ({ browserName }, testInfo) => { + async ({ context, page }, testInfo) => { const TEST_PROJECT_NAME = 'Test Project' - const { - electronApp, - page, - dir: projectsDirName, - } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { + const { dir: projectsDirName } = await context.folderSetupFn( + async (dir) => { await fsp.mkdir(join(dir, TEST_PROJECT_NAME), { recursive: true }) await fsp.mkdir(join(dir, TEST_PROJECT_NAME, 'folderToDelete'), { recursive: true, @@ -1071,8 +958,8 @@ _test.describe('Deleting items from the file pane', () => { executorInputPath('cylinder.kcl'), join(dir, TEST_PROJECT_NAME, 'folderToDelete', 'someFileWithin.kcl') ) - }, - }) + } + ) const u = await getUtils(page) await page.setViewportSize({ width: 1200, height: 500 }) @@ -1086,53 +973,216 @@ _test.describe('Deleting items from the file pane', () => { has: page.getByRole('button', { name: 'someFileWithin.kcl' }), }) - await _test.step( - 'Open project and navigate into folderToDelete', - async () => { - await projectCard.click() - await u.waitForPageLoad() - await _expect(projectMenuButton).toContainText('main.kcl') + await test.step('Open project and navigate into folderToDelete', async () => { + await projectCard.click() + await u.waitForPageLoad() + await expect(projectMenuButton).toContainText('main.kcl') - await u.openFilePanel() + await u.openFilePanel() - await folderToDelete.click() - await _expect(fileWithinFolder).toBeVisible() - await fileWithinFolder.click() - await _expect(projectMenuButton).toContainText('someFileWithin.kcl') - } - ) + await folderToDelete.click() + await expect(fileWithinFolder).toBeVisible() + await fileWithinFolder.click() + await expect(projectMenuButton).toContainText('someFileWithin.kcl') + }) - await _test.step( - 'Delete projectsDirName/ externally', - async () => { - await fsp.rm( - join( - projectsDirName, - TEST_PROJECT_NAME, - 'folderToDelete', - 'someFileWithin.kcl' - ) + await test.step('Delete projectsDirName/ externally', async () => { + await fsp.rm( + join( + projectsDirName, + TEST_PROJECT_NAME, + 'folderToDelete', + 'someFileWithin.kcl' ) - } - ) + ) + }) - await _test.step('Check the file is gone in the file tree', async () => { - await _expect( + await test.step('Check the file is gone in the file tree', async () => { + await expect( page.getByTestId('file-pane-scroll-container') ).not.toContainText('someFileWithin.kcl') }) - await _test.step( - 'Check the file is back in the file tree after typing in code editor', - async () => { - await u.pasteCodeInEditor('hello = 1') - await _expect( - page.getByTestId('file-pane-scroll-container') - ).toContainText('someFileWithin.kcl') - } - ) - - await electronApp.close() + await test.step('Check the file is back in the file tree after typing in code editor', async () => { + await u.pasteCodeInEditor('hello = 1') + await expect( + page.getByTestId('file-pane-scroll-container') + ).toContainText('someFileWithin.kcl') + }) + } + ) +}) + +test.describe('Undo and redo do not keep history when navigating between files', () => { + test( + `open a file, change something, open a different file, hitting undo should do nothing`, + { tag: '@electron' }, + async ({ context, page }, testInfo) => { + // TODO: fix this test on windows after the electron migration + test.skip(process.platform === 'win32', 'Skip on windows') + await context.folderSetupFn(async (dir) => { + const testDir = join(dir, 'testProject') + await fsp.mkdir(testDir, { recursive: true }) + await fsp.copyFile( + executorInputPath('cylinder.kcl'), + join(testDir, 'main.kcl') + ) + await fsp.copyFile( + executorInputPath('basic_fillet_cube_end.kcl'), + join(testDir, 'other.kcl') + ) + }) + const u = await getUtils(page) + await page.setViewportSize({ width: 1200, height: 500 }) + page.on('console', console.log) + + // Constants and locators + const projectCard = page.getByText('testProject') + const otherFile = page + .getByRole('listitem') + .filter({ has: page.getByRole('button', { name: 'other.kcl' }) }) + + await test.step('Open project and make a change to the file', async () => { + await projectCard.click() + await u.waitForPageLoad() + + // Get the text in the code locator. + const originalText = await u.codeLocator.innerText() + // Click in the editor and add some new lines. + await u.codeLocator.click() + + await page.keyboard.type(`sketch001 = startSketchOn('XY') + some other shit`) + + // Ensure the content in the editor changed. + const newContent = await u.codeLocator.innerText() + + expect(originalText !== newContent) + }) + + await test.step('navigate to other.kcl', async () => { + await u.openFilePanel() + + await otherFile.click() + await u.waitForPageLoad() + await u.openKclCodePanel() + await expect(u.codeLocator).toContainText('getOppositeEdge(thing)') + }) + + await test.step('hit undo', async () => { + // Get the original content of the file. + const originalText = await u.codeLocator.innerText() + // Now hit undo + await page.keyboard.down('ControlOrMeta') + await page.keyboard.press('KeyZ') + await page.keyboard.up('ControlOrMeta') + + await page.waitForTimeout(100) + await expect(u.codeLocator).toContainText(originalText) + }) + } + ) + + test( + `open a file, change something, undo it, open a different file, hitting redo should do nothing`, + { tag: '@electron' }, + // Skip on windows i think the keybindings are different for redo. + async ({ context, page }, testInfo) => { + // TODO: fix this test on windows after the electron migration + test.skip(process.platform === 'win32', 'Skip on windows') + await context.folderSetupFn(async (dir) => { + const testDir = join(dir, 'testProject') + await fsp.mkdir(testDir, { recursive: true }) + await fsp.copyFile( + executorInputPath('cylinder.kcl'), + join(testDir, 'main.kcl') + ) + await fsp.copyFile( + executorInputPath('basic_fillet_cube_end.kcl'), + join(testDir, 'other.kcl') + ) + }) + const u = await getUtils(page) + await page.setViewportSize({ width: 1200, height: 500 }) + page.on('console', console.log) + + // Constants and locators + const projectCard = page.getByText('testProject') + const otherFile = page + .getByRole('listitem') + .filter({ has: page.getByRole('button', { name: 'other.kcl' }) }) + + const badContent = 'this shit' + await test.step('Open project and make a change to the file', async () => { + await projectCard.click() + await u.waitForPageLoad() + + // Get the text in the code locator. + const originalText = await u.codeLocator.innerText() + // Click in the editor and add some new lines. + await u.codeLocator.click() + + await page.keyboard.type(badContent) + + // Ensure the content in the editor changed. + const newContent = await u.codeLocator.innerText() + + expect(originalText !== newContent) + + // Now hit undo + await page.keyboard.down('ControlOrMeta') + await page.keyboard.press('KeyZ') + await page.keyboard.up('ControlOrMeta') + + await page.waitForTimeout(100) + await expect(u.codeLocator).toContainText(originalText) + await expect(u.codeLocator).not.toContainText(badContent) + + // Hit redo. + await page.keyboard.down('Shift') + await page.keyboard.down('ControlOrMeta') + await page.keyboard.press('KeyZ') + await page.keyboard.up('ControlOrMeta') + await page.keyboard.up('Shift') + + await page.waitForTimeout(100) + await expect(u.codeLocator).toContainText(originalText) + await expect(u.codeLocator).toContainText(badContent) + + // Now hit undo + await page.keyboard.down('ControlOrMeta') + await page.keyboard.press('KeyZ') + await page.keyboard.up('ControlOrMeta') + + await page.waitForTimeout(100) + await expect(u.codeLocator).toContainText(originalText) + await expect(u.codeLocator).not.toContainText(badContent) + }) + + await test.step('navigate to other.kcl', async () => { + await u.openFilePanel() + + await otherFile.click() + await u.waitForPageLoad() + await u.openKclCodePanel() + await expect(u.codeLocator).toContainText('getOppositeEdge(thing)') + await expect(u.codeLocator).not.toContainText(badContent) + }) + + await test.step('hit redo', async () => { + // Get the original content of the file. + const originalText = await u.codeLocator.innerText() + // Now hit redo + await page.keyboard.down('Shift') + await page.keyboard.down('ControlOrMeta') + await page.keyboard.press('KeyZ') + await page.keyboard.up('ControlOrMeta') + await page.keyboard.up('Shift') + + await page.waitForTimeout(100) + await expect(u.codeLocator).toContainText(originalText) + await expect(u.codeLocator).not.toContainText(badContent) + }) } ) }) diff --git a/e2e/playwright/fixtures/cmdBarFixture.ts b/e2e/playwright/fixtures/cmdBarFixture.ts index 800308b28..693d106fe 100644 --- a/e2e/playwright/fixtures/cmdBarFixture.ts +++ b/e2e/playwright/fixtures/cmdBarFixture.ts @@ -1,4 +1,4 @@ -import type { Page } from '@playwright/test' +import type { Page, Locator } from '@playwright/test' import { expect } from '@playwright/test' type CmdBarSerialised = @@ -26,16 +26,18 @@ type CmdBarSerialised = export class CmdBarFixture { public page: Page + cmdBarOpenBtn!: Locator constructor(page: Page) { this.page = page + this.cmdBarOpenBtn = page.getByTestId('command-bar-open-button') } reConstruct = (page: Page) => { this.page = page } private _serialiseCmdBar = async (): Promise => { - const reviewForm = await this.page.locator('#review-form') + const reviewForm = this.page.locator('#review-form') const getHeaderArgs = async () => { const inputs = await this.page.getByTestId('cmd-bar-input-tab').all() const entries = await Promise.all( @@ -116,4 +118,21 @@ export class CmdBarFixture { await this.page.keyboard.press('Enter') } } + + openCmdBar = async (selectCmd?: 'promptToEdit') => { + // TODO why does this button not work in electron tests? + // await this.cmdBarOpenBtn.click() + await this.page.keyboard.down('ControlOrMeta') + await this.page.keyboard.press('KeyK') + await this.page.keyboard.up('ControlOrMeta') + await expect(this.page.getByPlaceholder('Search commands')).toBeVisible() + if (selectCmd === 'promptToEdit') { + const promptEditCommand = this.page.getByText( + 'Use Zoo AI to edit your kcl' + ) + await expect(promptEditCommand.first()).toBeVisible() + await promptEditCommand.first().scrollIntoViewIfNeeded() + await promptEditCommand.first().click() + } + } } diff --git a/e2e/playwright/fixtures/editorFixture.ts b/e2e/playwright/fixtures/editorFixture.ts index be23d0af6..ecd768c8e 100644 --- a/e2e/playwright/fixtures/editorFixture.ts +++ b/e2e/playwright/fixtures/editorFixture.ts @@ -1,6 +1,11 @@ import type { Page, Locator } from '@playwright/test' import { expect } from '@playwright/test' -import { sansWhitespace } from '../test-utils' +import { + closePane, + checkIfPaneIsOpen, + openPane, + sansWhitespace, +} from '../test-utils' interface EditorState { activeLines: Array @@ -11,10 +16,11 @@ interface EditorState { export class EditorFixture { public page: Page + private paneButtonTestId = 'code-pane-button' private diagnosticsTooltip!: Locator private diagnosticsGutterIcon!: Locator private codeContent!: Locator - private activeLine!: Locator + public activeLine!: Locator constructor(page: Page) { this.page = page @@ -23,7 +29,7 @@ export class EditorFixture { reConstruct = (page: Page) => { this.page = page - this.codeContent = page.locator('.cm-content') + this.codeContent = page.locator('.cm-content[data-language="kcl"]') this.diagnosticsTooltip = page.locator('.cm-tooltip-lint') this.diagnosticsGutterIcon = page.locator('.cm-lint-marker-error') this.activeLine = this.page.locator('.cm-activeLine') @@ -31,19 +37,32 @@ export class EditorFixture { private _expectEditorToContain = (not = false) => - ( + async ( code: string, { shouldNormalise = false, timeout = 5_000, }: { shouldNormalise?: boolean; timeout?: number } = {} ) => { - if (!shouldNormalise) { - const expectStart = expect(this.codeContent) - if (not) { - return expectStart.not.toContainText(code, { timeout }) + const wasPaneOpen = await this.checkIfPaneIsOpen() + if (!wasPaneOpen) { + await this.openPane() + } + const resetPane = async () => { + if (!wasPaneOpen) { + await this.closePane() } - return expectStart.toContainText(code, { timeout }) + } + if (!shouldNormalise) { + const expectStart = expect.poll(() => this.codeContent.textContent()) + if (not) { + const result = await expectStart.not.toContain(code) + await resetPane() + return result + } + const result = await expectStart.toContain(code) + await resetPane() + return result } const normalisedCode = code.replaceAll(/\s+/g, '').trim() const expectStart = expect.poll( @@ -56,9 +75,13 @@ export class EditorFixture { } ) if (not) { - return expectStart.not.toContain(normalisedCode) + const result = await expectStart.not.toContain(normalisedCode) + await resetPane() + return result } - return expectStart.toContain(normalisedCode) + const result = await expectStart.toContain(normalisedCode) + await resetPane() + return result } expectEditor = { toContain: this._expectEditorToContain(), @@ -115,4 +138,37 @@ export class EditorFixture { code = code.replace(findCode, replaceCode) await this.codeContent.fill(code) } + checkIfPaneIsOpen() { + return checkIfPaneIsOpen(this.page, this.paneButtonTestId) + } + closePane() { + return closePane(this.page, this.paneButtonTestId) + } + openPane() { + return openPane(this.page, this.paneButtonTestId) + } + scrollToText(text: string, placeCursor?: boolean) { + return this.page.evaluate( + (args: { text: string; placeCursor?: boolean }) => { + // error TS2339: Property 'docView' does not exist on type 'EditorView'. + // Except it does so :shrug: + // @ts-ignore + let index = window.editorManager._editorView?.docView.view.state.doc + .toString() + .indexOf(args.text) + window.editorManager._editorView?.focus() + window.editorManager._editorView?.dispatch({ + selection: window.EditorSelection.create([ + window.EditorSelection.cursor(index), + ]), + effects: [ + window.EditorView.scrollIntoView( + window.EditorSelection.range(index, index + 1) + ), + ], + }) + }, + { text, placeCursor } + ) + } } diff --git a/e2e/playwright/fixtures/fixtureSetup.ts b/e2e/playwright/fixtures/fixtureSetup.ts index 494115c53..5e2ea09f5 100644 --- a/e2e/playwright/fixtures/fixtureSetup.ts +++ b/e2e/playwright/fixtures/fixtureSetup.ts @@ -1,11 +1,11 @@ import type { BrowserContext, ElectronApplication, - Page, TestInfo, + Page, } from '@playwright/test' -import { test as base } from '@playwright/test' -import { getUtils, setup, setupElectron, tearDown } from '../test-utils' + +import { getUtils, setup, setupElectron } from '../test-utils' import fsp from 'fs/promises' import { join } from 'path' import { CmdBarFixture } from './cmdBarFixture' @@ -20,10 +20,13 @@ export class AuthenticatedApp { public readonly page: Page public readonly context: BrowserContext public readonly testInfo: TestInfo + public readonly viewPortSize = { width: 1200, height: 500 } + public electronApp: undefined | ElectronApplication + public dir: string = '' constructor(context: BrowserContext, page: Page, testInfo: TestInfo) { - this.page = page this.context = context + this.page = page this.testInfo = testInfo } @@ -36,7 +39,7 @@ export class AuthenticatedApp { ;(window as any).playwrightSkipFilePicker = true }, code) - await this.page.setViewportSize({ width: 1000, height: 500 }) + await this.page.setViewportSize(this.viewPortSize) await u.waitForAuthSkipAppStart() } @@ -48,9 +51,7 @@ export class AuthenticatedApp { } } -interface Fixtures { - app: AuthenticatedApp - tronApp: AuthenticatedTronApp +export interface Fixtures { cmdBar: CmdBarFixture editor: EditorFixture toolbar: ToolbarFixture @@ -60,9 +61,11 @@ interface Fixtures { export class AuthenticatedTronApp { public readonly _page: Page public page: Page - public readonly context: BrowserContext + public context: BrowserContext public readonly testInfo: TestInfo - public electronApp?: ElectronApplication + public electronApp: ElectronApplication | undefined + public readonly viewPortSize = { width: 1200, height: 500 } + public dir: string = '' constructor(context: BrowserContext, page: Page, testInfo: TestInfo) { this._page = page @@ -78,15 +81,22 @@ export class AuthenticatedTronApp { appSettings?: Partial } = { fixtures: {} } ) { - const { electronApp, page } = await setupElectron({ + const { electronApp, page, context, dir } = await setupElectron({ testInfo: this.testInfo, folderSetupFn: arg.folderSetupFn, cleanProjectDir: arg.cleanProjectDir, appSettings: arg.appSettings, }) this.page = page + this.context = context this.electronApp = electronApp - await page.setViewportSize({ width: 1200, height: 500 }) + this.dir = dir + + // Easier to access throughout utils + this.page.dir = dir + + // Setup localStorage, addCookies, reload + await setup(this.context, this.page, this.testInfo) for (const key of unsafeTypedKeys(arg.fixtures)) { const fixture = arg.fixtures[key] @@ -109,32 +119,20 @@ export class AuthenticatedTronApp { }) } -export const test = base.extend({ - app: async ({ page, context }, use, testInfo) => { - await use(new AuthenticatedApp(context, page, testInfo)) - }, - tronApp: async ({ page, context }, use, testInfo) => { - await use(new AuthenticatedTronApp(context, page, testInfo)) - }, - cmdBar: async ({ page }, use) => { +export const fixtures = { + cmdBar: async ({ page }: { page: Page }, use: any) => { await use(new CmdBarFixture(page)) }, - editor: async ({ page }, use) => { + editor: async ({ page }: { page: Page }, use: any) => { await use(new EditorFixture(page)) }, - toolbar: async ({ page }, use) => { + toolbar: async ({ page }: { page: Page }, use: any) => { await use(new ToolbarFixture(page)) }, - scene: async ({ page }, use) => { + scene: async ({ page }: { page: Page }, use: any) => { await use(new SceneFixture(page)) }, - homePage: async ({ page }, use) => { + homePage: async ({ page }: { page: Page }, use: any) => { await use(new HomePageFixture(page)) }, -}) - -test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) - -export { expect } from '@playwright/test' +} diff --git a/e2e/playwright/fixtures/homePageFixture.ts b/e2e/playwright/fixtures/homePageFixture.ts index 4987ad1f2..0c38bf426 100644 --- a/e2e/playwright/fixtures/homePageFixture.ts +++ b/e2e/playwright/fixtures/homePageFixture.ts @@ -4,7 +4,6 @@ import { expect } from '@playwright/test' interface ProjectCardState { title: string fileCount: number - folderCount: number } interface HomePageState { @@ -15,10 +14,14 @@ interface HomePageState { export class HomePageFixture { public page: Page + projectSection!: Locator projectCard!: Locator projectCardTitle!: Locator projectCardFile!: Locator projectCardFolder!: Locator + projectButtonNew!: Locator + projectButtonContinue!: Locator + projectTextName!: Locator sortByDateBtn!: Locator sortByNameBtn!: Locator @@ -29,11 +32,19 @@ export class HomePageFixture { reConstruct = (page: Page) => { this.page = page + this.projectSection = this.page.getByTestId('home-section') + this.projectCard = this.page.getByTestId('project-link') this.projectCardTitle = this.page.getByTestId('project-title') this.projectCardFile = this.page.getByTestId('project-file-count') this.projectCardFolder = this.page.getByTestId('project-folder-count') + this.projectButtonNew = this.page.getByTestId('home-new-file') + this.projectTextName = this.page.getByTestId('cmd-bar-arg-value') + this.projectButtonContinue = this.page.getByRole('button', { + name: 'Continue', + }) + this.sortByDateBtn = this.page.getByTestId('home-sort-by-modified') this.sortByNameBtn = this.page.getByTestId('home-sort-by-name') } @@ -61,15 +72,13 @@ export class HomePageFixture { const projectCards = await this.projectCard.all() const projectCardStates: Array = [] for (const projectCard of projectCards) { - const [title, fileCount, folderCount] = await Promise.all([ + const [title, fileCount] = await Promise.all([ (await projectCard.locator(this.projectCardTitle).textContent()) || '', Number(await projectCard.locator(this.projectCardFile).textContent()), - Number(await projectCard.locator(this.projectCardFolder).textContent()), ]) projectCardStates.push({ title: title, fileCount, - folderCount, }) } return projectCardStates @@ -94,10 +103,25 @@ export class HomePageFixture { .toEqual(expectedState) } + createAndGoToProject = async (projectTitle: string) => { + await expect(this.projectSection).not.toHaveText('Loading your Projects...') + await this.projectButtonNew.click() + await this.projectTextName.click() + await this.projectTextName.fill(projectTitle) + await this.projectButtonContinue.click() + } + openProject = async (projectTitle: string) => { const projectCard = this.projectCard.locator( this.page.getByText(projectTitle) ) await projectCard.click() } + + goToModelingScene = async (name: string = 'testDefault') => { + // On web this is a no-op. There is no project view. + if (process.env.PLATFORM === 'web') return + + await this.createAndGoToProject(name) + } } diff --git a/e2e/playwright/fixtures/sceneFixture.ts b/e2e/playwright/fixtures/sceneFixture.ts index 8772dffe9..d81339117 100644 --- a/e2e/playwright/fixtures/sceneFixture.ts +++ b/e2e/playwright/fixtures/sceneFixture.ts @@ -10,7 +10,13 @@ import { } from '../test-utils' type mouseParams = { - pixelDiff: number + pixelDiff?: number +} +type mouseDragToParams = mouseParams & { + fromPoint: { x: number; y: number } +} +type mouseDragFromParams = mouseParams & { + toPoint: { x: number; y: number } } type SceneSerialised = { @@ -20,6 +26,14 @@ type SceneSerialised = { } } +type ClickHandler = (clickParams?: mouseParams) => Promise +type MoveHandler = (moveParams?: mouseParams) => Promise +type DblClickHandler = (clickParams?: mouseParams) => Promise +type DragToHandler = (dragParams: mouseDragToParams) => Promise +type DragFromHandler = ( + dragParams: mouseDragFromParams +) => Promise + export class SceneFixture { public page: Page @@ -39,8 +53,9 @@ export class SceneFixture { expectState = async (expected: SceneSerialised) => { return expect - .poll(() => this._serialiseScene(), { - message: `Expected scene state to match`, + .poll(async () => await this._serialiseScene(), { + intervals: [1_000, 2_000, 10_000], + timeout: 60000, }) .toEqual(expected) } @@ -55,7 +70,7 @@ export class SceneFixture { x: number, y: number, { steps }: { steps: number } = { steps: 20 } - ) => + ): [ClickHandler, MoveHandler, DblClickHandler] => [ (clickParams?: mouseParams) => { if (clickParams?.pixelDiff) { @@ -77,6 +92,57 @@ export class SceneFixture { } return this.page.mouse.move(x, y, { steps }) }, + (clickParams?: mouseParams) => { + if (clickParams?.pixelDiff) { + return doAndWaitForImageDiff( + this.page, + () => this.page.mouse.dblclick(x, y), + clickParams.pixelDiff + ) + } + return this.page.mouse.dblclick(x, y) + }, + ] as const + makeDragHelpers = ( + x: number, + y: number, + { steps }: { steps: number } = { steps: 20 } + ): [DragToHandler, DragFromHandler] => + [ + (dragToParams: mouseDragToParams) => { + if (dragToParams?.pixelDiff) { + return doAndWaitForImageDiff( + this.page, + () => + this.page.dragAndDrop('#stream', '#stream', { + sourcePosition: dragToParams.fromPoint, + targetPosition: { x, y }, + }), + dragToParams.pixelDiff + ) + } + return this.page.dragAndDrop('#stream', '#stream', { + sourcePosition: dragToParams.fromPoint, + targetPosition: { x, y }, + }) + }, + (dragFromParams: mouseDragFromParams) => { + if (dragFromParams?.pixelDiff) { + return doAndWaitForImageDiff( + this.page, + () => + this.page.dragAndDrop('#stream', '#stream', { + sourcePosition: { x, y }, + targetPosition: dragFromParams.toPoint, + }), + dragFromParams.pixelDiff + ) + } + return this.page.dragAndDrop('#stream', '#stream', { + sourcePosition: { x, y }, + targetPosition: dragFromParams.toPoint, + }) + }, ] as const /** Likely no where, there's a chance it will click something in the scene, depending what you have in the scene. @@ -122,7 +188,10 @@ export class SceneFixture { type: 'default_camera_get_settings', }, }) - await this.waitForExecutionDone() + await this.page + .locator(`[data-receive-command-type="default_camera_get_settings"]`) + .first() + .waitFor() const position = await Promise.all([ this.page.getByTestId('cam-x-position').inputValue().then(Number), this.page.getByTestId('cam-y-position').inputValue().then(Number), @@ -141,7 +210,7 @@ export class SceneFixture { } waitForExecutionDone = async () => { - await expect(this.exeIndicator).toBeVisible() + await expect(this.exeIndicator).toBeVisible({ timeout: 30000 }) } expectPixelColor = async ( @@ -149,23 +218,7 @@ export class SceneFixture { coords: { x: number; y: number }, diff: number ) => { - let finalValue = colour - await expect - .poll(async () => { - const pixel = (await getPixelRGBs(this.page)(coords, 1))[0] - if (!pixel) return null - finalValue = pixel - return pixel.every( - (channel, index) => Math.abs(channel - colour[index]) < diff - ) - }) - .toBeTruthy() - .catch((cause) => { - throw new Error( - `ExpectPixelColor: expecting ${colour} got ${finalValue}`, - { cause } - ) - }) + await expectPixelColor(this.page, colour, coords, diff) } get gizmo() { @@ -173,6 +226,7 @@ export class SceneFixture { } async clickGizmoMenuItem(name: string) { + await this.gizmo.hover() await this.gizmo.click({ button: 'right' }) const buttonToTest = this.page.getByRole('button', { name: name, @@ -181,3 +235,28 @@ export class SceneFixture { await buttonToTest.click() } } + +export async function expectPixelColor( + page: Page, + colour: [number, number, number], + coords: { x: number; y: number }, + diff: number +) { + let finalValue = colour + await expect + .poll(async () => { + const pixel = (await getPixelRGBs(page)(coords, 1))[0] + if (!pixel) return null + finalValue = pixel + return pixel.every( + (channel, index) => Math.abs(channel - colour[index]) < diff + ) + }) + .toBeTruthy() + .catch((cause) => { + throw new Error( + `ExpectPixelColor: expecting ${colour} got ${finalValue}`, + { cause } + ) + }) +} diff --git a/e2e/playwright/fixtures/toolbarFixture.ts b/e2e/playwright/fixtures/toolbarFixture.ts index c2092b1e9..e181c4651 100644 --- a/e2e/playwright/fixtures/toolbarFixture.ts +++ b/e2e/playwright/fixtures/toolbarFixture.ts @@ -1,12 +1,23 @@ import type { Page, Locator } from '@playwright/test' -import { expect } from './fixtureSetup' -import { doAndWaitForImageDiff } from '../test-utils' +import { expect } from '../zoo-test' +import { + checkIfPaneIsOpen, + closePane, + doAndWaitForImageDiff, + openPane, +} from '../test-utils' +import { SidebarType } from 'components/ModelingSidebar/ModelingPanes' +import { SIDEBAR_BUTTON_SUFFIX } from 'lib/constants' export class ToolbarFixture { public page: Page extrudeButton!: Locator + loftButton!: Locator + shellButton!: Locator + offsetPlaneButton!: Locator startSketchBtn!: Locator + lineBtn!: Locator rectangleBtn!: Locator exitSketchBtn!: Locator editSketchBtn!: Locator @@ -15,6 +26,11 @@ export class ToolbarFixture { fileCreateToast!: Locator filePane!: Locator exeIndicator!: Locator + treeInputField!: Locator + /** The sidebar button for the Feature Tree pane */ + featureTreeId = 'feature-tree' as const + /** The pane element for the Feature Tree */ + featureTreePane!: Locator constructor(page: Page) { this.page = page @@ -23,14 +39,20 @@ export class ToolbarFixture { reConstruct = (page: Page) => { this.page = page this.extrudeButton = page.getByTestId('extrude') + this.loftButton = page.getByTestId('loft') + this.shellButton = page.getByTestId('shell') + this.offsetPlaneButton = page.getByTestId('plane-offset') this.startSketchBtn = page.getByTestId('sketch') + this.lineBtn = page.getByTestId('line') this.rectangleBtn = page.getByTestId('corner-rectangle') this.exitSketchBtn = page.getByTestId('sketch-exit') this.editSketchBtn = page.getByText('Edit Sketch') this.fileTreeBtn = page.locator('[id="files-button-holder"]') this.createFileBtn = page.getByTestId('create-file-button') + this.treeInputField = page.getByTestId('tree-input-field') this.filePane = page.locator('#files-pane') + this.featureTreePane = page.locator('#feature-tree-pane') this.fileCreateToast = page.getByText('Successfully created') this.exeIndicator = page.getByTestId('model-state-indicator-execution-done') } @@ -57,10 +79,15 @@ export class ToolbarFixture { expectFileTreeState = async (expected: string[]) => { await expect.poll(this._serialiseFileTree).toEqual(expected) } - createFile = async ({ wait }: { wait: boolean } = { wait: false }) => { + createFile = async (args: { + fileName: string + waitForToastToDisappear: boolean + }) => { await this.createFileBtn.click() + await this.treeInputField.fill(args.fileName) + await this.treeInputField.press('Enter') await expect(this.fileCreateToast).toBeVisible() - if (wait) { + if (args.waitForToastToDisappear) { await this.fileCreateToast.waitFor({ state: 'detached' }) } } @@ -76,4 +103,76 @@ export class ToolbarFixture { await expect(this.exeIndicator).toBeVisible({ timeout: 15_000 }) } } + + async closePane(paneId: SidebarType) { + return closePane(this.page, paneId + SIDEBAR_BUTTON_SUFFIX) + } + async openPane(paneId: SidebarType) { + return openPane(this.page, paneId + SIDEBAR_BUTTON_SUFFIX) + } + async checkIfPaneIsOpen(paneId: SidebarType) { + return checkIfPaneIsOpen(this.page, paneId + SIDEBAR_BUTTON_SUFFIX) + } + + async openFeatureTreePane() { + return this.openPane(this.featureTreeId) + } + async closeFeatureTreePane() { + await this.closePane(this.featureTreeId) + } + async checkIfFeatureTreePaneIsOpen() { + return this.checkIfPaneIsOpen(this.featureTreeId) + } + + /** + * Get a specific operation button from the Feature Tree pane + */ + async getFeatureTreeOperation(operationName: string, operationIndex: number) { + await this.openFeatureTreePane() + await expect(this.featureTreePane).toBeVisible() + return this.featureTreePane + .getByRole('button', { + name: operationName, + }) + .nth(operationIndex) + } + + /** + * View source on a specific operation in the Feature Tree pane. + * @param operationName The name of the operation type + * @param operationIndex The index out of operations of this type + */ + async viewSourceOnOperation(operationName: string, operationIndex: number) { + const operationButton = await this.getFeatureTreeOperation( + operationName, + operationIndex + ) + const viewSourceMenuButton = this.page.getByRole('button', { + name: 'View KCL source code', + }) + + await operationButton.click({ button: 'right' }) + await expect(viewSourceMenuButton).toBeVisible() + await viewSourceMenuButton.click() + } + + /** + * Go to definition on a specific operation in the Feature Tree pane + */ + async goToDefinitionOnOperation( + operationName: string, + operationIndex: number + ) { + const operationButton = await this.getFeatureTreeOperation( + operationName, + operationIndex + ) + const goToDefinitionMenuButton = this.page.getByRole('button', { + name: 'View function definition', + }) + + await operationButton.click({ button: 'right' }) + await expect(goToDefinitionMenuButton).toBeVisible() + await goToDefinitionMenuButton.click() + } } diff --git a/e2e/playwright/lib/console-error-whitelist.ts b/e2e/playwright/lib/console-error-whitelist.ts index 721f1683a..176c335ef 100644 --- a/e2e/playwright/lib/console-error-whitelist.ts +++ b/e2e/playwright/lib/console-error-whitelist.ts @@ -18,7 +18,7 @@ export const isErrorWhitelisted = (exception: Error) => { { name: '"{"kind"', message: - '"engine","sourceRanges":[[0,0]],"msg":"Failed to get string from response from engine: `JsValue(undefined)`"}"', + '"engine","sourceRanges":[[0,0,0]],"msg":"Failed to get string from response from engine: `JsValue(undefined)`"}"', stack: '', foundInSpec: 'e2e/playwright/testing-settings.spec.ts', project: 'Google Chrome', @@ -156,8 +156,8 @@ export const isErrorWhitelisted = (exception: Error) => { { name: 'Unhandled Promise Rejection', message: - '{"kind":"engine","sourceRanges":[[0,0]],"msg":"Failed to get string from response from engine: `JsValue(undefined)`"}', - stack: `Unhandled Promise Rejection: {"kind":"engine","sourceRanges":[[0,0]],"msg":"Failed to get string from response from engine: \`JsValue(undefined)\`"} + '{"kind":"engine","sourceRanges":[[0,0,0]],"msg":"Failed to get string from response from engine: `JsValue(undefined)`"}', + stack: `Unhandled Promise Rejection: {"kind":"engine","sourceRanges":[[0,0,0]],"msg":"Failed to get string from response from engine: \`JsValue(undefined)\`"} at unknown (http://localhost:3000/src/lang/std/engineConnection.ts:1245:26)`, foundInSpec: 'e2e/playwright/onboarding-tests.spec.ts Click through each onboarding step', @@ -253,7 +253,7 @@ export const isErrorWhitelisted = (exception: Error) => { { name: '{"kind"', stack: ``, - message: `engine","sourceRanges":[[0,0]],"msg":"Failed to wait for promise from engine: JsValue(\\"Force interrupt, executionIsStale, new AST requested\\")"}`, + message: `engine","sourceRanges":[[0,0,0]],"msg":"Failed to wait for promise from engine: JsValue(\\"Force interrupt, executionIsStale, new AST requested\\")"}`, project: 'Google Chrome', foundInSpec: 'e2e/playwright/testing-settings.spec.ts', }, diff --git a/e2e/playwright/machines.spec.ts b/e2e/playwright/machines.spec.ts index db692cd97..097e522de 100644 --- a/e2e/playwright/machines.spec.ts +++ b/e2e/playwright/machines.spec.ts @@ -1,29 +1,22 @@ -import { test, expect } from '@playwright/test' -import { setupElectron, tearDown, executorInputPath } from './test-utils' +import { test, expect } from './zoo-test' +import { executorInputPath } from './test-utils' import { join } from 'path' import fsp from 'fs/promises' -test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) - test( 'When machine-api server not found butt is disabled and shows the reason', { tag: '@electron' }, - async ({ browserName }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - const bracketDir = join(dir, 'bracket') - await fsp.mkdir(bracketDir, { recursive: true }) - await fsp.copyFile( - executorInputPath('focusrite_scarlett_mounting_braket.kcl'), - join(bracketDir, 'main.kcl') - ) - }, + async ({ context, page }, testInfo) => { + await context.folderSetupFn(async (dir) => { + const bracketDir = join(dir, 'bracket') + await fsp.mkdir(bracketDir, { recursive: true }) + await fsp.copyFile( + executorInputPath('focusrite_scarlett_mounting_braket.kcl'), + join(bracketDir, 'main.kcl') + ) }) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) await expect(page.getByText('bracket')).toBeVisible() @@ -47,28 +40,23 @@ test( // that the machine-api server is not found await makeButton.hover() await expect(page.getByText(notFoundText).first()).toBeVisible() - - await electronApp.close() } ) test( 'When machine-api server not found home screen & project status shows the reason', { tag: '@electron' }, - async ({ browserName }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - const bracketDir = join(dir, 'bracket') - await fsp.mkdir(bracketDir, { recursive: true }) - await fsp.copyFile( - executorInputPath('focusrite_scarlett_mounting_braket.kcl'), - join(bracketDir, 'main.kcl') - ) - }, + async ({ context, page }, testInfo) => { + await context.folderSetupFn(async (dir) => { + const bracketDir = join(dir, 'bracket') + await fsp.mkdir(bracketDir, { recursive: true }) + await fsp.copyFile( + executorInputPath('focusrite_scarlett_mounting_braket.kcl'), + join(bracketDir, 'main.kcl') + ) }) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) const notFoundText = 'Machine API server was not discovered' @@ -91,7 +79,5 @@ test( await networkMachineToggle.hover() await expect(page.getByText(notFoundText).nth(1)).toBeVisible() - - await electronApp.close() } ) diff --git a/e2e/playwright/null.spec.ts b/e2e/playwright/null.spec.ts new file mode 100644 index 000000000..dcb213a9f --- /dev/null +++ b/e2e/playwright/null.spec.ts @@ -0,0 +1,12 @@ +// These tests are meant to simply test starting and stopping the electron +// application, check it can make it to the project pane, and nothing more. +// It also tests our test wrappers are working. +// Additionally this serves as a nice minimal example. + +import { test, expect } from './zoo-test' + +test.describe('Open the application', () => { + test('see the project view', async ({ page, context }) => { + await expect(page.getByTestId('home-section')).toBeVisible() + }) +}) diff --git a/e2e/playwright/onboarding-tests.spec.ts b/e2e/playwright/onboarding-tests.spec.ts index 84288213b..8a802e2a1 100644 --- a/e2e/playwright/onboarding-tests.spec.ts +++ b/e2e/playwright/onboarding-tests.spec.ts @@ -1,86 +1,81 @@ -import { test, expect } from '@playwright/test' +import { test, expect } from './zoo-test' import { join } from 'path' import fsp from 'fs/promises' -import { - getUtils, - setup, - setupElectron, - tearDown, - executorInputPath, -} from './test-utils' +import { getUtils, executorInputPath, createProject } from './test-utils' import { bracket } from 'lib/exampleKcl' import { onboardingPaths } from 'routes/Onboarding/paths' import { TEST_SETTINGS_KEY, TEST_SETTINGS_ONBOARDING_START, TEST_SETTINGS_ONBOARDING_EXPORT, - TEST_SETTINGS_ONBOARDING_PARAMETRIC_MODELING, TEST_SETTINGS_ONBOARDING_USER_MENU, } from './storageStates' import * as TOML from '@iarna/toml' +import { expectPixelColor } from './fixtures/sceneFixture' -test.beforeEach(async ({ context, page }, testInfo) => { - if (testInfo.tags.includes('@electron')) { - return - } - await setup(context, page) -}) - -test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) +// Because onboarding relies on an app setting we need to set it as incompletel +// for all these tests. test.describe('Onboarding tests', () => { - test('Onboarding code is shown in the editor', async ({ page }) => { - const u = await getUtils(page) - - // Override beforeEach test setup - await page.addInitScript( - async ({ settingsKey }) => { - // Give no initial code, so that the onboarding start is shown immediately - localStorage.removeItem('persistCode') - localStorage.removeItem(settingsKey) + test( + 'Onboarding code is shown in the editor', + { + appSettings: { + app: { + onboardingStatus: 'incomplete', + }, }, - { settingsKey: TEST_SETTINGS_KEY } - ) + cleanProjectDir: true, + }, + async ({ context, page, homePage }) => { + const u = await getUtils(page) + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() - await page.setViewportSize({ width: 1200, height: 500 }) + // Test that the onboarding pane loaded + await expect( + page.getByText('Welcome to Modeling App! This') + ).toBeVisible() - await u.waitForAuthSkipAppStart() + // Test that the onboarding pane loaded + await expect( + page.getByText('Welcome to Modeling App! This') + ).toBeVisible() - // Test that the onboarding pane loaded - await expect(page.getByText('Welcome to Modeling App! This')).toBeVisible() + // *and* that the code is shown in the editor + await expect(page.locator('.cm-content')).toContainText( + '// Shelf Bracket' + ) - // *and* that the code is shown in the editor - await expect(page.locator('.cm-content')).toContainText('// Shelf Bracket') - }) + // Make sure the model loaded + const XYPlanePoint = { x: 774, y: 116 } as const + const modelColor: [number, number, number] = [45, 45, 45] + await page.mouse.move(XYPlanePoint.x, XYPlanePoint.y) + expect(await u.getGreatestPixDiff(XYPlanePoint, modelColor)).toBeLessThan( + 8 + ) + } + ) test( 'Desktop: fresh onboarding executes and loads', - { tag: '@electron' }, - async ({ browserName: _ }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - appSettings: { - app: { - onboardingStatus: 'incomplete', - }, + { + tag: '@electron', + appSettings: { + app: { + onboardingStatus: 'incomplete', }, - cleanProjectDir: true, - }) - + }, + cleanProjectDir: true, + }, + async ({ page, homePage }, testInfo) => { const u = await getUtils(page) const viewportSize = { width: 1200, height: 500 } - await page.setViewportSize(viewportSize) - - // Locators and constants - const newProjectButton = page.getByRole('button', { name: 'New project' }) - const projectLink = page.getByTestId('project-link') + await page.setBodyDimensions(viewportSize) await test.step(`Create a project and open to the onboarding`, async () => { - await newProjectButton.click() - await projectLink.click() + await createProject({ name: 'project-link', page }) await test.step(`Ensure the engine connection works by testing the sketch button`, async () => { await u.waitForPageLoad() }) @@ -96,321 +91,370 @@ test.describe('Onboarding tests', () => { await expect(page.locator('.cm-content')).toContainText( '// Shelf Bracket' ) - }) - await electronApp.close() + // TODO: jess make less shit + // Make sure the model loaded + //const XYPlanePoint = { x: 986, y: 522 } as const + //const modelColor: [number, number, number] = [76, 76, 76] + //await page.mouse.move(XYPlanePoint.x, XYPlanePoint.y) + + //await expectPixelColor(page, modelColor, XYPlanePoint, 8) + }) } ) - test('Code resets after confirmation', async ({ page }) => { - const initialCode = `sketch001 = startSketchOn('XZ')` - - // Load the page up with some code so we see the confirmation warning - // when we go to replay onboarding - await page.addInitScript((code) => { - localStorage.setItem('persistCode', code) - }, initialCode) - - const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() - - // Replay the onboarding - await page.getByRole('link', { name: 'Settings' }).last().click() - const replayButton = page.getByRole('button', { name: 'Replay onboarding' }) - await expect(replayButton).toBeVisible() - await replayButton.click() - - // Ensure we see the warning, and that the code has not yet updated - await expect( - page.getByText('Replaying onboarding resets your code') - ).toBeVisible() - await expect(page.locator('.cm-content')).toHaveText(initialCode) - - const nextButton = page.getByTestId('onboarding-next') - await expect(nextButton).toBeVisible() - await nextButton.click() - - // Ensure we see the introduction and that the code has been reset - await expect(page.getByText('Welcome to Modeling App!')).toBeVisible() - await expect(page.locator('.cm-content')).toContainText('// Shelf Bracket') - - // Ensure we persisted the code to local storage. - // Playwright's addInitScript method unfortunately will reset - // this code if we try reloading the page as a test, - // so this is our best way to test persistence afaik. - expect( - await page.evaluate(() => { - return localStorage.getItem('persistCode') - }) - ).toContain('// Shelf Bracket') - }) - - test('Click through each onboarding step', async ({ page }) => { - const u = await getUtils(page) - - // Override beforeEach test setup - await page.addInitScript( - async ({ settingsKey, settings }) => { - // Give no initial code, so that the onboarding start is shown immediately - localStorage.setItem('persistCode', '') - localStorage.setItem(settingsKey, settings) + test( + 'Code resets after confirmation', + { + appSettings: { + app: { + onboardingStatus: 'incomplete', + }, }, - { - settingsKey: TEST_SETTINGS_KEY, - settings: TOML.stringify({ settings: TEST_SETTINGS_ONBOARDING_START }), - } - ) + cleanProjectDir: true, + }, + async ({ context, page, homePage }) => { + const initialCode = `sketch001 = startSketchOn('XZ')` - await page.setViewportSize({ width: 1200, height: 1080 }) + // Load the page up with some code so we see the confirmation warning + // when we go to replay onboarding + await context.addInitScript((code) => { + localStorage.setItem('persistCode', code) + }, initialCode) - await u.waitForAuthSkipAppStart() + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() - // Test that the onboarding pane loaded - await expect(page.getByText('Welcome to Modeling App! This')).toBeVisible() + // Replay the onboarding + await page.getByRole('link', { name: 'Settings' }).last().click() + const replayButton = page.getByRole('button', { + name: 'Replay onboarding', + }) + await expect(replayButton).toBeVisible() + await replayButton.click() - const nextButton = page.getByTestId('onboarding-next') + // Ensure we see the warning, and that the code has not yet updated + await expect(page.getByText('Would you like to create')).toBeVisible() + await expect(page.locator('.cm-content')).toHaveText(initialCode) - while ((await nextButton.innerText()) !== 'Finish') { - await expect(nextButton).toBeVisible() + const nextButton = page.getByTestId('onboarding-next') + await nextButton.hover() await nextButton.click() + + // Ensure we see the introduction and that the code has been reset + await expect(page.getByText('Welcome to Modeling App!')).toBeVisible() + await expect(page.locator('.cm-content')).toContainText( + '// Shelf Bracket' + ) + + // There used to be old code here that checked if we stored the reset + // code into localStorage but that isn't the case on desktop. It gets + // saved to the file system, which we have other tests for. } + ) - // Finish the onboarding - await expect(nextButton).toBeVisible() - await nextButton.click() - - // Test that the onboarding pane is gone - await expect(page.getByTestId('onboarding-content')).not.toBeVisible() - await expect(page.url()).not.toContain('onboarding') - }) - - test('Onboarding redirects and code updating', async ({ page }) => { - const u = await getUtils(page) - - // Override beforeEach test setup - await page.addInitScript( - async ({ settingsKey, settings }) => { - // Give some initial code, so we can test that it's cleared - localStorage.setItem('persistCode', 'sigmaAllow = 15000') - localStorage.setItem(settingsKey, settings) + test( + 'Click through each onboarding step', + { + appSettings: { + app: { + onboardingStatus: 'incomplete', + }, }, - { - settingsKey: TEST_SETTINGS_KEY, - settings: TOML.stringify({ settings: TEST_SETTINGS_ONBOARDING_EXPORT }), + }, + async ({ context, page, homePage }) => { + // Override beforeEach test setup + await context.addInitScript( + async ({ settingsKey, settings }) => { + // Give no initial code, so that the onboarding start is shown immediately + localStorage.setItem('persistCode', '') + localStorage.setItem(settingsKey, settings) + }, + { + settingsKey: TEST_SETTINGS_KEY, + settings: TOML.stringify({ + settings: TEST_SETTINGS_ONBOARDING_START, + }), + } + ) + + await page.setBodyDimensions({ width: 1200, height: 1080 }) + await homePage.goToModelingScene() + + // Test that the onboarding pane loaded + await expect( + page.getByText('Welcome to Modeling App! This') + ).toBeVisible() + + const nextButton = page.getByTestId('onboarding-next') + + while ((await nextButton.innerText()) !== 'Finish') { + await nextButton.hover() + await nextButton.click() } - ) - await page.setViewportSize({ width: 1200, height: 500 }) + // Finish the onboarding + await nextButton.hover() + await nextButton.click() - await u.waitForAuthSkipAppStart() - - // Test that the redirect happened - await expect(page.url().split(':3000').slice(-1)[0]).toBe( - `/file/%2Fbrowser%2Fmain.kcl/onboarding/export` - ) - - // Test that you come back to this page when you refresh - await page.reload() - await expect(page.url().split(':3000').slice(-1)[0]).toBe( - `/file/%2Fbrowser%2Fmain.kcl/onboarding/export` - ) - - // Test that the onboarding pane loaded - const title = page.locator('[data-testid="onboarding-content"]') - await expect(title).toBeAttached() - - // Test that the code changes when you advance to the next step - await page.locator('[data-testid="onboarding-next"]').click() - await expect(page.locator('.cm-content')).toHaveText('') - - // Test that the code is not empty when you click on the next step - await page.locator('[data-testid="onboarding-next"]').click() - await expect(page.locator('.cm-content')).toHaveText(/.+/) - }) - - test('Onboarding code gets reset to demo on Interactive Numbers step', async ({ - page, - }) => { - test.skip( - process.platform === 'darwin', - "Skip on macOS, because Playwright isn't behaving the same as the actual browser" - ) - const u = await getUtils(page) - const badCode = `// This is bad code we shouldn't see` - // Override beforeEach test setup - await page.addInitScript( - async ({ settingsKey, settings, badCode }) => { - localStorage.setItem('persistCode', badCode) - localStorage.setItem(settingsKey, settings) - }, - { - settingsKey: TEST_SETTINGS_KEY, - settings: TOML.stringify({ - settings: TEST_SETTINGS_ONBOARDING_PARAMETRIC_MODELING, - }), - badCode, - } - ) - - await page.setViewportSize({ width: 1200, height: 1080 }) - await u.waitForAuthSkipAppStart() - - await page.waitForURL('**' + onboardingPaths.PARAMETRIC_MODELING, { - waitUntil: 'domcontentloaded', - }) - - const bracketNoNewLines = bracket.replace(/\n/g, '') - - // Check the code got reset on load - await expect(page.locator('#code-pane')).toBeVisible() - await expect(u.codeLocator).toHaveText(bracketNoNewLines, { - timeout: 10_000, - }) - - // Mess with the code again - await u.codeLocator.selectText() - await u.codeLocator.fill(badCode) - await expect(u.codeLocator).toHaveText(badCode) - - // Click to the next step - await page.locator('[data-testid="onboarding-next"]').click() - await page.waitForURL('**' + onboardingPaths.INTERACTIVE_NUMBERS, { - waitUntil: 'domcontentloaded', - }) - - // Check that the code has been reset - await expect(u.codeLocator).toHaveText(bracketNoNewLines) - }) - - test('Avatar text updates depending on image load success', async ({ - page, - }) => { - // Override beforeEach test setup - await page.addInitScript( - async ({ settingsKey, settings }) => { - localStorage.setItem(settingsKey, settings) - }, - { - settingsKey: TEST_SETTINGS_KEY, - settings: TOML.stringify({ - settings: TEST_SETTINGS_ONBOARDING_USER_MENU, - }), - } - ) - - const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() - - await page.waitForURL('**/file/**', { waitUntil: 'domcontentloaded' }) - - // Test that the text in this step is correct - const avatarLocator = await page - .getByTestId('user-sidebar-toggle') - .locator('img') - const onboardingOverlayLocator = await page - .getByTestId('onboarding-content') - .locator('div') - .nth(1) - - // Expect the avatar to be visible and for the text to reference it - await expect(avatarLocator).toBeVisible() - await expect(onboardingOverlayLocator).toBeVisible() - await expect(onboardingOverlayLocator).toContainText('your avatar') - - // This is to force the avatar to 404. - // For our test image (only triggers locally. on CI, it's Kurt's / - // gravatar image ) - await page.route('/cat.jpg', async (route) => { - await route.fulfill({ - status: 404, - contentType: 'text/plain', - body: 'Not Found!', - }) - }) - - // 404 the CI avatar image - await page.route('https://lh3.googleusercontent.com/**', async (route) => { - await route.fulfill({ - status: 404, - contentType: 'text/plain', - body: 'Not Found!', - }) - }) - - await page.reload({ waitUntil: 'domcontentloaded' }) - - // Now expect the text to be different - await expect(avatarLocator).not.toBeVisible() - await expect(onboardingOverlayLocator).toBeVisible() - await expect(onboardingOverlayLocator).toContainText('the menu button') - }) - - test("Avatar text doesn't mention avatar when no avatar", async ({ - page, - }) => { - // Override beforeEach test setup - await page.addInitScript( - async ({ settingsKey, settings }) => { - localStorage.setItem(settingsKey, settings) - localStorage.setItem('FORCE_NO_IMAGE', 'FORCE_NO_IMAGE') - }, - { - settingsKey: TEST_SETTINGS_KEY, - settings: TOML.stringify({ - settings: TEST_SETTINGS_ONBOARDING_USER_MENU, - }), - } - ) - - const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() - - await page.waitForURL('**/file/**', { waitUntil: 'domcontentloaded' }) - - // Test that the text in this step is correct - const sidebar = page.getByTestId('user-sidebar-toggle') - const avatar = sidebar.locator('img') - const onboardingOverlayLocator = page - .getByTestId('onboarding-content') - .locator('div') - .nth(1) - - // Expect the avatar to be visible and for the text to reference it - await expect(avatar).not.toBeVisible() - await expect(onboardingOverlayLocator).toBeVisible() - await expect(onboardingOverlayLocator).toContainText('the menu button') - - // Test we mention what else is in this menu for https://github.com/KittyCAD/modeling-app/issues/2939 - // which doesn't deserver its own full test spun up - const userMenuFeatures = [ - 'manage your account', - 'report a bug', - 'request a feature', - 'sign out', - ] - for (const feature of userMenuFeatures) { - await expect(onboardingOverlayLocator).toContainText(feature) + // Test that the onboarding pane is gone + await expect(page.getByTestId('onboarding-content')).not.toBeVisible() + await expect.poll(() => page.url()).not.toContain('/onboarding') } - }) + ) + + test( + 'Onboarding redirects and code updating', + { + appSettings: { + app: { + onboardingStatus: '/export', + }, + }, + cleanProjectDir: true, + }, + async ({ context, page, homePage }) => { + const originalCode = 'sigmaAllow = 15000' + + // Override beforeEach test setup + await context.addInitScript( + async ({ settingsKey, settings }) => { + // Give some initial code, so we can test that it's cleared + localStorage.setItem('persistCode', originalCode) + localStorage.setItem(settingsKey, settings) + }, + { + settingsKey: TEST_SETTINGS_KEY, + settings: TOML.stringify({ + settings: TEST_SETTINGS_ONBOARDING_EXPORT, + }), + } + ) + + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() + + // Test that the redirect happened + await expect.poll(() => page.url()).toContain('/onboarding/export') + + // Test that you come back to this page when you refresh + await page.reload() + await expect.poll(() => page.url()).toContain('/onboarding/export') + + // Test that the code changes when you advance to the next step + await page.getByTestId('onboarding-next').hover() + await page.getByTestId('onboarding-next').click() + + // Test that the onboarding pane loaded + const title = page.locator('[data-testid="onboarding-content"]') + await expect(title).toBeAttached() + + await expect(page.locator('.cm-content')).not.toHaveText(originalCode) + + // Test that the code is not empty when you click on the next step + await page.locator('[data-testid="onboarding-next"]').hover() + await page.locator('[data-testid="onboarding-next"]').click() + await expect(page.locator('.cm-content')).toHaveText(/.+/) + } + ) + + test( + 'Onboarding code gets reset to demo on Interactive Numbers step', + { + appSettings: { + app: { + onboardingStatus: '/parametric-modeling', + }, + }, + cleanProjectDir: true, + }, + + async ({ context, page, homePage }) => { + const u = await getUtils(page) + const badCode = `// This is bad code we shouldn't see` + + await page.setBodyDimensions({ width: 1200, height: 1080 }) + await homePage.goToModelingScene() + + await expect + .poll(() => page.url()) + .toContain(onboardingPaths.PARAMETRIC_MODELING) + + const bracketNoNewLines = bracket.replace(/\n/g, '') + + // Check the code got reset on load + await expect(page.locator('#code-pane')).toBeVisible() + await expect(u.codeLocator).toHaveText(bracketNoNewLines, { + timeout: 10_000, + }) + + // Mess with the code again + await u.codeLocator.selectText() + await u.codeLocator.fill(badCode) + await expect(u.codeLocator).toHaveText(badCode) + + // Click to the next step + await page.locator('[data-testid="onboarding-next"]').hover() + await page.locator('[data-testid="onboarding-next"]').click() + await page.waitForURL('**' + onboardingPaths.INTERACTIVE_NUMBERS, { + waitUntil: 'domcontentloaded', + }) + + // Check that the code has been reset + await expect(u.codeLocator).toHaveText(bracketNoNewLines) + } + ) + + // (lee) The two avatar tests are weird because even on main, we don't have + // anything to do with the avatar inside the onboarding test. Due to the + // low impact of an avatar not showing I'm changing this to fixme. + test.fixme( + 'Avatar text updates depending on image load success', + { + appSettings: { + app: { + onboardingStatus: 'incomplete', + }, + }, + cleanProjectDir: true, + }, + async ({ context, page, homePage }) => { + // Override beforeEach test setup + await context.addInitScript( + async ({ settingsKey, settings }) => { + localStorage.setItem(settingsKey, settings) + }, + { + settingsKey: TEST_SETTINGS_KEY, + settings: TOML.stringify({ + settings: TEST_SETTINGS_ONBOARDING_USER_MENU, + }), + } + ) + + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() + + // Test that the text in this step is correct + const avatarLocator = await page + .getByTestId('user-sidebar-toggle') + .locator('img') + const onboardingOverlayLocator = await page + .getByTestId('onboarding-content') + .locator('div') + .nth(1) + + // Expect the avatar to be visible and for the text to reference it + await expect(avatarLocator).toBeVisible() + await expect(onboardingOverlayLocator).toBeVisible() + await expect(onboardingOverlayLocator).toContainText('your avatar') + + // This is to force the avatar to 404. + // For our test image (only triggers locally. on CI, it's Kurt's / + // gravatar image ) + await page.route('/cat.jpg', async (route) => { + await route.fulfill({ + status: 404, + contentType: 'text/plain', + body: 'Not Found!', + }) + }) + + // 404 the CI avatar image + await page.route( + 'https://lh3.googleusercontent.com/**', + async (route) => { + await route.fulfill({ + status: 404, + contentType: 'text/plain', + body: 'Not Found!', + }) + } + ) + + await page.reload({ waitUntil: 'domcontentloaded' }) + + // Now expect the text to be different + await expect(avatarLocator).not.toBeVisible() + await expect(onboardingOverlayLocator).toBeVisible() + await expect(onboardingOverlayLocator).toContainText('the menu button') + } + ) + + test.fixme( + "Avatar text doesn't mention avatar when no avatar", + { + appSettings: { + app: { + onboardingStatus: 'incomplete', + }, + }, + cleanProjectDir: true, + }, + async ({ context, page, homePage }) => { + // Override beforeEach test setup + await context.addInitScript( + async ({ settingsKey, settings }) => { + localStorage.setItem(settingsKey, settings) + localStorage.setItem('FORCE_NO_IMAGE', 'FORCE_NO_IMAGE') + }, + { + settingsKey: TEST_SETTINGS_KEY, + settings: TOML.stringify({ + settings: TEST_SETTINGS_ONBOARDING_USER_MENU, + }), + } + ) + + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() + + // Test that the text in this step is correct + const sidebar = page.getByTestId('user-sidebar-toggle') + const avatar = sidebar.locator('img') + const onboardingOverlayLocator = page + .getByTestId('onboarding-content') + .locator('div') + .nth(1) + + // Expect the avatar to be visible and for the text to reference it + await expect(avatar).not.toBeVisible() + await expect(onboardingOverlayLocator).toBeVisible() + await expect(onboardingOverlayLocator).toContainText('the menu button') + + // Test we mention what else is in this menu for https://github.com/KittyCAD/modeling-app/issues/2939 + // which doesn't deserver its own full test spun up + const userMenuFeatures = [ + 'manage your account', + 'report a bug', + 'request a feature', + 'sign out', + ] + for (const feature of userMenuFeatures) { + await expect(onboardingOverlayLocator).toContainText(feature) + } + } + ) }) -test( +test.fixme( 'Restarting onboarding on desktop takes one attempt', - { tag: '@electron' }, - async ({ browser: _ }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - const routerTemplateDir = join(dir, 'router-template-slate') - await fsp.mkdir(routerTemplateDir, { recursive: true }) - await fsp.copyFile( - executorInputPath('router-template-slate.kcl'), - join(routerTemplateDir, 'main.kcl') - ) + { + appSettings: { + app: { + onboardingStatus: 'dismissed', }, + }, + cleanProjectDir: true, + }, + async ({ context, page, homePage }, testInfo) => { + await context.folderSetupFn(async (dir) => { + const routerTemplateDir = join(dir, 'router-template-slate') + await fsp.mkdir(routerTemplateDir, { recursive: true }) + await fsp.copyFile( + executorInputPath('router-template-slate.kcl'), + join(routerTemplateDir, 'main.kcl') + ) }) // Our constants @@ -422,10 +466,11 @@ test( const restartOnboardingButton = page.getByRole('button', { name: 'Reset onboarding', }) - const restartConfirmationButton = page.getByRole('button', { - name: 'Make a new project', - }) - const tutorialProjectIndicator = page.getByText('Tutorial Project 00') + const nextButton = page.getByTestId('onboarding-next') + + const tutorialProjectIndicator = page + .getByTestId('project-sidebar-toggle') + .filter({ hasText: 'Tutorial Project 00' }) const tutorialModalText = page.getByText('Welcome to Modeling App!') const tutorialDismissButton = page.getByRole('button', { name: 'Dismiss' }) const userMenuButton = page.getByTestId('user-sidebar-toggle') @@ -441,7 +486,7 @@ test( }) await test.step('Navigate into project', async () => { - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) page.on('console', console.log) @@ -457,14 +502,22 @@ test( await helpMenuButton.click() await restartOnboardingButton.click() - await expect(restartConfirmationButton).toBeVisible() - await restartConfirmationButton.click() + await nextButton.hover() + await nextButton.click() }) await test.step('Confirm that the onboarding has restarted', async () => { await expect(tutorialProjectIndicator).toBeVisible() await expect(tutorialModalText).toBeVisible() + // Make sure the model loaded + const XYPlanePoint = { x: 988, y: 523 } as const + const modelColor: [number, number, number] = [76, 76, 76] + + await page.mouse.move(XYPlanePoint.x, XYPlanePoint.y) + await expectPixelColor(page, modelColor, XYPlanePoint, 8) await tutorialDismissButton.click() + // Make sure model still there. + await expectPixelColor(page, modelColor, XYPlanePoint, 8) }) await test.step('Clear code and restart onboarding from settings', async () => { @@ -482,11 +535,9 @@ test( await restartOnboardingSettingsButton.click() // Since the code is empty, we should not see the confirmation dialog - await expect(restartConfirmationButton).not.toBeVisible() + await expect(nextButton).not.toBeVisible() await expect(tutorialProjectIndicator).toBeVisible() await expect(tutorialModalText).toBeVisible() }) - - await electronApp.close() } ) diff --git a/e2e/playwright/point-click.spec.ts b/e2e/playwright/point-click.spec.ts index 0e0e559e8..f35593b5e 100644 --- a/e2e/playwright/point-click.spec.ts +++ b/e2e/playwright/point-click.spec.ts @@ -1,33 +1,59 @@ -import { test, expect, AuthenticatedApp } from './fixtures/fixtureSetup' +import { test, expect, Page } from './zoo-test' import { EditorFixture } from './fixtures/editorFixture' import { SceneFixture } from './fixtures/sceneFixture' import { ToolbarFixture } from './fixtures/toolbarFixture' +import fs from 'node:fs/promises' +import path from 'node:path' +import { getUtils } from './test-utils' // test file is for testing point an click code gen functionality that's not sketch mode related -test( - 'verify extruding circle works', - { tag: ['@skipWin'] }, - async ({ app, cmdBar, editor, toolbar, scene }) => { - test.skip( - process.platform === 'win32', - 'Fails on windows in CI, can not be replicated locally on windows.' - ) - const file = await app.getInputFile('test-circle-extrude.kcl') - await app.initialise(file) - const [clickCircle, moveToCircle] = scene.makeMouseHelpers(582, 217) +test('verify extruding circle works', async ({ + context, + homePage, + cmdBar, + editor, + toolbar, + scene, +}) => { + // TODO: fix this test on windows after the electron migration + test.skip(process.platform === 'win32', 'Skip on windows') + const file = await fs.readFile( + path.resolve( + __dirname, + '../../', + './src/wasm-lib/tests/executor/inputs/test-circle-extrude.kcl' + ), + 'utf-8' + ) + await context.addInitScript((file) => { + localStorage.setItem('persistCode', file) + }, file) + await homePage.goToModelingScene() - await test.step('because there is sweepable geometry, verify extrude is enable when nothing is selected', async () => { - await scene.clickNoWhere() - await expect(toolbar.extrudeButton).toBeEnabled() + const [clickCircle, moveToCircle] = scene.makeMouseHelpers(582, 217) + + await test.step('because there is sweepable geometry, verify extrude is enable when nothing is selected', async () => { + await scene.clickNoWhere() + await expect(toolbar.extrudeButton).toBeEnabled() + }) + + await test.step('check code model connection works and that button is still enable once circle is selected ', async () => { + await moveToCircle() + const circleSnippet = + 'circle({ center = [318.33, 168.1], radius = 182.8 }, %)' + await editor.expectState({ + activeLines: ["constsketch002=startSketchOn('XZ')"], + highlightedCode: circleSnippet, + diagnostics: [], }) await test.step('check code model connection works and that button is still enable once circle is selected ', async () => { await moveToCircle() const circleSnippet = - 'circle({ center: [318.33, 168.1], radius: 182.8 }, %)' + 'circle({ center = [318.33, 168.1], radius = 182.8 }, %)' await editor.expectState({ - activeLines: [], + activeLines: ["constsketch002=startSketchOn('XZ')"], highlightedCode: circleSnippet, diagnostics: [], }) @@ -40,39 +66,42 @@ test( }) await expect(toolbar.extrudeButton).toBeEnabled() }) + await expect(toolbar.extrudeButton).toBeEnabled() + }) - await test.step('do extrude flow and check extrude code is added to editor', async () => { - await toolbar.extrudeButton.click() + await test.step('do extrude flow and check extrude code is added to editor', async () => { + await toolbar.extrudeButton.click() - await cmdBar.expectState({ - stage: 'arguments', - currentArgKey: 'distance', - currentArgValue: '5', - headerArguments: { Selection: '1 face', Distance: '' }, - highlightedHeaderArg: 'distance', - commandName: 'Extrude', - }) - await cmdBar.progressCmdBar() - - const expectString = 'extrude001 = extrude(5, sketch001)' - await editor.expectEditor.not.toContain(expectString) - - await cmdBar.expectState({ - stage: 'review', - headerArguments: { Selection: '1 face', Distance: '5' }, - commandName: 'Extrude', - }) - await cmdBar.progressCmdBar() - - await editor.expectEditor.toContain(expectString) + await cmdBar.expectState({ + stage: 'arguments', + currentArgKey: 'distance', + currentArgValue: '5', + headerArguments: { Selection: '1 face', Distance: '' }, + highlightedHeaderArg: 'distance', + commandName: 'Extrude', }) - } -) + await cmdBar.progressCmdBar() + + const expectString = 'extrude001 = extrude(5, sketch001)' + await editor.expectEditor.not.toContain(expectString) + + await cmdBar.expectState({ + stage: 'review', + headerArguments: { Selection: '1 face', Distance: '5' }, + commandName: 'Extrude', + }) + await cmdBar.progressCmdBar() + + await editor.expectEditor.toContain(expectString) + }) +}) test.describe('verify sketch on chamfer works', () => { + // TODO: fix this test on windows after the electron migration + test.skip(process.platform === 'win32', 'Skip on windows') const _sketchOnAChamfer = ( - app: AuthenticatedApp, + page: Page, editor: EditorFixture, toolbar: ToolbarFixture, scene: SceneFixture @@ -124,7 +153,7 @@ test.describe('verify sketch on chamfer works', () => { await toolbar.startSketchPlaneSelection() await clickChamfer() // timeout wait for engine animation is unavoidable - await app.page.waitForTimeout(600) + await page.waitForTimeout(1000) await editor.expectEditor.toContain(afterChamferSelectSnippet) }) await test.step('make sure a basic sketch can be added', async () => { @@ -135,7 +164,9 @@ test.describe('verify sketch on chamfer works', () => { pixelDiff: 50, }) await rectangle2ndClick() - await editor.expectEditor.toContain(afterRectangle2ndClickSnippet) + await editor.expectEditor.toContain(afterRectangle2ndClickSnippet, { + shouldNormalise: true, + }) }) await test.step('Clean up so that `_sketchOnAChamfer` util can be called again', async () => { @@ -150,35 +181,45 @@ test.describe('verify sketch on chamfer works', () => { }) }) } - test( - 'works on all edge selections and can break up multi edges in a chamfer array', - { tag: ['@skipWin'] }, - async ({ app, editor, toolbar, scene }) => { - test.skip( - process.platform === 'win32', - 'Fails on windows in CI, can not be replicated locally on windows.' - ) - const file = await app.getInputFile('e2e-can-sketch-on-chamfer.kcl') - await app.initialise(file) + test('works on all edge selections and can break up multi edges in a chamfer array', async ({ + context, + page, + homePage, + editor, + toolbar, + scene, + }) => { + const file = await fs.readFile( + path.resolve( + __dirname, + '../../', + './src/wasm-lib/tests/executor/inputs/e2e-can-sketch-on-chamfer.kcl' + ), + 'utf-8' + ) + await context.addInitScript((file) => { + localStorage.setItem('persistCode', file) + }, file) + await page.setBodyDimensions({ width: 1000, height: 500 }) + await homePage.goToModelingScene() - const sketchOnAChamfer = _sketchOnAChamfer(app, editor, toolbar, scene) + const sketchOnAChamfer = _sketchOnAChamfer(page, editor, toolbar, scene) - await sketchOnAChamfer({ - clickCoords: { x: 570, y: 220 }, - cameraPos: { x: 16020, y: -2000, z: 10500 }, - cameraTarget: { x: -150, y: -4500, z: -80 }, - beforeChamferSnippet: `angledLine([segAng(rectangleSegmentA001)-90,217.26],%,$seg01) - chamfer({length:30,tags:[ + await sketchOnAChamfer({ + clickCoords: { x: 570, y: 220 }, + cameraPos: { x: 16020, y: -2000, z: 10500 }, + cameraTarget: { x: -150, y: -4500, z: -80 }, + beforeChamferSnippet: `angledLine([segAng(rectangleSegmentA001)-90,217.26],%,$seg01) + chamfer({length = 30,tags = [ seg01, getNextAdjacentEdge(yo), getNextAdjacentEdge(seg02), getOppositeEdge(seg01) ]}, %)`, - afterChamferSelectSnippet: - 'sketch002 = startSketchOn(extrude001, seg03)', - afterRectangle1stClickSnippet: 'startProfileAt([205.96, 254.59], %)', - afterRectangle2ndClickSnippet: `angledLine([0, 11.39], %, $rectangleSegmentA002) + afterChamferSelectSnippet: 'sketch002 = startSketchOn(extrude001, seg03)', + afterRectangle1stClickSnippet: 'startProfileAt([205.96, 254.59], %)', + afterRectangle2ndClickSnippet: `angledLine([0, 11.39], %, $rectangleSegmentA002) |> angledLine([ segAng(rectangleSegmentA002) - 90, 105.26 @@ -189,28 +230,27 @@ test.describe('verify sketch on chamfer works', () => { ], %, $rectangleSegmentC001) |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%)`, - }) + }) - await sketchOnAChamfer({ - clickCoords: { x: 690, y: 250 }, - cameraPos: { x: 16020, y: -2000, z: 10500 }, - cameraTarget: { x: -150, y: -4500, z: -80 }, - beforeChamferSnippet: `angledLine([ + await sketchOnAChamfer({ + clickCoords: { x: 690, y: 250 }, + cameraPos: { x: 16020, y: -2000, z: 10500 }, + cameraTarget: { x: -150, y: -4500, z: -80 }, + beforeChamferSnippet: `angledLine([ segAng(rectangleSegmentA001) - 90, 217.26 ], %, $seg01)chamfer({ - length: 30, - tags: [ + length = 30, + tags = [ seg01, getNextAdjacentEdge(yo), getNextAdjacentEdge(seg02) ] }, %)`, - afterChamferSelectSnippet: - 'sketch003 = startSketchOn(extrude001, seg04)', - afterRectangle1stClickSnippet: 'startProfileAt([-209.64, 255.28], %)', - afterRectangle2ndClickSnippet: `angledLine([0, 11.56], %, $rectangleSegmentA003) + afterChamferSelectSnippet: 'sketch003 = startSketchOn(extrude001, seg04)', + afterRectangle1stClickSnippet: 'startProfileAt([-209.64, 255.28], %)', + afterRectangle2ndClickSnippet: `angledLine([0, 11.56], %, $rectangleSegmentA003) |> angledLine([ segAng(rectangleSegmentA003) - 90, 106.84 @@ -221,22 +261,21 @@ test.describe('verify sketch on chamfer works', () => { ], %, $rectangleSegmentC002) |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%)`, - }) - await sketchOnAChamfer({ - clickCoords: { x: 677, y: 87 }, - cameraPos: { x: -6200, y: 1500, z: 6200 }, - cameraTarget: { x: 8300, y: 1100, z: 4800 }, - beforeChamferSnippet: `angledLine([0, 268.43], %, $rectangleSegmentA001)chamfer({ - length: 30, - tags: [ + }) + await sketchOnAChamfer({ + clickCoords: { x: 677, y: 87 }, + cameraPos: { x: -6200, y: 1500, z: 6200 }, + cameraTarget: { x: 8300, y: 1100, z: 4800 }, + beforeChamferSnippet: `angledLine([0, 268.43], %, $rectangleSegmentA001)chamfer({ + length = 30, + tags = [ getNextAdjacentEdge(yo), getNextAdjacentEdge(seg02) ] }, %)`, - afterChamferSelectSnippet: - 'sketch003 = startSketchOn(extrude001, seg04)', - afterRectangle1stClickSnippet: 'startProfileAt([-209.64, 255.28], %)', - afterRectangle2ndClickSnippet: `angledLine([0, 11.56], %, $rectangleSegmentA003) + afterChamferSelectSnippet: 'sketch003 = startSketchOn(extrude001, seg04)', + afterRectangle1stClickSnippet: 'startProfileAt([75.8, 317.2], %)', + afterRectangle2ndClickSnippet: `angledLine([0, 11.56], %, $rectangleSegmentA003) |> angledLine([ segAng(rectangleSegmentA003) - 90, 106.84 @@ -247,20 +286,19 @@ test.describe('verify sketch on chamfer works', () => { ], %, $rectangleSegmentC002) |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%)`, - }) - /// last one - await sketchOnAChamfer({ - clickCoords: { x: 620, y: 300 }, - cameraPos: { x: -1100, y: -7700, z: 1600 }, - cameraTarget: { x: 1450, y: 670, z: 4000 }, - beforeChamferSnippet: `chamfer({ - length: 30, - tags: [getNextAdjacentEdge(yo)] + }) + /// last one + await sketchOnAChamfer({ + clickCoords: { x: 620, y: 300 }, + cameraPos: { x: -1100, y: -7700, z: 1600 }, + cameraTarget: { x: 1450, y: 670, z: 4000 }, + beforeChamferSnippet: `chamfer({ + length = 30, + tags = [getNextAdjacentEdge(yo)] }, %)`, - afterChamferSelectSnippet: - 'sketch005 = startSketchOn(extrude001, seg06)', - afterRectangle1stClickSnippet: 'startProfileAt([-23.43, 19.69], %)', - afterRectangle2ndClickSnippet: `angledLine([0, 9.1], %, $rectangleSegmentA005) + afterChamferSelectSnippet: 'sketch005 = startSketchOn(extrude001, seg06)', + afterRectangle1stClickSnippet: 'startProfileAt([-23.43, 19.69], %)', + afterRectangle2ndClickSnippet: `angledLine([0, 9.1], %, $rectangleSegmentA005) |> angledLine([ segAng(rectangleSegmentA005) - 90, @@ -272,11 +310,11 @@ test.describe('verify sketch on chamfer works', () => { ], %, $rectangleSegmentC004) |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%)`, - }) + }) - await test.step('verify at the end of the test that final code is what is expected', async () => { - await editor.expectEditor.toContain( - `sketch001 = startSketchOn('XZ') + await test.step('verify at the end of the test that final code is what is expected', async () => { + await editor.expectEditor.toContain( + `sketch001 = startSketchOn('XZ') |> startProfileAt([75.8, 317.2], %) // [$startCapTag, $EndCapTag] |> angledLine([0, 268.43], %, $rectangleSegmentA001) @@ -292,20 +330,20 @@ test.describe('verify sketch on chamfer works', () => { |> close(%) extrude001 = extrude(100, sketch001) |> chamfer({ - length: 30, - tags: [getOppositeEdge(seg01)] + length = 30, + tags = [getOppositeEdge(seg01)] }, %, $seg03) - |> chamfer({ length: 30, tags: [seg01] }, %, $seg04) + |> chamfer({ length = 30, tags = [seg01] }, %, $seg04) |> chamfer({ - length: 30, - tags: [getNextAdjacentEdge(seg02)] + length = 30, + tags = [getNextAdjacentEdge(seg02)] }, %, $seg05) |> chamfer({ - length: 30, - tags: [getNextAdjacentEdge(yo)] + length = 30, + tags = [getNextAdjacentEdge(yo)] }, %, $seg06) sketch005 = startSketchOn(extrude001, seg06) - |> startProfileAt([-23.43, 19.69], %) + |> startProfileAt([-23.43,19.69], %) |> angledLine([0, 9.1], %, $rectangleSegmentA005) |> angledLine([ segAng(rectangleSegmentA005) - 90, @@ -318,7 +356,7 @@ test.describe('verify sketch on chamfer works', () => { |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%) sketch004 = startSketchOn(extrude001, seg05) - |> startProfileAt([82.57, 322.96], %) + |> startProfileAt([82.57,322.96], %) |> angledLine([0, 11.16], %, $rectangleSegmentA004) |> angledLine([ segAng(rectangleSegmentA004) - 90, @@ -331,7 +369,7 @@ test.describe('verify sketch on chamfer works', () => { |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%) sketch003 = startSketchOn(extrude001, seg04) - |> startProfileAt([-209.64, 255.28], %) + |> startProfileAt([-209.64,255.28], %) |> angledLine([0, 11.56], %, $rectangleSegmentA003) |> angledLine([ segAng(rectangleSegmentA003) - 90, @@ -344,7 +382,7 @@ test.describe('verify sketch on chamfer works', () => { |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%) sketch002 = startSketchOn(extrude001, seg03) - |> startProfileAt([205.96, 254.59], %) + |> startProfileAt([205.96,254.59], %) |> angledLine([0, 11.39], %, $rectangleSegmentA002) |> angledLine([ segAng(rectangleSegmentA002) - 90, @@ -357,43 +395,50 @@ test.describe('verify sketch on chamfer works', () => { |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%) `, - { shouldNormalise: true } - ) - }) - } - ) - - test( - 'Works on chamfers that are non in a pipeExpression can break up multi edges in a chamfer array', - { tag: ['@skipWin'] }, - async ({ app, editor, toolbar, scene }) => { - test.skip( - process.platform === 'win32', - 'Fails on windows in CI, can not be replicated locally on windows.' + { shouldNormalise: true } ) - const file = await app.getInputFile( - 'e2e-can-sketch-on-chamfer-no-pipeExpr.kcl' - ) - await app.initialise(file) + }) + }) - const sketchOnAChamfer = _sketchOnAChamfer(app, editor, toolbar, scene) + test('Works on chamfers that are non in a pipeExpression can break up multi edges in a chamfer array', async ({ + context, + page, + homePage, + editor, + toolbar, + scene, + }) => { + const file = await fs.readFile( + path.resolve( + __dirname, + '../../', + './src/wasm-lib/tests/executor/inputs/e2e-can-sketch-on-chamfer-no-pipeExpr.kcl' + ), + 'utf-8' + ) + await context.addInitScript((file) => { + localStorage.setItem('persistCode', file) + }, file) + await page.setBodyDimensions({ width: 1000, height: 500 }) + await homePage.goToModelingScene() - await sketchOnAChamfer({ - clickCoords: { x: 570, y: 220 }, - cameraPos: { x: 16020, y: -2000, z: 10500 }, - cameraTarget: { x: -150, y: -4500, z: -80 }, - beforeChamferSnippet: `angledLine([segAng(rectangleSegmentA001)-90,217.26],%,$seg01) - chamfer({length:30,tags:[ + const sketchOnAChamfer = _sketchOnAChamfer(page, editor, toolbar, scene) + + await sketchOnAChamfer({ + clickCoords: { x: 570, y: 220 }, + cameraPos: { x: 16020, y: -2000, z: 10500 }, + cameraTarget: { x: -150, y: -4500, z: -80 }, + beforeChamferSnippet: `angledLine([segAng(rectangleSegmentA001)-90,217.26],%,$seg01) + chamfer({length=30,tags=[ seg01, getNextAdjacentEdge(yo), getNextAdjacentEdge(seg02), getOppositeEdge(seg01) ]}, extrude001)`, - beforeChamferSnippetEnd: '}, extrude001)', - afterChamferSelectSnippet: - 'sketch002 = startSketchOn(extrude001, seg03)', - afterRectangle1stClickSnippet: 'startProfileAt([205.96, 254.59], %)', - afterRectangle2ndClickSnippet: `angledLine([0, 11.39], %, $rectangleSegmentA002) + beforeChamferSnippetEnd: '}, extrude001)', + afterChamferSelectSnippet: 'sketch002 = startSketchOn(extrude001, seg03)', + afterRectangle1stClickSnippet: 'startProfileAt([205.96, 254.59], %)', + afterRectangle2ndClickSnippet: `angledLine([0, 11.39], %, $rectangleSegmentA002) |> angledLine([ segAng(rectangleSegmentA002) - 90, 105.26 @@ -404,9 +449,9 @@ test.describe('verify sketch on chamfer works', () => { ], %, $rectangleSegmentC001) |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%)`, - }) - await editor.expectEditor.toContain( - `sketch001 = startSketchOn('XZ') + }) + await editor.expectEditor.toContain( + `sketch001 = startSketchOn('XZ') |> startProfileAt([75.8, 317.2], %) |> angledLine([0, 268.43], %, $rectangleSegmentA001) |> angledLine([ @@ -421,12 +466,12 @@ test.describe('verify sketch on chamfer works', () => { |> close(%) extrude001 = extrude(100, sketch001) chamf = chamfer({ - length: 30, - tags: [getOppositeEdge(seg01)] + length = 30, + tags = [getOppositeEdge(seg01)] }, extrude001, $seg03) |> chamfer({ - length: 30, - tags: [ + length = 30, + tags = [ seg01, getNextAdjacentEdge(yo), getNextAdjacentEdge(seg02) @@ -446,8 +491,543 @@ sketch002 = startSketchOn(extrude001, seg03) |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%) `, - { shouldNormalise: true } - ) - } - ) + { shouldNormalise: true } + ) + }) +}) + +test(`Verify axis, origin, and horizontal snapping`, async ({ + page, + homePage, + editor, + toolbar, + scene, +}) => { + const viewPortSize = { width: 1200, height: 500 } + + await page.setBodyDimensions(viewPortSize) + + await homePage.goToModelingScene() + + // Constants and locators + // These are mappings from screenspace to KCL coordinates, + // until we merge in our coordinate system helpers + const xzPlane = [ + viewPortSize.width * 0.65, + viewPortSize.height * 0.3, + ] as const + const originSloppy = { + screen: [ + viewPortSize.width / 2 + 3, // 3px off the center of the screen + viewPortSize.height / 2, + ], + kcl: [0, 0], + } as const + const xAxisSloppy = { + screen: [ + viewPortSize.width * 0.75, + viewPortSize.height / 2 - 3, // 3px off the X-axis + ], + kcl: [20.34, 0], + } as const + const offYAxis = { + screen: [ + viewPortSize.width * 0.6, // Well off the Y-axis, out of snapping range + viewPortSize.height * 0.3, + ], + kcl: [8.14, 6.78], + } as const + const yAxisSloppy = { + screen: [ + viewPortSize.width / 2 + 5, // 5px off the Y-axis + viewPortSize.height * 0.3, + ], + kcl: [0, 6.78], + } as const + const [clickOnXzPlane, moveToXzPlane] = scene.makeMouseHelpers(...xzPlane) + const [clickOriginSloppy] = scene.makeMouseHelpers(...originSloppy.screen) + const [clickXAxisSloppy, moveXAxisSloppy] = scene.makeMouseHelpers( + ...xAxisSloppy.screen + ) + const [dragToOffYAxis, dragFromOffAxis] = scene.makeDragHelpers( + ...offYAxis.screen + ) + + const expectedCodeSnippets = { + sketchOnXzPlane: `sketch001 = startSketchOn('XZ')`, + pointAtOrigin: `startProfileAt([${originSloppy.kcl[0]}, ${originSloppy.kcl[1]}], %)`, + segmentOnXAxis: `xLine(${xAxisSloppy.kcl[0]}, %)`, + afterSegmentDraggedOffYAxis: `startProfileAt([${offYAxis.kcl[0]}, ${offYAxis.kcl[1]}], %)`, + afterSegmentDraggedOnYAxis: `startProfileAt([${yAxisSloppy.kcl[0]}, ${yAxisSloppy.kcl[1]}], %)`, + } + + await test.step(`Start a sketch on the XZ plane`, async () => { + await editor.closePane() + await toolbar.startSketchPlaneSelection() + await moveToXzPlane() + await clickOnXzPlane() + // timeout wait for engine animation is unavoidable + await page.waitForTimeout(600) + await editor.expectEditor.toContain(expectedCodeSnippets.sketchOnXzPlane) + }) + await test.step(`Place a point a few pixels off the middle, verify it still snaps to 0,0`, async () => { + await clickOriginSloppy() + await editor.expectEditor.toContain(expectedCodeSnippets.pointAtOrigin) + }) + await test.step(`Add a segment on x-axis after moving the mouse a bit, verify it snaps`, async () => { + await moveXAxisSloppy() + await clickXAxisSloppy() + await editor.expectEditor.toContain(expectedCodeSnippets.segmentOnXAxis) + }) + await test.step(`Unequip line tool`, async () => { + await toolbar.lineBtn.click() + await expect(toolbar.lineBtn).not.toHaveAttribute('aria-pressed', 'true') + }) + await test.step(`Drag the origin point up and to the right, verify it's past snapping`, async () => { + await dragToOffYAxis({ + fromPoint: { x: originSloppy.screen[0], y: originSloppy.screen[1] }, + }) + await editor.expectEditor.toContain( + expectedCodeSnippets.afterSegmentDraggedOffYAxis + ) + }) + await test.step(`Drag the origin point left to the y-axis, verify it snaps back`, async () => { + await dragFromOffAxis({ + toPoint: { x: yAxisSloppy.screen[0], y: yAxisSloppy.screen[1] }, + }) + await editor.expectEditor.toContain( + expectedCodeSnippets.afterSegmentDraggedOnYAxis + ) + }) +}) + +test(`Verify user can double-click to edit a sketch`, async ({ + context, + page, + homePage, + editor, + toolbar, + scene, +}) => { + const u = await getUtils(page) + + const initialCode = `closedSketch = startSketchOn('XZ') + |> circle({ center = [8, 5], radius = 2 }, %) +openSketch = startSketchOn('XY') + |> startProfileAt([-5, 0], %) + |> lineTo([0, 5], %) + |> xLine(5, %) + |> tangentialArcTo([10, 0], %) +` + const viewPortSize = { width: 1000, height: 500 } + await page.setBodyDimensions(viewPortSize) + + await context.addInitScript((code) => { + localStorage.setItem('persistCode', code) + }, initialCode) + + await homePage.goToModelingScene() + await u.waitForPageLoad() + await page.waitForTimeout(1000) + + const pointInsideCircle = { + x: viewPortSize.width * 0.63, + y: viewPortSize.height * 0.5, + } + const pointOnPathAfterSketching = { + x: viewPortSize.width * 0.65, + y: viewPortSize.height * 0.5, + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [_clickOpenPath, moveToOpenPath, dblClickOpenPath] = + scene.makeMouseHelpers( + pointOnPathAfterSketching.x, + pointOnPathAfterSketching.y + ) + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [_clickCircle, moveToCircle, dblClickCircle] = scene.makeMouseHelpers( + pointInsideCircle.x, + pointInsideCircle.y + ) + + const exitSketch = async () => { + await test.step(`Exit sketch mode`, async () => { + await toolbar.exitSketchBtn.click() + await expect(toolbar.exitSketchBtn).not.toBeVisible() + await expect(toolbar.startSketchBtn).toBeEnabled() + }) + } + + await test.step(`Double-click on the closed sketch`, async () => { + await moveToCircle() + await dblClickCircle() + await expect(toolbar.startSketchBtn).not.toBeVisible() + await expect(toolbar.exitSketchBtn).toBeVisible() + await editor.expectState({ + activeLines: [`|>circle({center=[8,5],radius=2},%)`], + highlightedCode: 'circle({center=[8,5],radius=2},%)', + diagnostics: [], + }) + }) + await page.waitForTimeout(1000) + + await exitSketch() + await page.waitForTimeout(1000) + + // Drag the sketch line out of the axis view which blocks the click + await page.dragAndDrop('#stream', '#stream', { + sourcePosition: { + x: viewPortSize.width * 0.7, + y: viewPortSize.height * 0.5, + }, + targetPosition: { + x: viewPortSize.width * 0.7, + y: viewPortSize.height * 0.4, + }, + }) + + await page.waitForTimeout(500) + + await test.step(`Double-click on the open sketch`, async () => { + await moveToOpenPath() + await scene.expectPixelColor([250, 250, 250], pointOnPathAfterSketching, 15) + // There is a full execution after exiting sketch that clears the scene. + await page.waitForTimeout(500) + await dblClickOpenPath() + await expect(toolbar.startSketchBtn).not.toBeVisible() + await expect(toolbar.exitSketchBtn).toBeVisible() + // Wait for enter sketch mode to complete + await page.waitForTimeout(500) + await editor.expectState({ + activeLines: [`|>tangentialArcTo([10,0],%)`], + highlightedCode: 'tangentialArcTo([10,0],%)', + diagnostics: [], + }) + }) +}) + +test(`Offset plane point-and-click`, async ({ + context, + page, + homePage, + scene, + editor, + toolbar, + cmdBar, +}) => { + // One dumb hardcoded screen pixel value + const testPoint = { x: 700, y: 150 } + const [clickOnXzPlane] = scene.makeMouseHelpers(testPoint.x, testPoint.y) + const expectedOutput = `plane001 = offsetPlane('XZ', 5)` + + await homePage.goToModelingScene() + + await test.step(`Look for the blue of the XZ plane`, async () => { + await scene.expectPixelColor([50, 51, 96], testPoint, 15) + }) + await test.step(`Go through the command bar flow`, async () => { + await toolbar.offsetPlaneButton.click() + await cmdBar.expectState({ + stage: 'arguments', + currentArgKey: 'plane', + currentArgValue: '', + headerArguments: { Plane: '', Distance: '' }, + highlightedHeaderArg: 'plane', + commandName: 'Offset plane', + }) + await clickOnXzPlane() + await cmdBar.expectState({ + stage: 'arguments', + currentArgKey: 'distance', + currentArgValue: '5', + headerArguments: { Plane: '1 plane', Distance: '' }, + highlightedHeaderArg: 'distance', + commandName: 'Offset plane', + }) + await cmdBar.progressCmdBar() + }) + + await test.step(`Confirm code is added to the editor, scene has changed`, async () => { + await editor.expectEditor.toContain(expectedOutput) + await editor.expectState({ + diagnostics: [], + activeLines: [expectedOutput], + highlightedCode: '', + }) + await scene.expectPixelColor([74, 74, 74], testPoint, 15) + }) +}) + +const loftPointAndClickCases = [ + { shouldPreselect: true }, + { shouldPreselect: false }, +] +loftPointAndClickCases.forEach(({ shouldPreselect }) => { + test(`Loft point-and-click (preselected sketches: ${shouldPreselect})`, async ({ + context, + page, + homePage, + scene, + editor, + toolbar, + cmdBar, + }) => { + const initialCode = `sketch001 = startSketchOn('XZ') + |> circle({ center = [0, 0], radius = 30 }, %) + plane001 = offsetPlane('XZ', 50) + sketch002 = startSketchOn(plane001) + |> circle({ center = [0, 0], radius = 20 }, %) +` + await context.addInitScript((initialCode) => { + localStorage.setItem('persistCode', initialCode) + }, initialCode) + await page.setBodyDimensions({ width: 1000, height: 500 }) + await homePage.goToModelingScene() + + // One dumb hardcoded screen pixel value + const testPoint = { x: 575, y: 200 } + const [clickOnSketch1] = scene.makeMouseHelpers(testPoint.x, testPoint.y) + const [clickOnSketch2] = scene.makeMouseHelpers( + testPoint.x, + testPoint.y + 80 + ) + const loftDeclaration = 'loft001 = loft([sketch001, sketch002])' + + await test.step(`Look for the white of the sketch001 shape`, async () => { + await scene.expectPixelColor([254, 254, 254], testPoint, 15) + }) + + async function selectSketches() { + await clickOnSketch1() + await page.keyboard.down('Shift') + await clickOnSketch2() + await page.waitForTimeout(500) + await page.keyboard.up('Shift') + } + + if (!shouldPreselect) { + await test.step(`Go through the command bar flow without preselected sketches`, async () => { + await toolbar.loftButton.click() + await cmdBar.expectState({ + stage: 'arguments', + currentArgKey: 'selection', + currentArgValue: '', + headerArguments: { Selection: '' }, + highlightedHeaderArg: 'selection', + commandName: 'Loft', + }) + await selectSketches() + await cmdBar.progressCmdBar() + await cmdBar.expectState({ + stage: 'review', + headerArguments: { Selection: '2 faces' }, + commandName: 'Loft', + }) + await cmdBar.progressCmdBar() + }) + } else { + await test.step(`Preselect the two sketches`, async () => { + await selectSketches() + }) + + await test.step(`Go through the command bar flow with preselected sketches`, async () => { + await toolbar.loftButton.click() + await cmdBar.progressCmdBar() + await cmdBar.expectState({ + stage: 'review', + headerArguments: { Selection: '2 faces' }, + commandName: 'Loft', + }) + await cmdBar.progressCmdBar() + }) + } + + await test.step(`Confirm code is added to the editor, scene has changed`, async () => { + await editor.expectEditor.toContain(loftDeclaration) + await editor.expectState({ + diagnostics: [], + activeLines: [loftDeclaration], + highlightedCode: '', + }) + await scene.expectPixelColor([89, 89, 89], testPoint, 15) + }) + }) +}) + +const shellPointAndClickCapCases = [ + { shouldPreselect: true }, + { shouldPreselect: false }, +] +shellPointAndClickCapCases.forEach(({ shouldPreselect }) => { + test(`Shell point-and-click cap (preselected sketches: ${shouldPreselect})`, async ({ + context, + page, + homePage, + scene, + editor, + toolbar, + cmdBar, + }) => { + // TODO: fix this test on windows after the electron migration + test.skip(process.platform === 'win32', 'Skip on windows') + const initialCode = `sketch001 = startSketchOn('XZ') + |> circle({ center = [0, 0], radius = 30 }, %) + extrude001 = extrude(30, sketch001) + ` + await context.addInitScript((initialCode) => { + localStorage.setItem('persistCode', initialCode) + }, initialCode) + await page.setBodyDimensions({ width: 1000, height: 500 }) + await homePage.goToModelingScene() + + // One dumb hardcoded screen pixel value + const testPoint = { x: 575, y: 200 } + const [clickOnCap] = scene.makeMouseHelpers(testPoint.x, testPoint.y) + const shellDeclaration = + "shell001 = shell({ faces = ['end'], thickness = 5 }, extrude001)" + + await test.step(`Look for the grey of the shape`, async () => { + await scene.expectPixelColor([127, 127, 127], testPoint, 15) + }) + + if (!shouldPreselect) { + await test.step(`Go through the command bar flow without preselected faces`, async () => { + await toolbar.shellButton.click() + await cmdBar.expectState({ + stage: 'arguments', + currentArgKey: 'selection', + currentArgValue: '', + headerArguments: { + Selection: '', + Thickness: '', + }, + highlightedHeaderArg: 'selection', + commandName: 'Shell', + }) + await clickOnCap() + await page.waitForTimeout(500) + await cmdBar.progressCmdBar() + await cmdBar.progressCmdBar() + await cmdBar.expectState({ + stage: 'review', + headerArguments: { + Selection: '1 cap', + Thickness: '5', + }, + commandName: 'Shell', + }) + await cmdBar.progressCmdBar() + }) + } else { + await test.step(`Preselect the cap`, async () => { + await clickOnCap() + await page.waitForTimeout(500) + }) + + await test.step(`Go through the command bar flow with a preselected face (cap)`, async () => { + await toolbar.shellButton.click() + await cmdBar.progressCmdBar() + await cmdBar.progressCmdBar() + await cmdBar.expectState({ + stage: 'review', + headerArguments: { + Selection: '1 cap', + Thickness: '5', + }, + commandName: 'Shell', + }) + await cmdBar.progressCmdBar() + }) + } + + await test.step(`Confirm code is added to the editor, scene has changed`, async () => { + await editor.expectEditor.toContain(shellDeclaration) + await editor.expectState({ + diagnostics: [], + activeLines: [shellDeclaration], + highlightedCode: '', + }) + await scene.expectPixelColor([146, 146, 146], testPoint, 15) + }) + }) +}) + +test('Shell point-and-click wall', async ({ + context, + page, + homePage, + scene, + editor, + toolbar, + cmdBar, +}) => { + const initialCode = `sketch001 = startSketchOn('XY') + |> startProfileAt([-20, 20], %) + |> xLine(40, %) + |> yLine(-60, %) + |> xLine(-40, %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) +extrude001 = extrude(40, sketch001) + ` + await context.addInitScript((initialCode) => { + localStorage.setItem('persistCode', initialCode) + }, initialCode) + await page.setBodyDimensions({ width: 1000, height: 500 }) + await homePage.goToModelingScene() + + // One dumb hardcoded screen pixel value + const testPoint = { x: 580, y: 180 } + const [clickOnCap] = scene.makeMouseHelpers(testPoint.x, testPoint.y) + const [clickOnWall] = scene.makeMouseHelpers(testPoint.x, testPoint.y + 70) + const mutatedCode = 'xLine(-40, %, $seg01)' + const shellDeclaration = + "shell001 = shell({ faces = ['end', seg01], thickness = 5}, extrude001)" + const formattedOutLastLine = '}, extrude001)' + + await test.step(`Look for the grey of the shape`, async () => { + await scene.expectPixelColor([99, 99, 99], testPoint, 15) + }) + + await test.step(`Go through the command bar flow, selecting a wall and keeping default thickness`, async () => { + await toolbar.shellButton.click() + await cmdBar.expectState({ + stage: 'arguments', + currentArgKey: 'selection', + currentArgValue: '', + headerArguments: { + Selection: '', + Thickness: '', + }, + highlightedHeaderArg: 'selection', + commandName: 'Shell', + }) + await clickOnCap() + await page.keyboard.down('Shift') + await clickOnWall() + await page.waitForTimeout(500) + await page.keyboard.up('Shift') + await cmdBar.progressCmdBar() + await cmdBar.progressCmdBar() + await cmdBar.expectState({ + stage: 'review', + headerArguments: { + Selection: '1 cap, 1 face', + Thickness: '5', + }, + commandName: 'Shell', + }) + await cmdBar.progressCmdBar() + }) + + await test.step(`Confirm code is added to the editor, scene has changed`, async () => { + await editor.expectEditor.toContain(mutatedCode) + await editor.expectEditor.toContain(shellDeclaration) + await editor.expectState({ + diagnostics: [], + activeLines: [formattedOutLastLine], + highlightedCode: '', + }) + await scene.expectPixelColor([49, 49, 49], testPoint, 15) + }) }) diff --git a/e2e/playwright/projects.spec.ts b/e2e/playwright/projects.spec.ts index a27d26faf..7ecb99032 100644 --- a/e2e/playwright/projects.spec.ts +++ b/e2e/playwright/projects.spec.ts @@ -1,49 +1,41 @@ -import { test, expect } from '@playwright/test' +import { test, expect } from './zoo-test' import { doExport, executorInputPath, getUtils, isOutOfViewInScrollContainer, Paths, - setupElectron, - tearDown, - createProjectAndRenameIt, + createProject, + getPlaywrightDownloadDir, } from './test-utils' import fsp from 'fs/promises' import fs from 'fs' -import { join } from 'path' +import path from 'path' import { DEFAULT_PROJECT_KCL_FILE } from 'lib/constants' -test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) - test( 'projects reload if a new one is created, deleted, or renamed externally', { tag: '@electron' }, - async ({ browserName }, testInfo) => { + async ({ context, page }, testInfo) => { let externalCreatedProjectName = 'external-created-project' let targetDir = '' - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - targetDir = dir - setTimeout(() => { - const myDir = join(dir, externalCreatedProjectName) - ;(async () => { - await fsp.mkdir(myDir) - await fsp.writeFile( - join(myDir, DEFAULT_PROJECT_KCL_FILE), - 'sca ba be bop de day wawa skee' - ) - })().catch(console.error) - }, 5000) - }, + await context.folderSetupFn(async (dir) => { + targetDir = dir + setTimeout(() => { + const myDir = path.join(dir, externalCreatedProjectName) + ;(async () => { + await fsp.mkdir(myDir) + await fsp.writeFile( + path.join(myDir, DEFAULT_PROJECT_KCL_FILE), + 'sca ba be bop de day wawa skee' + ) + })().catch(console.error) + }, 5000) }) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) const projectLinks = page.getByTestId('project-link') @@ -51,34 +43,27 @@ test( await expect(projectLinks).toContainText(externalCreatedProjectName) await fsp.rename( - join(targetDir, externalCreatedProjectName), - join(targetDir, externalCreatedProjectName + '1') + path.join(targetDir, externalCreatedProjectName), + path.join(targetDir, externalCreatedProjectName + '1') ) externalCreatedProjectName += '1' await expect(projectLinks).toContainText(externalCreatedProjectName) - await fsp.rm(join(targetDir, externalCreatedProjectName), { + await fsp.rm(path.join(targetDir, externalCreatedProjectName), { recursive: true, force: true, }) await expect(projectLinks).toHaveCount(0) - - await electronApp.close() } ) test( 'click help/keybindings from home page', { tag: '@electron' }, - async ({ browserName }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async () => {}, - }) - - await page.setViewportSize({ width: 1200, height: 500 }) + async ({ page }, testInfo) => { + await page.setBodyDimensions({ width: 1200, height: 500 }) page.on('console', console.log) @@ -89,28 +74,23 @@ test( await page.getByTestId('keybindings-button').click() // Make sure the keyboard shortcuts modal is visible. await expect(page.getByText('Enter Sketch Mode')).toBeVisible() - - await electronApp.close() } ) test( 'click help/keybindings from project page', { tag: '@electron' }, - async ({ browserName }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - const bracketDir = join(dir, 'bracket') - await fsp.mkdir(bracketDir, { recursive: true }) - await fsp.copyFile( - executorInputPath('focusrite_scarlett_mounting_braket.kcl'), - join(bracketDir, 'main.kcl') - ) - }, + async ({ context, page }, testInfo) => { + await context.folderSetupFn(async (dir) => { + const bracketDir = path.join(dir, 'bracket') + await fsp.mkdir(bracketDir, { recursive: true }) + await fsp.copyFile( + executorInputPath('focusrite_scarlett_mounting_braket.kcl'), + path.join(bracketDir, 'main.kcl') + ) }) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) page.on('console', console.log) @@ -131,27 +111,324 @@ test( await page.getByTestId('keybindings-button').click() // Make sure the keyboard shortcuts modal is visible. await expect(page.getByText('Enter Sketch Mode')).toBeVisible() + } +) - await electronApp.close() +test( + 'yyyyyyyyy open a file in a project works and renders, open another file in different project with errors, it should clear the scene', + { tag: '@electron' }, + async ({ context, page }, testInfo) => { + await context.folderSetupFn(async (dir) => { + const bracketDir = path.join(dir, 'bracket') + await fsp.mkdir(bracketDir, { recursive: true }) + await fsp.copyFile( + executorInputPath('focusrite_scarlett_mounting_braket.kcl'), + path.join(bracketDir, 'main.kcl') + ) + const errorDir = path.join(dir, 'broken-code') + await fsp.mkdir(errorDir, { recursive: true }) + await fsp.copyFile( + executorInputPath('broken-code-test.kcl'), + path.join(errorDir, 'main.kcl') + ) + }) + + await page.setBodyDimensions({ width: 1200, height: 500 }) + const u = await getUtils(page) + + page.on('console', console.log) + + const pointOnModel = { x: 630, y: 280 } + + await test.step('Opening the bracket project should load the stream', async () => { + // expect to see the text bracket + await expect(page.getByText('bracket')).toBeVisible() + + await page.getByText('bracket').click() + + await expect(page.getByTestId('loading')).toBeAttached() + await expect(page.getByTestId('loading')).not.toBeAttached({ + timeout: 20_000, + }) + + await expect( + page.getByRole('button', { name: 'Start Sketch' }) + ).toBeEnabled({ + timeout: 20_000, + }) + + // gray at this pixel means the stream has loaded in the most + // user way we can verify it (pixel color) + await expect + .poll(() => u.getGreatestPixDiff(pointOnModel, [85, 85, 85]), { + timeout: 10_000, + }) + .toBeLessThan(15) + }) + + await test.step('Clicking the logo takes us back to the projects page / home', async () => { + await page.getByTestId('app-logo').click() + + await expect(page.getByRole('link', { name: 'bracket' })).toBeVisible() + await expect(page.getByText('broken-code')).toBeVisible() + await expect(page.getByText('bracket')).toBeVisible() + await expect(page.getByText('New Project')).toBeVisible() + }) + await test.step('opening broken code project should clear the scene and show the error', async () => { + // Go back home. + await expect(page.getByText('broken-code')).toBeVisible() + + await page.getByText('broken-code').click() + + // error in guter + await expect(page.locator('.cm-lint-marker-error')).toBeVisible() + + // error text on hover + await page.hover('.cm-lint-marker-error') + const crypticErrorText = `Expected a tag declarator` + await expect(page.getByText(crypticErrorText).first()).toBeVisible() + + // black pixel means the scene has been cleared. + await expect + .poll(() => u.getGreatestPixDiff(pointOnModel, [30, 30, 30]), { + timeout: 10_000, + }) + .toBeLessThan(15) + }) + } +) + +test( + 'aaayyyyyyyy open a file in a project works and renders, open another file in different project that is empty, it should clear the scene', + { tag: '@electron' }, + async ({ context, page }, testInfo) => { + await context.folderSetupFn(async (dir) => { + const bracketDir = path.join(dir, 'bracket') + await fsp.mkdir(bracketDir, { recursive: true }) + await fsp.copyFile( + executorInputPath('focusrite_scarlett_mounting_braket.kcl'), + path.join(bracketDir, 'main.kcl') + ) + const emptyDir = path.join(dir, 'empty') + await fsp.mkdir(emptyDir, { recursive: true }) + await fsp.writeFile(path.join(emptyDir, 'main.kcl'), '') + }) + + await page.setBodyDimensions({ width: 1200, height: 500 }) + const u = await getUtils(page) + + page.on('console', console.log) + + const pointOnModel = { x: 630, y: 280 } + + await test.step('Opening the bracket project should load the stream', async () => { + // expect to see the text bracket + await expect(page.getByText('bracket')).toBeVisible() + + await page.getByText('bracket').click() + + await expect(page.getByTestId('loading')).toBeAttached() + await expect(page.getByTestId('loading')).not.toBeAttached({ + timeout: 20_000, + }) + + await expect( + page.getByRole('button', { name: 'Start Sketch' }) + ).toBeEnabled({ + timeout: 20_000, + }) + + // gray at this pixel means the stream has loaded in the most + // user way we can verify it (pixel color) + await expect + .poll(() => u.getGreatestPixDiff(pointOnModel, [85, 85, 85]), { + timeout: 10_000, + }) + .toBeLessThan(15) + }) + + await test.step('Clicking the logo takes us back to the projects page / home', async () => { + await page.getByTestId('app-logo').click() + + await expect(page.getByRole('link', { name: 'bracket' })).toBeVisible() + await expect(page.getByText('empty')).toBeVisible() + await expect(page.getByText('bracket')).toBeVisible() + await expect(page.getByText('New Project')).toBeVisible() + }) + await test.step('opening empty code project should clear the scene', async () => { + // Go back home. + await expect(page.getByText('empty')).toBeVisible() + + await page.getByText('empty').click() + + // Ensure the code is empty. + await expect(u.codeLocator).toContainText('') + expect(u.codeLocator.innerHTML.length).toBeLessThan(2) + + // planes colors means the scene has been cleared. + await expect + .poll(() => u.getGreatestPixDiff(pointOnModel, [92, 53, 53]), { + timeout: 10_000, + }) + .toBeLessThan(15) + }) + } +) + +test( + 'nooooooooooooo open a file in a project works and renders, open empty file, it should clear the scene', + { tag: '@electron' }, + async ({ context, page }, testInfo) => { + await context.folderSetupFn(async (dir) => { + const bracketDir = path.join(dir, 'bracket') + await fsp.mkdir(bracketDir, { recursive: true }) + await fsp.copyFile( + executorInputPath('focusrite_scarlett_mounting_braket.kcl'), + path.join(bracketDir, 'main.kcl') + ) + + await fsp.writeFile(path.join(bracketDir, 'empty.kcl'), '') + }) + + await page.setBodyDimensions({ width: 1200, height: 500 }) + const u = await getUtils(page) + + page.on('console', console.log) + + const pointOnModel = { x: 630, y: 280 } + + await test.step('Opening the bracket project should load the stream', async () => { + // expect to see the text bracket + await expect(page.getByText('bracket')).toBeVisible() + + await page.getByText('bracket').click() + + await expect( + page.getByRole('button', { name: 'Start Sketch' }) + ).toBeEnabled({ + timeout: 20_000, + }) + + // gray at this pixel means the stream has loaded in the most + // user way we can verify it (pixel color) + await expect + .poll(() => u.getGreatestPixDiff(pointOnModel, [85, 85, 85]), { + timeout: 10_000, + }) + .toBeLessThan(15) + }) + await test.step('creating a empty file should clear the scene', async () => { + // open the file pane. + await page.getByTestId('files-pane-button').click() + + // OPen the other file. + const file = page.getByRole('button', { name: 'empty.kcl' }) + await expect(file).toBeVisible() + + await file.click() + + // planes colors means the scene has been cleared. + await expect + .poll(() => u.getGreatestPixDiff(pointOnModel, [92, 53, 53]), { + timeout: 10_000, + }) + .toBeLessThan(15) + + // Ensure the code is empty. + await expect(u.codeLocator).toContainText('') + expect(u.codeLocator.innerHTML.length).toBeLessThan(2) + }) + } +) + +test( + 'open a file in a project works and renders, open another file in the same project with errors, it should clear the scene', + { tag: '@electron' }, + async ({ context, page }, testInfo) => { + await context.folderSetupFn(async (dir) => { + const bracketDir = path.join(dir, 'bracket') + await fsp.mkdir(bracketDir, { recursive: true }) + await fsp.copyFile( + executorInputPath('focusrite_scarlett_mounting_braket.kcl'), + path.join(bracketDir, 'main.kcl') + ) + await fsp.copyFile( + executorInputPath('broken-code-test.kcl'), + path.join(bracketDir, 'broken-code-test.kcl') + ) + }) + + await page.setBodyDimensions({ width: 1200, height: 500 }) + const u = await getUtils(page) + + const pointOnModel = { x: 630, y: 280 } + + await test.step('Opening the bracket project should load the stream', async () => { + // expect to see the text bracket + await expect(page.getByText('bracket')).toBeVisible() + + await page.getByText('bracket').click() + + await expect(page.getByTestId('loading')).toBeAttached() + await expect(page.getByTestId('loading')).not.toBeAttached({ + timeout: 20_000, + }) + + await expect( + page.getByRole('button', { name: 'Start Sketch' }) + ).toBeEnabled({ + timeout: 20_000, + }) + + // gray at this pixel means the stream has loaded in the most + // user way we can verify it (pixel color) + await expect + .poll(() => u.getGreatestPixDiff(pointOnModel, [85, 85, 85]), { + timeout: 10_000, + }) + .toBeLessThan(15) + }) + await test.step('opening broken code file should clear the scene and show the error', async () => { + // open the file pane. + await page.getByTestId('files-pane-button').click() + + // Open the other file. + const file = page.getByRole('button', { name: 'broken-code-test.kcl' }) + await expect(file).toBeVisible() + + await file.click() + + // error in guter + await expect(page.locator('.cm-lint-marker-error')).toBeVisible() + + // error text on hover + await page.hover('.cm-lint-marker-error') + const crypticErrorText = `Expected a tag declarator` + await expect(page.getByText(crypticErrorText).first()).toBeVisible() + + // black pixel means the scene has been cleared. + await expect + .poll(() => u.getGreatestPixDiff(pointOnModel, [30, 30, 30]), { + timeout: 10_000, + }) + .toBeLessThan(15) + }) } ) test( 'when code with error first loads you get errors in console', { tag: '@electron' }, - async ({ browserName }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - await fsp.mkdir(join(dir, 'broken-code'), { recursive: true }) - await fsp.copyFile( - executorInputPath('broken-code-test.kcl'), - join(dir, 'broken-code', 'main.kcl') - ) - }, + async ({ context, page }, testInfo) => { + await context.folderSetupFn(async (dir) => { + await fsp.mkdir(path.join(dir, 'broken-code'), { recursive: true }) + await fsp.copyFile( + executorInputPath('broken-code-test.kcl'), + path.join(dir, 'broken-code', 'main.kcl') + ) }) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) await expect(page.getByText('broken-code')).toBeVisible() @@ -169,8 +446,6 @@ test( await page.hover('.cm-lint-marker-error') const crypticErrorText = `Expected a tag declarator` await expect(page.getByText(crypticErrorText).first()).toBeVisible() - - await electronApp.close() } ) @@ -181,20 +456,17 @@ test.describe('Can export from electron app', () => { test( `Can export using ${method}`, { tag: '@electron' }, - async ({ browserName }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - const bracketDir = join(dir, 'bracket') - await fsp.mkdir(bracketDir, { recursive: true }) - await fsp.copyFile( - executorInputPath('focusrite_scarlett_mounting_braket.kcl'), - join(bracketDir, 'main.kcl') - ) - }, + async ({ context, page }, testInfo) => { + await context.folderSetupFn(async (dir) => { + const bracketDir = path.join(dir, 'bracket') + await fsp.mkdir(bracketDir, { recursive: true }) + await fsp.copyFile( + executorInputPath('focusrite_scarlett_mounting_braket.kcl'), + path.join(bracketDir, 'main.kcl') + ) }) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) const u = await getUtils(page) page.on('console', console.log) @@ -242,12 +514,17 @@ test.describe('Can export from electron app', () => { ) }) + const filepath = path.resolve( + getPlaywrightDownloadDir(page), + 'main.gltf' + ) + await test.step('Check the export size', async () => { await expect .poll( async () => { try { - const outputGltf = await fsp.readFile('output.gltf') + const outputGltf = await fsp.readFile(filepath) return outputGltf.byteLength } catch (e) { return 0 @@ -257,11 +534,9 @@ test.describe('Can export from electron app', () => { ) .toBeGreaterThan(300_000) - // clean up output.gltf - await fsp.rm('output.gltf') + // clean up exported file + await fsp.rm(filepath) }) - - await electronApp.close() } ) } @@ -269,38 +544,35 @@ test.describe('Can export from electron app', () => { test( 'Rename and delete projects, also spam arrow keys when renaming', { tag: '@electron' }, - async ({ browserName }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - await fsp.mkdir(`${dir}/router-template-slate`, { recursive: true }) - await fsp.copyFile( - 'src/wasm-lib/tests/executor/inputs/router-template-slate.kcl', - `${dir}/router-template-slate/main.kcl` - ) - const _1975 = new Date('1975-01-01T00:01:11') - fs.utimesSync(`${dir}/router-template-slate/main.kcl`, _1975, _1975) + async ({ context, page }, testInfo) => { + await context.folderSetupFn(async (dir) => { + await fsp.mkdir(`${dir}/router-template-slate`, { recursive: true }) + await fsp.copyFile( + 'src/wasm-lib/tests/executor/inputs/router-template-slate.kcl', + `${dir}/router-template-slate/main.kcl` + ) + const _1975 = new Date('1975-01-01T00:01:11') + fs.utimesSync(`${dir}/router-template-slate/main.kcl`, _1975, _1975) - await fsp.mkdir(`${dir}/bracket`, { recursive: true }) - await fsp.copyFile( - 'src/wasm-lib/tests/executor/inputs/focusrite_scarlett_mounting_braket.kcl', - `${dir}/bracket/main.kcl` - ) - const _1985 = new Date('1985-01-01T00:02:22') - fs.utimesSync(`${dir}/bracket/main.kcl`, _1985, _1985) + await fsp.mkdir(`${dir}/bracket`, { recursive: true }) + await fsp.copyFile( + 'src/wasm-lib/tests/executor/inputs/focusrite_scarlett_mounting_braket.kcl', + `${dir}/bracket/main.kcl` + ) + const _1985 = new Date('1985-01-01T00:02:22') + fs.utimesSync(`${dir}/bracket/main.kcl`, _1985, _1985) - await new Promise((r) => setTimeout(r, 1_000)) - await fsp.mkdir(`${dir}/lego`, { recursive: true }) - await fsp.copyFile( - 'src/wasm-lib/tests/executor/inputs/lego.kcl', - `${dir}/lego/main.kcl` - ) - const _1995 = new Date('1995-01-01T00:03:33') - fs.utimesSync(`${dir}/lego/main.kcl`, _1995, _1995) - }, + await new Promise((r) => setTimeout(r, 1_000)) + await fsp.mkdir(`${dir}/lego`, { recursive: true }) + await fsp.copyFile( + 'src/wasm-lib/tests/executor/inputs/lego.kcl', + `${dir}/lego/main.kcl` + ) + const _1995 = new Date('1995-01-01T00:03:33') + fs.utimesSync(`${dir}/lego/main.kcl`, _1995, _1995) }) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) page.on('console', console.log) @@ -465,26 +737,21 @@ test( // expect the name not to have changed await expect(page.getByText('bracket')).toBeVisible() }) - - await electronApp.close() } ) test( 'pressing "delete" on home screen should do nothing', { tag: '@electron' }, - async ({ browserName }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - await fsp.mkdir(`${dir}/router-template-slate`, { recursive: true }) - await fsp.copyFile( - 'src/wasm-lib/tests/executor/inputs/router-template-slate.kcl', - `${dir}/router-template-slate/main.kcl` - ) - }, + async ({ context, page }, testInfo) => { + await context.folderSetupFn(async (dir) => { + await fsp.mkdir(`${dir}/router-template-slate`, { recursive: true }) + await fsp.copyFile( + 'src/wasm-lib/tests/executor/inputs/router-template-slate.kcl', + `${dir}/router-template-slate/main.kcl` + ) }) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) page.on('console', console.log) @@ -498,39 +765,252 @@ test( // expect to still be on the home page await expect(page.getByText('router-template-slate')).toBeVisible() await expect(page.getByText('Your Projects')).toBeVisible() - - await electronApp.close() } ) +test.describe(`Project management commands`, () => { + test( + `Rename from project page`, + { tag: '@electron' }, + async ({ context, page }, testInfo) => { + const projectName = `my_project_to_rename` + await context.folderSetupFn(async (dir) => { + await fsp.mkdir(`${dir}/${projectName}`, { recursive: true }) + await fsp.copyFile( + 'src/wasm-lib/tests/executor/inputs/router-template-slate.kcl', + `${dir}/${projectName}/main.kcl` + ) + }) + const u = await getUtils(page) + + // Constants and locators + const projectHomeLink = page.getByTestId('project-link') + const commandButton = page.getByRole('button', { name: 'Commands' }) + const commandOption = page.getByRole('option', { name: 'rename project' }) + const projectNameOption = page.getByRole('option', { name: projectName }) + const projectRenamedName = `project-000` + // const projectMenuButton = page.getByTestId('project-sidebar-toggle') + const commandContinueButton = page.getByRole('button', { + name: 'Continue', + }) + const commandSubmitButton = page.getByRole('button', { + name: 'Submit command', + }) + const toastMessage = page.getByText(`Successfully renamed`) + + await test.step(`Setup`, async () => { + await page.setBodyDimensions({ width: 1200, height: 500 }) + page.on('console', console.log) + + await projectHomeLink.click() + await u.waitForPageLoad() + }) + + await test.step(`Run rename command via command palette`, async () => { + await commandButton.click() + await commandOption.click() + await projectNameOption.click() + + await expect(commandContinueButton).toBeVisible() + await commandContinueButton.click() + + await expect(commandSubmitButton).toBeVisible() + await commandSubmitButton.click() + + await expect(toastMessage).toBeVisible() + }) + + // TODO: in future I'd like the behavior to be to + // navigate to the new project's page directly, + // see ProjectContextProvider.tsx:158 + await test.step(`Check the project was renamed and we navigated home`, async () => { + await expect(projectHomeLink.first()).toBeVisible() + await expect(projectHomeLink.first()).toContainText(projectRenamedName) + }) + } + ) + + test( + `Delete from project page`, + { tag: '@electron' }, + async ({ context, page }, testInfo) => { + const projectName = `my_project_to_delete` + await context.folderSetupFn(async (dir) => { + await fsp.mkdir(`${dir}/${projectName}`, { recursive: true }) + await fsp.copyFile( + 'src/wasm-lib/tests/executor/inputs/router-template-slate.kcl', + `${dir}/${projectName}/main.kcl` + ) + }) + const u = await getUtils(page) + + // Constants and locators + const projectHomeLink = page.getByTestId('project-link') + const commandButton = page.getByRole('button', { name: 'Commands' }) + const commandOption = page.getByRole('option', { name: 'delete project' }) + const projectNameOption = page.getByRole('option', { name: projectName }) + const commandWarning = page.getByText('Are you sure you want to delete?') + const commandSubmitButton = page.getByRole('button', { + name: 'Submit command', + }) + const toastMessage = page.getByText(`Successfully deleted`) + const noProjectsMessage = page.getByText('No Projects found') + + await test.step(`Setup`, async () => { + await page.setBodyDimensions({ width: 1200, height: 500 }) + page.on('console', console.log) + + await projectHomeLink.click() + await u.waitForPageLoad() + }) + + await test.step(`Run delete command via command palette`, async () => { + await commandButton.click() + await commandOption.click() + await projectNameOption.click() + + await expect(commandWarning).toBeVisible() + await expect(commandSubmitButton).toBeVisible() + await commandSubmitButton.click() + + await expect(toastMessage).toBeVisible() + }) + + await test.step(`Check the project was deleted and we navigated home`, async () => { + await expect(noProjectsMessage).toBeVisible() + }) + } + ) + test( + `Rename from home page`, + { tag: '@electron' }, + async ({ context, page }, testInfo) => { + const projectName = `my_project_to_rename` + await context.folderSetupFn(async (dir) => { + await fsp.mkdir(`${dir}/${projectName}`, { recursive: true }) + await fsp.copyFile( + 'src/wasm-lib/tests/executor/inputs/router-template-slate.kcl', + `${dir}/${projectName}/main.kcl` + ) + }) + + // Constants and locators + const projectHomeLink = page.getByTestId('project-link') + const commandButton = page.getByRole('button', { name: 'Commands' }) + const commandOption = page.getByRole('option', { name: 'rename project' }) + const projectNameOption = page.getByRole('option', { name: projectName }) + const projectRenamedName = `project-000` + const commandContinueButton = page.getByRole('button', { + name: 'Continue', + }) + const commandSubmitButton = page.getByRole('button', { + name: 'Submit command', + }) + const toastMessage = page.getByText(`Successfully renamed`) + + await test.step(`Setup`, async () => { + await page.setBodyDimensions({ width: 1200, height: 500 }) + page.on('console', console.log) + await expect(projectHomeLink).toBeVisible() + }) + + await test.step(`Run rename command via command palette`, async () => { + await commandButton.click() + await commandOption.click() + await projectNameOption.click() + + await expect(commandContinueButton).toBeVisible() + await commandContinueButton.click() + + await expect(commandSubmitButton).toBeVisible() + await commandSubmitButton.click() + + await expect(toastMessage).toBeVisible() + }) + + await test.step(`Check the project was renamed`, async () => { + await expect( + page.getByRole('link', { name: projectRenamedName }) + ).toBeVisible() + await expect(projectHomeLink).not.toHaveText(projectName) + }) + } + ) + test( + `Delete from home page`, + { tag: '@electron' }, + async ({ context, page }, testInfo) => { + const projectName = `my_project_to_delete` + await context.folderSetupFn(async (dir) => { + await fsp.mkdir(`${dir}/${projectName}`, { recursive: true }) + await fsp.copyFile( + 'src/wasm-lib/tests/executor/inputs/router-template-slate.kcl', + `${dir}/${projectName}/main.kcl` + ) + }) + + // Constants and locators + const projectHomeLink = page.getByTestId('project-link') + const commandButton = page.getByRole('button', { name: 'Commands' }) + const commandOption = page.getByRole('option', { name: 'delete project' }) + const projectNameOption = page.getByRole('option', { name: projectName }) + const commandWarning = page.getByText('Are you sure you want to delete?') + const commandSubmitButton = page.getByRole('button', { + name: 'Submit command', + }) + const toastMessage = page.getByText(`Successfully deleted`) + const noProjectsMessage = page.getByText('No Projects found') + + await test.step(`Setup`, async () => { + await page.setBodyDimensions({ width: 1200, height: 500 }) + page.on('console', console.log) + await expect(projectHomeLink).toBeVisible() + }) + + await test.step(`Run delete command via command palette`, async () => { + await commandButton.click() + await commandOption.click() + await projectNameOption.click() + + await expect(commandWarning).toBeVisible() + await expect(commandSubmitButton).toBeVisible() + await commandSubmitButton.click() + + await expect(toastMessage).toBeVisible() + }) + + await test.step(`Check the project was deleted`, async () => { + await expect(projectHomeLink).not.toBeVisible() + await expect(noProjectsMessage).toBeVisible() + }) + } + ) +}) + test( 'File in the file pane should open with a single click', { tag: '@electron' }, - async ({ browserName }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - await fsp.mkdir(`${dir}/router-template-slate`, { recursive: true }) - await fsp.copyFile( - 'src/wasm-lib/tests/executor/inputs/router-template-slate.kcl', - `${dir}/router-template-slate/main.kcl` - ) - await fsp.copyFile( - 'src/wasm-lib/tests/executor/inputs/focusrite_scarlett_mounting_braket.kcl', - `${dir}/router-template-slate/otherThingToClickOn.kcl` - ) - }, + async ({ context, homePage, page }, testInfo) => { + const projectName = 'router-template-slate' + await context.folderSetupFn(async (dir) => { + await fsp.mkdir(`${dir}/${projectName}`, { recursive: true }) + await fsp.copyFile( + 'src/wasm-lib/tests/executor/inputs/router-template-slate.kcl', + `${dir}/${projectName}/main.kcl` + ) + await fsp.copyFile( + 'src/wasm-lib/tests/executor/inputs/focusrite_scarlett_mounting_braket.kcl', + `${dir}/${projectName}/otherThingToClickOn.kcl` + ) }) + const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) page.on('console', console.log) - await page.getByText('router-template-slate').click() - await expect(page.getByTestId('loading')).toBeAttached() - await expect(page.getByTestId('loading')).not.toBeAttached({ - timeout: 20_000, - }) + await page.getByText(projectName).click() + await u.waitForPageLoad() await expect(u.codeLocator).toContainText('routerDiameter') await expect(u.codeLocator).toContainText('templateGap') @@ -546,35 +1026,30 @@ test( await expect(u.codeLocator).toContainText( 'A mounting bracket for the Focusrite Scarlett Solo audio interface' ) - - await electronApp.close() } ) test( 'Nested directories in project without main.kcl do not create main.kcl', { tag: '@electron' }, - async ({ browserName }, testInfo) => { + async ({ context, page }, testInfo) => { let testDir: string | undefined - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - await fsp.mkdir(join(dir, 'router-template-slate', 'nested'), { - recursive: true, - }) - await fsp.copyFile( - executorInputPath('router-template-slate.kcl'), - join(dir, 'router-template-slate', 'nested', 'slate.kcl') - ) - await fsp.copyFile( - executorInputPath('focusrite_scarlett_mounting_braket.kcl'), - join(dir, 'router-template-slate', 'nested', 'bracket.kcl') - ) - testDir = dir - }, + await context.folderSetupFn(async (dir) => { + await fsp.mkdir(path.join(dir, 'router-template-slate', 'nested'), { + recursive: true, + }) + await fsp.copyFile( + executorInputPath('router-template-slate.kcl'), + path.join(dir, 'router-template-slate', 'nested', 'slate.kcl') + ) + await fsp.copyFile( + executorInputPath('focusrite_scarlett_mounting_braket.kcl'), + path.join(dir, 'router-template-slate', 'nested', 'bracket.kcl') + ) + testDir = dir }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) page.on('console', console.log) @@ -602,48 +1077,45 @@ test( if (testDir !== undefined) { // eslint-disable-next-line jest/no-conditional-expect await expect( - fsp.access(join(testDir, 'router-template-slate', 'main.kcl')) + fsp.access(path.join(testDir, 'router-template-slate', 'main.kcl')) ).rejects.toThrow() // eslint-disable-next-line jest/no-conditional-expect await expect( - fsp.access(join(testDir, 'router-template-slate', 'nested', 'main.kcl')) + fsp.access( + path.join(testDir, 'router-template-slate', 'nested', 'main.kcl') + ) ).rejects.toThrow() } - - await electronApp.close() } ) -test( +test.fixme( 'Deleting projects, can delete individual project, can still create projects after deleting all', { tag: '@electron' }, - async ({ browserName }, testInfo) => { + async ({ context, page }, testInfo) => { const projectData = [ ['router-template-slate', 'cylinder.kcl'], ['bracket', 'focusrite_scarlett_mounting_braket.kcl'], ['lego', 'lego.kcl'], ] - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - // Do these serially to ensure the order is correct - for (const [name, file] of projectData) { - await fsp.mkdir(join(dir, name), { recursive: true }) - await fsp.copyFile( - executorInputPath(file), - join(dir, name, `main.kcl`) - ) - // Wait 1s between each project to ensure the order is correct - await new Promise((r) => setTimeout(r, 1_000)) - } - }, + await context.folderSetupFn(async (dir) => { + // Do these serially to ensure the order is correct + for (const [name, file] of projectData) { + await fsp.mkdir(path.join(dir, name), { recursive: true }) + await fsp.copyFile( + executorInputPath(file), + path.join(dir, name, `main.kcl`) + ) + // Wait 1s between each project to ensure the order is correct + await new Promise((r) => setTimeout(r, 1_000)) + } }) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) page.on('console', console.log) await test.step('delete the middle project, i.e. the bracket project', async () => { - const project = page.getByText('bracket') + const project = page.getByTestId('project-link').getByText('bracket') await project.hover() await project.focus() @@ -687,41 +1159,36 @@ test( }) await test.step('Check we can still create a project', async () => { - await page.getByRole('button', { name: 'New project' }).click() - await expect(page.getByText('Successfully created')).toBeVisible() - await expect(page.getByText('Successfully created')).not.toBeVisible() - await expect(page.getByText('project-000')).toBeVisible() + await createProject({ name: 'project-000', page, returnHome: true }) + await expect( + page.getByTestId('project-link').filter({ hasText: 'project-000' }) + ).toBeVisible() }) - - await electronApp.close() } ) test( 'Can load a file with CRLF line endings', { tag: '@electron' }, - async ({ browserName }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - const routerTemplateDir = join(dir, 'router-template-slate') - await fsp.mkdir(routerTemplateDir, { recursive: true }) + async ({ context, page }, testInfo) => { + await context.folderSetupFn(async (dir) => { + const routerTemplateDir = path.join(dir, 'router-template-slate') + await fsp.mkdir(routerTemplateDir, { recursive: true }) - const file = await fsp.readFile( - executorInputPath('router-template-slate.kcl'), - 'utf-8' - ) - // Replace both \r optionally so we don't end up with \r\r\n - const fileWithCRLF = file.replace(/\r?\n/g, '\r\n') - await fsp.writeFile( - join(routerTemplateDir, 'main.kcl'), - fileWithCRLF, - 'utf-8' - ) - }, + const file = await fsp.readFile( + executorInputPath('router-template-slate.kcl'), + 'utf-8' + ) + // Replace both \r optionally so we don't end up with \r\r\n + const fileWithCRLF = file.replace(/\r?\n/g, '\r\n') + await fsp.writeFile( + path.join(routerTemplateDir, 'main.kcl'), + fileWithCRLF, + 'utf-8' + ) }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) page.on('console', console.log) @@ -734,37 +1201,32 @@ test( await expect(u.codeLocator).toContainText('routerDiameter') await expect(u.codeLocator).toContainText('templateGap') await expect(u.codeLocator).toContainText('minClampingDistance') - - await electronApp.close() } ) test( 'Can sort projects on home page', { tag: '@electron' }, - async ({ browserName }, testInfo) => { + async ({ context, page }, testInfo) => { const projectData = [ ['router-template-slate', 'cylinder.kcl'], ['bracket', 'focusrite_scarlett_mounting_braket.kcl'], ['lego', 'lego.kcl'], ] - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - // Do these serially to ensure the order is correct - for (const [name, file] of projectData) { - await fsp.mkdir(join(dir, name), { recursive: true }) - await fsp.copyFile( - executorInputPath(file), - join(dir, name, `main.kcl`) - ) - // Wait 1s between each project to ensure the order is correct - await new Promise((r) => setTimeout(r, 1_000)) - } - }, + await context.folderSetupFn(async (dir) => { + // Do these serially to ensure the order is correct + for (const [name, file] of projectData) { + await fsp.mkdir(path.join(dir, name), { recursive: true }) + await fsp.copyFile( + executorInputPath(file), + path.join(dir, name, `main.kcl`) + ) + // Wait 1s between each project to ensure the order is correct + await new Promise((r) => setTimeout(r, 1_000)) + } }) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) const getAllProjects = () => page.getByTestId('project-link').all() @@ -846,18 +1308,15 @@ test( ) } }) - - await electronApp.close() } ) test.fixme( 'When the project folder is empty, user can create new project and open it.', { tag: '@electron' }, - async ({ browserName }, testInfo) => { - const { electronApp, page } = await setupElectron({ testInfo }) + async ({ page }, testInfo) => { const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) page.on('console', console.log) @@ -867,17 +1326,16 @@ test.fixme( const pointOnModel = { x: 660, y: 250 } const expectedStartCamZPosition = 15633.47 + // Constants and locators + const projectLinks = page.getByTestId('project-link') + // expect to see text "No Projects found" await expect(page.getByText('No Projects found')).toBeVisible() - await page.getByRole('button', { name: 'New project' }).click() + await createProject({ name: 'project-000', page, returnHome: true }) + await expect(projectLinks.getByText('project-000')).toBeVisible() - await expect(page.getByText('Successfully created')).toBeVisible() - await expect(page.getByText('Successfully created')).not.toBeVisible() - - await expect(page.getByText('project-000')).toBeVisible() - - await page.getByText('project-000').click() + await projectLinks.getByText('project-000').click() await u.waitForPageLoad() @@ -936,60 +1394,50 @@ extrude001 = extrude(200, sketch001)`) page.getByRole('button', { name: 'New project' }) ).toBeVisible() - const createProject = async (projectNum: number) => { - await page.getByRole('button', { name: 'New project' }).click() - await expect(page.getByText('Successfully created')).toBeVisible() - await expect(page.getByText('Successfully created')).not.toBeVisible() - - const projectNumStr = projectNum.toString().padStart(3, '0') - await expect(page.getByText(`project-${projectNumStr}`)).toBeVisible() - } for (let i = 1; i <= 10; i++) { - await createProject(i) + const name = `project-${i.toString().padStart(3, '0')}` + await createProject({ name, page, returnHome: true }) + await expect(projectLinks.getByText(name)).toBeVisible() } - await electronApp.close() } ) test( 'Opening a project should successfully load the stream, (regression test that this also works when switching between projects)', { tag: '@electron' }, - async ({ browserName }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - await Promise.all([ - fsp.mkdir(join(dir, 'router-template-slate'), { recursive: true }), - fsp.mkdir(join(dir, 'bracket'), { recursive: true }), - ]) - await Promise.all([ - fsp.copyFile( - join( - 'src', - 'wasm-lib', - 'tests', - 'executor', - 'inputs', - 'router-template-slate.kcl' - ), - join(dir, 'router-template-slate', 'main.kcl') + async ({ context, page }, testInfo) => { + await context.folderSetupFn(async (dir) => { + await Promise.all([ + fsp.mkdir(path.join(dir, 'router-template-slate'), { recursive: true }), + fsp.mkdir(path.join(dir, 'bracket'), { recursive: true }), + ]) + await Promise.all([ + fsp.copyFile( + path.join( + 'src', + 'wasm-lib', + 'tests', + 'executor', + 'inputs', + 'router-template-slate.kcl' ), - fsp.copyFile( - join( - 'src', - 'wasm-lib', - 'tests', - 'executor', - 'inputs', - 'focusrite_scarlett_mounting_braket.kcl' - ), - join(dir, 'bracket', 'main.kcl') + path.join(dir, 'router-template-slate', 'main.kcl') + ), + fsp.copyFile( + path.join( + 'src', + 'wasm-lib', + 'tests', + 'executor', + 'inputs', + 'focusrite_scarlett_mounting_braket.kcl' ), - ]) - }, + path.join(dir, 'bracket', 'main.kcl') + ), + ]) }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) page.on('console', console.log) @@ -1048,35 +1496,30 @@ test( await expect(page.getByText('router-template-slate')).toBeVisible() await expect(page.getByText('New Project')).toBeVisible() }) - - await electronApp.close() } ) test( 'You can change the root projects directory and nothing is lost', { tag: '@electron' }, - async ({ browserName }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - await Promise.all([ - fsp.mkdir(`${dir}/router-template-slate`, { recursive: true }), - fsp.mkdir(`${dir}/bracket`, { recursive: true }), - ]) - await Promise.all([ - fsp.copyFile( - 'src/wasm-lib/tests/executor/inputs/router-template-slate.kcl', - `${dir}/router-template-slate/main.kcl` - ), - fsp.copyFile( - 'src/wasm-lib/tests/executor/inputs/focusrite_scarlett_mounting_braket.kcl', - `${dir}/bracket/main.kcl` - ), - ]) - }, + async ({ context, page, electronApp }, testInfo) => { + await context.folderSetupFn(async (dir) => { + await Promise.all([ + fsp.mkdir(`${dir}/router-template-slate`, { recursive: true }), + fsp.mkdir(`${dir}/bracket`, { recursive: true }), + ]) + await Promise.all([ + fsp.copyFile( + 'src/wasm-lib/tests/executor/inputs/router-template-slate.kcl', + `${dir}/router-template-slate/main.kcl` + ), + fsp.copyFile( + 'src/wasm-lib/tests/executor/inputs/focusrite_scarlett_mounting_braket.kcl', + `${dir}/bracket/main.kcl` + ), + ]) }) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) page.on('console', console.log) @@ -1102,8 +1545,7 @@ test( .locator('section#projectDirectory input') .inputValue() - // Can't use Playwright filechooser since this is happening in electron. - const handleFile = electronApp.evaluate( + const handleFile = electronApp?.evaluate( async ({ dialog }, filePaths) => { dialog.showOpenDialog = () => Promise.resolve({ canceled: false, filePaths }) @@ -1113,18 +1555,17 @@ test( await page.getByTestId('project-directory-button').click() await handleFile - await expect(page.locator('section#projectDirectory input')).toHaveValue( - newProjectDirName - ) + await expect + .poll(() => page.locator('section#projectDirectory input').inputValue()) + .toContain(newProjectDirName) await page.getByTestId('settings-close-button').click() await expect(page.getByText('No Projects found')).toBeVisible() - await page.getByRole('button', { name: 'New project' }).click() - await expect(page.getByText('Successfully created')).toBeVisible() - await expect(page.getByText('Successfully created')).not.toBeVisible() - - await expect(page.getByText(`project-000`)).toBeVisible() + await createProject({ name: 'project-000', page, returnHome: true }) + await expect( + page.getByTestId('project-link').filter({ hasText: 'project-000' }) + ).toBeVisible() }) await test.step('We can change back to the original root project directory', async () => { @@ -1134,7 +1575,7 @@ test( await page.getByTestId('project-directory-settings-link').click() - const handleFile = electronApp.evaluate( + const handleFile = electronApp?.evaluate( async ({ dialog }, filePaths) => { dialog.showOpenDialog = () => Promise.resolve({ canceled: false, filePaths }) @@ -1155,15 +1596,13 @@ test( await expect(page.getByText('bracket')).toBeVisible() await expect(page.getByText('router-template-slate')).toBeVisible() }) - - await electronApp.close() } ) test( 'Search projects on desktop home', { tag: '@electron' }, - async ({ browserName: _ }, testInfo) => { + async ({ context, page }, testInfo) => { const projectData = [ ['basic bracket', 'focusrite_scarlett_mounting_braket.kcl'], ['basic-cube', 'basic_fillet_cube_end.kcl'], @@ -1171,20 +1610,17 @@ test( ['router-template-slate', 'router-template-slate.kcl'], ['Ancient Temple Block', 'lego.kcl'], ] - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - // Do these serially to ensure the order is correct - for (const [name, file] of projectData) { - await fsp.mkdir(join(dir, name), { recursive: true }) - await fsp.copyFile( - executorInputPath(file), - join(dir, name, `main.kcl`) - ) - } - }, + await context.folderSetupFn(async (dir) => { + // Do these serially to ensure the order is correct + for (const [name, file] of projectData) { + await fsp.mkdir(path.join(dir, name), { recursive: true }) + await fsp.copyFile( + executorInputPath(file), + path.join(dir, name, `main.kcl`) + ) + } }) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) page.on('console', console.log) @@ -1216,91 +1652,86 @@ test( await expect(page.getByText(name)).toBeVisible() } }) - - await electronApp.close() } ) test( 'file pane is scrollable when there are many files', { tag: '@electron' }, - async ({ browserName }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - const testDir = join(dir, 'testProject') - await fsp.mkdir(testDir, { recursive: true }) - const fileNames = [ - 'angled_line.kcl', - 'basic_fillet_cube_close_opposite.kcl', - 'basic_fillet_cube_end.kcl', - 'basic_fillet_cube_next_adjacent.kcl', - 'basic_fillet_cube_previous_adjacent.kcl', - 'basic_fillet_cube_start.kcl', - 'big_number_angle_to_match_length_x.kcl', - 'big_number_angle_to_match_length_y.kcl', - 'close_arc.kcl', - 'computed_var.kcl', - 'cube-embedded.gltf', - 'cube.bin', - 'cube.glb', - 'cube.gltf', - 'cube.kcl', - 'cube.mtl', - 'cube.obj', - 'cylinder.kcl', - 'dimensions_match.kcl', - 'extrude-custom-plane.kcl', - 'extrude-inside-fn-with-tags.kcl', - 'fillet-and-shell.kcl', - 'fillet_duplicate_tags.kcl', - 'focusrite_scarlett_mounting_braket.kcl', - 'function_sketch.kcl', - 'function_sketch_with_position.kcl', - 'global-tags.kcl', - 'helix_ccw.kcl', - 'helix_defaults.kcl', - 'helix_defaults_negative_extrude.kcl', - 'helix_with_length.kcl', - 'i_shape.kcl', - 'kittycad_svg.kcl', - 'lego.kcl', - 'math.kcl', - 'member_expression_sketch.kcl', - 'mike_stress_test.kcl', - 'negative_args.kcl', - 'order-sketch-extrude-in-order.kcl', - 'order-sketch-extrude-out-of-order.kcl', - 'parametric.kcl', - 'parametric_with_tan_arc.kcl', - 'pattern_vase.kcl', - 'pentagon_fillet_sugar.kcl', - 'pipe_as_arg.kcl', - 'pipes_on_pipes.kcl', - 'riddle.kcl', - 'riddle_small.kcl', - 'router-template-slate.kcl', - 'scoped-tags.kcl', - 'server-rack-heavy.kcl', - 'server-rack-lite.kcl', - 'sketch_on_face.kcl', - 'sketch_on_face_circle_tagged.kcl', - 'sketch_on_face_end.kcl', - 'sketch_on_face_end_negative_extrude.kcl', - 'sketch_on_face_start.kcl', - 'tan_arc_x_line.kcl', - 'tangential_arc.kcl', - ] - for (const fileName of fileNames) { - await fsp.copyFile( - executorInputPath(fileName), - join(testDir, fileName) - ) - } - }, + async ({ context, page }, testInfo) => { + await context.folderSetupFn(async (dir) => { + const testDir = path.join(dir, 'testProject') + await fsp.mkdir(testDir, { recursive: true }) + const fileNames = [ + 'angled_line.kcl', + 'basic_fillet_cube_close_opposite.kcl', + 'basic_fillet_cube_end.kcl', + 'basic_fillet_cube_next_adjacent.kcl', + 'basic_fillet_cube_previous_adjacent.kcl', + 'basic_fillet_cube_start.kcl', + 'big_number_angle_to_match_length_x.kcl', + 'big_number_angle_to_match_length_y.kcl', + 'close_arc.kcl', + 'computed_var.kcl', + 'cube-embedded.gltf', + 'cube.bin', + 'cube.glb', + 'cube.gltf', + 'cube.kcl', + 'cube.mtl', + 'cube.obj', + 'cylinder.kcl', + 'dimensions_match.kcl', + 'extrude-custom-plane.kcl', + 'extrude-inside-fn-with-tags.kcl', + 'fillet-and-shell.kcl', + 'fillet_duplicate_tags.kcl', + 'focusrite_scarlett_mounting_braket.kcl', + 'function_sketch.kcl', + 'function_sketch_with_position.kcl', + 'global-tags.kcl', + 'helix_defaults.kcl', + 'helix_defaults_negative_extrude.kcl', + 'helix_with_length.kcl', + 'i_shape.kcl', + 'kittycad_svg.kcl', + 'lego.kcl', + 'lsystem.kcl', + 'math.kcl', + 'member_expression_sketch.kcl', + 'mike_stress_test.kcl', + 'negative_args.kcl', + 'order-sketch-extrude-in-order.kcl', + 'order-sketch-extrude-out-of-order.kcl', + 'parametric.kcl', + 'parametric_with_tan_arc.kcl', + 'pattern_vase.kcl', + 'pentagon_fillet_sugar.kcl', + 'pipe_as_arg.kcl', + 'pipes_on_pipes.kcl', + 'riddle.kcl', + 'riddle_small.kcl', + 'router-template-slate.kcl', + 'scoped-tags.kcl', + 'server-rack-heavy.kcl', + 'server-rack-lite.kcl', + 'sketch_on_face.kcl', + 'sketch_on_face_circle_tagged.kcl', + 'sketch_on_face_end.kcl', + 'sketch_on_face_end_negative_extrude.kcl', + 'sketch_on_face_start.kcl', + 'tan_arc_x_line.kcl', + 'tangential_arc.kcl', + ] + for (const fileName of fileNames) { + await fsp.copyFile( + executorInputPath(fileName), + path.join(testDir, fileName) + ) + } }) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) page.on('console', console.log) @@ -1326,30 +1757,25 @@ test( false ) }) - - await electronApp.close() } ) test( 'select all in code editor does not actually select all, just what is visible (regression)', { tag: '@electron' }, - async ({ browserName }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - // src/wasm-lib/tests/executor/inputs/mike_stress_test.kcl - const name = 'mike_stress_test' - const testDir = join(dir, name) - await fsp.mkdir(testDir, { recursive: true }) - await fsp.copyFile( - executorInputPath(`${name}.kcl`), - join(testDir, 'main.kcl') - ) - }, + async ({ context, page }, testInfo) => { + await context.folderSetupFn(async (dir) => { + // src/wasm-lib/tests/executor/inputs/mike_stress_test.kcl + const name = 'mike_stress_test' + const testDir = path.join(dir, name) + await fsp.mkdir(testDir, { recursive: true }) + await fsp.copyFile( + executorInputPath(`${name}.kcl`), + path.join(testDir, 'main.kcl') + ) }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) page.on('console', console.log) @@ -1389,20 +1815,15 @@ test( expect(selectedText.length).toBe(0) await expect(u.codeLocator).toHaveText('') }) - - await electronApp.close() } ) test( 'Settings persist across restarts', - { tag: '@electron' }, - async ({ browserName }, testInfo) => { + { tag: '@electron', cleanProjectDir: true }, + async ({ page }, testInfo) => { await test.step('We can change a user setting like theme', async () => { - const { electronApp, page } = await setupElectron({ - testInfo, - }) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) page.on('console', console.log) @@ -1413,44 +1834,30 @@ test( await expect(page.getByTestId('app-theme')).toHaveValue('dark') await page.getByTestId('app-theme').selectOption('light') - - await electronApp.close() }) await test.step('Starting the app again and we can see the same theme', async () => { - let { electronApp, page } = await setupElectron({ - testInfo, - cleanProjectDir: false, - }) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.reload() + await page.setBodyDimensions({ width: 1200, height: 500 }) page.on('console', console.log) - - await page.getByTestId('user-sidebar-toggle').click() - - await page.getByTestId('user-settings').click() - await expect(page.getByTestId('app-theme')).toHaveValue('light') - - await electronApp.close() }) } ) -test( +// Flaky +test.fixme( 'Original project name persist after onboarding', { tag: '@electron' }, - async ({ browserName }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - }) - await page.setViewportSize({ width: 1200, height: 500 }) + async ({ page }, testInfo) => { + await page.setBodyDimensions({ width: 1200, height: 500 }) const getAllProjects = () => page.getByTestId('project-link').all() page.on('console', console.log) await test.step('Should create and name a project called wrist brace', async () => { - await createProjectAndRenameIt({ name: 'wrist brace', page }) + await createProject({ name: 'wrist brace', page, returnHome: true }) }) await test.step('Should go through onboarding', async () => { @@ -1476,7 +1883,5 @@ test( await expect(projectLink).toContainText(projectNames[index]) } }) - - await electronApp.close() } ) diff --git a/e2e/playwright/prompt-to-edit.spec.ts b/e2e/playwright/prompt-to-edit.spec.ts new file mode 100644 index 000000000..69fb1b36e --- /dev/null +++ b/e2e/playwright/prompt-to-edit.spec.ts @@ -0,0 +1,190 @@ +import { test, expect } from './zoo-test' + +/* eslint-disable jest/no-conditional-expect */ + +const file = `sketch001 = startSketchOn('XZ') +profile001 = startProfileAt([57.81, 250.51], sketch001) + |> line([121.13, 56.63], %, $seg02) + |> line([83.37, -34.61], %, $seg01) + |> line([19.66, -116.4], %) + |> line([-221.8, -41.69], %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) +extrude001 = extrude(200, profile001) +sketch002 = startSketchOn('XZ') + |> startProfileAt([-73.64, -42.89], %) + |> xLine(173.71, %) + |> line([-22.12, -94.4], %) + |> xLine(-156.98, %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) +extrude002 = extrude(50, sketch002) +sketch003 = startSketchOn('XY') + |> startProfileAt([52.92, 157.81], %) + |> angledLine([0, 176.4], %, $rectangleSegmentA001) + |> angledLine([ + segAng(rectangleSegmentA001) - 90, + 53.4 + ], %, $rectangleSegmentB001) + |> angledLine([ + segAng(rectangleSegmentA001), + -segLen(rectangleSegmentA001) + ], %, $rectangleSegmentC001) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) +extrude003 = extrude(20, sketch003) +` + +test.describe('Check the happy path, for basic changing color', () => { + const cases = [ + { + desc: 'User accepts change', + shouldReject: false, + }, + { + desc: 'User rejects change', + shouldReject: true, + }, + ] as const + for (const { desc, shouldReject } of cases) { + test(`${desc}`, async ({ + context, + homePage, + cmdBar, + editor, + page, + scene, + }) => { + await context.addInitScript((file) => { + localStorage.setItem('persistCode', file) + }, file) + await homePage.goToModelingScene() + + const body1CapCoords = { x: 571, y: 351 } + const greenCheckCoords = { x: 565, y: 345 } + const body2WallCoords = { x: 609, y: 153 } + const [clickBody1Cap] = scene.makeMouseHelpers( + body1CapCoords.x, + body1CapCoords.y + ) + const yellow: [number, number, number] = [179, 179, 131] + const green: [number, number, number] = [108, 152, 75] + const notGreen: [number, number, number] = [132, 132, 132] + const body2NotGreen: [number, number, number] = [88, 88, 88] + const submittingToast = page.getByText('Submitting to Text-to-CAD API...') + const successToast = page.getByText('Prompt to edit successful') + const acceptBtn = page.getByRole('button', { name: 'checkmark Accept' }) + const rejectBtn = page.getByRole('button', { name: 'close Reject' }) + + await test.step('wait for scene to load select body and check selection came through', async () => { + await scene.expectPixelColor([134, 134, 134], body1CapCoords, 15) + await clickBody1Cap() + await scene.expectPixelColor(yellow, body1CapCoords, 20) + await editor.expectState({ + highlightedCode: '', + activeLines: ['|>startProfileAt([-73.64,-42.89],%)'], + diagnostics: [], + }) + }) + + await test.step('fire off edit prompt', async () => { + await cmdBar.openCmdBar('promptToEdit') + // being specific about the color with a hex means asserting pixel color is more stable + await page + .getByTestId('cmd-bar-arg-value') + .fill('make this neon green please, use #39FF14') + await page.waitForTimeout(100) + await cmdBar.progressCmdBar() + await expect(submittingToast).toBeVisible() + await expect(submittingToast).not.toBeVisible({ timeout: 2 * 60_000 }) // can take a while + await expect(successToast).toBeVisible() + }) + + await test.step('verify initial change', async () => { + await scene.expectPixelColor(green, greenCheckCoords, 15) + await scene.expectPixelColor(body2NotGreen, body2WallCoords, 15) + await editor.expectEditor.toContain('appearance({') + }) + + if (!shouldReject) { + await test.step('check accept works and can be "undo"ed', async () => { + await acceptBtn.click() + await expect(successToast).not.toBeVisible() + + await scene.expectPixelColor(green, greenCheckCoords, 15) + await editor.expectEditor.toContain('appearance({') + + // ctrl-z works after accepting + await page.keyboard.down('ControlOrMeta') + await page.keyboard.press('KeyZ') + await page.keyboard.up('ControlOrMeta') + await editor.expectEditor.not.toContain('appearance({') + await scene.expectPixelColor(notGreen, greenCheckCoords, 15) + }) + } else { + await test.step('check reject works', async () => { + await rejectBtn.click() + await expect(successToast).not.toBeVisible() + + await scene.expectPixelColor(notGreen, greenCheckCoords, 15) + await editor.expectEditor.not.toContain('appearance({') + }) + } + }) + } +}) + +test.describe('bad path', () => { + test(`bad edit prompt`, async ({ + context, + homePage, + cmdBar, + editor, + toolbar, + page, + scene, + }) => { + await context.addInitScript((file) => { + localStorage.setItem('persistCode', file) + }, file) + await homePage.goToModelingScene() + + const body1CapCoords = { x: 571, y: 351 } + const [clickBody1Cap] = scene.makeMouseHelpers( + body1CapCoords.x, + body1CapCoords.y + ) + const yellow: [number, number, number] = [179, 179, 131] + const submittingToast = page.getByText('Submitting to Text-to-CAD API...') + const failToast = page.getByText( + 'Failed to edit your KCL code, please try again with a different prompt or selection' + ) + + await test.step('wait for scene to load and select body', async () => { + await scene.expectPixelColor([134, 134, 134], body1CapCoords, 15) + + await clickBody1Cap() + await scene.expectPixelColor(yellow, body1CapCoords, 20) + + await editor.expectState({ + highlightedCode: '', + activeLines: ['|>startProfileAt([-73.64,-42.89],%)'], + diagnostics: [], + }) + }) + + await test.step('fire of bad prompt', async () => { + await cmdBar.openCmdBar('promptToEdit') + await page + .getByTestId('cmd-bar-arg-value') + .fill('ansheusha asnthuatshoeuhtaoetuhthaeu laughs in dvorak') + await page.waitForTimeout(100) + await cmdBar.progressCmdBar() + await expect(submittingToast).toBeVisible() + }) + await test.step('check fail toast appeared', async () => { + await expect(submittingToast).not.toBeVisible({ timeout: 2 * 60_000 }) // can take a while + await expect(failToast).toBeVisible() + }) + }) +}) diff --git a/e2e/playwright/regression-tests.spec.ts b/e2e/playwright/regression-tests.spec.ts index be483dc7e..afacd5b6b 100644 --- a/e2e/playwright/regression-tests.spec.ts +++ b/e2e/playwright/regression-tests.spec.ts @@ -1,46 +1,37 @@ -import { test, expect, Page } from '@playwright/test' -import { join } from 'path' +import { test, expect, Page } from './zoo-test' +import path from 'path' import * as fsp from 'fs/promises' -import { - getUtils, - setup, - setupElectron, - tearDown, - executorInputPath, -} from './test-utils' +import { getUtils, executorInputPath } from './test-utils' import { TEST_CODE_TRIGGER_ENGINE_EXPORT_ERROR } from './storageStates' import { bracket } from 'lib/exampleKcl' -test.beforeEach(async ({ context, page }, testInfo) => { - await setup(context, page, testInfo) -}) - -test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) - test.describe('Regression tests', () => { // bugs we found that don't fit neatly into other categories - test('bad model has inline error #3251', async ({ page }) => { + test('bad model has inline error #3251', async ({ + context, + page, + homePage, + }) => { // because the model has `line([0,0]..` it is valid code, but the model is invalid // regression test for https://github.com/KittyCAD/modeling-app/issues/3251 // Since the bad model also found as issue with the artifact graph, which in tern blocked the editor diognostics const u = await getUtils(page) - await page.addInitScript(async () => { + await context.addInitScript(async () => { localStorage.setItem( 'persistCode', `sketch2 = startSketchOn("XY") -sketch001 = startSketchAt([-0, -0]) - |> line([0, 0], %) - |> line([-4.84, -5.29], %) - |> lineTo([profileStartX(%), profileStartY(%)], %) - |> close(%)` + sketch001 = startSketchAt([-0, -0]) + |> line([0, 0], %) + |> line([-4.84, -5.29], %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%)` ) }) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() // error in guter await expect(page.locator('.cm-lint-marker-error')).toBeVisible() @@ -56,6 +47,7 @@ sketch001 = startSketchAt([-0, -0]) }) test('user should not have to press down twice in cmdbar', async ({ page, + homePage, }) => { // because the model has `line([0,0]..` it is valid code, but the model is invalid // regression test for https://github.com/KittyCAD/modeling-app/issues/3251 @@ -64,26 +56,38 @@ sketch001 = startSketchAt([-0, -0]) await page.addInitScript(async () => { localStorage.setItem( 'persistCode', - `sketch2 = startSketchOn("XY") -sketch001 = startSketchAt([-0, -0]) - |> line([0, 0], %) - |> line([-4.84, -5.29], %) + `sketch001 = startSketchOn('XY') + |> startProfileAt([82.33, 238.21], %) + |> angledLine([0, 288.63], %, $rectangleSegmentA001) + |> angledLine([ + segAng(rectangleSegmentA001) - 90, + 197.97 + ], %, $rectangleSegmentB001) + |> angledLine([ + segAng(rectangleSegmentA001), + -segLen(rectangleSegmentA001) + ], %, $rectangleSegmentC001) |> lineTo([profileStartX(%), profileStartY(%)], %) - |> close(%)` + |> close(%) +extrude001 = extrude(50, sketch001) +` ) }) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await page.goto('/') + await homePage.goToModelingScene() await u.waitForPageLoad() await test.step('Check arrow down works', async () => { + await page.getByTestId('command-bar-open-button').hover() await page.getByTestId('command-bar-open-button').click() - await page - .getByRole('option', { name: 'floppy disk arrow Export' }) - .click() + const floppy = page.getByRole('option', { + name: 'floppy disk arrow Export', + }) + + await floppy.click() // press arrow down key twice await page.keyboard.press('ArrowDown') @@ -115,21 +119,22 @@ sketch001 = startSketchAt([-0, -0]) ) }) }) - test('executes on load', async ({ page }) => { + test('executes on load', async ({ page, homePage }) => { const u = await getUtils(page) await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `sketch001 = startSketchOn('-XZ') - |> startProfileAt([-6.95, 4.98], %) - |> line([25.1, 0.41], %) - |> line([0.73, -14.93], %) - |> line([-23.44, 0.52], %)` + |> startProfileAt([-6.95, 4.98], %) + |> line([25.1, 0.41], %) + |> line([0.73, -14.93], %) + |> line([-23.44, 0.52], %)` ) }) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() // expand variables section const variablesTabButton = page.getByTestId('variables-pane-button') @@ -148,14 +153,15 @@ sketch001 = startSketchAt([-0, -0]) ).toBeVisible() }) - test('re-executes', async ({ page }) => { + test('re-executes', async ({ page, homePage }) => { const u = await getUtils(page) await page.addInitScript(async () => { localStorage.setItem('persistCode', `myVar = 5`) }) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() const variablesTabButton = page.getByTestId('variables-pane-button') await variablesTabButton.click() @@ -174,32 +180,33 @@ sketch001 = startSketchAt([-0, -0]) page.locator('.pretty-json-container >> text=myVar:67') ).toBeVisible() }) - test('ProgramMemory can be serialised', async ({ page }) => { + test('ProgramMemory can be serialised', async ({ page, homePage }) => { const u = await getUtils(page) await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `part = startSketchOn('XY') - |> startProfileAt([0, 0], %) - |> line([0, 1], %) - |> line([1, 0], %) - |> line([0, -1], %) - |> close(%) - |> extrude(1, %) - |> patternLinear3d({ - axis: [1, 0, 1], - repetitions: 3, - distance: 6 - }, %)` + |> startProfileAt([0, 0], %) + |> line([0, 1], %) + |> line([1, 0], %) + |> line([0, -1], %) + |> close(%) + |> extrude(1, %) + |> patternLinear3d({ + axis: [1, 0, 1], + repetitions: 3, + distance: 6 + }, %)` ) }) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) const messages: string[] = [] // Listen for all console events and push the message text to an array page.on('console', (message) => messages.push(message.text())) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() // wait for execution done await u.openDebugPanel() @@ -212,19 +219,26 @@ sketch001 = startSketchAt([-0, -0]) }) }) }) - test('ensure the Zoo logo is not a link in browser app', async ({ page }) => { + + // Not relevant to us anymore, or at least for the time being. + test.skip('ensure the Zoo logo is not a link in browser app', async ({ + page, + homePage, + }) => { const u = await getUtils(page) - await page.setViewportSize({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await page.setBodyDimensions({ width: 1000, height: 500 }) + await homePage.goToModelingScene() + await u.waitForPageLoad() const zooLogo = page.locator('[data-testid="app-logo"]') // Make sure it's not a link await expect(zooLogo).not.toHaveAttribute('href') }) + test( 'Position _ Is Out Of Range... regression test', { tag: ['@skipWin'] }, - async ({ page }) => { + async ({ context, page, homePage }) => { // SKip on windows, its being weird. test.skip( process.platform === 'win32', @@ -233,25 +247,26 @@ sketch001 = startSketchAt([-0, -0]) const u = await getUtils(page) // const PUR = 400 / 37.5 //pixeltoUnitRatio - await page.setViewportSize({ width: 1200, height: 500 }) - await page.addInitScript(async () => { + await page.setBodyDimensions({ width: 1200, height: 500 }) + await context.addInitScript(async () => { localStorage.setItem( 'persistCode', `exampleSketch = startSketchOn("XZ") - |> startProfileAt([0, 0], %) - |> angledLine({ angle: 50, length: 45 }, %) - |> yLineTo(0, %) - |> close(%) - |> - - example = extrude(5, exampleSketch) - shell({ faces: ['end'], thickness: 0.25 }, exampleSketch)` + |> startProfileAt([0, 0], %) + |> angledLine({ angle: 50, length: 45 }, %) + |> yLineTo(0, %) + |> close(%) + |> + + example = extrude(5, exampleSketch) + shell({ faces: ['end'], thickness: 0.25 }, exampleSketch)` ) }) await expect(async () => { - await page.goto('/') + await homePage.goToModelingScene() await u.waitForPageLoad() + // error in guter await expect(page.locator('.cm-lint-marker-error')).toBeVisible({ timeout: 1_000, @@ -293,12 +308,12 @@ sketch001 = startSketchAt([-0, -0]) await expect(page.locator('.cm-content')) .toContainText(`exampleSketch = startSketchOn("XZ") - |> startProfileAt([0, 0], %) - |> angledLine({ angle: 50, length: 45 }, %) - |> yLineTo(0, %) - |> close(%) - - thing: "blah"`) + |> startProfileAt([0, 0], %) + |> angledLine({ angle: 50, length: 45 }, %) + |> yLineTo(0, %) + |> close(%) + + thing: "blah"`) await expect(page.locator('.cm-lint-marker-error')).toBeVisible() } @@ -306,6 +321,7 @@ sketch001 = startSketchAt([-0, -0]) test('when engine fails export we handle the failure and alert the user', async ({ page, + homePage, }) => { const u = await getUtils(page) await page.addInitScript( @@ -316,9 +332,10 @@ sketch001 = startSketchAt([-0, -0]) { code: TEST_CODE_TRIGGER_ENGINE_EXPORT_ERROR } ) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() // wait for execution done await u.openDebugPanel() @@ -374,7 +391,6 @@ sketch001 = startSketchAt([-0, -0]) // wait for execution done await u.openDebugPanel() - await u.clearCommandLogs() await u.expectCmdLog('[data-message-type="execution-done"]') await u.closeDebugPanel() @@ -408,7 +424,7 @@ sketch001 = startSketchAt([-0, -0]) test( 'ensure you can not export while an export is already going', { tag: ['@skipLinux', '@skipWin'] }, - async ({ page }) => { + async ({ page, homePage }) => { // This is being weird on ubuntu and windows. test.skip( // eslint-disable-next-line jest/valid-title @@ -428,9 +444,10 @@ sketch001 = startSketchAt([-0, -0]) } ) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() // wait for execution done await u.openDebugPanel() @@ -500,20 +517,17 @@ sketch001 = startSketchAt([-0, -0]) test( `Network health indicator only appears in modeling view`, { tag: '@electron' }, - async ({ browserName: _ }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - const bracketDir = join(dir, 'bracket') - await fsp.mkdir(bracketDir, { recursive: true }) - await fsp.copyFile( - executorInputPath('focusrite_scarlett_mounting_braket.kcl'), - join(bracketDir, 'main.kcl') - ) - }, + async ({ context, page }, testInfo) => { + await context.folderSetupFn(async (dir) => { + const bracketDir = path.join(dir, 'bracket') + await fsp.mkdir(bracketDir, { recursive: true }) + await fsp.copyFile( + executorInputPath('focusrite_scarlett_mounting_braket.kcl'), + path.join(bracketDir, 'main.kcl') + ) }) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) const u = await getUtils(page) // Locators @@ -539,14 +553,15 @@ sketch001 = startSketchAt([-0, -0]) await u.waitForPageLoad() await expect(networkHealthIndicator).toContainText('Connected') }) - - await electronApp.close() } ) test(`View gizmo stays visible even when zoomed out all the way`, async ({ page, + homePage, }) => { + // TODO: fix this test on windows after the electron migration + test.skip(process.platform === 'win32', 'Skip on windows') const u = await getUtils(page) // Constants and locators @@ -561,8 +576,9 @@ sketch001 = startSketchAt([-0, -0]) await page.addInitScript(async () => { localStorage.setItem('persistCode', '') }) - await page.setViewportSize({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() + await u.waitForPageLoad() await u.closeKclCodePanel() }) @@ -572,7 +588,7 @@ sketch001 = startSketchAt([-0, -0]) timeout: 5000, message: 'Plane color is visible', }) - .toBeLessThan(15) + .toBeLessThanOrEqual(15) let maxZoomOuts = 10 let middlePixelIsBackgroundColor = @@ -590,7 +606,7 @@ sketch001 = startSketchAt([-0, -0]) } expect(middlePixelIsBackgroundColor, { - message: 'We no longer the default planes', + message: 'We should not see the default planes', }).toBeTruthy() }) diff --git a/e2e/playwright/secrets.ts b/e2e/playwright/secrets.ts index ed5fd63aa..6626f5e3e 100644 --- a/e2e/playwright/secrets.ts +++ b/e2e/playwright/secrets.ts @@ -7,6 +7,8 @@ try { .split('\n') .filter((line) => line && line.length > 1) .forEach((line) => { + // Allow line comments. + if (line.trimStart().startsWith('#')) return const [key, value] = line.split('=') // prefer env vars over secrets file secrets[key] = process.env[key] || (value as any).replaceAll('"', '') diff --git a/e2e/playwright/sketch-tests.spec.ts b/e2e/playwright/sketch-tests.spec.ts index 3d66a92c9..51634551f 100644 --- a/e2e/playwright/sketch-tests.spec.ts +++ b/e2e/playwright/sketch-tests.spec.ts @@ -1,27 +1,20 @@ -import { test, expect, Page } from '@playwright/test' -import { test as test2, expect as expect2 } from './fixtures/fixtureSetup' +import { test, expect, Page } from './zoo-test' +import fs from 'node:fs/promises' +import path from 'node:path' +import { HomePageFixture } from './fixtures/homePageFixture' import { getMovementUtils, getUtils, PERSIST_MODELING_CONTEXT, - setup, - tearDown, } from './test-utils' import { uuidv4, roundOff } from 'lib/utils' -test.beforeEach(async ({ context, page }, testInfo) => { - await setup(context, page, testInfo) -}) - -test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) - test.describe('Sketch tests', () => { test('multi-sketch file shows multiple Edit Sketch buttons', async ({ page, context, + homePage, }) => { const u = await getUtils(page) const selectionsSnippets = { @@ -35,53 +28,53 @@ test.describe('Sketch tests', () => { localStorage.setItem( 'persistCode', ` - width = 20 - height = 10 - thickness = 5 - screwRadius = 3 - wireRadius = 2 - wireOffset = 0.5 - - screwHole = startSketchOn('XY') - ${startProfileAt1} - |> arc({ - radius: screwRadius, - angle_start: 0, - angle_end: 360 - }, %) - - part001 = startSketchOn('XY') - ${startProfileAt2} - |> xLine(width * .5, %) - |> yLine(height, %) - |> xLine(-width * .5, %) - |> close(%) - |> hole(screwHole, %) - |> extrude(thickness, %) - - part002 = startSketchOn('-XZ') - ${startProfileAt3} - |> xLine(width / 4, %) - |> tangentialArcTo([width / 2, 0], %) - |> xLine(-width / 4 + wireRadius, %) - |> yLine(wireOffset, %) - |> arc({ - radius: wireRadius, - angle_start: 0, - angle_end: 180 - }, %) - |> yLine(-wireOffset, %) - |> xLine(-width / 4, %) - |> close(%) - |> extrude(-height, %) - ` + width = 20 + height = 10 + thickness = 5 + screwRadius = 3 + wireRadius = 2 + wireOffset = 0.5 + + screwHole = startSketchOn('XY') + ${startProfileAt1} + |> arc({ + radius = screwRadius, + angle_start = 0, + angle_end = 360 + }, %) + + part001 = startSketchOn('XY') + ${startProfileAt2} + |> xLine(width * .5, %) + |> yLine(height, %) + |> xLine(-width * .5, %) + |> close(%) + |> hole(screwHole, %) + |> extrude(thickness, %) + + part002 = startSketchOn('-XZ') + ${startProfileAt3} + |> xLine(width / 4, %) + |> tangentialArcTo([width / 2, 0], %) + |> xLine(-width / 4 + wireRadius, %) + |> yLine(wireOffset, %) + |> arc({ + radius = wireRadius, + angle_start = 0, + angle_end = 180 + }, %) + |> yLine(-wireOffset, %) + |> xLine(-width / 4, %) + |> close(%) + |> extrude(-height, %) + ` ) }, selectionsSnippets ) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() // wait for execution done await u.openDebugPanel() @@ -89,43 +82,38 @@ test.describe('Sketch tests', () => { await u.closeDebugPanel() await page.getByText(selectionsSnippets.startProfileAt1).click() - await expect(page.getByRole('button', { name: 'Extrude' })).toBeDisabled() await expect( page.getByRole('button', { name: 'Edit Sketch' }) ).toBeVisible() await page.getByText(selectionsSnippets.startProfileAt2).click() - await expect(page.getByRole('button', { name: 'Extrude' })).toBeDisabled() await expect( page.getByRole('button', { name: 'Edit Sketch' }) ).toBeVisible() await page.getByText(selectionsSnippets.startProfileAt3).click() - await expect(page.getByRole('button', { name: 'Extrude' })).toBeDisabled() await expect( page.getByRole('button', { name: 'Edit Sketch' }) ).toBeVisible() }) test('Can delete most of a sketch and the line tool will still work', async ({ page, + homePage, }) => { const u = await getUtils(page) await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `sketch001 = startSketchOn('XZ') - |> startProfileAt([4.61, -14.01], %) - |> line([12.73, -0.09], %) - |> tangentialArcTo([24.95, -5.38], %)` + |> startProfileAt([4.61, -14.01], %) + |> xLine(12.73, %) + |> tangentialArcTo([24.95, -5.38], %)` ) }) - await page.setViewportSize({ width: 1200, height: 500 }) - - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await expect(async () => { - await page.mouse.click(700, 200) await page.getByText('tangentialArcTo([24.95, -5.38], %)').click() await expect( page.getByRole('button', { name: 'Edit Sketch' }) @@ -142,8 +130,7 @@ test.describe('Sketch tests', () => { await page.keyboard.press('Home') await page.keyboard.up('Shift') await page.keyboard.press('Backspace') - await u.openAndClearDebugPanel() - + await u.openDebugPanel() await u.expectCmdLog('[data-message-type="execution-done"]', 10_000) await page.waitForTimeout(100) @@ -151,26 +138,31 @@ test.describe('Sketch tests', () => { await page.waitForTimeout(100) await expect(async () => { + await page.mouse.move(700, 200, { steps: 25 }) await page.mouse.click(700, 200) - await expect.poll(u.normalisedEditorCode, { timeout: 1000 }) - .toBe(`sketch001 = startSketchOn('XZ') - |> startProfileAt([12.34, -12.34], %) - |> line([-12.34, 12.34], %) - -`) + await expect + .poll(u.crushKclCodeIntoOneLineAndThenMaybeSome, { timeout: 1000 }) + .toBe( + `sketch001 = startSketchOn('XZ') + |> startProfileAt([4.61,-14.01], %) + |> yLine(15.95, %) +` + .replaceAll(' ', '') + .replaceAll('\n', '') + ) }).toPass({ timeout: 40_000, intervals: [1_000] }) }) - test('Can exit selection of face', async ({ page }) => { + + test('Can exit selection of face', async ({ page, homePage }) => { // Load the app with the code panes await page.addInitScript(async () => { localStorage.setItem('persistCode', ``) }) - const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await page.getByRole('button', { name: 'Start Sketch' }).click() await expect( @@ -187,6 +179,7 @@ test.describe('Sketch tests', () => { test.describe('Can edit segments by dragging their handles', () => { const doEditSegmentsByDraggingHandle = async ( page: Page, + homePage: HomePageFixture, openPanes: string[] ) => { // Load the app with the code panes @@ -202,9 +195,8 @@ test.describe('Sketch tests', () => { }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await homePage.goToModelingScene() - await u.waitForAuthSkipAppStart() await expect( page.getByRole('button', { name: 'Start Sketch' }) ).not.toBeDisabled() @@ -318,7 +310,7 @@ test.describe('Sketch tests', () => { |> line([1.97, 2.06], %) |> close(%)`) } - test('code pane open at start-handles', async ({ page }) => { + test('code pane open at start-handles', async ({ page, homePage }) => { // Load the app with the code panes await page.addInitScript(async () => { localStorage.setItem( @@ -331,10 +323,10 @@ test.describe('Sketch tests', () => { }) ) }) - await doEditSegmentsByDraggingHandle(page, ['code']) + await doEditSegmentsByDraggingHandle(page, homePage, ['code']) }) - test('code pane closed at start-handles', async ({ page }) => { + test('code pane closed at start-handles', async ({ page, homePage }) => { // Load the app with the code panes await page.addInitScript(async (persistModelingContext) => { localStorage.setItem( @@ -342,25 +334,26 @@ test.describe('Sketch tests', () => { JSON.stringify({ openPanes: [] }) ) }, PERSIST_MODELING_CONTEXT) - await doEditSegmentsByDraggingHandle(page, []) + await doEditSegmentsByDraggingHandle(page, homePage, []) }) }) test('Can edit a circle center and radius by dragging its handles', async ({ page, + editor, + homePage, }) => { const u = await getUtils(page) await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `sketch001 = startSketchOn('XZ') - |> circle({ center: [4.61, -5.01], radius: 8 }, %)` + |> circle({ center = [4.61, -5.01], radius = 8 }, %)` ) }) - await page.setViewportSize({ width: 1200, height: 500 }) + await homePage.goToModelingScene() - await u.waitForAuthSkipAppStart() await expect( page.getByRole('button', { name: 'Start Sketch' }) ).not.toBeDisabled() @@ -392,13 +385,14 @@ test.describe('Sketch tests', () => { const dragPX = 40 await page - .getByText('circle({ center: [4.61, -5.01], radius: 8 }, %)') + .getByText('circle({ center = [4.61, -5.01], radius = 8 }, %)') .click() await expect( page.getByRole('button', { name: 'Edit Sketch' }) ).toBeVisible() await page.getByRole('button', { name: 'Edit Sketch' }).click() await page.waitForTimeout(400) + let prevContent = await page.locator('.cm-content').innerText() await expect(page.getByTestId('segment-overlay')).toHaveCount(1) @@ -409,7 +403,9 @@ test.describe('Sketch tests', () => { targetPosition: { x: startPX[0] + dragPX, y: startPX[1] - dragPX }, }) await page.waitForTimeout(100) - await expect(page.locator('.cm-content')).not.toHaveText(prevContent) + + await editor.expectEditor.not.toContain(prevContent) + prevContent = await page.locator('.cm-content').innerText() }) @@ -422,35 +418,36 @@ test.describe('Sketch tests', () => { sourcePosition: { x: lineEnd.x - 5, y: lineEnd.y }, targetPosition: { x: lineEnd.x + dragPX * 2, y: lineEnd.y + dragPX }, }) - await expect(page.locator('.cm-content')).not.toHaveText(prevContent) + await editor.expectEditor.not.toContain(prevContent) prevContent = await page.locator('.cm-content').innerText() }) // expect the code to have changed - await expect(page.locator('.cm-content')) - .toHaveText(`sketch001 = startSketchOn('XZ') - |> circle({ center: [7.26, -2.37], radius: 11.44 }, %) -`) + await editor.expectEditor.toContain( + `sketch001 = startSketchOn('XZ') + |> circle({ center = [7.26, -2.37], radius = 11.44 }, %)`, + { shouldNormalise: true } + ) }) test('Can edit a sketch that has been extruded in the same pipe', async ({ page, + homePage, }) => { const u = await getUtils(page) await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `sketch001 = startSketchOn('XZ') - |> startProfileAt([4.61, -10.01], %) - |> line([12.73, -0.09], %) - |> tangentialArcTo([24.95, -0.38], %) - |> close(%) - |> extrude(5, %)` + |> startProfileAt([4.61, -10.01], %) + |> line([12.73, -0.09], %) + |> tangentialArcTo([24.95, -0.38], %) + |> close(%) + |> extrude(5, %)` ) }) - await page.setViewportSize({ width: 1200, height: 500 }) + await homePage.goToModelingScene() - await u.waitForAuthSkipAppStart() await expect( page.getByRole('button', { name: 'Start Sketch' }) ).not.toBeDisabled() @@ -504,11 +501,11 @@ test.describe('Sketch tests', () => { await page.waitForTimeout(100) const lineEnd = await u.getBoundingBox('[data-overlay-index="0"]') - await page.waitForTimeout(100) await page.dragAndDrop('#stream', '#stream', { - sourcePosition: { x: lineEnd.x - 5, y: lineEnd.y }, - targetPosition: { x: lineEnd.x + dragPX, y: lineEnd.y + dragPX }, + sourcePosition: { x: lineEnd.x - 15, y: lineEnd.y }, + targetPosition: { x: lineEnd.x, y: lineEnd.y + 15 }, }) + await page.waitForTimeout(100) await expect(page.locator('.cm-content')).not.toHaveText(prevContent) prevContent = await page.locator('.cm-content').innerText() @@ -517,8 +514,8 @@ test.describe('Sketch tests', () => { await page.dragAndDrop('#stream', '#stream', { sourcePosition: { x: tangentEnd.x + 10, y: tangentEnd.y - 5 }, targetPosition: { - x: tangentEnd.x + dragPX, - y: tangentEnd.y + dragPX, + x: tangentEnd.x, + y: tangentEnd.y - 15, }, }) await page.waitForTimeout(100) @@ -527,33 +524,33 @@ test.describe('Sketch tests', () => { // expect the code to have changed await expect(page.locator('.cm-content')) .toHaveText(`sketch001 = startSketchOn('XZ') - |> startProfileAt([7.12, -12.68], %) - |> line([15.39, -2.78], %) - |> tangentialArcTo([27.6, -3.05], %) - |> close(%) - |> extrude(5, %) -`) + |> startProfileAt([7.12, -12.68], %) + |> line([12.68, -1.09], %) + |> tangentialArcTo([24.89, 0.68], %) + |> close(%) + |> extrude(5, %) + `) }) test('Can edit a sketch that has been revolved in the same pipe', async ({ page, + homePage, }) => { const u = await getUtils(page) await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `sketch001 = startSketchOn('XZ') - |> startProfileAt([4.61, -14.01], %) - |> line([12.73, -0.09], %) - |> tangentialArcTo([24.95, -5.38], %) - |> close(%) - |> revolve({ axis: "X",}, %)` + |> startProfileAt([4.61, -14.01], %) + |> line([12.73, -0.09], %) + |> tangentialArcTo([24.95, -5.38], %) + |> close(%) + |> revolve({ axis = "X",}, %)` ) }) - await page.setViewportSize({ width: 1200, height: 500 }) + await homePage.goToModelingScene() - await u.waitForAuthSkipAppStart() await expect( page.getByRole('button', { name: 'Start Sketch' }) ).not.toBeDisabled() @@ -629,24 +626,26 @@ test.describe('Sketch tests', () => { // expect the code to have changed await expect(page.locator('.cm-content')) .toHaveText(`sketch001 = startSketchOn('XZ') - |> startProfileAt([6.44, -12.07], %) - |> line([14.72, 1.97], %) - |> tangentialArcTo([24.95, -5.38], %) - |> line([1.97, 2.06], %) - |> close(%) - |> revolve({ axis: "X" }, %)`) + |> startProfileAt([6.44, -12.07], %) + |> line([14.72, 1.97], %) + |> tangentialArcTo([24.95, -5.38], %) + |> line([1.97, 2.06], %) + |> close(%) + |> revolve({ axis = "X" }, %)`) }) - test('Can add multiple sketches', async ({ page }) => { - test.skip(process.platform === 'darwin', 'Can add multiple sketches') + test('Can add multiple sketches', async ({ page, homePage }) => { + // TODO: fix this test on windows after the electron migration + test.skip(process.platform === 'win32', 'Skip on windows') const u = await getUtils(page) - const viewportSize = { width: 1200, height: 500 } - await page.setViewportSize(viewportSize) - await u.waitForAuthSkipAppStart() + const viewportSize = { width: 1200, height: 500 } + await page.setBodyDimensions(viewportSize) + + await homePage.goToModelingScene() await u.openDebugPanel() const center = { x: viewportSize.width / 2, y: viewportSize.height / 2 } - const { toSU, click00r } = getMovementUtils({ center, page }) + const { toSU, toU, click00r } = getMovementUtils({ center, page }) await expect( page.getByRole('button', { name: 'Start Sketch' }) @@ -675,15 +674,15 @@ test.describe('Sketch tests', () => { await click00r(50, 0) await page.waitForTimeout(100) - codeStr += ` |> line(${toSU([50, 0])}, %)` + codeStr += ` |> xLine(${toU(50, 0)[0]}, %)` await expect(u.codeLocator).toHaveText(codeStr) await click00r(0, 50) - codeStr += ` |> line(${toSU([0, 50])}, %)` + codeStr += ` |> yLine(${toU(0, 50)[1]}, %)` await expect(u.codeLocator).toHaveText(codeStr) await click00r(-50, 0) - codeStr += ` |> line(${toSU([-50, 0])}, %)` + codeStr += ` |> xLine(${toU(-50, 0)[0]}, %)` await expect(u.codeLocator).toHaveText(codeStr) // exit the sketch, reset relative clicker @@ -709,16 +708,18 @@ test.describe('Sketch tests', () => { codeStr += ` |> startProfileAt([2.03, 0], %)` await expect(u.codeLocator).toHaveText(codeStr) + // TODO: I couldn't use `toSU` here because of some rounding error causing + // it to be off by 0.01 await click00r(30, 0) - codeStr += ` |> line([2.04, 0], %)` + codeStr += ` |> xLine(2.04, %)` await expect(u.codeLocator).toHaveText(codeStr) await click00r(0, 30) - codeStr += ` |> line([0, -2.03], %)` + codeStr += ` |> yLine(-2.03, %)` await expect(u.codeLocator).toHaveText(codeStr) await click00r(-30, 0) - codeStr += ` |> line([-2.04, 0], %)` + codeStr += ` |> xLine(-2.04, %)` await expect(u.codeLocator).toHaveText(codeStr) await click00r(undefined, undefined) @@ -735,15 +736,14 @@ test.describe('Sketch tests', () => { scale = 1 ) => { const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() await u.openDebugPanel() const code = `sketch001 = startSketchOn('-XZ') |> startProfileAt([${roundOff(scale * 69.6)}, ${roundOff(scale * 34.8)}], %) - |> line([${roundOff(scale * 139.19)}, 0], %) - |> line([0, -${roundOff(scale * 139.2)}], %) + |> xLine(${roundOff(scale * 139.19)}, %) + |> yLine(-${roundOff(scale * 139.2)}, %) |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%)` @@ -819,36 +819,41 @@ test.describe('Sketch tests', () => { await u.expectCmdLog('[data-message-type="execution-done"]') await u.removeCurrentCode() } - test('[0, 100, 100]', async ({ page }) => { + test('[0, 100, 100]', async ({ page, homePage }) => { + await homePage.goToModelingScene() await doSnapAtDifferentScales(page, [0, 100, 100], 0.01) }) - test('[0, 10000, 10000]', async ({ page }) => { + test('[0, 10000, 10000]', async ({ page, homePage }) => { + await homePage.goToModelingScene() await doSnapAtDifferentScales(page, [0, 10000, 10000]) }) }) test('exiting a close extrude, has the extrude button enabled ready to go', async ({ page, + homePage, }) => { + // TODO: fix this test on windows after the electron migration + test.skip(process.platform === 'win32', 'Skip on windows') // this was a regression https://github.com/KittyCAD/modeling-app/issues/2832 await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `sketch001 = startSketchOn('XZ') - |> startProfileAt([-0.45, 0.87], %) - |> line([1.32, 0.38], %) - |> line([1.02, -1.32], %, $seg01) - |> line([-1.01, -0.77], %) - |> lineTo([profileStartX(%), profileStartY(%)], %) -|> close(%) -` + |> startProfileAt([-0.45, 0.87], %) + |> line([1.32, 0.38], %) + |> line([1.02, -1.32], %, $seg01) + |> line([-1.01, -0.77], %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) + ` ) }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() // wait for execution done await u.openDebugPanel() @@ -884,27 +889,30 @@ test.describe('Sketch tests', () => { timeout: 10_000, }) }) - test("Existing sketch with bad code delete user's code", async ({ page }) => { + test("Existing sketch with bad code delete user's code", async ({ + page, + homePage, + }) => { // this was a regression https://github.com/KittyCAD/modeling-app/issues/2832 await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `sketch001 = startSketchOn('XZ') - |> startProfileAt([-0.45, 0.87], %) - |> line([1.32, 0.38], %) - |> line([1.02, -1.32], %, $seg01) - |> line([-1.01, -0.77], %) - |> lineTo([profileStartX(%), profileStartY(%)], %) - |> close(%) -extrude001 = extrude(5, sketch001) -` + |> startProfileAt([-0.45, 0.87], %) + |> line([1.32, 0.38], %) + |> line([1.02, -1.32], %, $seg01) + |> line([-1.01, -0.77], %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) + extrude001 = extrude(5, sketch001) + ` ) }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await u.openDebugPanel() await u.expectCmdLog('[data-message-type="execution-done"]') @@ -930,163 +938,149 @@ extrude001 = extrude(5, sketch001) await expect((await u.codeLocator.innerText()).replace(/\s/g, '')).toBe( `sketch001 = startSketchOn('XZ') - |> startProfileAt([-0.45, 0.87], %) - |> line([1.32, 0.38], %) - |> line([1.02, -1.32], %, $seg01) - |> line([-1.01, -0.77], %) - |> lineTo([profileStartX(%), profileStartY(%)], %) - |> close(%) -extrude001 = extrude(5, sketch001) -sketch002 = startSketchOn(extrude001, 'END') - |> -`.replace(/\s/g, '') + |> startProfileAt([-0.45, 0.87], %) + |> line([1.32, 0.38], %) + |> line([1.02, -1.32], %, $seg01) + |> line([-1.01, -0.77], %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) + extrude001 = extrude(5, sketch001) + sketch002 = startSketchOn(extrude001, 'END') + |> + `.replace(/\s/g, '') ) }) - test('empty-scene default-planes act as expected', async ({ - page, - browserName, - }) => { - test.skip( - browserName === 'webkit', - 'Skip on Safari until `window.tearDown` is working there' - ) - /** - * Tests the following things - * 1) The the planes are there on load because the scene is empty - * 2) The planes don't changes color when hovered initially - * 3) Putting something in the scene makes the planes hidden - * 4) Removing everything from the scene shows the plans again - * 3) Once "start sketch" is click, the planes do respond to hovers - * 4) Selecting a plan works as expected, i.e. sketch mode - * 5) Reloading the scene with something already in the scene means the planes are hidden - */ + // TODO: fix after electron migration is merged + test.fixme( + 'empty-scene default-planes act as expected', + async ({ page, homePage }) => { + /** + * Tests the following things + * 1) The the planes are there on load because the scene is empty + * 2) The planes don't changes color when hovered initially + * 3) Putting something in the scene makes the planes hidden + * 4) Removing everything from the scene shows the plans again + * 3) Once "start sketch" is click, the planes do respond to hovers + * 4) Selecting a plan works as expected, i.e. sketch mode + * 5) Reloading the scene with something already in the scene means the planes are hidden + */ - const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + const u = await getUtils(page) + await homePage.goToModelingScene() - await u.waitForAuthSkipAppStart() + await u.openDebugPanel() + await u.expectCmdLog('[data-message-type="execution-done"]') + await u.closeDebugPanel() - await u.openDebugPanel() - await u.expectCmdLog('[data-message-type="execution-done"]') - await u.closeDebugPanel() + const XYPlanePoint = { x: 774, y: 116 } as const + const unHoveredColor: [number, number, number] = [47, 47, 93] + expect( + await u.getGreatestPixDiff(XYPlanePoint, unHoveredColor) + ).toBeLessThan(8) - const XYPlanePoint = { x: 774, y: 116 } as const - const unHoveredColor: [number, number, number] = [47, 47, 93] - expect( - await u.getGreatestPixDiff(XYPlanePoint, unHoveredColor) - ).toBeLessThan(8) + await page.mouse.move(XYPlanePoint.x, XYPlanePoint.y) + await page.waitForTimeout(200) - await page.mouse.move(XYPlanePoint.x, XYPlanePoint.y) - await page.waitForTimeout(200) + // color should not change for having been hovered + expect( + await u.getGreatestPixDiff(XYPlanePoint, unHoveredColor) + ).toBeLessThan(8) - // color should not change for having been hovered - expect( - await u.getGreatestPixDiff(XYPlanePoint, unHoveredColor) - ).toBeLessThan(8) + await u.openAndClearDebugPanel() - await u.openAndClearDebugPanel() + await u.codeLocator.fill(`sketch001 = startSketchOn('XY') + |> startProfileAt([-10, -10], %) + |> line([20, 0], %) + |> line([0, 20], %) + |> xLine(-20, %) + `) - await u.codeLocator.fill(`sketch001 = startSketchOn('XY') - |> startProfileAt([-10, -10], %) - |> line([20, 0], %) - |> line([0, 20], %) - |> xLine(-20, %) -`) + await u.expectCmdLog('[data-message-type="execution-done"]') - await u.expectCmdLog('[data-message-type="execution-done"]') + const noPlanesColor: [number, number, number] = [30, 30, 30] + expect( + await u.getGreatestPixDiff(XYPlanePoint, noPlanesColor) + ).toBeLessThan(3) - const noPlanesColor: [number, number, number] = [30, 30, 30] - expect( - await u.getGreatestPixDiff(XYPlanePoint, noPlanesColor) - ).toBeLessThan(3) + await u.clearCommandLogs() + await u.removeCurrentCode() + await u.expectCmdLog('[data-message-type="execution-done"]') - await u.clearCommandLogs() - await u.removeCurrentCode() - await u.expectCmdLog('[data-message-type="execution-done"]') + await expect + .poll(() => u.getGreatestPixDiff(XYPlanePoint, unHoveredColor), { + timeout: 5_000, + }) + .toBeLessThan(8) - await expect - .poll(() => u.getGreatestPixDiff(XYPlanePoint, unHoveredColor), { - timeout: 5_000, + // click start Sketch + await page.getByRole('button', { name: 'Start Sketch' }).click() + await page.mouse.move(XYPlanePoint.x, XYPlanePoint.y, { steps: 50 }) + const hoveredColor: [number, number, number] = [93, 93, 127] + // now that we're expecting the user to select a plan, it does respond to hover + await expect + .poll(() => u.getGreatestPixDiff(XYPlanePoint, hoveredColor)) + .toBeLessThan(8) + + await page.mouse.click(XYPlanePoint.x, XYPlanePoint.y) + await page.waitForTimeout(600) + + await page.mouse.click(XYPlanePoint.x, XYPlanePoint.y) + await page.waitForTimeout(200) + await page.mouse.click(XYPlanePoint.x + 50, XYPlanePoint.y + 50) + await expect(u.codeLocator).toHaveText(`sketch001 = startSketchOn('XZ') + |> startProfileAt([11.8, 9.09], %) + |> line([3.39, -3.39], %) + `) + + await page.addInitScript(async () => { + localStorage.setItem( + 'persistCode', + `sketch001 = startSketchOn('XZ') + |> startProfileAt([11.8, 9.09], %) + |> line([3.39, -3.39], %) + ` + ) }) - .toBeLessThan(8) - // click start Sketch - await page.getByRole('button', { name: 'Start Sketch' }).click() - await page.mouse.move(XYPlanePoint.x, XYPlanePoint.y, { steps: 5 }) - const hoveredColor: [number, number, number] = [93, 93, 127] - // now that we're expecting the user to select a plan, it does respond to hover - await expect - .poll(() => u.getGreatestPixDiff(XYPlanePoint, hoveredColor)) - .toBeLessThan(8) + await u.openDebugPanel() + await u.expectCmdLog('[data-message-type="execution-done"]') + await u.closeDebugPanel() - await page.mouse.click(XYPlanePoint.x, XYPlanePoint.y) - await page.waitForTimeout(600) + // expect there to be no planes on load since there's something in the scene + expect( + await u.getGreatestPixDiff(XYPlanePoint, noPlanesColor) + ).toBeLessThan(3) + } + ) - await page.mouse.click(XYPlanePoint.x, XYPlanePoint.y) - await page.waitForTimeout(200) - await page.mouse.click(XYPlanePoint.x + 50, XYPlanePoint.y + 50) - await expect(u.codeLocator).toHaveText(`sketch001 = startSketchOn('XZ') - |> startProfileAt([11.8, 9.09], %) - |> line([3.39, -3.39], %) -`) - - await page.addInitScript(async () => { - localStorage.setItem( - 'persistCode', - `sketch001 = startSketchOn('XZ') - |> startProfileAt([11.8, 9.09], %) - |> line([3.39, -3.39], %) -` - ) - }) - await page.reload() - await u.waitForAuthSkipAppStart() - - await u.openDebugPanel() - await u.expectCmdLog('[data-message-type="execution-done"]') - await u.closeDebugPanel() - - // expect there to be no planes on load since there's something in the scene - expect( - await u.getGreatestPixDiff(XYPlanePoint, noPlanesColor) - ).toBeLessThan(3) - }) - - test('Can attempt to sketch on revolved face', async ({ - page, - browserName, - }) => { - test.skip( - browserName === 'webkit', - 'Skip on Safari until `window.tearDown` is working there' - ) + test('Can attempt to sketch on revolved face', async ({ page, homePage }) => { const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `lugHeadLength = 0.25 - lugDiameter = 0.5 - lugLength = 2 - - fn lug = (origin, length, diameter, plane) => { - lugSketch = startSketchOn(plane) - |> startProfileAt([origin[0] + lugDiameter / 2, origin[1]], %) - |> angledLineOfYLength({ angle: 60, length: lugHeadLength }, %) - |> xLineTo(0 + .001, %) - |> yLineTo(0, %) - |> close(%) - |> revolve({ axis: "Y" }, %) - - return lugSketch - } - - lug([0, 0], 10, .5, "XY")` + lugDiameter = 0.5 + lugLength = 2 + + fn lug = (origin, length, diameter, plane) => { + lugSketch = startSketchOn(plane) + |> startProfileAt([origin[0] + lugDiameter / 2, origin[1]], %) + |> angledLineOfYLength({ angle = 60, length = lugHeadLength }, %) + |> xLineTo(0 + .001, %) + |> yLineTo(0, %) + |> close(%) + |> revolve({ axis = "Y" }, %) + + return lugSketch + } + + lug([0, 0], 10, .5, "XY")` ) }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await u.openDebugPanel() await u.expectCmdLog('[data-message-type="execution-done"]') @@ -1118,9 +1112,10 @@ sketch002 = startSketchOn(extrude001, 'END') test('Can sketch on face when user defined function was used in the sketch', async ({ page, + homePage, }) => { const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) // Checking for a regression that performs a sketch when a user defined function // is declared at the top of the file and used in the sketch that is being drawn on. @@ -1130,51 +1125,51 @@ sketch002 = startSketchOn(extrude001, 'END') localStorage.setItem( 'persistCode', `fn in2mm = (inches) => { - return inches * 25.4 -} - -const railTop = in2mm(.748) -const railSide = in2mm(.024) -const railBaseWidth = in2mm(.612) -const railWideWidth = in2mm(.835) -const railBaseLength = in2mm(.200) -const railClampable = in2mm(.200) - -const rail = startSketchOn('XZ') - |> startProfileAt([ - -railTop / 2, - railClampable + railBaseLength - ], %) - |> lineTo([ - railTop / 2, - railClampable + railBaseLength - ], %) - |> lineTo([ - railWideWidth / 2, - railClampable / 2 + railBaseLength - ], %, $seg01) - |> lineTo([railTop / 2, railBaseLength], %) - |> lineTo([railBaseWidth / 2, railBaseLength], %) - |> lineTo([railBaseWidth / 2, 0], %) - |> lineTo([-railBaseWidth / 2, 0], %) - |> lineTo([-railBaseWidth / 2, railBaseLength], %) - |> lineTo([-railTop / 2, railBaseLength], %) - |> lineTo([ - -railWideWidth / 2, - railClampable / 2 + railBaseLength - ], %) - |> lineTo([ - -railTop / 2, - railClampable + railBaseLength - ], %) - |> close(%) - |> extrude(in2mm(2), %)` + return inches * 25.4 + } + + const railTop = in2mm(.748) + const railSide = in2mm(.024) + const railBaseWidth = in2mm(.612) + const railWideWidth = in2mm(.835) + const railBaseLength = in2mm(.200) + const railClampable = in2mm(.200) + + const rail = startSketchOn('XZ') + |> startProfileAt([ + -railTop / 2, + railClampable + railBaseLength + ], %) + |> lineTo([ + railTop / 2, + railClampable + railBaseLength + ], %) + |> lineTo([ + railWideWidth / 2, + railClampable / 2 + railBaseLength + ], %, $seg01) + |> lineTo([railTop / 2, railBaseLength], %) + |> lineTo([railBaseWidth / 2, railBaseLength], %) + |> lineTo([railBaseWidth / 2, 0], %) + |> lineTo([-railBaseWidth / 2, 0], %) + |> lineTo([-railBaseWidth / 2, railBaseLength], %) + |> lineTo([-railTop / 2, railBaseLength], %) + |> lineTo([ + -railWideWidth / 2, + railClampable / 2 + railBaseLength + ], %) + |> lineTo([ + -railTop / 2, + railClampable + railBaseLength + ], %) + |> close(%) + |> extrude(in2mm(2), %)` ) }) const center = { x: 600, y: 250 } const rectangleSize = 20 - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() // Start a sketch await page.getByRole('button', { name: 'Start Sketch' }).click() @@ -1213,27 +1208,33 @@ const rail = startSketchOn('XZ') }) }) -test2.describe('Sketch mode should be toleratant to syntax errors', () => { - test2( +test.describe('Sketch mode should be toleratant to syntax errors', () => { + test( 'adding a syntax error, recovers after fixing', { tag: ['@skipWin'] }, - async ({ app, scene, editor, toolbar }) => { - test.skip( - process.platform === 'win32', - 'a codemirror error appears in this test only on windows, that causes the test to fail only because of our "no new error" logic, but it can not be replicated locally' + async ({ page, homePage, context, scene, editor, toolbar }) => { + const file = await fs.readFile( + path.resolve( + __dirname, + '../../', + './src/wasm-lib/tests/executor/inputs/e2e-can-sketch-on-chamfer.kcl' + ), + 'utf-8' ) - const file = await app.getInputFile('e2e-can-sketch-on-chamfer.kcl') - await app.initialise(file) + await context.addInitScript((file) => { + localStorage.setItem('persistCode', file) + }, file) + await homePage.goToModelingScene() const [objClick] = scene.makeMouseHelpers(600, 250) - const arrowHeadLocation = { x: 604, y: 129 } as const + const arrowHeadLocation = { x: 706, y: 129 } as const const arrowHeadWhite: [number, number, number] = [255, 255, 255] const backgroundGray: [number, number, number] = [28, 28, 28] const verifyArrowHeadColor = async (c: [number, number, number]) => scene.expectPixelColor(c, arrowHeadLocation, 15) await test.step('check chamfer selection changes cursor positon', async () => { - await expect2(async () => { + await expect(async () => { // sometimes initial click doesn't register await objClick() await editor.expectActiveLinesToBe([ @@ -1269,7 +1270,138 @@ test2.describe('Sketch mode should be toleratant to syntax errors', () => { // this checks sketch segments have been drawn await verifyArrowHeadColor(arrowHeadWhite) }) - await app.page.waitForTimeout(100) + await page.waitForTimeout(100) } ) }) + +test.describe(`Sketching with offset planes`, () => { + test(`Can select an offset plane to sketch on`, async ({ + context, + page, + scene, + toolbar, + editor, + homePage, + }) => { + // We seed the scene with a single offset plane + await context.addInitScript(() => { + localStorage.setItem( + 'persistCode', + `offsetPlane001 = offsetPlane("XY", 10)` + ) + }) + + await homePage.goToModelingScene() + + const [planeClick, planeHover] = scene.makeMouseHelpers(650, 200) + + await test.step(`Start sketching on the offset plane`, async () => { + await toolbar.startSketchPlaneSelection() + + await test.step(`Hovering should highlight code`, async () => { + await planeHover() + await editor.expectState({ + activeLines: [`offsetPlane001=offsetPlane("XY",10)`], + diagnostics: [], + highlightedCode: 'offsetPlane("XY", 10)', + }) + }) + + await test.step(`Clicking should select the plane and enter sketch mode`, async () => { + await planeClick() + // Have to wait for engine-side animation to finish + await page.waitForTimeout(600) + await expect(toolbar.lineBtn).toBeEnabled() + await editor.expectEditor.toContain('startSketchOn(offsetPlane001)') + await editor.expectState({ + activeLines: [`offsetPlane001=offsetPlane("XY",10)`], + diagnostics: [], + highlightedCode: '', + }) + }) + }) + }) +}) + +// Regression test for https://github.com/KittyCAD/modeling-app/issues/4891 +test.describe(`Click based selection don't brick the app when clicked out of range after format using cache`, () => { + test(`Can select a line that reformmed after entering sketch mode`, async ({ + context, + page, + scene, + toolbar, + editor, + homePage, + }) => { + // We seed the scene with a single offset plane + await context.addInitScript(() => { + localStorage.setItem( + 'persistCode', + `sketch001 = startSketchOn('XZ') + |> startProfileAt([0, 0], %) + |> line([3.14, 3.14], %) + |> arcTo({ + end = [4, 2], + interior = [1, 2] + }, %) +` + ) + }) + + await homePage.goToModelingScene() + await scene.waitForExecutionDone() + + await test.step(`format the code`, async () => { + // doesn't contain condensed version + await editor.expectEditor.not.toContain( + `arcTo({ end = [4, 2], interior = [1, 2] }, %)` + ) + // click the code to enter sketch mode + await page.getByText(`arcTo`).click() + // Format the code. + await page.locator('#code-pane button:first-child').click() + await page.locator('button:has-text("Format code")').click() + }) + + await test.step(`Ensure the code reformatted`, async () => { + await editor.expectEditor.toContain( + `arcTo({ end = [4, 2], interior = [1, 2] }, %)` + ) + }) + + const [arcClick, arcHover] = scene.makeMouseHelpers(699, 337) + await test.step('Ensure we can hover the arc', async () => { + await arcHover() + + // Check that the code is highlighted + await editor.expectState({ + activeLines: ["sketch001=startSketchOn('XZ')"], + diagnostics: [], + highlightedCode: 'arcTo({end = [4, 2], interior = [1, 2]}, %)', + }) + }) + + await test.step('reset the selection', async () => { + // Move the mouse out of the way + await page.mouse.move(655, 337) + + await editor.expectState({ + activeLines: ["sketch001=startSketchOn('XZ')"], + diagnostics: [], + highlightedCode: '', + }) + }) + + await test.step('Ensure we can click the arc', async () => { + await arcClick() + + // Check that the code is highlighted + await editor.expectState({ + activeLines: [], + diagnostics: [], + highlightedCode: 'arcTo({end = [4, 2], interior = [1, 2]}, %)', + }) + }) + }) +}) diff --git a/e2e/playwright/snapshot-tests.spec.ts b/e2e/playwright/snapshot-tests.spec.ts index 34dd1f543..ea47e62dd 100644 --- a/e2e/playwright/snapshot-tests.spec.ts +++ b/e2e/playwright/snapshot-tests.spec.ts @@ -47,7 +47,11 @@ test.beforeEach(async ({ page }) => { test.setTimeout(60_000) -test( +// We test this end to end already - getting this to work on web just to take +// a snapshot of it feels weird. I'd rather our regular tests fail. +// The primary failure is doExport now relies on the filesystem. We can follow +// up with another PR if we want this back. +test.skip( 'exports of each format should work', { tag: ['@snapshot', '@skipWin', '@skipMacos'] }, async ({ page, context }) => { @@ -77,27 +81,27 @@ part001 = startSketchOn('-XZ') |> yLine(baseHeight, %) |> xLine(baseLen, %) |> angledLineToY({ - angle: topAng, - to: totalHeightHalf, + angle = topAng, + to = totalHeightHalf, }, %, $seg04) |> xLineTo(totalLen, %, $seg03) |> yLine(-armThick, %, $seg01) |> angledLineThatIntersects({ - angle: HALF_TURN, - offset: -armThick, - intersectTag: seg04 + angle = HALF_TURN, + offset = -armThick, + intersectTag = seg04 }, %) |> angledLineToY([segAng(seg04, %) + 180, ZERO], %) |> angledLineToY({ - angle: -bottomAng, - to: -totalHeightHalf - armThick, + angle = -bottomAng, + to = -totalHeightHalf - armThick, }, %, $seg02) |> xLineTo(segEndX(seg03, %) + 0, %) |> yLine(-segLen(seg01, %), %) |> angledLineThatIntersects({ - angle: HALF_TURN, - offset: -armThick, - intersectTag: seg02 + angle = HALF_TURN, + offset = -armThick, + intersectTag = seg02 }, %) |> angledLineToY([segAng(seg02, %) + 180, -baseHeight], %) |> xLineTo(ZERO, %) @@ -283,7 +287,7 @@ part001 = startSketchOn('-XZ') const gltfFilename = filenames.filter((t: string) => t.includes('.gltf') )[0] - if (!gltfFilename) throw new Error('No output.gltf in this archive') + if (!gltfFilename) throw new Error('No gLTF in this archive') cliCommand = `export ZOO_TOKEN=${secrets.snapshottoken} && zoo file snapshot --output-format=png --src-format=${outputType} ${parentPath}/${gltfFilename} ${imagePath}` } @@ -371,6 +375,7 @@ const extrudeDefaultPlane = async (context: any, page: any, plane: string) => { await u.closeKclCodePanel() await expect(page).toHaveScreenshot({ maxDiffPixels: 100, + mask: [page.getByTestId('model-state-indicator')], }) await u.openKclCodePanel() } @@ -462,7 +467,7 @@ test( await page.waitForTimeout(100) code += ` - |> line([7.25, 0], %)` + |> xLine(7.25, %)` await expect(page.locator('.cm-content')).toHaveText(code) await page @@ -592,7 +597,7 @@ test( }) await expect(page.locator('.cm-content')).toHaveText( `sketch001 = startSketchOn('XZ') - |> circle({ center: [14.44, -2.44], radius: 1 }, %)` + |> circle({ center = [14.44, -2.44], radius = 1 }, %)` ) } ) @@ -647,7 +652,7 @@ test.describe( await page.waitForTimeout(100) code += ` - |> line([7.25, 0], %)` + |> xLine(7.25, %)` await expect(u.codeLocator).toHaveText(code) await page @@ -752,7 +757,7 @@ test.describe( await page.waitForTimeout(100) code += ` - |> line([184.3, 0], %)` + |> xLine(184.3, %)` await expect(u.codeLocator).toHaveText(code) await page @@ -950,7 +955,75 @@ test( test.describe('Grid visibility', { tag: '@snapshot' }, () => { // FIXME: Skip on macos its being weird. - test.skip(process.platform === 'darwin', 'Skip on macos') + // test.skip(process.platform === 'darwin', 'Skip on macos') + + test('Grid turned off to on via command bar', async ({ page }) => { + const u = await getUtils(page) + const stream = page.getByTestId('stream') + const mask = [ + page.locator('#app-header'), + page.locator('#sidebar-top-ribbon'), + page.locator('#sidebar-bottom-ribbon'), + ] + + await page.setViewportSize({ width: 1200, height: 500 }) + await page.goto('/') + await u.waitForAuthSkipAppStart() + + await u.openDebugPanel() + // wait for execution done + await expect( + page.locator('[data-message-type="execution-done"]') + ).toHaveCount(1) + await u.closeDebugPanel() + await u.closeKclCodePanel() + // TODO: Find a way to truly know that the objects have finished + // rendering, because an execution-done message is not sufficient. + await page.waitForTimeout(1000) + + // Open the command bar. + await page + .getByRole('button', { name: 'Commands', exact: false }) + .or(page.getByRole('button', { name: '⌘K' })) + .click() + const commandName = 'show scale grid' + const commandOption = page.getByRole('option', { + name: commandName, + exact: false, + }) + const cmdSearchBar = page.getByPlaceholder('Search commands') + // This selector changes after we set the setting + await cmdSearchBar.fill(commandName) + await expect(commandOption).toBeVisible() + await commandOption.click() + + const toggleInput = page.getByPlaceholder('Off') + await expect(toggleInput).toBeVisible() + await expect(toggleInput).toBeFocused() + + // Select On + await page.keyboard.press('ArrowDown') + await expect(page.getByRole('option', { name: 'Off' })).toHaveAttribute( + 'data-headlessui-state', + 'active selected' + ) + await page.keyboard.press('ArrowUp') + await expect(page.getByRole('option', { name: 'On' })).toHaveAttribute( + 'data-headlessui-state', + 'active' + ) + await page.keyboard.press('Enter') + + // Check the toast appeared + await expect( + page.getByText(`Set show scale grid to "true" as a user default`) + ).toBeVisible() + + await expect(stream).toHaveScreenshot({ + maxDiffPixels: 100, + mask, + }) + }) test('Grid turned off', async ({ page }) => { const u = await getUtils(page) @@ -1031,7 +1104,7 @@ test.describe('Grid visibility', { tag: '@snapshot' }, () => { }) }) -test('theme persists', async ({ page, context }) => { +test.fixme('theme persists', async ({ page, context }) => { const u = await getUtils(page) await context.addInitScript(async () => { localStorage.setItem( @@ -1096,3 +1169,109 @@ test('theme persists', async ({ page, context }) => { maxDiffPixels: 100, }) }) + +test.describe('code color goober', { tag: '@snapshot' }, () => { + test('code color goober', async ({ page, context }) => { + const u = await getUtils(page) + await context.addInitScript(async () => { + localStorage.setItem( + 'persistCode', + `// Create a pipe using a sweep. + +// Create a path for the sweep. +sweepPath = startSketchOn('XZ') + |> startProfileAt([0.05, 0.05], %) + |> line([0, 7], %) + |> tangentialArc({ offset = 90, radius = 5 }, %) + |> line([-3, 0], %) + |> tangentialArc({ offset = -90, radius = 5 }, %) + |> line([0, 7], %) + +sweepSketch = startSketchOn('XY') + |> startProfileAt([2, 0], %) + |> arc({ + angleEnd = 360, + angleStart = 0, + radius = 2 + }, %) + |> sweep({ + path = sweepPath, + }, %) + |> appearance({ + color = "#bb00ff", + metalness = 90, + roughness = 90 + }, %) +` + ) + }) + + await page.setViewportSize({ width: 1200, height: 1000 }) + + await u.waitForAuthSkipAppStart() + + await u.openDebugPanel() + await u.expectCmdLog('[data-message-type="execution-done"]') + await u.clearAndCloseDebugPanel() + + await expect(page, 'expect small color widget').toHaveScreenshot({ + maxDiffPixels: 100, + }) + }) + + test('code color goober opening window', async ({ page, context }) => { + const u = await getUtils(page) + await context.addInitScript(async () => { + localStorage.setItem( + 'persistCode', + `// Create a pipe using a sweep. + +// Create a path for the sweep. +sweepPath = startSketchOn('XZ') + |> startProfileAt([0.05, 0.05], %) + |> line([0, 7], %) + |> tangentialArc({ offset = 90, radius = 5 }, %) + |> line([-3, 0], %) + |> tangentialArc({ offset = -90, radius = 5 }, %) + |> line([0, 7], %) + +sweepSketch = startSketchOn('XY') + |> startProfileAt([2, 0], %) + |> arc({ + angleEnd = 360, + angleStart = 0, + radius = 2 + }, %) + |> sweep({ + path = sweepPath, + }, %) + |> appearance({ + color = "#bb00ff", + metalness = 90, + roughness = 90 + }, %) +` + ) + }) + + await page.setViewportSize({ width: 1200, height: 1000 }) + + await u.waitForAuthSkipAppStart() + + await u.openDebugPanel() + await u.expectCmdLog('[data-message-type="execution-done"]') + await u.clearAndCloseDebugPanel() + + await expect(page.locator('.cm-css-color-picker-wrapper')).toBeVisible() + + // Click the color widget + await page.locator('.cm-css-color-picker-wrapper input').click() + + await expect( + page, + 'expect small color widget to have window open' + ).toHaveScreenshot({ + maxDiffPixels: 100, + }) + }) +}) diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Inch-scale-1-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Inch-scale-1-Google-Chrome-linux.png index fb5dd4aac..fa6944cb7 100644 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Inch-scale-1-Google-Chrome-linux.png and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Inch-scale-1-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Inch-scale-1-Google-Chrome-win32.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Inch-scale-1-Google-Chrome-win32.png deleted file mode 100644 index fd6d67c8b..000000000 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Inch-scale-1-Google-Chrome-win32.png and /dev/null differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Inch-scale-2-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Inch-scale-2-Google-Chrome-linux.png index 2b075f300..9ae654912 100644 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Inch-scale-2-Google-Chrome-linux.png and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Inch-scale-2-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Inch-scale-2-Google-Chrome-win32.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Inch-scale-2-Google-Chrome-win32.png deleted file mode 100644 index 7753b12fc..000000000 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Inch-scale-2-Google-Chrome-win32.png and /dev/null differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Millimeter-scale-1-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Millimeter-scale-1-Google-Chrome-linux.png index 2e8e827a6..036ca2ab2 100644 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Millimeter-scale-1-Google-Chrome-linux.png and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Millimeter-scale-1-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Millimeter-scale-1-Google-Chrome-win32.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Millimeter-scale-1-Google-Chrome-win32.png deleted file mode 100644 index d072cf76e..000000000 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Millimeter-scale-1-Google-Chrome-win32.png and /dev/null differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Millimeter-scale-2-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Millimeter-scale-2-Google-Chrome-linux.png index 5b8396b93..d9afbd351 100644 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Millimeter-scale-2-Google-Chrome-linux.png and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Millimeter-scale-2-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Millimeter-scale-2-Google-Chrome-win32.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Millimeter-scale-2-Google-Chrome-win32.png deleted file mode 100644 index 0a291d1b7..000000000 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Millimeter-scale-2-Google-Chrome-win32.png and /dev/null differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-circle-should-look-right-1-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-circle-should-look-right-1-Google-Chrome-linux.png index 22ad3f3e2..3da9ed12b 100644 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-circle-should-look-right-1-Google-Chrome-linux.png and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-circle-should-look-right-1-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-circle-should-look-right-1-Google-Chrome-win32.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-circle-should-look-right-1-Google-Chrome-win32.png deleted file mode 100644 index d302db830..000000000 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-circle-should-look-right-1-Google-Chrome-win32.png and /dev/null differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-rectangles-should-look-right-1-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-rectangles-should-look-right-1-Google-Chrome-linux.png index e3a43017c..bb1654a55 100644 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-rectangles-should-look-right-1-Google-Chrome-linux.png and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-rectangles-should-look-right-1-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-rectangles-should-look-right-1-Google-Chrome-win32.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-rectangles-should-look-right-1-Google-Chrome-win32.png deleted file mode 100644 index 25a04b3f2..000000000 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-rectangles-should-look-right-1-Google-Chrome-win32.png and /dev/null differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-segments-should-look-right-1-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-segments-should-look-right-1-Google-Chrome-linux.png index ddc31ae4e..15a15ce8b 100644 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-segments-should-look-right-1-Google-Chrome-linux.png and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-segments-should-look-right-1-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-segments-should-look-right-1-Google-Chrome-win32.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-segments-should-look-right-1-Google-Chrome-win32.png deleted file mode 100644 index c6a6c0b53..000000000 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-segments-should-look-right-1-Google-Chrome-win32.png and /dev/null differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-segments-should-look-right-2-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-segments-should-look-right-2-Google-Chrome-linux.png index 2a7320235..2b2da82cf 100644 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-segments-should-look-right-2-Google-Chrome-linux.png and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-segments-should-look-right-2-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-segments-should-look-right-2-Google-Chrome-win32.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-segments-should-look-right-2-Google-Chrome-win32.png deleted file mode 100644 index 6e2b1727a..000000000 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-segments-should-look-right-2-Google-Chrome-win32.png and /dev/null differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Grid-visibility-Grid-turned-off-1-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Grid-visibility-Grid-turned-off-1-Google-Chrome-linux.png index d06e5b7b9..b6c149ea4 100644 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Grid-visibility-Grid-turned-off-1-Google-Chrome-linux.png and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Grid-visibility-Grid-turned-off-1-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Grid-visibility-Grid-turned-off-1-Google-Chrome-win32.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Grid-visibility-Grid-turned-off-1-Google-Chrome-win32.png deleted file mode 100644 index 3656ad869..000000000 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Grid-visibility-Grid-turned-off-1-Google-Chrome-win32.png and /dev/null differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Grid-visibility-Grid-turned-off-to-on-via-command-bar-1-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Grid-visibility-Grid-turned-off-to-on-via-command-bar-1-Google-Chrome-linux.png new file mode 100644 index 000000000..dc1bc65ee Binary files /dev/null and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Grid-visibility-Grid-turned-off-to-on-via-command-bar-1-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Grid-visibility-Grid-turned-on-1-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Grid-visibility-Grid-turned-on-1-Google-Chrome-linux.png index 66fcb1ddc..12b4020c5 100644 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Grid-visibility-Grid-turned-on-1-Google-Chrome-linux.png and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Grid-visibility-Grid-turned-on-1-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Grid-visibility-Grid-turned-on-1-Google-Chrome-win32.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Grid-visibility-Grid-turned-on-1-Google-Chrome-win32.png deleted file mode 100644 index d61edb334..000000000 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Grid-visibility-Grid-turned-on-1-Google-Chrome-win32.png and /dev/null differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Sketch-on-face-with-none-z-up-1-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Sketch-on-face-with-none-z-up-1-Google-Chrome-linux.png index e01b575a0..7b18289fe 100644 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Sketch-on-face-with-none-z-up-1-Google-Chrome-linux.png and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Sketch-on-face-with-none-z-up-1-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Sketch-on-face-with-none-z-up-1-Google-Chrome-win32.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Sketch-on-face-with-none-z-up-1-Google-Chrome-win32.png deleted file mode 100644 index abd80123b..000000000 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Sketch-on-face-with-none-z-up-1-Google-Chrome-win32.png and /dev/null differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Zoom-to-fit-on-load---solid-2d-1-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Zoom-to-fit-on-load---solid-2d-1-Google-Chrome-linux.png index e609971d9..3333456b6 100644 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Zoom-to-fit-on-load---solid-2d-1-Google-Chrome-linux.png and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Zoom-to-fit-on-load---solid-2d-1-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Zoom-to-fit-on-load---solid-2d-1-Google-Chrome-win32.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Zoom-to-fit-on-load---solid-2d-1-Google-Chrome-win32.png deleted file mode 100644 index 2a783e73d..000000000 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Zoom-to-fit-on-load---solid-2d-1-Google-Chrome-win32.png and /dev/null differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Zoom-to-fit-on-load---solid-3d-1-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Zoom-to-fit-on-load---solid-3d-1-Google-Chrome-linux.png index 8fa0f8e24..60d8a6d02 100644 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Zoom-to-fit-on-load---solid-3d-1-Google-Chrome-linux.png and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Zoom-to-fit-on-load---solid-3d-1-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Zoom-to-fit-on-load---solid-3d-1-Google-Chrome-win32.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Zoom-to-fit-on-load---solid-3d-1-Google-Chrome-win32.png deleted file mode 100644 index 458fc92bb..000000000 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Zoom-to-fit-on-load---solid-3d-1-Google-Chrome-win32.png and /dev/null differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/code-color-goober-code-color-goober-1-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/code-color-goober-code-color-goober-1-Google-Chrome-linux.png new file mode 100644 index 000000000..81e67db9b Binary files /dev/null and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/code-color-goober-code-color-goober-1-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/code-color-goober-code-color-goober-opening-window-1-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/code-color-goober-code-color-goober-opening-window-1-Google-Chrome-linux.png new file mode 100644 index 000000000..36d45287e Binary files /dev/null and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/code-color-goober-code-color-goober-opening-window-1-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable--XY-1-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable--XY-1-Google-Chrome-linux.png index c3d32ea4b..4835fc353 100644 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable--XY-1-Google-Chrome-linux.png and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable--XY-1-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable--XY-1-Google-Chrome-win32.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable--XY-1-Google-Chrome-win32.png deleted file mode 100644 index 0aa6416c1..000000000 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable--XY-1-Google-Chrome-win32.png and /dev/null differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable--XZ-1-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable--XZ-1-Google-Chrome-linux.png index 127b0f318..62b5700d4 100644 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable--XZ-1-Google-Chrome-linux.png and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable--XZ-1-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable--XZ-1-Google-Chrome-win32.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable--XZ-1-Google-Chrome-win32.png deleted file mode 100644 index 4fe767fc3..000000000 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable--XZ-1-Google-Chrome-win32.png and /dev/null differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable--YZ-1-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable--YZ-1-Google-Chrome-linux.png index 4967bf225..a2c00a40e 100644 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable--YZ-1-Google-Chrome-linux.png and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable--YZ-1-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable--YZ-1-Google-Chrome-win32.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable--YZ-1-Google-Chrome-win32.png deleted file mode 100644 index 722869578..000000000 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable--YZ-1-Google-Chrome-win32.png and /dev/null differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable-XY-1-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable-XY-1-Google-Chrome-linux.png index d05727ebe..dae9df8ee 100644 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable-XY-1-Google-Chrome-linux.png and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable-XY-1-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable-XY-1-Google-Chrome-win32.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable-XY-1-Google-Chrome-win32.png deleted file mode 100644 index d84a8b272..000000000 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable-XY-1-Google-Chrome-win32.png and /dev/null differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable-XZ-1-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable-XZ-1-Google-Chrome-linux.png index 948c1a5a3..8d6793bfd 100644 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable-XZ-1-Google-Chrome-linux.png and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable-XZ-1-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable-XZ-1-Google-Chrome-win32.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable-XZ-1-Google-Chrome-win32.png deleted file mode 100644 index 6f8ac92cb..000000000 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable-XZ-1-Google-Chrome-win32.png and /dev/null differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable-YZ-1-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable-YZ-1-Google-Chrome-linux.png index 49f228f7c..1fdb62f80 100644 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable-YZ-1-Google-Chrome-linux.png and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable-YZ-1-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable-YZ-1-Google-Chrome-win32.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable-YZ-1-Google-Chrome-win32.png deleted file mode 100644 index c307e6d33..000000000 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable-YZ-1-Google-Chrome-win32.png and /dev/null differ diff --git a/e2e/playwright/storageStates.ts b/e2e/playwright/storageStates.ts index ab907d6fa..48b7b98a2 100644 --- a/e2e/playwright/storageStates.ts +++ b/e2e/playwright/storageStates.ts @@ -14,7 +14,7 @@ export const TEST_SETTINGS = { }, modeling: { defaultUnit: 'in', - mouseControls: 'KittyCAD', + mouseControls: 'Zoo', cameraProjection: 'perspective', showDebugPanel: true, }, @@ -109,242 +109,21 @@ keychain = startSketchOn("XY") |> close(%) |> extrude(thickness, %) -// generated from /home/paultag/Downloads/zma-logomark.svg -fn svg = (surface, origin, depth) => { - let a0 = surface |> startProfileAt([origin[0] + 45.430427, origin[1] + -14.627736], %) - |> bezierCurve({ - control1: [ 0, 0.764157 ], - control2: [ 0, 1.528314 ], - to: [ 0, 2.292469 ] - }, %) - |> bezierCurve({ - control1: [ -3.03202, 0 ], - control2: [ -6.064039, 0 ], - to: [ -9.09606, 0 ] - }, %) - |> bezierCurve({ - control1: [ 0, -1.077657 ], - control2: [ 0, -2.155312 ], - to: [ 0, -3.232969 ] - }, %) - |> bezierCurve({ - control1: [ 2.741805, 0 ], - control2: [ 5.483613, 0 ], - to: [ 8.225417, 0 ] - }, %) - |> bezierCurve({ - control1: [ -2.740682, -2.961815 ], - control2: [ -5.490342, -5.925794 ], - to: [ -8.225417, -8.886255 ] - }, %) - |> bezierCurve({ - control1: [ 0, -0.723995 ], - control2: [ 0, -1.447988 ], - to: [ 0, -2.171981 ] - }, %) - |> bezierCurve({ - control1: [ 0.712124, 0.05061 ], - control2: [ 1.511636, -0.09877 ], - to: [ 2.172096, 0.07005 ] - }, %) - |> bezierCurve({ - control1: [ 0.68573, 0.740811 ], - control2: [ 1.371459, 1.481622 ], - to: [ 2.057187, 2.222436 ] - }, %) - |> bezierCurve({ - control1: [ 0, -0.76416 ], - control2: [ 0, -1.52832 ], - to: [ 0, -2.29248 ] - }, %) - |> bezierCurve({ - control1: [ 3.032013, 0 ], - control2: [ 6.064026, 0 ], - to: [ 9.096038, 0 ] - }, %) - |> bezierCurve({ - control1: [ 0, 1.077657 ], - control2: [ 0, 2.155314 ], - to: [ 0, 3.232973 ] - }, %) - |> bezierCurve({ - control1: [ -2.741312, 0 ], - control2: [ -5.482623, 0 ], - to: [ -8.223936, 0 ] - }, %) - |> bezierCurve({ - control1: [ 2.741313, 2.961108 ], - control2: [ 5.482624, 5.922216 ], - to: [ 8.223936, 8.883325 ] - }, %) - |> bezierCurve({ - control1: [ 0, 0.724968 ], - control2: [ 0, 1.449938 ], - to: [ 0, 2.174907 ] - }, %) - |> bezierCurve({ - control1: [ -0.712656, -0.05145 ], - control2: [ -1.512554, 0.09643 ], - to: [ -2.173592, -0.07298 ] - }, %) - |> bezierCurve({ - control1: [ -0.685222, -0.739834 ], - control2: [ -1.370445, -1.479669 ], - to: [ -2.055669, -2.219505 ] - }, %) - |> close(%) - |> extrude(depth, %) +keychain1 = startSketchOn("XY") + |> startProfileAt([0, 0], %) + |> lineTo([width, 0], %) + |> lineTo([width, height], %) + |> lineTo([0, height], %) + |> close(%) + |> extrude(thickness, %) - let a1 = surface |> startProfileAt([origin[0] + 57.920488, origin[1] + -15.244943], %) - |> bezierCurve({ - control1: [ -2.78904, 0.106635 ], - control2: [ -5.052548, -2.969529 ], - to: [ -4.055141, -5.598369 ] - }, %) - |> bezierCurve({ - control1: [ 0.841523, -0.918736 ], - control2: [ 0.439412, -1.541892 ], - to: [ -0.368488, -2.214378 ] - }, %) - |> bezierCurve({ - control1: [ -0.418245, -0.448461 ], - control2: [ -0.836489, -0.896922 ], - to: [ -1.254732, -1.345384 ] - }, %) - |> bezierCurve({ - control1: [ -2.76806, 2.995359 ], - control2: [ -2.32667, 8.18409 ], - to: [ 0.897655, 10.678932 ] - }, %) - |> bezierCurve({ - control1: [ 2.562822, 2.186098 ], - control2: [ 6.605111, 2.28043 ], - to: [ 9.271202, 0.226476 ] - }, %) - |> bezierCurve({ - control1: [ -0.743744, -0.797465 ], - control2: [ -1.487487, -1.594932 ], - to: [ -2.231232, -2.392397 ] - }, %) - |> bezierCurve({ - control1: [ -0.672938, 0.421422 ], - control2: [ -1.465362, 0.646946 ], - to: [ -2.259264, 0.64512 ] - }, %) - |> close(%) - |> extrude(depth, %) - - let a2 = surface |> startProfileAt([origin[0] + 62.19406300000001, origin[1] + -19.500698999999997], %) - |> bezierCurve({ - control1: [ 0.302938, 1.281141 ], - control2: [ -1.53575, 2.434288 ], - to: [ -0.10908, 3.279477 ] - }, %) - |> bezierCurve({ - control1: [ 0.504637, 0.54145 ], - control2: [ 1.009273, 1.082899 ], - to: [ 1.513909, 1.624348 ] - }, %) - |> bezierCurve({ - control1: [ 2.767778, -2.995425 ], - control2: [ 2.327135, -8.184384 ], - to: [ -0.897661, -10.679047 ] - }, %) - |> bezierCurve({ - control1: [ -2.562947, -2.186022 ], - control2: [ -6.604089, -2.279606 ], - to: [ -9.271196, -0.227813 ] - }, %) - |> bezierCurve({ - control1: [ 0.744231, 0.797952 ], - control2: [ 1.488461, 1.595904 ], - to: [ 2.232692, 2.393856 ] - }, %) - |> bezierCurve({ - control1: [ 2.302377, -1.564629 ], - control2: [ 5.793126, -0.15358 ], - to: [ 6.396577, 2.547372 ] - }, %) - |> bezierCurve({ - control1: [ 0.08981, 0.346302 ], - control2: [ 0.134865, 0.704078 ], - to: [ 0.13476, 1.061807 ] - }, %) - |> close(%) - |> extrude(depth, %) - - let a3 = surface |> startProfileAt([origin[0] + 74.124866, origin[1] + -15.244943], %) - |> bezierCurve({ - control1: [ -2.78904, 0.106635 ], - control2: [ -5.052549, -2.969529 ], - to: [ -4.055142, -5.598369 ] - }, %) - |> bezierCurve({ - control1: [ 0.841527, -0.918738 ], - control2: [ 0.43941, -1.541892 ], - to: [ -0.368497, -2.214367 ] - }, %) - |> bezierCurve({ - control1: [ -0.418254, -0.448466 ], - control2: [ -0.836507, -0.896931 ], - to: [ -1.254761, -1.345395 ] - }, %) - |> bezierCurve({ - control1: [ -2.768019, 2.995371 ], - control2: [ -2.326624, 8.184088 ], - to: [ 0.897678, 10.678932 ] - }, %) - |> bezierCurve({ - control1: [ 2.56289, 2.186191 ], - control2: [ 6.60516, 2.280307 ], - to: [ 9.271371, 0.226476 ] - }, %) - |> bezierCurve({ - control1: [ -0.743808, -0.797465 ], - control2: [ -1.487616, -1.594932 ], - to: [ -2.231424, -2.392397 ] - }, %) - |> bezierCurve({ - control1: [ -0.672916, 0.421433 ], - control2: [ -1.465344, 0.646926 ], - to: [ -2.259225, 0.64512 ] - }, %) - |> close(%) - |> extrude(depth, %) - - let a4 = surface |> startProfileAt([origin[0] + 77.57333899999998, origin[1] + -16.989262999999998], %) - |> bezierCurve({ - control1: [ 0.743298, 0.797463 ], - control2: [ 1.486592, 1.594926 ], - to: [ 2.229888, 2.392389 ] - }, %) - |> bezierCurve({ - control1: [ 2.767827, -2.995393 ], - control2: [ 2.327103, -8.184396 ], - to: [ -0.897672, -10.679047 ] - }, %) - |> bezierCurve({ - control1: [ -2.562939, -2.186037 ], - control2: [ -6.604077, -2.279589 ], - to: [ -9.271185, -0.227813 ] - }, %) - |> bezierCurve({ - control1: [ 0.744243, 0.797952 ], - control2: [ 1.488486, 1.595904 ], - to: [ 2.232729, 2.393856 ] - }, %) - |> bezierCurve({ - control1: [ 2.302394, -1.564623 ], - control2: [ 5.793201, -0.153598 ], - to: [ 6.396692, 2.547372 ] - }, %) - |> bezierCurve({ - control1: [ 0.32074, 1.215468 ], - control2: [ 0.06159, 2.564765 ], - to: [ -0.690452, 3.573243 ] - }, %) - |> close(%) - |> extrude(depth, %) +keychain2 = startSketchOn("XY") + |> startProfileAt([0, 0], %) + |> lineTo([width, 0], %) + |> lineTo([width, height], %) + |> lineTo([0, height], %) + |> close(%) + |> extrude(thickness, %) box = startSketchOn('XY') |> startProfileAt([0, 0], %) @@ -354,7 +133,7 @@ box = startSketchOn('XY') |> close(%) |> extrude(10, %) - sketch001 = startSketchOn(box, revolveAxis) +sketch001 = startSketchOn(box, revolveAxis) |> startProfileAt([5, 10], %) |> line([0, -10], %) |> line([2, 0], %) @@ -364,18 +143,12 @@ box = startSketchOn('XY') axis: revolveAxis, angle: 90 }, %) - return 0 -} +sketch001 = startSketchOn('XZ') + |> startProfileAt([0.0, 0.0], %) + |> xLine(0.0, %) + |> close(%) - -svg(startSketchOn(keychain, 'end'), [-33, 32], -thickness) - -startSketchOn(keychain, 'end') - |> circle({ center: [ - width / 2, - height - (keychainHoleSize + 1.5) - ], radius: keychainHoleSize }, %) - |> extrude(-thickness, %)` +` export const TEST_CODE_TRIGGER_ENGINE_EXPORT_ERROR = `thing = 1` diff --git a/e2e/playwright/test-network-and-connection-issues.spec.ts b/e2e/playwright/test-network-and-connection-issues.spec.ts index 583a7f954..c1ba42eb5 100644 --- a/e2e/playwright/test-network-and-connection-issues.spec.ts +++ b/e2e/playwright/test-network-and-connection-issues.spec.ts @@ -1,29 +1,16 @@ -import { test, expect } from '@playwright/test' +import { test, expect } from './zoo-test' -import { commonPoints, getUtils, setup, tearDown } from './test-utils' - -test.beforeEach(async ({ context, page }, testInfo) => { - await setup(context, page, testInfo) -}) - -test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) +import { commonPoints, getUtils } from './test-utils' test.describe('Test network and connection issues', () => { test('simulate network down and network little widget', async ({ page, - browserName, + homePage, }) => { - // TODO: Don't skip Mac for these. After `window.tearDown` is working in Safari, these should work on webkit - test.skip( - browserName === 'webkit', - 'Skip on Safari until `window.tearDown` is working there' - ) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() const networkToggle = page.getByTestId('network-toggle') @@ -62,7 +49,7 @@ test.describe('Test network and connection issues', () => { }) // Expect the network to be down - await expect(networkToggle).toContainText('Offline') + await expect(networkToggle).toContainText('Problem') // Click the network widget await networkWidget.click() @@ -93,26 +80,19 @@ test.describe('Test network and connection issues', () => { test('Engine disconnect & reconnect in sketch mode', async ({ page, - browserName, + homePage, }) => { // TODO: Don't skip Mac for these. After `window.tearDown` is working in Safari, these should work on webkit - test.skip( - browserName === 'webkit', - 'Skip on Safari until `window.tearDown` is working there' - ) const networkToggle = page.getByTestId('network-toggle') const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) const PUR = 400 / 37.5 //pixeltoUnitRatio - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() + await u.openDebugPanel() - - await expect( - page.getByRole('button', { name: 'Start Sketch' }) - ).not.toBeDisabled({ timeout: 15000 }) - // click on "Start Sketch" button await u.clearCommandLogs() await page.getByRole('button', { name: 'Start Sketch' }).click() @@ -132,7 +112,7 @@ test.describe('Test network and connection issues', () => { await page.mouse.click(startXPx + PUR * 10, 500 - PUR * 10) await expect(page.locator('.cm-content')) .toHaveText(`sketch001 = startSketchOn('XZ') - |> startProfileAt(${commonPoints.startAt}, %)`) + |> startProfileAt(${commonPoints.startAt}, %)`) await page.waitForTimeout(100) await page.mouse.click(startXPx + PUR * 20, 500 - PUR * 10) @@ -140,8 +120,8 @@ test.describe('Test network and connection issues', () => { await expect(page.locator('.cm-content')) .toHaveText(`sketch001 = startSketchOn('XZ') - |> startProfileAt(${commonPoints.startAt}, %) - |> line([${commonPoints.num1}, 0], %)`) + |> startProfileAt(${commonPoints.startAt}, %) + |> xLine(${commonPoints.num1}, %)`) // Expect the network to be up await expect(networkToggle).toContainText('Connected') @@ -156,7 +136,7 @@ test.describe('Test network and connection issues', () => { }) // Expect the network to be down - await expect(networkToggle).toContainText('Offline') + await expect(networkToggle).toContainText('Problem') // Ensure we are not in sketch mode await expect( @@ -207,7 +187,7 @@ test.describe('Test network and connection issues', () => { await expect.poll(u.normalisedEditorCode) .toBe(`sketch001 = startSketchOn('XZ') |> startProfileAt([12.34, -12.34], %) - |> line([12.34, 0], %) + |> xLine(12.34, %) |> line([-12.34, 12.34], %) `) @@ -217,9 +197,9 @@ test.describe('Test network and connection issues', () => { await expect.poll(u.normalisedEditorCode) .toBe(`sketch001 = startSketchOn('XZ') |> startProfileAt([12.34, -12.34], %) - |> line([12.34, 0], %) + |> xLine(12.34, %) |> line([-12.34, 12.34], %) - |> line([-12.34, 0], %) + |> xLine(-12.34, %) `) diff --git a/e2e/playwright/test-utils.ts b/e2e/playwright/test-utils.ts index c739f88fb..01164207b 100644 --- a/e2e/playwright/test-utils.ts +++ b/e2e/playwright/test-utils.ts @@ -1,22 +1,21 @@ import { expect, - Page, - Download, BrowserContext, TestInfo, _electron as electron, + ElectronApplication, Locator, - test, } from '@playwright/test' +import { test, Page } from './zoo-test' import { EngineCommand } from 'lang/std/artifactGraph' import fsp from 'fs/promises' import fsSync from 'fs' -import { join } from 'path' +import path from 'path' import pixelMatch from 'pixelmatch' import { PNG } from 'pngjs' import { Protocol } from 'playwright-core/types/protocol' import type { Models } from '@kittycad/lib' -import { APP_NAME, COOKIE_NAME } from 'lib/constants' +import { COOKIE_NAME } from 'lib/constants' import { secrets } from './secrets' import { TEST_SETTINGS_KEY, @@ -30,6 +29,10 @@ import { isErrorWhitelisted } from './lib/console-error-whitelist' import { isArray } from 'lib/utils' import { reportRejection } from 'lib/trap' +const toNormalizedCode = (text: string) => { + return text.replace(/\s+/g, '') +} + type TestColor = [number, number, number] export const TEST_COLORS = { WHITE: [249, 249, 249] as TestColor, @@ -45,7 +48,9 @@ export const commonPoints = { startAt: '[7.19, -9.7]', num1: 7.25, num2: 14.44, -} + /** The Y-value of a common lineTo move we perform in tests */ + num3: -2.44, +} as const /** A semi-reliable color to check the default XZ plane on * in dark mode in the default camera position @@ -96,11 +101,16 @@ async function removeCurrentCode(page: Page) { } export async function sendCustomCmd(page: Page, cmd: EngineCommand) { - await page.getByTestId('custom-cmd-input').fill(JSON.stringify(cmd)) + const json = JSON.stringify(cmd) + await page.getByTestId('custom-cmd-input').fill(json) + await expect(page.getByTestId('custom-cmd-input')).toHaveValue(json) + await page.getByTestId('custom-cmd-send-button').scrollIntoViewIfNeeded() await page.getByTestId('custom-cmd-send-button').click() } async function clearCommandLogs(page: Page) { + await page.getByTestId('custom-cmd-input').fill('') + await page.getByTestId('clear-commands').scrollIntoViewIfNeeded() await page.getByTestId('clear-commands').click() } @@ -118,19 +128,49 @@ async function waitForDefaultPlanesToBeVisible(page: Page) { ) } -async function openPane(page: Page, testId: string) { - const locator = page.getByTestId(testId) - await expect(locator).toBeVisible() - const isOpen = (await locator?.getAttribute('aria-pressed')) === 'true' +export async function checkIfPaneIsOpen(page: Page, testId: string) { + const paneButtonLocator = page.getByTestId(testId) + await expect(paneButtonLocator).toBeVisible() + return (await paneButtonLocator?.getAttribute('aria-pressed')) === 'true' +} + +export async function openPane(page: Page, testId: string) { + const paneButtonLocator = page.getByTestId(testId) + await expect(paneButtonLocator).toBeVisible() + const isOpen = await checkIfPaneIsOpen(page, testId) if (!isOpen) { - await locator.click() - await expect(locator).toHaveAttribute('aria-pressed', 'true') + await paneButtonLocator.click() } + await expect(paneButtonLocator).toHaveAttribute('aria-pressed', 'true') +} + +export async function closePane(page: Page, testId: string) { + const paneButtonLocator = page.getByTestId(testId) + await expect(paneButtonLocator).toBeVisible() + const isOpen = await checkIfPaneIsOpen(page, testId) + + if (isOpen) { + await paneButtonLocator.click() + } + await expect(paneButtonLocator).toHaveAttribute('aria-pressed', 'false') } async function openKclCodePanel(page: Page) { await openPane(page, 'code-pane-button') + + // Code Mirror lazy loads text! Wowza! Let's force-load the text for tests. + await page.evaluate(() => { + // editorManager is available on the window object. + //@ts-ignore this is in an entirely different context that tsc can't see. + editorManager._editorView.dispatch({ + selection: { + //@ts-ignore this is in an entirely different context that tsc can't see. + anchor: editorManager._editorView.docView.length, + }, + scrollIntoView: true, + }) + }) } async function closeKclCodePanel(page: Page) { @@ -146,6 +186,9 @@ async function closeKclCodePanel(page: Page) { async function openDebugPanel(page: Page) { await openPane(page, 'debug-pane-button') + + // The debug pane needs time to load everything. + await page.waitForTimeout(3000) } export async function closeDebugPanel(page: Page) { @@ -286,7 +329,7 @@ export const getMovementUtils = (opts: any) => { return [last.x, last.y] } - return { toSU, click00r } + return { toSU, toU, click00r } } async function waitForAuthAndLsp(page: Page) { @@ -393,6 +436,10 @@ export async function getUtils(page: Page, test_?: typeof test) { .boundingBox({ timeout: 5_000 }) .then((box) => ({ ...box, x: box?.x || 0, y: box?.y || 0 })), codeLocator: page.locator('.cm-content'), + crushKclCodeIntoOneLineAndThenMaybeSome: async () => { + const code = await page.locator('.cm-content').innerText() + return code.replaceAll(' ', '').replaceAll('\n', '') + }, normalisedEditorCode: async () => { const code = await page.locator('.cm-content').innerText() return normaliseKclNumbers(code) @@ -463,27 +510,18 @@ export async function getUtils(page: Page, test_?: typeof test) { ) }, - toNormalizedCode: (text: string) => { - return text.replace(/\s+/g, '') + toNormalizedCode(text: string) { + return toNormalizedCode(text) }, - createAndSelectProject: async (hasText: string) => { - return test_?.step( - `Create and select project with text "${hasText}"`, - async () => { - // Without this, we get unreliable project creation. It's probably - // due to a race between the FS being read and clicking doing something. - await page.waitForTimeout(100) - await page.getByTestId('home-new-file').click() - const projectLinksPost = page.getByTestId('project-link') - await projectLinksPost.filter({ hasText }).click() - } - ) - }, - - editorTextMatches: async (code: string) => { + async editorTextMatches(code: string) { const editor = page.locator(editorSelector) - return expect(editor).toHaveText(code, { useInnerText: true }) + return expect + .poll(async () => { + const text = await editor.textContent() + return toNormalizedCode(text ?? '') + }) + .toContain(toNormalizedCode(code)) }, pasteCodeInEditor: async (code: string) => { @@ -509,7 +547,7 @@ export async function getUtils(page: Page, test_?: typeof test) { page.getByRole('button', { name: 'Start Sketch' }) ).not.toBeDisabled() await page.getByTestId('create-file-button').click() - await page.getByTestId('file-rename-field').fill(name) + await page.getByTestId('tree-input-field').fill(name) await page.keyboard.press('Enter') }) }, @@ -520,6 +558,9 @@ export async function getUtils(page: Page, test_?: typeof test) { .locator('[data-testid="file-pane-scroll-container"] button') .filter({ hasText: name }) .click() + await expect(page.getByTestId('project-sidebar-toggle')).toContainText( + name + ) }) }, @@ -666,6 +707,34 @@ export const makeTemplate: ( } } +const PLAYWRIGHT_DOWNLOAD_DIR = 'downloads-during-playwright' + +export const getPlaywrightDownloadDir = (page: Page) => { + return path.resolve(page.dir, PLAYWRIGHT_DOWNLOAD_DIR) +} + +const moveDownloadedFileTo = async (page: Page, toLocation: string) => { + await fsp.mkdir(path.dirname(toLocation), { recursive: true }) + + const downloadDir = getPlaywrightDownloadDir(page) + + // Expect there to be at least one file + await expect + .poll(async () => { + const files = await fsp.readdir(downloadDir) + return files.length + }) + .toBeGreaterThan(0) + + // Go through the downloads dir and move files to new location + const files = await fsp.readdir(downloadDir) + + // Assumption: only ever one file here. + for (let file of files) { + await fsp.rename(path.resolve(downloadDir, file), toLocation) + } +} + export interface Paths { modelPath: string imagePath: string @@ -678,7 +747,8 @@ export const doExport = async ( exportFrom: 'dropdown' | 'sidebarButton' | 'commandBar' = 'dropdown' ): Promise => { if (exportFrom === 'dropdown') { - await page.getByRole('button', { name: APP_NAME }).click() + await page.getByTestId('project-sidebar-toggle').click() + const exportMenuButton = page.getByRole('button', { name: 'Export current part', }) @@ -719,25 +789,12 @@ export const doExport = async ( } await expect(page.getByText('Confirm Export')).toBeVisible() - const getPromiseAndResolve = () => { - let resolve: any = () => {} - const promise = new Promise((r) => { - resolve = r - }) - return [promise, resolve] - } - - const [downloadPromise1, downloadResolve1] = getPromiseAndResolve() - let downloadCnt = 0 - - if (exportFrom === 'dropdown') - page.on('download', async (download) => { - if (downloadCnt === 0) { - downloadResolve1(download) - } - downloadCnt++ - }) await page.getByRole('button', { name: 'Submit command' }).click() + + // This usually happens immediately after. If we're too slow we don't + // catch it. + await expect(page.getByText('Exported successfully')).toBeVisible() + if (exportFrom === 'sidebarButton' || exportFrom === 'commandBar') { return { modelPath: '', @@ -747,15 +804,12 @@ export const doExport = async ( } // Handle download - const download = await downloadPromise1 const downloadLocationer = (extra = '', isImage = false) => `./e2e/playwright/export-snapshots/${output.type}-${ 'storage' in output ? output.storage : '' }${extra}.${isImage ? 'png' : output.type}` const downloadLocation = downloadLocationer() - await download.saveAs(downloadLocation) - if (output.type === 'step') { // stable timestamps for step files const fileContents = await fsp.readFile(downloadLocation, 'utf-8') @@ -764,6 +818,12 @@ export const doExport = async ( '1970-01-01T00:00:00.0+00:00' ) await fsp.writeFile(downloadLocation, newFileContents) + } else { + // By default all files are downloaded to the same place in playwright + // (declared in src/lib/exportSave) + // To remain consistent with our old web tests, we want to move some downloads + // (images) to another directory. + await moveDownloadedFileTo(page, downloadLocation) } return { @@ -790,6 +850,8 @@ export async function tearDown(page: Page, testInfo: TestInfo) { // It seems it's best to give the browser about 3s to close things // It's not super reliable but we have no real other choice for now await page.waitForTimeout(3000) + + await testInfo.tronApp?.close() } // settingsOverrides may need to be augmented to take more generic items, @@ -800,12 +862,24 @@ export async function setup( testInfo?: TestInfo ) { await context.addInitScript( - async ({ token, settingsKey, settings, IS_PLAYWRIGHT_KEY }) => { + async ({ + token, + settingsKey, + settings, + IS_PLAYWRIGHT_KEY, + PLAYWRIGHT_TEST_DIR, + PERSIST_MODELING_CONTEXT, + }) => { localStorage.clear() localStorage.setItem('TOKEN_PERSIST_KEY', token) localStorage.setItem('persistCode', ``) + localStorage.setItem( + PERSIST_MODELING_CONTEXT, + JSON.stringify({ openPanes: ['code'] }) + ) localStorage.setItem(settingsKey, settings) localStorage.setItem(IS_PLAYWRIGHT_KEY, 'true') + localStorage.setItem('PLAYWRIGHT_TEST_DIR', PLAYWRIGHT_TEST_DIR) }, { token: secrets.token, @@ -822,6 +896,8 @@ export async function setup( } as Partial, }), IS_PLAYWRIGHT_KEY, + PLAYWRIGHT_TEST_DIR: TEST_SETTINGS.app.projectDirectory, + PERSIST_MODELING_CONTEXT, } ) @@ -840,12 +916,15 @@ export async function setup( await page.emulateMedia({ reducedMotion: 'reduce' }) // Trigger a navigation, since loading file:// doesn't. - await page.reload() + // await page.reload() } +let electronApp: ElectronApplication | undefined = undefined +let context: BrowserContext | undefined = undefined +let page: Page | undefined = undefined + export async function setupElectron({ testInfo, - folderSetupFn, cleanProjectDir = true, appSettings, }: { @@ -853,7 +932,12 @@ export async function setupElectron({ folderSetupFn?: (projectDirName: string) => Promise cleanProjectDir?: boolean appSettings?: Partial -}) { +}): Promise<{ + electronApp: ElectronApplication + context: BrowserContext + page: Page + dir: string +}> { // create or otherwise clear the folder const projectDirName = testInfo.outputPath('electron-test-projects-dir') try { @@ -868,7 +952,7 @@ export async function setupElectron({ await fsp.mkdir(projectDirName) } - const electronApp = await electron.launch({ + const options = { args: ['.', '--no-sandbox'], env: { ...process.env, @@ -878,14 +962,22 @@ export async function setupElectron({ ...(process.env.ELECTRON_OVERRIDE_DIST_PATH ? { executablePath: process.env.ELECTRON_OVERRIDE_DIST_PATH + 'electron' } : {}), - }) - const context = electronApp.context() - const page = await electronApp.firstWindow() - context.on('console', console.log) - page.on('console', console.log) + } + + // Do this once and then reuse window on subsequent calls. + if (!electronApp) { + electronApp = await electron.launch(options) + } + + if (!context || !page) { + context = electronApp.context() + page = await electronApp.firstWindow() + context.on('console', console.log) + page.on('console', console.log) + } if (cleanProjectDir) { - const tempSettingsFilePath = join(projectDirName, SETTINGS_FILE_NAME) + const tempSettingsFilePath = path.join(projectDirName, SETTINGS_FILE_NAME) const settingsOverrides = TOML.stringify( appSettings ? { @@ -912,11 +1004,7 @@ export async function setupElectron({ await fsp.writeFile(tempSettingsFilePath, settingsOverrides) } - await folderSetupFn?.(projectDirName) - - await setup(context, page) - - return { electronApp, page, dir: projectDirName } + return { electronApp, page, context, dir: projectDirName } } function failOnConsoleErrors(page: Page, testInfo?: TestInfo) { @@ -980,34 +1068,29 @@ export async function isOutOfViewInScrollContainer( return isOutOfView } -export async function createProjectAndRenameIt({ +export async function createProject({ name, page, + returnHome = false, }: { name: string page: Page + returnHome?: boolean }) { - await page.getByRole('button', { name: 'New project' }).click() - await expect(page.getByText('Successfully created')).toBeVisible() - await expect(page.getByText('Successfully created')).not.toBeVisible() + await test.step(`Create project and navigate to it`, async () => { + await page.getByRole('button', { name: 'New project' }).click() + await page.getByRole('textbox', { name: 'Name' }).fill(name) + await page.getByRole('button', { name: 'Continue' }).click() - await expect(page.getByText(`project-000`)).toBeVisible() - await page.getByText(`project-000`).hover() - await page.getByText(`project-000`).focus() - - await page.getByLabel('sketch').first().click() - - await page.waitForTimeout(100) - - // type the name passed in - await page.keyboard.press('Backspace') - await page.keyboard.type(name) - - await page.getByLabel('checkmark').last().click() + if (returnHome) { + await page.waitForURL('**/file/**', { waitUntil: 'domcontentloaded' }) + await page.getByTestId('app-logo').click() + } + }) } export function executorInputPath(fileName: string): string { - return join('src', 'wasm-lib', 'tests', 'executor', 'inputs', fileName) + return path.join('src', 'wasm-lib', 'tests', 'executor', 'inputs', fileName) } export async function doAndWaitForImageDiff( @@ -1098,3 +1181,12 @@ export function getPixelRGBs(page: Page) { }) } } + +export async function pollEditorLinesSelectedLength(page: Page, lines: number) { + return expect + .poll(async () => { + const lines = await page.locator('.cm-activeLine').all() + return lines.length + }) + .toBe(lines) +} diff --git a/e2e/playwright/testing-camera-movement.spec.ts b/e2e/playwright/testing-camera-movement.spec.ts index c4bbd8ebf..0da8d55c3 100644 --- a/e2e/playwright/testing-camera-movement.spec.ts +++ b/e2e/playwright/testing-camera-movement.spec.ts @@ -1,23 +1,20 @@ -import { test, expect } from '@playwright/test' +import { test, expect } from './zoo-test' import { EngineCommand } from 'lang/std/artifactGraph' import { uuidv4 } from 'lib/utils' -import { getUtils, setup, tearDown } from './test-utils' - -test.beforeEach(async ({ context, page }, testInfo) => { - await setup(context, page, testInfo) -}) - -test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) +import { getUtils } from './test-utils' test.describe('Testing Camera Movement', () => { - test('Can move camera reliably', async ({ page, context }) => { - test.skip(process.platform === 'darwin', 'Can move camera reliably') + test('Can move camera reliably', async ({ page, context, homePage }) => { + // TODO: fix this test on windows too after the electron migration + const winOrMac = + process.platform === 'win32' || process.platform === 'darwin' + // eslint-disable-next-line + test.skip(winOrMac, 'Skip on windows') const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() await u.openAndClearDebugPanel() await u.closeKclCodePanel() @@ -181,170 +178,177 @@ test.describe('Testing Camera Movement', () => { }, [0, -85, -85]) }) - test('Zoom should be consistent when exiting or entering sketches', async ({ - page, - }) => { - // start new sketch pan and zoom before exiting, when exiting the sketch should stay in the same place - // than zoom and pan outside of sketch mode and enter again and it should not change from where it is - // than again for sketching + // TODO: fix after electron migration is merged + test.fixme( + 'Zoom should be consistent when exiting or entering sketches', + async ({ page, homePage }) => { + // start new sketch pan and zoom before exiting, when exiting the sketch should stay in the same place + // than zoom and pan outside of sketch mode and enter again and it should not change from where it is + // than again for sketching - test.skip(process.platform !== 'darwin', 'Zoom should be consistent') - const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + const u = await getUtils(page) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() - await u.openDebugPanel() + await homePage.goToModelingScene() + await u.waitForPageLoad() + await u.openDebugPanel() - await expect( - page.getByRole('button', { name: 'Start Sketch' }) - ).not.toBeDisabled() - await expect( - page.getByRole('button', { name: 'Start Sketch' }) - ).toBeVisible() + await expect( + page.getByRole('button', { name: 'Start Sketch' }) + ).not.toBeDisabled() + await expect( + page.getByRole('button', { name: 'Start Sketch' }) + ).toBeVisible() - // click on "Start Sketch" button - await u.clearCommandLogs() - await page.getByRole('button', { name: 'Start Sketch' }).click() - await page.waitForTimeout(100) - - // select a plane - await page.mouse.click(700, 325) - - let code = `sketch001 = startSketchOn('XY')` - await expect(u.codeLocator).toHaveText(code) - await u.closeDebugPanel() - - await page.waitForTimeout(500) // TODO detect animation ending, or disable animation - - // move the camera slightly - await page.keyboard.down('Shift') - await page.mouse.move(700, 300) - await page.mouse.down({ button: 'right' }) - await page.mouse.move(800, 200) - await page.mouse.up({ button: 'right' }) - await page.keyboard.up('Shift') - - let y = 350, - x = 948 - - await u.canvasLocator.click({ position: { x: 783, y } }) - code += `\n |> startProfileAt([8.12, -12.98], %)` - // await expect(u.codeLocator).toHaveText(code) - await u.canvasLocator.click({ position: { x, y } }) - code += `\n |> line([11.18, 0], %)` - // await expect(u.codeLocator).toHaveText(code) - await u.canvasLocator.click({ position: { x, y: 275 } }) - code += `\n |> line([0, 6.99], %)` - // await expect(u.codeLocator).toHaveText(code) - - // click the line button - await page.getByRole('button', { name: 'line Line', exact: true }).click() - - const hoverOverNothing = async () => { - // await u.canvasLocator.hover({position: {x: 700, y: 325}}) - await page.mouse.move(700, 325) + // click on "Start Sketch" button + await u.clearCommandLogs() + await page.getByRole('button', { name: 'Start Sketch' }).click() await page.waitForTimeout(100) - await expect(page.getByTestId('hover-highlight')).not.toBeVisible({ + + // select a plane + await page.mouse.click(700, 325) + + let code = `sketch001 = startSketchOn('XY')` + await expect(u.codeLocator).toHaveText(code) + await u.closeDebugPanel() + + await page.waitForTimeout(500) // TODO detect animation ending, or disable animation + + // move the camera slightly + await page.keyboard.down('Shift') + await page.mouse.move(700, 300) + await page.mouse.down({ button: 'right' }) + await page.mouse.move(800, 200) + await page.mouse.up({ button: 'right' }) + await page.keyboard.up('Shift') + + let y = 350, + x = 948 + + await u.canvasLocator.click({ position: { x: 783, y } }) + code += `\n |> startProfileAt([8.12, -12.98], %)` + // await expect(u.codeLocator).toHaveText(code) + await u.canvasLocator.click({ position: { x, y } }) + code += `\n |> line([11.18, 0], %)` + // await expect(u.codeLocator).toHaveText(code) + await u.canvasLocator.click({ position: { x, y: 275 } }) + code += `\n |> line([0, 6.99], %)` + // await expect(u.codeLocator).toHaveText(code) + + // click the line button + await page.getByRole('button', { name: 'line Line', exact: true }).click() + + const hoverOverNothing = async () => { + // await u.canvasLocator.hover({position: {x: 700, y: 325}}) + await page.mouse.move(700, 325) + await page.waitForTimeout(100) + await expect(page.getByTestId('hover-highlight')).not.toBeVisible({ + timeout: 10_000, + }) + } + + await expect(page.getByTestId('hover-highlight')).not.toBeVisible() + + await page.waitForTimeout(200) + // hover over horizontal line + await u.canvasLocator.hover({ position: { x: 800, y } }) + await expect(page.getByTestId('hover-highlight').first()).toBeVisible({ + timeout: 10_000, + }) + await page.waitForTimeout(200) + + await hoverOverNothing() + await page.waitForTimeout(200) + // hover over vertical line + await u.canvasLocator.hover({ position: { x, y: 325 } }) + await expect(page.getByTestId('hover-highlight').first()).toBeVisible({ + timeout: 10_000, + }) + + await hoverOverNothing() + + // click exit sketch + await page.getByRole('button', { name: 'Exit Sketch' }).click() + await page.waitForTimeout(400) + + await hoverOverNothing() + await page.waitForTimeout(200) + // hover over horizontal line + await page.mouse.move(858, y, { steps: 5 }) + await expect(page.getByTestId('hover-highlight').first()).toBeVisible({ + timeout: 10_000, + }) + + await hoverOverNothing() + + // hover over vertical line + await page.mouse.move(x, 325) + await expect(page.getByTestId('hover-highlight').first()).toBeVisible({ + timeout: 10_000, + }) + + await hoverOverNothing() + + // hover over vertical line + await page.mouse.move(857, y) + await expect(page.getByTestId('hover-highlight').first()).toBeVisible({ + timeout: 10_000, + }) + // now click it + await page.mouse.click(857, y) + + await expect( + page.getByRole('button', { name: 'Edit Sketch' }) + ).toBeVisible() + await hoverOverNothing() + await page.getByRole('button', { name: 'Edit Sketch' }).click() + + await page.waitForTimeout(400) + + x = 975 + y = 468 + + await page.waitForTimeout(100) + await page.mouse.move(x, 419, { steps: 5 }) + await expect(page.getByTestId('hover-highlight').first()).toBeVisible({ + timeout: 10_000, + }) + + await hoverOverNothing() + + await page.mouse.move(855, y) + await expect(page.getByTestId('hover-highlight').first()).toBeVisible({ + timeout: 10_000, + }) + + await hoverOverNothing() + + await page.getByRole('button', { name: 'Exit Sketch' }).click() + await page.waitForTimeout(200) + + await hoverOverNothing() + await page.waitForTimeout(200) + + await page.mouse.move(x, 419) + await expect(page.getByTestId('hover-highlight').first()).toBeVisible({ + timeout: 10_000, + }) + + await hoverOverNothing() + + await page.mouse.move(855, y) + await expect(page.getByTestId('hover-highlight').first()).toBeVisible({ timeout: 10_000, }) } + ) - await expect(page.getByTestId('hover-highlight')).not.toBeVisible() - - await page.waitForTimeout(200) - // hover over horizontal line - await u.canvasLocator.hover({ position: { x: 800, y } }) - await expect(page.getByTestId('hover-highlight').first()).toBeVisible({ - timeout: 10_000, - }) - await page.waitForTimeout(200) - - await hoverOverNothing() - await page.waitForTimeout(200) - // hover over vertical line - await u.canvasLocator.hover({ position: { x, y: 325 } }) - await expect(page.getByTestId('hover-highlight').first()).toBeVisible({ - timeout: 10_000, - }) - - await hoverOverNothing() - - // click exit sketch - await page.getByRole('button', { name: 'Exit Sketch' }).click() - await page.waitForTimeout(400) - - await hoverOverNothing() - await page.waitForTimeout(200) - // hover over horizontal line - await page.mouse.move(858, y, { steps: 5 }) - await expect(page.getByTestId('hover-highlight').first()).toBeVisible({ - timeout: 10_000, - }) - - await hoverOverNothing() - - // hover over vertical line - await page.mouse.move(x, 325) - await expect(page.getByTestId('hover-highlight').first()).toBeVisible({ - timeout: 10_000, - }) - - await hoverOverNothing() - - // hover over vertical line - await page.mouse.move(857, y) - await expect(page.getByTestId('hover-highlight').first()).toBeVisible({ - timeout: 10_000, - }) - // now click it - await page.mouse.click(857, y) - - await expect( - page.getByRole('button', { name: 'Edit Sketch' }) - ).toBeVisible() - await hoverOverNothing() - await page.getByRole('button', { name: 'Edit Sketch' }).click() - - await page.waitForTimeout(400) - - x = 975 - y = 468 - - await page.waitForTimeout(100) - await page.mouse.move(x, 419, { steps: 5 }) - await expect(page.getByTestId('hover-highlight').first()).toBeVisible({ - timeout: 10_000, - }) - - await hoverOverNothing() - - await page.mouse.move(855, y) - await expect(page.getByTestId('hover-highlight').first()).toBeVisible({ - timeout: 10_000, - }) - - await hoverOverNothing() - - await page.getByRole('button', { name: 'Exit Sketch' }).click() - await page.waitForTimeout(200) - - await hoverOverNothing() - await page.waitForTimeout(200) - - await page.mouse.move(x, 419) - await expect(page.getByTestId('hover-highlight').first()).toBeVisible({ - timeout: 10_000, - }) - - await hoverOverNothing() - - await page.mouse.move(855, y) - await expect(page.getByTestId('hover-highlight').first()).toBeVisible({ - timeout: 10_000, - }) - }) - - test(`Zoom by scroll should not fire while orbiting`, async ({ page }) => { + test(`Zoom by scroll should not fire while orbiting`, async ({ + homePage, + page, + }) => { + // TODO: fix this test on windows after the electron migration + test.skip(process.platform === 'win32', 'Skip on windows') /** * Currently we only allow zooming by scroll when no other camera movement is happening, * set within cameraMouseDragGuards in cameraControls.ts, @@ -383,7 +387,8 @@ test.describe('Testing Camera Movement', () => { const expectedOrbitCamZPosition = 64.0 await test.step(`Test setup`, async () => { - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() await u.closeKclCodePanel() // This test requires the mouse controls to be set to Solidworks await u.openDebugPanel() @@ -479,4 +484,31 @@ test.describe('Testing Camera Movement', () => { }) } }) + + test('Right-click opens context menu when not dragged', async ({ + homePage, + page, + }) => { + const u = await getUtils(page) + + await homePage.goToModelingScene() + await u.waitForPageLoad() + + await test.step(`The menu should not show if we drag the mouse`, async () => { + await page.mouse.move(900, 200) + await page.mouse.down({ button: 'right' }) + await page.mouse.move(900, 300) + await page.mouse.up({ button: 'right' }) + + await expect(page.getByTestId('view-controls-menu')).not.toBeVisible() + }) + + await test.step(`The menu should show if we don't drag the mouse`, async () => { + await page.mouse.move(900, 200) + await page.mouse.down({ button: 'right' }) + await page.mouse.up({ button: 'right' }) + + await expect(page.getByTestId('view-controls-menu')).toBeVisible() + }) + }) }) diff --git a/e2e/playwright/testing-constraints.spec.ts b/e2e/playwright/testing-constraints.spec.ts index df4b20f3a..faa566b64 100644 --- a/e2e/playwright/testing-constraints.spec.ts +++ b/e2e/playwright/testing-constraints.spec.ts @@ -1,35 +1,34 @@ -import { test, expect } from '@playwright/test' - -import { getUtils, setup, tearDown, TEST_COLORS } from './test-utils' +import { test, expect } from './zoo-test' +import * as fsp from 'fs/promises' +import { + getUtils, + TEST_COLORS, + pollEditorLinesSelectedLength, + executorInputPath, +} from './test-utils' import { XOR } from 'lib/utils' - -test.beforeEach(async ({ context, page }, testInfo) => { - await setup(context, page, testInfo) -}) - -test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) +import path from 'node:path' test.describe('Testing constraints', () => { - test('Can constrain line length', async ({ page }) => { + test('Can constrain line length', async ({ page, homePage }) => { await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `sketch001 = startSketchOn('XY') - |> startProfileAt([-10, -10], %) - |> line([20, 0], %) - |> line([0, 20], %) - |> xLine(-20, %) - ` + |> startProfileAt([-10, -10], %) + |> line([20, 0], %) + |> line([0, 20], %) + |> xLine(-20, %) + ` ) }) const u = await getUtils(page) const PUR = 400 / 37.5 //pixeltoUnitRatio - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() await u.openDebugPanel() await u.expectCmdLog('[data-message-type="execution-done"]') @@ -41,18 +40,21 @@ test.describe('Testing constraints', () => { // enter sketch again await page.getByRole('button', { name: 'Edit Sketch' }).click() - await page.waitForTimeout(500) // wait for animation + + // Wait for overlays to populate + await page.waitForTimeout(1000) const startXPx = 500 - await page.mouse.move(startXPx + PUR * 15, 250 - PUR * 10) - await page.keyboard.down('Shift') - await page.mouse.click(834, 244) - await page.keyboard.up('Shift') + await page.getByText(`line([0, 20], %)`).click() + await page.waitForTimeout(100) + await page.getByTestId('constraint-length').click() + await page.getByTestId('cmd-bar-arg-value').getByRole('textbox').fill('20') await page - .getByRole('button', { name: 'dimension Length', exact: true }) + .getByRole('button', { + name: 'arrow right Continue', + }) .click() - await page.getByText('Add constraining value').click() await expect(page.locator('.cm-content')).toHaveText( `length001 = 20sketch001 = startSketchOn('XY') |> startProfileAt([-10, -10], %) |> line([20, 0], %) |> angledLine([90, length001], %) |> xLine(-20, %)` @@ -63,42 +65,48 @@ test.describe('Testing constraints', () => { page.getByRole('button', { name: 'Exit Sketch' }) ).toBeVisible() - await page.waitForTimeout(500) // wait for animation + await page.waitForTimeout(2500) // wait for animation // Exit sketch await page.mouse.move(startXPx + PUR * 15, 250 - PUR * 10) - await page.keyboard.press('Escape') - await expect( - page.getByRole('button', { name: 'Exit Sketch' }) - ).not.toBeVisible() + await expect + .poll(async () => { + await page.keyboard.press('Escape', { delay: 500 }) + return page.getByRole('button', { name: 'Exit Sketch' }).isVisible() + }) + .toBe(false) }) - test(`Remove constraints`, async ({ page }) => { + test(`Remove constraints`, async ({ page, homePage }) => { await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `yo = 79 -part001 = startSketchOn('XZ') - |> startProfileAt([-7.54, -26.74], %) - |> line([74.36, 130.4], %, $seg01) - |> line([78.92, -120.11], %) - |> angledLine([segAng(seg01), yo], %) - |> line([41.19, 58.97 + 5], %) -part002 = startSketchOn('XZ') - |> startProfileAt([299.05, 120], %) - |> xLine(-385.34, %, $seg_what) - |> yLine(-170.06, %) - |> xLine(segLen(seg_what), %) - |> lineTo([profileStartX(%), profileStartY(%)], %)` + part001 = startSketchOn('XZ') + |> startProfileAt([-7.54, -26.74], %) + |> line([74.36, 130.4], %, $seg01) + |> line([78.92, -120.11], %) + |> angledLine([segAng(seg01), yo], %) + |> line([41.19, 58.97 + 5], %) + part002 = startSketchOn('XZ') + |> startProfileAt([299.05, 120], %) + |> xLine(-385.34, %, $seg_what) + |> yLine(-170.06, %) + |> xLine(segLen(seg_what), %) + |> lineTo([profileStartX(%), profileStartY(%)], %)` ) }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() await page.getByText('line([74.36, 130.4], %, $seg01)').click() await page.getByRole('button', { name: 'Edit Sketch' }).click() + // Wait for overlays to populate + await page.waitForTimeout(1000) + const line3 = await u.getSegmentBodyCoords(`[data-overlay-index="${2}"]`) await page.mouse.click(line3.x, line3.y) @@ -111,14 +119,16 @@ part002 = startSketchOn('XZ') await page.getByRole('button', { name: 'remove constraints' }).click() await page.getByText('line([39.13, 68.63], %)').click() + await pollEditorLinesSelectedLength(page, 1) const activeLinesContent = await page.locator('.cm-activeLine').all() - await expect(activeLinesContent).toHaveLength(1) await expect(activeLinesContent[0]).toHaveText('|> line([39.13, 68.63], %)') // checking the count of the overlays is a good proxy check that the client sketch scene is in a good state await expect(page.getByTestId('segment-overlay')).toHaveCount(4) }) test.describe('Test perpendicular distance constraint', () => { + // TODO: fix this test on windows after the electron migration + test.skip(process.platform === 'win32', 'Skip on windows') const cases = [ { testName: 'Add variable', @@ -130,43 +140,75 @@ part002 = startSketchOn('XZ') }, ] as const for (const { testName, offset } of cases) { - test(`${testName}`, async ({ page }) => { + test(`${testName}`, async ({ page, homePage }) => { await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `yo = 5 -part001 = startSketchOn('XZ') - |> startProfileAt([-7.54, -26.74], %) - |> line([74.36, 130.4], %, $seg01) - |> line([78.92, -120.11], %) - |> angledLine([segAng(seg01), 78.33], %) - |> line([51.19, 48.97], %) -part002 = startSketchOn('XZ') - |> startProfileAt([299.05, 231.45], %) - |> xLine(-425.34, %, $seg_what) - |> yLine(-264.06, %) - |> xLine(segLen(seg_what), %) - |> lineTo([profileStartX(%), profileStartY(%)], %)` + part001 = startSketchOn('XZ') + |> startProfileAt([-7.54, -26.74], %) + |> line([74.36, 130.4], %, $seg01) + |> line([78.92, -120.11], %) + |> angledLine([segAng(seg01), 78.33], %) + |> line([51.19, 48.97], %) + part002 = startSketchOn('XZ') + |> startProfileAt([299.05, 231.45], %) + |> xLine(-425.34, %, $seg_what) + |> yLine(-264.06, %) + |> xLine(segLen(seg_what), %) + |> lineTo([profileStartX(%), profileStartY(%)], %)` ) + + const isChecked = await createNewVariableCheckbox.isChecked() + const addVariable = testName === 'Add variable' + XOR(isChecked, addVariable) && // XOR because no need to click the checkbox if the state is already correct + (await createNewVariableCheckbox.click()) + + await page + .getByRole('button', { name: 'Add constraining value' }) + .click() + + // Wait for the codemod to take effect + await expect(page.locator('.cm-content')).toContainText(`angle: -57,`) + await expect(page.locator('.cm-content')).toContainText( + `offset: ${offset},` + ) + + await pollEditorLinesSelectedLength(page, 2) + const activeLinesContent = await page.locator('.cm-activeLine').all() + await expect(activeLinesContent[0]).toHaveText( + `|> line([74.36, 130.4], %, $seg01)` + ) + await expect(activeLinesContent[1]).toHaveText(`}, %)`) + + // checking the count of the overlays is a good proxy check that the client sketch scene is in a good state + await expect(page.getByTestId('segment-overlay')).toHaveCount(4) }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() await page.getByText('line([74.36, 130.4], %, $seg01)').click() await page.getByRole('button', { name: 'Edit Sketch' }).click() + // Give time for overlays to populate + await page.waitForTimeout(1000) + const [line1, line3] = await Promise.all([ u.getSegmentBodyCoords(`[data-overlay-index="${0}"]`), u.getSegmentBodyCoords(`[data-overlay-index="${2}"]`), ]) await page.mouse.click(line1.x, line1.y) - await page.keyboard.down('Shift') - await page.mouse.click(line3.x, line3.y) - await page.waitForTimeout(100) // this wait is needed for webkit - not sure why await page.keyboard.up('Shift') + await page.keyboard.down('Shift') + await page.waitForTimeout(100) + await page.mouse.click(line3.x, line3.y) + await page.waitForTimeout(100) + await page.keyboard.up('Shift') + await page.waitForTimeout(100) await page .getByRole('button', { name: 'Length: open menu', @@ -189,11 +231,12 @@ part002 = startSketchOn('XZ') .click() // Wait for the codemod to take effect - await expect(page.locator('.cm-content')).toContainText(`angle: -57,`) + await expect(page.locator('.cm-content')).toContainText(`angle = -57,`) await expect(page.locator('.cm-content')).toContainText( - `offset: ${offset},` + `offset = ${offset},` ) + await pollEditorLinesSelectedLength(page, 2) const activeLinesContent = await page.locator('.cm-activeLine').all() await expect(activeLinesContent[0]).toHaveText( `|> line([74.36, 130.4], %, $seg01)` @@ -206,6 +249,8 @@ part002 = startSketchOn('XZ') } }) test.describe('Test distance between constraint', () => { + // TODO: fix this test on windows after the electron migration + test.skip(process.platform === 'win32', 'Skip on windows') const cases = [ { testName: 'Add variable', @@ -229,33 +274,37 @@ part002 = startSketchOn('XZ') }, ] as const for (const { testName, value, constraint } of cases) { - test(`${constraint} - ${testName}`, async ({ page }) => { + test(`${constraint} - ${testName}`, async ({ page, homePage }) => { await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `yo = 5 -part001 = startSketchOn('XZ') - |> startProfileAt([-7.54, -26.74], %) - |> line([74.36, 130.4], %) - |> line([78.92, -120.11], %) - |> line([9.16, 77.79], %) - |> line([51.19, 48.97], %) -part002 = startSketchOn('XZ') - |> startProfileAt([299.05, 231.45], %) - |> xLine(-425.34, %, $seg_what) - |> yLine(-264.06, %) - |> xLine(segLen(seg_what), %) - |> lineTo([profileStartX(%), profileStartY(%)], %)` + part001 = startSketchOn('XZ') + |> startProfileAt([-7.54, -26.74], %) + |> line([74.36, 130.4], %) + |> line([78.92, -120.11], %) + |> line([9.16, 77.79], %) + |> line([51.19, 48.97], %) + part002 = startSketchOn('XZ') + |> startProfileAt([299.05, 231.45], %) + |> xLine(-425.34, %, $seg_what) + |> yLine(-264.06, %) + |> xLine(segLen(seg_what), %) + |> lineTo([profileStartX(%), profileStartY(%)], %)` ) }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() await page.getByText('line([74.36, 130.4], %)').click() await page.getByRole('button', { name: 'Edit Sketch' }).click() + // Wait for overlays to populate + await page.waitForTimeout(1000) + const [line1, line3] = await Promise.all([ u.getSegmentBodyCoords(`[data-overlay-index="${0}"]`), u.getSegmentBodyCoords(`[data-overlay-index="${2}"]`), @@ -335,33 +384,37 @@ part002 = startSketchOn('XZ') }, ] as const for (const { testName, addVariable, value, constraint } of cases) { - test(`${constraint} - ${testName}`, async ({ page }) => { + test(`${constraint} - ${testName}`, async ({ page, homePage }) => { await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `yo = 5 -part001 = startSketchOn('XZ') - |> startProfileAt([-7.54, -26.74], %) - |> line([74.36, 130.4], %) - |> line([78.92, -120.11], %) - |> line([9.16, 77.79], %) - |> line([51.19, 48.97], %) -part002 = startSketchOn('XZ') - |> startProfileAt([299.05, 231.45], %) - |> xLine(-425.34, %, $seg_what) - |> yLine(-264.06, %) - |> xLine(segLen(seg_what), %) - |> lineTo([profileStartX(%), profileStartY(%)], %)` + part001 = startSketchOn('XZ') + |> startProfileAt([-7.54, -26.74], %) + |> line([74.36, 130.4], %) + |> line([78.92, -120.11], %) + |> line([9.16, 77.79], %) + |> line([51.19, 48.97], %) + part002 = startSketchOn('XZ') + |> startProfileAt([299.05, 231.45], %) + |> xLine(-425.34, %, $seg_what) + |> yLine(-264.06, %) + |> xLine(segLen(seg_what), %) + |> lineTo([profileStartX(%), profileStartY(%)], %)` ) }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() await page.getByText('line([74.36, 130.4], %)').click() await page.getByRole('button', { name: 'Edit Sketch' }).click() + // Wait for overlays to populate + await page.waitForTimeout(1000) + const [line3] = await Promise.all([ u.getSegmentBodyCoords(`[data-overlay-index="${2}"]`), ]) @@ -372,9 +425,11 @@ part002 = startSketchOn('XZ') await page.mouse.click(900, 250) } await page.keyboard.down('Shift') + await page.waitForTimeout(100) await page.mouse.click(line3.x, line3.y) - await page.waitForTimeout(100) // this wait is needed for webkit - not sure why + await page.waitForTimeout(100) await page.keyboard.up('Shift') + await page.waitForTimeout(100) await page .getByRole('button', { name: 'Length: open menu', @@ -415,6 +470,8 @@ part002 = startSketchOn('XZ') } }) test.describe('Test Angle constraint double segment selection', () => { + // TODO: fix this test on windows after the electron migration + test.skip(process.platform === 'win32', 'Skip on windows') const cases = [ { testName: 'Add variable', @@ -442,33 +499,37 @@ part002 = startSketchOn('XZ') }, ] as const for (const { testName, addVariable, value, axisSelect } of cases) { - test(`${testName}`, async ({ page }) => { + test(`${testName}`, async ({ page, homePage }) => { await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `yo = 5 -part001 = startSketchOn('XZ') - |> startProfileAt([-7.54, -26.74], %) - |> line([74.36, 130.4], %) - |> line([78.92, -120.11], %) - |> line([9.16, 77.79], %) - |> line([51.19, 48.97], %) -part002 = startSketchOn('XZ') - |> startProfileAt([299.05, 231.45], %) - |> xLine(-425.34, %, $seg_what) - |> yLine(-264.06, %) - |> xLine(segLen(seg_what), %) - |> lineTo([profileStartX(%), profileStartY(%)], %)` + part001 = startSketchOn('XZ') + |> startProfileAt([-7.54, -26.74], %) + |> line([74.36, 130.4], %) + |> line([78.92, -120.11], %) + |> line([9.16, 77.79], %) + |> line([51.19, 48.97], %) + part002 = startSketchOn('XZ') + |> startProfileAt([299.05, 231.45], %) + |> xLine(-425.34, %, $seg_what) + |> yLine(-264.06, %) + |> xLine(segLen(seg_what), %) + |> lineTo([profileStartX(%), profileStartY(%)], %)` ) }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() await page.getByText('line([74.36, 130.4], %)').click() await page.getByRole('button', { name: 'Edit Sketch' }).click() + // Wait for overlays to populate + await page.waitForTimeout(1000) + const [line1, line3] = await Promise.all([ u.getSegmentBodyCoords(`[data-overlay-index="${0}"]`), u.getSegmentBodyCoords(`[data-overlay-index="${2}"]`), @@ -524,7 +585,7 @@ part002 = startSketchOn('XZ') }) } }) - test.describe('Test Angle/Length constraint single selection', () => { + test.describe('Test Angle constraint single selection', () => { const cases = [ { testName: 'Angle - Add variable', @@ -538,47 +599,39 @@ part002 = startSketchOn('XZ') constraint: 'angle', value: '83, 78.33', }, - { - testName: 'Length - Add variable', - addVariable: true, - constraint: 'length', - value: '83, length001', - }, - { - testName: 'Length - No variable', - addVariable: false, - constraint: 'length', - value: '83, 78.33', - }, ] as const for (const { testName, addVariable, value, constraint } of cases) { - test(`${testName}`, async ({ page }) => { + test(`${testName}`, async ({ page, homePage }) => { await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `yo = 5 -part001 = startSketchOn('XZ') - |> startProfileAt([-7.54, -26.74], %) - |> line([74.36, 130.4], %) - |> line([78.92, -120.11], %) - |> line([9.16, 77.79], %) - |> line([51.19, 48.97], %) -part002 = startSketchOn('XZ') - |> startProfileAt([299.05, 231.45], %) - |> xLine(-425.34, %, $seg_what) - |> yLine(-264.06, %) - |> xLine(segLen(seg_what), %) - |> lineTo([profileStartX(%), profileStartY(%)], %)` + part001 = startSketchOn('XZ') + |> startProfileAt([-7.54, -26.74], %) + |> line([74.36, 130.4], %) + |> line([78.92, -120.11], %) + |> line([9.16, 77.79], %) + |> line([51.19, 48.97], %) + part002 = startSketchOn('XZ') + |> startProfileAt([299.05, 231.45], %) + |> xLine(-425.34, %, $seg_what) + |> yLine(-264.06, %) + |> xLine(segLen(seg_what), %) + |> lineTo([profileStartX(%), profileStartY(%)], %)` ) }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() await page.getByText('line([74.36, 130.4], %)').click() await page.getByRole('button', { name: 'Edit Sketch' }).click() + // Wait for overlays to populate + await page.waitForTimeout(1000) + const line3 = await u.getSegmentBodyCoords( `[data-overlay-index="${2}"]` ) @@ -608,6 +661,92 @@ part002 = startSketchOn('XZ') }) } }) + test.describe('Test Length constraint single selection', () => { + // TODO: fix this test on windows after the electron migration + test.skip(process.platform === 'win32', 'Skip on windows') + const cases = [ + { + testName: 'Length - Add variable', + addVariable: true, + constraint: 'length', + value: '83, length001', + }, + { + testName: 'Length - No variable', + addVariable: false, + constraint: 'length', + value: '83, 78.33', + }, + ] as const + for (const { testName, addVariable, value, constraint } of cases) { + test(`${testName}`, async ({ context, homePage, page }) => { + // constants and locators + const cmdBarKclInput = page + .getByTestId('cmd-bar-arg-value') + .getByRole('textbox') + const cmdBarKclVariableNameInput = + page.getByPlaceholder('Variable name') + const cmdBarSubmitButton = page.getByRole('button', { + name: 'arrow right Continue', + }) + + await page.addInitScript(async () => { + localStorage.setItem( + 'persistCode', + `yo = 5 +part001 = startSketchOn('XZ') + |> startProfileAt([-7.54, -26.74], %) + |> line([74.36, 130.4], %) + |> line([78.92, -120.11], %) + |> line([9.16, 77.79], %) + |> line([51.19, 48.97], %) +part002 = startSketchOn('XZ') + |> startProfileAt([299.05, 231.45], %) + |> xLine(-425.34, %, $seg_what) + |> yLine(-264.06, %) + |> xLine(segLen(seg_what), %) + |> lineTo([profileStartX(%), profileStartY(%)], %)` + ) + }) + const u = await getUtils(page) + await page.setBodyDimensions({ width: 1200, height: 500 }) + + await homePage.goToModelingScene() + + await page.getByText('line([74.36, 130.4], %)').click() + await page.getByRole('button', { name: 'Edit Sketch' }).click() + + const line3 = await u.getSegmentBodyCoords( + `[data-overlay-index="${2}"]` + ) + + await page.mouse.click(line3.x, line3.y) + await page + .getByRole('button', { + name: 'Length: open menu', + }) + .click() + await page.getByTestId('dropdown-constraint-' + constraint).click() + + if (!addVariable) { + await test.step(`Clear the variable input`, async () => { + await cmdBarKclVariableNameInput.clear() + await cmdBarKclVariableNameInput.press('Backspace') + }) + } + await expect(cmdBarKclInput).toHaveText('78.33') + await cmdBarSubmitButton.click() + + const changedCode = `|> angledLine([${value}], %)` + await expect(page.locator('.cm-content')).toContainText(changedCode) + // checking active assures the cursor is where it should be + await expect(page.locator('.cm-activeLine')).toHaveText(changedCode) + + // checking the count of the overlays is a good proxy check that the client sketch scene is in a good state + await expect(page.getByTestId('segment-overlay')).toHaveCount(4) + }) + } + }) test.describe('Many segments - no modal constraints', () => { const cases = [ { @@ -628,33 +767,37 @@ part002 = startSketchOn('XZ') }, ] as const for (const { codeAfter, constraintName } of cases) { - test(`${constraintName}`, async ({ page }) => { + test(`${constraintName}`, async ({ page, homePage }) => { await page.addInitScript(async (customCode) => { localStorage.setItem( 'persistCode', `yo = 5 -part001 = startSketchOn('XZ') - |> startProfileAt([-7.54, -26.74], %) - |> line([74.36, 130.4], %) - |> line([78.92, -120.11], %) - |> line([9.16, 77.79], %) - |> line([51.19, 48.97], %) -part002 = startSketchOn('XZ') - |> startProfileAt([299.05, 231.45], %) - |> xLine(-425.34, %, $seg_what) - |> yLine(-264.06, %) - |> xLine(segLen(seg_what), %) - |> lineTo([profileStartX(%), profileStartY(%)], %)` + part001 = startSketchOn('XZ') + |> startProfileAt([-7.54, -26.74], %) + |> line([74.36, 130.4], %) + |> line([78.92, -120.11], %) + |> line([9.16, 77.79], %) + |> line([51.19, 48.97], %) + part002 = startSketchOn('XZ') + |> startProfileAt([299.05, 231.45], %) + |> xLine(-425.34, %, $seg_what) + |> yLine(-264.06, %) + |> xLine(segLen(seg_what), %) + |> lineTo([profileStartX(%), profileStartY(%)], %)` ) }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() await page.getByText('line([74.36, 130.4], %)').click() await page.getByRole('button', { name: 'Edit Sketch' }).click() + // Wait for overlays to populate + await page.waitForTimeout(1000) + const line1 = await u.getSegmentBodyCoords( `[data-overlay-index="${0}"]` ) @@ -673,8 +816,8 @@ part002 = startSketchOn('XZ') await page.keyboard.up('Shift') // check actives lines + await pollEditorLinesSelectedLength(page, codeAfter.length) const activeLinesContent = await page.locator('.cm-activeLine').all() - await expect(activeLinesContent).toHaveLength(codeAfter.length) const constraintMenuButton = page.getByRole('button', { name: 'Length: open menu', @@ -706,6 +849,8 @@ part002 = startSketchOn('XZ') } }) test.describe('Two segment - no modal constraints', () => { + // TODO: fix this test on windows after the electron migration + test.skip(process.platform === 'win32', 'Skip on windows') const cases = [ { codeAfter: `|> angledLine([83, segLen(seg01)], %)`, @@ -725,32 +870,36 @@ part002 = startSketchOn('XZ') }, ] as const for (const { codeAfter, constraintName } of cases) { - test(`${constraintName}`, async ({ page }) => { + test(`${constraintName}`, async ({ page, homePage }) => { await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `yo = 5 -part001 = startSketchOn('XZ') - |> startProfileAt([-7.54, -26.74], %) - |> line([74.36, 130.4], %) - |> line([78.92, -120.11], %) - |> line([9.16, 77.79], %) -part002 = startSketchOn('XZ') - |> startProfileAt([299.05, 231.45], %) - |> xLine(-425.34, %, $seg_what) - |> yLine(-264.06, %) - |> xLine(segLen(seg_what), %) - |> lineTo([profileStartX(%), profileStartY(%)], %)` + part001 = startSketchOn('XZ') + |> startProfileAt([-7.54, -26.74], %) + |> line([74.36, 130.4], %) + |> line([78.92, -120.11], %) + |> line([9.16, 77.79], %) + part002 = startSketchOn('XZ') + |> startProfileAt([299.05, 231.45], %) + |> xLine(-425.34, %, $seg_what) + |> yLine(-264.06, %) + |> xLine(segLen(seg_what), %) + |> lineTo([profileStartX(%), profileStartY(%)], %)` ) }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() await page.getByText('line([74.36, 130.4], %)').click() await page.getByRole('button', { name: 'Edit Sketch' }).click() + // Wait for overlays to populate + await page.waitForTimeout(1000) + const line1 = await u.getBoundingBox(`[data-overlay-index="${0}"]`) const line3 = await u.getBoundingBox(`[data-overlay-index="${2}"]`) @@ -777,8 +926,8 @@ part002 = startSketchOn('XZ') // check there are still 2 cursors (they should stay on the same lines as before constraint was applied) await expect(page.locator('.cm-cursor')).toHaveCount(2) // check actives lines + await pollEditorLinesSelectedLength(page, 2) const activeLinesContent = await page.locator('.cm-activeLine').all() - await expect(activeLinesContent).toHaveLength(2) // check both cursors are where they should be after constraint is applied await expect(activeLinesContent[0]).toHaveText( @@ -802,40 +951,47 @@ part002 = startSketchOn('XZ') }, ] as const for (const { codeAfter, constraintName, axisClick } of cases) { - test(`${constraintName}`, async ({ page }) => { + test(`${constraintName}`, async ({ page, homePage }) => { await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `yo = 5 -part001 = startSketchOn('XZ') - |> startProfileAt([-7.54, -26.74], %) - |> line([74.36, 130.4], %) - |> line([78.92, -120.11], %) - |> line([9.16, 77.79], %) -part002 = startSketchOn('XZ') - |> startProfileAt([299.05, 231.45], %) - |> xLine(-425.34, %, $seg_what) - |> yLine(-264.06, %) - |> xLine(segLen(seg_what), %) - |> lineTo([profileStartX(%), profileStartY(%)], %)` + part001 = startSketchOn('XZ') + |> startProfileAt([-7.54, -26.74], %) + |> line([74.36, 130.4], %) + |> line([78.92, -120.11], %) + |> line([9.16, 77.79], %) + part002 = startSketchOn('XZ') + |> startProfileAt([299.05, 231.45], %) + |> xLine(-425.34, %, $seg_what) + |> yLine(-264.06, %) + |> xLine(segLen(seg_what), %) + |> lineTo([profileStartX(%), profileStartY(%)], %)` ) }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() await page.getByText('line([74.36, 130.4], %)').click() await page.getByRole('button', { name: 'Edit Sketch' }).click() + // Wait for overlays to populate + await page.waitForTimeout(1000) + const line3 = await u.getBoundingBox(`[data-overlay-index="${2}"]`) // select segment and axis by holding down shift await page.mouse.click(line3.x - 3, line3.y + 20) + await page.waitForTimeout(100) await page.keyboard.down('Shift') await page.waitForTimeout(100) await page.mouse.click(axisClick.x, axisClick.y) + await page.waitForTimeout(100) await page.keyboard.up('Shift') + await page.waitForTimeout(100) const constraintMenuButton = page.getByRole('button', { name: 'Length: open menu', }) @@ -855,86 +1011,162 @@ part002 = startSketchOn('XZ') } }) - test('Horizontally constrained line remains selected after applying constraint', async ({ - page, - }) => { - test.setTimeout(70_000) - await page.addInitScript(async () => { - localStorage.setItem( - 'persistCode', - `sketch001 = startSketchOn('XY') - |> startProfileAt([-1.05, -1.07], %) - |> line([3.79, 2.68], %, $seg01) - |> line([3.13, -2.4], %)` + test.fixme( + 'Horizontally constrained line remains selected after applying constraint', + async ({ page, homePage }) => { + test.setTimeout(70_000) + await page.addInitScript(async () => { + localStorage.setItem( + 'persistCode', + `sketch001 = startSketchOn('XY') + |> startProfileAt([-1.05, -1.07], %) + |> line([3.79, 2.68], %, $seg01) + |> line([3.13, -2.4], %)` + ) + }) + const u = await getUtils(page) + await page.setBodyDimensions({ width: 1200, height: 500 }) + + await homePage.goToModelingScene() + await u.waitForPageLoad() + + await page.getByText('line([3.79, 2.68], %, $seg01)').click() + await expect( + page.getByRole('button', { name: 'Edit Sketch' }) + ).toBeEnabled({ timeout: 10_000 }) + await page.getByRole('button', { name: 'Edit Sketch' }).click() + + // Wait for overlays to populate + await page.waitForTimeout(1000) + + await page.waitForTimeout(100) + const lineBefore = await u.getSegmentBodyCoords( + `[data-overlay-index="1"]`, + 0 ) - }) - const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + expect( + await u.getGreatestPixDiff(lineBefore, TEST_COLORS.WHITE) + ).toBeLessThan(3) + await page.mouse.move(lineBefore.x, lineBefore.y) + await page.waitForTimeout(50) + await page.mouse.click(lineBefore.x, lineBefore.y) + expect( + await u.getGreatestPixDiff(lineBefore, TEST_COLORS.BLUE) + ).toBeLessThan(3) - await u.waitForAuthSkipAppStart() + await page + .getByRole('button', { + name: 'Length: open menu', + }) + .click() + await page.waitForTimeout(500) + await page + .getByRole('button', { name: 'Horizontal', exact: true }) + .click() + await page.waitForTimeout(500) - await page.getByText('line([3.79, 2.68], %, $seg01)').click() - await expect(page.getByRole('button', { name: 'Edit Sketch' })).toBeEnabled( - { timeout: 10_000 } - ) - await page.getByRole('button', { name: 'Edit Sketch' }).click() + await pollEditorLinesSelectedLength(page, 1) + let activeLinesContent = await page.locator('.cm-activeLine').all() + await expect(activeLinesContent[0]).toHaveText(`|> xLine(3.13, %)`) - await page.waitForTimeout(100) - const lineBefore = await u.getSegmentBodyCoords( - `[data-overlay-index="1"]`, - 0 - ) - expect( - await u.getGreatestPixDiff(lineBefore, TEST_COLORS.WHITE) - ).toBeLessThan(3) - await page.mouse.move(lineBefore.x, lineBefore.y) - await page.waitForTimeout(50) - await page.mouse.click(lineBefore.x, lineBefore.y) - expect( - await u.getGreatestPixDiff(lineBefore, TEST_COLORS.BLUE) - ).toBeLessThan(3) + // Wait for code editor to settle. + await page.waitForTimeout(2000) - await page - .getByRole('button', { - name: 'Length: open menu', - }) - .click() - await page.getByRole('button', { name: 'Horizontal', exact: true }).click() + // If the overlay-angle is updated the THREE.js scene is in a good state + await expect( + await page.locator('[data-overlay-index="1"]') + ).toHaveAttribute('data-overlay-angle', '0') - let activeLinesContent = await page.locator('.cm-activeLine').all() - await expect(activeLinesContent[0]).toHaveText(`|> xLine(3.13, %)`) + const lineAfter = await u.getSegmentBodyCoords( + `[data-overlay-index="1"]`, + 0 + ) - // If the overlay-angle is updated the THREE.js scene is in a good state - await expect( - await page.locator('[data-overlay-index="1"]') - ).toHaveAttribute('data-overlay-angle', '0') + const linebb = await u.getBoundingBox('[data-overlay-index="1"]') + await page.mouse.move(linebb.x, linebb.y, { steps: 25 }) + await page.mouse.click(linebb.x, linebb.y) - const lineAfter = await u.getSegmentBodyCoords( - `[data-overlay-index="1"]`, - 0 - ) - expect( - await u.getGreatestPixDiff(lineAfter, TEST_COLORS.BLUE) - ).toBeLessThan(3) + await expect + .poll( + async () => await u.getGreatestPixDiff(lineAfter, TEST_COLORS.BLUE) + ) + .toBeLessThan(3) - await page.waitForTimeout(300) - await page - .getByRole('button', { - name: 'Length: open menu', - }) - .click() - // await expect(page.getByRole('button', { name: 'length', exact: true })).toBeVisible() - await page.waitForTimeout(200) - // await page.getByRole('button', { name: 'length', exact: true }).click() - await page.getByTestId('dropdown-constraint-length').click() + await page.waitForTimeout(500) - await page.getByLabel('length Value').fill('10') - await page.getByRole('button', { name: 'Add constraining value' }).click() + // await expect(page.getByRole('button', { name: 'length', exact: true })).toBeVisible() + await page.waitForTimeout(200) + // await page.getByRole('button', { name: 'length', exact: true }).click() + await page.getByTestId('constraint-length').click() - activeLinesContent = await page.locator('.cm-activeLine').all() - await expect(activeLinesContent[0]).toHaveText(`|> xLine(length001, %)`) + await page + .getByTestId('cmd-bar-arg-value') + .getByRole('textbox') + .fill('10') + await page + .getByRole('button', { + name: 'arrow right Continue', + }) + .click() - // checking the count of the overlays is a good proxy check that the client sketch scene is in a good state - await expect(page.getByTestId('segment-overlay')).toHaveCount(2) - }) + await pollEditorLinesSelectedLength(page, 1) + activeLinesContent = await page.locator('.cm-activeLine').all() + await expect(activeLinesContent[0]).toHaveText(`|> xLine(length001, %)`) + + // checking the count of the overlays is a good proxy check that the client sketch scene is in a good state + await expect(page.getByTestId('segment-overlay')).toHaveCount(2) + } + ) +}) +test.describe('Electron constraint tests', () => { + test( + 'Able to double click label to set constraint', + { tag: '@electron' }, + async ({ page, context, homePage, scene, editor, toolbar }) => { + await context.folderSetupFn(async (dir) => { + const bracketDir = path.join(dir, 'test-sample') + await fsp.mkdir(bracketDir, { recursive: true }) + await fsp.copyFile( + executorInputPath('angled_line.kcl'), + path.join(bracketDir, 'main.kcl') + ) + }) + const [clickHandler] = scene.makeMouseHelpers(600, 300) + + await test.step('setup test', async () => { + await homePage.expectState({ + projectCards: [ + { + title: 'test-sample', + fileCount: 1, + }, + ], + sortBy: 'last-modified-desc', + }) + await homePage.openProject('test-sample') + await scene.waitForExecutionDone() + }) + + await test.step('Double click to constrain', async () => { + await clickHandler() + await page.getByRole('button', { name: 'Edit Sketch' }).click() + const child = page + .locator('.segment-length-label-text') + .first() + .locator('xpath=..') + await child.dblclick() + const cmdBarSubmitButton = page.getByRole('button', { + name: 'arrow right Continue', + }) + await cmdBarSubmitButton.click() + await expect(page.locator('.cm-content')).toContainText( + 'length001 = 15.3' + ) + await expect(page.locator('.cm-content')).toContainText( + '|> angledLine([9, length001], %)' + ) + await page.getByRole('button', { name: 'Exit Sketch' }).click() + }) + } + ) }) diff --git a/e2e/playwright/testing-gizmo.spec.ts b/e2e/playwright/testing-gizmo.spec.ts index dfbd6b822..9244b32e9 100644 --- a/e2e/playwright/testing-gizmo.spec.ts +++ b/e2e/playwright/testing-gizmo.spec.ts @@ -1,18 +1,11 @@ -import { _test, _expect } from './playwright-deprecated' -import { test } from './fixtures/fixtureSetup' -import { getUtils, setup, tearDown } from './test-utils' +import { test, expect } from './zoo-test' +import { getUtils } from './test-utils' import { uuidv4 } from 'lib/utils' import { TEST_CODE_GIZMO } from './storageStates' -_test.beforeEach(async ({ context, page }, testInfo) => { - await setup(context, page, testInfo) -}) - -_test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) - -_test.describe('Testing Gizmo', () => { +test.describe('Testing Gizmo', () => { + // TODO: fix this test on windows after the electron migration + test.skip(process.platform === 'win32', 'Skip on windows') const cases = [ { testDescription: 'top view', @@ -57,14 +50,17 @@ _test.describe('Testing Gizmo', () => { expectedCameraTarget, testDescription, } of cases) { - _test(`check ${testDescription}`, async ({ page, browserName }) => { + test(`check ${testDescription}`, async ({ page, homePage }) => { const u = await getUtils(page) await page.addInitScript((TEST_CODE_GIZMO) => { localStorage.setItem('persistCode', TEST_CODE_GIZMO) }, TEST_CODE_GIZMO) - await page.setViewportSize({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await page.setBodyDimensions({ width: 1000, height: 500 }) + + await homePage.goToModelingScene() + await u.waitForPageLoad() + await page.waitForTimeout(100) // wait for execution done await u.openDebugPanel() @@ -117,30 +113,30 @@ _test.describe('Testing Gizmo', () => { await Promise.all([ // position - _expect(page.getByTestId('cam-x-position')).toHaveValue( + expect(page.getByTestId('cam-x-position')).toHaveValue( expectedCameraPosition.x.toString() ), - _expect(page.getByTestId('cam-y-position')).toHaveValue( + expect(page.getByTestId('cam-y-position')).toHaveValue( expectedCameraPosition.y.toString() ), - _expect(page.getByTestId('cam-z-position')).toHaveValue( + expect(page.getByTestId('cam-z-position')).toHaveValue( expectedCameraPosition.z.toString() ), // target - _expect(page.getByTestId('cam-x-target')).toHaveValue( + expect(page.getByTestId('cam-x-target')).toHaveValue( expectedCameraTarget.x.toString() ), - _expect(page.getByTestId('cam-y-target')).toHaveValue( + expect(page.getByTestId('cam-y-target')).toHaveValue( expectedCameraTarget.y.toString() ), - _expect(page.getByTestId('cam-z-target')).toHaveValue( + expect(page.getByTestId('cam-z-target')).toHaveValue( expectedCameraTarget.z.toString() ), ]) }) } - _test('Context menu and popover menu', async ({ page }) => { + test('Context menu and popover menu', async ({ page, homePage }) => { const testCase = { testDescription: 'Right view', expectedCameraPosition: { x: 5660.02, y: -152, z: 26 }, @@ -152,9 +148,9 @@ _test.describe('Testing Gizmo', () => { await page.addInitScript((TEST_CODE_GIZMO) => { localStorage.setItem('persistCode', TEST_CODE_GIZMO) }, TEST_CODE_GIZMO) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await page.waitForTimeout(100) // wait for execution done await u.openDebugPanel() @@ -196,7 +192,7 @@ _test.describe('Testing Gizmo', () => { const buttonToTest = page.getByRole('button', { name: testCase.testDescription, }) - await _expect(buttonToTest).toBeVisible() + await expect(buttonToTest).toBeVisible() await buttonToTest.click() // Now assert we've moved to the correct view @@ -215,23 +211,23 @@ _test.describe('Testing Gizmo', () => { await Promise.all([ // position - _expect(page.getByTestId('cam-x-position')).toHaveValue( + expect(page.getByTestId('cam-x-position')).toHaveValue( testCase.expectedCameraPosition.x.toString() ), - _expect(page.getByTestId('cam-y-position')).toHaveValue( + expect(page.getByTestId('cam-y-position')).toHaveValue( testCase.expectedCameraPosition.y.toString() ), - _expect(page.getByTestId('cam-z-position')).toHaveValue( + expect(page.getByTestId('cam-z-position')).toHaveValue( testCase.expectedCameraPosition.z.toString() ), // target - _expect(page.getByTestId('cam-x-target')).toHaveValue( + expect(page.getByTestId('cam-x-target')).toHaveValue( testCase.expectedCameraTarget.x.toString() ), - _expect(page.getByTestId('cam-y-target')).toHaveValue( + expect(page.getByTestId('cam-y-target')).toHaveValue( testCase.expectedCameraTarget.y.toString() ), - _expect(page.getByTestId('cam-z-target')).toHaveValue( + expect(page.getByTestId('cam-z-target')).toHaveValue( testCase.expectedCameraTarget.z.toString() ), ]) @@ -242,32 +238,59 @@ _test.describe('Testing Gizmo', () => { const gizmoPopoverButton = page.getByRole('button', { name: 'view settings', }) - await _expect(gizmoPopoverButton).toBeVisible() + await expect(gizmoPopoverButton).toBeVisible() await gizmoPopoverButton.click() - await _expect(buttonToTest).toBeVisible() + await expect(buttonToTest).toBeVisible() }) }) test.describe(`Testing gizmo, fixture-based`, () => { test('Center on selection from menu', async ({ - app, + context, + page, + homePage, cmdBar, editor, toolbar, scene, }) => { - test.skip( - process.platform === 'win32', - 'Fails on windows in CI, can not be replicated locally on windows.' - ) + await context.addInitScript(() => { + localStorage.setItem( + 'persistCode', + ` + const sketch002 = startSketchOn('XZ') + |> startProfileAt([-108.83, -57.48], %) + |> angledLine([0, 105.13], %, $rectangleSegmentA001) + |> angledLine([ + segAng(rectangleSegmentA001) - 90, + 77.9 + ], %) + |> angledLine([ + segAng(rectangleSegmentA001), + -segLen(rectangleSegmentA001) + ], %) + |> close(%) + const sketch001 = startSketchOn('XZ') + |> circle({ + center: [818.33, 168.1], + radius: 182.8 + }, %) + |> extrude(50, %) + ` + ) + }) + + await page.setBodyDimensions({ width: 1000, height: 500 }) + + await homePage.goToModelingScene() + const u = await getUtils(page) + await u.waitForPageLoad() await test.step(`Setup`, async () => { - const file = await app.getInputFile('test-circle-extrude.kcl') - await app.initialise(file) await scene.expectState({ camera: { - position: [4982.21, -23865.37, 13810.64], - target: [4982.21, 0, 2737.1], + position: [11912.6, -39586.98, 21391.21], + target: [11912.6, -635, 3317.49], }, }) }) @@ -275,7 +298,7 @@ test.describe(`Testing gizmo, fixture-based`, () => { await test.step(`Select an edge of this circle`, async () => { const circleSnippet = - 'circle({ center: [318.33, 168.1], radius: 182.8 }, %)' + 'circle({ center: [818.33, 168.1], radius: 182.8 }, %)' await moveToCircle() await clickCircle() await editor.expectState({ @@ -292,8 +315,8 @@ test.describe(`Testing gizmo, fixture-based`, () => { await test.step(`Verify the camera moved`, async () => { await scene.expectState({ camera: { - position: [0, -23865.37, 11073.53], - target: [0, 0, 0], + position: [20785.58, -40221.98, 22343.46], + target: [20785.58, -1270, 4269.74], }, }) }) diff --git a/e2e/playwright/testing-perspective-toggle.spec.ts b/e2e/playwright/testing-perspective-toggle.spec.ts index 98d90875e..ed589fe78 100644 --- a/e2e/playwright/testing-perspective-toggle.spec.ts +++ b/e2e/playwright/testing-perspective-toggle.spec.ts @@ -1,18 +1,8 @@ -import { test, expect } from '@playwright/test' -import { getUtils, setup, tearDown } from './test-utils' -import { TEST_SETTINGS, TEST_SETTINGS_KEY } from './storageStates' -import * as TOML from '@iarna/toml' - -test.beforeEach(async ({ context, page }, testInfo) => { - await setup(context, page, testInfo) -}) - -test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) +import { test, expect } from './zoo-test' +import { getUtils } from './test-utils' test.describe('Test toggling perspective', () => { - test('via command palette and toggle', async ({ page }) => { + test.fixme('via command palette and toggle', async ({ page, homePage }) => { const u = await getUtils(page) // Locators and constants @@ -20,10 +10,10 @@ test.describe('Test toggling perspective', () => { const screenHeight = 500 const checkedScreenLocation = { x: screenWidth * 0.71, - y: screenHeight * 0.4, + y: screenHeight * 0.2, } const backgroundColor: [number, number, number] = [29, 29, 29] - const xzPlaneColor: [number, number, number] = [50, 50, 99] + const xzPlaneColor: [number, number, number] = [82, 55, 96] const locationToHaveColor = async (color: [number, number, number]) => { return u.getGreatestPixDiff(checkedScreenLocation, color) } @@ -40,8 +30,8 @@ test.describe('Test toggling perspective', () => { }) await test.step('Setup', async () => { - await page.setViewportSize({ width: screenWidth, height: screenHeight }) - await u.waitForAuthSkipAppStart() + await page.setBodyDimensions({ width: screenWidth, height: screenHeight }) + await homePage.goToModelingScene() await u.closeKclCodePanel() await expect .poll(async () => locationToHaveColor(backgroundColor), { @@ -52,11 +42,17 @@ test.describe('Test toggling perspective', () => { await expect(projectionToggle).toHaveAttribute('aria-checked', 'true') }) + // Extremely wild note: flicking between ortho and persp actually changes + // the orientation of the axis/camera. How can you see this? Well toggle it, + // then refresh. You'll see it doesn't match what we left. await test.step('Switch to ortho via command palette', async () => { await commandPaletteButton.click() + await page.waitForTimeout(1000) await commandOption.click() + await page.waitForTimeout(1000) await orthoOption.click() await expect(commandToast).toBeVisible() + await expect(commandToast).not.toBeVisible() await expect .poll(async () => locationToHaveColor(xzPlaneColor), { timeout: 5000, @@ -67,27 +63,9 @@ test.describe('Test toggling perspective', () => { }) await test.step(`Refresh the page and ensure the stream is loaded in ortho`, async () => { - // In playwright web, the settings set while testing are not persisted because - // the `addInitScript` within `setup` is re-run on page reload - await page.addInitScript( - ({ settingsKey, settings }) => { - localStorage.setItem(settingsKey, settings) - }, - { - settingsKey: TEST_SETTINGS_KEY, - settings: TOML.stringify({ - settings: { - ...TEST_SETTINGS, - modeling: { - ...TEST_SETTINGS.modeling, - cameraProjection: 'orthographic', - }, - }, - }), - } - ) await page.reload() - await u.waitForAuthSkipAppStart() + await page.waitForTimeout(1000) + await u.closeKclCodePanel() await expect .poll(async () => locationToHaveColor(xzPlaneColor), { timeout: 5000, diff --git a/e2e/playwright/testing-samples-loading.spec.ts b/e2e/playwright/testing-samples-loading.spec.ts index ddc2080c6..96da7d5ba 100644 --- a/e2e/playwright/testing-samples-loading.spec.ts +++ b/e2e/playwright/testing-samples-loading.spec.ts @@ -1,35 +1,30 @@ -import { test, expect } from '@playwright/test' -import { getUtils, setup, setupElectron, tearDown } from './test-utils' +import { test, expect } from './zoo-test' +import { getUtils } from './test-utils' import { bracket } from 'lib/exampleKcl' import * as fsp from 'fs/promises' import { join } from 'path' import { FILE_EXT } from 'lib/constants' import { UnitLength_type } from '@kittycad/lib/dist/types/src/models' -test.beforeEach(async ({ context, page }, testInfo) => { - await setup(context, page, testInfo) -}) - -test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) - test.describe('Testing in-app sample loading', () => { /** * Note this test implicitly depends on the KCL sample "car-wheel.kcl", * its title, and its units settings. https://github.com/KittyCAD/kcl-samples/blob/main/car-wheel/car-wheel.kcl */ test('Web: should overwrite current code, cannot create new file', async ({ + editor, + context, page, + homePage, }) => { const u = await getUtils(page) await test.step(`Test setup`, async () => { - await page.addInitScript((code) => { + await context.addInitScript((code) => { window.localStorage.setItem('persistCode', code) }, bracket) - await page.setViewportSize({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() }) // Locators and constants @@ -54,13 +49,13 @@ test.describe('Testing in-app sample loading', () => { }) const warningText = page.getByText('Overwrite current file and units?') const confirmButton = page.getByRole('button', { name: 'Submit command' }) - const codeLocator = page.locator('.cm-content') const unitsToast = (unit: UnitLength_type) => page.getByText(`Set default unit to "${unit}" for this project`) await test.step(`Precondition: check the initial code`, async () => { await u.openKclCodePanel() - await expect(codeLocator).toContainText(bracket.split('\n')[0]) + await editor.scrollToText(bracket.split('\n')[0]) + await editor.expectEditor.toContain(bracket.split('\n')[0]) }) await test.step(`Load a KCL sample with the command palette`, async () => { @@ -73,7 +68,7 @@ test.describe('Testing in-app sample loading', () => { await expect(warningText).toBeVisible() await confirmButton.click() - await expect(codeLocator).toContainText('// ' + newSample.title) + await editor.expectEditor.toContain('// ' + newSample.title) await expect(unitsToast('in')).toBeVisible() }) }) @@ -86,16 +81,13 @@ test.describe('Testing in-app sample loading', () => { test( 'Desktop: should create new file by default, optionally overwrite', { tag: '@electron' }, - async ({ browserName: _ }, testInfo) => { - const { electronApp, page, dir } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - const bracketDir = join(dir, 'bracket') - await fsp.mkdir(bracketDir, { recursive: true }) - await fsp.writeFile(join(bracketDir, 'main.kcl'), bracket, { - encoding: 'utf-8', - }) - }, + async ({ editor, context, page }, testInfo) => { + const { dir } = await context.folderSetupFn(async (dir) => { + const bracketDir = join(dir, 'bracket') + await fsp.mkdir(bracketDir, { recursive: true }) + await fsp.writeFile(join(bracketDir, 'main.kcl'), bracket, { + encoding: 'utf-8', + }) }) const u = await getUtils(page) @@ -134,19 +126,19 @@ test.describe('Testing in-app sample loading', () => { page.getByRole('listitem').filter({ has: page.getByRole('button', { name }), }) - const codeLocator = page.locator('.cm-content') const unitsToast = (unit: UnitLength_type) => page.getByText(`Set default unit to "${unit}" for this project`) await test.step(`Test setup`, async () => { - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) await projectCard.click() await u.waitForPageLoad() }) await test.step(`Precondition: check the initial code`, async () => { await u.openKclCodePanel() - await expect(codeLocator).toContainText(bracket.split('\n')[0]) + await editor.scrollToText(bracket.split('\n')[0]) + await editor.expectEditor.toContain(bracket.split('\n')[0]) await u.openFilePanel() await expect(projectMenuButton).toContainText('main.kcl') @@ -163,7 +155,7 @@ test.describe('Testing in-app sample loading', () => { }) await test.step(`Ensure we made and opened a new file`, async () => { - await expect(codeLocator).toContainText('// ' + sampleOne.title) + await editor.expectEditor.toContain('// ' + sampleOne.title) await expect(newlyCreatedFile(sampleOne.file)).toBeVisible() await expect(projectMenuButton).toContainText(sampleOne.file) await expect(unitsToast('in')).toBeVisible() @@ -182,7 +174,7 @@ test.describe('Testing in-app sample loading', () => { }) await test.step(`Ensure we overwrote the current file without navigating`, async () => { - await expect(codeLocator).toContainText('// ' + sampleTwo.title) + await editor.expectEditor.toContain('// ' + sampleTwo.title) await test.step(`Check actual file contents`, async () => { await expect .poll(async () => { @@ -198,8 +190,6 @@ test.describe('Testing in-app sample loading', () => { await expect(projectMenuButton).toContainText(sampleOne.file) await expect(unitsToast('mm')).toBeVisible() }) - - await electronApp.close() } ) }) diff --git a/e2e/playwright/testing-segment-overlays.spec.ts b/e2e/playwright/testing-segment-overlays.spec.ts index 225746b69..09ae5831c 100644 --- a/e2e/playwright/testing-segment-overlays.spec.ts +++ b/e2e/playwright/testing-segment-overlays.spec.ts @@ -1,19 +1,16 @@ -import { test, expect, Page } from '@playwright/test' +import { test, expect, Page } from './zoo-test' -import { deg, getUtils, setup, tearDown, wiggleMove } from './test-utils' +import { deg, getUtils, wiggleMove } from './test-utils' import { LineInputsType } from 'lang/std/sketchcombos' import { uuidv4 } from 'lib/utils' - -test.beforeEach(async ({ context, page }, testInfo) => { - await setup(context, page, testInfo) -}) - -test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) +import { EditorFixture } from './fixtures/editorFixture' test.describe('Testing segment overlays', () => { + // TODO: fix this test on windows after the electron migration + test.skip(process.platform === 'win32', 'Skip on windows') test.describe('Hover over a segment should show its overlay, hovering over the input overlays should show its popover, clicking the input overlay should constrain/unconstrain it:\nfor the following segments', () => { + // TODO: fix this test on mac after the electron migration + test.skip(process.platform === 'darwin', 'Skip on mac') /** * Clicks on an constrained element * @param {Page} page - The page to perform the action on @@ -24,7 +21,7 @@ test.describe('Testing segment overlays', () => { * @param {number} options.steps - The number of steps to perform */ const _clickConstrained = - (page: Page) => + (page: Page, editor: EditorFixture) => async ({ hoverPos, constraintType, @@ -58,10 +55,11 @@ test.describe('Testing segment overlays', () => { y = hoverPos.y - Math.sin(ang * deg) * 32 await page.mouse.move(x, y) await wiggleMove(page, x, y, 20, 30, ang, 10, 5, locator) + await page.mouse.move(x, y) - await expect(page.locator('.cm-content')).toContainText( - expectBeforeUnconstrained - ) + await editor.expectEditor.toContain(expectBeforeUnconstrained, { + shouldNormalise: true, + }) const constrainedLocator = page.locator( `[data-constraint-type="${constraintType}"][data-is-constrained="true"]` ) @@ -71,9 +69,9 @@ test.describe('Testing segment overlays', () => { await page.getByTestId('constraint-symbol-popover').count() ).toBeGreaterThan(0) await constrainedLocator.click() - await expect(page.locator('.cm-content')).toContainText( - expectAfterUnconstrained - ) + await editor.expectEditor.toContain(expectAfterUnconstrained, { + shouldNormalise: true, + }) await page.mouse.move(0, 0) await page.waitForTimeout(1000) @@ -81,6 +79,7 @@ test.describe('Testing segment overlays', () => { y = hoverPos.y - Math.sin(ang * deg) * 32 await page.mouse.move(x, y) await wiggleMove(page, x, y, 20, 30, ang, 10, 5, locator) + await page.mouse.move(x, y) const unconstrainedLocator = page.locator( `[data-constraint-type="${constraintType}"][data-is-constrained="false"]` @@ -91,8 +90,21 @@ test.describe('Testing segment overlays', () => { await page.getByTestId('constraint-symbol-popover').count() ).toBeGreaterThan(0) await unconstrainedLocator.click() - await page.getByText('Add variable').click() + await expect( + page.getByTestId('cmd-bar-arg-value').getByRole('textbox') + ).toBeFocused() + await page + .getByRole('button', { + name: 'arrow right Continue', + }) + .click() await expect(page.locator('.cm-content')).toContainText(expectFinal) + await editor.expectEditor.toContain(expectFinal, { + shouldNormalise: true, + }) + await editor.expectEditor.toContain(expectFinal, { + shouldNormalise: true, + }) } /** @@ -105,7 +117,7 @@ test.describe('Testing segment overlays', () => { * @param {number} options.steps - The number of steps to perform */ const _clickUnconstrained = - (page: Page) => + (page: Page, editor: EditorFixture) => async ({ hoverPos, constraintType, @@ -137,11 +149,12 @@ test.describe('Testing segment overlays', () => { y = hoverPos.y - Math.sin(ang * deg) * 32 await page.mouse.move(x, y) await wiggleMove(page, x, y, 20, 30, ang, 10, 5, locator) + await page.mouse.move(x, y) await expect(page.getByText('Added variable')).not.toBeVisible() - await expect(page.locator('.cm-content')).toContainText( - expectBeforeUnconstrained - ) + await editor.expectEditor.toContain(expectBeforeUnconstrained, { + shouldNormalise: true, + }) const unconstrainedLocator = page.locator( `[data-constraint-type="${constraintType}"][data-is-constrained="false"]` ) @@ -151,10 +164,17 @@ test.describe('Testing segment overlays', () => { await page.getByTestId('constraint-symbol-popover').count() ).toBeGreaterThan(0) await unconstrainedLocator.click() - await page.getByText('Add variable').click() - await expect(page.locator('.cm-content')).toContainText( - expectAfterUnconstrained - ) + await expect( + page.getByTestId('cmd-bar-arg-value').getByRole('textbox') + ).toBeFocused() + await page + .getByRole('button', { + name: 'arrow right Continue', + }) + .click() + await editor.expectEditor.toContain(expectAfterUnconstrained, { + shouldNormalise: true, + }) await expect(page.getByText('Added variable')).not.toBeVisible() await page.mouse.move(0, 0) @@ -163,6 +183,7 @@ test.describe('Testing segment overlays', () => { y = hoverPos.y - Math.sin(ang * deg) * 32 await page.mouse.move(x, y) await wiggleMove(page, x, y, 20, 30, ang, 10, 5, locator) + await page.mouse.move(x, y) const constrainedLocator = page.locator( `[data-constraint-type="${constraintType}"][data-is-constrained="true"]` @@ -173,41 +194,45 @@ test.describe('Testing segment overlays', () => { await page.getByTestId('constraint-symbol-popover').count() ).toBeGreaterThan(0) await constrainedLocator.click() - await expect(page.locator('.cm-content')).toContainText(expectFinal) + await editor.expectEditor.toContain(expectFinal, { + shouldNormalise: true, + }) } test.setTimeout(120000) test('for segments [line, angledLine, lineTo, xLineTo]', async ({ page, + editor, + homePage, }) => { await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `part001 = startSketchOn('XZ') - |> startProfileAt([5 + 0, 20 + 0], %) - |> line([0.5, -14 + 0], %) - |> angledLine({ angle: 3 + 0, length: 32 + 0 }, %) - |> lineTo([5 + 33, 20 + 11.5 + 0], %) - |> xLineTo(5 + 9 - 5, %) - |> yLineTo(20 + -10.77, %, $a) - |> xLine(26.04, %) - |> yLine(21.14 + 0, %) - |> angledLineOfXLength({ angle: 181 + 0, length: 23.14 }, %) - |> angledLineOfYLength({ angle: -91, length: 19 + 0 }, %) - |> angledLineToX({ angle: 3 + 0, to: 5 + 26 }, %) - |> angledLineToY({ angle: 89, to: 20 + 9.14 + 0 }, %) - |> angledLineThatIntersects({ - angle: 4.14, - intersectTag: a, - offset: 9 - }, %) - |> tangentialArcTo([5 + 3.14 + 13, 20 + 3.14], %) - ` + |> startProfileAt([5 + 0, 20 + 0], %) + |> line([0.5, -14 + 0], %) + |> angledLine({ angle = 3 + 0, length = 32 + 0 }, %) + |> lineTo([5 + 33, 20 + 11.5 + 0], %) + |> xLineTo(5 + 9 - 5, %) + |> yLineTo(20 + -10.77, %, $a) + |> xLine(26.04, %) + |> yLine(21.14 + 0, %) + |> angledLineOfXLength({ angle = 181 + 0, length = 23.14 }, %) + |> angledLineOfYLength({ angle = -91, length = 19 + 0 }, %) + |> angledLineToX({ angle = 3 + 0, to = 5 + 26 }, %) + |> angledLineToY({ angle = 89, to = 20 + 9.14 + 0 }, %) + |> angledLineThatIntersects({ + angle = 4.14, + intersectTag = a, + offset = 9 + }, %) + |> tangentialArcTo([5 + 3.14 + 13, 20 + 3.14], %) + ` ) }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() // wait for execution done await u.openDebugPanel() @@ -221,8 +246,8 @@ test.describe('Testing segment overlays', () => { await expect(page.getByTestId('segment-overlay')).toHaveCount(13) - const clickUnconstrained = _clickUnconstrained(page) - const clickConstrained = _clickConstrained(page) + const clickUnconstrained = _clickUnconstrained(page, editor) + const clickConstrained = _clickConstrained(page, editor) await u.openAndClearDebugPanel() await u.sendCustomCmd({ @@ -278,9 +303,10 @@ test.describe('Testing segment overlays', () => { hoverPos: { x: angledLine.x, y: angledLine.y }, constraintType: 'angle', expectBeforeUnconstrained: - 'angledLine({ angle: 3 + 0, length: 32 + 0 }, %)', - expectAfterUnconstrained: 'angledLine({ angle: 3, length: 32 + 0 }, %)', - expectFinal: 'angledLine({ angle: angle001, length: 32 + 0 }, %)', + 'angledLine({ angle = 3 + 0, length = 32 + 0 }, %)', + expectAfterUnconstrained: + 'angledLine({ angle = 3, length = 32 + 0 }, %)', + expectFinal: 'angledLine({ angle = angle001, length = 32 + 0 }, %)', ang: ang + 180, locator: '[data-overlay-toolbar-index="1"]', }) @@ -289,10 +315,10 @@ test.describe('Testing segment overlays', () => { hoverPos: { x: angledLine.x, y: angledLine.y }, constraintType: 'length', expectBeforeUnconstrained: - 'angledLine({ angle: angle001, length: 32 + 0 }, %)', + 'angledLine({ angle = angle001, length = 32 + 0 }, %)', expectAfterUnconstrained: - 'angledLine({ angle: angle001, length: 32 }, %)', - expectFinal: 'angledLine({ angle: angle001, length: len001 }, %)', + 'angledLine({ angle = angle001, length = 32 }, %)', + expectFinal: 'angledLine({ angle = angle001, length = len001 }, %)', ang: ang + 180, locator: '[data-overlay-toolbar-index="1"]', }) @@ -339,114 +365,121 @@ test.describe('Testing segment overlays', () => { locator: '[data-overlay-toolbar-index="3"]', }) }) - test('for segments [yLineTo, xLine]', async ({ page }) => { - await page.addInitScript(async () => { - localStorage.setItem( - 'persistCode', - `yRel001 = -14 -xRel001 = 0.5 -angle001 = 3 -len001 = 32 -yAbs001 = 11.5 -xAbs001 = 33 -xAbs002 = 4 -part001 = startSketchOn('XZ') - |> startProfileAt([0, 0], %) - |> line([0.5, yRel001], %) - |> angledLine({ angle: angle001, length: len001 }, %) - |> lineTo([33, yAbs001], %) - |> xLineTo(xAbs002, %) - |> yLineTo(-10.77, %, $a) - |> xLine(26.04, %) - |> yLine(21.14 + 0, %) - |> angledLineOfXLength({ angle: 181 + 0, length: 23.14 }, %) - ` - ) - }) - const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + // Broken on main at time of writing! + test.fixme( + 'for segments [yLineTo, xLine]', + async ({ page, editor, homePage }) => { + await page.addInitScript(async () => { + localStorage.setItem( + 'persistCode', + `yRel001 = -14 + xRel001 = 0.5 + angle001 = 3 + len001 = 32 + yAbs001 = 11.5 + xAbs001 = 33 + xAbs002 = 4 + part001 = startSketchOn('XZ') + |> startProfileAt([0, 0], %) + |> line([0.5, yRel001], %) + |> angledLine({ angle = angle001, length = len001 }, %) + |> lineTo([33, yAbs001], %) + |> xLineTo(xAbs002, %) + |> yLineTo(-10.77, %, $a) + |> xLine(26.04, %) + |> yLine(21.14 + 0, %) + |> angledLineOfXLength({ angle = 181 + 0, length = 23.14 }, %) + ` + ) + }) + const u = await getUtils(page) + await page.setBodyDimensions({ width: 1200, height: 500 }) - // wait for execution done - await u.openDebugPanel() - await u.expectCmdLog('[data-message-type="execution-done"]') - await u.closeDebugPanel() + await homePage.goToModelingScene() - await page.getByText('xLine(26.04, %)').click() - await page.waitForTimeout(100) - await page.getByRole('button', { name: 'Edit Sketch' }).click() - await page.waitForTimeout(500) + // wait for execution done + await u.openDebugPanel() + await u.expectCmdLog('[data-message-type="execution-done"]') + await u.closeDebugPanel() - await expect(page.getByTestId('segment-overlay')).toHaveCount(8) + await page.getByText('xLine(26.04, %)').click() + await page.waitForTimeout(100) + await page.getByRole('button', { name: 'Edit Sketch' }).click() + await page.waitForTimeout(500) - const clickUnconstrained = _clickUnconstrained(page) + await expect(page.getByTestId('segment-overlay')).toHaveCount(8) - await page.mouse.move(700, 250) - await page.waitForTimeout(100) + const clickUnconstrained = _clickUnconstrained(page, editor) - let ang = 0 + await page.mouse.move(700, 250) + await page.waitForTimeout(100) - const yLineTo = await u.getBoundingBox(`[data-overlay-index="4"]`) - ang = await u.getAngle(`[data-overlay-index="4"]`) - console.log('ylineTo1') - await clickUnconstrained({ - hoverPos: { x: yLineTo.x, y: yLineTo.y }, - constraintType: 'yAbsolute', - expectBeforeUnconstrained: 'yLineTo(-10.77, %, $a)', - expectAfterUnconstrained: 'yLineTo(yAbs002, %, $a)', - expectFinal: 'yLineTo(-10.77, %, $a)', - ang: ang + 180, - locator: '[data-overlay-toolbar-index="4"]', - }) + let ang = 0 - const xLine = await u.getBoundingBox(`[data-overlay-index="5"]`) - ang = await u.getAngle(`[data-overlay-index="5"]`) - console.log('xline') - await clickUnconstrained({ - hoverPos: { x: xLine.x, y: xLine.y }, - constraintType: 'xRelative', - expectBeforeUnconstrained: 'xLine(26.04, %)', - expectAfterUnconstrained: 'xLine(xRel002, %)', - expectFinal: 'xLine(26.04, %)', - steps: 10, - ang: ang + 180, - locator: '[data-overlay-toolbar-index="5"]', - }) - }) + const yLineTo = await u.getBoundingBox(`[data-overlay-index="4"]`) + ang = await u.getAngle(`[data-overlay-index="4"]`) + console.log('ylineTo1') + await clickUnconstrained({ + hoverPos: { x: yLineTo.x, y: yLineTo.y - 200 }, + constraintType: 'yAbsolute', + expectBeforeUnconstrained: 'yLineTo(-10.77, %, $a)', + expectAfterUnconstrained: 'yLineTo(yAbs002, %, $a)', + expectFinal: 'yLineTo(-10.77, %, $a)', + ang: ang + 180, + locator: '[data-overlay-toolbar-index="4"]', + }) + + const xLine = await u.getBoundingBox(`[data-overlay-index="5"]`) + ang = await u.getAngle(`[data-overlay-index="5"]`) + console.log('xline') + await clickUnconstrained({ + hoverPos: { x: xLine.x, y: xLine.y }, + constraintType: 'xRelative', + expectBeforeUnconstrained: 'xLine(26.04, %)', + expectAfterUnconstrained: 'xLine(xRel002, %)', + expectFinal: 'xLine(26.04, %)', + steps: 10, + ang: ang + 180, + locator: '[data-overlay-toolbar-index="5"]', + }) + } + ) test('for segments [yLine, angledLineOfXLength, angledLineOfYLength]', async ({ page, + editor, + homePage, }) => { await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `part001 = startSketchOn('XZ') - |> startProfileAt([0, 0], %) - |> line([0.5, -14 + 0], %) - |> angledLine({ angle: 3 + 0, length: 32 + 0 }, %) - |> lineTo([33, 11.5 + 0], %) - |> xLineTo(9 - 5, %) - |> yLineTo(-10.77, %, $a) - |> xLine(26.04, %) - |> yLine(21.14 + 0, %) - |> angledLineOfXLength({ angle: 181 + 0, length: 23.14 }, %) - |> angledLineOfYLength({ angle: -91, length: 19 + 0 }, %) - |> angledLineToX({ angle: 3 + 0, to: 26 }, %) - |> angledLineToY({ angle: 89, to: 9.14 + 0 }, %) - |> angledLineThatIntersects({ - angle: 4.14, - intersectTag: a, - offset: 9 - }, %) - |> tangentialArcTo([3.14 + 13, 3.14], %) - ` + |> startProfileAt([0, 0], %) + |> line([0.5, -14 + 0], %) + |> angledLine({ angle = 3 + 0, length = 32 + 0 }, %) + |> lineTo([33, 11.5 + 0], %) + |> xLineTo(9 - 5, %) + |> yLineTo(-10.77, %, $a) + |> xLine(26.04, %) + |> yLine(21.14 + 0, %) + |> angledLineOfXLength({ angle = 181 + 0, length = 23.14 }, %) + |> angledLineOfYLength({ angle = -91, length = 19 + 0 }, %) + |> angledLineToX({ angle = 3 + 0, to = 26 }, %) + |> angledLineToY({ angle = 89, to = 9.14 + 0 }, %) + |> angledLineThatIntersects({ + angle = 4.14, + intersectTag = a, + offset = 9 + }, %) + |> tangentialArcTo([3.14 + 13, 3.14], %) + ` ) localStorage.setItem('disableAxis', 'true') }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() // wait for execution done await u.openDebugPanel() @@ -461,8 +494,8 @@ part001 = startSketchOn('XZ') await expect(page.getByTestId('segment-overlay')).toHaveCount(13) - const clickUnconstrained = _clickUnconstrained(page) - const clickConstrained = _clickConstrained(page) + const clickUnconstrained = _clickUnconstrained(page, editor) + const clickConstrained = _clickConstrained(page, editor) let ang = 0 @@ -488,11 +521,11 @@ part001 = startSketchOn('XZ') hoverPos: { x: angledLineOfXLength.x, y: angledLineOfXLength.y }, constraintType: 'angle', expectBeforeUnconstrained: - 'angledLineOfXLength({ angle: 181 + 0, length: 23.14 }, %)', + 'angledLineOfXLength({ angle = 181 + 0, length = 23.14 }, %)', expectAfterUnconstrained: - 'angledLineOfXLength({ angle: -179, length: 23.14 }, %)', + 'angledLineOfXLength({ angle = -179, length = 23.14 }, %)', expectFinal: - 'angledLineOfXLength({ angle: angle001, length: 23.14 }, %)', + 'angledLineOfXLength({ angle = angle001, length = 23.14 }, %)', ang: ang + 180, locator: '[data-overlay-toolbar-index="7"]', }) @@ -501,11 +534,11 @@ part001 = startSketchOn('XZ') hoverPos: { x: angledLineOfXLength.x, y: angledLineOfXLength.y }, constraintType: 'xRelative', expectBeforeUnconstrained: - 'angledLineOfXLength({ angle: angle001, length: 23.14 }, %)', + 'angledLineOfXLength({ angle = angle001, length = 23.14 }, %)', expectAfterUnconstrained: - 'angledLineOfXLength({ angle: angle001, length: xRel001 }, %)', + 'angledLineOfXLength({ angle = angle001, length = xRel001 }, %)', expectFinal: - 'angledLineOfXLength({ angle: angle001, length: 23.14 }, %)', + 'angledLineOfXLength({ angle = angle001, length = 23.14 }, %)', steps: 7, ang: ang + 180, locator: '[data-overlay-toolbar-index="7"]', @@ -520,10 +553,10 @@ part001 = startSketchOn('XZ') hoverPos: { x: angledLineOfYLength.x, y: angledLineOfYLength.y }, constraintType: 'angle', expectBeforeUnconstrained: - 'angledLineOfYLength({ angle: -91, length: 19 + 0 }, %)', + 'angledLineOfYLength({ angle = -91, length = 19 + 0 }, %)', expectAfterUnconstrained: - 'angledLineOfYLength({ angle: angle002, length: 19 + 0 }, %)', - expectFinal: 'angledLineOfYLength({ angle: -91, length: 19 + 0 }, %)', + 'angledLineOfYLength({ angle = angle002, length = 19 + 0 }, %)', + expectFinal: 'angledLineOfYLength({ angle = -91, length = 19 + 0 }, %)', ang: ang + 180, steps: 6, locator: '[data-overlay-toolbar-index="8"]', @@ -533,10 +566,11 @@ part001 = startSketchOn('XZ') hoverPos: { x: angledLineOfYLength.x, y: angledLineOfYLength.y }, constraintType: 'yRelative', expectBeforeUnconstrained: - 'angledLineOfYLength({ angle: -91, length: 19 + 0 }, %)', + 'angledLineOfYLength({ angle = -91, length = 19 + 0 }, %)', expectAfterUnconstrained: - 'angledLineOfYLength({ angle: -91, length: 19 }, %)', - expectFinal: 'angledLineOfYLength({ angle: -91, length: yRel002 }, %)', + 'angledLineOfYLength({ angle = -91, length = 19 }, %)', + expectFinal: + 'angledLineOfYLength({ angle = -91, length = yRel002 }, %)', ang: ang + 180, steps: 7, locator: '[data-overlay-toolbar-index="8"]', @@ -544,37 +578,39 @@ part001 = startSketchOn('XZ') }) test('for segments [angledLineToX, angledLineToY, angledLineThatIntersects]', async ({ page, + editor, + homePage, }) => { await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `part001 = startSketchOn('XZ') - |> startProfileAt([0, 0], %) - |> line([0.5, -14 + 0], %) - |> angledLine({ angle: 3 + 0, length: 32 + 0 }, %) - |> lineTo([33, 11.5 + 0], %) - |> xLineTo(9 - 5, %) - |> yLineTo(-10.77, %, $a) - |> xLine(26.04, %) - |> yLine(21.14 + 0, %) - |> angledLineOfXLength({ angle: 181 + 0, length: 23.14 }, %) - |> angledLineOfYLength({ angle: -91, length: 19 + 0 }, %) - |> angledLineToX({ angle: 3 + 0, to: 26 }, %) - |> angledLineToY({ angle: 89, to: 9.14 + 0 }, %) - |> angledLineThatIntersects({ - angle: 4.14, - intersectTag: a, - offset: 9 - }, %) - |> tangentialArcTo([3.14 + 13, 1.14], %) - ` + |> startProfileAt([0, 0], %) + |> line([0.5, -14 + 0], %) + |> angledLine({ angle = 3 + 0, length = 32 + 0 }, %) + |> lineTo([33, 11.5 + 0], %) + |> xLineTo(9 - 5, %) + |> yLineTo(-10.77, %, $a) + |> xLine(26.04, %) + |> yLine(21.14 + 0, %) + |> angledLineOfXLength({ angle = 181 + 0, length = 23.14 }, %) + |> angledLineOfYLength({ angle = -91, length = 19 + 0 }, %) + |> angledLineToX({ angle = 3 + 0, to = 26 }, %) + |> angledLineToY({ angle = 89, to = 9.14 + 0 }, %) + |> angledLineThatIntersects({ + angle = 4.14, + intersectTag = a, + offset = 9 + }, %) + |> tangentialArcTo([3.14 + 13, 1.14], %) + ` ) localStorage.setItem('disableAxis', 'true') }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() // wait for execution done await u.openDebugPanel() @@ -588,8 +624,8 @@ part001 = startSketchOn('XZ') await expect(page.getByTestId('segment-overlay')).toHaveCount(13) - const clickUnconstrained = _clickUnconstrained(page) - const clickConstrained = _clickConstrained(page) + const clickUnconstrained = _clickUnconstrained(page, editor) + const clickConstrained = _clickConstrained(page, editor) let ang = 0 @@ -599,9 +635,10 @@ part001 = startSketchOn('XZ') await clickConstrained({ hoverPos: { x: angledLineToX.x, y: angledLineToX.y }, constraintType: 'angle', - expectBeforeUnconstrained: 'angledLineToX({ angle: 3 + 0, to: 26 }, %)', - expectAfterUnconstrained: 'angledLineToX({ angle: 3, to: 26 }, %)', - expectFinal: 'angledLineToX({ angle: angle001, to: 26 }, %)', + expectBeforeUnconstrained: + 'angledLineToX({ angle = 3 + 0, to = 26 }, %)', + expectAfterUnconstrained: 'angledLineToX({ angle = 3, to = 26 }, %)', + expectFinal: 'angledLineToX({ angle = angle001, to = 26 }, %)', ang: ang + 180, locator: '[data-overlay-toolbar-index="9"]', }) @@ -610,10 +647,10 @@ part001 = startSketchOn('XZ') hoverPos: { x: angledLineToX.x, y: angledLineToX.y }, constraintType: 'xAbsolute', expectBeforeUnconstrained: - 'angledLineToX({ angle: angle001, to: 26 }, %)', + 'angledLineToX({ angle = angle001, to = 26 }, %)', expectAfterUnconstrained: - 'angledLineToX({ angle: angle001, to: xAbs001 }, %)', - expectFinal: 'angledLineToX({ angle: angle001, to: 26 }, %)', + 'angledLineToX({ angle = angle001, to = xAbs001 }, %)', + expectFinal: 'angledLineToX({ angle = angle001, to = 26 }, %)', ang: ang + 180, locator: '[data-overlay-toolbar-index="9"]', }) @@ -625,10 +662,10 @@ part001 = startSketchOn('XZ') hoverPos: { x: angledLineToY.x, y: angledLineToY.y }, constraintType: 'angle', expectBeforeUnconstrained: - 'angledLineToY({ angle: 89, to: 9.14 + 0 }, %)', + 'angledLineToY({ angle = 89, to = 9.14 + 0 }, %)', expectAfterUnconstrained: - 'angledLineToY({ angle: angle002, to: 9.14 + 0 }, %)', - expectFinal: 'angledLineToY({ angle: 89, to: 9.14 + 0 }, %)', + 'angledLineToY({ angle = angle002, to = 9.14 + 0 }, %)', + expectFinal: 'angledLineToY({ angle = 89, to = 9.14 + 0 }, %)', steps: process.platform === 'darwin' ? 8 : 9, ang: ang + 180, locator: '[data-overlay-toolbar-index="10"]', @@ -638,9 +675,9 @@ part001 = startSketchOn('XZ') hoverPos: { x: angledLineToY.x, y: angledLineToY.y }, constraintType: 'yAbsolute', expectBeforeUnconstrained: - 'angledLineToY({ angle: 89, to: 9.14 + 0 }, %)', - expectAfterUnconstrained: 'angledLineToY({ angle: 89, to: 9.14 }, %)', - expectFinal: 'angledLineToY({ angle: 89, to: yAbs001 }, %)', + 'angledLineToY({ angle = 89, to = 9.14 + 0 }, %)', + expectAfterUnconstrained: 'angledLineToY({ angle = 89, to = 9.14 }, %)', + expectFinal: 'angledLineToY({ angle = 89, to = yAbs001 }, %)', ang: ang + 180, locator: '[data-overlay-toolbar-index="10"]', }) @@ -657,20 +694,20 @@ part001 = startSketchOn('XZ') }, constraintType: 'angle', expectBeforeUnconstrained: `angledLineThatIntersects({ - angle: 4.14, - intersectTag: a, - offset: 9 - }, %)`, + angle = 4.14, + intersectTag = a, + offset = 9 + }, %)`, expectAfterUnconstrained: `angledLineThatIntersects({ - angle: angle003, - intersectTag: a, - offset: 9 - }, %)`, + angle = angle003, + intersectTag = a, + offset = 9 + }, %)`, expectFinal: `angledLineThatIntersects({ - angle: -176, - offset: 9, - intersectTag: a - }, %)`, + angle = -176, + offset = 9, + intersectTag = a + }, %)`, ang: ang + 180, locator: '[data-overlay-toolbar-index="11"]', }) @@ -682,55 +719,59 @@ part001 = startSketchOn('XZ') }, constraintType: 'intersectionOffset', expectBeforeUnconstrained: `angledLineThatIntersects({ - angle: -176, - offset: 9, - intersectTag: a - }, %)`, + angle = -176, + offset = 9, + intersectTag = a + }, %)`, expectAfterUnconstrained: `angledLineThatIntersects({ - angle: -176, - offset: perpDist001, - intersectTag: a - }, %)`, + angle = -176, + offset = perpDist001, + intersectTag = a + }, %)`, expectFinal: `angledLineThatIntersects({ - angle: -176, - offset: 9, - intersectTag: a - }, %)`, + angle = -176, + offset = 9, + intersectTag = a + }, %)`, ang: ang + 180, locator: '[data-overlay-toolbar-index="11"]', }) }) - test('for segment [tangentialArcTo]', async ({ page }) => { + test('for segment [tangentialArcTo]', async ({ + page, + editor, + homePage, + }) => { await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `part001 = startSketchOn('XZ') - |> startProfileAt([0, 0], %) - |> line([0.5, -14 + 0], %) - |> angledLine({ angle: 3 + 0, length: 32 + 0 }, %) - |> lineTo([33, 11.5 + 0], %) - |> xLineTo(9 - 5, %) - |> yLineTo(-10.77, %, $a) - |> xLine(26.04, %) - |> yLine(21.14 + 0, %) - |> angledLineOfXLength({ angle: 181 + 0, length: 23.14 }, %) - |> angledLineOfYLength({ angle: -91, length: 19 + 0 }, %) - |> angledLineToX({ angle: 3 + 0, to: 26 }, %) - |> angledLineToY({ angle: 89, to: 9.14 + 0 }, %) - |> angledLineThatIntersects({ - angle: 4.14, - intersectTag: a, - offset: 9 - }, %) - |> tangentialArcTo([3.14 + 13, -3.14], %) - ` + |> startProfileAt([0, 0], %) + |> line([0.5, -14 + 0], %) + |> angledLine({ angle = 3 + 0, length = 32 + 0 }, %) + |> lineTo([33, 11.5 + 0], %) + |> xLineTo(9 - 5, %) + |> yLineTo(-10.77, %, $a) + |> xLine(26.04, %) + |> yLine(21.14 + 0, %) + |> angledLineOfXLength({ angle = 181 + 0, length = 23.14 }, %) + |> angledLineOfYLength({ angle = -91, length = 19 + 0 }, %) + |> angledLineToX({ angle = 3 + 0, to = 26 }, %) + |> angledLineToY({ angle = 89, to = 9.14 + 0 }, %) + |> angledLineThatIntersects({ + angle = 4.14, + intersectTag = a, + offset = 9 + }, %) + |> tangentialArcTo([3.14 + 13, -3.14], %) + ` ) localStorage.setItem('disableAxis', 'true') }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() // wait for execution done await u.openDebugPanel() @@ -744,8 +785,8 @@ part001 = startSketchOn('XZ') await expect(page.getByTestId('segment-overlay')).toHaveCount(13) - const clickUnconstrained = _clickUnconstrained(page) - const clickConstrained = _clickConstrained(page) + const clickUnconstrained = _clickUnconstrained(page, editor) + const clickConstrained = _clickConstrained(page, editor) const tangentialArcTo = await u.getBoundingBox( '[data-overlay-index="12"]' @@ -774,20 +815,20 @@ part001 = startSketchOn('XZ') locator: '[data-overlay-toolbar-index="12"]', }) }) - test('for segment [circle]', async ({ page }) => { + test('for segment [circle]', async ({ page, editor, homePage }) => { await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `part001 = startSketchOn('XZ') - |> circle({ center: [1 + 0, 0], radius: 8 }, %) -` + |> circle({ center = [1 + 0, 0], radius = 8 }, %) + ` ) localStorage.setItem('disableAxis', 'true') }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() // wait for execution done await u.openDebugPanel() @@ -795,7 +836,7 @@ part001 = startSketchOn('XZ') await u.closeDebugPanel() await page - .getByText('circle({ center: [1 + 0, 0], radius: 8 }, %)') + .getByText('circle({ center = [1 + 0, 0], radius = 8 }, %)') .click() await page.waitForTimeout(100) await page.getByRole('button', { name: 'Edit Sketch' }).click() @@ -803,8 +844,8 @@ part001 = startSketchOn('XZ') await expect(page.getByTestId('segment-overlay')).toHaveCount(1) - const clickUnconstrained = _clickUnconstrained(page) - const clickConstrained = _clickConstrained(page) + const clickUnconstrained = _clickUnconstrained(page, editor) + const clickConstrained = _clickConstrained(page, editor) const hoverPos = { x: 789, y: 114 } as const let ang = await u.getAngle('[data-overlay-index="0"]') @@ -814,9 +855,9 @@ part001 = startSketchOn('XZ') hoverPos, constraintType: 'xAbsolute', expectBeforeUnconstrained: - 'circle({ center: [1 + 0, 0], radius: 8 }, %)', - expectAfterUnconstrained: 'circle({ center: [1, 0], radius: 8 }, %)', - expectFinal: 'circle({ center: [xAbs001, 0], radius: 8 }, %)', + 'circle({ center = [1 + 0, 0], radius = 8 }, %)', + expectAfterUnconstrained: 'circle({ center = [1, 0], radius = 8 }, %)', + expectFinal: 'circle({ center = [xAbs001, 0], radius = 8 }, %)', ang: ang + 105, steps: 6, locator: '[data-overlay-toolbar-index="0"]', @@ -826,12 +867,12 @@ part001 = startSketchOn('XZ') hoverPos, constraintType: 'yAbsolute', expectBeforeUnconstrained: - 'circle({ center: [xAbs001, 0], radius: 8 }, %)', + 'circle({ center = [xAbs001, 0], radius = 8 }, %)', expectAfterUnconstrained: - 'circle({ center: [xAbs001, yAbs001], radius: 8 }, %)', - expectFinal: 'circle({ center: [xAbs001, 0], radius: 8 }, %)', - ang: ang + 105, - steps: 10, + 'circle({ center = [xAbs001, yAbs001], radius = 8 }, %)', + expectFinal: 'circle({ center = [xAbs001, 0], radius = 8 }, %)', + ang: ang + 180, + steps: 30, locator: '[data-overlay-toolbar-index="0"]', }) console.log('circle radius') @@ -839,10 +880,10 @@ part001 = startSketchOn('XZ') hoverPos, constraintType: 'radius', expectBeforeUnconstrained: - 'circle({ center: [xAbs001, 0], radius: 8 }, %)', + 'circle({ center = [xAbs001, 0], radius = 8 }, %)', expectAfterUnconstrained: - 'circle({ center: [xAbs001, 0], radius: radius001 }, %)', - expectFinal: 'circle({ center: [xAbs001, 0], radius: 8 }, %)', + 'circle({ center = [xAbs001, 0], radius = radius001 }, %)', + expectFinal: 'circle({ center = [xAbs001, 0], radius = 8 }, %)', ang: ang + 105, steps: 10, locator: '[data-overlay-toolbar-index="0"]', @@ -851,7 +892,7 @@ part001 = startSketchOn('XZ') }) test.describe('Testing deleting a segment', () => { const _deleteSegmentSequence = - (page: Page) => + (page: Page, editor: EditorFixture) => async ({ hoverPos, codeToBeDeleted, @@ -877,47 +918,51 @@ part001 = startSketchOn('XZ') y = hoverPos.y - Math.sin(ang * deg) * 32 await page.mouse.move(x, y) await wiggleMove(page, x, y, 20, 30, ang, 10, 5, locator) + await page.mouse.move(x, y) - await expect(page.locator('.cm-content')).toContainText(codeToBeDeleted) + await editor.expectEditor.toContain(codeToBeDeleted, { + shouldNormalise: true, + }) await page.locator(`[data-stdlib-fn-name="${stdLibFnName}"]`).click() await page.getByText('Delete Segment').click() - await expect(page.locator('.cm-content')).not.toContainText( - codeToBeDeleted - ) + await editor.expectEditor.not.toContain(codeToBeDeleted, { + shouldNormalise: true, + }) } - test('all segment types', async ({ page }) => { + test('all segment types', async ({ page, editor, homePage }) => { await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `part001 = startSketchOn('XZ') - |> startProfileAt([0, 0], %) - |> line([0.5, -14 + 0], %) - |> angledLine({ angle: 3 + 0, length: 32 + 0 }, %) - |> lineTo([33, 11.5 + 0], %) - |> xLineTo(9 - 5, %) - |> yLineTo(-10.77, %, $a) - |> xLine(26.04, %) - |> yLine(21.14 + 0, %) - |> angledLineOfXLength({ angle: 181 + 0, length: 23.14 }, %) - |> angledLineOfYLength({ angle: -91, length: 19 + 0 }, %) - |> angledLineToX({ angle: 3 + 0, to: 26 }, %) - |> angledLineToY({ angle: 89, to: 9.14 + 0 }, %) - |> angledLineThatIntersects({ - angle: 4.14, - intersectTag: a, - offset: 9 - }, %) - |> tangentialArcTo([3.14 + 13, 1.14], %) - ` + |> startProfileAt([0, 0], %) + |> line([0.5, -14 + 0], %) + |> angledLine({ angle = 3 + 0, length = 32 + 0 }, %) + |> lineTo([33, 11.5 + 0], %) + |> xLineTo(9 - 5, %) + |> yLineTo(-10.77, %, $a) + |> xLine(26.04, %) + |> yLine(21.14 + 0, %) + |> angledLineOfXLength({ angle = 181 + 0, length = 23.14 }, %) + |> angledLineOfYLength({ angle = -91, length = 19 + 0 }, %) + |> angledLineToX({ angle = 3 + 0, to = 26 }, %) + |> angledLineToY({ angle = 89, to = 9.14 + 0 }, %) + |> angledLineThatIntersects({ + angle = 4.14, + intersectTag = a, + offset = 9 + }, %) + |> tangentialArcTo([3.14 + 13, 1.14], %) + ` ) localStorage.setItem('disableAxis', 'true') }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() // wait for execution done await u.openDebugPanel() @@ -930,7 +975,7 @@ part001 = startSketchOn('XZ') await page.waitForTimeout(500) await expect(page.getByTestId('segment-overlay')).toHaveCount(13) - const deleteSegmentSequence = _deleteSegmentSequence(page) + const deleteSegmentSequence = _deleteSegmentSequence(page, editor) let segmentToDelete @@ -952,10 +997,10 @@ part001 = startSketchOn('XZ') await deleteSegmentSequence({ hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, codeToBeDeleted: `angledLineThatIntersects({ - angle: 4.14, - intersectTag: a, - offset: 9 - }, %)`, + angle = 4.14, + intersectTag = a, + offset = 9 + }, %)`, stdLibFnName: 'angledLineThatIntersects', ang: ang + 180, steps: 7, @@ -966,7 +1011,7 @@ part001 = startSketchOn('XZ') ang = await u.getAngle(`[data-overlay-index="${10}"]`) await deleteSegmentSequence({ hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, - codeToBeDeleted: 'angledLineToY({ angle: 89, to: 9.14 + 0 }, %)', + codeToBeDeleted: 'angledLineToY({ angle = 89, to = 9.14 + 0 }, %)', stdLibFnName: 'angledLineToY', ang: ang + 180, locator: '[data-overlay-toolbar-index="10"]', @@ -976,7 +1021,7 @@ part001 = startSketchOn('XZ') ang = await u.getAngle(`[data-overlay-index="${9}"]`) await deleteSegmentSequence({ hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, - codeToBeDeleted: 'angledLineToX({ angle: 3 + 0, to: 26 }, %)', + codeToBeDeleted: 'angledLineToX({ angle = 3 + 0, to = 26 }, %)', stdLibFnName: 'angledLineToX', ang: ang + 180, locator: '[data-overlay-toolbar-index="9"]', @@ -987,7 +1032,7 @@ part001 = startSketchOn('XZ') await deleteSegmentSequence({ hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, codeToBeDeleted: - 'angledLineOfYLength({ angle: -91, length: 19 + 0 }, %)', + 'angledLineOfYLength({ angle = -91, length = 19 + 0 }, %)', stdLibFnName: 'angledLineOfYLength', ang: ang + 180, locator: '[data-overlay-toolbar-index="8"]', @@ -998,7 +1043,7 @@ part001 = startSketchOn('XZ') await deleteSegmentSequence({ hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, codeToBeDeleted: - 'angledLineOfXLength({ angle: 181 + 0, length: 23.14 }, %)', + 'angledLineOfXLength({ angle = 181 + 0, length = 23.14 }, %)', stdLibFnName: 'angledLineOfXLength', ang: ang + 180, locator: '[data-overlay-toolbar-index="7"]', @@ -1063,22 +1108,25 @@ part001 = startSketchOn('XZ') 5, '[data-overlay-toolbar-index="2"]' ) + await page.mouse.move(hoverPos.x, hoverPos.y) const codeToBeDeleted = 'lineTo([33, 11.5 + 0], %)' - await expect(page.locator('.cm-content')).toContainText(codeToBeDeleted) + await editor.expectEditor.toContain(codeToBeDeleted, { + shouldNormalise: true, + }) await page.getByTestId('overlay-menu').click() await page.getByText('Delete Segment').click() - await expect(page.locator('.cm-content')).not.toContainText( - codeToBeDeleted - ) + await editor.expectEditor.not.toContain(codeToBeDeleted, { + shouldNormalise: true, + }) segmentToDelete = await getOverlayByIndex(1) ang = await u.getAngle(`[data-overlay-index="${1}"]`) await deleteSegmentSequence({ hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, - codeToBeDeleted: 'angledLine({ angle: 3 + 0, length: 32 + 0 }, %)', + codeToBeDeleted: 'angledLine({ angle = 3 + 0, length = 32 + 0 }, %)', stdLibFnName: 'angledLine', ang: ang + 180, locator: '[data-overlay-toolbar-index="1"]', @@ -1105,30 +1153,30 @@ part001 = startSketchOn('XZ') 'xLineTo(30, %, $seg01)', 'yLineTo(-4, %, $seg01)', 'angledLineOfXLength([3, 30], %, $seg01)', - 'angledLineOfXLength({ angle: 3, length: 30 }, %, $seg01)', + 'angledLineOfXLength({ angle = 3, length = 30 }, %, $seg01)', 'angledLineOfYLength([3, 1.5], %, $seg01)', - 'angledLineOfYLength({ angle: 3, length: 1.5 }, %, $seg01)', + 'angledLineOfYLength({ angle = 3, length = 1.5 }, %, $seg01)', 'angledLineToX([3, 30], %, $seg01)', - 'angledLineToX({ angle: 3, to: 30 }, %, $seg01)', + 'angledLineToX({ angle = 3, to = 30 }, %, $seg01)', 'angledLineToY([3, 7], %, $seg01)', - 'angledLineToY({ angle: 3, to: 7 }, %, $seg01)', + 'angledLineToY({ angle = 3, to = 7 }, %, $seg01)', ] for (const doesHaveTagOutsideSketch of [true, false]) { for (const lineOfInterest of cases) { - const isObj = lineOfInterest.includes('{ angle: 3,') + const isObj = lineOfInterest.includes('{ angle = 3,') test(`${lineOfInterest.split('(')[0]}${isObj ? '-[obj-input]' : ''}${ doesHaveTagOutsideSketch ? '-[tagOutsideSketch]' : '' - }`, async ({ page }) => { + }`, async ({ page, editor, homePage }) => { await page.addInitScript( async ({ lineToBeDeleted, extraLine }) => { localStorage.setItem( 'persistCode', `part001 = startSketchOn('XZ') - |> startProfileAt([5, 6], %) - |> ${lineToBeDeleted} - |> line([-10, -15], %) - |> angledLine([-176, segLen(seg01)], %) -${extraLine ? 'myVar = segLen(seg01)' : ''}` + |> startProfileAt([5, 6], %) + |> ${lineToBeDeleted} + |> line([-10, -15], %) + |> angledLine([-176, segLen(seg01)], %) + ${extraLine ? 'myVar = segLen(seg01)' : ''}` ) }, { @@ -1137,15 +1185,31 @@ ${extraLine ? 'myVar = segLen(seg01)' : ''}` } ) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() - await page.waitForTimeout(300) + await homePage.goToModelingScene() + await u.waitForPageLoad() + await page.waitForTimeout(1000) - await page.getByText(lineOfInterest).click() - await page.waitForTimeout(100) + await expect + .poll(async () => { + await editor.scrollToText(lineOfInterest) + await page.waitForTimeout(1000) + await page.keyboard.press('ArrowRight') + await page.waitForTimeout(500) + await page.keyboard.press('ArrowLeft') + await page.waitForTimeout(500) + try { + await expect( + page.getByRole('button', { name: 'Edit Sketch' }) + ).toBeVisible() + return true + } catch (_) { + return false + } + }) + .toBe(true) await page.getByRole('button', { name: 'Edit Sketch' }).click() - await page.waitForTimeout(500) await expect(page.getByTestId('segment-overlay')).toHaveCount(3) const segmentToDelete = await u.getBoundingBox( @@ -1167,9 +1231,9 @@ ${extraLine ? 'myVar = segLen(seg01)' : ''}` await page.mouse.move(hoverPos.x + x, hoverPos.y + y) await page.mouse.move(hoverPos.x, hoverPos.y, { steps: 5 }) - await expect(page.locator('.cm-content')).toContainText( - lineOfInterest - ) + await editor.expectEditor.toContain(lineOfInterest, { + shouldNormalise: true, + }) await page.getByTestId('overlay-menu').click() await page.waitForTimeout(100) @@ -1180,9 +1244,9 @@ ${extraLine ? 'myVar = segLen(seg01)' : ''}` await page.mouse.move(hoverPos.x + x, hoverPos.y + y) await page.mouse.move(hoverPos.x, hoverPos.y, { steps: 5 }) - await expect(page.locator('.cm-content')).toContainText( - lineOfInterest - ) + await editor.expectEditor.toContain(lineOfInterest, { + shouldNormalise: true, + }) await page.getByTestId('overlay-menu').click() await page.waitForTimeout(100) @@ -1198,16 +1262,18 @@ ${extraLine ? 'myVar = segLen(seg01)' : ''}` ) ).toBeTruthy() // eslint-disable-next-line jest/no-conditional-expect - await expect(page.locator('.cm-content')).toContainText( - lineOfInterest - ) + await editor.expectEditor.toContain(lineOfInterest, { + shouldNormalise: true, + }) } else { // eslint-disable-next-line jest/no-conditional-expect - await expect(page.locator('.cm-content')).not.toContainText( - lineOfInterest - ) + await editor.expectEditor.not.toContain(lineOfInterest, { + shouldNormalise: true, + }) // eslint-disable-next-line jest/no-conditional-expect - await expect(page.locator('.cm-content')).not.toContainText('seg01') + await editor.expectEditor.not.toContain('seg01', { + shouldNormalise: true, + }) } }) } @@ -1241,53 +1307,39 @@ ${extraLine ? 'myVar = segLen(seg01)' : ''}` after: `line([0, -10], %, $seg01)`, }, { - before: `angledLineOfXLength([3 + 0, 30 + 0], %, $seg01)`, + before: `angledLineOfXLength({ angle = 3 + 0, length = 30 + 0 }, %, $seg01)`, after: `line([30, 1.57], %, $seg01)`, }, { - before: `angledLineOfYLength([3 + 0, 1.5 + 0], %, $seg01)`, + before: `angledLineOfYLength({ angle = 3 + 0, length = 1.5 + 0 }, %, $seg01)`, after: `line([28.62, 1.5], %, $seg01)`, }, { - before: `angledLineToX([3 + 0, 30 + 0], %, $seg01)`, + before: `angledLineToX({ angle = 3 + 0, to = 30 + 0 }, %, $seg01)`, after: `line([25, 1.31], %, $seg01)`, }, { - before: `angledLineToY([3 + 0, 7 + 0], %, $seg01)`, - after: `line([19.08, 1], %, $seg01)`, - }, - { - before: `angledLineOfXLength({ angle: 3 + 0, length: 30 + 0 }, %, $seg01)`, - after: `line([30, 1.57], %, $seg01)`, - }, - { - before: `angledLineOfYLength({ angle: 3 + 0, length: 1.5 + 0 }, %, $seg01)`, - after: `line([28.62, 1.5], %, $seg01)`, - }, - { - before: `angledLineToX({ angle: 3 + 0, to: 30 + 0 }, %, $seg01)`, - after: `line([25, 1.31], %, $seg01)`, - }, - { - before: `angledLineToY({ angle: 3 + 0, to: 7 + 0 }, %, $seg01)`, + before: `angledLineToY({ angle = 3 + 0, to = 7 + 0 }, %, $seg01)`, after: `line([19.08, 1], %, $seg01)`, }, ] for (const { before, after } of cases) { - const isObj = before.includes('{ angle: 3') + const isObj = before.includes('{ angle = 3') test(`${before.split('(')[0]}${isObj ? '-[obj-input]' : ''}`, async ({ page, + editor, + homePage, }) => { await page.addInitScript( async ({ lineToBeDeleted }) => { localStorage.setItem( 'persistCode', `part001 = startSketchOn('XZ') - |> startProfileAt([5, 6], %) - |> ${lineToBeDeleted} - |> line([-10, -15], %) - |> angledLine([-176, segLen(seg01)], %)` + |> startProfileAt([5, 6], %) + |> ${lineToBeDeleted} + |> line([-10, -15], %) + |> angledLine([-176, segLen(seg01)], %)` ) }, { @@ -1295,9 +1347,10 @@ ${extraLine ? 'myVar = segLen(seg01)' : ''}` } ) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() await page.waitForTimeout(300) await page.getByText(before).click() @@ -1330,14 +1383,16 @@ ${extraLine ? 'myVar = segLen(seg01)' : ''}` 5, '[data-overlay-toolbar-index="0"]' ) + await page.mouse.move(x, y) - await expect(page.locator('.cm-content')).toContainText(before) + await editor.expectEditor.toContain(before, { shouldNormalise: true }) await page.getByTestId('overlay-menu').click() await page.waitForTimeout(100) await page.getByText('Remove constraints').click() - await expect(page.locator('.cm-content')).toContainText(after) + await editor.expectEditor.toContain(after, { shouldNormalise: true }) + // check the cursor was left in the correct place after transform await expect(page.locator('.cm-activeLine')).toHaveText('|> ' + after) await expect(page.getByTestId('segment-overlay')).toHaveCount(3) diff --git a/e2e/playwright/testing-selections.spec.ts b/e2e/playwright/testing-selections.spec.ts index c162f910f..6eccccb10 100644 --- a/e2e/playwright/testing-selections.spec.ts +++ b/e2e/playwright/testing-selections.spec.ts @@ -1,24 +1,16 @@ -import { test, expect } from '@playwright/test' +import { test, expect } from './zoo-test' -import { commonPoints, getUtils, setup, tearDown } from './test-utils' +import { commonPoints, getUtils } from './test-utils' import { Coords2d } from 'lang/std/sketch' import { KCL_DEFAULT_LENGTH } from 'lib/constants' import { uuidv4 } from 'lib/utils' -test.beforeEach(async ({ context, page }, testInfo) => { - await setup(context, page, testInfo) -}) - -test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) - test.describe('Testing selections', () => { test.setTimeout(90_000) test( 'Selections work on fresh and edited sketch', { tag: ['@skipWin'] }, - async ({ page }) => { + async ({ page, homePage }) => { // Skip on windows its being weird. test.skip(process.platform === 'win32', 'Skip on windows') @@ -27,15 +19,22 @@ test.describe('Testing selections', () => { // source ranges are wrong, hovers won't work const u = await getUtils(page) const PUR = 400 / 37.5 //pixeltoUnitRatio - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await u.openDebugPanel() - const xAxisClick = () => - page.mouse.click(700, 253).then(() => page.waitForTimeout(100)) + const yAxisClick = () => + test.step('Click on Y axis', async () => { + await page.mouse.move(600, 200, { steps: 5 }) + await page.mouse.click(600, 200) + await page.waitForTimeout(100) + }) const xAxisClickAfterExitingSketch = () => - page.mouse.click(639, 278).then(() => page.waitForTimeout(100)) + test.step(`Click on X axis after exiting sketch, which shifts it at the moment`, async () => { + await page.mouse.click(639, 278) + await page.waitForTimeout(100) + }) const emptySpaceHover = () => test.step('Hover over empty space', async () => { await page.mouse.move(700, 143, { steps: 5 }) @@ -72,31 +71,31 @@ test.describe('Testing selections', () => { await page.mouse.click(startXPx + PUR * 10, 500 - PUR * 10) await expect(page.locator('.cm-content')) .toHaveText(`sketch001 = startSketchOn('XZ') - |> startProfileAt(${commonPoints.startAt}, %)`) + |> startProfileAt(${commonPoints.startAt}, %)`) await page.waitForTimeout(100) await page.mouse.click(startXPx + PUR * 20, 500 - PUR * 10) await expect(page.locator('.cm-content')) .toHaveText(`sketch001 = startSketchOn('XZ') - |> startProfileAt(${commonPoints.startAt}, %) - |> line([${commonPoints.num1}, 0], %)`) + |> startProfileAt(${commonPoints.startAt}, %) + |> xLine(${commonPoints.num1}, %)`) await page.waitForTimeout(100) await page.mouse.click(startXPx + PUR * 20, 500 - PUR * 20) await expect(page.locator('.cm-content')) .toHaveText(`sketch001 = startSketchOn('XZ') - |> startProfileAt(${commonPoints.startAt}, %) - |> line([${commonPoints.num1}, 0], %) - |> line([0, ${commonPoints.num1 + 0.01}], %)`) + |> startProfileAt(${commonPoints.startAt}, %) + |> xLine(${commonPoints.num1}, %) + |> yLine(${commonPoints.num1 + 0.01}, %)`) await page.waitForTimeout(100) await page.mouse.click(startXPx, 500 - PUR * 20) await expect(page.locator('.cm-content')) .toHaveText(`sketch001 = startSketchOn('XZ') - |> startProfileAt(${commonPoints.startAt}, %) - |> line([${commonPoints.num1}, 0], %) - |> line([0, ${commonPoints.num1 + 0.01}], %) - |> line([-${commonPoints.num2}, 0], %)`) + |> startProfileAt(${commonPoints.startAt}, %) + |> xLine(${commonPoints.num1}, %) + |> yLine(${commonPoints.num1 + 0.01}, %) + |> xLine(${commonPoints.num2 * -1}, %)`) // deselect line tool await page.getByRole('button', { name: 'line Line', exact: true }).click() @@ -121,51 +120,58 @@ test.describe('Testing selections', () => { // now check clicking works including axis // click a segment hold shift and click an axis, see that a relevant constraint is enabled - await topHorzSegmentClick() - await page.keyboard.down('Shift') const constrainButton = page.getByRole('button', { name: 'Length: open menu', }) - const absYButton = page.getByRole('button', { name: 'Absolute Y' }) - await constrainButton.click() - await expect(absYButton).toBeDisabled() - await page.waitForTimeout(100) - await xAxisClick() - await page.keyboard.up('Shift') - await constrainButton.click() - await absYButton.and(page.locator(':not([disabled])')).waitFor() - await expect(absYButton).not.toBeDisabled() + const absXButton = page.getByRole('button', { name: 'Absolute X' }) + + await test.step(`Select a segment and an axis, see that a relevant constraint is enabled`, async () => { + await topHorzSegmentClick() + await page.keyboard.down('Shift') + await constrainButton.click() + await expect(absXButton).toBeDisabled() + await page.waitForTimeout(100) + await yAxisClick() + await page.keyboard.up('Shift') + await constrainButton.click() + await absXButton.and(page.locator(':not([disabled])')).waitFor() + await expect(absXButton).not.toBeDisabled() + }) - // clear selection by clicking on nothing await emptySpaceClick() - - await page.waitForTimeout(100) - // same selection but click the axis first - await xAxisClick() - await constrainButton.click() - await expect(absYButton).toBeDisabled() - await page.keyboard.down('Shift') - await page.waitForTimeout(100) - await topHorzSegmentClick() await page.waitForTimeout(100) - await page.keyboard.up('Shift') - await constrainButton.click() - await expect(absYButton).not.toBeDisabled() + await test.step(`Same selection but click the axis first`, async () => { + await yAxisClick() + await constrainButton.click() + await expect(absXButton).toBeDisabled() + await page.keyboard.down('Shift') + await page.waitForTimeout(100) + await topHorzSegmentClick() + await page.waitForTimeout(100) + + await page.keyboard.up('Shift') + await constrainButton.click() + await expect(absXButton).not.toBeDisabled() + }) // clear selection by clicking on nothing await emptySpaceClick() // check the same selection again by putting cursor in code first then selecting axis - await page.getByText(` |> line([-${commonPoints.num2}, 0], %)`).click() - await page.keyboard.down('Shift') - await constrainButton.click() - await expect(absYButton).toBeDisabled() - await page.waitForTimeout(100) - await xAxisClick() - await page.keyboard.up('Shift') - await constrainButton.click() - await expect(absYButton).not.toBeDisabled() + await test.step(`Same selection but code selection then axis`, async () => { + await page + .getByText(` |> xLine(${commonPoints.num2 * -1}, %)`) + .click() + await page.keyboard.down('Shift') + await constrainButton.click() + await expect(absXButton).toBeDisabled() + await page.waitForTimeout(100) + await yAxisClick() + await page.keyboard.up('Shift') + await constrainButton.click() + await expect(absXButton).not.toBeDisabled() + }) // clear selection by clicking on nothing await emptySpaceClick() @@ -180,7 +186,7 @@ test.describe('Testing selections', () => { process.platform === 'linux' ? 'Control' : 'Meta' ) await page.waitForTimeout(100) - await page.getByText(` |> line([-${commonPoints.num2}, 0], %)`).click() + await page.getByText(` |> xLine(${commonPoints.num2 * -1}, %)`).click() await expect(page.locator('.cm-cursor')).toHaveCount(2) await page.waitForTimeout(500) @@ -250,78 +256,78 @@ test.describe('Testing selections', () => { } ) - test('Solids should be select and deletable', async ({ page }) => { + test('Solids should be select and deletable', async ({ page, homePage }) => { test.setTimeout(90_000) const u = await getUtils(page) await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `sketch001 = startSketchOn('XZ') - |> startProfileAt([-79.26, 95.04], %) - |> line([112.54, 127.64], %, $seg02) - |> line([170.36, -121.61], %, $seg01) - |> lineTo([profileStartX(%), profileStartY(%)], %) - |> close(%) -extrude001 = extrude(50, sketch001) -sketch005 = startSketchOn(extrude001, 'END') - |> startProfileAt([23.24, 136.52], %) - |> line([-8.44, 36.61], %) - |> line([49.4, 2.05], %) - |> line([29.69, -46.95], %) - |> lineTo([profileStartX(%), profileStartY(%)], %) - |> close(%) -sketch003 = startSketchOn(extrude001, seg01) - |> startProfileAt([21.23, 17.81], %) - |> line([51.97, 21.32], %) - |> line([4.07, -22.75], %) - |> lineTo([profileStartX(%), profileStartY(%)], %) - |> close(%) -sketch002 = startSketchOn(extrude001, seg02) - |> startProfileAt([-100.54, 16.99], %) - |> line([0, 20.03], %) - |> line([62.61, 0], %, $seg03) - |> lineTo([profileStartX(%), profileStartY(%)], %) - |> close(%) -extrude002 = extrude(50, sketch002) -sketch004 = startSketchOn(extrude002, seg03) - |> startProfileAt([57.07, 134.77], %) - |> line([-4.72, 22.84], %) - |> line([28.8, 6.71], %) - |> line([9.19, -25.33], %) - |> lineTo([profileStartX(%), profileStartY(%)], %) - |> close(%) -extrude003 = extrude(20, sketch004) -pipeLength = 40 -pipeSmallDia = 10 -pipeLargeDia = 20 -thickness = 0.5 -part009 = startSketchOn('XY') - |> startProfileAt([pipeLargeDia - (thickness / 2), 38], %) - |> line([thickness, 0], %) - |> line([0, -1], %) - |> angledLineToX({ - angle: 60, - to: pipeSmallDia + thickness - }, %) - |> line([0, -pipeLength], %) - |> angledLineToX({ - angle: -60, - to: pipeLargeDia + thickness - }, %) - |> line([0, -1], %) - |> line([-thickness, 0], %) - |> line([0, 1], %) - |> angledLineToX({ angle: 120, to: pipeSmallDia }, %) - |> line([0, pipeLength], %) - |> angledLineToX({ angle: 60, to: pipeLargeDia }, %) - |> close(%) -rev = revolve({ axis: 'y' }, part009) -` + |> startProfileAt([-79.26, 95.04], %) + |> line([112.54, 127.64], %, $seg02) + |> line([170.36, -121.61], %, $seg01) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) + extrude001 = extrude(50, sketch001) + sketch005 = startSketchOn(extrude001, 'END') + |> startProfileAt([23.24, 136.52], %) + |> line([-8.44, 36.61], %) + |> line([49.4, 2.05], %) + |> line([29.69, -46.95], %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) + sketch003 = startSketchOn(extrude001, seg01) + |> startProfileAt([21.23, 17.81], %) + |> line([51.97, 21.32], %) + |> line([4.07, -22.75], %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) + sketch002 = startSketchOn(extrude001, seg02) + |> startProfileAt([-100.54, 16.99], %) + |> line([0, 20.03], %) + |> line([62.61, 0], %, $seg03) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) + extrude002 = extrude(50, sketch002) + sketch004 = startSketchOn(extrude002, seg03) + |> startProfileAt([57.07, 134.77], %) + |> line([-4.72, 22.84], %) + |> line([28.8, 6.71], %) + |> line([9.19, -25.33], %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) + extrude003 = extrude(20, sketch004) + pipeLength = 40 + pipeSmallDia = 10 + pipeLargeDia = 20 + thickness = 0.5 + part009 = startSketchOn('XY') + |> startProfileAt([pipeLargeDia - (thickness / 2), 38], %) + |> line([thickness, 0], %) + |> line([0, -1], %) + |> angledLineToX({ + angle = 60, + to = pipeSmallDia + thickness + }, %) + |> line([0, -pipeLength], %) + |> angledLineToX({ + angle = -60, + to = pipeLargeDia + thickness + }, %) + |> line([0, -1], %) + |> line([-thickness, 0], %) + |> line([0, 1], %) + |> angledLineToX({ angle = 120, to = pipeSmallDia }, %) + |> line([0, pipeLength], %) + |> angledLineToX({ angle = 60, to = pipeLargeDia }, %) + |> close(%) + rev = revolve({ axis: 'y' }, part009) + ` ) }, KCL_DEFAULT_LENGTH) - await page.setViewportSize({ width: 1000, height: 500 }) - await page.goto('/') - await u.waitForAuthSkipAppStart() + await page.setBodyDimensions({ width: 1000, height: 500 }) + + await homePage.goToModelingScene() await u.openDebugPanel() await u.expectCmdLog('[data-message-type="execution-done"]') @@ -381,29 +387,29 @@ rev = revolve({ axis: 'y' }, part009) `extrude001 = extrude(50, sketch001)` ) await expect(u.codeLocator).toContainText(`sketch005 = startSketchOn({ - plane: { - origin: { x: 0, y: -50, z: 0 }, - x_axis: { x: 1, y: 0, z: 0 }, - y_axis: { x: 0, y: 0, z: 1 }, - z_axis: { x: 0, y: -1, z: 0 } - } - })`) + plane = { + origin = { x = 0, y = -50, z = 0 }, + x_axis = { x = 1, y = 0, z = 0 }, + y_axis = { x = 0, y = 0, z = 1 }, + z_axis = { x = 0, y = -1, z = 0 } + } + })`) await expect(u.codeLocator).toContainText(`sketch003 = startSketchOn({ - plane: { - origin: { x: 116.53, y: 0, z: 163.25 }, - x_axis: { x: -0.81, y: 0, z: 0.58 }, - y_axis: { x: 0, y: -1, z: 0 }, - z_axis: { x: 0.58, y: 0, z: 0.81 } - } - })`) + plane = { + origin = { x = 116.53, y = 0, z = 163.25 }, + x_axis = { x = -0.81, y = 0, z = 0.58 }, + y_axis = { x = 0, y = -1, z = 0 }, + z_axis = { x = 0.58, y = 0, z = 0.81 } + } + })`) await expect(u.codeLocator).toContainText(`sketch002 = startSketchOn({ - plane: { - origin: { x: -91.74, y: 0, z: 80.89 }, - x_axis: { x: -0.66, y: 0, z: -0.75 }, - y_axis: { x: 0, y: -1, z: 0 }, - z_axis: { x: -0.75, y: 0, z: 0.66 } - } - })`) + plane = { + origin = { x = -91.74, y = 0, z = 80.89 }, + x_axis = { x = -0.66, y = 0, z = -0.75 }, + y_axis = { x = 0, y = -1, z = 0 }, + z_axis = { x = -0.75, y = 0, z = 0.66 } + } + })`) // DELETE SOLID 2D await page.mouse.click(solid2d.x, solid2d.y) @@ -419,31 +425,32 @@ rev = revolve({ axis: 'y' }, part009) }) test("Deleting solid that the AST mod can't handle results in a toast message", async ({ page, + homePage, }) => { const u = await getUtils(page) await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `sketch001 = startSketchOn('XZ') - |> startProfileAt([-79.26, 95.04], %) - |> line([112.54, 127.64], %, $seg02) - |> line([170.36, -121.61], %, $seg01) - |> lineTo([profileStartX(%), profileStartY(%)], %) - |> close(%) -extrude001 = extrude(50, sketch001) -launderExtrudeThroughVar = extrude001 -sketch002 = startSketchOn(launderExtrudeThroughVar, seg02) - |> startProfileAt([-100.54, 16.99], %) - |> line([0, 20.03], %) - |> line([62.61, 0], %, $seg03) - |> lineTo([profileStartX(%), profileStartY(%)], %) - |> close(%) -` + |> startProfileAt([-79.26, 95.04], %) + |> line([112.54, 127.64], %, $seg02) + |> line([170.36, -121.61], %, $seg01) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) + extrude001 = extrude(50, sketch001) + launderExtrudeThroughVar = extrude001 + sketch002 = startSketchOn(launderExtrudeThroughVar, seg02) + |> startProfileAt([-100.54, 16.99], %) + |> line([0, 20.03], %) + |> line([62.61, 0], %, $seg03) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) + ` ) }, KCL_DEFAULT_LENGTH) - await page.setViewportSize({ width: 1000, height: 500 }) - await page.goto('/') - await u.waitForAuthSkipAppStart() + await page.setBodyDimensions({ width: 1000, height: 500 }) + + await homePage.goToModelingScene() await u.openDebugPanel() await u.expectCmdLog('[data-message-type="execution-done"]', 10_000) @@ -479,41 +486,44 @@ sketch002 = startSketchOn(launderExtrudeThroughVar, seg02) await u.clearCommandLogs() await page.keyboard.press('Backspace') - await expect(page.getByText('Unable to delete part')).toBeVisible() + await expect(page.getByText('Unable to delete selection')).toBeVisible() }) test('Hovering over 3d features highlights code, clicking puts the cursor in the right place and sends selection id to engine', async ({ page, + homePage, }) => { + // TODO: fix this test on windows after the electron migration + test.skip(process.platform === 'win32', 'Skip on windows') const u = await getUtils(page) await page.addInitScript(async (KCL_DEFAULT_LENGTH) => { localStorage.setItem( 'persistCode', `part001 = startSketchOn('XZ') - |> startProfileAt([20, 0], %) - |> line([7.13, 4 + 0], %) - |> angledLine({ angle: 3 + 0, length: 3.14 + 0 }, %) - |> lineTo([20.14 + 0, -0.14 + 0], %) - |> xLineTo(29 + 0, %) - |> yLine(-3.14 + 0, %, $a) - |> xLine(1.63, %) - |> angledLineOfXLength({ angle: 3 + 0, length: 3.14 }, %) - |> angledLineOfYLength({ angle: 30, length: 3 + 0 }, %) - |> angledLineToX({ angle: 22.14 + 0, to: 12 }, %) - |> angledLineToY({ angle: 30, to: 11.14 }, %) - |> angledLineThatIntersects({ - angle: 3.14, - intersectTag: a, - offset: 0 - }, %) - |> tangentialArcTo([13.14 + 0, 13.14], %) - |> close(%) - |> extrude(5 + 7, %) - ` + |> startProfileAt([20, 0], %) + |> line([7.13, 4 + 0], %) + |> angledLine({ angle = 3 + 0, length = 3.14 + 0 }, %) + |> lineTo([20.14 + 0, -0.14 + 0], %) + |> xLineTo(29 + 0, %) + |> yLine(-3.14 + 0, %, $a) + |> xLine(1.63, %) + |> angledLineOfXLength({ angle = 3 + 0, length = 3.14 }, %) + |> angledLineOfYLength({ angle = 30, length = 3 + 0 }, %) + |> angledLineToX({ angle = 22.14 + 0, to = 12 }, %) + |> angledLineToY({ angle = 30, to = 11.14 }, %) + |> angledLineThatIntersects({ + angle = 3.14, + intersectTag = a, + offset = 0 + }, %) + |> tangentialArcTo([13.14 + 0, 13.14], %) + |> close(%) + |> extrude(5 + 7, %) + ` ) }, KCL_DEFAULT_LENGTH) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() // wait for execution done await u.openDebugPanel() @@ -636,7 +646,7 @@ sketch002 = startSketchOn(launderExtrudeThroughVar, seg02) await checkCodeAtHoverPosition( 'flatExtrusionFace', flatExtrusionFace, - `angledLineThatIntersects({angle:3.14,intersectTag:a,offset:0},%)extrude(5+7,%)`, + `angledLineThatIntersects({angle=3.14,intersectTag=a,offset=0},%)extrude(5+7,%)`, '}, %)' ) @@ -693,19 +703,19 @@ sketch002 = startSketchOn(launderExtrudeThroughVar, seg02) await checkCodeAtHoverPosition( 'straightSegmentEdge', straightSegmentEdge, - `angledLineToY({angle:30,to:11.14},%)`, - 'angledLineToY({ angle: 30, to: 11.14 }, %)' + `angledLineToY({angle=30,to=11.14},%)`, + 'angledLineToY({ angle = 30, to = 11.14 }, %)' ) await checkCodeAtHoverPosition( 'straightSegmentOppositeEdge', straightSegmentOppositeEdge, - `angledLineToY({angle:30,to:11.14},%)`, - 'angledLineToY({ angle: 30, to: 11.14 }, %)' + `angledLineToY({angle=30,to=11.14},%)`, + 'angledLineToY({ angle = 30, to = 11.14 }, %)' ) await checkCodeAtHoverPosition( 'straightSegmentAdjacentEdge', straightSegmentAdjacentEdge, - `angledLineThatIntersects({angle:3.14,intersectTag:a,offset:0},%)`, + `angledLineThatIntersects({angle=3.14,intersectTag=a,offset=0},%)`, '}, %)' ) @@ -713,29 +723,29 @@ sketch002 = startSketchOn(launderExtrudeThroughVar, seg02) await u.removeCurrentCode() await u.codeLocator.fill(`sketch001 = startSketchOn('XZ') - |> startProfileAt([75.8, 317.2], %) // [$startCapTag, $EndCapTag] - |> angledLine([0, 268.43], %, $rectangleSegmentA001) - |> angledLine([ - segAng(rectangleSegmentA001) - 90, - 217.26 - ], %, $seg01) - |> angledLine([ - segAng(rectangleSegmentA001), - -segLen(rectangleSegmentA001) - ], %, $yo) - |> lineTo([profileStartX(%), profileStartY(%)], %, $seg02) - |> close(%) -extrude001 = extrude(100, sketch001) - |> chamfer({ - length: 30, - tags: [ - seg01, - getNextAdjacentEdge(yo), - getNextAdjacentEdge(seg02), - getOppositeEdge(seg01) - ] - }, %) -`) + |> startProfileAt([75.8, 317.2], %) // [$startCapTag, $EndCapTag] + |> angledLine([0, 268.43], %, $rectangleSegmentA001) + |> angledLine([ + segAng(rectangleSegmentA001) - 90, + 217.26 + ], %, $seg01) + |> angledLine([ + segAng(rectangleSegmentA001), + -segLen(rectangleSegmentA001) + ], %, $yo) + |> lineTo([profileStartX(%), profileStartY(%)], %, $seg02) + |> close(%) + extrude001 = extrude(100, sketch001) + |> chamfer({ + length = 30, + tags = [ + seg01, + getNextAdjacentEdge(yo), + getNextAdjacentEdge(seg02), + getOppositeEdge(seg01) + ] + }, %) + `) await expect( page.getByTestId('model-state-indicator-execution-done') ).toBeVisible() @@ -772,14 +782,14 @@ extrude001 = extrude(100, sketch001) await checkCodeAtHoverPosition( 'oppositeChamfer', oppositeChamfer, - `angledLine([segAng(rectangleSegmentA001)-90,217.26],%,$seg01)chamfer({length:30,tags:[seg01,getNextAdjacentEdge(yo),getNextAdjacentEdge(seg02),getOppositeEdge(seg01)]},%)`, + `angledLine([segAng(rectangleSegmentA001)-90,217.26],%,$seg01)chamfer({length=30,tags=[seg01,getNextAdjacentEdge(yo),getNextAdjacentEdge(seg02),getOppositeEdge(seg01)]},%)`, '}, %)' ) await checkCodeAtHoverPosition( 'baseChamfer', baseChamfer, - `angledLine([segAng(rectangleSegmentA001)-90,217.26],%,$seg01)chamfer({length:30,tags:[seg01,getNextAdjacentEdge(yo),getNextAdjacentEdge(seg02),getOppositeEdge(seg01)]},%)`, + `angledLine([segAng(rectangleSegmentA001)-90,217.26],%,$seg01)chamfer({length=30,tags=[seg01,getNextAdjacentEdge(yo),getNextAdjacentEdge(seg02),getOppositeEdge(seg01)]},%)`, '}, %)' ) @@ -810,77 +820,83 @@ extrude001 = extrude(100, sketch001) await checkCodeAtHoverPosition( 'adjacentChamfer1', adjacentChamfer1, - `lineTo([profileStartX(%),profileStartY(%)],%,$seg02)chamfer({length:30,tags:[seg01,getNextAdjacentEdge(yo),getNextAdjacentEdge(seg02),getOppositeEdge(seg01)]},%)`, + `lineTo([profileStartX(%),profileStartY(%)],%,$seg02)chamfer({length=30,tags=[seg01,getNextAdjacentEdge(yo),getNextAdjacentEdge(seg02),getOppositeEdge(seg01)]},%)`, '}, %)' ) await checkCodeAtHoverPosition( 'adjacentChamfer2', adjacentChamfer2, - `angledLine([segAng(rectangleSegmentA001),-segLen(rectangleSegmentA001)],%,$yo)chamfer({length:30,tags:[seg01,getNextAdjacentEdge(yo),getNextAdjacentEdge(seg02),getOppositeEdge(seg01)]},%)`, + `angledLine([segAng(rectangleSegmentA001),-segLen(rectangleSegmentA001)],%,$yo)chamfer({length=30,tags=[seg01,getNextAdjacentEdge(yo),getNextAdjacentEdge(seg02),getOppositeEdge(seg01)]},%)`, '}, %)' ) }) test("Extrude button should be disabled if there's no extrudable geometry when nothing is selected", async ({ page, + editor, + homePage, }) => { const u = await getUtils(page) + await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `sketch001 = startSketchOn('XZ') - |> startProfileAt([3.29, 7.86], %) - |> line([2.48, 2.44], %) - |> line([2.66, 1.17], %) - |> line([3.75, 0.46], %) - |> line([4.99, -0.46], %, $seg01) - |> line([3.3, -2.12], %) - |> line([2.16, -3.33], %) - |> line([0.85, -3.08], %) - |> line([-0.18, -3.36], %) - |> line([-3.86, -2.73], %) - |> line([-17.67, 0.85], %) - |> close(%) -extrude001 = extrude(10, sketch001) - ` + |> startProfileAt([3.29, 7.86], %) + |> line([2.48, 2.44], %) + |> line([2.66, 1.17], %) + |> line([3.75, 0.46], %) + |> line([4.99, -0.46], %, $seg01) + |> line([3.3, -2.12], %) + |> line([2.16, -3.33], %) + |> line([0.85, -3.08], %) + |> line([-0.18, -3.36], %) + |> line([-3.86, -2.73], %) + |> line([-17.67, 0.85], %) + |> close(%) + extrude001 = extrude(10, sketch001) + ` ) }) - await page.setViewportSize({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() + await u.waitForPageLoad() // wait for execution done await u.openDebugPanel() await u.expectCmdLog('[data-message-type="execution-done"]') await u.closeDebugPanel() - const selectUnExtrudable = () => - page.getByText(`line([4.99, -0.46], %, $seg01)`).click() + const selectUnExtrudable = async () => { + await editor.scrollToText(`line([4.99, -0.46], %, $seg01)`) + await page.getByText(`line([4.99, -0.46], %, $seg01)`).click() + } const clickEmpty = () => page.mouse.click(700, 460) await selectUnExtrudable() - // expect extrude button to be disabled - await expect(page.getByRole('button', { name: 'Extrude' })).toBeDisabled() + // expect extrude button to be enabled, since we don't guard + // until the extrude button is clicked + await expect(page.getByRole('button', { name: 'Extrude' })).toBeEnabled() await clickEmpty() // expect active line to contain nothing await expect(page.locator('.cm-activeLine')).toHaveText('') - // and extrude to still be disabled - await expect(page.getByRole('button', { name: 'Extrude' })).toBeDisabled() const codeToAdd = `${await u.codeLocator.allInnerTexts()} -sketch002 = startSketchOn(extrude001, $seg01) - |> startProfileAt([-12.94, 6.6], %) - |> line([2.45, -0.2], %) - |> line([-2, -1.25], %) - |> lineTo([profileStartX(%), profileStartY(%)], %) - |> close(%) -` + sketch002 = startSketchOn(extrude001, $seg01) + |> startProfileAt([-12.94, 6.6], %) + |> line([2.45, -0.2], %) + |> line([-2, -1.25], %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) + ` await u.codeLocator.fill(codeToAdd) await selectUnExtrudable() - // expect extrude button to be disabled - await expect(page.getByRole('button', { name: 'Extrude' })).toBeDisabled() + // expect extrude button to be enabled, since we don't guard + // until the extrude button is clicked + await expect(page.getByRole('button', { name: 'Extrude' })).toBeEnabled() await clickEmpty() await expect(page.locator('.cm-activeLine')).toHaveText('') @@ -890,23 +906,23 @@ sketch002 = startSketchOn(extrude001, $seg01) ).not.toBeDisabled() }) - test('Fillet button states test', async ({ page }) => { + test('Fillet button states test', async ({ page, homePage }) => { const u = await getUtils(page) await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `sketch001 = startSketchOn('XZ') - |> startProfileAt([-5, -5], %) - |> line([0, 10], %) - |> line([10, 0], %) - |> line([0, -10], %) - |> lineTo([profileStartX(%), profileStartY(%)], %) - |> close(%)` + |> startProfileAt([-5, -5], %) + |> line([0, 10], %) + |> line([10, 0], %) + |> line([0, -10], %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%)` ) }) - await page.setViewportSize({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await page.setBodyDimensions({ width: 1000, height: 500 }) + await homePage.goToModelingScene() await u.openDebugPanel() await u.expectCmdLog('[data-message-type="execution-done"]') await u.closeDebugPanel() @@ -915,20 +931,24 @@ sketch002 = startSketchOn(extrude001, $seg01) const selectClose = () => page.getByText(`close(%)`).click() const clickEmpty = () => page.mouse.click(950, 100) - // expect fillet button without any bodies in the scene + // Now that we don't disable toolbar buttons based on selection, + // but rather based on a "selection" step in the command palette, + // the fillet button should always be enabled with a good network connection. + // I'm not sure if this test is actually useful anymore. await selectSegment() - await expect(page.getByRole('button', { name: 'Fillet' })).toBeDisabled() + await expect(page.getByRole('button', { name: 'Fillet' })).toBeEnabled() await clickEmpty() - await expect(page.getByRole('button', { name: 'Fillet' })).toBeDisabled() + await expect(page.getByRole('button', { name: 'Fillet' })).toBeEnabled() // test fillet button with the body in the scene const codeToAdd = `${await u.codeLocator.allInnerTexts()} -extrude001 = extrude(10, sketch001)` + extrude001 = extrude(10, sketch001)` + await u.codeLocator.clear() await u.codeLocator.fill(codeToAdd) await selectSegment() await expect(page.getByRole('button', { name: 'Fillet' })).toBeEnabled() await selectClose() - await expect(page.getByRole('button', { name: 'Fillet' })).toBeDisabled() + await expect(page.getByRole('button', { name: 'Fillet' })).toBeEnabled() await clickEmpty() await expect(page.getByRole('button', { name: 'Fillet' })).toBeEnabled() }) @@ -943,6 +963,7 @@ extrude001 = extrude(10, sketch001)` test('Testing selections (and hovers) work on sketches when NOT in sketch mode', async ({ page, + homePage, }) => { const cases = [ { @@ -963,21 +984,21 @@ extrude001 = extrude(10, sketch001)` localStorage.setItem( 'persistCode', `yo = 79 -part001 = startSketchOn('XZ') - |> startProfileAt([-7.54, -26.74], %) - |> ${cases[0].expectedCode} - |> line([-3.19, -138.43], %) - |> ${cases[1].expectedCode} - |> line([41.19, 28.97 + 5], %) - |> ${cases[2].expectedCode}` + part001 = startSketchOn('XZ') + |> startProfileAt([-7.54, -26.74], %) + |> ${cases[0].expectedCode} + |> line([-3.19, -138.43], %) + |> ${cases[1].expectedCode} + |> line([41.19, 28.97 + 5], %) + |> ${cases[2].expectedCode}` ) }, { cases } ) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await u.openAndClearDebugPanel() await u.sendCustomCmd({ @@ -1010,24 +1031,25 @@ part001 = startSketchOn('XZ') }) test("Hovering and selection of extruded faces works, and is not overridden shortly after user's click", async ({ page, + homePage, }) => { await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `sketch001 = startSketchOn('XZ') - |> startProfileAt([-79.26, 95.04], %) - |> line([112.54, 127.64], %) - |> line([170.36, -121.61], %, $seg01) - |> lineTo([profileStartX(%), profileStartY(%)], %) - |> close(%) -extrude001 = extrude(50, sketch001) - ` + |> startProfileAt([-79.26, 95.04], %) + |> line([112.54, 127.64], %) + |> line([170.36, -121.61], %, $seg01) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) + extrude001 = extrude(50, sketch001) + ` ) }) const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await u.openAndClearDebugPanel() await u.sendCustomCmd({ @@ -1110,6 +1132,7 @@ extrude001 = extrude(50, sketch001) }) test("Various pipe expressions should and shouldn't allow edit and or extrude", async ({ page, + homePage, }) => { const u = await getUtils(page) const selectionsSnippets = { @@ -1128,46 +1151,46 @@ extrude001 = extrude(50, sketch001) localStorage.setItem( 'persistCode', `part001 = startSketchOn('XZ') - ${extrudeAndEditBlocked} - |> line([25.96, 2.93], %) - |> line([5.25, -5.72], %) - |> line([-2.01, -10.35], %) - |> line([-27.65, -2.78], %) - |> close(%) - |> extrude(5, %) - sketch002 = startSketchOn('XZ') - ${extrudeAndEditAllowed} - |> line([10.32, 6.47], %) - |> line([9.71, -6.16], %) - |> line([-3.08, -9.86], %) - |> line([-12.02, -1.54], %) - |> close(%) - sketch003 = startSketchOn('XZ') - ${editOnly} - |> line([27.55, -1.65], %) - |> line([4.95, -8], %) - |> line([-20.38, -10.12], %) - |> line([-15.79, 17.08], %) - - fn yohey = (pos) => { - sketch004 = startSketchOn('XZ') - ${extrudeAndEditBlockedInFunction} - |> line([27.55, -1.65], %) - |> line([4.95, -10.53], %) - |> line([-20.38, -8], %) - |> line([-15.79, 17.08], %) - return '' - } - - yohey([15.79, -34.6]) - ` + ${extrudeAndEditBlocked} + |> line([25.96, 2.93], %) + |> line([5.25, -5.72], %) + |> line([-2.01, -10.35], %) + |> line([-27.65, -2.78], %) + |> close(%) + |> extrude(5, %) + sketch002 = startSketchOn('XZ') + ${extrudeAndEditAllowed} + |> line([10.32, 6.47], %) + |> line([9.71, -6.16], %) + |> line([-3.08, -9.86], %) + |> line([-12.02, -1.54], %) + |> close(%) + sketch003 = startSketchOn('XZ') + ${editOnly} + |> line([27.55, -1.65], %) + |> line([4.95, -8], %) + |> line([-20.38, -10.12], %) + |> line([-15.79, 17.08], %) + + fn yohey = (pos) => { + sketch004 = startSketchOn('XZ') + ${extrudeAndEditBlockedInFunction} + |> line([27.55, -1.65], %) + |> line([4.95, -10.53], %) + |> line([-20.38, -8], %) + |> line([-15.79, 17.08], %) + return '' + } + + yohey([15.79, -34.6]) + ` ) }, selectionsSnippets ) - await page.setViewportSize({ width: 1200, height: 1000 }) + await page.setBodyDimensions({ width: 1200, height: 1000 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() // wait for execution done await u.openDebugPanel() @@ -1180,7 +1203,9 @@ extrude001 = extrude(50, sketch001) ).not.toBeDisabled() await page.getByText(selectionsSnippets.extrudeAndEditBlocked).click() - await expect(page.getByRole('button', { name: 'Extrude' })).toBeDisabled() + // expect extrude button to be enabled, since we don't guard + // until the extrude button is clicked + await expect(page.getByRole('button', { name: 'Extrude' })).toBeEnabled() await page.getByText(selectionsSnippets.extrudeAndEditAllowed).click() await expect( @@ -1191,7 +1216,9 @@ extrude001 = extrude(50, sketch001) ).not.toBeDisabled() await page.getByText(selectionsSnippets.editOnly).click() - await expect(page.getByRole('button', { name: 'Extrude' })).toBeDisabled() + // expect extrude button to be enabled, since we don't guard + // until the extrude button is clicked + await expect(page.getByRole('button', { name: 'Extrude' })).toBeEnabled() await expect( page.getByRole('button', { name: 'Edit Sketch' }) ).not.toBeDisabled() @@ -1199,7 +1226,9 @@ extrude001 = extrude(50, sketch001) await page .getByText(selectionsSnippets.extrudeAndEditBlockedInFunction) .click() - await expect(page.getByRole('button', { name: 'Extrude' })).toBeDisabled() + // expect extrude button to be enabled, since we don't guard + // until the extrude button is clicked + await expect(page.getByRole('button', { name: 'Extrude' })).toBeEnabled() await expect( page.getByRole('button', { name: 'Edit Sketch' }) ).not.toBeVisible() @@ -1207,6 +1236,7 @@ extrude001 = extrude(50, sketch001) test('Deselecting line tool should mean nothing happens on click', async ({ page, + homePage, }) => { /** * If the line tool is clicked when the state is 'No Points' it will exit Sketch mode. @@ -1215,9 +1245,9 @@ extrude001 = extrude(50, sketch001) * To continue to test this workflow, we now enter sketch mode and place a single point before exiting the line tool. */ const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await u.openDebugPanel() await expect( diff --git a/e2e/playwright/testing-settings.spec.ts b/e2e/playwright/testing-settings.spec.ts index c2675948c..0ccda2832 100644 --- a/e2e/playwright/testing-settings.spec.ts +++ b/e2e/playwright/testing-settings.spec.ts @@ -1,13 +1,7 @@ -import { test, expect } from '@playwright/test' +import { test, expect } from './zoo-test' import * as fsp from 'fs/promises' import { join } from 'path' -import { - getUtils, - setup, - setupElectron, - tearDown, - executorInputPath, -} from './test-utils' +import { getUtils, executorInputPath, createProject } from './test-utils' import { SaveSettingsPayload, SettingsLevel } from 'lib/settings/settingsTypes' import { SETTINGS_FILE_NAME, PROJECT_SETTINGS_FILE_NAME } from 'lib/constants' import { @@ -18,141 +12,138 @@ import { } from './storageStates' import * as TOML from '@iarna/toml' -test.beforeEach(async ({ context, page }, testInfo) => { - await setup(context, page, testInfo) -}) - -test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) - test.describe('Testing settings', () => { - test('Stored settings are validated and fall back to defaults', async ({ - page, - }) => { - const u = await getUtils(page) - + test( + 'Stored settings are validated and fall back to defaults', // Override beforeEach test setup // with corrupted settings - await page.addInitScript( - async ({ settingsKey, settings }) => { - localStorage.setItem(settingsKey, settings) - }, - { - settingsKey: TEST_SETTINGS_KEY, - settings: TOML.stringify({ settings: TEST_SETTINGS_CORRUPTED }), - } - ) + { + appSettings: TEST_SETTINGS_CORRUPTED, + }, + async ({ page, homePage }) => { + await page.setBodyDimensions({ width: 1200, height: 500 }) - await page.setViewportSize({ width: 1200, height: 500 }) + // Check the settings were reset + const storedSettings = TOML.parse( + await page.evaluate( + ({ settingsKey }) => localStorage.getItem(settingsKey) || '', + { settingsKey: TEST_SETTINGS_KEY } + ) + ) as { settings: SaveSettingsPayload } - await u.waitForAuthSkipAppStart() + expect(storedSettings.settings?.app?.theme).toBe('dark') - // Check the settings were reset - const storedSettings = TOML.parse( - await page.evaluate( - ({ settingsKey }) => localStorage.getItem(settingsKey) || '', - { settingsKey: TEST_SETTINGS_KEY } + // Check that the invalid settings were changed to good defaults + expect(storedSettings.settings?.modeling?.defaultUnit).toBe('in') + expect(storedSettings.settings?.modeling?.mouseControls).toBe('Zoo') + expect(storedSettings.settings?.app?.projectDirectory).toBe('') + expect(storedSettings.settings?.projects?.defaultProjectName).toBe( + 'project-$nnn' ) - ) as { settings: SaveSettingsPayload } + } + ) - expect(storedSettings.settings?.app?.theme).toBe(undefined) + // The behavior is actually broken. Parent always takes precedence + test.fixme( + 'Project settings can be set and override user settings', + async ({ page, homePage }) => { + const u = await getUtils(page) + await test.step(`Setup`, async () => { + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() + await page + .getByRole('button', { name: 'Start Sketch' }) + .waitFor({ state: 'visible' }) + }) - // Check that the invalid settings were removed - expect(storedSettings.settings?.modeling?.defaultUnit).toBe(undefined) - expect(storedSettings.settings?.modeling?.mouseControls).toBe(undefined) - expect(storedSettings.settings?.app?.projectDirectory).toBe(undefined) - expect(storedSettings.settings?.projects?.defaultProjectName).toBe( - undefined - ) - }) + // Selectors and constants + const paneButtonLocator = page.getByTestId('debug-pane-button') + const headingLocator = page.getByRole('heading', { + name: 'Settings', + exact: true, + }) + const inputLocator = page.locator('input[name="modeling-showDebugPanel"]') - test('Project settings can be set and override user settings', async ({ - page, - }) => { - const u = await getUtils(page) - await test.step(`Setup`, async () => { - await page.setViewportSize({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await test.step('Open settings dialog and set "Show debug panel" to on', async () => { + await page.keyboard.press('ControlOrMeta+,') + await expect(headingLocator).toBeVisible() + + /** Test to close https://github.com/KittyCAD/modeling-app/issues/2713 */ + await test.step(`Confirm that this dialog has a solid background`, async () => { + await expect + .poll( + () => u.getGreatestPixDiff({ x: 600, y: 250 }, [28, 28, 28]), + { + timeout: 1000, + message: + 'Checking for solid background, should not see default plane colors', + } + ) + .toBeLessThan(15) + }) + + await page.locator('#showDebugPanel').getByText('OffOn').click() + }) + + // Close it and open again with keyboard shortcut, while KCL editor is focused + // Put the cursor in the editor + await test.step('Open settings with keyboard shortcut', async () => { + await page.getByTestId('settings-close-button').click() + await page.locator('.cm-content').click() + await page.keyboard.press('ControlOrMeta+,') + await expect(headingLocator).toBeVisible() + }) + + // Verify the toast appeared + await expect( + page.getByText(`Set show debug panel to "false" for this project`) + ).toBeVisible() + await expect( + page.getByText(`Set show debug panel to "false" for this project`) + ).not.toBeVisible() + + // Check that the debug panel button is gone + await expect(paneButtonLocator).not.toBeVisible() + + // Check that the user setting was not changed + await page.getByRole('radio', { name: 'User' }).click() + await expect(inputLocator).toBeChecked() + + // Roll back to default of "off" + await await page + .getByText( + 'show debug panelRoll back show debug panelRoll back to match' + ) + .hover() await page - .getByRole('button', { name: 'Start Sketch' }) - .waitFor({ state: 'visible' }) - }) + .getByRole('button', { + name: 'Roll back show debug panel', + }) + .click() + await expect(inputLocator).not.toBeChecked() - // Selectors and constants - const paneButtonLocator = page.getByTestId('debug-pane-button') - const headingLocator = page.getByRole('heading', { - name: 'Settings', - exact: true, - }) - const inputLocator = page.locator('input[name="modeling-showDebugPanel"]') - - await test.step('Open settings dialog and set "Show debug panel" to on', async () => { - await page.keyboard.press('ControlOrMeta+Shift+,') - await expect(headingLocator).toBeVisible() - - /** Test to close https://github.com/KittyCAD/modeling-app/issues/2713 */ - await test.step(`Confirm that this dialog has a solid background`, async () => { - await expect - .poll(() => u.getGreatestPixDiff({ x: 600, y: 250 }, [28, 28, 28]), { - timeout: 1000, - message: - 'Checking for solid background, should not see default plane colors', - }) - .toBeLessThan(15) - }) - - await page.locator('#showDebugPanel').getByText('OffOn').click() - }) - - // Close it and open again with keyboard shortcut, while KCL editor is focused - // Put the cursor in the editor - await test.step('Open settings with keyboard shortcut', async () => { - await page.getByTestId('settings-close-button').click() - await page.locator('.cm-content').click() - await page.keyboard.press('ControlOrMeta+Shift+,') - await expect(headingLocator).toBeVisible() - }) - - // Verify the toast appeared - await expect( - page.getByText(`Set show debug panel to "false" for this project`) - ).toBeVisible() - // Check that the theme changed - await expect(paneButtonLocator).not.toBeVisible() - - // Check that the user setting was not changed - await page.getByRole('radio', { name: 'User' }).click() - await expect(inputLocator).toBeChecked() - - // Roll back to default of "off" - await await page - .getByText('show debug panelRoll back show debug panelRoll back to match') - .hover() - await page - .getByRole('button', { - name: 'Roll back show debug panel', - }) - .click() - await expect(inputLocator).not.toBeChecked() - - // Check that the project setting did not change - await page.getByRole('radio', { name: 'Project' }).click() - await expect( - page.locator('input[name="modeling-showDebugPanel"]') - ).not.toBeChecked() - }) + // Check that the project setting did not change + await page.getByRole('radio', { name: 'Project' }).click() + await expect( + page.locator('input[name="modeling-showDebugPanel"]') + ).not.toBeChecked() + } + ) test('Keybindings display the correct hotkey for Command Palette', async ({ page, + homePage, }) => { + // TODO: fix this test on windows after the electron migration + test.skip(process.platform === 'win32', 'Skip on windows') const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() + await u.waitForPageLoad() await test.step('Open keybindings settings', async () => { - // Open the settings modal with the browser keyboard shortcut - await page.keyboard.press('ControlOrMeta+Shift+,') + // Open the settings modal with the keyboard shortcut + await page.keyboard.press('ControlOrMeta+,') // Go to Keybindings tab. const keybindingsTab = page.getByRole('radio', { name: 'Keybindings' }) @@ -173,113 +164,124 @@ test.describe('Testing settings', () => { await expect(hotkey).toHaveText(text) }) - test('Project and user settings can be reset', async ({ page }) => { - const u = await getUtils(page) - await test.step(`Setup`, async () => { - await page.setViewportSize({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() - }) - - // Selectors and constants - const projectSettingsTab = page.getByRole('radio', { name: 'Project' }) - const userSettingsTab = page.getByRole('radio', { name: 'User' }) - const resetButton = (level: SettingsLevel) => - page.getByRole('button', { - name: `Reset ${level}-level settings`, - }) - const themeColorSetting = page.locator('#themeColor').getByRole('slider') - const settingValues = { - default: '259', - user: '120', - project: '50', - } - const resetToast = (level: SettingsLevel) => - page.getByText(`${level}-level settings were reset`) - - await test.step(`Open the settings modal`, async () => { - await page.getByRole('link', { name: 'Settings' }).last().click() - await expect( - page.getByRole('heading', { name: 'Settings', exact: true }) - ).toBeVisible() - }) - - await test.step('Set up theme color', async () => { - // Verify we're looking at the project-level settings, - // and it's set to default value - await expect(projectSettingsTab).toBeChecked() - await expect(themeColorSetting).toHaveValue(settingValues.default) - - // Set project-level value to 50 - await themeColorSetting.fill(settingValues.project) - - // Set user-level value to 120 - await userSettingsTab.click() - await themeColorSetting.fill(settingValues.user) - await projectSettingsTab.click() - }) - - await test.step('Reset project settings', async () => { - // Click the reset settings button. - await resetButton('project').click() - - await expect(resetToast('project')).toBeVisible() - await expect(resetToast('project')).not.toBeVisible() - - // Verify it is now set to the inherited user value - await expect(themeColorSetting).toHaveValue(settingValues.user) - - await test.step(`Check that the user settings did not change`, async () => { - await userSettingsTab.click() - await expect(themeColorSetting).toHaveValue(settingValues.user) + test.fixme( + 'Project and user settings can be reset', + async ({ page, homePage }) => { + const u = await getUtils(page) + await test.step(`Setup`, async () => { + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() + await u.waitForPageLoad() + await page.waitForTimeout(1000) }) - await test.step(`Set project-level again to test the user-level reset`, async () => { - await projectSettingsTab.click() + // Selectors and constants + const projectSettingsTab = page.getByRole('radio', { name: 'Project' }) + const userSettingsTab = page.getByRole('radio', { name: 'User' }) + const resetButton = (level: SettingsLevel) => + page.getByRole('button', { + name: `Reset ${level}-level settings`, + }) + const themeColorSetting = page.locator('#themeColor').getByRole('slider') + const settingValues = { + default: '259', + user: '120', + project: '50', + } + const resetToast = (level: SettingsLevel) => + page.getByText(`${level}-level settings were reset`) + + await test.step(`Open the settings modal`, async () => { + await page.getByRole('link', { name: 'Settings' }).last().click() + await expect( + page.getByRole('heading', { name: 'Settings', exact: true }) + ).toBeVisible() + }) + + await test.step('Set up theme color', async () => { + // Verify we're looking at the project-level settings, + // and it's set to default value + await expect(projectSettingsTab).toBeChecked() + await expect(themeColorSetting).toHaveValue(settingValues.default) + + // Set project-level value to 50 await themeColorSetting.fill(settingValues.project) + + // Set user-level value to 120 await userSettingsTab.click() - }) - }) - - await test.step('Reset user settings', async () => { - // Click the reset settings button. - await resetButton('user').click() - - await expect(resetToast('user')).toBeVisible() - await expect(resetToast('user')).not.toBeVisible() - - // Verify it is now set to the default value - await expect(themeColorSetting).toHaveValue(settingValues.default) - - await test.step(`Check that the project settings did not change`, async () => { + await themeColorSetting.fill(settingValues.user) await projectSettingsTab.click() - await expect(themeColorSetting).toHaveValue(settingValues.project) }) - }) - }) - test( + await test.step('Reset project settings', async () => { + // Click the reset settings button. + await resetButton('project').click() + + await expect(resetToast('project')).toBeVisible() + await expect(resetToast('project')).not.toBeVisible() + + // Verify it is now set to the inherited user value + await expect(themeColorSetting).toHaveValue(settingValues.user) + + await test.step(`Check that the user settings did not change`, async () => { + await userSettingsTab.click() + await expect(themeColorSetting).toHaveValue(settingValues.user) + }) + + await test.step(`Set project-level again to test the user-level reset`, async () => { + await projectSettingsTab.click() + await themeColorSetting.fill(settingValues.project) + await userSettingsTab.click() + }) + }) + + await test.step('Reset user settings', async () => { + // Click the reset settings button. + await resetButton('user').click() + + await expect(resetToast('user')).toBeVisible() + await expect(resetToast('user')).not.toBeVisible() + + // Verify it is now set to the default value + await expect(themeColorSetting).toHaveValue(settingValues.default) + + await test.step(`Check that the project settings did not change`, async () => { + await projectSettingsTab.click() + await expect(themeColorSetting).toHaveValue(settingValues.project) + }) + }) + } + ) + + test.fixme( `Project settings override user settings on desktop`, { tag: ['@electron', '@skipWin'] }, - async ({ browser: _ }, testInfo) => { + async ({ context, page }, testInfo) => { test.skip( process.platform === 'win32', 'TODO: remove this skip https://github.com/KittyCAD/modeling-app/issues/3557' ) - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - const bracketDir = join(dir, 'bracket') + const projectName = 'bracket' + const { dir: projectDirName } = await context.folderSetupFn( + async (dir) => { + const bracketDir = join(dir, projectName) await fsp.mkdir(bracketDir, { recursive: true }) await fsp.copyFile( executorInputPath('focusrite_scarlett_mounting_braket.kcl'), join(bracketDir, 'main.kcl') ) - }, - }) + } + ) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) // Selectors and constants + const tempProjectSettingsFilePath = join( + projectDirName, + projectName, + PROJECT_SETTINGS_FILE_NAME + ) + const tempUserSettingsFilePath = join(projectDirName, SETTINGS_FILE_NAME) const userThemeColor = '120' const projectThemeColor = '50' const settingsOpenButton = page.getByRole('link', { @@ -300,6 +302,12 @@ test.describe('Testing settings', () => { await themeColorSetting.fill(userThemeColor) await expect(logoLink).toHaveCSS('--primary-hue', userThemeColor) await settingsCloseButton.click() + await expect + .poll(async () => fsp.readFile(tempUserSettingsFilePath, 'utf-8'), { + message: 'Setting should now be written to the file', + timeout: 5_000, + }) + .toContain(`themeColor = "${userThemeColor}"`) }) await test.step('Set project theme color', async () => { @@ -311,13 +319,23 @@ test.describe('Testing settings', () => { await themeColorSetting.fill(projectThemeColor) await expect(logoLink).toHaveCSS('--primary-hue', projectThemeColor) await settingsCloseButton.click() + // Make sure that the project settings file has been written to before continuing + await expect + .poll( + async () => fsp.readFile(tempProjectSettingsFilePath, 'utf-8'), + { + message: 'Setting should now be written to the file', + timeout: 5_000, + } + ) + .toContain(`themeColor = "${projectThemeColor}"`) }) await test.step('Refresh the application and see project setting applied', async () => { // Make sure we're done navigating before we reload await expect(settingsCloseButton).not.toBeVisible() - await page.reload({ waitUntil: 'domcontentloaded' }) + await page.reload({ waitUntil: 'domcontentloaded' }) await expect(logoLink).toHaveCSS('--primary-hue', projectThemeColor) }) @@ -325,22 +343,18 @@ test.describe('Testing settings', () => { await logoLink.click() await expect(logoLink).toHaveCSS('--primary-hue', userThemeColor) }) - - await electronApp.close() } ) test( `Load desktop app with no settings file`, - { tag: '@electron' }, - async ({ browser: _ }, testInfo) => { - const { electronApp, page } = await setupElectron({ - // This is what makes no settings file get created - cleanProjectDir: false, - testInfo, - }) - - await page.setViewportSize({ width: 1200, height: 500 }) + { + tag: '@electron', + // This is what makes no settings file get created + cleanProjectDir: false, + }, + async ({ page }, testInfo) => { + await page.setBodyDimensions({ width: 1200, height: 500 }) // Selectors and constants const errorHeading = page.getByRole('heading', { @@ -351,25 +365,21 @@ test.describe('Testing settings', () => { // If the app loads without exploding we're in the clear await expect(errorHeading).not.toBeVisible() await expect(projectDirLink).toBeVisible() - - await electronApp.close() } ) test( `Load desktop app with a settings file, but no project directory setting`, - { tag: '@electron' }, - async ({ browser: _ }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - appSettings: { - app: { - themeColor: '259', - }, + { + tag: '@electron', + appSettings: { + app: { + themeColor: '259', }, - }) - - await page.setViewportSize({ width: 1200, height: 500 }) + }, + }, + async ({ context, page }, testInfo) => { + await page.setBodyDimensions({ width: 1200, height: 500 }) // Selectors and constants const errorHeading = page.getByRole('heading', { @@ -380,32 +390,28 @@ test.describe('Testing settings', () => { // If the app loads without exploding we're in the clear await expect(errorHeading).not.toBeVisible() await expect(projectDirLink).toBeVisible() - - await electronApp.close() } ) // It was much easier to test the logo color than the background stream color. - test( + test.fixme( 'user settings reload on external change, on project and modeling view', - { tag: '@electron' }, - async ({ browserName }, testInfo) => { - const { - electronApp, - page, - dir: projectDirName, - } = await setupElectron({ - testInfo, - appSettings: { - app: { - // Doesn't matter what you set it to. It will - // default to 264.5 - themeColor: '0', - }, + { + tag: '@electron', + appSettings: { + app: { + // Doesn't matter what you set it to. It will + // default to 264.5 + themeColor: '0', }, - }) + }, + }, + async ({ context, page }, testInfo) => { + const { dir: projectDirName } = await context.folderSetupFn( + async () => {} + ) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) const logoLink = page.getByTestId('app-logo') const projectDirLink = page.getByText('Loaded from') @@ -428,8 +434,7 @@ test.describe('Testing settings', () => { }) await test.step('Check color of logo changed when in modeling view', async () => { - await page.getByRole('button', { name: 'New project' }).click() - await page.getByTestId('project-link').first().click() + await createProject({ name: 'project-000', page }) await changeColor('58') await expect(logoLink).toHaveCSS('--primary-hue', '58') }) @@ -440,23 +445,18 @@ test.describe('Testing settings', () => { await changeColor('21') await expect(logoLink).toHaveCSS('--primary-hue', '21') }) - await electronApp.close() } ) - test( + test.fixme( 'project settings reload on external change', { tag: '@electron' }, - async ({ browserName }, testInfo) => { - const { - electronApp, - page, - dir: projectDirName, - } = await setupElectron({ - testInfo, - }) + async ({ context, page }, testInfo) => { + const { dir: projectDirName } = await context.folderSetupFn( + async () => {} + ) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) const logoLink = page.getByTestId('app-logo') const projectDirLink = page.getByText('Loaded from') @@ -465,11 +465,7 @@ test.describe('Testing settings', () => { await expect(projectDirLink).toBeVisible() }) - const projectLinks = page.getByTestId('project-link') - const oldCount = await projectLinks.count() - await page.getByRole('button', { name: 'New project' }).click() - await expect(projectLinks).toHaveCount(oldCount + 1) - await projectLinks.filter({ hasText: 'project-000' }).first().click() + await createProject({ name: 'project-000', page }) const changeColorFs = async (color: string) => { const tempSettingsFilePath = join( @@ -491,29 +487,26 @@ test.describe('Testing settings', () => { await changeColorFs('99') await expect(logoLink).toHaveCSS('--primary-hue', '99') }) - - await electronApp.close() } ) test( `Closing settings modal should go back to the original file being viewed`, { tag: '@electron' }, - async ({ browser: _ }, testInfo) => { - const { electronApp, page } = await setupElectron({ - testInfo, - folderSetupFn: async (dir) => { - const bracketDir = join(dir, 'project-000') - await fsp.mkdir(bracketDir, { recursive: true }) - await fsp.copyFile( - executorInputPath('cube.kcl'), - join(bracketDir, 'main.kcl') - ) - await fsp.copyFile( - executorInputPath('cylinder.kcl'), - join(bracketDir, '2.kcl') - ) - }, + async ({ context, page }, testInfo) => { + // TODO: fix this test on windows after the electron migration + test.skip(process.platform === 'win32', 'Skip on windows') + await context.folderSetupFn(async (dir) => { + const bracketDir = join(dir, 'project-000') + await fsp.mkdir(bracketDir, { recursive: true }) + await fsp.copyFile( + executorInputPath('cube.kcl'), + join(bracketDir, 'main.kcl') + ) + await fsp.copyFile( + executorInputPath('cylinder.kcl'), + join(bracketDir, '2.kcl') + ) }) const kclCube = await fsp.readFile(executorInputPath('cube.kcl'), 'utf-8') const kclCylinder = await fsp.readFile( @@ -529,7 +522,7 @@ test.describe('Testing settings', () => { editorTextMatches, } = await getUtils(page, test) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) page.on('console', console.log) await test.step('Precondition: Open to second project file', async () => { @@ -560,16 +553,17 @@ test.describe('Testing settings', () => { await test.step('Postcondition: Same file content is in editor as before settings opened', async () => { await editorTextMatches(kclCylinder) }) - - await electronApp.close() } ) - test('Changing modeling default unit', async ({ page }) => { - const u = await getUtils(page) + test('Changing modeling default unit', async ({ page, homePage }) => { await test.step(`Test setup`, async () => { - await page.setViewportSize({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + // TODO: fix this test on windows after the electron migration + test.skip(process.platform === 'win32', 'Skip on windows') + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() + const toastMessage = page.getByText(`Successfully created "testDefault"`) + await expect(toastMessage).not.toBeVisible() await page .getByRole('button', { name: 'Start Sketch' }) .waitFor({ state: 'visible' }) @@ -596,7 +590,9 @@ test.describe('Testing settings', () => { await userSettingsTab.click() await defaultUnitSection.hover() await defaultUnitRollbackButton.click() + await projectSettingsTab.hover() await projectSettingsTab.click() + await page.waitForTimeout(1000) }) await test.step('Change modeling default unit within project tab', async () => { @@ -608,7 +604,10 @@ test.describe('Testing settings', () => { const toastMessage = page.getByText( `Set default unit to "${unitOfMeasure}" for this project` ) + + // Assert visibility and disapperance await expect(toastMessage).toBeVisible() + await expect(toastMessage).not.toBeVisible() }) } await changeUnitOfMeasureInProjectTab('in') @@ -620,7 +619,10 @@ test.describe('Testing settings', () => { }) // Go to the user tab + await userSettingsTab.hover() await userSettingsTab.click() + await page.waitForTimeout(1000) + await test.step('Change modeling default unit within user tab', async () => { const changeUnitOfMeasureInUserTab = async (unitOfMeasure: string) => { await test.step(`Set modeling default unit to ${unitOfMeasure}`, async () => { @@ -703,23 +705,28 @@ test.describe('Testing settings', () => { }) }) - test('Changing theme in sketch mode', async ({ page }) => { + test('Changing theme in sketch mode', async ({ context, page, homePage }) => { + // TODO: fix this test on windows after the electron migration + test.skip(process.platform === 'win32', 'Skip on windows') const u = await getUtils(page) - await page.addInitScript(() => { + await context.addInitScript(() => { localStorage.setItem( 'persistCode', `sketch001 = startSketchOn('XZ') - |> startProfileAt([0, 0], %) - |> line([5, 0], %) - |> line([0, 5], %) - |> line([-5, 0], %) - |> lineTo([profileStartX(%), profileStartY(%)], %) - |> close(%) -extrude001 = extrude(5, sketch001) -` + |> startProfileAt([0, 0], %) + |> line([5, 0], %) + |> line([0, 5], %) + |> line([-5, 0], %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) + extrude001 = extrude(5, sketch001) + ` ) }) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() + await u.waitForPageLoad() + await page.waitForTimeout(1000) // Selectors and constants const editSketchButton = page.getByRole('button', { name: 'Edit Sketch' }) @@ -730,7 +737,6 @@ extrude001 = extrude(5, sketch001) const lightThemeSegmentColor: [number, number, number] = [90, 90, 90] await test.step(`Get into sketch mode`, async () => { - await u.waitForAuthSkipAppStart() await page.mouse.click(700, 200) await expect(editSketchButton).toBeVisible() await editSketchButton.click() @@ -769,135 +775,125 @@ extrude001 = extrude(5, sketch001) }) }) - test(`Changing system theme preferences (via media query) should update UI and stream`, async ({ - page, - }) => { - // Override the settings so that the theme is set to `system` - await page.addInitScript( - ({ settingsKey, settings }) => { - localStorage.setItem(settingsKey, settings) - }, - { - settingsKey: TEST_SETTINGS_KEY, - settings: TOML.stringify({ - settings: TEST_SETTINGS_DEFAULT_THEME, - }), + test( + `Changing system theme preferences (via media query) should update UI and stream`, + { + // Override the settings so that the theme is set to `system` + appSettings: TEST_SETTINGS_DEFAULT_THEME, + }, + async ({ page, homePage }) => { + const u = await getUtils(page) + + // Selectors and constants + const darkBackgroundCss = 'oklch(0.3012 0 264.5)' + const lightBackgroundCss = 'oklch(0.9911 0 264.5)' + const darkBackgroundColor: [number, number, number] = [27, 27, 27] + const lightBackgroundColor: [number, number, number] = [245, 245, 245] + const streamBackgroundPixelIsColor = async ( + color: [number, number, number] + ) => { + return u.getGreatestPixDiff({ x: 1000, y: 200 }, color) } - ) - const u = await getUtils(page) + const toolbar = page.locator('menu').filter({ hasText: 'Start Sketch' }) - // Selectors and constants - const darkBackgroundCss = 'oklch(0.3012 0 264.5)' - const lightBackgroundCss = 'oklch(0.9911 0 264.5)' - const darkBackgroundColor: [number, number, number] = [27, 27, 27] - const lightBackgroundColor: [number, number, number] = [245, 245, 245] - const streamBackgroundPixelIsColor = async ( - color: [number, number, number] - ) => { - return u.getGreatestPixDiff({ x: 1000, y: 200 }, color) + await test.step(`Test setup`, async () => { + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() + await u.waitForPageLoad() + await page.waitForTimeout(1000) + await expect(toolbar).toBeVisible() + }) + + await test.step(`Check the background color is light before`, async () => { + await expect(toolbar).toHaveCSS('background-color', lightBackgroundCss) + await expect + .poll(() => streamBackgroundPixelIsColor(lightBackgroundColor)) + .toBeLessThan(15) + }) + + await test.step(`Change media query preference to dark, emulating dusk with system theme`, async () => { + await page.emulateMedia({ colorScheme: 'dark' }) + }) + + await test.step(`Check the background color is dark after`, async () => { + await expect(toolbar).toHaveCSS('background-color', darkBackgroundCss) + await expect + .poll(() => streamBackgroundPixelIsColor(darkBackgroundColor)) + .toBeLessThan(15) + }) } - const toolbar = page.locator('menu').filter({ hasText: 'Start Sketch' }) + ) - await test.step(`Test setup`, async () => { - await page.setViewportSize({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() - await expect(toolbar).toBeVisible() - }) + test( + `Turning off "Show debug panel" with debug panel open leaves no phantom panel`, + { + // Override beforeEach test setup + // with debug panel open + // but "show debug panel" set to false + appSettings: { + ...TEST_SETTINGS, + modeling: { ...TEST_SETTINGS.modeling, showDebugPanel: false }, + }, + }, + async ({ context, page, homePage }) => { + const u = await getUtils(page) - await test.step(`Check the background color is light before`, async () => { - await expect(toolbar).toHaveCSS('background-color', lightBackgroundCss) - await expect - .poll(() => streamBackgroundPixelIsColor(lightBackgroundColor)) - .toBeLessThan(15) - }) - - await test.step(`Change media query preference to dark, emulating dusk with system theme`, async () => { - await page.emulateMedia({ colorScheme: 'dark' }) - }) - - await test.step(`Check the background color is dark after`, async () => { - await expect(toolbar).toHaveCSS('background-color', darkBackgroundCss) - await expect - .poll(() => streamBackgroundPixelIsColor(darkBackgroundColor)) - .toBeLessThan(15) - }) - }) - - test(`Turning off "Show debug panel" with debug panel open leaves no phantom panel`, async ({ - page, - }) => { - const u = await getUtils(page) - - // Override beforeEach test setup - // with debug panel open - // but "show debug panel" set to false - await page.addInitScript( - async ({ settingsKey, settings }) => { - localStorage.setItem(settingsKey, settings) + await context.addInitScript(async () => { localStorage.setItem( 'persistModelingContext', '{"openPanes":["debug"]}' ) - }, - { - settingsKey: TEST_SETTINGS_KEY, - settings: TOML.stringify({ - settings: { - ...TEST_SETTINGS, - modeling: { ...TEST_SETTINGS.modeling, showDebugPanel: false }, - }, - }), + }) + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() + + // Constants and locators + const resizeHandle = page.locator('.sidebar-resize-handles > div.block') + const debugPaneButton = page.getByTestId('debug-pane-button') + const commandsButton = page.getByRole('button', { name: 'Commands' }) + const debugPaneOption = page.getByRole('option', { + name: 'Settings · modeling · show debug panel', + }) + + async function setShowDebugPanelTo(value: 'On' | 'Off') { + await commandsButton.click() + await debugPaneOption.click() + await page.getByRole('option', { name: value }).click() + await expect( + page.getByText( + `Set show debug panel to "${value === 'On'}" for this project` + ) + ).toBeVisible() } - ) - await page.setViewportSize({ width: 1200, height: 500 }) - // Constants and locators - const resizeHandle = page.locator('.sidebar-resize-handles > div.block') - const debugPaneButton = page.getByTestId('debug-pane-button') - const commandsButton = page.getByRole('button', { name: 'Commands' }) - const debugPaneOption = page.getByRole('option', { - name: 'Settings · modeling · show debug panel', - }) + await test.step(`Initial load with corrupted settings`, async () => { + // Check that the debug panel is not visible + await expect(debugPaneButton).not.toBeVisible() + // Check the pane resize handle wrapper is not visible + await expect(resizeHandle).not.toBeVisible() + }) - async function setShowDebugPanelTo(value: 'On' | 'Off') { - await commandsButton.click() - await debugPaneOption.click() - await page.getByRole('option', { name: value }).click() - await expect( - page.getByText( - `Set show debug panel to "${value === 'On'}" for this project` - ) - ).toBeVisible() + await test.step(`Open code pane to verify we see the resize handles`, async () => { + await u.openKclCodePanel() + await expect(resizeHandle).toBeVisible() + await u.closeKclCodePanel() + }) + + await test.step(`Turn on debug panel, open it`, async () => { + await setShowDebugPanelTo('On') + await expect(debugPaneButton).toBeVisible() + // We want the logic to clear the phantom panel, so we shouldn't see + // the real panel (and therefore the resize handle) yet + await expect(resizeHandle).not.toBeVisible() + await u.openDebugPanel() + await expect(resizeHandle).toBeVisible() + }) + + await test.step(`Turn off debug panel setting with it open`, async () => { + await setShowDebugPanelTo('Off') + await expect(debugPaneButton).not.toBeVisible() + await expect(resizeHandle).not.toBeVisible() + }) } - - await test.step(`Initial load with corrupted settings`, async () => { - await u.waitForAuthSkipAppStart() - // Check that the debug panel is not visible - await expect(debugPaneButton).not.toBeVisible() - // Check the pane resize handle wrapper is not visible - await expect(resizeHandle).not.toBeVisible() - }) - - await test.step(`Open code pane to verify we see the resize handles`, async () => { - await u.openKclCodePanel() - await expect(resizeHandle).toBeVisible() - await u.closeKclCodePanel() - }) - - await test.step(`Turn on debug panel, open it`, async () => { - await setShowDebugPanelTo('On') - await expect(debugPaneButton).toBeVisible() - // We want the logic to clear the phantom panel, so we shouldn't see - // the real panel (and therefore the resize handle) yet - await expect(resizeHandle).not.toBeVisible() - await u.openDebugPanel() - await expect(resizeHandle).toBeVisible() - }) - - await test.step(`Turn off debug panel setting with it open`, async () => { - await setShowDebugPanelTo('Off') - await expect(debugPaneButton).not.toBeVisible() - await expect(resizeHandle).not.toBeVisible() - }) - }) + ) }) diff --git a/e2e/playwright/text-to-cad-tests.spec.ts b/e2e/playwright/text-to-cad-tests.spec.ts index af14f7cd9..442b38ce3 100644 --- a/e2e/playwright/text-to-cad-tests.spec.ts +++ b/e2e/playwright/text-to-cad-tests.spec.ts @@ -1,23 +1,16 @@ -import { test, expect, Page } from '@playwright/test' -import { getUtils, setup, tearDown, setupElectron } from './test-utils' +import { test, expect, Page } from './zoo-test' +import { getUtils, createProject } from './test-utils' import { join } from 'path' import fs from 'fs' -test.beforeEach(async ({ context, page }) => { - await setup(context, page) -}) - -test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) - test.describe('Text-to-CAD tests', () => { - test('basic lego happy case', async ({ page }) => { + test('basic lego happy case', async ({ page, homePage }) => { const u = await getUtils(page) await test.step('Set up', async () => { - await page.setViewportSize({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await page.setBodyDimensions({ width: 1000, height: 500 }) + await homePage.goToModelingScene() + await u.waitForPageLoad() }) await sendPromptFromCommandBar(page, 'a 2x4 lego') @@ -37,25 +30,17 @@ test.describe('Text-to-CAD tests', () => { const successToastMessage = page.getByText(`Text-to-CAD successful`) await expect(successToastMessage).toBeVisible({ timeout: 15000 }) - await expect(page.getByText('Copied')).not.toBeVisible() - - // Hit copy to clipboard. + // Hit accept. const copyToClipboardButton = page.getByRole('button', { - name: 'Copy to clipboard', + name: 'Accept', }) await expect(copyToClipboardButton).toBeVisible() await copyToClipboardButton.click() - // Expect the code to be copied. - await expect(page.getByText('Copied')).toBeVisible() - // Click in the code editor. await page.locator('.cm-content').click() - // Paste the code. - await page.keyboard.press('ControlOrMeta+KeyV') - // Expect the code to be pasted. await expect(page.locator('.cm-content')).toContainText(`const`) @@ -64,29 +49,18 @@ test.describe('Text-to-CAD tests', () => { await u.openDebugPanel() await u.expectCmdLog('[data-message-type="execution-done"]') await u.closeDebugPanel() - - // Find the toast close button. - const closeButton = page - .getByRole('status') - .locator('div') - .filter({ hasText: 'Text-to-CAD successfulPrompt' }) - .first() - .getByRole('button', { name: 'Close' }) - await expect(closeButton).toBeVisible() - await closeButton.click() - - // The toast should disappear. - await expect(successToastMessage).not.toBeVisible() }) test('success model, then ignore success toast, user can create new prompt from command bar', async ({ page, + homePage, }) => { const u = await getUtils(page) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() await sendPromptFromCommandBar(page, 'a 2x6 lego') @@ -105,10 +79,6 @@ test.describe('Text-to-CAD tests', () => { const successToastMessage = page.getByText(`Text-to-CAD successful`) await expect(successToastMessage).toBeVisible({ timeout: 15000 }) - await expect(page.getByText('Copied')).not.toBeVisible() - - await expect(successToastMessage).toBeVisible() - // Can send a new prompt from the command bar. await sendPromptFromCommandBar(page, 'a 2x4 lego') @@ -127,12 +97,14 @@ test.describe('Text-to-CAD tests', () => { test('you can reject text-to-cad output and it does nothing', async ({ page, + homePage, }) => { const u = await getUtils(page) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() await sendPromptFromCommandBar(page, 'a 2x4 lego') @@ -164,12 +136,16 @@ test.describe('Text-to-CAD tests', () => { await expect(page.locator('.cm-content')).toContainText(``) }) - test('sending a bad prompt fails, can dismiss', async ({ page }) => { + test('sending a bad prompt fails, can dismiss', async ({ + page, + homePage, + }) => { const u = await getUtils(page) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() const commandBarButton = page.getByRole('button', { name: 'Commands' }) await expect(commandBarButton).toBeVisible() @@ -180,13 +156,13 @@ test.describe('Text-to-CAD tests', () => { const cmdSearchBar = page.getByPlaceholder('Search commands') await expect(cmdSearchBar).toBeVisible() - const textToCadCommand = page.getByText('Text-to-CAD') + const textToCadCommand = page.getByRole('option', { name: 'Text-to-CAD' }) await expect(textToCadCommand.first()).toBeVisible() // Click the Text-to-CAD command await textToCadCommand.first().click() // Enter the prompt. - const prompt = page.getByText('Prompt') + const prompt = page.getByRole('textbox', { name: 'Prompt' }) await expect(prompt.first()).toBeVisible() // Type the prompt. @@ -230,12 +206,14 @@ test.describe('Text-to-CAD tests', () => { test('sending a bad prompt fails, can start over from toast', async ({ page, + homePage, }) => { const u = await getUtils(page) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() const commandBarButton = page.getByRole('button', { name: 'Commands' }) await expect(commandBarButton).toBeVisible() @@ -246,13 +224,13 @@ test.describe('Text-to-CAD tests', () => { const cmdSearchBar = page.getByPlaceholder('Search commands') await expect(cmdSearchBar).toBeVisible() - const textToCadCommand = page.getByText('Text-to-CAD') + const textToCadCommand = page.getByRole('option', { name: 'Text-to-CAD' }) await expect(textToCadCommand.first()).toBeVisible() // Click the Text-to-CAD command await textToCadCommand.first().click() // Enter the prompt. - const prompt = page.getByText('Prompt') + const prompt = page.getByRole('textbox', { name: 'Prompt' }) await expect(prompt.first()).toBeVisible() const badPrompt = 'akjsndladf lajbhflauweyfaaaljhr472iouafyvsssssss' @@ -318,12 +296,14 @@ test.describe('Text-to-CAD tests', () => { test('sending a bad prompt fails, can ignore toast, can start over from command bar', async ({ page, + homePage, }) => { const u = await getUtils(page) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() const commandBarButton = page.getByRole('button', { name: 'Commands' }) await expect(commandBarButton).toBeVisible() @@ -334,13 +314,13 @@ test.describe('Text-to-CAD tests', () => { const cmdSearchBar = page.getByPlaceholder('Search commands') await expect(cmdSearchBar).toBeVisible() - const textToCadCommand = page.getByText('Text-to-CAD') + const textToCadCommand = page.getByRole('option', { name: 'Text-to-CAD' }) await expect(textToCadCommand.first()).toBeVisible() // Click the Text-to-CAD command await textToCadCommand.first().click() // Enter the prompt. - const prompt = page.getByText('Prompt') + const prompt = page.getByRole('textbox', { name: 'Prompt' }) await expect(prompt.first()).toBeVisible() const badPrompt = 'akjsndladflajbhflauweyf15;' @@ -385,19 +365,21 @@ test.describe('Text-to-CAD tests', () => { await expect(successToastMessage).toBeVisible({ timeout: 15000 }) - await expect(page.getByText('Copied')).not.toBeVisible() - // old failure toast should stick around. await expect(failureToastMessage).toBeVisible() await expect(page.getByText(`Text-to-CAD failed`)).toBeVisible() }) - test('ensure you can shift+enter in the prompt box', async ({ page }) => { + test('ensure you can shift+enter in the prompt box', async ({ + page, + homePage, + }) => { const u = await getUtils(page) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() const promptWithNewline = `a 2x4\nlego` @@ -410,13 +392,13 @@ test.describe('Text-to-CAD tests', () => { const cmdSearchBar = page.getByPlaceholder('Search commands') await expect(cmdSearchBar).toBeVisible() - const textToCadCommand = page.getByText('Text-to-CAD') + const textToCadCommand = page.getByRole('option', { name: 'Text-to-CAD' }) await expect(textToCadCommand.first()).toBeVisible() // Click the Text-to-CAD command await textToCadCommand.first().click() // Enter the prompt. - const prompt = page.getByText('Prompt') + const prompt = page.getByRole('textbox', { name: 'Prompt' }) await expect(prompt.first()).toBeVisible() // Type the prompt. @@ -450,7 +432,7 @@ test.describe('Text-to-CAD tests', () => { test( 'can do many at once and get many prompts back, and interact with many', { tag: ['@skipWin'] }, - async ({ page }) => { + async ({ page, homePage }) => { // Let this test run longer since we've seen it timeout. test.setTimeout(180_000) // skip on windows @@ -461,9 +443,10 @@ test.describe('Text-to-CAD tests', () => { const u = await getUtils(page) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() await sendPromptFromCommandBar(page, 'a 2x4 lego') @@ -489,8 +472,6 @@ test.describe('Text-to-CAD tests', () => { // We should have three success toasts. await expect(successToastMessage).toHaveCount(3, { timeout: 25_000 }) - await expect(page.getByText('Copied')).not.toBeVisible() - await expect(page.getByText(`a 2x4 lego`)).toBeVisible() await expect(page.getByText(`a 2x8 lego`)).toBeVisible() await expect(page.getByText(`a 2x10 lego`)).toBeVisible() @@ -508,31 +489,15 @@ test.describe('Text-to-CAD tests', () => { // Ensure you can copy the code for one of the models remaining. const copyToClipboardButton = page.getByRole('button', { - name: 'Copy to clipboard', + name: 'Accept', }) await expect(copyToClipboardButton.first()).toBeVisible() // Click the button. await copyToClipboardButton.first().click() - // Expect the code to be copied. - await expect(page.getByText('Copied')).toBeVisible() - - // Click in the code editor. - await page.locator('.cm-content').click({ position: { x: 10, y: 10 } }) - - // Paste the code. - await page.keyboard.down('ControlOrMeta') - await page.keyboard.press('KeyV') - await page.keyboard.up('ControlOrMeta') - // Expect the code to be pasted. await expect(page.locator('.cm-content')).toContainText(`2x8`) - // Find the toast close button. - const closeButton = page.locator('[data-negative-button="close"]').first() - await expect(closeButton).toBeVisible() - await closeButton.click() - // Ensure the final toast remains. await expect(page.getByText(`a 2x10 lego`)).not.toBeVisible() await expect(page.getByText(`Prompt: "a 2x8 lego`)).not.toBeVisible() @@ -543,40 +508,21 @@ test.describe('Text-to-CAD tests', () => { // Click the button. await copyToClipboardButton.click() - // Expect the code to be copied. - await expect(page.getByText('Copied')).toBeVisible() - - // Click in the code editor. - await page.locator('.cm-content').click({ position: { x: 10, y: 10 } }) - - // Paste the code. - await page.keyboard.down('ControlOrMeta') - await page.keyboard.press('KeyA') - await page.keyboard.up('ControlOrMeta') - await page.keyboard.press('Backspace') - await page.keyboard.down('ControlOrMeta') - await page.keyboard.press('KeyV') - await page.keyboard.up('ControlOrMeta') - // Expect the code to be pasted. await expect(page.locator('.cm-content')).toContainText(`2x4`) - - // Expect the toast to disappear. - // Find the toast close button. - await expect(closeButton).toBeVisible() - await closeButton.click() - await expect(successToastMessage).not.toBeVisible() } ) test('can do many at once with errors, clicking dismiss error does not dismiss all', async ({ page, + homePage, }) => { const u = await getUtils(page) - await page.setViewportSize({ width: 1000, height: 500 }) + await page.setBodyDimensions({ width: 1000, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() + await u.waitForPageLoad() await sendPromptFromCommandBar(page, 'a 2x4 lego') @@ -625,60 +571,40 @@ test.describe('Text-to-CAD tests', () => { // Ensure you can copy the code for one of the models remaining. const copyToClipboardButton = page.getByRole('button', { - name: 'Copy to clipboard', + name: 'Accept', }) await expect(copyToClipboardButton.first()).toBeVisible() // Click the button. await copyToClipboardButton.first().click() - // Expect the code to be copied. - await expect(page.getByText('Copied')).toBeVisible() - - // Click in the code editor. - await page.locator('.cm-content').click({ position: { x: 10, y: 10 } }) - - // Paste the code. - await page.keyboard.down('ControlOrMeta') - await page.keyboard.press('KeyV') - await page.keyboard.up('ControlOrMeta') - // Expect the code to be pasted. await expect(page.locator('.cm-content')).toContainText(`2x4`) - - // Find the toast close button. - const closeButton = page - .getByRole('status') - .locator('div') - .filter({ hasText: 'Text-to-CAD successfulPrompt' }) - .first() - .getByRole('button', { name: 'Close' }) - await expect(closeButton).toBeVisible() - await closeButton.click() - - // Expect the toast to disappear. - await expect(page.getByText('Copied')).not.toBeVisible() - await expect(successToastMessage).not.toBeVisible() }) }) async function sendPromptFromCommandBar(page: Page, promptStr: string) { + await page.waitForTimeout(1000) await test.step(`Send prompt from command bar: ${promptStr}`, async () => { const commandBarButton = page.getByRole('button', { name: 'Commands' }) await expect(commandBarButton).toBeVisible() // Click the command bar button + await commandBarButton.hover() await commandBarButton.click() + await page.waitForTimeout(1000) // Wait for the command bar to appear const cmdSearchBar = page.getByPlaceholder('Search commands') await expect(cmdSearchBar).toBeVisible() - const textToCadCommand = page.getByText('Use the Zoo Text-to-CAD API ') + const textToCadCommand = page.getByText('Use the Zoo Text-to-CAD API') await expect(textToCadCommand.first()).toBeVisible() // Click the Text-to-CAD command + await textToCadCommand.first().scrollIntoViewIfNeeded() await textToCadCommand.first().click() + await page.waitForTimeout(1000) // Enter the prompt. - const prompt = page.getByText('Prompt') + const prompt = page.getByRole('textbox', { name: 'Prompt' }) await expect(prompt.first()).toBeVisible() // Type the prompt. @@ -691,26 +617,27 @@ async function sendPromptFromCommandBar(page: Page, promptStr: string) { test( 'Text-to-CAD functionality', { tag: '@electron' }, - async ({ browserName }, testInfo) => { + async ({ context, page }, testInfo) => { const projectName = 'project-000' const prompt = 'lego 2x4' const textToCadFileName = 'lego-2x4.kcl' - const { electronApp, page, dir } = await setupElectron({ testInfo }) + const { dir } = await context.folderSetupFn(async () => {}) + const fileExists = () => fs.existsSync(join(dir, projectName, textToCadFileName)) - const { - createAndSelectProject, - openFilePanel, - openKclCodePanel, - waitForPageLoad, - } = await getUtils(page, test) + const { openFilePanel, openKclCodePanel, waitForPageLoad } = await getUtils( + page, + test + ) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) // Locators - const projectMenuButton = page.getByRole('button', { name: projectName }) + const projectMenuButton = page + .getByTestId('project-sidebar-toggle') + .filter({ hasText: projectName }) const textToCadFileButton = page.getByRole('listitem').filter({ has: page.getByRole('button', { name: textToCadFileName }), }) @@ -719,7 +646,7 @@ test( ) // Create and navigate to the project - await createAndSelectProject('project-000') + await createProject({ name: 'project-000', page }) // Wait for Start Sketch otherwise you will not have access Text-to-CAD command await waitForPageLoad() @@ -755,7 +682,5 @@ test( // Confirm we've navigated back to the main.kcl file after deletion await expect(projectMenuButton).toContainText('main.kcl') }) - - await electronApp.close() } ) diff --git a/e2e/playwright/various.spec.ts b/e2e/playwright/various.spec.ts index f606055f5..77d972dbf 100644 --- a/e2e/playwright/various.spec.ts +++ b/e2e/playwright/various.spec.ts @@ -1,19 +1,10 @@ -import { test, expect } from '@playwright/test' +import { test, expect } from './zoo-test' -import { doExport, getUtils, makeTemplate, setup, tearDown } from './test-utils' +import { doExport, getUtils, makeTemplate } from './test-utils' -test.beforeEach(async ({ context, page }, testInfo) => { - await setup(context, page, testInfo) -}) - -test.afterEach(async ({ page }, testInfo) => { - await tearDown(page, testInfo) -}) - -test('Units menu', async ({ page }) => { - const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() +test.fixme('Units menu', async ({ page, homePage }) => { + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() const unitsMenuButton = page.getByRole('button', { name: 'Current Units', @@ -41,7 +32,7 @@ test('Units menu', async ({ page }) => { await expect(unitsMenuButton).toContainText('mm') }) -test('Successful export shows a success toast', async ({ page }) => { +test('Successful export shows a success toast', async ({ page, homePage }) => { // FYI this test doesn't work with only engine running locally // And you will need to have the KittyCAD CLI installed const u = await getUtils(page) @@ -57,41 +48,41 @@ totalHeightHalf = 2 armThick = 0.5 totalLen = 9.5 part001 = startSketchOn('-XZ') - |> startProfileAt([0, 0], %) - |> yLine(baseHeight, %) - |> xLine(baseLen, %) - |> angledLineToY({ - angle: topAng, - to: totalHeightHalf, - }, %, $seg04) - |> xLineTo(totalLen, %, $seg03) - |> yLine(-armThick, %, $seg01) - |> angledLineThatIntersects({ - angle: HALF_TURN, - offset: -armThick, - intersectTag: seg04 - }, %) - |> angledLineToY([segAng(seg04) + 180, ZERO], %) - |> angledLineToY({ - angle: -bottomAng, - to: -totalHeightHalf - armThick, - }, %, $seg02) - |> xLineTo(segEndX(seg03) + 0, %) - |> yLine(-segLen(seg01), %) - |> angledLineThatIntersects({ - angle: HALF_TURN, - offset: -armThick, - intersectTag: seg02 - }, %) - |> angledLineToY([segAng(seg02) + 180, -baseHeight], %) - |> xLineTo(ZERO, %) - |> close(%) - |> extrude(4, %)` +|> startProfileAt([0, 0], %) +|> yLine(baseHeight, %) +|> xLine(baseLen, %) +|> angledLineToY({ + angle = topAng, + to = totalHeightHalf, + }, %, $seg04) +|> xLineTo(totalLen, %, $seg03) +|> yLine(-armThick, %, $seg01) +|> angledLineThatIntersects({ + angle = HALF_TURN, + offset = -armThick, + intersectTag = seg04 + }, %) +|> angledLineToY([segAng(seg04) + 180, ZERO], %) +|> angledLineToY({ + angle = -bottomAng, + to = -totalHeightHalf - armThick, + }, %, $seg02) +|> xLineTo(segEndX(seg03) + 0, %) +|> yLine(-segLen(seg01), %) +|> angledLineThatIntersects({ + angle = HALF_TURN, + offset = -armThick, + intersectTag = seg02 + }, %) +|> angledLineToY([segAng(seg02) + 180, -baseHeight], %) +|> xLineTo(ZERO, %) +|> close(%) +|> extrude(4, %)` ) }) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await u.openDebugPanel() await u.expectCmdLog('[data-message-type="execution-done"]') await u.waitForCmdReceive('extrude') @@ -106,25 +97,14 @@ part001 = startSketchOn('-XZ') }, page ) - - // This is the main thing we're testing, - // We test the export functionality across all - // file types in snapshot-tests.spec.ts - await expect(page.getByText('Exported successfully')).toBeVisible() }) test('Paste should not work unless an input is focused', async ({ page, - browserName, + homePage, }) => { - // To run this test locally, uncomment Firefox in playwright.config.ts - test.skip( - browserName !== 'firefox', - "This bug is really Firefox-only, which we don't run in CI." - ) - const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() await page .getByRole('button', { name: 'Start Sketch' }) .waitFor({ state: 'visible' }) @@ -164,12 +144,12 @@ test('Paste should not work unless an input is focused', async ({ test('Keyboard shortcuts can be viewed through the help menu', async ({ page, + homePage, }) => { - const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() - await page.waitForURL('**/file/**', { waitUntil: 'domcontentloaded' }) + await page.waitForURL('file:///**', { waitUntil: 'domcontentloaded' }) await page .getByRole('button', { name: 'Start Sketch' }) .waitFor({ state: 'visible' }) @@ -181,7 +161,7 @@ test('Keyboard shortcuts can be viewed through the help menu', async ({ await page.getByRole('button', { name: 'Keyboard Shortcuts' }).click() // Verify the URL and that you can see a list of shortcuts - await expect(page.url()).toContain('?tab=keybindings') + await expect.poll(() => page.url()).toContain('?tab=keybindings') await expect( page.getByRole('heading', { name: 'Enter Sketch Mode' }) ).toBeAttached() @@ -189,12 +169,13 @@ test('Keyboard shortcuts can be viewed through the help menu', async ({ test('First escape in tool pops you out of tool, second exits sketch mode', async ({ page, + homePage, }) => { // Wait for the app to be ready for use const u = await getUtils(page) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() await u.openDebugPanel() await u.expectCmdLog('[data-message-type="execution-done"]') await u.closeDebugPanel() @@ -256,186 +237,192 @@ test('First escape in tool pops you out of tool, second exits sketch mode', asyn ).not.toBeVisible() }) -test('Basic default modeling and sketch hotkeys work', async ({ page }) => { - const u = await getUtils(page) +test.fixme( + 'Basic default modeling and sketch hotkeys work', + async ({ page, homePage }) => { + const u = await getUtils(page) - // This test can run long if it takes a little too long to load - // the engine. - test.setTimeout(90000) - // This test has a weird bug on ubuntu - test.skip( - process.platform === 'linux', - 'weird playwright bug on ubuntu https://github.com/KittyCAD/modeling-app/issues/2444' - ) - // Load the app with the code pane open + // This test can run long if it takes a little too long to load + // the engine. + test.setTimeout(90000) + // This test has a weird bug on ubuntu + // Funny, it's flaking on Windows too :). I think there is just something + // actually wrong. + test.skip( + process.platform === 'linux', + 'weird playwright bug on ubuntu https://github.com/KittyCAD/modeling-app/issues/2444' + ) + // Load the app with the code pane open - await test.step(`Set up test`, async () => { - await page.addInitScript(async () => { - localStorage.setItem( - 'store', - JSON.stringify({ - state: { - openPanes: ['code'], - }, - version: 0, + await test.step(`Set up test`, async () => { + await page.addInitScript(async () => { + localStorage.setItem( + 'store', + JSON.stringify({ + state: { + openPanes: ['code'], + }, + version: 0, + }) + ) + }) + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() + await u.openDebugPanel() + await u.expectCmdLog('[data-message-type="execution-done"]') + await u.closeDebugPanel() + }) + + const codePane = page.locator('.cm-content') + const lineButton = page.getByRole('button', { + name: 'line Line', + exact: true, + }) + const arcButton = page.getByRole('button', { + name: 'arc Tangential Arc', + exact: true, + }) + const extrudeButton = page.getByRole('button', { name: 'Extrude' }) + const commandBarComboBox = page.getByPlaceholder('Search commands') + const exitSketchButton = page.getByRole('button', { name: 'Exit Sketch' }) + + await test.step(`Type code with modeling hotkeys, shouldn't fire`, async () => { + await codePane.click() + await page.keyboard.type('//') + await page.keyboard.press('s') + await expect(commandBarComboBox).not.toBeVisible() + await page.keyboard.press('e') + await expect(commandBarComboBox).not.toBeVisible() + await expect(codePane).toHaveText('//se') + }) + + // Blur focus from the code editor, use the s command to sketch + await test.step(`Blur editor focus, enter sketch`, async () => { + /** + * TODO: There is a bug somewhere that causes this test to fail + * if you toggle the codePane closed before your trigger the + * start of the sketch. + * and a separate Safari-only bug that causes the test to fail + * if the pane is open the entire test. The maintainer of CodeMirror + * has pinpointed this to the unusual browser behavior: + * https://discuss.codemirror.net/t/how-to-force-unfocus-of-the-codemirror-element-in-safari/8095/3 + */ + await blurCodeEditor() + await page.waitForTimeout(1000) + await page.keyboard.press('s') + await page.waitForTimeout(1000) + await page.mouse.move(800, 300, { steps: 5 }) + await page.mouse.click(800, 300) + await page.waitForTimeout(1000) + await expect(lineButton).toHaveAttribute('aria-pressed', 'true', { + timeout: 15_000, + }) + }) + + // Use some sketch hotkeys to create a sketch (l and a for now) + await test.step(`Incomplete sketch with hotkeys`, async () => { + await test.step(`Draw a line`, async () => { + await page.mouse.move(700, 200, { steps: 5 }) + await page.mouse.click(700, 200) + await page.mouse.move(800, 250, { steps: 5 }) + await page.mouse.click(800, 250) + }) + + await test.step(`Unequip line tool`, async () => { + await page.keyboard.press('l') + await expect(lineButton).not.toHaveAttribute('aria-pressed', 'true') + }) + + await test.step(`Draw a tangential arc`, async () => { + await page.keyboard.press('a') + await expect(arcButton).toHaveAttribute('aria-pressed', 'true', { + timeout: 10_000, }) - ) + await page.mouse.move(1000, 100, { steps: 5 }) + await page.mouse.click(1000, 100) + }) + + await test.step(`Unequip with escape, equip line tool`, async () => { + await page.keyboard.press('Escape') + await page.keyboard.press('l') + await page.waitForTimeout(50) + await expect(lineButton).toHaveAttribute('aria-pressed', 'true') + }) }) - await page.setViewportSize({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() - await u.openDebugPanel() - await u.expectCmdLog('[data-message-type="execution-done"]') - await u.closeDebugPanel() - }) - const codePane = page.locator('.cm-content') - const lineButton = page.getByRole('button', { - name: 'line Line', - exact: true, - }) - const arcButton = page.getByRole('button', { - name: 'arc Tangential Arc', - exact: true, - }) - const extrudeButton = page.getByRole('button', { name: 'Extrude' }) - const commandBarComboBox = page.getByPlaceholder('Search commands') - const exitSketchButton = page.getByRole('button', { name: 'Exit Sketch' }) + await test.step(`Type code with sketch hotkeys, shouldn't fire`, async () => { + // Since there's code now, we have to get to the end of the line + await page.locator('.cm-line').last().click() + await page.keyboard.down('ControlOrMeta') + await page.keyboard.press('ArrowRight') + await page.keyboard.up('ControlOrMeta') - await test.step(`Type code with modeling hotkeys, shouldn't fire`, async () => { - await codePane.click() - await page.keyboard.type('//') - await page.keyboard.press('s') - await expect(commandBarComboBox).not.toBeVisible() - await page.keyboard.press('e') - await expect(commandBarComboBox).not.toBeVisible() - await expect(codePane).toHaveText('//se') - }) - - // Blur focus from the code editor, use the s command to sketch - await test.step(`Blur editor focus, enter sketch`, async () => { - /** - * TODO: There is a bug somewhere that causes this test to fail - * if you toggle the codePane closed before your trigger the - * start of the sketch. - * and a separate Safari-only bug that causes the test to fail - * if the pane is open the entire test. The maintainer of CodeMirror - * has pinpointed this to the unusual browser behavior: - * https://discuss.codemirror.net/t/how-to-force-unfocus-of-the-codemirror-element-in-safari/8095/3 - */ - await blurCodeEditor() - await page.waitForTimeout(1000) - await page.keyboard.press('s') - await page.waitForTimeout(1000) - await page.mouse.move(800, 300, { steps: 5 }) - await page.mouse.click(800, 300) - await page.waitForTimeout(1000) - await expect(lineButton).toHaveAttribute('aria-pressed', 'true', { - timeout: 15_000, + await page.keyboard.press('Enter') + await page.keyboard.type('//') + await page.keyboard.press('l') + await expect(lineButton).toHaveAttribute('aria-pressed', 'true') + await page.keyboard.press('a') + await expect(lineButton).toHaveAttribute('aria-pressed', 'true') + await expect(codePane).toContainText('//la') + await page.keyboard.press('Backspace') + await page.keyboard.press('Backspace') + await page.keyboard.press('Backspace') + await page.keyboard.press('Backspace') }) - }) - // Use some sketch hotkeys to create a sketch (l and a for now) - await test.step(`Incomplete sketch with hotkeys`, async () => { - await test.step(`Draw a line`, async () => { + await test.step(`Close profile and exit sketch`, async () => { + await blurCodeEditor() await page.mouse.move(700, 200, { steps: 5 }) await page.mouse.click(700, 200) - await page.mouse.move(800, 250, { steps: 5 }) - await page.mouse.click(800, 250) - }) - - await test.step(`Unequip line tool`, async () => { - await page.keyboard.press('l') - await expect(lineButton).not.toHaveAttribute('aria-pressed', 'true') - }) - - await test.step(`Draw a tangential arc`, async () => { - await page.keyboard.press('a') - await expect(arcButton).toHaveAttribute('aria-pressed', 'true', { - timeout: 10_000, - }) - await page.mouse.move(1000, 100, { steps: 5 }) - await page.mouse.click(1000, 100) - }) - - await test.step(`Unequip with escape, equip line tool`, async () => { + // On close it will unequip the line tool. + await expect(lineButton).toHaveAttribute('aria-pressed', 'false') + await expect(exitSketchButton).toBeEnabled() await page.keyboard.press('Escape') - await page.keyboard.press('l') - await page.waitForTimeout(50) - await expect(lineButton).toHaveAttribute('aria-pressed', 'true') + await expect( + page.getByRole('button', { name: 'Exit Sketch' }) + ).not.toBeVisible() }) - }) - await test.step(`Type code with sketch hotkeys, shouldn't fire`, async () => { - // Since there's code now, we have to get to the end of the line - await page.locator('.cm-line').last().click() - await page.keyboard.down('ControlOrMeta') - await page.keyboard.press('ArrowRight') - await page.keyboard.up('ControlOrMeta') - - await page.keyboard.press('Enter') - await page.keyboard.type('//') - await page.keyboard.press('l') - await expect(lineButton).toHaveAttribute('aria-pressed', 'true') - await page.keyboard.press('a') - await expect(lineButton).toHaveAttribute('aria-pressed', 'true') - await expect(codePane).toContainText('//la') - await page.keyboard.press('Backspace') - await page.keyboard.press('Backspace') - await page.keyboard.press('Backspace') - await page.keyboard.press('Backspace') - }) - - await test.step(`Close profile and exit sketch`, async () => { - await blurCodeEditor() - await page.mouse.move(700, 200, { steps: 5 }) - await page.mouse.click(700, 200) - // On close it will unequip the line tool. - await expect(lineButton).toHaveAttribute('aria-pressed', 'false') - await expect(exitSketchButton).toBeEnabled() - await page.keyboard.press('Escape') - await expect( - page.getByRole('button', { name: 'Exit Sketch' }) - ).not.toBeVisible() - }) - - // Extrude with e - await test.step(`Extrude the sketch`, async () => { - await page.mouse.click(750, 150) - await blurCodeEditor() - await expect(extrudeButton).toBeEnabled() - await page.keyboard.press('e') - await page.waitForTimeout(500) - await page.mouse.move(800, 200, { steps: 5 }) - await page.mouse.click(800, 200) - await expect(page.getByRole('button', { name: 'Continue' })).toBeVisible({ - timeout: 20_000, + // Extrude with e + await test.step(`Extrude the sketch`, async () => { + await page.mouse.click(750, 150) + await blurCodeEditor() + await expect(extrudeButton).toBeEnabled() + await page.keyboard.press('e') + await page.waitForTimeout(500) + await page.mouse.move(800, 200, { steps: 5 }) + await page.mouse.click(800, 200) + await expect(page.getByRole('button', { name: 'Continue' })).toBeVisible({ + timeout: 20_000, + }) + await page.getByRole('button', { name: 'Continue' }).click() + await expect( + page.getByRole('button', { name: 'Submit command' }) + ).toBeVisible() + await page.getByRole('button', { name: 'Submit command' }).click() + await expect(page.locator('.cm-content')).toContainText('extrude(') }) - await page.getByRole('button', { name: 'Continue' }).click() - await expect( - page.getByRole('button', { name: 'Submit command' }) - ).toBeVisible() - await page.getByRole('button', { name: 'Submit command' }).click() - await expect(page.locator('.cm-content')).toContainText('extrude(') - }) - // await codePaneButton.click() - // await expect(u.codeLocator).not.toBeVisible() + // await codePaneButton.click() + // await expect(u.codeLocator).not.toBeVisible() - /** - * work-around: to stop `keyboard.press()` from typing in the editor even when it should be blurred - */ - async function blurCodeEditor() { - await page.getByRole('button', { name: 'Commands' }).click() - await page.waitForTimeout(100) - await page.keyboard.press('Escape') - await page.waitForTimeout(100) + /** + * work-around: to stop `keyboard.press()` from typing in the editor even when it should be blurred + */ + async function blurCodeEditor() { + await page.getByRole('button', { name: 'Commands' }).click() + await page.waitForTimeout(100) + await page.keyboard.press('Escape') + await page.waitForTimeout(100) + } } -}) +) -test('Delete key does not navigate back', async ({ page }) => { - await page.setViewportSize({ width: 1200, height: 500 }) - await page.goto('/') - await page.waitForURL('**/file/**', { waitUntil: 'domcontentloaded' }) +test('Delete key does not navigate back', async ({ page, homePage }) => { + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() + + await page.waitForURL('file:///**', { waitUntil: 'domcontentloaded' }) const settingsButton = page.getByRole('link', { name: 'Settings', @@ -444,45 +431,45 @@ test('Delete key does not navigate back', async ({ page }) => { const settingsCloseButton = page.getByTestId('settings-close-button') await settingsButton.click() - await expect(page.url()).toContain('/settings') + await expect.poll(() => page.url()).toContain('/settings') // Make sure that delete doesn't go back from settings await page.keyboard.press('Delete') - await expect(page.url()).toContain('/settings') + await expect.poll(() => page.url()).toContain('/settings') // Now close the settings and try delete again, // make sure it doesn't go back to settings await settingsCloseButton.click() await page.keyboard.press('Delete') - await expect(page.url()).not.toContain('/settings') + await expect.poll(() => page.url()).not.toContain('/settings') }) -test('Sketch on face', async ({ page }) => { +test('Sketch on face', async ({ page, homePage }) => { test.setTimeout(90_000) const u = await getUtils(page) await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `sketch001 = startSketchOn('XZ') - |> startProfileAt([3.29, 7.86], %) - |> line([2.48, 2.44], %) - |> line([2.66, 1.17], %) - |> line([3.75, 0.46], %) - |> line([4.99, -0.46], %) - |> line([3.3, -2.12], %) - |> line([2.16, -3.33], %) - |> line([0.85, -3.08], %) - |> line([-0.18, -3.36], %) - |> line([-3.86, -2.73], %) - |> line([-17.67, 0.85], %) - |> close(%) - extrude001 = extrude(5 + 7, sketch001)` +|> startProfileAt([3.29, 7.86], %) +|> line([2.48, 2.44], %) +|> line([2.66, 1.17], %) +|> line([3.75, 0.46], %) +|> line([4.99, -0.46], %) +|> line([3.3, -2.12], %) +|> line([2.16, -3.33], %) +|> line([0.85, -3.08], %) +|> line([-0.18, -3.36], %) +|> line([-3.86, -2.73], %) +|> line([-17.67, 0.85], %) +|> close(%) +extrude001 = extrude(5 + 7, sketch001)` ) }) - await page.setViewportSize({ width: 1200, height: 500 }) + await page.setBodyDimensions({ width: 1200, height: 500 }) - await u.waitForAuthSkipAppStart() + await homePage.goToModelingScene() // wait for execution done await u.openDebugPanel() @@ -536,7 +523,8 @@ test('Sketch on face', async ({ page }) => { |> line([2.45, -0.2], %) |> line([-2.6, -1.25], %) |> lineTo([profileStartX(%), profileStartY(%)], %) - |> close(%)`) + |> close(%) +`) ) await u.openAndClearDebugPanel() @@ -551,7 +539,7 @@ test('Sketch on face', async ({ page }) => { await page.getByRole('button', { name: 'Edit Sketch' }).click() await page.waitForTimeout(400) await page.waitForTimeout(150) - await page.setViewportSize({ width: 1200, height: 1200 }) + await page.setBodyDimensions({ width: 1200, height: 1200 }) await u.openAndClearDebugPanel() await u.updateCamPosition([452, -152, 1166]) await u.closeDebugPanel() @@ -569,11 +557,11 @@ test('Sketch on face', async ({ page }) => { previousCodeContent = await page.locator('.cm-content').innerText() const result = makeTemplate`sketch002 = startSketchOn(extrude001, seg01) - |> startProfileAt([-12.83, 6.7], %) - |> line([${[2.28, 2.35]}, -${0.07}], %) - |> line([-3.05, -1.47], %) - |> lineTo([profileStartX(%), profileStartY(%)], %) - |> close(%)` +|> startProfileAt([-12.83, 6.7], %) +|> line([${[2.28, 2.35]}, -${0.07}], %) +|> line([-3.05, -1.47], %) +|> lineTo([profileStartX(%), profileStartY(%)], %) +|> close(%)` await expect(page.locator('.cm-content')).toHaveText(result.regExp) @@ -597,6 +585,6 @@ test('Sketch on face', async ({ page }) => { await page.getByRole('button', { name: 'checkmark Submit command' }).click() const result2 = result.genNext` - const sketch002 = extrude(${[5, 5]} + 7, sketch002)` +const sketch002 = extrude(${[5, 5]} + 7, sketch002)` await expect(page.locator('.cm-content')).toHaveText(result2.regExp) }) diff --git a/e2e/playwright/zoo-test.ts b/e2e/playwright/zoo-test.ts new file mode 100644 index 000000000..86c7f72f7 --- /dev/null +++ b/e2e/playwright/zoo-test.ts @@ -0,0 +1,334 @@ +import { + test as playwrightTestFn, + TestInfo as TestInfoPlaywright, + BrowserContext as BrowserContextPlaywright, + Page as PagePlaywright, + TestDetails as TestDetailsPlaywright, + PlaywrightTestArgs, + PlaywrightTestOptions, + PlaywrightWorkerArgs, + PlaywrightWorkerOptions, + ElectronApplication, +} from '@playwright/test' + +import { + fixtures, + Fixtures, + AuthenticatedTronApp, + AuthenticatedApp, +} from './fixtures/fixtureSetup' + +import { SaveSettingsPayload } from 'lib/settings/settingsTypes' +export { expect } from '@playwright/test' + +declare module '@playwright/test' { + interface TestInfo { + tronApp?: AuthenticatedTronApp + } + interface BrowserContext { + folderSetupFn: ( + cb: (dir: string) => Promise + ) => Promise<{ dir: string }> + } + interface Page { + dir: string + TEST_SETTINGS_FILE_KEY?: string + setBodyDimensions: (dims: { + width: number + height: number + }) => Promise + } +} + +export type TestInfo = TestInfoPlaywright +export type BrowserContext = BrowserContextPlaywright +export type Page = PagePlaywright +export type TestDetails = TestDetailsPlaywright & { + cleanProjectDir?: boolean + appSettings?: Partial +} + +// Our custom decorated Zoo test object. Makes it easier to add fixtures, and +// switch between web and electron if needed. +const pwTestFnWithFixtures = playwrightTestFn.extend(fixtures) + +// In JavaScript you cannot replace a function's body only (despite functions +// are themselves objects, which you'd expect a body property or something...) +// So we must redefine the function and then re-attach properties. +type PWFunction = ( + args: PlaywrightTestArgs & + Fixtures & + PlaywrightWorkerArgs & + PlaywrightTestOptions & + PlaywrightWorkerOptions & { + electronApp?: ElectronApplication + }, + testInfo: TestInfo +) => void | Promise + +let firstUrl = '' + +// The below error is due to the extreme type spaghetti going on. playwright/ +// types/test.d.ts does not export 2 functions (below is one of them) but tsc +// is trying to use a interface name it can't see. +// e2e/playwright/zoo-test.ts:64:14 - error TS4023: Exported variable 'test' has +// or is using name 'TestFunction' from external module +// "/home/lee/Code/Zoo/modeling-app/dirty2/node_modules/playwright/types/test" +// but cannot be named. +export const test = ( + desc: string, + objOrFn: PWFunction | TestDetails, + fnMaybe?: PWFunction +) => { + const hasTestConf = typeof objOrFn === 'object' + const fn = hasTestConf ? fnMaybe : objOrFn + + return pwTestFnWithFixtures( + desc, + hasTestConf ? objOrFn : {}, + async ( + { + page, + context, + cmdBar, + editor, + toolbar, + scene, + homePage, + request, + playwright, + browser, + acceptDownloads, + bypassCSP, + colorScheme, + clientCertificates, + deviceScaleFactor, + extraHTTPHeaders, + geolocation, + hasTouch, + httpCredentials, + ignoreHTTPSErrors, + isMobile, + javaScriptEnabled, + locale, + offline, + permissions, + proxy, + storageState, + timezoneId, + userAgent, + viewport, + baseURL, + contextOptions, + actionTimeout, + navigationTimeout, + serviceWorkers, + testIdAttribute, + browserName, + defaultBrowserType, + headless, + channel, + launchOptions, + connectOptions, + screenshot, + trace, + video, + }, + testInfo + ) => { + // To switch to web, use PLATFORM=web environment variable. + // Only use this for debugging, since the playwright tracer is busted + // for electron. + + let tronApp + + if (process.env.PLATFORM === 'web') { + tronApp = new AuthenticatedApp(context, page, testInfo) + } else { + tronApp = new AuthenticatedTronApp(context, page, testInfo) + } + + const fixtures: Fixtures = { cmdBar, editor, toolbar, scene, homePage } + if (tronApp instanceof AuthenticatedTronApp) { + const options = { + fixtures, + } + if (hasTestConf) { + Object.assign(options, { + appSettings: objOrFn?.appSettings, + cleanProjectDir: objOrFn?.cleanProjectDir, + }) + } + await tronApp.initialise(options) + } else { + await tronApp.initialise('') + } + + // We need to patch this because addInitScript will bind too late in our + // electron tests, never running. We need to call reload() after each call + // to guarantee it runs. + const oldContextAddInitScript = tronApp.context.addInitScript + tronApp.context.addInitScript = async function (a, b) { + // @ts-ignore pretty sure way out of tsc's type checking capabilities. + // This code works perfectly fine. + await oldContextAddInitScript.apply(this, [a, b]) + await tronApp.page.reload() + } + + // No idea why we mix and match page and context's addInitScript but we do + const oldPageAddInitScript = tronApp.page.addInitScript + tronApp.page.addInitScript = async function (a: any, b: any) { + // @ts-ignore pretty sure way out of tsc's type checking capabilities. + // This code works perfectly fine. + await oldPageAddInitScript.apply(this, [a, b]) + await tronApp.page.reload() + } + + // Create a consistent way to resize the page across electron and web. + // (lee) I had to do everything in the book to make electron change its + // damn window size. I succeeded in making it consistently and reliably + // do it after a whole afternoon. + tronApp.page.setBodyDimensions = async function (dims: { + width: number + height: number + }) { + await tronApp.page.setViewportSize(dims) + + if (!(tronApp instanceof AuthenticatedTronApp)) { + return + } + + await tronApp.electronApp?.evaluateHandle(async ({ app }, dims) => { + // @ts-ignore sorry jon but see comment in main.ts why this is ignored + await app.resizeWindow(dims.width, dims.height) + }, dims) + + return tronApp.page.evaluate( + async (dims: { width: number; height: number }) => { + await window.electron.resizeWindow(dims.width, dims.height) + window.document.body.style.width = dims.width + 'px' + window.document.body.style.height = dims.height + 'px' + window.document.documentElement.style.width = dims.width + 'px' + window.document.documentElement.style.height = dims.height + 'px' + }, + dims + ) + } + + await tronApp.page.setBodyDimensions(tronApp.viewPortSize) + + // We need to expose this in order for some tests that require folder + // creation. Before they used to do this by their own electronSetup({...}) + // calls. + if (tronApp instanceof AuthenticatedTronApp) { + tronApp.context.folderSetupFn = async function (fn) { + return fn(tronApp.dir) + .then(() => tronApp.page.reload()) + .then(() => ({ + dir: tronApp.dir, + })) + } + } + + if (!firstUrl) { + await tronApp.page.getByText('Your Projects').count() + firstUrl = tronApp.page.url() + } + + // Due to the app controlling its own window context we need to inject new + // options and context here. + // NOTE TO LEE: Seems to destroy page context when calling an electron loadURL. + // await tronApp.electronApp.evaluate(({ app }) => { + // return app.reuseWindowForTest(); + // }); + + await tronApp.electronApp?.evaluate(({ app }, projectDirName) => { + // @ts-ignore can't declaration merge see main.ts + app.testProperty['TEST_SETTINGS_FILE_KEY'] = projectDirName + }, tronApp.dir) + + // Always start at the root view + await tronApp.page.goto(firstUrl) + + // Force a hard reload, destroying the stream and other state + await tronApp.page.reload() + + // tsc aint smart enough to know this'll never be undefined + // but I dont blame it, the logic to know is complex + if (fn) { + await fn( + { + context: tronApp.context, + page: tronApp.page, + electronApp: + tronApp instanceof AuthenticatedTronApp + ? tronApp.electronApp + : undefined, + ...fixtures, + request, + playwright, + browser, + acceptDownloads, + bypassCSP, + colorScheme, + clientCertificates, + deviceScaleFactor, + extraHTTPHeaders, + geolocation, + hasTouch, + httpCredentials, + ignoreHTTPSErrors, + isMobile, + javaScriptEnabled, + locale, + offline, + permissions, + proxy, + storageState, + timezoneId, + userAgent, + viewport, + baseURL, + contextOptions, + actionTimeout, + navigationTimeout, + serviceWorkers, + testIdAttribute, + browserName, + defaultBrowserType, + headless, + channel, + launchOptions, + connectOptions, + screenshot, + trace, + video, + }, + testInfo + ) + } + + testInfo.tronApp = + tronApp instanceof AuthenticatedTronApp ? tronApp : undefined + } + ) +} + +type ZooTest = typeof test + +test.describe = pwTestFnWithFixtures.describe +test.beforeEach = pwTestFnWithFixtures.beforeEach +test.afterEach = pwTestFnWithFixtures.afterEach +test.step = pwTestFnWithFixtures.step +test.skip = pwTestFnWithFixtures.skip +test.setTimeout = pwTestFnWithFixtures.setTimeout +test.fixme = pwTestFnWithFixtures.fixme as unknown as ZooTest +test.only = pwTestFnWithFixtures.only +test.fail = pwTestFnWithFixtures.fail +test.slow = pwTestFnWithFixtures.slow +test.beforeAll = pwTestFnWithFixtures.beforeAll +test.afterAll = pwTestFnWithFixtures.afterAll +test.use = pwTestFnWithFixtures.use +test.expect = pwTestFnWithFixtures.expect +test.extend = pwTestFnWithFixtures.extend +test.info = pwTestFnWithFixtures.info diff --git a/electron-builder.yml b/electron-builder.yml index 3559e2d0d..c8bd0d09e 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -38,7 +38,7 @@ win: # - arm64 signingHashAlgorithms: - sha256 - sign: "./sign-win.js" + sign: "./scripts/sign-win.js" publisherName: "KittyCAD Inc" # needs to be exactly like on Digicert icon: "assets/icon.ico" fileAssociations: diff --git a/forge.config.ts b/forge.config.ts index 8bfc9cb0a..c22ddf6fa 100644 --- a/forge.config.ts +++ b/forge.config.ts @@ -1,20 +1,9 @@ import type { ForgeConfig } from '@electron-forge/shared-types' -import { MakerSquirrel } from '@electron-forge/maker-squirrel' -import { MakerZIP } from '@electron-forge/maker-zip' -import { MakerDeb } from '@electron-forge/maker-deb' -import { MakerRpm } from '@electron-forge/maker-rpm' import { VitePlugin } from '@electron-forge/plugin-vite' -import { MakerWix, MakerWixConfig } from '@electron-forge/maker-wix' import { FusesPlugin } from '@electron-forge/plugin-fuses' import { FuseV1Options, FuseVersion } from '@electron/fuses' import path from 'path' -interface ExtendedMakerWixConfig extends MakerWixConfig { - // see https://github.com/electron/forge/issues/3673 - // this is an undocumented property of electron-wix-msi - associateExtensions?: string -} - const rootDir = process.cwd() const config: ForgeConfig = { @@ -39,26 +28,7 @@ const config: ForgeConfig = { extendInfo: 'Info.plist', // Information for file associations. }, rebuildConfig: {}, - makers: [ - new MakerSquirrel({ - setupIcon: path.resolve(rootDir, 'assets', 'icon.ico'), - }), - new MakerWix({ - icon: path.resolve(rootDir, 'assets', 'icon.ico'), - associateExtensions: 'kcl', - } as ExtendedMakerWixConfig), - new MakerZIP({}, ['darwin']), - new MakerRpm({ - options: { - icon: path.resolve(rootDir, 'assets', 'icon.png'), - }, - }), - new MakerDeb({ - options: { - icon: path.resolve(rootDir, 'assets', 'icon.png'), - }, - }), - ], + makers: [], plugins: [ new VitePlugin({ // `build` can specify multiple entry builds, which can be Main process, Preload scripts, Worker process, etc. diff --git a/interface.d.ts b/interface.d.ts index 8c06070fa..bafaa97b6 100644 --- a/interface.d.ts +++ b/interface.d.ts @@ -7,9 +7,17 @@ import { MachinesListing } from 'components/MachineManagerProvider' type EnvFn = (value?: string) => string export interface IElectronAPI { + resizeWindow: (width: number, height: number) => Promise open: typeof dialog.showOpenDialog save: typeof dialog.showSaveDialog openExternal: typeof shell.openExternal + takeElectronWindowScreenshot: ({ + width, + height, + }: { + width: number + height: number + }) => Promise showInFolder: typeof shell.showItemInFolder /** Require to be called first before {@link loginWithDeviceFlow} */ startDeviceFlow: (host: string) => Promise @@ -78,6 +86,8 @@ export interface IElectronAPI { ) => Electron.IpcRenderer onUpdateError: (callback: (value: { error: Error }) => void) => Electron appRestart: () => void + getArgvParsed: () => any + getAppTestProperty: (propertyName: string) => any } declare global { diff --git a/make-release.sh b/make-release.sh deleted file mode 100755 index 119fed2f1..000000000 --- a/make-release.sh +++ /dev/null @@ -1,77 +0,0 @@ -#!/bin/bash - -if ! git diff-index --quiet HEAD --; then - echo "Please stash uncommitted changes before running release script" - exit 1 -fi - -git checkout main -git pull -git fetch --all - -# Get the latest semver tag from git -latest_tag=$(jq -r '.version' package.json) -latest_tag="v$latest_tag" - -# Print the latest semver tag -echo "Latest semver tag: $latest_tag" - -# Function to bump version numbers -bump_version() { - local version=$1 - local bump_type=$2 - local major=$(echo $version | cut -d '.' -f 1 | sed 's/v//') - local minor=$(echo $version | cut -d '.' -f 2) - local patch=$(echo $version | cut -d '.' -f 3) - - case "$bump_type" in - major) - major=$((major + 1)) - minor=0 - patch=0 - ;; - minor) - minor=$((minor + 1)) - patch=0 - ;; - *) - patch=$((patch + 1)) - ;; - esac - - echo "v${major}.${minor}.${patch}" -} - -# Determine the type of bump based on the argument -bump_type=${1:-patch} - -# Bump the version -new_version=$(bump_version $latest_tag $bump_type) - -# Print the new semver tag -echo "New semver tag: $new_version" -new_version_number=${new_version:1} -echo "New version number without 'v': $new_version_number" - - -git checkout -b "cut-release-$new_version" - -echo "$(jq --arg v "$new_version_number" '.version=$v' package.json --indent 2)" > package.json - -git add package.json -git commit -m "Cut release $new_version" - -echo "" -echo "Versions has been bumped in relevant json files, a branch has been created and committed to." -echo "" -echo "What's left for you to do is, push the branch and make the release PR." -echo "" - -echo "Suggested changelog:" -echo "\`\`\`" -echo "## What's Changed" -git log $(git describe --tags --match="v[0-9]*" --abbrev=0)..HEAD --oneline --pretty=format:%s | grep -v Bump | grep -v 'Cut release v' | awk '{print "* "toupper(substr($0,0,1))substr($0,2)}' -echo "" -echo "**Full Changelog**: https://github.com/KittyCAD/modeling-app/compare/${latest_tag}...${new_version}" -echo "\`\`\`" -echo "and would recommend removing ones that aren't related to the product (eg. CI changes)" diff --git a/package.json b/package.json index b907dcf0b..8aa482baf 100644 --- a/package.json +++ b/package.json @@ -10,23 +10,23 @@ }, "description": "Edit CAD visually or with code", "main": ".vite/build/main.js", - "license": "none", + "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.17.0", "@codemirror/commands": "^6.6.0", - "@codemirror/language": "^6.10.2", - "@codemirror/lint": "^6.8.1", + "@codemirror/language": "^6.10.3", + "@codemirror/lint": "^6.8.4", "@codemirror/search": "^6.5.6", "@codemirror/state": "^6.4.1", "@codemirror/theme-one-dark": "^6.1.2", - "@csstools/postcss-oklab-function": "^4.0.2", + "@csstools/postcss-oklab-function": "^4.0.7", "@fortawesome/fontawesome-svg-core": "^6.5.2", "@fortawesome/free-brands-svg-icons": "^6.5.2", "@fortawesome/free-solid-svg-icons": "^6.4.2", "@fortawesome/react-fontawesome": "^0.2.0", "@headlessui/react": "^1.7.19", "@headlessui/tailwindcss": "^0.2.0", - "@kittycad/lib": "2.0.7", + "@kittycad/lib": "2.0.12", "@lezer/highlight": "^1.2.1", "@lezer/lr": "^1.4.1", "@react-hook/resize-observer": "^2.0.1", @@ -39,8 +39,8 @@ "chokidar": "^4.0.1", "codemirror": "^6.0.1", "decamelize": "^6.0.0", - "electron-squirrel-startup": "^1.0.1", - "electron-updater": "^6.3.0", + "diff": "^7.0.0", + "electron-updater": "6.3.0", "fuse.js": "^7.0.0", "html2canvas-pro": "^1.5.8", "isomorphic-fetch": "^3.0.0", @@ -56,19 +56,20 @@ "react-json-view": "^1.21.3", "react-modal": "^3.16.1", "react-modal-promise": "^1.0.2", - "react-router-dom": "^6.26.1", + "react-router-dom": "^6.28.0", "sketch-helpers": "^0.0.4", - "three": "^0.166.1", + "three": "^0.172.0", "ua-parser-js": "^1.0.37", - "uuid": "^9.0.1", + "uuid": "^11.0.2", "vscode-jsonrpc": "^8.2.1", "vscode-languageserver-protocol": "^3.17.5", "vscode-uri": "^3.0.8", "web-vitals": "^3.5.2", - "xstate": "^5.17.4" + "xstate": "^5.17.4", + "yargs": "^17.7.2" }, "scripts": { - "start": "vite", + "start": "vite --port=3000 --host=0.0.0.0", "start:prod": "vite preview --port=3000", "serve": "vite serve --port=3000", "build": "curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y && source \"$HOME/.cargo/env\" && curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh -s -- -y && yarn build:wasm && vite build", @@ -76,10 +77,11 @@ "build:both": "vite build", "build:both:local": "yarn build:wasm && vite build", "pretest": "yarn remove-importmeta", - "test:rust": "(cd src/wasm-lib && cargo test --all && cargo clippy --all --tests --benches)", + "test:rust": "(cd src/wasm-lib && cargo test --workspace && cargo clippy --workspace --all-targets)", "simpleserver": "yarn pretest && http-server ./public --cors -p 3000", "simpleserver:ci": "yarn pretest && http-server ./public --cors -p 3000 &", "simpleserver:bg": "yarn pretest && http-server ./public --cors -p 3000 &", + "simpleserver:stop": "kill-port 3000", "fmt": "prettier --write ./src *.ts *.json *.js ./e2e ./packages", "fmt-check": "prettier --check ./src *.ts *.json *.js ./e2e ./packages", "fetch:wasm": "./get-latest-wasm-bundle.sh", @@ -91,33 +93,35 @@ "wasm-prep": "rimraf src/wasm-lib/pkg && mkdirp src/wasm-lib/pkg && rimraf src/wasm-lib/kcl/bindings", "lint-fix": "eslint --fix src e2e packages/codemirror-lsp-client", "lint": "eslint --max-warnings 0 src e2e packages/codemirror-lsp-client", - "bump-jsons": "echo \"$(jq --arg v \"$VERSION\" '.version=$v' package.json --indent 2)\" > package.json", + "files:set-version": "echo \"$(jq --arg v \"$VERSION\" '.version=$v' package.json --indent 2)\" > package.json", + "files:set-notes": "./scripts/set-files-notes.sh", + "files:flip-to-nightly": "./scripts/flip-files-to-nightly.sh", + "files:invalidate-bucket": "./scripts/invalidate-files-bucket.sh", + "files:invalidate-bucket:nightly": "./scripts/invalidate-files-bucket.sh --nightly", "postinstall": "yarn fetch:samples && yarn xstate:typegen && ./node_modules/.bin/electron-rebuild", "xstate:typegen": "yarn xstate typegen \"src/**/*.ts?(x)\"", "make:dev": "make dev", "generate:machine-api": "npx openapi-typescript ./openapi/machine-api.json -o src/lib/machine-api.d.ts", "tron:start": "electron-forge start", "tron:package": "electron-forge package", - "tron:make": "electron-forge make", - "tron:publish": "electron-forge publish", - "tron:test": "NODE_ENV=development yarn playwright test --config=playwright.electron.config.ts --grep=@electron", + "chrome:test": "PLATFORM=web NODE_ENV=development yarn playwright test --config=playwright.config.ts --project='Google Chrome' --grep-invert='@snapshot'", + "tron:test": "NODE_ENV=development yarn playwright test --config=playwright.electron.config.ts --grep-invert='@snapshot'", "tronb:vite": "vite build -c vite.main.config.ts && vite build -c vite.preload.config.ts && vite build -c vite.renderer.config.ts", "tronb:package": "electron-builder --config electron-builder.yml", "test-setup": "yarn install && yarn build:wasm", "test": "vitest --mode development", - "test:unit": "vitest run --mode development", - "test:playwright:browser:chrome": "playwright test --project='Google Chrome' --config=playwright.ci.config.ts --grep-invert='@snapshot|@electron'", - "test:playwright:browser:chrome:windows": "playwright test --project=\"Google Chrome\" --config=playwright.ci.config.ts --grep-invert=\"@snapshot|@electron|@skipWin\"", - "test:playwright:browser:chrome:ubuntu": "playwright test --project='Google Chrome' --config=playwright.ci.config.ts --grep-invert='@snapshot|@electron|@skipLinux'", - "test:playwright:electron": "playwright test --config=playwright.electron.config.ts --grep=@electron", - "test:playwright:electron:windows": "playwright test --config=playwright.electron.config.ts --grep=@electron --grep-invert=@skipWin", - "test:playwright:electron:macos": "playwright test --config=playwright.electron.config.ts --grep=@electron --grep-invert=@skipMacos", - "test:playwright:electron:ubuntu": "playwright test --config=playwright.electron.config.ts --grep=@electron --grep-invert=@skipLinux", - "test:playwright:electron:local": "yarn tron:package && NODE_ENV=development playwright test --config=playwright.electron.config.ts --grep=@electron", - "test:playwright:electron:windows:local": "yarn tron:package && NODE_ENV=development playwright test --config=playwright.electron.config.ts --grep=@electron --grep-invert=@skipWin", - "test:playwright:electron:macos:local": "yarn tron:package && NODE_ENV=development playwright test --config=playwright.electron.config.ts --grep=@electron --grep-invert=@skipMacos", - "test:playwright:electron:ubuntu:local": "yarn tron:package && NODE_ENV=development playwright test --config=playwright.electron.config.ts --grep=@electron --grep-invert=@skipLinux", - "test:unit:local": "yarn simpleserver:bg && yarn test:unit; kill-port 3000" + "test:unit": "vitest run --mode development --exclude **/kclSamples.test.ts", + "test:unit:kcl-samples": "vitest run --mode development ./src/lang/kclSamples.test.ts", + "test:playwright:electron": "playwright test --config=playwright.electron.config.ts --grep-invert='@snapshot'", + "test:playwright:electron:windows": "playwright test --config=playwright.electron.config.ts --grep-invert=\"@skipWin|@snapshot\"", + "test:playwright:electron:macos": "playwright test --config=playwright.electron.config.ts --grep-invert='@skipMacos|@snapshot'", + "test:playwright:electron:ubuntu": "playwright test --config=playwright.electron.config.ts --grep-invert='@skipLinux|@snapshot'", + "test:playwright:electron:local": "yarn tron:package && NODE_ENV=development playwright test --config=playwright.electron.config.ts --grep-invert='@snapshot'", + "test:playwright:electron:windows:local": "yarn tron:package && NODE_ENV=development playwright test --config=playwright.electron.config.ts --grep-invert=\"@skipWin|@snapshot\"", + "test:playwright:electron:macos:local": "yarn tron:package && NODE_ENV=development playwright test --config=playwright.electron.config.ts --grep-invert='@skipMacos|@snapshot'", + "test:playwright:electron:ubuntu:local": "yarn tron:package && NODE_ENV=development playwright test --config=playwright.electron.config.ts --grep-invert='@skipLinux|@snapshot'", + "test:unit:local": "yarn simpleserver:bg && yarn test:unit; kill-port 3000", + "test:unit:kcl-samples:local": "yarn simpleserver:bg && yarn test:unit:kcl-samples; kill-port 3000" }, "prettier": { "trailingComma": "es5", @@ -140,23 +144,18 @@ "devDependencies": { "@babel/plugin-proposal-private-property-in-object": "^7.21.11", "@babel/preset-env": "^7.25.4", - "@electron-forge/cli": "^7.4.0", - "@electron-forge/maker-deb": "^7.4.0", - "@electron-forge/maker-rpm": "^7.4.0", - "@electron-forge/maker-squirrel": "^7.4.0", - "@electron-forge/maker-wix": "^7.4.0", - "@electron-forge/maker-zip": "^7.4.0", - "@electron-forge/plugin-auto-unpack-natives": "^7.4.0", - "@electron-forge/plugin-fuses": "^7.4.0", - "@electron-forge/plugin-vite": "^7.4.0", - "@electron/fuses": "^1.8.0", - "@electron/rebuild": "^3.6.0", + "@electron-forge/cli": "7.4.0", + "@electron-forge/plugin-fuses": "7.4.0", + "@electron-forge/plugin-vite": "7.4.0", + "@electron/fuses": "1.8.0", "@iarna/toml": "^2.2.5", "@lezer/generator": "^1.7.1", - "@playwright/test": "^1.46.1", + "@nabla/vite-plugin-eslint": "^2.0.5", + "@playwright/test": "^1.49.0", "@testing-library/jest-dom": "^5.14.1", "@testing-library/react": "^15.0.2", "@types/d3-force": "^3.0.10", + "@types/diff": "^6.0.0", "@types/electron": "^1.6.10", "@types/isomorphic-fetch": "^0.0.39", "@types/minimist": "^1.2.5", @@ -165,13 +164,13 @@ "@types/pixelmatch": "^5.2.6", "@types/pngjs": "^6.0.4", "@types/react": "^18.3.4", - "@types/react-dom": "^18.2.25", + "@types/react-dom": "^18.3.1", "@types/react-modal": "^3.16.3", - "@types/three": "^0.163.0", + "@types/three": "^0.172.0", "@types/ua-parser-js": "^0.7.39", "@types/uuid": "^9.0.8", "@types/wicg-file-system-access": "^2023.10.5", - "@types/ws": "^8.5.10", + "@types/ws": "^8.5.13", "@typescript-eslint/eslint-plugin": "^5.0.0", "@typescript-eslint/parser": "^5.0.0", "@vitejs/plugin-react": "^4.3.0", @@ -179,15 +178,15 @@ "@xstate/cli": "^0.5.17", "autoprefixer": "^10.4.19", "d3-force": "^3.0.0", - "electron": "^32.1.2", - "electron-builder": "^24.13.3", - "electron-notarize": "^1.2.2", + "electron": "32.1.2", + "electron-builder": "24.13.3", + "electron-notarize": "1.2.2", "eslint": "^8.0.1", "eslint-config-react-app": "^7.0.1", "eslint-plugin-css-modules": "^2.12.0", "eslint-plugin-import": "^2.30.0", "eslint-plugin-suggest-no-throw": "^1.0.0", - "happy-dom": "^14.3.10", + "happy-dom": "^15.11.7", "http-server": "^14.1.1", "husky": "^9.1.5", "kill-port": "^2.0.1", @@ -200,14 +199,13 @@ "setimmediate": "^1.0.5", "tailwindcss": "^3.4.1", "ts-node": "^10.0.0", - "typescript": "^5.0.0", + "typescript": "^5.7.2", "vite": "^5.4.6", - "vite-plugin-eslint": "^1.8.1", "vite-plugin-package-version": "^1.1.0", "vite-tsconfig-paths": "^4.3.2", "vitest": "^1.6.0", "vitest-webgl-canvas-mock": "^1.1.0", - "wasm-pack": "^0.13.0", + "wasm-pack": "^0.13.1", "ws": "^8.17.0", "yarn": "^1.22.22" } diff --git a/packages/codemirror-lang-kcl/.gitignore b/packages/codemirror-lang-kcl/.gitignore new file mode 100644 index 000000000..c3a9c7928 --- /dev/null +++ b/packages/codemirror-lang-kcl/.gitignore @@ -0,0 +1,7 @@ +node_modules +build +dist +tsconfig.tsbuildinfo +*.d.ts +*.js +!rollup.config.js diff --git a/packages/codemirror-lang-kcl/package.json b/packages/codemirror-lang-kcl/package.json new file mode 100644 index 000000000..785e3e98e --- /dev/null +++ b/packages/codemirror-lang-kcl/package.json @@ -0,0 +1,36 @@ +{ + "name": "@kittycad/codemirror-lang-kcl", + "version": "1.0.0", + "description": "Zoo KCL language support for CodeMirror 6.", + "main": "src/index.ts", + "scripts": { + "build": "rollup -c", + "test": "vitest --config vitest.main.config.ts run" + }, + "type": "module", + "repository": "https://github.com/KittyCAD/modeling-app", + "author": "Zoo Engineering Team", + "license": "MIT", + "private": false, + "exports": { + "import": "./dist/index.js", + "require": "./dist/index.cjs" + }, + "types": "dist/index.d.ts", + "dependencies": { + "@codemirror/language": "^6.10.3", + "@codemirror/state": "^6.4.1", + "@lezer/highlight": "^1.2.1", + "typescript": "^5.7.2" + }, + "devDependencies": { + "@lezer/generator": "^1.7.2", + "@rollup/plugin-typescript": "^12.1.2", + "rollup": "^4.29.1", + "rollup-plugin-dts": "^6.1.1", + "vitest": "^2.1.8" + }, + "files": [ + "dist/" + ] +} diff --git a/packages/codemirror-lang-kcl/rollup.config.js b/packages/codemirror-lang-kcl/rollup.config.js new file mode 100644 index 000000000..d558688be --- /dev/null +++ b/packages/codemirror-lang-kcl/rollup.config.js @@ -0,0 +1,25 @@ +import dts from 'rollup-plugin-dts' +import { lezer } from '@lezer/generator/rollup' +import typescript from '@rollup/plugin-typescript' + +export default [ + { + input: 'src/index.ts', + // imports are considered internal if they start with './' or '/' or 'word:' + external: (id) => id != 'tslib' && !/^(\.?\/|\w:)/.test(id), + output: [ + { file: 'dist/index.cjs', format: 'cjs' }, + { file: 'dist/index.js', format: 'es' }, + ], + plugins: [lezer(), typescript()], + }, + { + input: 'src/index.ts', + external: (id) => id != 'tslib' && !/^(\.?\/|\w:)/.test(id), + output: [ + { file: 'dist/index.d.cts', format: 'cjs' }, + { file: 'dist/index.d.ts', format: 'es' }, + ], + plugins: [lezer(), typescript(), dts()], + }, +] diff --git a/src/editor/plugins/lsp/kcl/highlight.ts b/packages/codemirror-lang-kcl/src/highlight.ts similarity index 96% rename from src/editor/plugins/lsp/kcl/highlight.ts rename to packages/codemirror-lang-kcl/src/highlight.ts index 6e457c124..c1216b699 100644 --- a/src/editor/plugins/lsp/kcl/highlight.ts +++ b/packages/codemirror-lang-kcl/src/highlight.ts @@ -12,6 +12,7 @@ export const kclHighlight = styleTags({ 'AddOp MultOp ExpOp': t.arithmeticOperator, BangOp: t.logicOperator, CompOp: t.compareOperator, + LogicOp: t.logicOperator, 'Equals Arrow': t.definitionOperator, PipeOperator: t.controlOperator, String: t.string, diff --git a/packages/codemirror-lang-kcl/src/index.ts b/packages/codemirror-lang-kcl/src/index.ts new file mode 100644 index 000000000..7d77f1375 --- /dev/null +++ b/packages/codemirror-lang-kcl/src/index.ts @@ -0,0 +1,42 @@ +// Base CodeMirror language support for kcl. + +import { + LRLanguage, + LanguageSupport, + indentNodeProp, + continuedIndent, + delimitedIndent, + foldNodeProp, + foldInside, +} from '@codemirror/language' +// @ts-ignore: No types available +import { parser } from './kcl.grammar' + +export const KclLanguage = LRLanguage.define({ + name: 'kcl', + parser: parser.configure({ + props: [ + indentNodeProp.add({ + Body: delimitedIndent({ closing: '}' }), + BlockComment: () => null, + 'Statement Property': continuedIndent({ except: /^{/ }), + }), + foldNodeProp.add({ + 'Body ArrayExpression ObjectExpression': foldInside, + BlockComment(tree) { + return { from: tree.from + 2, to: tree.to - 2 } + }, + PipeExpression(tree) { + return { from: tree.firstChild!.to, to: tree.to } + }, + }), + ], + }), + languageData: { + commentTokens: { line: '//', block: { open: '/*', close: '*/' } }, + }, +}) + +export function kcl() { + return new LanguageSupport(KclLanguage) +} diff --git a/src/editor/plugins/lsp/kcl/kcl.grammar b/packages/codemirror-lang-kcl/src/kcl.grammar similarity index 92% rename from src/editor/plugins/lsp/kcl/kcl.grammar rename to packages/codemirror-lang-kcl/src/kcl.grammar index cc962550e..d8d9419b1 100644 --- a/src/editor/plugins/lsp/kcl/kcl.grammar +++ b/packages/codemirror-lang-kcl/src/kcl.grammar @@ -5,6 +5,7 @@ mult @left add @left comp @left + logic @left pipe @left range } @@ -16,7 +17,7 @@ statement[@isGroup=Statement] { ImportStatement { kw<"import"> ImportItems ImportFrom String } | - FunctionDeclaration { kw<"export">? kw<"fn"> VariableDefinition Equals ParamList Arrow Body } | + FunctionDeclaration { kw<"export">? kw<"fn"> VariableDefinition Equals? ParamList Arrow? Body } | VariableDeclaration { kw<"export">? (kw<"var"> | kw<"let"> | kw<"const">)? VariableDefinition Equals expression } | ReturnStatement { kw<"return"> expression } | ExpressionStatement { expression } @@ -40,7 +41,8 @@ expression[@isGroup=Expression] { expression !add AddOp expression | expression !mult MultOp expression | expression !exp ExpOp expression | - expression !comp CompOp expression + expression !comp CompOp expression | + expression !logic LogicOp expression } | UnaryExpression { UnaryOp expression } | ParenthesizedExpression { "(" expression ")" } | @@ -55,7 +57,7 @@ expression[@isGroup=Expression] { UnaryOp { AddOp | BangOp } -ObjectProperty { PropertyName ":" expression } +ObjectProperty { PropertyName (":" | Equals) expression } ArgumentList { "(" commaSep ")" } @@ -83,12 +85,13 @@ commaSep1NoTrailingComma { term ("," term)* } @tokens { String[isolate] { "'" ("\\" _ | !['\\])* "'" | '"' ("\\" _ | !["\\])* '"' } - Number { "." @digit+ | @digit+ ("." @digit*)? } + Number { "." @digit+ | @digit+ ("." @digit+)? } @precedence { Number, "." } AddOp { "+" | "-" } MultOp { "/" | "*" | "\\" } ExpOp { "^" } + LogicOp { "|" | "&" } BangOp { "!" } CompOp { "==" | "!=" | "<=" | ">=" | "<" | ">" } Equals { "=" } diff --git a/packages/codemirror-lang-kcl/test/all.test.ts b/packages/codemirror-lang-kcl/test/all.test.ts new file mode 100644 index 000000000..dba913ceb --- /dev/null +++ b/packages/codemirror-lang-kcl/test/all.test.ts @@ -0,0 +1,22 @@ +import { KclLanguage } from '../src/index' +import { fileTests } from '@lezer/generator/dist/test' + +import * as fs from 'fs' +import * as path from 'path' + +let caseDir = path.dirname(__filename) + +for (let file of fs.readdirSync(caseDir)) { + if (!/\.txt$/.test(file)) continue + + let fname = /^[^\.]*/.exec(file)?.at(0) + if (fname) { + let tests = fileTests( + fs.readFileSync(path.join(caseDir, file), 'utf8'), + file + ) + describe(fname, () => { + for (let { name, run } of tests) it(name, () => run(KclLanguage.parser)) + }) + } +} diff --git a/packages/codemirror-lang-kcl/test/cases.txt b/packages/codemirror-lang-kcl/test/cases.txt new file mode 100644 index 000000000..8f4e31718 --- /dev/null +++ b/packages/codemirror-lang-kcl/test/cases.txt @@ -0,0 +1,60 @@ +# Booleans + +true +false + +==> + +Program(ExpressionStatement(true), ExpressionStatement(false)) + +# Identifiers + +one +_Two_Three +Four5 + +==> + +Program(ExpressionStatement(VariableName), + ExpressionStatement(VariableName), + ExpressionStatement(VariableName)) + +# Strings + +"hello" +'hi' +"one\"\\two" +'3\'\\four\x' + +==> + +Program(ExpressionStatement(String), + ExpressionStatement(String), + ExpressionStatement(String), + ExpressionStatement(String)) + +# VariableDeclaration + +let a = 'abc' +export const x = 0.2 + +==> + +Program(VariableDeclaration(let, VariableDefinition, Equals, String), + VariableDeclaration(export, const, VariableDefinition, Equals, Number)) + +# IfExpression + +if x { 1 } else { $tag } + +==> + +Program(ExpressionStatement(IfExpression(if, VariableName, Body(ExpressionStatement(Number)), else, Body(ExpressionStatement(TagDeclarator))))) + +# Shebang + +#!anything + +==> + +Program(Shebang) diff --git a/packages/codemirror-lang-kcl/test/fn.txt b/packages/codemirror-lang-kcl/test/fn.txt new file mode 100644 index 000000000..b77946cc4 --- /dev/null +++ b/packages/codemirror-lang-kcl/test/fn.txt @@ -0,0 +1,60 @@ +# full + +fn two = () => { + return 2 +} + +==> + +Program(FunctionDeclaration(fn, + VariableDefinition, + Equals, + ParamList, + Arrow, + Body(ReturnStatement(return, + Number)))) + +# = is optional + +fn one () => { + return 1 +} + +==> + +Program(FunctionDeclaration(fn, + VariableDefinition, + ParamList, + Arrow, + Body(ReturnStatement(return, + Number)))) + +# => is optional + +fn one = () { + return 1 +} + +==> + +Program(FunctionDeclaration(fn, + VariableDefinition, + Equals, + ParamList, + Body(ReturnStatement(return, + Number)))) + +# terse + +fn two() { + return 2 +} + +==> + +Program(FunctionDeclaration(fn, + VariableDefinition, + ParamList, + Body(ReturnStatement(return, + Number)))) + diff --git a/packages/codemirror-lang-kcl/test/key.txt b/packages/codemirror-lang-kcl/test/key.txt new file mode 100644 index 000000000..a8bbf674b --- /dev/null +++ b/packages/codemirror-lang-kcl/test/key.txt @@ -0,0 +1,20 @@ +# colon (deprecated) + +x = { k: 123 } + +==> +Program(VariableDeclaration(VariableDefinition, + Equals, + ObjectExpression(ObjectProperty(PropertyName, + Number)))) + +# equal + +x = { k = 123 } + +==> +Program(VariableDeclaration(VariableDefinition, + Equals, + ObjectExpression(ObjectProperty(PropertyName, + Equals, + Number)))) diff --git a/packages/codemirror-lang-kcl/test/range.txt b/packages/codemirror-lang-kcl/test/range.txt new file mode 100644 index 000000000..b52ae2953 --- /dev/null +++ b/packages/codemirror-lang-kcl/test/range.txt @@ -0,0 +1,43 @@ +# spaced + +a = [0 .. 1] + +==> +Program(VariableDeclaration(VariableDefinition, + Equals, + ArrayExpression(IntegerRange(Number, + Number)))) + +# compact + +a = [0..1] + +==> +Program(VariableDeclaration(VariableDefinition, + Equals, + ArrayExpression(IntegerRange(Number, + Number)))) + +# expr spaced + +a = [start .. start + 10] + +==> +Program(VariableDeclaration(VariableDefinition, + Equals, + ArrayExpression(IntegerRange(VariableName, + BinaryExpression(VariableName, + AddOp, + Number))))) + +# expr compact + +a = [start..start + 10] + +==> +Program(VariableDeclaration(VariableDefinition, + Equals, + ArrayExpression(IntegerRange(VariableName, + BinaryExpression(VariableName, + AddOp, + Number))))) diff --git a/packages/codemirror-lang-kcl/tsconfig.json b/packages/codemirror-lang-kcl/tsconfig.json new file mode 100644 index 000000000..68ae17808 --- /dev/null +++ b/packages/codemirror-lang-kcl/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "composite": true, + "rootDir": "src", + "outDir": "dist", + "target": "esnext", + "lib": ["dom", "dom.iterable", "esnext"], + "module": "esnext", + "esModuleInterop": true, + "moduleResolution": "node", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitAny": true, + "skipLibCheck": true, + "declaration": true + }, + "include": ["src", "./*.ts"], + "exclude": ["node_modules", "vitest.main.config.ts"] +} diff --git a/packages/codemirror-lang-kcl/vitest.main.config.ts b/packages/codemirror-lang-kcl/vitest.main.config.ts new file mode 100644 index 000000000..8664aa768 --- /dev/null +++ b/packages/codemirror-lang-kcl/vitest.main.config.ts @@ -0,0 +1,29 @@ +// Overrides the test options from the modeling-app config. + +import viteTsconfigPaths from 'vite-tsconfig-paths' +import { defineConfig, configDefaults } from 'vitest/config' +// @ts-ignore: No types available +import { lezer } from '@lezer/generator/rollup' + +const config = defineConfig({ + test: { + globals: true, + pool: 'forks', + poolOptions: { + forks: { + maxForks: 2, + minForks: 1, + }, + }, + environment: 'node', + reporters: process.env.GITHUB_ACTIONS + ? ['dot', 'github-actions'] + : ['verbose', 'hanging-process'], + testTimeout: 1000, + hookTimeout: 1000, + teardownTimeout: 1000, + }, + plugins: [viteTsconfigPaths(), lezer()], +}) + +export default config diff --git a/packages/codemirror-lang-kcl/yarn.lock b/packages/codemirror-lang-kcl/yarn.lock new file mode 100644 index 000000000..66e048b88 --- /dev/null +++ b/packages/codemirror-lang-kcl/yarn.lock @@ -0,0 +1,714 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.24.2": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== + dependencies: + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + +"@codemirror/language@^6.10.3": + version "6.10.8" + resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-6.10.8.tgz#3e3a346a2b0a8cf63ee1cfe03349eb1965dce5f9" + integrity sha512-wcP8XPPhDH2vTqf181U8MbZnW+tDyPYy0UzVOa+oHORjyT+mhhom9vBd7dApJwoDz9Nb/a8kHjJIsuA/t8vNFw== + dependencies: + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.23.0" + "@lezer/common" "^1.1.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + style-mod "^4.0.0" + +"@codemirror/state@^6.0.0", "@codemirror/state@^6.4.1", "@codemirror/state@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.5.0.tgz#e98dde85620618651543152fe1c2483300a0ccc9" + integrity sha512-MwBHVK60IiIHDcoMet78lxt6iw5gJOGSbNbOIVBHWVXIH4/Nq1+GQgLLGgI1KlnN86WDXsPudVaqYHKBIx7Eyw== + dependencies: + "@marijn/find-cluster-break" "^1.0.0" + +"@codemirror/view@^6.23.0": + version "6.36.1" + resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.36.1.tgz#3c543b8fd72c96b30c4b2b1464d1ebce7e0c5c4b" + integrity sha512-miD1nyT4m4uopZaDdO2uXU/LLHliKNYL9kB1C1wJHrunHLm/rpkb5QVSokqgw9hFqEZakrdlb/VGWX8aYZTslQ== + dependencies: + "@codemirror/state" "^6.5.0" + style-mod "^4.1.0" + w3c-keyname "^2.2.4" + +"@esbuild/aix-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" + integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== + +"@esbuild/android-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" + integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== + +"@esbuild/android-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" + integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== + +"@esbuild/android-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" + integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== + +"@esbuild/darwin-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== + +"@esbuild/darwin-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" + integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== + +"@esbuild/freebsd-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" + integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== + +"@esbuild/freebsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" + integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== + +"@esbuild/linux-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" + integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== + +"@esbuild/linux-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" + integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== + +"@esbuild/linux-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" + integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== + +"@esbuild/linux-loong64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" + integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== + +"@esbuild/linux-mips64el@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" + integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== + +"@esbuild/linux-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" + integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== + +"@esbuild/linux-riscv64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" + integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== + +"@esbuild/linux-s390x@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" + integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== + +"@esbuild/linux-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== + +"@esbuild/netbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" + integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== + +"@esbuild/openbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" + integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== + +"@esbuild/sunos-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" + integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== + +"@esbuild/win32-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" + integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== + +"@esbuild/win32-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" + integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== + +"@esbuild/win32-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== + +"@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@lezer/common@^1.0.0", "@lezer/common@^1.1.0": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.2.3.tgz#138fcddab157d83da557554851017c6c1e5667fd" + integrity sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA== + +"@lezer/generator@^1.7.2": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@lezer/generator/-/generator-1.7.2.tgz#a491c91eb9f117ea803e748fa97574514156a2a3" + integrity sha512-CwgULPOPPmH54tv4gki18bElLCdJ1+FBC+nGVSVD08vFWDsMjS7KEjNTph9JOypDnet90ujN3LzQiW3CyVODNQ== + dependencies: + "@lezer/common" "^1.1.0" + "@lezer/lr" "^1.3.0" + +"@lezer/highlight@^1.0.0", "@lezer/highlight@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@lezer/highlight/-/highlight-1.2.1.tgz#596fa8f9aeb58a608be0a563e960c373cbf23f8b" + integrity sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA== + dependencies: + "@lezer/common" "^1.0.0" + +"@lezer/lr@^1.0.0", "@lezer/lr@^1.3.0": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-1.4.2.tgz#931ea3dea8e9de84e90781001dae30dea9ff1727" + integrity sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA== + dependencies: + "@lezer/common" "^1.0.0" + +"@marijn/find-cluster-break@^1.0.0": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz#775374306116d51c0c500b8c4face0f9a04752d8" + integrity sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g== + +"@rollup/plugin-typescript@^12.1.2": + version "12.1.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-12.1.2.tgz#ebaeec2e7376faa889030ccd7cb485a649e63118" + integrity sha512-cdtSp154H5sv637uMr1a8OTWB0L1SWDSm1rDGiyfcGcvQ6cuTs4MDk2BVEBGysUWago4OJN4EQZqOTl/QY3Jgg== + dependencies: + "@rollup/pluginutils" "^5.1.0" + resolve "^1.22.1" + +"@rollup/pluginutils@^5.1.0": + version "5.1.4" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.4.tgz#bb94f1f9eaaac944da237767cdfee6c5b2262d4a" + integrity sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^4.0.2" + +"@rollup/rollup-android-arm-eabi@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.29.1.tgz#9bd38df6a29afb7f0336d988bc8112af0c8816c0" + integrity sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw== + +"@rollup/rollup-android-arm64@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.29.1.tgz#bd1a98390e15b76eeef907175a37c5f0f9e4d214" + integrity sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew== + +"@rollup/rollup-darwin-arm64@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.29.1.tgz#bc6fa8a2cc77b5f367424e5e994e3537524e6879" + integrity sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw== + +"@rollup/rollup-darwin-x64@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.29.1.tgz#76059c91f06b17406347b127df10f065283b2e61" + integrity sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng== + +"@rollup/rollup-freebsd-arm64@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.29.1.tgz#83178315c0be4b4c8c1fd835e1952d2dc1eb4e6e" + integrity sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw== + +"@rollup/rollup-freebsd-x64@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.29.1.tgz#1ef24fa0576bf7899a0a0a649156606dbd7a0d46" + integrity sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w== + +"@rollup/rollup-linux-arm-gnueabihf@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.29.1.tgz#443a6f5681bf4611caae42988994a6d8ee676216" + integrity sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A== + +"@rollup/rollup-linux-arm-musleabihf@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.29.1.tgz#9738b27184102228637a683e5f35b22ea352394f" + integrity sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ== + +"@rollup/rollup-linux-arm64-gnu@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.29.1.tgz#b5e9d5e30ff36a19bedd29c715ba18a1889ff269" + integrity sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA== + +"@rollup/rollup-linux-arm64-musl@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.29.1.tgz#1d8f68f0829b57f746ec03432ad046f1af014a98" + integrity sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA== + +"@rollup/rollup-linux-loongarch64-gnu@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.29.1.tgz#07027feb883408e74a3002c8e50caaedd288ae38" + integrity sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw== + +"@rollup/rollup-linux-powerpc64le-gnu@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.29.1.tgz#544ce1b0847a9c1240425e86f33daceac7ec4e12" + integrity sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w== + +"@rollup/rollup-linux-riscv64-gnu@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.29.1.tgz#64be13d51852ec1e2dfbd25d997ed5f42f35ea6d" + integrity sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ== + +"@rollup/rollup-linux-s390x-gnu@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.29.1.tgz#31f51e1e05c6264552d03875d9e2e673f0fd86e3" + integrity sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g== + +"@rollup/rollup-linux-x64-gnu@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.29.1.tgz#f4c95b26f4ad69ebdb64b42f0ae4da2a0f617958" + integrity sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ== + +"@rollup/rollup-linux-x64-musl@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.29.1.tgz#ab7be89192f72beb9ea6e2386186fefde4f69d82" + integrity sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA== + +"@rollup/rollup-win32-arm64-msvc@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.29.1.tgz#7f12efb8240b238346951559998802722944421e" + integrity sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig== + +"@rollup/rollup-win32-ia32-msvc@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.29.1.tgz#353d14d6eee943004d129796e4feddd3aa260921" + integrity sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng== + +"@rollup/rollup-win32-x64-msvc@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.29.1.tgz#c82f04a09ba481e13857d6f2516e072aaa51b7f4" + integrity sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg== + +"@types/estree@1.0.6", "@types/estree@^1.0.0": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + +"@vitest/expect@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-2.1.8.tgz#13fad0e8d5a0bf0feb675dcf1d1f1a36a1773bc1" + integrity sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw== + dependencies: + "@vitest/spy" "2.1.8" + "@vitest/utils" "2.1.8" + chai "^5.1.2" + tinyrainbow "^1.2.0" + +"@vitest/mocker@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-2.1.8.tgz#51dec42ac244e949d20009249e033e274e323f73" + integrity sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA== + dependencies: + "@vitest/spy" "2.1.8" + estree-walker "^3.0.3" + magic-string "^0.30.12" + +"@vitest/pretty-format@2.1.8", "@vitest/pretty-format@^2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.1.8.tgz#88f47726e5d0cf4ba873d50c135b02e4395e2bca" + integrity sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ== + dependencies: + tinyrainbow "^1.2.0" + +"@vitest/runner@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.1.8.tgz#b0e2dd29ca49c25e9323ea2a45a5125d8729759f" + integrity sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg== + dependencies: + "@vitest/utils" "2.1.8" + pathe "^1.1.2" + +"@vitest/snapshot@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.1.8.tgz#d5dc204f4b95dc8b5e468b455dfc99000047d2de" + integrity sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg== + dependencies: + "@vitest/pretty-format" "2.1.8" + magic-string "^0.30.12" + pathe "^1.1.2" + +"@vitest/spy@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.1.8.tgz#bc41af3e1e6a41ae3b67e51f09724136b88fa447" + integrity sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg== + dependencies: + tinyspy "^3.0.2" + +"@vitest/utils@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.1.8.tgz#f8ef85525f3362ebd37fd25d268745108d6ae388" + integrity sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA== + dependencies: + "@vitest/pretty-format" "2.1.8" + loupe "^3.1.2" + tinyrainbow "^1.2.0" + +assertion-error@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" + integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== + +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + +chai@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/chai/-/chai-5.1.2.tgz#3afbc340b994ae3610ca519a6c70ace77ad4378d" + integrity sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw== + dependencies: + assertion-error "^2.0.1" + check-error "^2.1.1" + deep-eql "^5.0.1" + loupe "^3.1.0" + pathval "^2.0.0" + +check-error@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" + integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== + +debug@^4.3.7: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + dependencies: + ms "^2.1.3" + +deep-eql@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" + integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== + +es-module-lexer@^1.5.4: + version "1.6.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.6.0.tgz#da49f587fd9e68ee2404fe4e256c0c7d3a81be21" + integrity sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ== + +esbuild@^0.21.3: + version "0.21.5" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== + optionalDependencies: + "@esbuild/aix-ppc64" "0.21.5" + "@esbuild/android-arm" "0.21.5" + "@esbuild/android-arm64" "0.21.5" + "@esbuild/android-x64" "0.21.5" + "@esbuild/darwin-arm64" "0.21.5" + "@esbuild/darwin-x64" "0.21.5" + "@esbuild/freebsd-arm64" "0.21.5" + "@esbuild/freebsd-x64" "0.21.5" + "@esbuild/linux-arm" "0.21.5" + "@esbuild/linux-arm64" "0.21.5" + "@esbuild/linux-ia32" "0.21.5" + "@esbuild/linux-loong64" "0.21.5" + "@esbuild/linux-mips64el" "0.21.5" + "@esbuild/linux-ppc64" "0.21.5" + "@esbuild/linux-riscv64" "0.21.5" + "@esbuild/linux-s390x" "0.21.5" + "@esbuild/linux-x64" "0.21.5" + "@esbuild/netbsd-x64" "0.21.5" + "@esbuild/openbsd-x64" "0.21.5" + "@esbuild/sunos-x64" "0.21.5" + "@esbuild/win32-arm64" "0.21.5" + "@esbuild/win32-ia32" "0.21.5" + "@esbuild/win32-x64" "0.21.5" + +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +estree-walker@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + +expect-type@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.1.0.tgz#a146e414250d13dfc49eafcfd1344a4060fa4c75" + integrity sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA== + +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +is-core-module@^2.16.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== + dependencies: + hasown "^2.0.2" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +loupe@^3.1.0, loupe@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.2.tgz#c86e0696804a02218f2206124c45d8b15291a240" + integrity sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg== + +magic-string@^0.30.10, magic-string@^0.30.12: + version "0.30.17" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" + integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@^3.3.7: + version "3.3.8" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" + integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +pathe@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" + integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== + +pathval@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" + integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== + +picocolors@^1.0.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + +postcss@^8.4.43: + version "8.4.49" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19" + integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== + dependencies: + nanoid "^3.3.7" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +resolve@^1.22.1: + version "1.22.10" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== + dependencies: + is-core-module "^2.16.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +rollup-plugin-dts@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-dts/-/rollup-plugin-dts-6.1.1.tgz#46b33f4d1d7f4e66f1171ced9b282ac11a15a254" + integrity sha512-aSHRcJ6KG2IHIioYlvAOcEq6U99sVtqDDKVhnwt70rW6tsz3tv5OSjEiWcgzfsHdLyGXZ/3b/7b/+Za3Y6r1XA== + dependencies: + magic-string "^0.30.10" + optionalDependencies: + "@babel/code-frame" "^7.24.2" + +rollup@^4.20.0, rollup@^4.29.1: + version "4.29.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.29.1.tgz#a9aaaece817e5f778489e5bf82e379cc8a5c05bc" + integrity sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw== + dependencies: + "@types/estree" "1.0.6" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.29.1" + "@rollup/rollup-android-arm64" "4.29.1" + "@rollup/rollup-darwin-arm64" "4.29.1" + "@rollup/rollup-darwin-x64" "4.29.1" + "@rollup/rollup-freebsd-arm64" "4.29.1" + "@rollup/rollup-freebsd-x64" "4.29.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.29.1" + "@rollup/rollup-linux-arm-musleabihf" "4.29.1" + "@rollup/rollup-linux-arm64-gnu" "4.29.1" + "@rollup/rollup-linux-arm64-musl" "4.29.1" + "@rollup/rollup-linux-loongarch64-gnu" "4.29.1" + "@rollup/rollup-linux-powerpc64le-gnu" "4.29.1" + "@rollup/rollup-linux-riscv64-gnu" "4.29.1" + "@rollup/rollup-linux-s390x-gnu" "4.29.1" + "@rollup/rollup-linux-x64-gnu" "4.29.1" + "@rollup/rollup-linux-x64-musl" "4.29.1" + "@rollup/rollup-win32-arm64-msvc" "4.29.1" + "@rollup/rollup-win32-ia32-msvc" "4.29.1" + "@rollup/rollup-win32-x64-msvc" "4.29.1" + fsevents "~2.3.2" + +siginfo@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" + integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== + +source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +stackback@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" + integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== + +std-env@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.8.0.tgz#b56ffc1baf1a29dcc80a3bdf11d7fca7c315e7d5" + integrity sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w== + +style-mod@^4.0.0, style-mod@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.1.2.tgz#ca238a1ad4786520f7515a8539d5a63691d7bf67" + integrity sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw== + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tinybench@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" + integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== + +tinyexec@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" + integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== + +tinypool@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.2.tgz#706193cc532f4c100f66aa00b01c42173d9051b2" + integrity sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA== + +tinyrainbow@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-1.2.0.tgz#5c57d2fc0fb3d1afd78465c33ca885d04f02abb5" + integrity sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ== + +tinyspy@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.2.tgz#86dd3cf3d737b15adcf17d7887c84a75201df20a" + integrity sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q== + +typescript@^5.7.2: + version "5.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" + integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== + +vite-node@2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-2.1.8.tgz#9495ca17652f6f7f95ca7c4b568a235e0c8dbac5" + integrity sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg== + dependencies: + cac "^6.7.14" + debug "^4.3.7" + es-module-lexer "^1.5.4" + pathe "^1.1.2" + vite "^5.0.0" + +vite@^5.0.0: + version "5.4.11" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.11.tgz#3b415cd4aed781a356c1de5a9ebafb837715f6e5" + integrity sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q== + dependencies: + esbuild "^0.21.3" + postcss "^8.4.43" + rollup "^4.20.0" + optionalDependencies: + fsevents "~2.3.3" + +vitest@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-2.1.8.tgz#2e6a00bc24833574d535c96d6602fb64163092fa" + integrity sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ== + dependencies: + "@vitest/expect" "2.1.8" + "@vitest/mocker" "2.1.8" + "@vitest/pretty-format" "^2.1.8" + "@vitest/runner" "2.1.8" + "@vitest/snapshot" "2.1.8" + "@vitest/spy" "2.1.8" + "@vitest/utils" "2.1.8" + chai "^5.1.2" + debug "^4.3.7" + expect-type "^1.1.0" + magic-string "^0.30.12" + pathe "^1.1.2" + std-env "^3.8.0" + tinybench "^2.9.0" + tinyexec "^0.3.1" + tinypool "^1.0.1" + tinyrainbow "^1.2.0" + vite "^5.0.0" + vite-node "2.1.8" + why-is-node-running "^2.3.0" + +w3c-keyname@^2.2.4: + version "2.2.8" + resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz#7b17c8c6883d4e8b86ac8aba79d39e880f8869c5" + integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ== + +why-is-node-running@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" + integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== + dependencies: + siginfo "^2.0.0" + stackback "0.0.2" diff --git a/packages/codemirror-lsp-client/package.json b/packages/codemirror-lsp-client/package.json index 759d34918..f99ec1687 100644 --- a/packages/codemirror-lsp-client/package.json +++ b/packages/codemirror-lsp-client/package.json @@ -18,13 +18,13 @@ "license": "MIT", "private": false, "dependencies": { - "@codemirror/autocomplete": "^6.16.3", + "@codemirror/autocomplete": "6.17.0", "@codemirror/language": "^6.10.2", "@codemirror/state": "^6.4.1", "@lezer/highlight": "^1.2.0", "@ts-stack/markdown": "^1.5.0", "json-rpc-2.0": "^1.7.0", - "typescript": "^5.5.2", + "typescript": "^5.7.2", "vscode-languageserver-protocol": "^3.17.5", "vscode-uri": "^3.0.8" }, diff --git a/packages/codemirror-lsp-client/src/client/codec/demuxer.ts b/packages/codemirror-lsp-client/src/client/codec/demuxer.ts index 62c5ce457..3a4cf9e0d 100644 --- a/packages/codemirror-lsp-client/src/client/codec/demuxer.ts +++ b/packages/codemirror-lsp-client/src/client/codec/demuxer.ts @@ -26,7 +26,7 @@ export default class StreamDemuxer extends Queue { private async start(): Promise { let contentLength: null | number = null - let buffer = new Uint8Array() + let buffer: Uint8Array = new Uint8Array() for await (const bytes of this) { buffer = Bytes.append(Uint8Array, buffer, bytes) diff --git a/packages/codemirror-lsp-client/src/client/codec/queue.ts b/packages/codemirror-lsp-client/src/client/codec/queue.ts index 8ac172845..36da815f7 100644 --- a/packages/codemirror-lsp-client/src/client/codec/queue.ts +++ b/packages/codemirror-lsp-client/src/client/codec/queue.ts @@ -95,6 +95,10 @@ export default class Queue return this } + [Symbol.asyncDispose](): Promise { + return this.close() + } + get locked(): boolean { return this.#stream.locked } diff --git a/packages/codemirror-lsp-client/yarn.lock b/packages/codemirror-lsp-client/yarn.lock index 7ed603f44..134661026 100644 --- a/packages/codemirror-lsp-client/yarn.lock +++ b/packages/codemirror-lsp-client/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@codemirror/autocomplete@^6.16.3": - version "6.16.3" - resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.16.3.tgz#04d5a4e4e44ccae1ba525d47db53a5479bf46338" - integrity sha512-Vl/tIeRVVUCRDuOG48lttBasNQu8usGgXQawBXI7WJAiUDSFOfzflmEsZFZo48mAvAaa4FZ/4/yLLxFtdJaKYA== +"@codemirror/autocomplete@6.17.0": + version "6.17.0" + resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.17.0.tgz#24ff5fc37fd91f6439df6f4ff9c8e910cde1b053" + integrity sha512-fdfj6e6ZxZf8yrkMHUSJJir7OJkHkZKaOZGzLWIYp2PZ3jd+d+UjG8zVPqJF6d3bKxkhvXTPan/UZ1t7Bqm0gA== dependencies: "@codemirror/language" "^6.0.0" "@codemirror/state" "^6.0.0" @@ -182,10 +182,10 @@ tslib@^2.3.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== -typescript@^5.5.2: - version "5.5.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.2.tgz#c26f023cb0054e657ce04f72583ea2d85f8d0507" - integrity sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew== +typescript@^5.7.2: + version "5.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" + integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== undici-types@~5.26.4: version "5.26.5" diff --git a/playwright.ci.config.ts b/playwright.ci.config.ts deleted file mode 100644 index 8cdfdca31..000000000 --- a/playwright.ci.config.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { defineConfig, devices } from '@playwright/test' - -/** - * See https://playwright.dev/docs/test-configuration. - */ -export default defineConfig({ - timeout: 120_000, // override the default 30s timeout - testDir: './e2e/playwright', - /* Run tests in files in parallel */ - fullyParallel: true, - /* Fail the build on CI if you accidentally left test.only in the source code. */ - forbidOnly: true, - /* Do not retry */ - retries: 0, - /* Different amount of parallelism on CI and local. */ - workers: 1, - /* Reporter to use. See https://playwright.dev/docs/test-reporters */ - reporter: [ - ['dot'], - ['list'], - ['json', { outputFile: './test-results/report.json' }], - ['html'], - ], - /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ - use: { - /* Base URL to use in actions like `await page.goto('/')`. */ - baseURL: 'http://localhost:3000', - - /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ - trace: 'retain-on-failure', - actionTimeout: 15_000, - screenshot: 'only-on-failure', - }, - - /* Configure projects for major browsers */ - projects: [ - { - name: 'Google Chrome', - use: { - ...devices['Desktop Chrome'], - channel: 'chrome', - contextOptions: { - /* Chromium is the only one with these permission types */ - permissions: ['clipboard-write', 'clipboard-read'], - }, - }, // or 'chrome-beta' - }, - { - name: 'webkit', - use: { ...devices['Desktop Safari'] }, - }, - ], - - webServer: { - command: 'yarn start', - reuseExistingServer: false, - }, -}) diff --git a/playwright.electron.config.ts b/playwright.electron.config.ts index 2dae6d8bb..9814f10eb 100644 --- a/playwright.electron.config.ts +++ b/playwright.electron.config.ts @@ -13,7 +13,7 @@ export default defineConfig({ /* Do not retry */ retries: 0, /* Different amount of parallelism on CI and local. */ - workers: 1, + workers: 8, /* Reporter to use. See https://playwright.dev/docs/test-reporters */ reporter: [ ['dot'], diff --git a/public/announce_release.py b/public/announce_release.py index f023cf956..e05db76e9 100644 --- a/public/announce_release.py +++ b/public/announce_release.py @@ -1,6 +1,7 @@ import re import os import requests +import textwrap webhook_url = os.getenv('DISCORD_WEBHOOK_URL') release_version = os.getenv('RELEASE_VERSION') @@ -25,11 +26,11 @@ if len(modified_release_body) > max_length: # Message to send to Discord data = { - "content": - f''' + "content": textwrap.dedent(f''' **{release_version}** is now available! Check out the latest features and improvements here: + {modified_release_body} - ''', + '''), "username": "Modeling App Release Updates", "avatar_url": "https://raw.githubusercontent.com/KittyCAD/modeling-app/main/public/discord-avatar.png" } diff --git a/public/kcl-samples-manifest-fallback.json b/public/kcl-samples-manifest-fallback.json index 5731b173b..aa3b14e74 100644 --- a/public/kcl-samples-manifest-fallback.json +++ b/public/kcl-samples-manifest-fallback.json @@ -34,6 +34,11 @@ "title": "Car Wheel Assembly", "description": "A car wheel assembly with a rotor, tire, and lug nuts." }, + { + "file": "dodecahedron.kcl", + "title": "Hollow Dodecahedron", + "description": "A regular dodecahedron or pentagonal dodecahedron is a dodecahedron composed of regular pentagonal faces, three meeting at each vertex. This example shows constructing the individual faces of the dodecahedron and extruding inwards." + }, { "file": "enclosure.kcl", "title": "Enclosure", @@ -54,6 +59,11 @@ "title": "A mounting bracket for the Focusrite Scarlett Solo audio interface", "description": "This is a bracket that holds an audio device underneath a desk or shelf. The audio device has dimensions of 144mm wide, 80mm length and 45mm depth with fillets of 6mm. This mounting bracket is designed to be 3D printed with PLA material" }, + { + "file": "food-service-spatula.kcl", + "title": "Food Service Spatula", + "description": "Use these spatulas for mixing, flipping, and scraping." + }, { "file": "french-press.kcl", "title": "French Press", @@ -61,7 +71,7 @@ }, { "file": "gear.kcl", - "title": "Gear", + "title": "Spur Gear", "description": "A rotating machine part having cut teeth or, in the case of a cogwheel, inserted teeth (called cogs), which mesh with another toothed part to transmit torque. Geared devices can change the speed, torque, and direction of a power source. The two elements that define a gear are its circular shape and the teeth that are integrated into its outer edge, which are designed to fit into the teeth of another gear." }, { @@ -74,6 +84,11 @@ "title": "Hex nut", "description": "A hex nut is a type of fastener with a threaded hole and a hexagonal outer shape, used in a wide variety of applications to secure parts together. The hexagonal shape allows for a greater torque to be applied with wrenches or tools, making it one of the most common nut types in hardware." }, + { + "file": "i-beam.kcl", + "title": "I-beam", + "description": "A structural metal beam with an I shaped cross section. Often used in construction" + }, { "file": "kitt.kcl", "title": "Kitt", @@ -109,6 +124,11 @@ "title": "Pipe and Flange Assembly", "description": "A crucial component in various piping systems, designed to facilitate the connection, disconnection, and access to piping for inspection, cleaning, and modifications. This assembly combines pipes (long cylindrical conduits) with flanges (plate-like fittings) to create a secure yet detachable joint." }, + { + "file": "pipe-with-bend.kcl", + "title": "Pipe with bend", + "description": "A tubular section or hollow cylinder, usually but not necessarily of circular cross-section, used mainly to convey substances that can flow." + }, { "file": "poopy-shoe.kcl", "title": "Poopy Shoe", diff --git a/release-notes.md b/release-notes.md new file mode 100644 index 000000000..d203594ca --- /dev/null +++ b/release-notes.md @@ -0,0 +1,7 @@ +Updater-test dummy notes: + +### Dummy +- item 1 +- item 2 + +Also, this is a [link](https://zoo.dev). diff --git a/scripts/flip-files-to-nightly.sh b/scripts/flip-files-to-nightly.sh new file mode 100755 index 000000000..7ed512e01 --- /dev/null +++ b/scripts/flip-files-to-nightly.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +export VERSION=$(date +'%-y.%-m.%-d') +export COMMIT=$(git rev-parse --short HEAD) + +# package.json +yarn files:set-version +PACKAGE=$(jq '.productName="Zoo Modeling App (Nightly)" | .name="zoo-modeling-app-nightly"' package.json --indent 2) +echo "$PACKAGE" > package.json + +# electron-builder.yml +yq -i '.publish[0].url = "https://dl.zoo.dev/releases/modeling-app/nightly"' electron-builder.yml +yq -i '.appId = "dev.zoo.modeling-app-nightly"' electron-builder.yml + +# Release notes +echo "Nightly build $VERSION (commit $COMMIT)" > release-notes.md + +# icons +cp assets/icon-nightly.png assets/icon.png +cp assets/icon-nightly.ico assets/icon.ico diff --git a/scripts/get-nightly-changelog.sh b/scripts/get-nightly-changelog.sh new file mode 100755 index 000000000..c599f4df8 --- /dev/null +++ b/scripts/get-nightly-changelog.sh @@ -0,0 +1,5 @@ +#!/bin/bash +echo "## What's Changed" +git log ${PREVIOUS_TAG}..HEAD --oneline --pretty=format:%s | grep -v Bump | awk '{print "* "toupper(substr($0,0,1))substr($0,2)}' +echo "" +echo "**Full Changelog**: https://github.com/KittyCAD/modeling-app/compare/${PREVIOUS_TAG}...${TAG}" diff --git a/scripts/invalidate-files-bucket.sh b/scripts/invalidate-files-bucket.sh new file mode 100755 index 000000000..1be90b8e8 --- /dev/null +++ b/scripts/invalidate-files-bucket.sh @@ -0,0 +1,11 @@ +#!/bin/bash +base_dir="/releases/modeling-app" +if [[ $1 = "--nightly" ]]; then + base_dir="/releases/modeling-app/nightly" +fi + +echo "Invalidating json and yml files at $base_dir in the download bucket" +gcloud compute url-maps invalidate-cdn-cache dl-url-map --path="$base_dir/last_download.json" --async +gcloud compute url-maps invalidate-cdn-cache dl-url-map --path="$base_dir/latest-linux-arm64.yml" --async +gcloud compute url-maps invalidate-cdn-cache dl-url-map --path="$base_dir/latest-mac.yml" --async +gcloud compute url-maps invalidate-cdn-cache dl-url-map --path="$base_dir/latest.yml" --async diff --git a/scripts/semantic-release.sh b/scripts/semantic-release.sh new file mode 100755 index 000000000..085989ef9 --- /dev/null +++ b/scripts/semantic-release.sh @@ -0,0 +1,43 @@ +# Requires access to an environment variable GH_TOKEN +# If you are in the path of the git repository the gh release list will automatically point to that git repo +# aka cd /some/path/modeling-app +# $ gh release list +# Get the latest semver tag from git +latest_tag=$(gh release list --json name,isLatest --jq '.[] | select(.isLatest)|.name') + +# Function to bump version numbers +bump_version() { + local version=$1 + local bump_type=$2 + local major=$(echo $version | cut -d '.' -f 1 | sed 's/v//') + local minor=$(echo $version | cut -d '.' -f 2) + local patch=$(echo $version | cut -d '.' -f 3) + + case "$bump_type" in + major) + major=$((major + 1)) + minor=0 + patch=0 + ;; + minor) + minor=$((minor + 1)) + patch=0 + ;; + *) + patch=$((patch + 1)) + ;; + esac + + echo "v${major}.${minor}.${patch}" +} + +# Determine the type of bump based on the argument +bump_type=${1:-minor} + +# Bump the version +new_version=$(bump_version $latest_tag $bump_type) + +# Print the new semver tag +# Example output v0.27.1 +# Yes it will include the v at the start +echo $new_version diff --git a/scripts/set-files-notes.sh b/scripts/set-files-notes.sh new file mode 100755 index 000000000..8b1daa9bf --- /dev/null +++ b/scripts/set-files-notes.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +yq -i '.releaseNotes = strenv(NOTES)' out/latest-linux-arm64.yml +yq -i '.releaseNotes = strenv(NOTES)' out/latest-linux.yml +yq -i '.releaseNotes = strenv(NOTES)' out/latest-mac.yml +yq -i '.releaseNotes = strenv(NOTES)' out/latest.yml + +NEW_JSON=`jq --arg n "$NOTES" '.notes=$n' out/last_download.json --indent 2` +echo "$NEW_JSON" > out/last_download.json diff --git a/sign-win.js b/scripts/sign-win.js similarity index 84% rename from sign-win.js rename to scripts/sign-win.js index b7280ed03..09e3666d6 100644 --- a/sign-win.js +++ b/scripts/sign-win.js @@ -24,8 +24,7 @@ exports.default = async (configuration) => { try { execSync( - `smctl sign --fingerprint="${ - process.env.WINDOWS_CERTIFICATE_THUMBPRINT + `smctl sign --fingerprint="${process.env.WINDOWS_CERTIFICATE_THUMBPRINT }" --input "${String(configuration.path)}"`, { stdio: 'inherit', @@ -33,6 +32,6 @@ exports.default = async (configuration) => { ) console.log('Signing using signWin.js script: successful') } catch (error) { - console.error('Signing using signWin.js script: failed:', error) + throw new Error('Signing using signWin.js script: failed:', error) } } diff --git a/src/App.tsx b/src/App.tsx index 558ee67ef..e0beee00d 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -22,6 +22,10 @@ import Gizmo from 'components/Gizmo' import { CoreDumpManager } from 'lib/coredump' import { UnitsMenu } from 'components/UnitsMenu' import { CameraProjectionToggle } from 'components/CameraProjectionToggle' +import { maybeWriteToDisk } from 'lib/telemetry' +maybeWriteToDisk() + .then(() => {}) + .catch(() => {}) export function App() { const { project, file } = useLoaderData() as IndexLoaderData diff --git a/src/Router.tsx b/src/Router.tsx index 665e1bda6..82d42762e 100644 --- a/src/Router.tsx +++ b/src/Router.tsx @@ -8,6 +8,7 @@ import { } from 'react-router-dom' import { ErrorPage } from './components/ErrorPage' import { Settings } from './routes/Settings' +import { Telemetry } from './routes/Telemetry' import Onboarding, { onboardingRoutes } from './routes/Onboarding' import SignIn from './routes/SignIn' import { Auth } from './Auth' @@ -28,6 +29,7 @@ import { homeLoader, onboardingRedirectLoader, settingsLoader, + telemetryLoader, } from 'lib/routeLoaders' import { CommandBarProvider } from 'components/CommandBar/CommandBarProvider' import SettingsAuthProvider from 'components/SettingsAuthProvider' @@ -43,6 +45,8 @@ import { coreDump } from 'lang/wasm' import { useMemo } from 'react' import { AppStateProvider } from 'AppState' import { reportRejection } from 'lib/trap' +import { RouteProvider } from 'components/RouteProvider' +import { ProjectsContextProvider } from 'components/ProjectsContextProvider' const createRouter = isDesktop() ? createHashRouter : createBrowserRouter @@ -55,17 +59,21 @@ const router = createRouter([ * inefficient re-renders, use the react profiler to see. */ element: ( - - - - - - - - - - - + + + + + + + + + + + + + + + ), errorElement: , @@ -121,6 +129,16 @@ const router = createRouter([ }, ], }, + { + id: PATHS.FILE + 'TELEMETRY', + loader: telemetryLoader, + children: [ + { + path: makeUrlPathRelative(PATHS.TELEMETRY), + element: , + }, + ], + }, ], }, { @@ -146,6 +164,11 @@ const router = createRouter([ loader: settingsLoader, element: , }, + { + path: makeUrlPathRelative(PATHS.TELEMETRY), + loader: telemetryLoader, + element: , + }, ], }, { diff --git a/src/Toolbar.tsx b/src/Toolbar.tsx index 540bc9647..e6e680721 100644 --- a/src/Toolbar.tsx +++ b/src/Toolbar.tsx @@ -38,9 +38,8 @@ export function Toolbar({ '!border-transparent hover:!border-chalkboard-20 dark:enabled:hover:!border-primary pressed:!border-primary ui-open:!border-primary' const sketchPathId = useMemo(() => { - if (!isSingleCursorInPipe(context.selectionRanges, kclManager.ast)) { + if (!isSingleCursorInPipe(context.selectionRanges, kclManager.ast)) return false - } return isCursorInSketchCommandRange( engineCommandManager.artifactGraph, context.selectionRanges @@ -100,6 +99,11 @@ export function Toolbar({ function resolveItemConfig( maybeIconConfig: ToolbarItem ): ToolbarItemResolved { + const isDisabled = + disableAllButtons || + maybeIconConfig.status !== 'available' || + maybeIconConfig.disabled?.(state) === true + return { ...maybeIconConfig, title: @@ -113,10 +117,11 @@ export function Toolbar({ typeof maybeIconConfig.hotkey === 'string' ? maybeIconConfig.hotkey : maybeIconConfig.hotkey?.(state), - disabled: - disableAllButtons || - maybeIconConfig.status !== 'available' || - maybeIconConfig.disabled?.(state) === true, + disabled: isDisabled, + disabledReason: + typeof maybeIconConfig.disabledReason === 'function' + ? maybeIconConfig.disabledReason(state) + : maybeIconConfig.disabledReason, disableHotkey: maybeIconConfig.disableHotkey?.(state), status: maybeIconConfig.status, } @@ -135,6 +140,7 @@ export function Toolbar({ > {/* A menu item will either be a vertical line break, a button with a dropdown, or a single button */} {currentModeItems.map((maybeIconConfig, i) => { + // Vertical Line Break if (maybeIconConfig === 'break') { return (
) } else if (Array.isArray(maybeIconConfig)) { + // A button with a dropdown return ( { @@ -336,6 +346,17 @@ const ToolbarItemTooltip = memo(function ToolbarItemContents({ )}

{itemConfig.description}

+ {/* Add disabled reason if item is disabled */} + {itemConfig.disabled && itemConfig.disabledReason && ( + <> +
+

+ {typeof itemConfig.disabledReason === 'function' + ? itemConfig.disabledReason(state) + : itemConfig.disabledReason} +

+ + )} {itemConfig.links.length > 0 && ( <>
diff --git a/src/clientSideScene/CameraControls.ts b/src/clientSideScene/CameraControls.ts index fdc83ab70..0294bf77a 100644 --- a/src/clientSideScene/CameraControls.ts +++ b/src/clientSideScene/CameraControls.ts @@ -105,7 +105,7 @@ export class CameraControls { pendingZoom: number | null = null pendingRotation: Vector2 | null = null pendingPan: Vector2 | null = null - interactionGuards: MouseGuard = cameraMouseDragGuards.KittyCAD + interactionGuards: MouseGuard = cameraMouseDragGuards.Zoo isFovAnimationInProgress = false perspectiveFovBeforeOrtho = 45 get isPerspective() { @@ -155,7 +155,6 @@ export class CameraControls { this.camera.zoom = camProps.zoom || 1 } this.camera.updateProjectionMatrix() - console.log('doing this thing', camProps) this.update(true) } @@ -273,14 +272,26 @@ export class CameraControls { camSettings.center.y, camSettings.center.z ) - const quat = new Quaternion( + const orientation = new Quaternion( camSettings.orientation.x, camSettings.orientation.y, camSettings.orientation.z, camSettings.orientation.w ).invert() - this.camera.up.copy(new Vector3(0, 1, 0).applyQuaternion(quat)) + const newUp = new Vector3( + camSettings.up.x, + camSettings.up.y, + camSettings.up.z + ) + this.camera.quaternion.set( + orientation.x, + orientation.y, + orientation.z, + orientation.w + ) + this.camera.up.copy(newUp) + this.camera.updateProjectionMatrix() if (this.camera instanceof PerspectiveCamera && camSettings.ortho) { this.useOrthographicCamera() } @@ -1164,7 +1175,7 @@ export class CameraControls { this.camera.updateProjectionMatrix() } - if (this.syncDirection === 'clientToEngine' || forceUpdate) + if (this.syncDirection === 'clientToEngine' || forceUpdate) { this.throttledUpdateEngineCamera({ quaternion: this.camera.quaternion, position: this.camera.position, @@ -1172,6 +1183,7 @@ export class CameraControls { isPerspective: this.isPerspective, target: this.target, }) + } this.deferReactUpdate(this.reactCameraProperties) Object.values(this._camChangeCallbacks).forEach((cb) => cb()) } diff --git a/src/clientSideScene/ClientSideSceneComp.tsx b/src/clientSideScene/ClientSideSceneComp.tsx index 7a545cce8..6d2bfebd9 100644 --- a/src/clientSideScene/ClientSideSceneComp.tsx +++ b/src/clientSideScene/ClientSideSceneComp.tsx @@ -29,6 +29,9 @@ import { Expr, parse, recast, + defaultSourceRange, + resultIsOk, + ProgramMemory, } from 'lang/wasm' import { CustomIcon, CustomIconName } from 'components/CustomIcon' import { ConstrainInfo } from 'lang/std/stdTypes' @@ -44,6 +47,7 @@ import { import { ActionButton } from 'components/ActionButton' import { err, reportRejection, trap } from 'lib/trap' import { useCommandsContext } from 'hooks/useCommandsContext' +import { Node } from 'wasm-lib/kcl/bindings/Node' function useShouldHideScene(): { hideClient: boolean; hideServer: boolean } { const [isCamMoving, setIsCamMoving] = useState(false) @@ -170,8 +174,13 @@ export const ClientSideScene = ({ const Overlays = () => { const { context } = useModelingContext() if (context.mouseState.type === 'isDragging') return null + // Set a large zIndex, the overlay for hover dropdown menu on line segments needs to render + // over the length labels on the line segments return ( -
+
{Object.entries(context.segmentOverlays) .filter((a) => a[1].visible) .map(([pathToNodeString, overlay], index) => { @@ -201,12 +210,20 @@ const Overlay = ({ let xAlignment = overlay.angle < 0 ? '0%' : '-100%' let yAlignment = overlay.angle < -90 || overlay.angle >= 90 ? '0%' : '-100%' - const _node1 = getNodeFromPath( + // It's possible for the pathToNode to request a newer AST node + // than what's available in the AST at the moment of query. + // It eventually settles on being updated. + const _node1 = getNodeFromPath>( kclManager.ast, overlay.pathToNode, 'CallExpression' ) - if (err(_node1)) return + + // For that reason, to prevent console noise, we do not use err here. + if (_node1 instanceof Error) { + console.warn('ast older than pathToNode, not fatal, eventually settles', '') + return + } const callExpression = _node1.node const constraints = getConstraintInfo( @@ -381,7 +398,7 @@ export async function deleteSegment({ pathToNode: PathToNode sketchDetails: SketchDetails | null }) { - let modifiedAst: Program | Error = kclManager.ast + let modifiedAst: Node | Error = kclManager.ast const dependentRanges = findUsesOfTagInPipe(modifiedAst, pathToNode) const shouldContinueSegDelete = dependentRanges.length @@ -403,14 +420,15 @@ export async function deleteSegment({ if (err(modifiedAst)) return Promise.reject(modifiedAst) const newCode = recast(modifiedAst) - modifiedAst = parse(newCode) - if (err(modifiedAst)) return Promise.reject(modifiedAst) + const pResult = parse(newCode) + if (err(pResult) || !resultIsOk(pResult)) return Promise.reject(pResult) + modifiedAst = pResult.program const testExecute = await executeAst({ ast: modifiedAst, - idGenerator: kclManager.execState.idGenerator, - useFakeExecutor: true, engineCommandManager: engineCommandManager, + // We make sure to send an empty program memory to denote we mean mock mode. + programMemoryOverride: ProgramMemory.empty(), }) if (testExecute.errors.length) { toast.error('Segment tag used outside of current Sketch. Could not delete.') @@ -492,7 +510,8 @@ const ConstraintSymbol = ({ constrainInfo: ConstrainInfo verticalPosition: 'top' | 'bottom' }) => { - const { context, send } = useModelingContext() + const { commandBarSend } = useCommandsContext() + const { context } = useModelingContext() const varNameMap: { [key in ConstrainInfo['type']]: { varName: string @@ -581,7 +600,9 @@ const ConstraintSymbol = ({ if (err(_node)) return const node = _node.node - const range: SourceRange = node ? [node.start, node.end] : [0, 0] + const range: SourceRange = node + ? [node.start, node.end, true] + : defaultSourceRange() if (_type === 'intersectionTag') return null @@ -603,25 +624,34 @@ const ConstraintSymbol = ({ editorManager.setHighlightRange([range]) }} onMouseLeave={() => { - editorManager.setHighlightRange([[0, 0]]) + editorManager.setHighlightRange([defaultSourceRange()]) }} // disabled={isConstrained || !convertToVarEnabled} // disabled={implicitDesc} TODO why does this change styles that are hard to override? onClick={toSync(async () => { if (!isConstrained) { - send({ - type: 'Convert to variable', + commandBarSend({ + type: 'Find and select command', data: { - pathToNode, - variableName: varName, + name: 'Constrain with named value', + groupId: 'modeling', + argDefaultValues: { + currentValue: { + pathToNode, + variableName: varName, + valueText: value, + }, + }, }, }) } else if (isConstrained) { try { - const parsed = parse(recast(kclManager.ast)) - if (trap(parsed)) return Promise.reject(parsed) + const pResult = parse(recast(kclManager.ast)) + if (trap(pResult) || !resultIsOk(pResult)) + return Promise.reject(pResult) + const _node1 = getNodeFromPath( - parsed, + pResult.program!, pathToNode, 'CallExpression', true @@ -636,10 +666,16 @@ const ConstraintSymbol = ({ kclManager.ast, kclManager.programMemory ) + if (!transform) return const { modifiedAst } = transform - // eslint-disable-next-line @typescript-eslint/no-floating-promises - kclManager.updateAst(modifiedAst, true) + + await kclManager.updateAst(modifiedAst, true) + + // Code editor will be updated in the modelingMachine. + const newCode = recast(modifiedAst) + if (err(newCode)) return + await codeManager.updateCodeEditor(newCode) } catch (e) { console.log('error', e) } diff --git a/src/clientSideScene/sceneEntities.ts b/src/clientSideScene/sceneEntities.ts index 0fd371751..8ea5f93cd 100644 --- a/src/clientSideScene/sceneEntities.ts +++ b/src/clientSideScene/sceneEntities.ts @@ -3,6 +3,9 @@ import { DoubleSide, Group, Intersection, + Line, + LineDashedMaterial, + BufferGeometry, Mesh, MeshBasicMaterial, Object3D, @@ -13,12 +16,16 @@ import { Points, Quaternion, Scene, + SphereGeometry, Vector2, Vector3, } from 'three' import { + ANGLE_SNAP_THRESHOLD_DEGREES, ARROWHEAD, AXIS_GROUP, + DRAFT_POINT, + DRAFT_POINT_GROUP, getSceneScale, INTERSECTION_PLANE_LAYER, OnClickCallbackArgs, @@ -28,6 +35,8 @@ import { SKETCH_LAYER, X_AXIS, Y_AXIS, + CIRCLE_3_POINT_DRAFT_POINT, + CIRCLE_3_POINT_DRAFT_CIRCLE, } from './sceneInfra' import { isQuaternionVertical, quaternionFromUpNForward } from './helpers' import { @@ -44,6 +53,11 @@ import { VariableDeclaration, VariableDeclarator, sketchFromKclValue, + sketchFromKclValueOptional, + defaultSourceRange, + sourceRangeFromRust, + resultIsOk, + SourceRange, } from 'lang/wasm' import { engineCommandManager, @@ -53,9 +67,10 @@ import { editorManager, } from 'lib/singletons' import { getNodeFromPath, getNodePathFromSourceRange } from 'lang/queryAst' -import { executeAst } from 'lang/langHelpers' +import { executeAst, ToolTip } from 'lang/langHelpers' import { createProfileStartHandle, + createArcGeometry, SegmentUtils, segmentUtils, } from './segments' @@ -86,12 +101,16 @@ import { EngineCommandManager } from 'lang/std/engineConnection' import { getRectangleCallExpressions, updateRectangleSketch, + updateCenterRectangleSketch, } from 'lib/rectangleTool' import { getThemeColorForThreeJs, Themes } from 'lib/theme' -import { err, reportRejection, trap } from 'lib/trap' +import { err, Reason, reportRejection, trap } from 'lib/trap' import { CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer' import { Point3d } from 'wasm-lib/kcl/bindings/Point3d' import { SegmentInputs } from 'lang/std/stdTypes' +import { Node } from 'wasm-lib/kcl/bindings/Node' +import { radToDeg } from 'three/src/math/MathUtils' +import { getArtifactFromRange, codeRefFromRange } from 'lang/std/artifactGraph' type DraftSegment = 'line' | 'tangentialArcTo' @@ -134,12 +153,14 @@ export class SceneEntities { activeSegments: { [key: string]: Group } = {} intersectionPlane: Mesh | null = null axisGroup: Group | null = null + draftPointGroups: Group[] = [] currentSketchQuaternion: Quaternion | null = null constructor(engineCommandManager: EngineCommandManager) { this.engineCommandManager = engineCommandManager this.scene = sceneInfra?.scene sceneInfra?.camControls.subscribeToCamChange(this.onCamChange) window.addEventListener('resize', this.onWindowResize) + this.createIntersectionPlane() } onWindowResize = () => { @@ -217,7 +238,6 @@ export class SceneEntities { createIntersectionPlane() { if (sceneInfra.scene.getObjectByName(RAYCASTABLE_PLANE)) { - // this.removeIntersectionPlane() console.warn('createIntersectionPlane called when it already exists') return } @@ -309,9 +329,27 @@ export class SceneEntities { sketchPosition && this.axisGroup.position.set(...sketchPosition) this.scene.add(this.axisGroup) } - removeIntersectionPlane() { - const intersectionPlane = this.scene.getObjectByName(RAYCASTABLE_PLANE) - if (intersectionPlane) this.scene.remove(intersectionPlane) + getDraftPoint() { + return this.scene.getObjectByName(DRAFT_POINT) + } + createDraftPoint({ point, group }: { point: Vector2; group: Group }) { + const dummy = new Mesh() + dummy.position.set(0, 0, 0) + const scale = sceneInfra.getClientSceneScaleFactor(dummy) + + const draftPoint = createProfileStartHandle({ + isDraft: true, + from: [point.x, point.y], + scale, + theme: sceneInfra._theme, + }) + draftPoint.layers.set(SKETCH_LAYER) + group.add(draftPoint) + } + + removeDraftPoint() { + const draftPoint = this.getDraftPoint() + if (draftPoint) draftPoint.removeFromParent() } setupNoPointsListener({ @@ -321,22 +359,79 @@ export class SceneEntities { sketchDetails: SketchDetails afterClick: (args: OnClickCallbackArgs) => void }) { - // Create a THREEjs plane to raycast clicks onto - this.createIntersectionPlane() + // TODO: Consolidate shared logic between this and setupSketch + // Which should just fire when the sketch mode is entered, + // instead of in these two separate XState states. + + const draftPointGroup = new Group() + this.draftPointGroups.push(draftPointGroup) + draftPointGroup.name = DRAFT_POINT_GROUP + sketchDetails.origin && + draftPointGroup.position.set(...sketchDetails.origin) + if (!(sketchDetails.yAxis && sketchDetails)) { + console.error('No sketch quaternion or sketch details found') + return + } + this.currentSketchQuaternion = quaternionFromUpNForward( + new Vector3(...sketchDetails.yAxis), + new Vector3(...sketchDetails.zAxis) + ) + draftPointGroup.setRotationFromQuaternion(this.currentSketchQuaternion) + this.scene.add(draftPointGroup) + const quaternion = quaternionFromUpNForward( new Vector3(...sketchDetails.yAxis), new Vector3(...sketchDetails.zAxis) ) // Position the click raycast plane - if (this.intersectionPlane) { - this.intersectionPlane.setRotationFromQuaternion(quaternion) - this.intersectionPlane.position.copy( - new Vector3(...(sketchDetails?.origin || [0, 0, 0])) - ) - } + this.intersectionPlane!.setRotationFromQuaternion(quaternion) + this.intersectionPlane!.position.copy( + new Vector3(...(sketchDetails?.origin || [0, 0, 0])) + ) sceneInfra.setCallbacks({ + onMove: (args) => { + if (!args.intersects.length) return + const axisIntersection = args.intersects.find( + (sceneObject) => + sceneObject.object.name === X_AXIS || + sceneObject.object.name === Y_AXIS + ) + if (!axisIntersection) return + const { intersectionPoint } = args + // We're hovering over an axis, so we should show a draft point + const snappedPoint = intersectionPoint.twoD.clone() + if (axisIntersection.object.name === X_AXIS) { + snappedPoint.setComponent(1, 0) + } else { + snappedPoint.setComponent(0, 0) + } + // Either create a new one or update the existing one + const draftPoint = this.getDraftPoint() + + if (!draftPoint) { + this.createDraftPoint({ + point: snappedPoint, + group: draftPointGroup, + }) + } else { + // Ignore if there are huge jumps in the mouse position, + // that is likely a strange behavior + if ( + draftPoint.position.distanceTo( + new Vector3(snappedPoint.x, snappedPoint.y, 0) + ) > 100 + ) { + return + } + draftPoint.position.set(snappedPoint.x, snappedPoint.y, 0) + } + }, + onMouseLeave: () => { + this.removeDraftPoint() + }, onClick: async (args) => { + this.removeDraftPoint() if (!args) return // If there is a valid camera interaction that matches, do that instead const interaction = sceneInfra.camControls.getInteractionType( @@ -346,17 +441,33 @@ export class SceneEntities { if (args.mouseEvent.which !== 1) return const { intersectionPoint } = args if (!intersectionPoint?.twoD || !sketchDetails?.sketchPathToNode) return + + // Snap to either or both axes + // if the click intersects their meshes + const yAxisIntersection = args.intersects.find( + (sceneObject) => sceneObject.object.name === Y_AXIS + ) + const xAxisIntersection = args.intersects.find( + (sceneObject) => sceneObject.object.name === X_AXIS + ) + + const snappedClickPoint = { + x: yAxisIntersection ? 0 : intersectionPoint.twoD.x, + y: xAxisIntersection ? 0 : intersectionPoint.twoD.y, + } + const addStartProfileAtRes = addStartProfileAt( kclManager.ast, sketchDetails.sketchPathToNode, - [intersectionPoint.twoD.x, intersectionPoint.twoD.y] + [snappedClickPoint.x, snappedClickPoint.y] ) if (trap(addStartProfileAtRes)) return const { modifiedAst } = addStartProfileAtRes await kclManager.updateAst(modifiedAst, false) - this.removeIntersectionPlane() + + this.scene.remove(draftPointGroup) // Now perform the caller-specified action afterClick(args) @@ -374,20 +485,18 @@ export class SceneEntities { selectionRanges, }: { sketchPathToNode: PathToNode - maybeModdedAst: Program + maybeModdedAst: Node draftExpressionsIndices?: { start: number; end: number } forward: [number, number, number] up: [number, number, number] position?: [number, number, number] selectionRanges?: Selections }): Promise<{ - truncatedAst: Program + truncatedAst: Node programMemoryOverride: ProgramMemory sketch: Sketch variableDeclarationName: string }> { - this.createIntersectionPlane() - const prepared = this.prepareTruncatedMemoryAndAst( sketchPathToNode || [], maybeModdedAst @@ -398,10 +507,9 @@ export class SceneEntities { const { execState } = await executeAst({ ast: truncatedAst, - useFakeExecutor: true, engineCommandManager: this.engineCommandManager, + // We make sure to send an empty program memory to denote we mean mock mode. programMemoryOverride, - idGenerator: kclManager.execState.idGenerator, }) const programMemory = execState.memory const sketch = sketchFromPathToNode({ @@ -429,24 +537,20 @@ export class SceneEntities { const dummy = new Mesh() // TODO: When we actually have sketch positions and rotations we can use them here. dummy.position.set(0, 0, 0) - const orthoFactor = orthoScale(sceneInfra.camControls.camera) - const factor = - (sceneInfra.camControls.camera instanceof OrthographicCamera - ? orthoFactor - : perspScale(sceneInfra.camControls.camera, dummy)) / - sceneInfra._baseUnitMultiplier + const scale = sceneInfra.getClientSceneScaleFactor(dummy) const segPathToNode = getNodePathFromSourceRange( maybeModdedAst, - sketch.start.__geoMeta.sourceRange + sourceRangeFromRust(sketch.start.__geoMeta.sourceRange) ) if (sketch?.paths?.[0]?.type !== 'Circle') { const _profileStart = createProfileStartHandle({ from: sketch.start.from, id: sketch.start.__geoMeta.id, pathToNode: segPathToNode, - scale: factor, + scale, theme: sceneInfra._theme, + isDraft: false, }) _profileStart.layers.set(SKETCH_LAYER) _profileStart.traverse((child) => { @@ -459,7 +563,7 @@ export class SceneEntities { sketch.paths.forEach((segment, index) => { let segPathToNode = getNodePathFromSourceRange( maybeModdedAst, - segment.__geoMeta.sourceRange + sourceRangeFromRust(segment.__geoMeta.sourceRange) ) if ( draftExpressionsIndices && @@ -468,12 +572,12 @@ export class SceneEntities { const previousSegment = sketch.paths[index - 1] || sketch.start const previousSegmentPathToNode = getNodePathFromSourceRange( maybeModdedAst, - previousSegment.__geoMeta.sourceRange + sourceRangeFromRust(previousSegment.__geoMeta.sourceRange) ) const bodyIndex = previousSegmentPathToNode[1][0] segPathToNode = getNodePathFromSourceRange( truncatedAst, - segment.__geoMeta.sourceRange + sourceRangeFromRust(segment.__geoMeta.sourceRange) ) segPathToNode[1][0] = bodyIndex } @@ -481,18 +585,20 @@ export class SceneEntities { draftExpressionsIndices && index <= draftExpressionsIndices.end && index >= draftExpressionsIndices.start - const isSelected = selectionRanges?.codeBasedSelections.some( - (selection) => { - return isOverlap(selection.range, segment.__geoMeta.sourceRange) - } + const isSelected = selectionRanges?.graphSelections.some((selection) => + isOverlap( + selection?.codeRef?.range, + sourceRangeFromRust(segment.__geoMeta.sourceRange) + ) ) let seg: Group - const _node1 = getNodeFromPath( + const _node1 = getNodeFromPath>( maybeModdedAst, segPathToNode, 'CallExpression' ) + if (err(_node1)) return const callExpName = _node1.node?.callee?.name @@ -515,6 +621,15 @@ export class SceneEntities { from: segment.from, to: segment.to, } + + const startRange = _node1.node.start + const endRange = _node1.node.end + const sourceRange: SourceRange = [startRange, endRange, true] + const selection: Selections = computeSelectionFromSourceRangeAndAST( + sourceRange, + maybeModdedAst + ) + const result = initSegment({ prevSegment: sketch.paths[index - 1], callExpName, @@ -522,11 +637,12 @@ export class SceneEntities { id: segment.__geoMeta.id, pathToNode: segPathToNode, isDraftSegment, - scale: factor, + scale, texture: sceneInfra.extraSegmentTexture, theme: sceneInfra._theme, isSelected, sceneInfra, + selection, }) if (err(result)) return const { group: _group, updateOverlaysCallback } = result @@ -566,13 +682,11 @@ export class SceneEntities { } updateAstAndRejigSketch = async ( sketchPathToNode: PathToNode, - modifiedAst: Program | Error, + modifiedAst: Node, forward: [number, number, number], up: [number, number, number], origin: [number, number, number] ) => { - if (err(modifiedAst)) return modifiedAst - const nextAst = await kclManager.updateAst(modifiedAst, false) await this.tearDownSketch({ removeAxis: false }) sceneInfra.resetMouseListeners() @@ -591,7 +705,7 @@ export class SceneEntities { }) return nextAst } - setUpDraftSegment = async ( + setupDraftSegment = async ( sketchPathToNode: PathToNode, forward: [number, number, number], up: [number, number, number], @@ -607,8 +721,7 @@ export class SceneEntities { 'VariableDeclaration' ) if (trap(_node1)) return Promise.reject(_node1) - const variableDeclarationName = - _node1.node?.declarations?.[0]?.id?.name || '' + const variableDeclarationName = _node1.node?.declaration.id?.name || '' const sg = sketchFromKclValue( kclManager.programMemory.get(variableDeclarationName), @@ -630,8 +743,9 @@ export class SceneEntities { pathToNode: sketchPathToNode, }) if (trap(mod)) return Promise.reject(mod) - const modifiedAst = parse(recast(mod.modifiedAst)) - if (trap(modifiedAst)) return Promise.reject(modifiedAst) + const pResult = parse(recast(mod.modifiedAst)) + if (trap(pResult) || !resultIsOk(pResult)) return Promise.reject(pResult) + const modifiedAst = pResult.program const draftExpressionsIndices = { start: index, end: index } @@ -659,12 +773,14 @@ export class SceneEntities { const { intersectionPoint } = args let intersection2d = intersectionPoint?.twoD - const profileStart = args.intersects + const intersectsProfileStart = args.intersects .map(({ object }) => getParentGroup(object, [PROFILE_START])) .find((a) => a?.name === PROFILE_START) let modifiedAst - if (profileStart) { + + // Snapping logic for the profile start handle + if (intersectsProfileStart) { const lastSegment = sketch.paths.slice(-1)[0] modifiedAst = addCallExpressionsToPipe({ node: kclManager.ast, @@ -697,19 +813,58 @@ export class SceneEntities { }) if (trap(modifiedAst)) return Promise.reject(modifiedAst) } else if (intersection2d) { - const lastSegment = sketch.paths.slice(-1)[0] + const intersectsYAxis = args.intersects.find( + (sceneObject) => sceneObject.object.name === Y_AXIS + ) + const intersectsXAxis = args.intersects.find( + (sceneObject) => sceneObject.object.name === X_AXIS + ) + + const lastSegment = sketch.paths.slice(-1)[0] || sketch.start + const snappedPoint = { + x: intersectsYAxis ? 0 : intersection2d.x, + y: intersectsXAxis ? 0 : intersection2d.y, + } + // Get the angle between the previous segment (or sketch start)'s end and this one's + const angle = Math.atan2( + snappedPoint.y - lastSegment.to[1], + snappedPoint.x - lastSegment.to[0] + ) + + const isHorizontal = + radToDeg(Math.abs(angle)) < ANGLE_SNAP_THRESHOLD_DEGREES || + Math.abs(radToDeg(Math.abs(angle) - Math.PI)) < + ANGLE_SNAP_THRESHOLD_DEGREES + const isVertical = + Math.abs(radToDeg(Math.abs(angle) - Math.PI / 2)) < + ANGLE_SNAP_THRESHOLD_DEGREES + + let resolvedFunctionName: ToolTip = 'line' + + // This might need to become its own function if we want more + // case-based logic for different segment types + if (lastSegment.type === 'TangentialArcTo') { + resolvedFunctionName = 'tangentialArcTo' + } else if (isHorizontal) { + // If the angle between is 0 or 180 degrees (+/- the snapping angle), make the line an xLine + resolvedFunctionName = 'xLine' + } else if (isVertical) { + // If the angle between is 90 or 270 degrees (+/- the snapping angle), make the line a yLine + resolvedFunctionName = 'yLine' + } else if (snappedPoint.x === 0 || snappedPoint.y === 0) { + // We consider a point placed on axes or origin to be absolute + resolvedFunctionName = 'lineTo' + } + const tmp = addNewSketchLn({ node: kclManager.ast, programMemory: kclManager.programMemory, input: { type: 'straight-segment', from: [lastSegment.to[0], lastSegment.to[1]], - to: [intersection2d.x, intersection2d.y], + to: [snappedPoint.x, snappedPoint.y], }, - fnName: - lastSegment.type === 'TangentialArcTo' - ? 'tangentialArcTo' - : 'line', + fnName: resolvedFunctionName, pathToNode: sketchPathToNode, }) if (trap(tmp)) return Promise.reject(tmp) @@ -721,10 +876,11 @@ export class SceneEntities { } await kclManager.executeAstMock(modifiedAst) - if (profileStart) { + + if (intersectsProfileStart) { sceneInfra.modelingSend({ type: 'CancelSketch' }) } else { - await this.setUpDraftSegment( + await this.setupDraftSegment( sketchPathToNode, forward, up, @@ -732,6 +888,8 @@ export class SceneEntities { segmentName ) } + + await codeManager.updateEditorWithAstAndWriteToFile(modifiedAst) }, onMove: (args) => { this.onDragSegment({ @@ -763,10 +921,9 @@ export class SceneEntities { 'VariableDeclaration' ) if (trap(_node1)) return Promise.reject(_node1) - const variableDeclarationName = - _node1.node?.declarations?.[0]?.id?.name || '' - const startSketchOn = _node1.node?.declarations - const startSketchOnInit = startSketchOn?.[0]?.init + const variableDeclarationName = _node1.node?.declaration.id?.name || '' + const startSketchOn = _node1.node?.declaration + const startSketchOnInit = startSketchOn?.init const tags: [string, string, string] = [ findUniqueName(_ast, 'rectangleSegmentA'), @@ -774,14 +931,14 @@ export class SceneEntities { findUniqueName(_ast, 'rectangleSegmentC'), ] - startSketchOn[0].init = createPipeExpression([ + startSketchOn.init = createPipeExpression([ startSketchOnInit, ...getRectangleCallExpressions(rectangleOrigin, tags), ]) - let _recastAst = parse(recast(_ast)) - if (trap(_recastAst)) return Promise.reject(_recastAst) - _ast = _recastAst + const pResult = parse(recast(_ast)) + if (trap(pResult) || !resultIsOk(pResult)) return Promise.reject(pResult) + _ast = pResult.program const { programMemoryOverride, truncatedAst } = await this.setupSketch({ sketchPathToNode, @@ -804,7 +961,7 @@ export class SceneEntities { 'VariableDeclaration' ) if (trap(_node)) return Promise.reject(_node) - const sketchInit = _node.node?.declarations?.[0]?.init + const sketchInit = _node.node?.declaration.init const x = (args.intersectionPoint.twoD.x || 0) - rectangleOrigin[0] const y = (args.intersectionPoint.twoD.y || 0) - rectangleOrigin[1] @@ -815,10 +972,9 @@ export class SceneEntities { const { execState } = await executeAst({ ast: truncatedAst, - useFakeExecutor: true, engineCommandManager: this.engineCommandManager, + // We make sure to send an empty program memory to denote we mean mock mode. programMemoryOverride, - idGenerator: kclManager.execState.idGenerator, }) const programMemory = execState.memory this.sceneProgramMemory = programMemory @@ -854,25 +1010,199 @@ export class SceneEntities { 'VariableDeclaration' ) if (trap(_node)) return - const sketchInit = _node.node?.declarations?.[0]?.init + const sketchInit = _node.node?.declaration.init + + if (sketchInit.type !== 'PipeExpression') { + return + } + + updateRectangleSketch(sketchInit, x, y, tags[0]) + + const newCode = recast(_ast) + const pResult = parse(newCode) + if (trap(pResult) || !resultIsOk(pResult)) + return Promise.reject(pResult) + _ast = pResult.program + + // Update the primary AST and unequip the rectangle tool + await kclManager.executeAstMock(_ast) + sceneInfra.modelingSend({ type: 'Finish rectangle' }) + + // lee: I had this at the bottom of the function, but it's + // possible sketchFromKclValue "fails" when sketching on a face, + // and this couldn't wouldn't run. + await codeManager.updateEditorWithAstAndWriteToFile(_ast) + + const { execState } = await executeAst({ + ast: _ast, + engineCommandManager: this.engineCommandManager, + // We make sure to send an empty program memory to denote we mean mock mode. + programMemoryOverride, + }) + const programMemory = execState.memory + + // Prepare to update the THREEjs scene + this.sceneProgramMemory = programMemory + const sketch = sketchFromKclValue( + programMemory.get(variableDeclarationName), + variableDeclarationName + ) + if (err(sketch)) return + const sgPaths = sketch.paths + const orthoFactor = orthoScale(sceneInfra.camControls.camera) + + // Update the starting segment of the THREEjs scene + this.updateSegment(sketch.start, 0, 0, _ast, orthoFactor, sketch) + // Update the rest of the segments of the THREEjs scene + sgPaths.forEach((seg, index) => + this.updateSegment(seg, index, 0, _ast, orthoFactor, sketch) + ) + }, + }) + } + setupDraftCenterRectangle = async ( + sketchPathToNode: PathToNode, + forward: [number, number, number], + up: [number, number, number], + sketchOrigin: [number, number, number], + rectangleOrigin: [x: number, y: number] + ) => { + let _ast = structuredClone(kclManager.ast) + const _node1 = getNodeFromPath( + _ast, + sketchPathToNode || [], + 'VariableDeclaration' + ) + if (trap(_node1)) return Promise.reject(_node1) + + // startSketchOn already exists + const variableDeclarationName = _node1.node?.declaration.id?.name || '' + const startSketchOn = _node1.node?.declaration + const startSketchOnInit = startSketchOn?.init + + const tags: [string, string, string] = [ + findUniqueName(_ast, 'rectangleSegmentA'), + findUniqueName(_ast, 'rectangleSegmentB'), + findUniqueName(_ast, 'rectangleSegmentC'), + ] + + startSketchOn.init = createPipeExpression([ + startSketchOnInit, + ...getRectangleCallExpressions(rectangleOrigin, tags), + ]) + + const pResult = parse(recast(_ast)) + if (trap(pResult) || !resultIsOk(pResult)) return Promise.reject(pResult) + _ast = pResult.program + + const { programMemoryOverride, truncatedAst } = await this.setupSketch({ + sketchPathToNode, + forward, + up, + position: sketchOrigin, + maybeModdedAst: _ast, + draftExpressionsIndices: { start: 0, end: 3 }, + }) + + sceneInfra.setCallbacks({ + onMove: async (args) => { + // Update the width and height of the draft rectangle + const pathToNodeTwo = structuredClone(sketchPathToNode) + pathToNodeTwo[1][0] = 0 + + const _node = getNodeFromPath( + truncatedAst, + pathToNodeTwo || [], + 'VariableDeclaration' + ) + if (trap(_node)) return Promise.reject(_node) + const sketchInit = _node.node?.declaration.init + + const x = (args.intersectionPoint.twoD.x || 0) - rectangleOrigin[0] + const y = (args.intersectionPoint.twoD.y || 0) - rectangleOrigin[1] if (sketchInit.type === 'PipeExpression') { - updateRectangleSketch(sketchInit, x, y, tags[0]) + updateCenterRectangleSketch( + sketchInit, + x, + y, + tags[0], + rectangleOrigin[0], + rectangleOrigin[1] + ) + } - let _recastAst = parse(recast(_ast)) - if (trap(_recastAst)) return - _ast = _recastAst + const { execState } = await executeAst({ + ast: truncatedAst, + engineCommandManager: this.engineCommandManager, + // We make sure to send an empty program memory to denote we mean mock mode. + programMemoryOverride, + }) + const programMemory = execState.memory + this.sceneProgramMemory = programMemory + const sketch = sketchFromKclValue( + programMemory.get(variableDeclarationName), + variableDeclarationName + ) + if (err(sketch)) return Promise.reject(sketch) + const sgPaths = sketch.paths + const orthoFactor = orthoScale(sceneInfra.camControls.camera) + + this.updateSegment(sketch.start, 0, 0, _ast, orthoFactor, sketch) + sgPaths.forEach((seg, index) => + this.updateSegment(seg, index, 0, _ast, orthoFactor, sketch) + ) + }, + onClick: async (args) => { + // If there is a valid camera interaction that matches, do that instead + const interaction = sceneInfra.camControls.getInteractionType( + args.mouseEvent + ) + if (interaction !== 'none') return + // Commit the rectangle to the full AST/code and return to sketch.idle + const cornerPoint = args.intersectionPoint?.twoD + if (!cornerPoint || args.mouseEvent.button !== 0) return + + const x = roundOff((cornerPoint.x || 0) - rectangleOrigin[0]) + const y = roundOff((cornerPoint.y || 0) - rectangleOrigin[1]) + + const _node = getNodeFromPath( + _ast, + sketchPathToNode || [], + 'VariableDeclaration' + ) + if (trap(_node)) return + const sketchInit = _node.node?.declaration.init + + if (sketchInit.type === 'PipeExpression') { + updateCenterRectangleSketch( + sketchInit, + x, + y, + tags[0], + rectangleOrigin[0], + rectangleOrigin[1] + ) + + const pResult = parse(recast(_ast)) + if (trap(pResult) || !resultIsOk(pResult)) + return Promise.reject(pResult) + _ast = pResult.program // Update the primary AST and unequip the rectangle tool await kclManager.executeAstMock(_ast) - sceneInfra.modelingSend({ type: 'Finish rectangle' }) + sceneInfra.modelingSend({ type: 'Finish center rectangle' }) + + // lee: I had this at the bottom of the function, but it's + // possible sketchFromKclValue "fails" when sketching on a face, + // and this couldn't wouldn't run. + await codeManager.updateEditorWithAstAndWriteToFile(_ast) const { execState } = await executeAst({ ast: _ast, - useFakeExecutor: true, engineCommandManager: this.engineCommandManager, + // We make sure to send an empty program memory to denote we mean mock mode. programMemoryOverride, - idGenerator: kclManager.execState.idGenerator, }) const programMemory = execState.memory @@ -896,6 +1226,231 @@ export class SceneEntities { }, }) } + + // lee: Well, it appears all our code in sceneEntities each act as their own + // kind of classes. In this case, I'll keep utility functions pertaining to + // circle3Point here. Feel free to extract as needed. + entryDraftCircle3Point = ( + done: () => void, + startSketchOnASTNodePath: PathToNode, + forward: Vector3, + up: Vector3, + sketchOrigin: Vector3 + ): (() => void) => { + // lee: Not a fan we need to re-iterate this dummy object all over the place + // just to get the scale but okie dokie. + const dummy = new Mesh() + dummy.position.set(0, 0, 0) + const scale = sceneInfra.getClientSceneScaleFactor(dummy) + + const orientation = quaternionFromUpNForward(up, forward) + + // Reminder: the intersection plane is the primary way to derive a XY + // position from a mouse click in ThreeJS. + // Here, we position and orient so it's facing the viewer. + this.intersectionPlane!.setRotationFromQuaternion(orientation) + this.intersectionPlane!.position.copy(sketchOrigin) + + // Keep track of points in the scene with their ThreeJS ids. + const points: Map = new Map() + + // Keep a reference so we can destroy and recreate as needed. + let groupCircle: Group | undefined + + // Add our new group to the list of groups to render + const groupOfDrafts = new Group() + groupOfDrafts.name = 'circle-3-point-group' + groupOfDrafts.position.copy(sketchOrigin) + // lee: I'm keeping this here as a developer gotchya: + // Do not reorient your surfaces to the intersection plane. Your points are + // already in 3D space, not 2D. If you intersect say XZ, you want the points + // to continue to live at the 3D intersection point, not be rotated to end + // up elsewhere! + // groupOfDrafts.setRotationFromQuaternion(orientation) + this.scene.add(groupOfDrafts) + + const DRAFT_POINT_RADIUS = 6 + + const createPoint = (center: Vector3): number => { + const geometry = new SphereGeometry(DRAFT_POINT_RADIUS) + const color = getThemeColorForThreeJs(sceneInfra._theme) + const material = new MeshBasicMaterial({ color }) + + const mesh = new Mesh(geometry, material) + mesh.userData = { type: CIRCLE_3_POINT_DRAFT_POINT } + mesh.layers.set(SKETCH_LAYER) + mesh.position.copy(center) + mesh.scale.set(scale, scale, scale) + mesh.renderOrder = 100 + + groupOfDrafts.add(mesh) + + return mesh.id + } + + const circle3Point = ( + points: Vector2[] + ): undefined | { center: Vector3; radius: number } => { + // A 3-point circle is undefined if it doesn't have 3 points :) + if (points.length !== 3) return undefined + + // y = (i/j)(x-h) + b + // i and j variables for the slopes + const i = [points[1].x - points[0].x, points[2].x - points[1].x] + const j = [points[1].y - points[0].y, points[2].y - points[1].y] + + // Our / threejs coordinate system affects this a lot. If you take this + // code into a different code base, you may have to adjust a/b to being + // -1/a/b, b/a, etc! In this case, a/-b did the trick. + const m = [i[0] / -j[0], i[1] / -j[1]] + + const h = [ + (points[0].x + points[1].x) / 2, + (points[1].x + points[2].x) / 2, + ] + const b = [ + (points[0].y + points[1].y) / 2, + (points[1].y + points[2].y) / 2, + ] + + // Algebraically derived + const x = (-m[0] * h[0] + b[0] - b[1] + m[1] * h[1]) / (m[1] - m[0]) + const y = m[0] * (x - h[0]) + b[0] + + const center = new Vector3(x, y, 0) + const radius = Math.sqrt((points[1].x - x) ** 2 + (points[1].y - y) ** 2) + + return { + center, + radius, + } + } + + // TO BE SHORT LIVED: unused function to draw the circle and lines. + // @ts-ignore + // eslint-disable-next-line + const createCircle3Point = (points: Vector2[]) => { + const circleParams = circle3Point(points) + + // A circle cannot be created for these points. + if (!circleParams) return + + const color = getThemeColorForThreeJs(sceneInfra._theme) + const geometryCircle = createArcGeometry({ + center: [circleParams.center.x, circleParams.center.y], + radius: circleParams.radius, + startAngle: 0, + endAngle: Math.PI * 2, + ccw: true, + isDashed: true, + scale, + }) + const materialCircle = new MeshBasicMaterial({ color }) + + if (groupCircle) groupOfDrafts.remove(groupCircle) + groupCircle = new Group() + groupCircle.renderOrder = 1 + + const meshCircle = new Mesh(geometryCircle, materialCircle) + meshCircle.userData = { type: CIRCLE_3_POINT_DRAFT_CIRCLE } + meshCircle.layers.set(SKETCH_LAYER) + meshCircle.position.set(circleParams.center.x, circleParams.center.y, 0) + meshCircle.scale.set(scale, scale, scale) + groupCircle.add(meshCircle) + + const geometryPolyLine = new BufferGeometry().setFromPoints([ + ...points, + points[0], + ]) + const materialPolyLine = new LineDashedMaterial({ + color, + scale, + dashSize: 6, + gapSize: 6, + }) + const meshPolyLine = new Line(geometryPolyLine, materialPolyLine) + meshPolyLine.computeLineDistances() + groupCircle.add(meshPolyLine) + + groupOfDrafts.add(groupCircle) + } + + // The target of our dragging + let target: Object3D | undefined = undefined + + const cleanupFn = () => { + this.scene.remove(groupOfDrafts) + } + + sceneInfra.setCallbacks({ + async onDrag(args) { + const draftPointsIntersected = args.intersects.filter( + (intersected) => + intersected.object.userData.type === CIRCLE_3_POINT_DRAFT_POINT + ) + + const firstPoint = draftPointsIntersected[0] + if (firstPoint && !target) { + target = firstPoint.object + } + + // The user was off their mark! Missed the object to select. + if (!target) return + + target.position.copy(args.intersectionPoint.threeD) + points.set(target.id, args.intersectionPoint.twoD) + }, + async onDragEnd(_args) { + target = undefined + }, + async onClick(args) { + if (points.size >= 3) return + if (!args.intersectionPoint) return + + const id = createPoint(args.intersectionPoint.threeD) + points.set(id, args.intersectionPoint.twoD) + + if (points.size < 2) return + + // We've now got 3 points, let's create our circle! + const astSnapshot = structuredClone(kclManager.ast) + let nodeQueryResult + nodeQueryResult = getNodeFromPath( + astSnapshot, + startSketchOnASTNodePath, + 'VariableDeclaration' + ) + if (err(nodeQueryResult)) return Promise.reject(nodeQueryResult) + const startSketchOnASTNode = nodeQueryResult + + const circleParams = circle3Point(Array.from(points.values())) + + if (!circleParams) return + + const kclCircle3Point = parse(`circle({ + center = [${circleParams.center.x}, ${circleParams.center.y}], + radius = ${circleParams.radius}, + }, %)`) + + if (err(kclCircle3Point) || kclCircle3Point.program === null) return + if (kclCircle3Point.program.body[0].type !== 'ExpressionStatement') + return + + const clonedStartSketchOnASTNode = structuredClone(startSketchOnASTNode) + startSketchOnASTNode.node.declaration.init = createPipeExpression([ + clonedStartSketchOnASTNode.node.declaration.init, + kclCircle3Point.program.body[0].expression, + ]) + + await kclManager.executeAstMock(astSnapshot) + await codeManager.updateEditorWithAstAndWriteToFile(astSnapshot) + + done() + }, + }) + + return cleanupFn + } setupDraftCircle = async ( sketchPathToNode: PathToNode, forward: [number, number, number], @@ -911,12 +1466,11 @@ export class SceneEntities { 'VariableDeclaration' ) if (trap(_node1)) return Promise.reject(_node1) - const variableDeclarationName = - _node1.node?.declarations?.[0]?.id?.name || '' - const startSketchOn = _node1.node?.declarations - const startSketchOnInit = startSketchOn?.[0]?.init + const variableDeclarationName = _node1.node?.declaration.id?.name || '' + const startSketchOn = _node1.node?.declaration + const startSketchOnInit = startSketchOn?.init - startSketchOn[0].init = createPipeExpression([ + startSketchOn.init = createPipeExpression([ startSketchOnInit, createCallExpressionStdLib('circle', [ createObjectExpression({ @@ -930,9 +1484,9 @@ export class SceneEntities { ]), ]) - let _recastAst = parse(recast(_ast)) - if (trap(_recastAst)) return Promise.reject(_recastAst) - _ast = _recastAst + const pResult = parse(recast(_ast)) + if (trap(pResult) || !resultIsOk(pResult)) return Promise.reject(pResult) + _ast = pResult.program // do a quick mock execution to get the program memory up-to-date await kclManager.executeAstMock(_ast) @@ -958,7 +1512,7 @@ export class SceneEntities { ) let modded = structuredClone(truncatedAst) if (trap(_node)) return - const sketchInit = _node.node?.declarations?.[0]?.init + const sketchInit = _node.node.declaration.init const x = (args.intersectionPoint.twoD.x || 0) - circleCenter[0] const y = (args.intersectionPoint.twoD.y || 0) - circleCenter[1] @@ -988,10 +1542,9 @@ export class SceneEntities { const { execState } = await executeAst({ ast: modded, - useFakeExecutor: true, engineCommandManager: this.engineCommandManager, + // We make sure to send an empty program memory to denote we mean mock mode. programMemoryOverride, - idGenerator: kclManager.execState.idGenerator, }) const programMemory = execState.memory this.sceneProgramMemory = programMemory @@ -1027,7 +1580,7 @@ export class SceneEntities { 'VariableDeclaration' ) if (trap(_node)) return - const sketchInit = _node.node?.declarations?.[0]?.init + const sketchInit = _node.node?.declaration.init let modded = structuredClone(_ast) if (sketchInit.type === 'PipeExpression') { @@ -1052,13 +1605,18 @@ export class SceneEntities { if (err(moddedResult)) return modded = moddedResult.modifiedAst - let _recastAst = parse(recast(modded)) - if (trap(_recastAst)) return Promise.reject(_recastAst) - _ast = _recastAst + const newCode = recast(modded) + if (err(newCode)) return + const pResult = parse(newCode) + if (trap(pResult) || !resultIsOk(pResult)) + return Promise.reject(pResult) + _ast = pResult.program // Update the primary AST and unequip the rectangle tool await kclManager.executeAstMock(_ast) sceneInfra.modelingSend({ type: 'Finish circle' }) + + await codeManager.updateEditorWithAstAndWriteToFile(_ast) } }, }) @@ -1094,6 +1652,7 @@ export class SceneEntities { forward, position, }) + await codeManager.writeToFile() } }, onDrag: async ({ @@ -1202,7 +1761,7 @@ export class SceneEntities { } prepareTruncatedMemoryAndAst = ( sketchPathToNode: PathToNode, - ast?: Program, + ast?: Node, draftSegment?: DraftSegment ) => prepareTruncatedMemoryAndAst( @@ -1223,20 +1782,35 @@ export class SceneEntities { sketchPathToNode: PathToNode intersects: Intersection>[] draftInfo?: { - truncatedAst: Program + truncatedAst: Node programMemoryOverride: ProgramMemory variableDeclarationName: string } }) { - const profileStart = + const intersectsProfileStart = draftInfo && intersects .map(({ object }) => getParentGroup(object, [PROFILE_START])) .find((a) => a?.name === PROFILE_START) - const intersection2d = profileStart - ? new Vector2(profileStart.position.x, profileStart.position.y) + const intersection2d = intersectsProfileStart + ? new Vector2( + intersectsProfileStart.position.x, + intersectsProfileStart.position.y + ) : _intersection2d + const intersectsYAxis = intersects.find( + (sceneObject) => sceneObject.object.name === Y_AXIS + ) + const intersectsXAxis = intersects.find( + (sceneObject) => sceneObject.object.name === X_AXIS + ) + + const snappedPoint = new Vector2( + intersectsYAxis ? 0 : intersection2d.x, + intersectsXAxis ? 0 : intersection2d.y + ) + const group = getParentGroup(object, SEGMENT_BODIES_PLUS_PROFILE_START) const subGroup = getParentGroup(object, [ARROWHEAD, CIRCLE_CENTER_HANDLE]) if (!group) return @@ -1256,10 +1830,10 @@ export class SceneEntities { group.userData.from[0], group.userData.from[1], ] - const dragTo: [number, number] = [intersection2d.x, intersection2d.y] + const dragTo: [number, number] = [snappedPoint.x, snappedPoint.y] let modifiedAst = draftInfo ? draftInfo.truncatedAst : { ...kclManager.ast } - const _node = getNodeFromPath( + const _node = getNodeFromPath>( modifiedAst, pathToNode, 'CallExpression' @@ -1271,7 +1845,7 @@ export class SceneEntities { let modded: | { - modifiedAst: Program + modifiedAst: Node pathToNode: PathToNode } | Error @@ -1329,7 +1903,7 @@ export class SceneEntities { kclManager.programMemory, { type: 'sourceRange', - sourceRange: [node.start, node.end], + sourceRange: [node.start, node.end, true], }, getChangeSketchInput() ) @@ -1352,19 +1926,21 @@ export class SceneEntities { codeManager.updateCodeEditor(code) const { execState } = await executeAst({ ast: truncatedAst, - useFakeExecutor: true, engineCommandManager: this.engineCommandManager, + // We make sure to send an empty program memory to denote we mean mock mode. programMemoryOverride, - idGenerator: kclManager.execState.idGenerator, }) const programMemory = execState.memory this.sceneProgramMemory = programMemory const maybeSketch = programMemory.get(variableDeclarationName) - let sketch = undefined - const sg = sketchFromKclValue(maybeSketch, variableDeclarationName) - if (!err(sg)) { - sketch = sg + let sketch: Sketch | undefined + const sk = sketchFromKclValueOptional( + maybeSketch, + variableDeclarationName + ) + if (!(sk instanceof Reason)) { + sketch = sk } else if ((maybeSketch as Solid).sketch) { sketch = (maybeSketch as Solid).sketch } @@ -1416,7 +1992,7 @@ export class SceneEntities { ): (() => SegmentOverlayPayload | null) => { const segPathToNode = getNodePathFromSourceRange( modifiedAst, - segment.__geoMeta.sourceRange + sourceRangeFromRust(segment.__geoMeta.sourceRange) ) const sgPaths = sketch.paths const originalPathToNodeStr = JSON.stringify(segPathToNode) @@ -1503,7 +2079,10 @@ export class SceneEntities { reject: () => void, { removeAxis = true }: { removeAxis?: boolean } ) { - if (this.intersectionPlane) this.scene.remove(this.intersectionPlane) + // Remove all draft groups + this.draftPointGroups.forEach((draftPointGroup) => { + this.scene.remove(draftPointGroup) + }) if (this.axisGroup && removeAxis) this.scene.remove(this.axisGroup) const sketchSegments = this.scene.children.find( ({ userData }) => userData?.type === SKETCH_GROUP_SEGMENTS @@ -1564,16 +2143,18 @@ export class SceneEntities { SEGMENT_BODIES_PLUS_PROFILE_START ) if (parent?.userData?.pathToNode) { - const updatedAst = parse(recast(kclManager.ast)) - if (trap(updatedAst)) return - const _node = getNodeFromPath( + const pResult = parse(recast(kclManager.ast)) + if (trap(pResult) || !resultIsOk(pResult)) + return Promise.reject(pResult) + const updatedAst = pResult.program + const _node = getNodeFromPath>( updatedAst, parent.userData.pathToNode, 'CallExpression' ) if (trap(_node, { suppress: true })) return const node = _node.node - editorManager.setHighlightRange([[node.start, node.end]]) + editorManager.setHighlightRange([[node.start, node.end, true]]) const yellow = 0xffff00 colorSegment(selected, yellow) const extraSegmentGroup = parent.getObjectByName(EXTRA_SEGMENT_HANDLE) @@ -1618,10 +2199,10 @@ export class SceneEntities { }) return } - editorManager.setHighlightRange([[0, 0]]) + editorManager.setHighlightRange([defaultSourceRange()]) }, onMouseLeave: ({ selected, ...rest }: OnMouseEnterLeaveArgs) => { - editorManager.setHighlightRange([[0, 0]]) + editorManager.setHighlightRange([defaultSourceRange()]) const parent = getParentGroup( selected, SEGMENT_BODIES_PLUS_PROFILE_START @@ -1701,12 +2282,12 @@ export type DefaultPlaneStr = 'XY' | 'XZ' | 'YZ' | '-XY' | '-XZ' | '-YZ' function prepareTruncatedMemoryAndAst( sketchPathToNode: PathToNode, - ast: Program, + ast: Node, programMemory: ProgramMemory, draftSegment?: DraftSegment ): | { - truncatedAst: Program + truncatedAst: Node programMemoryOverride: ProgramMemory variableDeclarationName: string } @@ -1714,13 +2295,13 @@ function prepareTruncatedMemoryAndAst( const bodyIndex = Number(sketchPathToNode?.[1]?.[0]) || 0 const _ast = structuredClone(ast) - const _node = getNodeFromPath( + const _node = getNodeFromPath>( _ast, sketchPathToNode || [], 'VariableDeclaration' ) if (err(_node)) return _node - const variableDeclarationName = _node.node?.declarations?.[0]?.id?.name || '' + const variableDeclarationName = _node.node?.declaration.id?.name || '' const sg = sketchFromKclValue( programMemory.get(variableDeclarationName), variableDeclarationName @@ -1745,34 +2326,36 @@ function prepareTruncatedMemoryAndAst( ]) } ;( - (_ast.body[bodyIndex] as VariableDeclaration).declarations[0] + (_ast.body[bodyIndex] as VariableDeclaration).declaration .init as PipeExpression ).body.push(newSegment) // update source ranges to section we just added. // hacks like this wouldn't be needed if the AST put pathToNode info in memory/sketch segments - const updatedSrcRangeAst = parse(recast(_ast)) // get source ranges correct since unfortunately we still rely on them - if (err(updatedSrcRangeAst)) return updatedSrcRangeAst + const pResult = parse(recast(_ast)) // get source ranges correct since unfortunately we still rely on them + if (trap(pResult) || !resultIsOk(pResult)) + return Error('Unexpected compilation error') + const updatedSrcRangeAst = pResult.program const lastPipeItem = ( - (updatedSrcRangeAst.body[bodyIndex] as VariableDeclaration) - .declarations[0].init as PipeExpression + (updatedSrcRangeAst.body[bodyIndex] as VariableDeclaration).declaration + .init as PipeExpression ).body.slice(-1)[0] ;( - (_ast.body[bodyIndex] as VariableDeclaration).declarations[0] + (_ast.body[bodyIndex] as VariableDeclaration).declaration .init as PipeExpression ).body.slice(-1)[0].start = lastPipeItem.start _ast.end = lastPipeItem.end - const varDec = _ast.body[bodyIndex] as VariableDeclaration + const varDec = _ast.body[bodyIndex] as Node varDec.end = lastPipeItem.end - const declarator = varDec.declarations[0] + const declarator = varDec.declaration declarator.end = lastPipeItem.end - const init = declarator.init as PipeExpression + const init = declarator.init as Node init.end = lastPipeItem.end init.body.slice(-1)[0].end = lastPipeItem.end } - const truncatedAst: Program = { + const truncatedAst: Node = { ..._ast, body: [structuredClone(_ast.body[bodyIndex])], } @@ -1803,7 +2386,7 @@ function prepareTruncatedMemoryAndAst( if (node.type !== 'VariableDeclaration') { continue } - const name = node.declarations[0].id.name + const name = node.declaration.id.name const memoryItem = programMemory.get(name) if (!memoryItem) { continue @@ -2013,3 +2596,27 @@ export function getQuaternionFromZAxis(zAxis: Vector3): Quaternion { function massageFormats(a: Vec3Array | Point3d): Vector3 { return isArray(a) ? new Vector3(a[0], a[1], a[2]) : new Vector3(a.x, a.y, a.z) } + +/** + * Given a SourceRange [x,y,boolean] create a Selections object which contains + * graphSelections with the artifact and codeRef. + * This can be passed to 'Set selection' to internally set the selection of the + * modelingMachine from code. + */ +function computeSelectionFromSourceRangeAndAST( + sourceRange: SourceRange, + ast: Node +): Selections { + const artifactGraph = engineCommandManager.artifactGraph + const artifact = getArtifactFromRange(sourceRange, artifactGraph) || undefined + const selection: Selections = { + graphSelections: [ + { + artifact, + codeRef: codeRefFromRange(sourceRange, ast), + }, + ], + otherSelections: [], + } + return selection +} diff --git a/src/clientSideScene/sceneInfra.ts b/src/clientSideScene/sceneInfra.ts index 5614ab77c..d7fadb26b 100644 --- a/src/clientSideScene/sceneInfra.ts +++ b/src/clientSideScene/sceneInfra.ts @@ -22,7 +22,7 @@ import { import { Coords2d, compareVec2Epsilon2 } from 'lang/std/sketch' import { useModelingContext } from 'hooks/useModelingContext' import * as TWEEN from '@tweenjs/tween.js' -import { Axis } from 'lib/selections' +import { Axis, NonCodeSelection } from 'lib/selections' import { type BaseUnit } from 'lib/settings/settingsTypes' import { CameraControls } from './CameraControls' import { EngineCommandManager } from 'lang/std/engineConnection' @@ -30,6 +30,7 @@ import { MouseState, SegmentOverlayPayload } from 'machines/modelingMachine' import { getAngle, throttle } from 'lib/utils' import { Themes } from 'lib/theme' import { CSS2DRenderer } from 'three/examples/jsm/renderers/CSS2DRenderer' +import { orthoScale, perspScale } from './helpers' type SendType = ReturnType['send'] @@ -49,17 +50,30 @@ export const RAYCASTABLE_PLANE = 'raycastable-plane' export const X_AXIS = 'xAxis' export const Y_AXIS = 'yAxis' +/** If a segment angle is less than this many degrees off a meanginful angle it'll snap to it */ +export const ANGLE_SNAP_THRESHOLD_DEGREES = 3 +/** the THREEjs representation of the group surrounding a "snapped" point that is not yet placed */ +export const DRAFT_POINT_GROUP = 'draft-point-group' +/** the THREEjs representation of a "snapped" point that is not yet placed */ +export const DRAFT_POINT = 'draft-point' export const AXIS_GROUP = 'axisGroup' export const SKETCH_GROUP_SEGMENTS = 'sketch-group-segments' export const ARROWHEAD = 'arrowhead' export const SEGMENT_LENGTH_LABEL = 'segment-length-label' export const SEGMENT_LENGTH_LABEL_TEXT = 'segment-length-label-text' export const SEGMENT_LENGTH_LABEL_OFFSET_PX = 30 +export const CIRCLE_3_POINT_DRAFT_POINT = 'circle-3-point-draft-point' +export const CIRCLE_3_POINT_DRAFT_CIRCLE = 'circle-3-point-draft-circle' export interface OnMouseEnterLeaveArgs { selected: Object3D dragSelected?: Object3D mouseEvent: MouseEvent + /** The intersection of the mouse with the THREEjs raycast plane */ + intersectionPoint?: { + twoD?: Vector2 + threeD?: Vector3 + } } interface OnDragCallbackArgs extends OnMouseEnterLeaveArgs { @@ -217,7 +231,6 @@ export class SceneInfra { const vector = new Vector3(0, 0, 0) // Get the position of the object3D in world space - // console.log('arrowGroup', arrowGroup) arrowGroup.getWorldPosition(vector) // Project that position to screen space @@ -335,7 +348,6 @@ export class SceneInfra { requestAnimationFrame(this.animate) TWEEN.update() // This will update all tweens during the animation loop if (!this.isFovAnimationInProgress) { - // console.log('animation frame', this.cameraControls.camera) this.camControls.update() this.renderer.render(this.scene, this.camControls.camera) this.labelRenderer.render(this.scene, this.camControls.camera) @@ -348,29 +360,43 @@ export class SceneInfra { window.removeEventListener('resize', this.onWindowResize) // Dispose of any other resources like geometries, materials, textures } + getClientSceneScaleFactor(meshOrGroup: Mesh | Group) { + const orthoFactor = orthoScale(this.camControls.camera) + const factor = + (this.camControls.camera instanceof OrthographicCamera + ? orthoFactor + : perspScale(this.camControls.camera, meshOrGroup)) / + this._baseUnitMultiplier + return factor + } getPlaneIntersectPoint = (): { twoD?: Vector2 threeD?: Vector3 intersection: Intersection> } | null => { + // Get the orientations from the camera and mouse position this.planeRaycaster.setFromCamera( this.currentMouseVector, this.camControls.camera ) + + // Get the intersection of the ray with the default planes const planeIntersects = this.planeRaycaster.intersectObjects( this.scene.children, true ) - const recastablePlaneIntersect = planeIntersects.find( + if (!planeIntersects.length) return null + + // Find the intersection with the raycastable (or sketch) plane + const raycastablePlaneIntersection = planeIntersects.find( (intersect) => intersect.object.name === RAYCASTABLE_PLANE ) - if (!planeIntersects.length) return null - if (!recastablePlaneIntersect) return { intersection: planeIntersects[0] } - const planePosition = planeIntersects[0].object.position - const inversePlaneQuaternion = planeIntersects[0].object.quaternion - .clone() - .invert() - const intersectPoint = planeIntersects[0].point + if (!raycastablePlaneIntersection) + return { intersection: planeIntersects[0] } + const planePosition = raycastablePlaneIntersection.object.position + const inversePlaneQuaternion = + raycastablePlaneIntersection.object.quaternion.clone().invert() + const intersectPoint = raycastablePlaneIntersection.point let transformedPoint = intersectPoint.clone() if (transformedPoint) { transformedPoint.applyQuaternion(inversePlaneQuaternion) @@ -408,7 +434,6 @@ export class SceneInfra { if (!this.selected.hasBeenDragged && hasBeenDragged) { this.selected.hasBeenDragged = true // this is where we could fire a onDragStart event - // console.log('onDragStart', this.selected) } if ( hasBeenDragged && @@ -447,18 +472,26 @@ export class SceneInfra { if (intersects[0]) { const firstIntersectObject = intersects[0].object + const planeIntersectPoint = this.getPlaneIntersectPoint() + const intersectionPoint = { + twoD: planeIntersectPoint?.twoD, + threeD: planeIntersectPoint?.threeD, + } + if (this.hoveredObject !== firstIntersectObject) { const hoveredObj = this.hoveredObject this.hoveredObject = null await this.onMouseLeave({ selected: hoveredObj, mouseEvent: mouseEvent, + intersectionPoint, }) this.hoveredObject = firstIntersectObject await this.onMouseEnter({ selected: this.hoveredObject, dragSelected: this.selected?.object, mouseEvent: mouseEvent, + intersectionPoint, }) if (!this.selected) this.updateMouseState({ @@ -620,7 +653,7 @@ export class SceneInfra { await this.onClickCallback({ mouseEvent, intersects }) } } - updateOtherSelectionColors = (otherSelections: Axis[]) => { + updateOtherSelectionColors = (otherSelections: NonCodeSelection[]) => { const axisGroup = this.scene.children.find( ({ userData }) => userData?.type === AXIS_GROUP ) diff --git a/src/clientSideScene/segments.ts b/src/clientSideScene/segments.ts index 0758de58e..02c985049 100644 --- a/src/clientSideScene/segments.ts +++ b/src/clientSideScene/segments.ts @@ -45,6 +45,7 @@ import { import { getTangentPointFromPreviousArc } from 'lib/utils2d' import { ARROWHEAD, + DRAFT_POINT, SceneInfra, SEGMENT_LENGTH_LABEL, SEGMENT_LENGTH_LABEL_OFFSET_PX, @@ -55,6 +56,8 @@ import { normaliseAngle, roundOff } from 'lib/utils' import { SegmentOverlayPayload } from 'machines/modelingMachine' import { SegmentInputs } from 'lang/std/stdTypes' import { err } from 'lib/trap' +import { editorManager, sceneInfra } from 'lib/singletons' +import { Selections } from 'lib/selections' interface CreateSegmentArgs { input: SegmentInputs @@ -68,6 +71,7 @@ interface CreateSegmentArgs { theme: Themes isSelected?: boolean sceneInfra: SceneInfra + selection?: Selections } interface UpdateSegmentArgs { @@ -117,6 +121,7 @@ class StraightSegment implements SegmentUtils { isSelected = false, sceneInfra, prevSegment, + selection, }) => { if (input.type !== 'straight-segment') return new Error('Invalid segment type') @@ -155,6 +160,7 @@ class StraightSegment implements SegmentUtils { isSelected, callExpName, baseColor, + selection, } // All segment types get an extra segment handle, @@ -686,19 +692,20 @@ class CircleSegment implements SegmentUtils { export function createProfileStartHandle({ from, - id, - pathToNode, + isDraft = false, scale = 1, theme, isSelected, + ...rest }: { from: Coords2d - id: string - pathToNode: PathToNode scale?: number theme: Themes isSelected?: boolean -}) { +} & ( + | { isDraft: true } + | { isDraft: false; id: string; pathToNode: PathToNode } +)) { const group = new Group() const geometry = new BoxGeometry(12, 12, 12) // in pixels scaled later @@ -711,13 +718,12 @@ export function createProfileStartHandle({ group.userData = { type: PROFILE_START, - id, from, - pathToNode, isSelected, baseColor, + ...rest, } - group.name = PROFILE_START + group.name = isDraft ? DRAFT_POINT : PROFILE_START group.position.set(from[0], from[1], 0) group.scale.set(scale, scale, scale) return group @@ -822,8 +828,37 @@ function createLengthIndicator({ lengthIndicatorText.innerText = roundOff(length).toString() const lengthIndicatorWrapper = document.createElement('div') + // Double click workflow + lengthIndicatorWrapper.ondblclick = () => { + const selection = lengthIndicatorGroup.parent?.userData.selection + if (!selection) { + console.error('Unable to dimension segment when clicking the label.') + return + } + sceneInfra.modelingSend({ + type: 'Set selection', + data: { + selectionType: 'singleCodeCursor', + selection: selection.graphSelections[0], + }, + }) + + // Command Bar + editorManager.commandBarSend({ + type: 'Find and select command', + data: { + name: 'Constrain length', + groupId: 'modeling', + argDefaultValues: { + selection, + }, + }, + }) + } + // Style the elements lengthIndicatorWrapper.style.position = 'absolute' + lengthIndicatorWrapper.style.pointerEvents = 'auto' lengthIndicatorWrapper.appendChild(lengthIndicatorText) const cssObject = new CSS2DObject(lengthIndicatorWrapper) cssObject.name = SEGMENT_LENGTH_LABEL_TEXT diff --git a/src/commandLineArgs.ts b/src/commandLineArgs.ts new file mode 100644 index 000000000..658364f66 --- /dev/null +++ b/src/commandLineArgs.ts @@ -0,0 +1,12 @@ +import yargs from 'yargs' +import { hideBin } from 'yargs/helpers' + +const argv = yargs(hideBin(process.argv)) + .option('telemetry', { + alias: 't', + type: 'boolean', + description: 'Writes startup telemetry to file on disk.', + }) + .parse() + +export default argv diff --git a/src/components/AstExplorer.tsx b/src/components/AstExplorer.tsx index 338efd9ed..e029b2464 100644 --- a/src/components/AstExplorer.tsx +++ b/src/components/AstExplorer.tsx @@ -1,15 +1,18 @@ import { useModelingContext } from 'hooks/useModelingContext' -import { editorManager, kclManager } from 'lib/singletons' +import { editorManager, engineCommandManager, kclManager } from 'lib/singletons' import { getNodeFromPath, getNodePathFromSourceRange } from 'lang/queryAst' import { useEffect, useRef, useState } from 'react' import { trap } from 'lib/trap' +import { codeToIdSelections } from 'lib/selections' +import { codeRefFromRange } from 'lang/std/artifactGraph' +import { defaultSourceRange } from 'lang/wasm' export function AstExplorer() { const { context } = useModelingContext() const pathToNode = getNodePathFromSourceRange( // TODO maybe need to have callback to make sure it stays in sync kclManager.ast, - context.selectionRanges.codeBasedSelections?.[0]?.range + context.selectionRanges.graphSelections?.[0]?.codeRef?.range ) const [filterKeys, setFilterKeys] = useState(['start', 'end']) @@ -18,7 +21,8 @@ export function AstExplorer() { const node = _node return ( -
+
+ AST Explorer
filter out keys:
{['start', 'end', 'type'].map((key) => { @@ -44,7 +48,7 @@ export function AstExplorer() {
{ - editorManager.setHighlightRange([[0, 0]]) + editorManager.setHighlightRange([defaultSourceRange()]) }} >
@@ -55,7 +59,7 @@ export function AstExplorer() {
           />
         
-
+
) } @@ -106,6 +110,7 @@ function DisplayObj({ setHasCursor(false) } }, [node.start, node.end, node.type]) + return (
 {
-        editorManager.setHighlightRange([[obj?.start || 0, obj.end]])
+        editorManager.setHighlightRange([[obj?.start || 0, obj.end, true]])
         e.stopPropagation()
       }}
       onMouseMove={(e) => {
         e.stopPropagation()
-        editorManager.setHighlightRange([[obj?.start || 0, obj.end]])
+        editorManager.setHighlightRange([[obj?.start || 0, obj.end, true]])
       }}
       onClick={(e) => {
+        const range: [number, number, boolean] = [
+          obj?.start || 0,
+          obj.end || 0,
+          true,
+        ]
+        const idInfo = codeToIdSelections([
+          { codeRef: codeRefFromRange(range, kclManager.ast) },
+        ])[0]
+        const artifact = engineCommandManager.artifactGraph.get(
+          idInfo?.id || ''
+        )
+        if (!artifact) return
         send({
           type: 'Set selection',
           data: {
             selectionType: 'singleCodeCursor',
             selection: {
-              type: 'default',
-              range: [obj?.start || 0, obj.end || 0],
+              artifact: artifact,
+              codeRef: codeRefFromRange(range, kclManager.ast),
             },
           },
         })
diff --git a/src/components/AvailableVarsHelpers.tsx b/src/components/AvailableVarsHelpers.tsx
index 56355a5f0..7bc29af3b 100644
--- a/src/components/AvailableVarsHelpers.tsx
+++ b/src/components/AvailableVarsHelpers.tsx
@@ -1,5 +1,11 @@
 import { useEffect, useState, useRef } from 'react'
-import { parse, BinaryPart, Expr, ProgramMemory } from '../lang/wasm'
+import {
+  parse,
+  BinaryPart,
+  Expr,
+  ProgramMemory,
+  resultIsOk,
+} from '../lang/wasm'
 import {
   createIdentifier,
   createLiteral,
@@ -96,7 +102,8 @@ export function useCalc({
 } {
   const { programMemory } = useKclContext()
   const { context } = useModelingContext()
-  const selectionRange = context.selectionRanges.codeBasedSelections[0].range
+  const selectionRange =
+    context.selectionRanges?.graphSelections[0]?.codeRef?.range
   const inputRef = useRef(null)
   const [availableVarInfo, setAvailableVarInfo] = useState<
     ReturnType
@@ -140,12 +147,13 @@ export function useCalc({
   useEffect(() => {
     try {
       const code = `const __result__ = ${value}`
-      const ast = parse(code)
-      if (trap(ast)) return
+      const pResult = parse(code)
+      if (trap(pResult) || !resultIsOk(pResult)) return
+      const ast = pResult.program
       const _programMem: ProgramMemory = ProgramMemory.empty()
       for (const { key, value } of availableVarInfo.variables) {
         const error = _programMem.set(key, {
-          type: 'UserVal',
+          type: 'String',
           value,
           __meta: [],
         })
@@ -155,17 +163,17 @@ export function useCalc({
       executeAst({
         ast,
         engineCommandManager,
-        useFakeExecutor: true,
+        // We make sure to send an empty program memory to denote we mean mock mode.
         programMemoryOverride: kclManager.programMemory.clone(),
       }).then(({ execState }) => {
         const resultDeclaration = ast.body.find(
           (a) =>
             a.type === 'VariableDeclaration' &&
-            a.declarations?.[0]?.id?.name === '__result__'
+            a.declaration.id?.name === '__result__'
         )
         const init =
           resultDeclaration?.type === 'VariableDeclaration' &&
-          resultDeclaration?.declarations?.[0]?.init
+          resultDeclaration?.declaration.init
         const result = execState.memory?.get('__result__')?.value
         setCalcResult(typeof result === 'number' ? String(result) : 'NAN')
         init && setValueNode(init)
diff --git a/src/components/CommandBar/CommandBarHeader.tsx b/src/components/CommandBar/CommandBarHeader.tsx
index 6987d0a42..09df9e747 100644
--- a/src/components/CommandBar/CommandBarHeader.tsx
+++ b/src/components/CommandBar/CommandBarHeader.tsx
@@ -194,7 +194,7 @@ function ReviewingButton() {
       autoFocus
       type="submit"
       form="review-form"
-      className="w-fit !p-0 rounded-sm border !border-primary hover:shadow"
+      className="w-fit !p-0 rounded-sm hover:shadow"
       iconStart={{
         icon: 'checkmark',
         bgClassName: 'p-1 rounded-sm !bg-primary hover:brightness-110',
@@ -212,7 +212,7 @@ function GatheringArgsButton() {
       Element="button"
       type="submit"
       form="arg-form"
-      className="w-fit !p-0 rounded-sm border !border-primary hover:shadow"
+      className="w-fit !p-0 rounded-sm hover:shadow"
       iconStart={{
         icon: 'arrowRight',
         bgClassName: 'p-1 rounded-sm !bg-primary hover:brightness-110',
diff --git a/src/components/CommandBar/CommandBarKclInput.tsx b/src/components/CommandBar/CommandBarKclInput.tsx
index 78e66aa2b..875ba2999 100644
--- a/src/components/CommandBar/CommandBarKclInput.tsx
+++ b/src/components/CommandBar/CommandBarKclInput.tsx
@@ -1,5 +1,11 @@
-import { Completion } from '@codemirror/autocomplete'
-import { EditorView, ViewUpdate } from '@codemirror/view'
+import {
+  closeBrackets,
+  closeBracketsKeymap,
+  Completion,
+  completionKeymap,
+  completionStatus,
+} from '@codemirror/autocomplete'
+import { EditorView, keymap, ViewUpdate } from '@codemirror/view'
 import { CustomIcon } from 'components/CustomIcon'
 import { useCommandsContext } from 'hooks/useCommandsContext'
 import { useSettingsAuthContext } from 'hooks/useSettingsAuthContext'
@@ -8,11 +14,16 @@ import { getSystemTheme } from 'lib/theme'
 import { useCalculateKclExpression } from 'lib/useCalculateKclExpression'
 import { roundOff } from 'lib/utils'
 import { varMentions } from 'lib/varCompletionExtension'
-import { useEffect, useRef, useState } from 'react'
+import { useEffect, useMemo, useRef, useState } from 'react'
 import { useHotkeys } from 'react-hotkeys-hook'
 import styles from './CommandBarKclInput.module.css'
 import { createIdentifier, createVariableDeclaration } from 'lang/modifyAst'
 import { useCodeMirror } from 'components/ModelingSidebar/ModelingPanes/CodeEditor'
+import { useSelector } from '@xstate/react'
+
+const machineContextSelector = (snapshot?: {
+  context: Record
+}) => snapshot?.context
 
 function CommandBarKclInput({
   arg,
@@ -31,12 +42,44 @@ function CommandBarKclInput({
     arg.name
   ] as KclCommandValue | undefined
   const { settings } = useSettingsAuthContext()
-  const defaultValue = (arg.defaultValue as string) || ''
+  const argMachineContext = useSelector(
+    arg.machineActor,
+    machineContextSelector
+  )
+  const defaultValue = useMemo(
+    () =>
+      arg.defaultValue
+        ? arg.defaultValue instanceof Function
+          ? arg.defaultValue(commandBarState.context, argMachineContext)
+          : arg.defaultValue
+        : '',
+    [arg.defaultValue, commandBarState.context, argMachineContext]
+  )
+  const initialVariableName = useMemo(() => {
+    // Use the configured variable name if it exists
+    if (arg.variableName !== undefined) {
+      return arg.variableName instanceof Function
+        ? arg.variableName(commandBarState.context, argMachineContext)
+        : arg.variableName
+    }
+    // or derive it from the previously set value or the argument name
+    return previouslySetValue && 'variableName' in previouslySetValue
+      ? previouslySetValue.variableName
+      : arg.name
+  }, [
+    arg.variableName,
+    commandBarState.context,
+    argMachineContext,
+    arg.name,
+    previouslySetValue,
+  ])
   const [value, setValue] = useState(
     previouslySetValue?.valueText || defaultValue || ''
   )
   const [createNewVariable, setCreateNewVariable] = useState(
-    previouslySetValue && 'variableName' in previouslySetValue
+    (previouslySetValue && 'variableName' in previouslySetValue) ||
+      arg.createVariableByDefault ||
+      false
   )
   const [canSubmit, setCanSubmit] = useState(true)
   useHotkeys('mod + k, mod + /', () => commandBarSend({ type: 'Close' }))
@@ -52,15 +95,13 @@ function CommandBarKclInput({
     isNewVariableNameUnique,
   } = useCalculateKclExpression({
     value,
-    initialVariableName:
-      previouslySetValue && 'variableName' in previouslySetValue
-        ? previouslySetValue.variableName
-        : arg.name,
+    initialVariableName,
   })
   const varMentionData: Completion[] = prevVariables.map((v) => ({
     label: v.key,
     detail: String(roundOff(v.value as number)),
   }))
+  const varMentionsExtension = varMentions(varMentionData)
 
   const { setContainer } = useCodeMirror({
     container: editorRef.current,
@@ -78,23 +119,40 @@ function CommandBarKclInput({
         ? getSystemTheme()
         : settings.context.app.theme.current,
     extensions: [
-      EditorView.domEventHandlers({
-        keydown: (event) => {
-          if (event.key === 'Backspace' && value === '') {
-            event.preventDefault()
-            stepBack()
-          } else if (event.key === 'Enter') {
-            event.preventDefault()
-            handleSubmit()
-          }
-        },
-      }),
-      varMentions(varMentionData),
+      varMentionsExtension,
       EditorView.updateListener.of((vu: ViewUpdate) => {
         if (vu.docChanged) {
           setValue(vu.state.doc.toString())
         }
       }),
+      closeBrackets(),
+      keymap.of([
+        ...closeBracketsKeymap,
+        ...completionKeymap,
+        {
+          key: 'Enter',
+          run: (editor) => {
+            // Only submit if there is no completion active
+            if (completionStatus(editor.state) === null) {
+              handleSubmit()
+              return true
+            } else {
+              return false
+            }
+          },
+        },
+        {
+          key: 'Backspace',
+          run: (editor) => {
+            // Only step back if the editor is empty
+            if (editor.state.doc.toString() === '') {
+              stepBack()
+              return true
+            }
+            return false
+          },
+        },
+      ]),
     ],
   })
 
@@ -193,7 +251,7 @@ function CommandBarKclInput({
               }
             }}
             onKeyUp={(e) => {
-              if (e.key === 'Enter') {
+              if (e.key === 'Enter' && canSubmit) {
                 handleSubmit()
               }
             }}
diff --git a/src/components/CommandBar/CommandBarSelectionInput.tsx b/src/components/CommandBar/CommandBarSelectionInput.tsx
index 5dfe4f4d1..b864b523b 100644
--- a/src/components/CommandBar/CommandBarSelectionInput.tsx
+++ b/src/components/CommandBar/CommandBarSelectionInput.tsx
@@ -1,24 +1,29 @@
 import { useSelector } from '@xstate/react'
 import { useCommandsContext } from 'hooks/useCommandsContext'
-import { useKclContext } from 'lang/KclProvider'
+import { Artifact } from 'lang/std/artifactGraph'
 import { CommandArgument } from 'lib/commandTypes'
 import {
-  Selection,
   canSubmitSelectionArg,
-  getSelectionType,
+  getSelectionCountByType,
   getSelectionTypeDisplayText,
 } from 'lib/selections'
+import { kclManager } from 'lib/singletons'
+import { reportRejection } from 'lib/trap'
+import { toSync } from 'lib/utils'
 import { modelingMachine } from 'machines/modelingMachine'
 import { useEffect, useMemo, useRef, useState } from 'react'
 import { StateFrom } from 'xstate'
 
-const semanticEntityNames: { [key: string]: Array } = {
-  face: ['extrude-wall', 'start-cap', 'end-cap'],
-  edge: ['edge', 'line', 'arc'],
-  point: ['point', 'line-end', 'line-mid'],
+const semanticEntityNames: {
+  [key: string]: Array
+} = {
+  face: ['wall', 'cap', 'solid2D'],
+  edge: ['segment', 'sweepEdge', 'edgeCutEdge'],
+  point: [],
+  plane: ['defaultPlane'],
 }
 
-function getSemanticSelectionType(selectionType: Array) {
+function getSemanticSelectionType(selectionType: Array) {
   const semanticSelectionType = new Set()
   selectionType.forEach((type) => {
     Object.entries(semanticEntityNames).forEach(([entity, entityTypes]) => {
@@ -43,17 +48,13 @@ function CommandBarSelectionInput({
   stepBack: () => void
   onSubmit: (data: unknown) => void
 }) {
-  const { code } = useKclContext()
   const inputRef = useRef(null)
   const { commandBarState, commandBarSend } = useCommandsContext()
   const [hasSubmitted, setHasSubmitted] = useState(false)
   const selection = useSelector(arg.machineActor, selectionSelector)
   const selectionsByType = useMemo(() => {
-    const selectionRangeEnd = selection?.codeBasedSelections[0]?.range[1]
-    return !selectionRangeEnd || selectionRangeEnd === code.length
-      ? 'none'
-      : getSelectionType(selection)
-  }, [selection, code])
+    return getSelectionCountByType(selection)
+  }, [selection])
   const canSubmitSelection = useMemo(
     () => canSubmitSelectionArg(selectionsByType, arg),
     [selectionsByType]
@@ -63,6 +64,30 @@ function CommandBarSelectionInput({
     inputRef.current?.focus()
   }, [selection, inputRef])
 
+  // Show the default planes if the selection type is 'plane'
+  useEffect(() => {
+    if (arg.selectionTypes.includes('plane') && !canSubmitSelection) {
+      toSync(() => {
+        return Promise.all([
+          kclManager.showPlanes(),
+          kclManager.setSelectionFilter(['plane', 'object']),
+        ])
+      }, reportRejection)()
+    }
+
+    return () => {
+      toSync(() => {
+        const promises = [
+          new Promise(() => kclManager.defaultSelectionFilter(selection)),
+        ]
+        if (!kclManager._isAstEmpty(kclManager.ast)) {
+          promises.push(kclManager.hidePlanes())
+        }
+        return Promise.all(promises)
+      }, reportRejection)()
+    }
+  }, [])
+
   // Fast-forward through this arg if it's marked as skippable
   // and we have a valid selection already
   useEffect(() => {
@@ -105,11 +130,15 @@ function CommandBarSelectionInput({
             {arg.warningMessage}
           

)} + + {arg.name} + { diff --git a/src/components/CommandBar/CommandBarTextareaInput.tsx b/src/components/CommandBar/CommandBarTextareaInput.tsx index 19a7c60cb..d5694f442 100644 --- a/src/components/CommandBar/CommandBarTextareaInput.tsx +++ b/src/components/CommandBar/CommandBarTextareaInput.tsx @@ -75,6 +75,7 @@ function CommandBarTextareaInput({ target.selectionStart = selectionStart + 1 target.selectionEnd = selectionStart + 1 } else if (event.key === 'Enter') { + event.preventDefault() formRef.current?.dispatchEvent( new Event('submit', { bubbles: true }) ) diff --git a/src/components/ContextMenu.tsx b/src/components/ContextMenu.tsx index 05722cca4..bb17a559e 100644 --- a/src/components/ContextMenu.tsx +++ b/src/components/ContextMenu.tsx @@ -1,13 +1,23 @@ import toast from 'react-hot-toast' import { ActionIcon, ActionIconProps } from './ActionIcon' -import { RefObject, useEffect, useMemo, useRef, useState } from 'react' +import { + MouseEvent, + RefObject, + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from 'react' import { useHotkeys } from 'react-hotkeys-hook' import { Dialog } from '@headlessui/react' -interface ContextMenuProps +export interface ContextMenuProps extends Omit, 'children'> { items?: React.ReactElement[] menuTargetElement?: RefObject + guard?: (e: globalThis.MouseEvent) => boolean + event?: 'contextmenu' | 'mouseup' } const DefaultContextMenuItems = [ @@ -20,6 +30,8 @@ export function ContextMenu({ items = DefaultContextMenuItems, menuTargetElement, className, + guard, + event = 'contextmenu', ...props }: ContextMenuProps) { const dialogRef = useRef(null) @@ -32,6 +44,15 @@ export function ContextMenu({ useHotkeys('esc', () => setOpen(false), { enabled: open, }) + const handleContextMenu = useCallback( + (e: globalThis.MouseEvent) => { + if (guard && !guard(e)) return + e.preventDefault() + setPosition({ x: e.clientX, y: e.clientY }) + setOpen(true) + }, + [guard, setPosition, setOpen] + ) const dialogPositionStyle = useMemo(() => { if (!dialogRef.current) @@ -78,21 +99,9 @@ export function ContextMenu({ // Add context menu listener to target once mounted useEffect(() => { - const handleContextMenu = (e: MouseEvent) => { - console.log('context menu', e) - e.preventDefault() - setPosition({ x: e.x, y: e.y }) - setOpen(true) - } - menuTargetElement?.current?.addEventListener( - 'contextmenu', - handleContextMenu - ) + menuTargetElement?.current?.addEventListener(event, handleContextMenu) return () => { - menuTargetElement?.current?.removeEventListener( - 'contextmenu', - handleContextMenu - ) + menuTargetElement?.current?.removeEventListener(event, handleContextMenu) } }, [menuTargetElement?.current]) @@ -100,7 +109,10 @@ export function ContextMenu({ setOpen(false)}>
e.preventDefault()} + onContextMenu={(e) => { + e.preventDefault() + setPosition({ x: e.clientX, y: e.clientY }) + }} > ), + eyeOpen: ( + + + + ), + eyeCrossedOut: ( + + + + ), fillet: ( ), + hollow: ( + + + + ), horizontal: ( ), + import: ( + + + + ), 'intersection-offset': ( ), + model: ( + + + + ), move: ( ), + patternCircular2d: ( + + + + ), + patternCircular3d: ( + + + + + ), + patternLinear2d: ( + + + + ), + patternLinear3d: ( + + + + + ), person: ( @@ -1161,6 +1270,29 @@ const CustomIconMap = { /> ), + stopwatch: ( + + + + + + ), } as const export type CustomIconName = keyof typeof CustomIconMap diff --git a/src/components/EngineCommands.tsx b/src/components/EngineCommands.tsx index 40ff8785a..ace639518 100644 --- a/src/components/EngineCommands.tsx +++ b/src/components/EngineCommands.tsx @@ -64,7 +64,10 @@ export const EngineCommands = () => { ) })}
-
diff --git a/src/components/FileMachineProvider.tsx b/src/components/FileMachineProvider.tsx index 9c6788e89..3f08619e5 100644 --- a/src/components/FileMachineProvider.tsx +++ b/src/components/FileMachineProvider.tsx @@ -29,6 +29,7 @@ import { KclSamplesManifestItem, } from 'lib/getKclSamplesManifest' import { useSettingsAuthContext } from 'hooks/useSettingsAuthContext' +import { markOnce } from 'lib/performance' type MachineContext = { state: StateFrom @@ -54,6 +55,7 @@ export const FileMachineProvider = ({ ) useEffect(() => { + markOnce('code/didLoadFile') async function fetchKclSamples() { setKclSamples(await getKclSamplesManifest()) } diff --git a/src/components/FileTree.tsx b/src/components/FileTree.tsx index b8b08019b..bc6a9bc78 100644 --- a/src/components/FileTree.tsx +++ b/src/components/FileTree.tsx @@ -6,10 +6,10 @@ import { Dispatch, useCallback, useRef, useState } from 'react' import { useNavigate, useRouteLoaderData } from 'react-router-dom' import { Disclosure } from '@headlessui/react' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' -import { faChevronRight } from '@fortawesome/free-solid-svg-icons' +import { faChevronRight, faPencil } from '@fortawesome/free-solid-svg-icons' import { useFileContext } from 'hooks/useFileContext' import styles from './FileTree.module.css' -import { sortProject } from 'lib/desktopFS' +import { sortFilesAndDirectories } from 'lib/desktopFS' import { FILE_EXT } from 'lib/constants' import { CustomIcon } from './CustomIcon' import { codeManager, kclManager } from 'lib/singletons' @@ -22,11 +22,42 @@ import usePlatform from 'hooks/usePlatform' import { FileEntry } from 'lib/project' import { useFileSystemWatcher } from 'hooks/useFileSystemWatcher' import { normalizeLineEndings } from 'lib/codeEditor' +import { reportRejection } from 'lib/trap' function getIndentationCSS(level: number) { return `calc(1rem * ${level + 1})` } +function TreeEntryInput(props: { + level: number + onSubmit: (value: string) => void +}) { + const [value, setValue] = useState('') + const onKeyPress = (e: React.KeyboardEvent) => { + if (e.key !== 'Enter') return + props.onSubmit(value) + } + + return ( + + ) +} + function RenameForm({ fileOrDir, onSubmit, @@ -113,23 +144,44 @@ function DeleteFileTreeItemDialog({ } const FileTreeItem = ({ + parentDir, project, currentFile, + lastDirectoryClicked, fileOrDir, onNavigateToFile, + onClickDirectory, + onCreateFile, + onCreateFolder, + newTreeEntry, level = 0, + treeSelection, + setTreeSelection, }: { + parentDir: FileEntry | undefined project?: IndexLoaderData['project'] currentFile?: IndexLoaderData['file'] + lastDirectoryClicked?: FileEntry fileOrDir: FileEntry onNavigateToFile?: () => void + onClickDirectory: ( + open: boolean, + path: FileEntry, + parentDir: FileEntry | undefined + ) => void + onCreateFile: (name: string) => void + onCreateFolder: (name: string) => void + newTreeEntry: TreeEntry level?: number + treeSelection: FileEntry | undefined + setTreeSelection: Dispatch> }) => { const { send: fileSend, context: fileContext } = useFileContext() const { onFileOpen, onFileClose } = useLspContext() const navigate = useNavigate() const [isConfirmingDelete, setIsConfirmingDelete] = useState(false) const isCurrentFile = fileOrDir.path === currentFile?.path + const isFileOrDirHighlighted = treeSelection?.path === fileOrDir?.path const itemRef = useRef(null) // Since every file or directory gets its own FileTreeItem, we can do this. @@ -138,15 +190,14 @@ const FileTreeItem = ({ // the ReactNodes are destroyed, so is this listener :) useFileSystemWatcher( async (eventType, path) => { - // Don't try to read a file that was removed. - if (isCurrentFile && eventType !== 'unlink') { - // Prevents a cyclic read / write causing editor problems such as - // misplaced cursor positions. - if (codeManager.writeCausedByAppCheckedInFileTreeFileSystemWatcher) { - codeManager.writeCausedByAppCheckedInFileTreeFileSystemWatcher = false - return - } + // Prevents a cyclic read / write causing editor problems such as + // misplaced cursor positions. + if (codeManager.writeCausedByAppCheckedInFileTreeFileSystemWatcher) { + codeManager.writeCausedByAppCheckedInFileTreeFileSystemWatcher = false + return + } + if (isCurrentFile && eventType === 'change') { let code = await window.electron.readFile(path, { encoding: 'utf-8' }) code = normalizeLineEndings(code) codeManager.updateCodeStateEditor(code) @@ -156,6 +207,10 @@ const FileTreeItem = ({ [fileOrDir.path] ) + const showNewTreeEntry = + newTreeEntry !== undefined && + fileOrDir.path === fileContext.selectedDirectory.path + const isRenaming = fileContext.itemsBeingRenamed.includes(fileOrDir.path) const removeCurrentItemFromRenaming = useCallback( () => @@ -179,13 +234,6 @@ const FileTreeItem = ({ }) }, [fileContext.itemsBeingRenamed, fileOrDir.path, fileSend]) - const clickDirectory = () => { - fileSend({ - type: 'Set selected directory', - directory: fileOrDir, - }) - } - function handleKeyUp(e: React.KeyboardEvent) { if (e.metaKey && e.key === 'Backspace') { // Open confirmation dialog @@ -194,11 +242,13 @@ const FileTreeItem = ({ // Show the renaming form addCurrentItemToRenaming() } else if (e.code === 'Space') { - handleClick() + void handleClick().catch(reportRejection) } } - function handleClick() { + async function handleClick() { + setTreeSelection(fileOrDir) + if (fileOrDir.children !== null) return // Don't open directories if (fileOrDir.name?.endsWith(FILE_EXT) === false && project?.path) { @@ -208,30 +258,32 @@ const FileTreeItem = ({ `import("${fileOrDir.path.replace(project.path, '.')}")\n` + codeManager.code ) - // eslint-disable-next-line @typescript-eslint/no-floating-promises - codeManager.writeToFile() + await codeManager.writeToFile() // Prevent seeing the model built one piece at a time when changing files - // eslint-disable-next-line @typescript-eslint/no-floating-promises - kclManager.executeCode(true) + await kclManager.executeCode(true) } else { // Let the lsp servers know we closed a file. onFileClose(currentFile?.path || null, project?.path || null) onFileOpen(fileOrDir.path, project?.path || null) + kclManager.switchedFiles = true // Open kcl files navigate(`${PATHS.FILE}/${encodeURIComponent(fileOrDir.path)}`) } + onNavigateToFile?.() } + // The below handles both the "root" of all directories and all subs. It's + // why some code is duplicated. return (
{fileOrDir.children === null ? (
  • { e.currentTarget.focus() - handleClick() + void handleClick().catch(reportRejection) }} onKeyUp={handleKeyUp} > @@ -268,14 +320,13 @@ const FileTreeItem = ({ e.currentTarget.focus()} - onClickCapture={clickDirectory} - onFocusCapture={clickDirectory} + onClick={(e) => { + e.stopPropagation() + onClickDirectory(open, fileOrDir, parentDir) + }} onKeyDown={(e) => e.key === 'Enter' && e.preventDefault()} onKeyUp={handleKeyUp} > @@ -317,35 +368,69 @@ const FileTreeItem = ({ >
      { - fileSend({ - type: 'Set selected directory', - directory: fileOrDir, - }) + onClick={(e) => { + e.stopPropagation() + onClickDirectory(open, fileOrDir, parentDir) }} - onFocusCapture={(e) => - fileSend({ - type: 'Set selected directory', - directory: fileOrDir, - }) - } > - {fileOrDir.children?.map((child) => ( - - ))} + {showNewTreeEntry && ( +
      + + + newTreeEntry === 'file' + ? onCreateFile(value) + : onCreateFolder(value) + } + /> +
      + )} + {sortFilesAndDirectories(fileOrDir.children || []).map( + (child) => ( + + ) + )} + {!showNewTreeEntry && fileOrDir.children?.length === 0 && ( +
      +
      No files
      +
      + )}
  • )} )} + {isConfirmingDelete && ( void } -export const FileTreeMenu = () => { - const { send } = useFileContext() - const { send: modelingSend } = useModelingContext() - - function createFile() { - send({ - type: 'Create file', - data: { name: '', makeDir: false, shouldSetToRename: true }, - }) - modelingSend({ type: 'Cancel' }) - } - - function createFolder() { - send({ - type: 'Create file', - data: { name: '', makeDir: true, shouldSetToRename: true }, - }) - } - - useHotkeyWrapper(['mod + n'], createFile) - useHotkeyWrapper(['mod + shift + n'], createFolder) +export const FileTreeMenu = ({ + onCreateFile, + onCreateFolder, +}: { + onCreateFile: () => void + onCreateFolder: () => void +}) => { + useHotkeyWrapper(['mod + n'], onCreateFile) + useHotkeyWrapper(['mod + shift + n'], onCreateFolder) return ( <> @@ -442,7 +515,7 @@ export const FileTreeMenu = () => { bgClassName: 'bg-transparent', }} className="!p-0 !bg-transparent hover:text-primary border-transparent hover:border-primary !outline-none" - onClick={createFile} + onClick={onCreateFile} > Create file @@ -458,7 +531,7 @@ export const FileTreeMenu = () => { bgClassName: 'bg-transparent', }} className="!p-0 !bg-transparent hover:text-primary border-transparent hover:border-primary !outline-none" - onClick={createFolder} + onClick={onCreateFolder} > Create folder @@ -468,30 +541,110 @@ export const FileTreeMenu = () => { ) } +type TreeEntry = 'file' | 'folder' | undefined + +export const useFileTreeOperations = () => { + const { send } = useFileContext() + const { send: modelingSend } = useModelingContext() + + // As long as this is undefined, a new "file tree entry prompt" is not shown. + const [newTreeEntry, setNewTreeEntry] = useState(undefined) + + function createFile(args: { dryRun: boolean; name?: string }) { + if (args.dryRun) { + setNewTreeEntry('file') + return + } + + // Clear so that the entry prompt goes away. + setNewTreeEntry(undefined) + + if (!args.name) return + + send({ + type: 'Create file', + data: { name: args.name, makeDir: false, shouldSetToRename: false }, + }) + modelingSend({ type: 'Cancel' }) + } + + function createFolder(args: { dryRun: boolean; name?: string }) { + if (args.dryRun) { + setNewTreeEntry('folder') + return + } + + setNewTreeEntry(undefined) + + if (!args.name) return + + send({ + type: 'Create file', + data: { name: args.name, makeDir: true, shouldSetToRename: false }, + }) + } + + return { + createFile, + createFolder, + newTreeEntry, + } +} + export const FileTree = ({ className = '', onNavigateToFile: closePanel, }: FileTreeProps) => { + const { createFile, createFolder, newTreeEntry } = useFileTreeOperations() + return (

    Files

    - + createFile({ dryRun: true })} + onCreateFolder={() => createFolder({ dryRun: true })} + />
    - + createFile({ dryRun: false, name })} + onCreateFolder={(name: string) => createFolder({ dryRun: false, name })} + />
    ) } export const FileTreeInner = ({ onNavigateToFile, + onCreateFile, + onCreateFolder, + newTreeEntry, }: { + onCreateFile: (name: string) => void + onCreateFolder: (name: string) => void + newTreeEntry: TreeEntry onNavigateToFile?: () => void }) => { const loaderData = useRouteLoaderData(PATHS.FILE) as IndexLoaderData const { send: fileSend, context: fileContext } = useFileContext() const { send: modelingSend } = useModelingContext() + const [lastDirectoryClicked, setLastDirectoryClicked] = useState< + FileEntry | undefined + >(undefined) + + const [treeSelection, setTreeSelection] = useState( + loaderData.file + ) + + const onNavigateToFile_ = () => { + // Reset modeling state when navigating to a new file + onNavigateToFile?.() + modelingSend({ type: 'Cancel' }) + } + // Refresh the file tree when there are changes. useFileSystemWatcher( async (eventType, path) => { @@ -501,6 +654,13 @@ export const FileTreeInner = ({ const isCurrentFile = loaderData.file?.path === path const hasChanged = eventType === 'change' if (isCurrentFile && hasChanged) return + + // If it's a settings file we wrote to already from the app ignore it. + if (codeManager.writeCausedByAppCheckedInFileTreeFileSystemWatcher) { + codeManager.writeCausedByAppCheckedInFileTreeFileSystemWatcher = false + return + } + fileSend({ type: 'Refresh' }) }, [loaderData?.project?.path, fileContext.selectedDirectory.path].filter( @@ -508,33 +668,97 @@ export const FileTreeInner = ({ ) ) - const clickDirectory = () => { + const onTreeEntryInputSubmit = (value: string) => { + if (newTreeEntry === 'file') { + onCreateFile(value) + onNavigateToFile_() + } else { + onCreateFolder(value) + } + } + + const onClickDirectory = ( + open_: boolean, + fileOrDir: FileEntry, + parentDir: FileEntry | undefined + ) => { + // open true is closed... it's broken. Save me. I've inverted it here for + // sanity. + const open = !open_ + + const target = open ? fileOrDir : parentDir + + // We're at the root, can't select anything further + if (!target) return + + setTreeSelection(target) + setLastDirectoryClicked(target) fileSend({ type: 'Set selected directory', - directory: fileContext.project, + directory: target, }) } + const showNewTreeEntry = + newTreeEntry !== undefined && + fileContext.selectedDirectory.path === loaderData.project?.path + return ( -
    -
      - {sortProject(fileContext.project?.children || []).map((fileOrDir) => ( - { - // Reset modeling state when navigating to a new file - modelingSend({ type: 'Cancel' }) - onNavigateToFile?.() - }} - key={fileOrDir.path} - /> - ))} -
    +
    +
    +
      + {showNewTreeEntry && ( +
      + + +
      + )} + {sortFilesAndDirectories(fileContext.project?.children || []).map( + (fileOrDir) => ( + + ) + )} +
    +
    +
    + ) +} + +export const FileTreeRoot = () => { + const loaderData = useRouteLoaderData(PATHS.FILE) as IndexLoaderData + const { project } = loaderData + + // project.path should never be empty here but I guess during initial loading + // it can be. + return ( +
    + {project?.name ?? ''}
    ) } diff --git a/src/components/Gizmo.tsx b/src/components/Gizmo.tsx index 118f01351..c30139c67 100644 --- a/src/components/Gizmo.tsx +++ b/src/components/Gizmo.tsx @@ -1,6 +1,6 @@ import { SceneInfra } from 'clientSideScene/sceneInfra' import { sceneInfra } from 'lib/singletons' -import { MutableRefObject, useEffect, useMemo, useRef } from 'react' +import { MutableRefObject, useEffect, useRef } from 'react' import { WebGLRenderer, Scene, @@ -19,16 +19,14 @@ import { Intersection, Object3D, } from 'three' -import { - ContextMenu, - ContextMenuDivider, - ContextMenuItem, - ContextMenuItemRefresh, -} from './ContextMenu' import { Popover } from '@headlessui/react' import { CustomIcon } from './CustomIcon' import { reportRejection } from 'lib/trap' -import { useModelingContext } from 'hooks/useModelingContext' +import { + useViewControlMenuItems, + ViewControlContextMenu, +} from './ViewControlMenu' +import { AxisNames } from 'lib/constants' const CANVAS_SIZE = 80 const FRUSTUM_SIZE = 0.5 @@ -40,64 +38,14 @@ enum AxisColors { Z = '#6689ef', Gray = '#c6c7c2', } -enum AxisNames { - X = 'x', - Y = 'y', - Z = 'z', - NEG_X = '-x', - NEG_Y = '-y', - NEG_Z = '-z', -} -const axisNamesSemantic: Record = { - [AxisNames.X]: 'Right', - [AxisNames.Y]: 'Back', - [AxisNames.Z]: 'Top', - [AxisNames.NEG_X]: 'Left', - [AxisNames.NEG_Y]: 'Front', - [AxisNames.NEG_Z]: 'Bottom', -} export default function Gizmo() { + const menuItems = useViewControlMenuItems() const wrapperRef = useRef(null) const canvasRef = useRef(null) const raycasterIntersect = useRef | null>(null) const cameraPassiveUpdateTimer = useRef(0) const raycasterPassiveUpdateTimer = useRef(0) - const { send: modelingSend } = useModelingContext() - const menuItems = useMemo( - () => [ - ...Object.entries(axisNamesSemantic).map(([axisName, axisSemantic]) => ( - { - sceneInfra.camControls - .updateCameraToAxis(axisName as AxisNames) - .catch(reportRejection) - }} - > - {axisSemantic} view - - )), - , - { - sceneInfra.camControls.resetCameraPosition().catch(reportRejection) - }} - > - Reset view - , - { - modelingSend({ type: 'Center camera on selection' }) - }} - > - Center view on selection - , - , - , - ], - [axisNamesSemantic] - ) useEffect(() => { if (!canvasRef.current) return @@ -161,7 +109,7 @@ export default function Gizmo() { className="grid place-content-center rounded-full overflow-hidden border border-solid border-primary/50 pointer-events-auto bg-chalkboard-10/70 dark:bg-chalkboard-100/80 backdrop-blur-sm" > - +
    diff --git a/src/components/HelpMenu.tsx b/src/components/HelpMenu.tsx index 8893b02e7..6aecec713 100644 --- a/src/components/HelpMenu.tsx +++ b/src/components/HelpMenu.tsx @@ -4,7 +4,7 @@ import { useSettingsAuthContext } from 'hooks/useSettingsAuthContext' import { CustomIcon } from './CustomIcon' import { useLocation, useNavigate } from 'react-router-dom' import { PATHS } from 'lib/paths' -import { createAndOpenNewProject } from 'lib/desktopFS' +import { createAndOpenNewTutorialProject } from 'lib/desktopFS' import { useAbsoluteFilePath } from 'hooks/useAbsoluteFilePath' import { useLspContext } from './LspProvider' import { openExternalBrowserIfDesktop } from 'lib/openWindow' @@ -116,9 +116,10 @@ export function HelpMenu(props: React.PropsWithChildren) { if (isInProject) { navigate(filePath + PATHS.ONBOARDING.INDEX) } else { - createAndOpenNewProject({ onProjectOpen, navigate }).catch( - reportRejection - ) + createAndOpenNewTutorialProject({ + onProjectOpen, + navigate, + }).catch(reportRejection) } }} > diff --git a/src/components/Loading.tsx b/src/components/Loading.tsx index a097956f6..7d2972340 100644 --- a/src/components/Loading.tsx +++ b/src/components/Loading.tsx @@ -13,7 +13,11 @@ import { engineCommandManager } from '../lib/singletons' import { Spinner } from './Spinner' -const Loading = ({ children }: React.PropsWithChildren) => { +interface LoadingProps extends React.PropsWithChildren { + className?: string +} + +const Loading = ({ children, className }: LoadingProps) => { const [error, setError] = useState(ConnectionError.Unset) useEffect(() => { @@ -64,7 +68,7 @@ const Loading = ({ children }: React.PropsWithChildren) => { return (
    diff --git a/src/components/LowerRightControls.tsx b/src/components/LowerRightControls.tsx index ad3ddb808..ac942204c 100644 --- a/src/components/LowerRightControls.tsx +++ b/src/components/LowerRightControls.tsx @@ -1,4 +1,4 @@ -import { APP_VERSION } from 'routes/Settings' +import { APP_VERSION, getReleaseUrl } from 'routes/Settings' import { CustomIcon } from 'components/CustomIcon' import Tooltip from 'components/Tooltip' import { PATHS } from 'lib/paths' @@ -72,10 +72,8 @@ export function LowerRightControls({ {!location.pathname.startsWith(PATHS.HOME) && } + + + Telemetry + + Telemetry + + { const [isKclLspReady, setIsKclLspReady] = useState(false) const [isCopilotLspReady, setIsCopilotLspReady] = useState(false) - const { - auth, - settings: { - context: { - modeling: { defaultUnit }, - }, - }, - } = useSettingsAuthContext() + const { auth } = useSettingsAuthContext() const token = auth?.context.token const navigate = useNavigate() @@ -92,7 +85,6 @@ export const LspProvider = ({ children }: { children: React.ReactNode }) => { const initEvent: KclWorkerOptions = { wasmUrl: wasmUrl(), token: token, - baseUnit: defaultUnit.current, apiBaseUrl: VITE_KC_API_BASE_URL, } lspWorker.postMessage({ diff --git a/src/components/ModelingMachineProvider.tsx b/src/components/ModelingMachineProvider.tsx index 137ba8bf9..dc6316660 100644 --- a/src/components/ModelingMachineProvider.tsx +++ b/src/components/ModelingMachineProvider.tsx @@ -41,14 +41,13 @@ import { angleBetweenInfo, applyConstraintAngleBetween, } from './Toolbar/SetAngleBetween' -import { applyConstraintAngleLength } from './Toolbar/setAngleLength' import { - Selections, - canSweepSelection, + applyConstraintAngleLength, + applyConstraintLength, +} from './Toolbar/setAngleLength' +import { handleSelectionBatch, - isSelectionLastLine, - isRangeBetweenCharacters, - isSketchPipe, + Selections, updateSelections, } from 'lib/selections' import { applyConstraintIntersect } from './Toolbar/Intersect' @@ -61,27 +60,25 @@ import { getSketchOrientationDetails, } from 'clientSideScene/sceneEntities' import { - moveValueIntoNewVariablePath, + insertNamedConstant, + replaceValueAtNodePath, sketchOnExtrudedFace, + sketchOnOffsetPlane, startSketchOnDefault, } from 'lang/modifyAst' -import { Program, parse, recast } from 'lang/wasm' +import { PathToNode, Program, parse, recast, resultIsOk } from 'lang/wasm' import { - doesSceneHaveSweepableSketch, + artifactIsPlaneWithPaths, getNodePathFromSourceRange, isSingleCursorInPipe, } from 'lang/queryAst' import { exportFromEngine } from 'lib/exportFromEngine' import { Models } from '@kittycad/lib/dist/types/src' import toast from 'react-hot-toast' -import { EditorSelection, Transaction } from '@codemirror/state' import { useLoaderData, useNavigate, useSearchParams } from 'react-router-dom' import { letEngineAnimateAndSyncCamAfter } from 'clientSideScene/CameraControls' -import { getVarNameModal } from 'hooks/useToolbarGuards' import { err, reportRejection, trap } from 'lib/trap' import { useCommandsContext } from 'hooks/useCommandsContext' -import { modelingMachineEvent } from 'editor/manager' -import { hasValidFilletSelection } from 'lang/modifyAst/addFillet' import { ExportIntent, EngineConnectionStateType, @@ -91,6 +88,9 @@ import { submitAndAwaitTextToKcl } from 'lib/textToCad' import { useFileContext } from 'hooks/useFileContext' import { uuidv4 } from 'lib/utils' import { IndexLoaderData } from 'lib/types' +import { Node } from 'wasm-lib/kcl/bindings/Node' +import { promptToEditFlow } from 'lib/promptToEdit' +import { kclEditorActor } from 'machines/kclEditorMachine' type MachineContext = { state: StateFrom @@ -157,36 +157,39 @@ export const ModelingMachineProvider = ({ 'enable copilot': () => { editorManager.setCopilotEnabled(true) }, - 'sketch exit execute': ({ context: { store } }) => { - ;(async () => { - // When cancelling the sketch mode we should disable sketch mode within the engine. - await engineCommandManager.sendSceneCommand({ - type: 'modeling_cmd_req', - cmd_id: uuidv4(), - cmd: { type: 'sketch_mode_disable' }, - }) + // tsc reports this typing as perfectly fine, but eslint is complaining. + // It's actually nonsensical, so I'm quieting. + // eslint-disable-next-line @typescript-eslint/no-misused-promises + 'sketch exit execute': async ({ + context: { store }, + }): Promise => { + // When cancelling the sketch mode we should disable sketch mode within the engine. + await engineCommandManager.sendSceneCommand({ + type: 'modeling_cmd_req', + cmd_id: uuidv4(), + cmd: { type: 'sketch_mode_disable' }, + }) - sceneInfra.camControls.syncDirection = 'clientToEngine' + sceneInfra.camControls.syncDirection = 'clientToEngine' - if (cameraProjection.current === 'perspective') { - await sceneInfra.camControls.snapToPerspectiveBeforeHandingBackControlToEngine() - } + if (cameraProjection.current === 'perspective') { + await sceneInfra.camControls.snapToPerspectiveBeforeHandingBackControlToEngine() + } - sceneInfra.camControls.syncDirection = 'engineToClient' + sceneInfra.camControls.syncDirection = 'engineToClient' - store.videoElement?.pause() + store.videoElement?.pause() - kclManager - .executeCode() - .then(() => { - if (engineCommandManager.engineConnection?.idleMode) return + return kclManager + .executeCode() + .then(() => { + if (engineCommandManager.engineConnection?.idleMode) return - store.videoElement?.play().catch((e) => { - console.warn('Video playing was prevented', e) - }) + store.videoElement?.play().catch((e) => { + console.warn('Video playing was prevented', e) }) - .catch(reportRejection) - })().catch(reportRejection) + }) + .catch(reportRejection) }, 'Set mouse state': assign(({ context, event }) => { if (event.type !== 'Set mouse state') return {} @@ -297,22 +300,8 @@ export const ModelingMachineProvider = ({ null if (!setSelections) return {} - const dispatchSelection = (selection?: EditorSelection) => { - if (!selection) return // TODO less of hack for the below please - if (!editorManager.editorView) return - setTimeout(() => { - if (!editorManager.editorView) return - editorManager.editorView.dispatch({ - selection, - annotations: [ - modelingMachineEvent, - Transaction.addToHistory.of(false), - ], - }) - }) - } let selections: Selections = { - codeBasedSelections: [], + graphSelections: [], otherSelections: [], } if (setSelections.selectionType === 'singleCodeCursor') { @@ -322,7 +311,7 @@ export const ModelingMachineProvider = ({ !editorManager.isShiftDown ) { selections = { - codeBasedSelections: [], + graphSelections: [], otherSelections: [], } } else if ( @@ -330,13 +319,13 @@ export const ModelingMachineProvider = ({ !editorManager.isShiftDown ) { selections = { - codeBasedSelections: [setSelections.selection], + graphSelections: [setSelections.selection], otherSelections: [], } } else if (setSelections.selection && editorManager.isShiftDown) { selections = { - codeBasedSelections: [ - ...selectionRanges.codeBasedSelections, + graphSelections: [ + ...selectionRanges.graphSelections, setSelections.selection, ], otherSelections: selectionRanges.otherSelections, @@ -350,7 +339,15 @@ export const ModelingMachineProvider = ({ } = handleSelectionBatch({ selections, }) - codeMirrorSelection && dispatchSelection(codeMirrorSelection) + if (codeMirrorSelection) { + kclEditorActor.send({ + type: 'setLastSelectionEvent', + data: { + codeMirrorSelection, + scrollIntoView: setSelections.scrollIntoView ?? false, + }, + }) + } engineEvents && engineEvents.forEach((event) => { // eslint-disable-next-line @typescript-eslint/no-floating-promises @@ -369,32 +366,26 @@ export const ModelingMachineProvider = ({ } } - if (setSelections.selectionType === 'otherSelection') { + if ( + setSelections.selectionType === 'axisSelection' || + setSelections.selectionType === 'defaultPlaneSelection' + ) { if (editorManager.isShiftDown) { selections = { - codeBasedSelections: selectionRanges.codeBasedSelections, + graphSelections: selectionRanges.graphSelections, otherSelections: [setSelections.selection], } } else { selections = { - codeBasedSelections: [], + graphSelections: [], otherSelections: [setSelections.selection], } } - const { engineEvents, updateSceneObjectColors } = - handleSelectionBatch({ - selections, - }) - engineEvents && - engineEvents.forEach((event) => { - // eslint-disable-next-line @typescript-eslint/no-floating-promises - engineCommandManager.sendSceneCommand(event) - }) - updateSceneObjectColors() return { selectionRanges: selections, } } + if (setSelections.selectionType === 'completeSelection') { editorManager.selectRange(setSelections.selection) if (!sketchDetails) @@ -478,7 +469,7 @@ export const ModelingMachineProvider = ({ engineCommandManager.exportInfo = { intent: ExportIntent.Save, // This never gets used its only for make. - name: '', + name: file?.name?.replace('.kcl', `.${event.data.type}`) || '', } const format = { @@ -548,40 +539,19 @@ export const ModelingMachineProvider = ({ }, }, guards: { - 'has valid sweep selection': ({ context: { selectionRanges } }) => { - // A user can begin extruding if they either have 1+ faces selected or nothing selected - // TODO: I believe this guard only allows for extruding a single face at a time - const hasNoSelection = - selectionRanges.codeBasedSelections.length === 0 || - isRangeBetweenCharacters(selectionRanges) || - isSelectionLastLine(selectionRanges, codeManager.code) - - if (hasNoSelection) { - // they have no selection, we should enable the button - // so they can select the face through the cmdbar - // BUT only if there's extrudable geometry - return doesSceneHaveSweepableSketch(kclManager.ast) - } - if (!isSketchPipe(selectionRanges)) return false - - return canSweepSelection(selectionRanges) - }, 'has valid selection for deletion': ({ context: { selectionRanges }, }) => { if (!commandBarState.matches('Closed')) return false - if (selectionRanges.codeBasedSelections.length <= 0) return false + if (selectionRanges.graphSelections.length <= 0) return false return true }, - 'has valid fillet selection': ({ context: { selectionRanges } }) => - hasValidFilletSelection({ - selectionRanges, - ast: kclManager.ast, - code: codeManager.code, - }), 'Selection is on face': ({ context: { selectionRanges }, event }) => { if (event.type !== 'Enter sketch') return false if (event.data?.forceNewSketch) return false + if (artifactIsPlaneWithPaths(selectionRanges)) { + return true + } if (!isSingleCursorInPipe(selectionRanges, kclManager.ast)) return false return !!isCursorInSketchCommandRange( @@ -590,15 +560,11 @@ export const ModelingMachineProvider = ({ ) }, 'Has exportable geometry': () => { - if ( - kclManager.kclErrors.length === 0 && - kclManager.ast.body.length > 0 - ) + if (!kclManager.hasErrors() && kclManager.ast.body.length > 0) return true else { let errorMessage = 'Unable to Export ' - if (kclManager.kclErrors.length > 0) - errorMessage += 'due to KCL Errors' + if (kclManager.hasErrors()) errorMessage += 'due to KCL Errors' else if (kclManager.ast.body.length === 0) errorMessage += 'due to Empty Scene' console.error(errorMessage) @@ -631,13 +597,16 @@ export const ModelingMachineProvider = ({ ), 'animate-to-face': fromPromise(async ({ input }) => { if (!input) return undefined - if (input.type === 'extrudeFace') { - const sketched = sketchOnExtrudedFace( - kclManager.ast, - input.sketchPathToNode, - input.extrudePathToNode, - input.faceInfo - ) + if (input.type === 'extrudeFace' || input.type === 'offsetPlane') { + const sketched = + input.type === 'extrudeFace' + ? sketchOnExtrudedFace( + kclManager.ast, + input.sketchPathToNode, + input.extrudePathToNode, + input.faceInfo + ) + : sketchOnOffsetPlane(kclManager.ast, input.pathToNode) if (err(sketched)) { const sketchedError = new Error( 'Incompatible face, please try another' @@ -649,10 +618,9 @@ export const ModelingMachineProvider = ({ await kclManager.executeAstMock(modifiedAst) - await letEngineAnimateAndSyncCamAfter( - engineCommandManager, - input.faceId - ) + const id = + input.type === 'extrudeFace' ? input.faceId : input.planeId + await letEngineAnimateAndSyncCamAfter(engineCommandManager, id) sceneInfra.camControls.syncDirection = 'clientToEngine' return { sketchPathToNode: pathToNewSketchNode, @@ -683,7 +651,8 @@ export const ModelingMachineProvider = ({ }), 'animate-to-sketch': fromPromise( async ({ input: { selectionRanges } }) => { - const sourceRange = selectionRanges.codeBasedSelections[0].range + const sourceRange = + selectionRanges.graphSelections[0]?.codeRef?.range const sketchPathToNode = getNodePathFromSourceRange( kclManager.ast, sourceRange @@ -705,6 +674,7 @@ export const ModelingMachineProvider = ({ } } ), + 'Get horizontal info': fromPromise( async ({ input: { selectionRanges, sketchDetails } }) => { const { modifiedAst, pathToNodeMap } = @@ -712,7 +682,11 @@ export const ModelingMachineProvider = ({ constraint: 'setHorzDistance', selectionRanges, }) - const _modifiedAst = parse(recast(modifiedAst)) + const pResult = parse(recast(modifiedAst)) + if (trap(pResult) || !resultIsOk(pResult)) + return Promise.reject(new Error('Unexpected compilation error')) + const _modifiedAst = pResult.program + if (!sketchDetails) return Promise.reject(new Error('No sketch details')) const updatedPathToNode = updatePathToNodeFromMap( @@ -728,6 +702,11 @@ export const ModelingMachineProvider = ({ sketchDetails.origin ) if (err(updatedAst)) return Promise.reject(updatedAst) + + await codeManager.updateEditorWithAstAndWriteToFile( + updatedAst.newAst + ) + const selection = updateSelections( pathToNodeMap, selectionRanges, @@ -748,7 +727,10 @@ export const ModelingMachineProvider = ({ constraint: 'setVertDistance', selectionRanges, }) - const _modifiedAst = parse(recast(modifiedAst)) + const pResult = parse(recast(modifiedAst)) + if (trap(pResult) || !resultIsOk(pResult)) + return Promise.reject(new Error('Unexpected compilation error')) + const _modifiedAst = pResult.program if (!sketchDetails) return Promise.reject(new Error('No sketch details')) const updatedPathToNode = updatePathToNodeFromMap( @@ -764,6 +746,11 @@ export const ModelingMachineProvider = ({ sketchDetails.origin ) if (err(updatedAst)) return Promise.reject(updatedAst) + + await codeManager.updateEditorWithAstAndWriteToFile( + updatedAst.newAst + ) + const selection = updateSelections( pathToNodeMap, selectionRanges, @@ -791,7 +778,10 @@ export const ModelingMachineProvider = ({ selectionRanges, angleOrLength: 'setAngle', })) - const _modifiedAst = parse(recast(modifiedAst)) + const pResult = parse(recast(modifiedAst)) + if (trap(pResult) || !resultIsOk(pResult)) + return Promise.reject(new Error('Unexpected compilation error')) + const _modifiedAst = pResult.program if (err(_modifiedAst)) return Promise.reject(_modifiedAst) if (!sketchDetails) @@ -809,6 +799,11 @@ export const ModelingMachineProvider = ({ sketchDetails.origin ) if (err(updatedAst)) return Promise.reject(updatedAst) + + await codeManager.updateEditorWithAstAndWriteToFile( + updatedAst.newAst + ) + const selection = updateSelections( pathToNodeMap, selectionRanges, @@ -822,11 +817,22 @@ export const ModelingMachineProvider = ({ } } ), - 'Get length info': fromPromise( - async ({ input: { selectionRanges, sketchDetails } }) => { - const { modifiedAst, pathToNodeMap } = - await applyConstraintAngleLength({ selectionRanges }) - const _modifiedAst = parse(recast(modifiedAst)) + astConstrainLength: fromPromise( + async ({ + input: { selectionRanges, sketchDetails, lengthValue }, + }) => { + if (!lengthValue) + return Promise.reject(new Error('No length value')) + const constraintResult = await applyConstraintLength({ + selectionRanges, + length: lengthValue, + }) + if (err(constraintResult)) return Promise.reject(constraintResult) + const { modifiedAst, pathToNodeMap } = constraintResult + const pResult = parse(recast(modifiedAst)) + if (trap(pResult) || !resultIsOk(pResult)) + return Promise.reject(new Error('Unexpected compilation error')) + const _modifiedAst = pResult.program if (!sketchDetails) return Promise.reject(new Error('No sketch details')) const updatedPathToNode = updatePathToNodeFromMap( @@ -842,6 +848,11 @@ export const ModelingMachineProvider = ({ sketchDetails.origin ) if (err(updatedAst)) return Promise.reject(updatedAst) + + await codeManager.updateEditorWithAstAndWriteToFile( + updatedAst.newAst + ) + const selection = updateSelections( pathToNodeMap, selectionRanges, @@ -861,7 +872,10 @@ export const ModelingMachineProvider = ({ await applyConstraintIntersect({ selectionRanges, }) - const _modifiedAst = parse(recast(modifiedAst)) + const pResult = parse(recast(modifiedAst)) + if (trap(pResult) || !resultIsOk(pResult)) + return Promise.reject(new Error('Unexpected compilation error')) + const _modifiedAst = pResult.program if (!sketchDetails) return Promise.reject(new Error('No sketch details')) const updatedPathToNode = updatePathToNodeFromMap( @@ -877,6 +891,11 @@ export const ModelingMachineProvider = ({ sketchDetails.origin ) if (err(updatedAst)) return Promise.reject(updatedAst) + + await codeManager.updateEditorWithAstAndWriteToFile( + updatedAst.newAst + ) + const selection = updateSelections( pathToNodeMap, selectionRanges, @@ -897,7 +916,10 @@ export const ModelingMachineProvider = ({ constraint: 'xAbs', selectionRanges, }) - const _modifiedAst = parse(recast(modifiedAst)) + const pResult = parse(recast(modifiedAst)) + if (trap(pResult) || !resultIsOk(pResult)) + return Promise.reject(new Error('Unexpected compilation error')) + const _modifiedAst = pResult.program if (!sketchDetails) return Promise.reject(new Error('No sketch details')) const updatedPathToNode = updatePathToNodeFromMap( @@ -913,6 +935,11 @@ export const ModelingMachineProvider = ({ sketchDetails.origin ) if (err(updatedAst)) return Promise.reject(updatedAst) + + await codeManager.updateEditorWithAstAndWriteToFile( + updatedAst.newAst + ) + const selection = updateSelections( pathToNodeMap, selectionRanges, @@ -933,7 +960,10 @@ export const ModelingMachineProvider = ({ constraint: 'yAbs', selectionRanges, }) - const _modifiedAst = parse(recast(modifiedAst)) + const pResult = parse(recast(modifiedAst)) + if (trap(pResult) || !resultIsOk(pResult)) + return Promise.reject(new Error('Unexpected compilation error')) + const _modifiedAst = pResult.program if (!sketchDetails) return Promise.reject(new Error('No sketch details')) const updatedPathToNode = updatePathToNodeFromMap( @@ -949,6 +979,11 @@ export const ModelingMachineProvider = ({ sketchDetails.origin ) if (err(updatedAst)) return Promise.reject(updatedAst) + + await codeManager.updateEditorWithAstAndWriteToFile( + updatedAst.newAst + ) + const selection = updateSelections( pathToNodeMap, selectionRanges, @@ -962,41 +997,101 @@ export const ModelingMachineProvider = ({ } } ), - 'Get convert to variable info': fromPromise( + 'Apply named value constraint': fromPromise( async ({ input: { selectionRanges, sketchDetails, data } }) => { - if (!sketchDetails) + if (!sketchDetails) { return Promise.reject(new Error('No sketch details')) - const { variableName } = await getVarNameModal({ - valueName: data?.variableName || 'var', - }) - let parsed = parse(recast(kclManager.ast)) - if (trap(parsed)) return Promise.reject(parsed) - parsed = parsed as Program + } + if (!data) { + return Promise.reject(new Error('No data from command flow')) + } + let pResult = parse(recast(kclManager.ast)) + if (trap(pResult) || !resultIsOk(pResult)) + return Promise.reject(new Error('Unexpected compilation error')) + let parsed = pResult.program - const { modifiedAst: _modifiedAst, pathToReplacedNode } = - moveValueIntoNewVariablePath( - parsed, - kclManager.programMemory, - data?.pathToNode || [], - variableName + let result: { + modifiedAst: Node + pathToReplaced: PathToNode | null + } = { + modifiedAst: parsed, + pathToReplaced: null, + } + // If the user provided a constant name, + // we need to insert the named constant + // and then replace the node with the constant's name. + if ('variableName' in data.namedValue) { + const astAfterReplacement = replaceValueAtNodePath({ + ast: parsed, + pathToNode: data.currentValue.pathToNode, + newExpressionString: data.namedValue.variableName, + }) + if (trap(astAfterReplacement)) { + return Promise.reject(astAfterReplacement) + } + const parseResultAfterInsertion = parse( + recast( + insertNamedConstant({ + node: astAfterReplacement.modifiedAst, + newExpression: data.namedValue, + }) + ) ) - parsed = parse(recast(_modifiedAst)) + if ( + trap(parseResultAfterInsertion) || + !resultIsOk(parseResultAfterInsertion) + ) + return Promise.reject(parseResultAfterInsertion) + result = { + modifiedAst: parseResultAfterInsertion.program, + pathToReplaced: astAfterReplacement.pathToReplaced, + } + } else if ('valueText' in data.namedValue) { + // If they didn't provide a constant name, + // just replace the node with the value. + const astAfterReplacement = replaceValueAtNodePath({ + ast: parsed, + pathToNode: data.currentValue.pathToNode, + newExpressionString: data.namedValue.valueText, + }) + if (trap(astAfterReplacement)) { + return Promise.reject(astAfterReplacement) + } + // The `replacer` function returns a pathToNode that assumes + // an identifier is also being inserted into the AST, creating an off-by-one error. + // This corrects that error, but TODO we should fix this upstream + // to avoid this kind of error in the future. + astAfterReplacement.pathToReplaced[1][0] = + (astAfterReplacement.pathToReplaced[1][0] as number) - 1 + result = astAfterReplacement + } + + pResult = parse(recast(result.modifiedAst)) + if (trap(pResult) || !resultIsOk(pResult)) + return Promise.reject(new Error('Unexpected compilation error')) + parsed = pResult.program + if (trap(parsed)) return Promise.reject(parsed) - parsed = parsed as Program - if (!pathToReplacedNode) + parsed = parsed as Node + if (!result.pathToReplaced) return Promise.reject(new Error('No path to replaced node')) const updatedAst = await sceneEntitiesManager.updateAstAndRejigSketch( - pathToReplacedNode || [], + result.pathToReplaced || [], parsed, sketchDetails.zAxis, sketchDetails.yAxis, sketchDetails.origin ) if (err(updatedAst)) return Promise.reject(updatedAst) + + await codeManager.updateEditorWithAstAndWriteToFile( + updatedAst.newAst + ) + const selection = updateSelections( - { 0: pathToReplacedNode }, + { 0: result.pathToReplaced }, selectionRanges, updatedAst.newAst ) @@ -1004,10 +1099,19 @@ export const ModelingMachineProvider = ({ return { selectionType: 'completeSelection', selection, - updatedPathToNode: pathToReplacedNode, + updatedPathToNode: result.pathToReplaced, } } ), + 'submit-prompt-edit': fromPromise(async ({ input }) => { + return await promptToEditFlow({ + code: codeManager.code, + prompt: input.prompt, + selections: input.selection, + token, + artifactGraph: engineCommandManager.artifactGraph, + }) + }), }, }), { diff --git a/src/components/ModelingSidebar/ModelingPane.tsx b/src/components/ModelingSidebar/ModelingPane.tsx index 068c63995..f9b36fb86 100644 --- a/src/components/ModelingSidebar/ModelingPane.tsx +++ b/src/components/ModelingSidebar/ModelingPane.tsx @@ -1,3 +1,4 @@ +import { ReactNode } from 'react' import styles from './ModelingPane.module.css' import { useSettingsAuthContext } from 'hooks/useSettingsAuthContext' import { ActionButton } from 'components/ActionButton' @@ -5,23 +6,26 @@ import Tooltip from 'components/Tooltip' import { CustomIconName } from 'components/CustomIcon' import { IconDefinition } from '@fortawesome/free-solid-svg-icons' import { ActionIcon } from 'components/ActionIcon' +import { onboardingPaths } from 'routes/Onboarding/paths' -export interface ModelingPaneProps - extends React.PropsWithChildren, - React.HTMLAttributes { +export interface ModelingPaneProps { + id: string + children: ReactNode | ReactNode[] + className?: string icon?: CustomIconName | IconDefinition - title: string + title: ReactNode Menu?: React.ReactNode | React.FC detailsTestId?: string onClose: () => void } export const ModelingPaneHeader = ({ + id, icon, title, Menu, onClose, -}: Pick) => { +}: Pick) => { return (
    @@ -34,7 +38,7 @@ export const ModelingPaneHeader = ({ bgClassName="!bg-transparent" /> )} - {title} + {title}
    {Menu instanceof Function ? : Menu} onClose()} > Close @@ -56,25 +60,24 @@ export const ModelingPaneHeader = ({ } export const ModelingPane = ({ - title, - icon, id, children, className, - Menu, detailsTestId, onClose, + title, ...props }: ModelingPaneProps) => { const { settings } = useSettingsAuthContext() const onboardingStatus = settings.context.app.onboardingStatus const pointerEventsCssClass = - onboardingStatus.current === 'camera' + onboardingStatus.current === onboardingPaths.CAMERA ? 'pointer-events-none ' : 'pointer-events-auto ' return (
    - -
    {children}
    + {children}
    ) } diff --git a/src/components/ModelingSidebar/ModelingPanes/DebugPane.tsx b/src/components/ModelingSidebar/ModelingPanes/DebugPane.tsx index f96cb9ef6..c98810ded 100644 --- a/src/components/ModelingSidebar/ModelingPanes/DebugPane.tsx +++ b/src/components/ModelingSidebar/ModelingPanes/DebugPane.tsx @@ -5,16 +5,18 @@ import { CamDebugSettings } from 'clientSideScene/ClientSideSceneComp' export const DebugPane = () => { return ( -
    -
    - - - - -
    -
    +
    +
    +
    + + + + +
    +
    +
    ) } diff --git a/src/components/ModelingSidebar/ModelingPanes/FeatureTreePane.tsx b/src/components/ModelingSidebar/ModelingPanes/FeatureTreePane.tsx new file mode 100644 index 000000000..a349b2de8 --- /dev/null +++ b/src/components/ModelingSidebar/ModelingPanes/FeatureTreePane.tsx @@ -0,0 +1,381 @@ +import { Diagnostic } from '@codemirror/lint' +import { useMachine, useSelector } from '@xstate/react' +import { ContextMenu, ContextMenuItem } from 'components/ContextMenu' +import { CustomIcon, CustomIconName } from 'components/CustomIcon' +import Loading from 'components/Loading' +import { useModelingContext } from 'hooks/useModelingContext' +import { useKclContext } from 'lang/KclProvider' +import { codeRefFromRange, getArtifactFromRange } from 'lang/std/artifactGraph' +import { sourceRangeFromRust } from 'lang/wasm' +import { + filterOperations, + getOperationIcon, + getOperationLabel, +} from 'lib/operations' +import { editorManager, engineCommandManager, kclManager } from 'lib/singletons' +import { ComponentProps, useEffect, useMemo, useRef, useState } from 'react' +import { Operation } from 'wasm-lib/kcl/bindings/Operation' +import { Actor, Prop } from 'xstate' +import { featureTreeMachine } from 'machines/featureTreeMachine' +import { + editorIsMountedSelector, + kclEditorActor, + selectionEventSelector, +} from 'machines/kclEditorMachine' + +export const FeatureTreePane = () => { + const isEditorMounted = useSelector(kclEditorActor, editorIsMountedSelector) + const lastSelectionEvent = useSelector(kclEditorActor, selectionEventSelector) + const { send: modelingSend, state: modelingState } = useModelingContext() + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [_featureTreeState, featureTreeSend] = useMachine( + featureTreeMachine.provide({ + guards: { + codePaneIsOpen: () => + modelingState.context.store.openPanes.includes('code') && + editorManager.editorView !== null, + }, + actions: { + openCodePane: () => { + modelingSend({ + type: 'Set context', + data: { + openPanes: [...modelingState.context.store.openPanes, 'code'], + }, + }) + }, + sendEditFlowStart: () => { + modelingSend({ type: 'Enter sketch' }) + }, + scrollToError: () => { + editorManager.scrollToFirstErrorDiagnosticIfExists() + }, + sendSelectionEvent: ({ context }) => { + if (!context.targetSourceRange) { + return + } + const artifact = context.targetSourceRange + ? getArtifactFromRange( + context.targetSourceRange, + engineCommandManager.artifactGraph + ) + : null + if (!artifact || !('codeRef' in artifact)) { + modelingSend({ + type: 'Set selection', + data: { + selectionType: 'singleCodeCursor', + selection: { + codeRef: codeRefFromRange( + context.targetSourceRange, + kclManager.ast + ), + }, + scrollIntoView: true, + }, + }) + } else { + modelingSend({ + type: 'Set selection', + data: { + selectionType: 'singleCodeCursor', + selection: { + artifact: artifact, + codeRef: codeRefFromRange( + context.targetSourceRange, + kclManager.ast + ), + }, + scrollIntoView: true, + }, + }) + } + }, + }, + }) + ) + // If there are parse errors we show the last successful operations + // and overlay a message on top of the pane + const parseErrors = kclManager.errors.filter((e) => e.kind !== 'engine') + + // If there are engine errors we show the successful operations + // Errors return an operation list, so use the longest one if there are multiple + const longestErrorOperationList = kclManager.errors.reduce((acc, error) => { + return error.operations && error.operations.length > acc.length + ? error.operations + : acc + }, [] as Operation[]) + + const unfilteredOperationList = !parseErrors.length + ? !kclManager.errors.length + ? kclManager.execState.operations + : longestErrorOperationList + : kclManager.lastSuccessfulOperations + + // We filter out operations that are not useful to show in the feature tree + const operationList = filterOperations(unfilteredOperationList) + + // Watch for changes in the open panes and send an event to the feature tree machine + useEffect(() => { + const codeOpen = modelingState.context.store.openPanes.includes('code') + if (codeOpen && isEditorMounted) { + featureTreeSend({ type: 'codePaneOpened' }) + } + }, [modelingState.context.store.openPanes, isEditorMounted]) + + // Watch for changes in the selection and send an event to the feature tree machine + useEffect(() => { + featureTreeSend({ type: 'selected' }) + }, [lastSelectionEvent]) + + function goToError() { + featureTreeSend({ type: 'goToError' }) + } + + return ( +
    +
    + {kclManager.isExecuting ? ( + Building feature tree... + ) : ( + <> + {parseErrors.length > 0 && ( +
    +
    +

    + Errors found in KCL code. +
    + Please fix them before continuing. +

    + +
    +
    + )} + {operationList.map((operation) => { + const key = `${operation.type}-${ + 'name' in operation ? operation.name : 'anonymous' + }-${ + 'sourceRange' in operation ? operation.sourceRange[0] : 'start' + }` + + return ( + + ) + })} + + )} +
    +
    + ) +} + +export const visibilityMap = new Map() + +interface VisibilityToggleProps { + entityId: string + initialVisibility: boolean + onVisibilityChange?: () => void +} + +/** + * A button that toggles the visibility of an entity + * tied to an artifact in the feature tree. + * TODO: this is unimplemented and will be used for + * default planes after we fix them and add them to the artifact graph / feature tree + */ +const VisibilityToggle = (props: VisibilityToggleProps) => { + const [visible, setVisible] = useState(props.initialVisibility) + + function handleToggleVisible() { + setVisible(!visible) + visibilityMap.set(props.entityId, !visible) + props.onVisibilityChange?.() + } + + return ( + + ) +} + +/** + * More generic version of OperationListItem, + * to be used for default planes after we fix them and + * add them to the artifact graph / feature tree + */ +const OperationItemWrapper = ({ + icon, + name, + visibilityToggle, + menuItems, + errors, + className, + ...props +}: React.HTMLAttributes & { + icon: CustomIconName + name: string + visibilityToggle?: VisibilityToggleProps + menuItems?: ComponentProps['items'] + errors?: Diagnostic[] +}) => { + const menuRef = useRef(null) + + return ( +
    + + {errors && errors.length > 0 && ( + has error + )} + {visibilityToggle && } + {menuItems && ( + + )} +
    + ) +} + +/** + * A button with an icon, name, and context menu + * for an operation in the feature tree. + */ +const OperationItem = (props: { + item: Operation + send: Prop, 'send'> +}) => { + const kclContext = useKclContext() + const name = + 'name' in props.item && props.item.name !== null + ? getOperationLabel(props.item) + : 'anonymous' + const errors = useMemo(() => { + return kclContext.diagnostics.filter( + (diag) => + diag.severity === 'error' && + 'sourceRange' in props.item && + diag.from >= props.item.sourceRange[0] && + diag.to <= props.item.sourceRange[1] + ) + }, [kclContext.diagnostics.length]) + + function selectOperation() { + if (props.item.type === 'UserDefinedFunctionReturn') { + return + } + props.send({ + type: 'selectOperation', + data: { + targetSourceRange: sourceRangeFromRust(props.item.sourceRange), + }, + }) + } + + /** + * For now we can only enter the "edit" flow for the startSketchOn operation. + * TODO: https://github.com/KittyCAD/modeling-app/issues/4442 + */ + function enterEditFlow() { + if ( + props.item.type === 'StdLibCall' && + props.item.name === 'startSketchOn' + ) { + props.send({ + type: 'enterEditFlow', + data: { + targetSourceRange: sourceRangeFromRust(props.item.sourceRange), + }, + }) + } + } + + const menuItems = useMemo( + () => [ + { + if (props.item.type === 'UserDefinedFunctionReturn') { + return + } + props.send({ + type: 'goToKclSource', + data: { + targetSourceRange: sourceRangeFromRust(props.item.sourceRange), + }, + }) + }} + > + View KCL source code + , + ...(props.item.type === 'UserDefinedFunctionCall' + ? [ + { + if (props.item.type !== 'UserDefinedFunctionCall') { + return + } + const functionRange = props.item.functionSourceRange + // For some reason, the cursor goes to the end of the source + // range we select. So set the end equal to the beginning. + functionRange[1] = functionRange[0] + props.send({ + type: 'goToKclSource', + data: { + targetSourceRange: sourceRangeFromRust(functionRange), + }, + }) + }} + > + View function definition + , + ] + : []), + ], + [props.item, props.send] + ) + + return ( + + ) +} diff --git a/src/components/ModelingSidebar/ModelingPanes/KclEditorMenu.tsx b/src/components/ModelingSidebar/ModelingPanes/KclEditorMenu.tsx index 44a6dd4cf..b395f5f3a 100644 --- a/src/components/ModelingSidebar/ModelingPanes/KclEditorMenu.tsx +++ b/src/components/ModelingSidebar/ModelingPanes/KclEditorMenu.tsx @@ -40,7 +40,9 @@ export const KclEditorMenu = ({ children }: PropsWithChildren) => {
    diff --git a/src/components/Settings/KeybindingsSectionsList.tsx b/src/components/Settings/KeybindingsSectionsList.tsx index d9a3edb5a..11a9ecdad 100644 --- a/src/components/Settings/KeybindingsSectionsList.tsx +++ b/src/components/Settings/KeybindingsSectionsList.tsx @@ -19,7 +19,7 @@ export function KeybindingsSectionsList({ key={category} onClick={() => scrollRef.current - ?.querySelector(`#category-${category}`) + ?.querySelector(`#category-${category.replaceAll(/\s/g, '-')}`) ?.scrollIntoView({ block: 'center', behavior: 'smooth', diff --git a/src/components/SettingsAuthProvider.tsx b/src/components/SettingsAuthProvider.tsx index 95727f496..1198cd803 100644 --- a/src/components/SettingsAuthProvider.tsx +++ b/src/components/SettingsAuthProvider.tsx @@ -1,7 +1,7 @@ import { trap } from 'lib/trap' -import { useMachine } from '@xstate/react' +import { useMachine, useSelector } from '@xstate/react' import { useNavigate, useRouteLoaderData, useLocation } from 'react-router-dom' -import { PATHS } from 'lib/paths' +import { PATHS, BROWSER_PATH } from 'lib/paths' import { authMachine, TOKEN_PERSIST_KEY } from '../machines/authMachine' import withBaseUrl from '../lib/withBaseURL' import React, { createContext, useEffect, useState } from 'react' @@ -23,7 +23,6 @@ import { engineCommandManager, sceneEntitiesManager, } from 'lib/singletons' -import { uuidv4 } from 'lib/utils' import { IndexLoaderData } from 'lib/types' import { settings } from 'lib/settings/initialSettings' import { @@ -41,6 +40,8 @@ import { reportRejection } from 'lib/trap' import { getAppSettingsFilePath } from 'lib/desktop' import { isDesktop } from 'lib/isDesktop' import { useFileSystemWatcher } from 'hooks/useFileSystemWatcher' +import { codeManager } from 'lib/singletons' +import { createRouteCommands } from 'lib/commandBarConfigs/routeCommandConfig' type MachineContext = { state: StateFrom @@ -53,11 +54,15 @@ type SettingsAuthContextType = { settings: MachineContext } -// a little hacky for sure, open to changing it -// this implies that we should only even have one instance of this provider mounted at any one time -// but I think that's a safe assumption -let settingsStateRef: ContextFrom | undefined -export const getSettingsState = () => settingsStateRef +/** + * This variable is used to store the last snapshot of the settings context + * for use outside of React, such as in `wasm.ts`. It is updated every time + * the settings machine changes with `useSelector`. + * TODO: when we decouple XState from React, we can just subscribe to the actor directly from `wasm.ts` + */ +export let lastSettingsContextSnapshot: + | ContextFrom + | undefined export const SettingsAuthContext = createContext({} as SettingsAuthContextType) @@ -127,27 +132,11 @@ export const SettingsAuthProviderBase = ({ .setTheme(context.app.theme.current) .catch(reportRejection) }, - setEngineScaleGridVisibility: ({ context }) => { - engineCommandManager.setScaleGridVisibility( - context.modeling.showScaleGrid.current - ) - }, setClientTheme: ({ context }) => { const opposingTheme = getOppositeTheme(context.app.theme.current) sceneInfra.theme = opposingTheme sceneEntitiesManager.updateSegmentBaseColor(opposingTheme) }, - setEngineEdges: ({ context }) => { - // eslint-disable-next-line @typescript-eslint/no-floating-promises - engineCommandManager.sendSceneCommand({ - cmd_id: uuidv4(), - type: 'modeling_cmd_req', - cmd: { - type: 'edge_lines_visible' as any, // TODO update kittycad.ts to get this new command type - hidden: !context.modeling.highlightEdges.current, - }, - }) - }, toastSuccess: ({ event }) => { if (!('data' in event)) return const eventParts = event.type.replace(/^set./, '').split('.') as [ @@ -173,17 +162,27 @@ export const SettingsAuthProviderBase = ({ }, 'Execute AST': ({ context, event }) => { try { + const relevantSetting = (s: typeof settings) => { + return ( + s.modeling?.defaultUnit?.current !== + context.modeling.defaultUnit.current || + s.modeling.showScaleGrid.current !== + context.modeling.showScaleGrid.current || + s.modeling?.highlightEdges.current !== + context.modeling.highlightEdges.current + ) + } + const allSettingsIncludesUnitChange = event.type === 'Set all settings' && - event.settings?.modeling?.defaultUnit?.current !== - context.modeling.defaultUnit.current + relevantSetting(event.settings) const resetSettingsIncludesUnitChange = - event.type === 'Reset settings' && - context.modeling.defaultUnit.current !== - settings?.modeling?.defaultUnit?.default + event.type === 'Reset settings' && relevantSetting(settings) if ( event.type === 'set.modeling.defaultUnit' || + event.type === 'set.modeling.showScaleGrid' || + event.type === 'set.modeling.highlightEdges' || allSettingsIncludesUnitChange || resetSettingsIncludesUnitChange ) { @@ -200,19 +199,22 @@ export const SettingsAuthProviderBase = ({ console.error('Error executing AST after settings change', e) } }, - persistSettings: ({ context, event }) => { + async persistSettings({ context, event }) { // Without this, when a user changes the file, it'd // create a detection loop with the file-system watcher. if (event.doNotPersist) return - // eslint-disable-next-line @typescript-eslint/no-floating-promises - saveSettings(context, loadedProject?.project?.path) + codeManager.writeCausedByAppCheckedInFileTreeFileSystemWatcher = true + return saveSettings(context, loadedProject?.project?.path) }, }, }), { input: loadedSettings } ) - settingsStateRef = settingsState.context + // Any time the actor changes, update the settings state for external use + useSelector(settingsActor, (s) => { + lastSettingsContextSnapshot = s.context + }) useEffect(() => { if (!isDesktop()) return @@ -220,7 +222,7 @@ export const SettingsAuthProviderBase = ({ }, []) useFileSystemWatcher( - async () => { + async (eventType: string) => { // If there is a projectPath but it no longer exists it means // it was exterally removed. If we let the code past this condition // execute it will recreate the directory due to code in @@ -234,6 +236,9 @@ export const SettingsAuthProviderBase = ({ } } + // Only reload if there are changes. Ignore everything else. + if (eventType !== 'change') return + const data = await loadAndValidateSettings(loadedProject?.project?.path) settingsSend({ type: 'Set all settings', @@ -284,6 +289,44 @@ export const SettingsAuthProviderBase = ({ settingsWithCommandConfigs, ]) + // Due to the route provider, i've moved this to the SettingsAuthProvider instead of CommandBarProvider + // This will register the commands to route to Telemetry, Home, and Settings. + useEffect(() => { + const filePath = + PATHS.FILE + + '/' + + encodeURIComponent(loadedProject?.file?.path || BROWSER_PATH) + const { RouteTelemetryCommand, RouteHomeCommand, RouteSettingsCommand } = + createRouteCommands(navigate, location, filePath) + commandBarSend({ + type: 'Remove commands', + data: { + commands: [ + RouteTelemetryCommand, + RouteHomeCommand, + RouteSettingsCommand, + ], + }, + }) + if (location.pathname === PATHS.HOME) { + commandBarSend({ + type: 'Add commands', + data: { commands: [RouteTelemetryCommand, RouteSettingsCommand] }, + }) + } else if (location.pathname.includes(PATHS.FILE)) { + commandBarSend({ + type: 'Add commands', + data: { + commands: [ + RouteTelemetryCommand, + RouteSettingsCommand, + RouteHomeCommand, + ], + }, + }) + } + }, [location]) + // Listen for changes to the system theme and update the app theme accordingly // This is only done if the theme setting is set to 'system'. // It can't be done in XState (in an invoked callback, for example) diff --git a/src/components/Stream.tsx b/src/components/Stream.tsx index a81a80099..ad3e51f4a 100644 --- a/src/components/Stream.tsx +++ b/src/components/Stream.tsx @@ -17,6 +17,10 @@ import { import { useRouteLoaderData } from 'react-router-dom' import { PATHS } from 'lib/paths' import { IndexLoaderData } from 'lib/types' +import { useCommandsContext } from 'hooks/useCommandsContext' +import { err, reportRejection } from 'lib/trap' +import { getArtifactOfTypes } from 'lang/std/artifactGraph' +import { ViewControlContextMenu } from './ViewControlMenu' enum StreamState { Playing = 'playing', @@ -27,9 +31,11 @@ enum StreamState { export const Stream = () => { const [isLoading, setIsLoading] = useState(true) + const videoWrapperRef = useRef(null) const videoRef = useRef(null) const { settings } = useSettingsAuthContext() const { state, send } = useModelingContext() + const { commandBarState } = useCommandsContext() const { mediaStream } = useAppStream() const { overallState, immediateState } = useNetworkContext() const [streamState, setStreamState] = useState(StreamState.Unset) @@ -254,13 +260,21 @@ export const Stream = () => { setIsLoading(false) }, [mediaStream]) - const handleMouseUp: MouseEventHandler = (e) => { + const handleClick: MouseEventHandler = (e) => { // If we've got no stream or connection, don't do anything if (!isNetworkOkay) return if (!videoRef.current) return // If we're in sketch mode, don't send a engine-side select event if (state.matches('Sketch')) return - if (state.matches({ idle: 'showPlanes' })) return + // Only respect default plane selection if we're on a selection command argument + if ( + state.matches({ idle: 'showPlanes' }) && + !( + commandBarState.matches('Gathering arguments') && + commandBarState.context.currentArgument?.inputType === 'selection' + ) + ) + return // If we're mousing up from a camera drag, don't send a select event if (sceneInfra.camControls.wasDragging === true) return @@ -270,12 +284,50 @@ export const Stream = () => { } } + /** + * On double-click of sketch entities we automatically enter sketch mode with the selected sketch, + * allowing for quick editing of sketches. TODO: This should be moved to a more central place. + */ + const enterSketchModeIfSelectingSketch: MouseEventHandler = ( + e + ) => { + if ( + !isNetworkOkay || + !videoRef.current || + state.matches('Sketch') || + state.matches({ idle: 'showPlanes' }) || + sceneInfra.camControls.wasDragging === true || + !btnName(e.nativeEvent).left + ) { + return + } + + sendSelectEventToEngine(e, videoRef.current) + .then(({ entity_id }) => { + if (!entity_id) { + // No entity selected. This is benign + return + } + const path = getArtifactOfTypes( + { key: entity_id, types: ['path', 'solid2D', 'segment'] }, + engineCommandManager.artifactGraph + ) + if (err(path)) { + return path + } + sceneInfra.modelingSend({ type: 'Enter sketch' }) + }) + .catch(reportRejection) + } + return (
    e.preventDefault()} onContextMenuCapture={(e) => e.preventDefault()} > @@ -335,6 +387,14 @@ export const Stream = () => {
    )} + + sceneInfra.camControls.wasDragging === false && + btnName(e).right === true + } + menuTargetElement={videoWrapperRef} + />
    ) } diff --git a/src/components/TelemetryExplorer.tsx b/src/components/TelemetryExplorer.tsx new file mode 100644 index 000000000..24c0d85a2 --- /dev/null +++ b/src/components/TelemetryExplorer.tsx @@ -0,0 +1,72 @@ +import { getMarks } from 'lib/performance' + +import { + printDeltaTotal, + printInvocationCount, + printMarkDownTable, + printRawMarks, +} from 'lib/telemetry' + +export function TelemetryExplorer() { + const marks = getMarks() + const markdownTable = printMarkDownTable(marks) + const rawMarks = printRawMarks(marks) + const deltaTotalTable = printDeltaTotal(marks) + const invocationCount = printInvocationCount(marks) + // TODO data-telemetry-type + // TODO data-telemetry-name + return ( +
    +

    Marks

    +
    + {marks.map((mark, index) => { + return ( +
    +              {JSON.stringify(mark, null, 2)}
    +            
    + ) + })} +
    +

    Startup Performance

    +
    + {markdownTable.map((line, index) => { + return ( +
    +              {line}
    +            
    + ) + })} +
    +

    Delta and Totals

    +
    + {deltaTotalTable.map((line, index) => { + return ( +
    +              {line}
    +            
    + ) + })} +
    +

    Raw Marks

    +
    + {rawMarks.map((line, index) => { + return ( +
    +              {line}
    +            
    + ) + })} +
    +

    Invocation Count

    +
    + {invocationCount.map((line, index) => { + return ( +
    +              {line}
    +            
    + ) + })} +
    +
    + ) +} diff --git a/src/components/ToastTextToCad.tsx b/src/components/ToastTextToCad.tsx index 6f148bce8..e9eedb478 100644 --- a/src/components/ToastTextToCad.tsx +++ b/src/components/ToastTextToCad.tsx @@ -4,7 +4,10 @@ import { useFileContext } from 'hooks/useFileContext' import { isDesktop } from 'lib/isDesktop' import { PATHS } from 'lib/paths' import toast from 'react-hot-toast' -import { TextToCad_type } from '@kittycad/lib/dist/types/src/models' +import { + TextToCad_type, + TextToCadIteration_type, +} from '@kittycad/lib/dist/types/src/models' import { useCallback, useEffect, useRef, useState } from 'react' import { Box3, @@ -29,6 +32,7 @@ import { commandBarMachine } from 'machines/commandBarMachine' import { EventFrom } from 'xstate' import { fileMachine } from 'machines/fileMachine' import { reportRejection } from 'lib/trap' +import { codeManager, kclManager } from 'lib/singletons' const CANVAS_SIZE = 128 const PROMPT_TRUNCATE_LENGTH = 128 @@ -411,3 +415,78 @@ function traverseSceneToStyleObjects({ } }) } + +export function ToastPromptToEditCadSuccess({ + toastId, + token, + data, + oldCode, +}: { + toastId: string + oldCode: string + data: TextToCadIteration_type + token?: string +}) { + const modelId = data.id + + return ( +
    +
    +
    +

    Prompt to edit successful

    +

    + Prompt: " + {data?.prompt && data?.prompt?.length > PROMPT_TRUNCATE_LENGTH + ? data.prompt.slice(0, PROMPT_TRUNCATE_LENGTH) + '...' + : data.prompt} + " +

    +

    Do you want to keep the change?

    +
    +
    + { + sendTelemetry(modelId, 'rejected', token).catch(reportRejection) + codeManager.updateCodeEditor(oldCode) + kclManager.executeCode().catch(reportRejection) + toast.dismiss(toastId) + }} + > + {'Reject'} + + + { + sendTelemetry(modelId, 'accepted', token).catch(reportRejection) + toast.dismiss(toastId) + + // Write new content to disk since they have accepted. + codeManager + .writeToFile() + .then(() => { + // no-op + }) + .catch((e) => { + console.error('Failed to save prompt-to-edit to disk') + console.error(e) + }) + }} + > + Accept + +
    +
    +
    + ) +} diff --git a/src/components/ToastUpdate.tsx b/src/components/ToastUpdate.tsx index f8c5997e4..5a862529b 100644 --- a/src/components/ToastUpdate.tsx +++ b/src/components/ToastUpdate.tsx @@ -2,6 +2,7 @@ import toast from 'react-hot-toast' import { ActionButton } from './ActionButton' import { openExternalBrowserIfDesktop } from 'lib/openWindow' import { Marked } from '@ts-stack/markdown' +import { getReleaseUrl } from 'routes/Settings' export function ToastUpdate({ version, @@ -32,10 +33,8 @@ export function ToastUpdate({ A new update has downloaded and will be available next time you start the app. You can view the release notes{' '} diff --git a/src/components/Toolbar/EqualAngle.tsx b/src/components/Toolbar/EqualAngle.tsx index 892088bc4..d3df54bed 100644 --- a/src/components/Toolbar/EqualAngle.tsx +++ b/src/components/Toolbar/EqualAngle.tsx @@ -25,8 +25,8 @@ export function equalAngleInfo({ enabled: boolean } | Error { - const paths = selectionRanges.codeBasedSelections.map(({ range }) => - getNodePathFromSourceRange(kclManager.ast, range) + const paths = selectionRanges.graphSelections.map(({ codeRef }) => + getNodePathFromSourceRange(kclManager.ast, codeRef.range) ) const _nodes = paths.map((pathToNode) => { const tmp = getNodeFromPath(kclManager.ast, pathToNode) @@ -64,7 +64,7 @@ export function equalAngleInfo({ const transforms = getTransformInfos( { ...selectionRanges, - codeBasedSelections: selectionRanges.codeBasedSelections.slice(1), + graphSelections: selectionRanges.graphSelections.slice(1), }, kclManager.ast, 'equalAngle' diff --git a/src/components/Toolbar/EqualLength.tsx b/src/components/Toolbar/EqualLength.tsx index 23b27bc79..84578ca55 100644 --- a/src/components/Toolbar/EqualLength.tsx +++ b/src/components/Toolbar/EqualLength.tsx @@ -1,10 +1,7 @@ import { toolTips } from 'lang/langHelpers' import { Selections } from 'lib/selections' import { Program, Expr, VariableDeclarator } from '../../lang/wasm' -import { - getNodePathFromSourceRange, - getNodeFromPath, -} from '../../lang/queryAst' +import { getNodeFromPath } from '../../lang/queryAst' import { isSketchVariablesLinked } from '../../lang/std/sketchConstraints' import { transformSecondarySketchLinesTagFirst, @@ -14,6 +11,7 @@ import { import { TransformInfo } from 'lang/std/stdTypes' import { kclManager } from 'lib/singletons' import { err } from 'lib/trap' +import { Node } from 'wasm-lib/kcl/bindings/Node' export function setEqualLengthInfo({ selectionRanges, @@ -25,11 +23,8 @@ export function setEqualLengthInfo({ enabled: boolean } | Error { - const paths = selectionRanges.codeBasedSelections.map(({ range }) => - getNodePathFromSourceRange(kclManager.ast, range) - ) - const _nodes = paths.map((pathToNode) => { - const tmp = getNodeFromPath(kclManager.ast, pathToNode) + const _nodes = selectionRanges.graphSelections.map(({ codeRef }) => { + const tmp = getNodeFromPath(kclManager.ast, codeRef.pathToNode) if (err(tmp)) return tmp return tmp.node }) @@ -37,10 +32,10 @@ export function setEqualLengthInfo({ if (err(_err1)) return _err1 const nodes = _nodes as Expr[] - const _varDecs = paths.map((pathToNode) => { + const _varDecs = selectionRanges.graphSelections.map(({ codeRef }) => { const tmp = getNodeFromPath( kclManager.ast, - pathToNode, + codeRef.pathToNode, 'VariableDeclarator' ) if (err(tmp)) return tmp @@ -64,7 +59,7 @@ export function setEqualLengthInfo({ const transforms = getTransformInfos( { ...selectionRanges, - codeBasedSelections: selectionRanges.codeBasedSelections.slice(1), + graphSelections: selectionRanges.graphSelections.slice(1), }, kclManager.ast, 'equalLength' @@ -86,7 +81,7 @@ export function applyConstraintEqualLength({ selectionRanges: Selections }): | { - modifiedAst: Program + modifiedAst: Node pathToNodeMap: PathToNodeMap } | Error { diff --git a/src/components/Toolbar/HorzVert.tsx b/src/components/Toolbar/HorzVert.tsx index 797db49a7..d330ff73a 100644 --- a/src/components/Toolbar/HorzVert.tsx +++ b/src/components/Toolbar/HorzVert.tsx @@ -1,10 +1,7 @@ import { toolTips } from 'lang/langHelpers' import { Selections } from 'lib/selections' import { Program, ProgramMemory, Expr } from '../../lang/wasm' -import { - getNodePathFromSourceRange, - getNodeFromPath, -} from '../../lang/queryAst' +import { getNodeFromPath } from '../../lang/queryAst' import { PathToNodeMap, getTransformInfos, @@ -13,6 +10,7 @@ import { import { TransformInfo } from 'lang/std/stdTypes' import { kclManager } from 'lib/singletons' import { err } from 'lib/trap' +import { Node } from 'wasm-lib/kcl/bindings/Node' export function horzVertInfo( selectionRanges: Selections, @@ -23,11 +21,8 @@ export function horzVertInfo( enabled: boolean } | Error { - const paths = selectionRanges.codeBasedSelections.map(({ range }) => - getNodePathFromSourceRange(kclManager.ast, range) - ) - const _nodes = paths.map((pathToNode) => { - const tmp = getNodeFromPath(kclManager.ast, pathToNode) + const _nodes = selectionRanges.graphSelections.map(({ codeRef }) => { + const tmp = getNodeFromPath(kclManager.ast, codeRef.pathToNode) if (err(tmp)) return tmp return tmp.node }) @@ -55,11 +50,11 @@ export function horzVertInfo( export function applyConstraintHorzVert( selectionRanges: Selections, horOrVert: 'vertical' | 'horizontal', - ast: Program, + ast: Node, programMemory: ProgramMemory ): | { - modifiedAst: Program + modifiedAst: Node pathToNodeMap: PathToNodeMap } | Error { diff --git a/src/components/Toolbar/Intersect.tsx b/src/components/Toolbar/Intersect.tsx index c2cd833e8..06025fa2f 100644 --- a/src/components/Toolbar/Intersect.tsx +++ b/src/components/Toolbar/Intersect.tsx @@ -1,8 +1,7 @@ import { toolTips } from 'lang/langHelpers' -import { Selections } from 'lib/selections' import { Program, Expr, VariableDeclarator } from '../../lang/wasm' +import { Selections } from 'lib/selections' import { - getNodePathFromSourceRange, getNodeFromPath, isLinesParallelAndConstrained, } from '../../lang/queryAst' @@ -17,8 +16,9 @@ import { TransformInfo } from 'lang/std/stdTypes' import { GetInfoModal, createInfoModal } from '../SetHorVertDistanceModal' import { createVariableDeclaration } from '../../lang/modifyAst' import { removeDoubleNegatives } from '../AvailableVarsHelpers' -import { kclManager } from 'lib/singletons' +import { engineCommandManager, kclManager } from 'lib/singletons' import { err } from 'lib/trap' +import { Node } from 'wasm-lib/kcl/bindings/Node' const getModalInfo = createInfoModal(GetInfoModal) @@ -33,7 +33,7 @@ export function intersectInfo({ forcedSelectionRanges: Selections } | Error { - if (selectionRanges.codeBasedSelections.length < 2) { + if (selectionRanges.graphSelections.length < 2) { return { enabled: false, transforms: [], @@ -42,38 +42,35 @@ export function intersectInfo({ } const previousSegment = - selectionRanges.codeBasedSelections.length > 1 && + selectionRanges.graphSelections.length > 1 && isLinesParallelAndConstrained( kclManager.ast, + engineCommandManager.artifactGraph, kclManager.programMemory, - selectionRanges.codeBasedSelections[0], - selectionRanges.codeBasedSelections[1] + selectionRanges.graphSelections[0], + selectionRanges.graphSelections[1] ) + if (err(previousSegment)) return previousSegment + const artifact = selectionRanges.graphSelections[1]?.artifact const shouldUsePreviousSegment = - selectionRanges.codeBasedSelections?.[1]?.type !== 'line-end' && + (!artifact || artifact.type === 'segment') && previousSegment && previousSegment.isParallelAndConstrained const _forcedSelectionRanges: typeof selectionRanges = { ...selectionRanges, - codeBasedSelections: [ - selectionRanges.codeBasedSelections?.[0], - shouldUsePreviousSegment - ? { - range: previousSegment.sourceRange, - type: 'line-end', - } - : selectionRanges.codeBasedSelections?.[1], + graphSelections: [ + selectionRanges.graphSelections?.[0], + shouldUsePreviousSegment && previousSegment.selection + ? previousSegment.selection + : selectionRanges.graphSelections?.[1], ], } - const paths = _forcedSelectionRanges.codeBasedSelections.map(({ range }) => - getNodePathFromSourceRange(kclManager.ast, range) - ) - const _nodes = paths.map((pathToNode) => { - const tmp = getNodeFromPath(kclManager.ast, pathToNode) + const _nodes = _forcedSelectionRanges.graphSelections.map(({ codeRef }) => { + const tmp = getNodeFromPath(kclManager.ast, codeRef.pathToNode) if (err(tmp)) return tmp return tmp.node }) @@ -81,10 +78,10 @@ export function intersectInfo({ if (err(_err1)) return _err1 const nodes = _nodes as Expr[] - const _varDecs = paths.map((pathToNode) => { + const _varDecs = _forcedSelectionRanges.graphSelections.map(({ codeRef }) => { const tmp = getNodeFromPath( kclManager.ast, - pathToNode, + codeRef.pathToNode, 'VariableDeclarator' ) if (err(tmp)) return tmp @@ -111,18 +108,19 @@ export function intersectInfo({ const theTransforms = getTransformInfos( { ...selectionRanges, - codeBasedSelections: _forcedSelectionRanges.codeBasedSelections.slice(1), + graphSelections: _forcedSelectionRanges.graphSelections.slice(1), }, kclManager.ast, 'intersect' ) + const forcedArtifact = _forcedSelectionRanges?.graphSelections?.[1]?.artifact const _enableEqual = secondaryVarDecs.length === 1 && isAllTooltips && isOthersLinkedToPrimary && theTransforms.every(Boolean) && - _forcedSelectionRanges?.codeBasedSelections?.[1]?.type === 'line-end' + (!forcedArtifact || forcedArtifact.type === 'segment') return { enabled: _enableEqual, @@ -136,7 +134,7 @@ export async function applyConstraintIntersect({ }: { selectionRanges: Selections }): Promise<{ - modifiedAst: Program + modifiedAst: Node pathToNodeMap: PathToNodeMap }> { const info = intersectInfo({ diff --git a/src/components/Toolbar/RemoveConstrainingValues.tsx b/src/components/Toolbar/RemoveConstrainingValues.tsx index dd88fad01..e4fe8eb15 100644 --- a/src/components/Toolbar/RemoveConstrainingValues.tsx +++ b/src/components/Toolbar/RemoveConstrainingValues.tsx @@ -1,10 +1,7 @@ import { toolTips } from 'lang/langHelpers' import { Selection, Selections } from 'lib/selections' import { PathToNode, Program, Expr } from '../../lang/wasm' -import { - getNodePathFromSourceRange, - getNodeFromPath, -} from '../../lang/queryAst' +import { getNodeFromPath } from '../../lang/queryAst' import { PathToNodeMap, getRemoveConstraintsTransforms, @@ -13,6 +10,8 @@ import { import { TransformInfo } from 'lang/std/stdTypes' import { kclManager } from 'lib/singletons' import { err } from 'lib/trap' +import { Node } from 'wasm-lib/kcl/bindings/Node' +import { codeRefFromRange } from 'lang/std/artifactGraph' export function removeConstrainingValuesInfo({ selectionRanges, @@ -27,13 +26,8 @@ export function removeConstrainingValuesInfo({ updatedSelectionRanges: Selections } | Error { - const paths = - pathToNodes || - selectionRanges.codeBasedSelections.map(({ range }) => - getNodePathFromSourceRange(kclManager.ast, range) - ) - const _nodes = paths.map((pathToNode) => { - const tmp = getNodeFromPath(kclManager.ast, pathToNode) + const _nodes = selectionRanges.graphSelections.map(({ codeRef }) => { + const tmp = getNodeFromPath(kclManager.ast, codeRef.pathToNode) if (err(tmp)) return tmp return tmp.node }) @@ -44,10 +38,12 @@ export function removeConstrainingValuesInfo({ const updatedSelectionRanges = pathToNodes ? { otherSelections: [], - codeBasedSelections: nodes.map( + graphSelections: nodes.map( (node): Selection => ({ - range: [node.start, node.end], - type: 'default', + codeRef: codeRefFromRange( + [node.start, node.end, true], + kclManager.ast + ), }) ), } @@ -77,7 +73,7 @@ export function applyRemoveConstrainingValues({ pathToNodes?: Array }): | { - modifiedAst: Program + modifiedAst: Node pathToNodeMap: PathToNodeMap } | Error { diff --git a/src/components/Toolbar/SetAbsDistance.tsx b/src/components/Toolbar/SetAbsDistance.tsx index decae9565..f1b9652d6 100644 --- a/src/components/Toolbar/SetAbsDistance.tsx +++ b/src/components/Toolbar/SetAbsDistance.tsx @@ -1,10 +1,7 @@ import { toolTips } from 'lang/langHelpers' -import { Selections } from 'lib/selections' import { Program, Expr } from '../../lang/wasm' -import { - getNodePathFromSourceRange, - getNodeFromPath, -} from '../../lang/queryAst' +import { Selections } from 'lib/selections' +import { getNodeFromPath } from '../../lang/queryAst' import { getTransformInfos, transformAstSketchLines, @@ -23,6 +20,7 @@ import { import { removeDoubleNegatives } from '../AvailableVarsHelpers' import { kclManager } from 'lib/singletons' import { err } from 'lib/trap' +import { Node } from 'wasm-lib/kcl/bindings/Node' const getModalInfo = createSetAngleLengthModal(SetAngleLengthModal) @@ -46,13 +44,10 @@ export function absDistanceInfo({ : constraint === 'snapToYAxis' ? 'xAbs' : 'yAbs' - const paths = selectionRanges.codeBasedSelections.map(({ range }) => - getNodePathFromSourceRange(kclManager.ast, range) - ) - const _nodes = paths.map((pathToNode) => { + const _nodes = selectionRanges.graphSelections.map(({ codeRef }) => { const tmp = getNodeFromPath( kclManager.ast, - pathToNode, + codeRef.pathToNode, 'CallExpression' ) if (err(tmp)) return tmp @@ -83,7 +78,7 @@ export function absDistanceInfo({ const enabled = isAllTooltips && transforms.every(Boolean) && - selectionRanges.codeBasedSelections.length === 1 && + selectionRanges.graphSelections.length === 1 && (enableX || enableY) return { enabled, transforms } @@ -108,7 +103,7 @@ export async function applyConstraintAbsDistance({ const transform1 = transformAstSketchLines({ ast: structuredClone(kclManager.ast), - selectionRanges: selectionRanges, + selectionRanges, transformInfos, programMemory: kclManager.programMemory, referenceSegName: '', @@ -128,7 +123,7 @@ export async function applyConstraintAbsDistance({ const transform2 = transformAstSketchLines({ ast: structuredClone(kclManager.ast), - selectionRanges: selectionRanges, + selectionRanges, transformInfos, programMemory: kclManager.programMemory, referenceSegName: '', @@ -161,7 +156,7 @@ export function applyConstraintAxisAlign({ constraint: 'snapToYAxis' | 'snapToXAxis' }): | { - modifiedAst: Program + modifiedAst: Node pathToNodeMap: PathToNodeMap } | Error { @@ -176,7 +171,7 @@ export function applyConstraintAxisAlign({ return transformAstSketchLines({ ast: structuredClone(kclManager.ast), - selectionRanges: selectionRanges, + selectionRanges, transformInfos, programMemory: kclManager.programMemory, referenceSegName: '', diff --git a/src/components/Toolbar/SetAngleBetween.tsx b/src/components/Toolbar/SetAngleBetween.tsx index 17296fcf0..14a0fe72a 100644 --- a/src/components/Toolbar/SetAngleBetween.tsx +++ b/src/components/Toolbar/SetAngleBetween.tsx @@ -1,10 +1,7 @@ import { toolTips } from 'lang/langHelpers' -import { Selections } from 'lib/selections' import { Program, Expr, VariableDeclarator } from '../../lang/wasm' -import { - getNodePathFromSourceRange, - getNodeFromPath, -} from '../../lang/queryAst' +import { Selections } from 'lib/selections' +import { getNodeFromPath } from '../../lang/queryAst' import { isSketchVariablesLinked } from '../../lang/std/sketchConstraints' import { transformSecondarySketchLinesTagFirst, @@ -31,12 +28,8 @@ export function angleBetweenInfo({ enabled: boolean } | Error { - const paths = selectionRanges.codeBasedSelections.map(({ range }) => - getNodePathFromSourceRange(kclManager.ast, range) - ) - - const _nodes = paths.map((pathToNode) => { - const tmp = getNodeFromPath(kclManager.ast, pathToNode) + const _nodes = selectionRanges.graphSelections.map(({ codeRef }) => { + const tmp = getNodeFromPath(kclManager.ast, codeRef.pathToNode) if (err(tmp)) return tmp return tmp.node }) @@ -44,10 +37,10 @@ export function angleBetweenInfo({ if (err(_err1)) return _err1 const nodes = _nodes as Expr[] - const _varDecs = paths.map((pathToNode) => { + const _varDecs = selectionRanges.graphSelections.map(({ codeRef }) => { const tmp = getNodeFromPath( kclManager.ast, - pathToNode, + codeRef.pathToNode, 'VariableDeclarator' ) if (err(tmp)) return tmp @@ -71,7 +64,7 @@ export function angleBetweenInfo({ const theTransforms = getTransformInfos( { ...selectionRanges, - codeBasedSelections: selectionRanges.codeBasedSelections.slice(1), + graphSelections: selectionRanges.graphSelections.slice(1), }, kclManager.ast, 'setAngleBetween' @@ -88,10 +81,8 @@ export function angleBetweenInfo({ export async function applyConstraintAngleBetween({ selectionRanges, -}: // constraint, -{ +}: { selectionRanges: Selections - // constraint: 'setHorzDistance' | 'setVertDistance' }): Promise<{ modifiedAst: Program pathToNodeMap: PathToNodeMap diff --git a/src/components/Toolbar/SetHorzVertDistance.tsx b/src/components/Toolbar/SetHorzVertDistance.tsx index 428c680d2..172ebfa79 100644 --- a/src/components/Toolbar/SetHorzVertDistance.tsx +++ b/src/components/Toolbar/SetHorzVertDistance.tsx @@ -1,9 +1,6 @@ import { toolTips } from 'lang/langHelpers' import { Program, Expr, VariableDeclarator } from '../../lang/wasm' -import { - getNodePathFromSourceRange, - getNodeFromPath, -} from '../../lang/queryAst' +import { getNodeFromPath } from '../../lang/queryAst' import { isSketchVariablesLinked } from '../../lang/std/sketchConstraints' import { transformSecondarySketchLinesTagFirst, @@ -18,6 +15,7 @@ import { removeDoubleNegatives } from '../AvailableVarsHelpers' import { kclManager } from 'lib/singletons' import { Selections } from 'lib/selections' import { cleanErrs, err } from 'lib/trap' +import { Node } from 'wasm-lib/kcl/bindings/Node' const getModalInfo = createInfoModal(GetInfoModal) @@ -33,11 +31,8 @@ export function horzVertDistanceInfo({ enabled: boolean } | Error { - const paths = selectionRanges.codeBasedSelections.map(({ range }) => - getNodePathFromSourceRange(kclManager.ast, range) - ) - const _nodes = paths.map((pathToNode) => { - const tmp = getNodeFromPath(kclManager.ast, pathToNode) + const _nodes = selectionRanges.graphSelections.map(({ codeRef }) => { + const tmp = getNodeFromPath(kclManager.ast, codeRef.pathToNode) if (err(tmp)) return tmp return tmp.node }) @@ -46,10 +41,10 @@ export function horzVertDistanceInfo({ if (hasErr) return nodesWErrs[0] const nodes = _nodes as Expr[] - const _varDecs = paths.map((pathToNode) => { + const _varDecs = selectionRanges.graphSelections.map(({ codeRef }) => { const tmp = getNodeFromPath( kclManager.ast, - pathToNode, + codeRef.pathToNode, 'VariableDeclarator' ) if (err(tmp)) return tmp @@ -76,7 +71,7 @@ export function horzVertDistanceInfo({ const theTransforms = getTransformInfos( { ...selectionRanges, - codeBasedSelections: selectionRanges.codeBasedSelections.slice(1), + graphSelections: selectionRanges.graphSelections.slice(1), }, kclManager.ast, constraint @@ -103,7 +98,7 @@ export async function applyConstraintHorzVertDistance({ pathToNodeMap: PathToNodeMap }> { const info = horzVertDistanceInfo({ - selectionRanges, + selectionRanges: selectionRanges, constraint, }) if (err(info)) return Promise.reject(info) @@ -185,7 +180,7 @@ export function applyConstraintHorzVertAlign({ constraint: 'setHorzDistance' | 'setVertDistance' }): | { - modifiedAst: Program + modifiedAst: Node pathToNodeMap: PathToNodeMap } | Error { diff --git a/src/components/Toolbar/setAngleLength.tsx b/src/components/Toolbar/setAngleLength.tsx index 70c68c913..5453ef684 100644 --- a/src/components/Toolbar/setAngleLength.tsx +++ b/src/components/Toolbar/setAngleLength.tsx @@ -1,10 +1,7 @@ import { toolTips } from 'lang/langHelpers' -import { Selections } from 'lib/selections' import { Program, Expr } from '../../lang/wasm' -import { - getNodePathFromSourceRange, - getNodeFromPath, -} from '../../lang/queryAst' +import { Selections } from 'lib/selections' +import { getNodeFromPath } from '../../lang/queryAst' import { PathToNodeMap, getTransformInfos, @@ -25,6 +22,7 @@ import { removeDoubleNegatives } from '../AvailableVarsHelpers' import { normaliseAngle } from '../../lib/utils' import { kclManager } from 'lib/singletons' import { err } from 'lib/trap' +import { KclCommandValue } from 'lib/commandTypes' const getModalInfo = createSetAngleLengthModal(SetAngleLengthModal) @@ -40,15 +38,11 @@ export function angleLengthInfo({ enabled: boolean } | Error { - const paths = selectionRanges.codeBasedSelections.map(({ range }) => - getNodePathFromSourceRange(kclManager.ast, range) - ) - - const nodes = paths.map((pathToNode) => - getNodeFromPath(kclManager.ast, pathToNode, 'CallExpression') + const nodes = selectionRanges.graphSelections.map(({ codeRef }) => + getNodeFromPath(kclManager.ast, codeRef.pathToNode, 'CallExpression') ) const _err1 = nodes.find(err) - if (err(_err1)) return _err1 + if (_err1 instanceof Error) return _err1 const isAllTooltips = nodes.every((meta) => { if (err(meta)) return false @@ -64,12 +58,63 @@ export function angleLengthInfo({ angleOrLength ) const enabled = - selectionRanges.codeBasedSelections.length <= 1 && + selectionRanges.graphSelections.length <= 1 && isAllTooltips && transforms.every(Boolean) return { enabled, transforms } } +export async function applyConstraintLength({ + length, + selectionRanges, +}: { + length: KclCommandValue + selectionRanges: Selections +}) { + const ast = kclManager.ast + const angleLength = angleLengthInfo({ selectionRanges }) + if (err(angleLength)) return angleLength + const { transforms } = angleLength + + let distanceExpression: Expr = length.valueAst + + /** + * To be "constrained", the value must be a binary expression, a named value, or a function call. + * If it has a variable name, we need to insert a variable declaration at the correct index. + */ + if ( + 'variableName' in length && + length.variableName && + length.insertIndex !== undefined + ) { + const newBody = [...ast.body] + newBody.splice(length.insertIndex, 0, length.variableDeclarationAst) + ast.body = newBody + distanceExpression = createIdentifier(length.variableName) + } + + if (!isExprBinaryPart(distanceExpression)) { + return new Error('Invalid valueNode, is not a BinaryPart') + } + + const retval = transformAstSketchLines({ + ast, + selectionRanges, + transformInfos: transforms, + programMemory: kclManager.programMemory, + referenceSegName: '', + forceValueUsedInTransform: distanceExpression, + }) + if (err(retval)) return Promise.reject(retval) + + const { modifiedAst: _modifiedAst, pathToNodeMap } = retval + + return { + modifiedAst: _modifiedAst, + pathToNodeMap, + } +} + export async function applyConstraintAngleLength({ selectionRanges, angleOrLength = 'setLength', diff --git a/src/components/UnitsMenu.tsx b/src/components/UnitsMenu.tsx index bb7c80967..4b9c7f41d 100644 --- a/src/components/UnitsMenu.tsx +++ b/src/components/UnitsMenu.tsx @@ -41,7 +41,10 @@ export function UnitsMenu() { close() }} > - {baseUnitLabels[unit]} + {baseUnitLabels[unit]} + {unit === settings.context.modeling.defaultUnit.current && ( + current + )} ))} diff --git a/src/components/UpdaterModal.test.tsx b/src/components/UpdaterModal.test.tsx deleted file mode 100644 index fc9f156e6..000000000 --- a/src/components/UpdaterModal.test.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { fireEvent, render, screen } from '@testing-library/react' -import { vi } from 'vitest' -import { UpdaterModal } from './UpdaterModal' - -describe('UpdaterModal tests', () => { - test('Renders the modal', () => { - const callback = vi.fn() - const data = { - version: '1.2.3', - date: '2021-22-23T21:22:23Z', - body: 'This is the body.', - } - - render( - {}} - onResolve={callback} - instanceId="" - open={false} - close={(res) => {}} - version={data.version} - date={data.date} - body={data.body} - /> - ) - - expect(screen.getByTestId('update-version')).toHaveTextContent(data.version) - - const updateButton = screen.getByTestId('update-button-update') - expect(updateButton).toBeEnabled() - fireEvent.click(updateButton) - expect(callback.mock.calls).toHaveLength(1) - expect(callback.mock.lastCall[0]).toEqual({ wantUpdate: true }) - - const cancelButton = screen.getByTestId('update-button-cancel') - expect(cancelButton).toBeEnabled() - fireEvent.click(cancelButton) - expect(callback.mock.calls).toHaveLength(2) - expect(callback.mock.lastCall[0]).toEqual({ wantUpdate: false }) - }) -}) diff --git a/src/components/UpdaterModal.tsx b/src/components/UpdaterModal.tsx deleted file mode 100644 index 8742851e1..000000000 --- a/src/components/UpdaterModal.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import { create, InstanceProps } from 'react-modal-promise' -import { ActionButton } from './ActionButton' -import { Logo } from './Logo' -import { Marked } from '@ts-stack/markdown' - -type ModalResolve = { - wantUpdate: boolean -} - -type ModalReject = boolean - -type UpdaterModalProps = InstanceProps & { - version: string - date?: string - body?: string -} - -export const createUpdaterModal = create< - UpdaterModalProps, - ModalResolve, - ModalReject -> - -export const UpdaterModal = ({ - onResolve, - version, - date, - body, -}: UpdaterModalProps) => ( -
    -
    -
    -

    New version available!

    - -
    -
    - - v{version} - - Published on {date} -
    - {/* TODO: fix list bullets */} - {body && ( -
    - )} -
    - onResolve({ wantUpdate: false })} - iconStart={{ - icon: 'close', - bgClassName: 'bg-destroy-80', - iconClassName: 'text-destroy-20 group-hover:text-destroy-10', - }} - className="hover:border-destroy-40 hover:bg-destroy-10/50 dark:hover:bg-destroy-80/50" - data-testid="update-button-cancel" - > - Not now - - onResolve({ wantUpdate: true })} - iconStart={{ - icon: 'arrowRight', - bgClassName: 'dark:bg-chalkboard-80', - }} - className="dark:hover:bg-chalkboard-80/50" - data-testid="update-button-update" - > - Update - -
    -
    -
    -) diff --git a/src/components/UserSidebarMenu.test.tsx b/src/components/UserSidebarMenu.test.tsx index b89a080c5..169dd5fe4 100644 --- a/src/components/UserSidebarMenu.test.tsx +++ b/src/components/UserSidebarMenu.test.tsx @@ -1,4 +1,4 @@ -import { fireEvent, render, screen } from '@testing-library/react' +import { fireEvent, render, screen, waitFor } from '@testing-library/react' import UserSidebarMenu from './UserSidebarMenu' import { Route, @@ -13,7 +13,7 @@ import { CommandBarProvider } from './CommandBar/CommandBarProvider' type User = Models['User_type'] describe('UserSidebarMenu tests', () => { - test("Renders user's name and email if available", () => { + test("Renders user's name and email if available", async () => { const userWellFormed: User = { id: '8675309', name: 'Test User', @@ -39,13 +39,19 @@ describe('UserSidebarMenu tests', () => { fireEvent.click(screen.getByTestId('user-sidebar-toggle')) - expect(screen.getByTestId('username')).toHaveTextContent( - userWellFormed.name || '' - ) - expect(screen.getByTestId('email')).toHaveTextContent(userWellFormed.email) + await waitFor(() => { + expect(screen.getByTestId('username')).toHaveTextContent( + userWellFormed.name || '' + ) + }) + await waitFor(() => { + expect(screen.getByTestId('email')).toHaveTextContent( + userWellFormed.email + ) + }) }) - test("Renders just the user's email if no name is available", () => { + test("Renders just the user's email if no name is available", async () => { const userNoName: User = { id: '8675309', email: 'kittycad.sidebar.test@example.com', @@ -71,10 +77,12 @@ describe('UserSidebarMenu tests', () => { fireEvent.click(screen.getByTestId('user-sidebar-toggle')) - expect(screen.getByTestId('username')).toHaveTextContent(userNoName.email) + await waitFor(() => { + expect(screen.getByTestId('username')).toHaveTextContent(userNoName.email) + }) }) - test('Renders a menu button if no user avatar is available', () => { + test('Renders a menu button if no user avatar is available', async () => { const userNoAvatar: User = { id: '8675309', name: 'Test User', @@ -98,9 +106,11 @@ describe('UserSidebarMenu tests', () => { ) - expect(screen.getByTestId('user-sidebar-toggle')).toHaveTextContent( - 'User menu' - ) + await waitFor(() => { + expect(screen.getByTestId('user-sidebar-toggle')).toHaveTextContent( + 'User menu' + ) + }) }) }) diff --git a/src/components/UserSidebarMenu.tsx b/src/components/UserSidebarMenu.tsx index 711cf8f9a..7a322c462 100644 --- a/src/components/UserSidebarMenu.tsx +++ b/src/components/UserSidebarMenu.tsx @@ -168,7 +168,7 @@ const UserSidebarMenu = ({ user }: { user?: User }) => { return (
    @@ -240,7 +240,7 @@ const UserSidebarMenu = ({ user }: { user?: User }) => {
  • { close() }} diff --git a/src/components/ViewControlMenu.tsx b/src/components/ViewControlMenu.tsx new file mode 100644 index 000000000..68c8b2578 --- /dev/null +++ b/src/components/ViewControlMenu.tsx @@ -0,0 +1,66 @@ +import { reportRejection } from 'lib/trap' +import { + ContextMenu, + ContextMenuDivider, + ContextMenuItem, + ContextMenuItemRefresh, + ContextMenuProps, +} from './ContextMenu' +import { AxisNames, VIEW_NAMES_SEMANTIC } from 'lib/constants' +import { useModelingContext } from 'hooks/useModelingContext' +import { useMemo } from 'react' +import { sceneInfra } from 'lib/singletons' + +export function useViewControlMenuItems() { + const { send: modelingSend } = useModelingContext() + const menuItems = useMemo( + () => [ + ...Object.entries(VIEW_NAMES_SEMANTIC).map(([axisName, axisSemantic]) => ( + { + sceneInfra.camControls + .updateCameraToAxis(axisName as AxisNames) + .catch(reportRejection) + }} + > + {axisSemantic} view + + )), + , + { + sceneInfra.camControls.resetCameraPosition().catch(reportRejection) + }} + > + Reset view + , + { + modelingSend({ type: 'Center camera on selection' }) + }} + > + Center view on selection + , + , + , + ], + [VIEW_NAMES_SEMANTIC] + ) + return menuItems +} + +export function ViewControlContextMenu({ + menuTargetElement: wrapperRef, + ...props +}: ContextMenuProps) { + const menuItems = useViewControlMenuItems() + return ( + + ) +} diff --git a/src/editor/manager.test.ts b/src/editor/manager.test.ts new file mode 100644 index 000000000..d214ba5ec --- /dev/null +++ b/src/editor/manager.test.ts @@ -0,0 +1,81 @@ +import { editorManager } from 'lib/singletons' +import { Diagnostic } from '@codemirror/lint' + +describe('EditorManager Class', () => { + describe('makeUniqueDiagnostics', () => { + it('should filter out duplicated diagnostics', () => { + const duplicatedDiagnostics: Diagnostic[] = [ + { + from: 2, + to: 10, + severity: 'hint', + message: 'my cool message', + }, + { + from: 2, + to: 10, + severity: 'hint', + message: 'my cool message', + }, + { + from: 2, + to: 10, + severity: 'hint', + message: 'my cool message', + }, + ] + + const expected: Diagnostic[] = [ + { + from: 2, + to: 10, + severity: 'hint', + message: 'my cool message', + }, + ] + + const actual = editorManager.makeUniqueDiagnostics(duplicatedDiagnostics) + expect(actual).toStrictEqual(expected) + }) + it('should filter out duplicated diagnostic and keep some original ones', () => { + const duplicatedDiagnostics: Diagnostic[] = [ + { + from: 0, + to: 10, + severity: 'hint', + message: 'my cool message', + }, + { + from: 0, + to: 10, + severity: 'hint', + message: 'my cool message', + }, + { + from: 88, + to: 99, + severity: 'hint', + message: 'my super cool message', + }, + ] + + const expected: Diagnostic[] = [ + { + from: 0, + to: 10, + severity: 'hint', + message: 'my cool message', + }, + { + from: 88, + to: 99, + severity: 'hint', + message: 'my super cool message', + }, + ] + + const actual = editorManager.makeUniqueDiagnostics(duplicatedDiagnostics) + expect(actual).toStrictEqual(expected) + }) + }) +}) diff --git a/src/editor/manager.ts b/src/editor/manager.ts index 4ed81375c..2e8de8637 100644 --- a/src/editor/manager.ts +++ b/src/editor/manager.ts @@ -1,8 +1,9 @@ import { EditorView, ViewUpdate } from '@codemirror/view' +import { syntaxTree } from '@codemirror/language' import { EditorSelection, Annotation, Transaction } from '@codemirror/state' -import { engineCommandManager } from 'lib/singletons' +import { engineCommandManager, kclManager } from 'lib/singletons' import { modelingMachine, ModelingMachineEvent } from 'machines/modelingMachine' -import { Selections, processCodeMirrorRanges, Selection } from 'lib/selections' +import { Selections, Selection, processCodeMirrorRanges } from 'lib/selections' import { undo, redo } from '@codemirror/commands' import { CommandBarMachineEvent } from 'machines/commandBarMachine' import { addLineHighlight, addLineHighlightEvent } from './highlightextension' @@ -12,6 +13,20 @@ import { setDiagnosticsEffect, } from '@codemirror/lint' import { StateFrom } from 'xstate' +import { markOnce } from 'lib/performance' +import { kclEditorActor } from 'machines/kclEditorMachine' + +declare global { + interface Window { + EditorSelection: typeof EditorSelection + EditorView: typeof EditorView + } +} + +// We need to be able to create these during tests dynamically (via +// page.evaluate) So that's why this exists. +window.EditorSelection = EditorSelection +window.EditorView = EditorView const updateOutsideEditorAnnotation = Annotation.define() export const updateOutsideEditorEvent = updateOutsideEditorAnnotation.of(true) @@ -22,18 +37,14 @@ export const modelingMachineEvent = modelingMachineAnnotation.of(true) const setDiagnosticsAnnotation = Annotation.define() export const setDiagnosticsEvent = setDiagnosticsAnnotation.of(true) -function diagnosticIsEqual(d1: Diagnostic, d2: Diagnostic): boolean { - return d1.from === d2.from && d1.to === d2.to && d1.message === d2.message -} - export default class EditorManager { - private _editorView: EditorView | null = null private _copilotEnabled: boolean = true + private _isAllTextSelected: boolean = false private _isShiftDown: boolean = false private _selectionRanges: Selections = { otherSelections: [], - codeBasedSelections: [], + graphSelections: [], } private _lastEvent: { event: string; time: number } | null = null @@ -49,6 +60,8 @@ export default class EditorManager { private _highlightRange: Array<[number, number]> = [[0, 0]] + public _editorView: EditorView | null = null + setCopilotEnabled(enabled: boolean) { this._copilotEnabled = enabled } @@ -59,6 +72,54 @@ export default class EditorManager { setEditorView(editorView: EditorView) { this._editorView = editorView + kclEditorActor.send({ type: 'setKclEditorMounted', data: true }) + this.overrideTreeHighlighterUpdateForPerformanceTracking() + } + + overrideTreeHighlighterUpdateForPerformanceTracking() { + // @ts-ignore + this._editorView?.plugins.forEach((e) => { + let sawATreeDiff = false + + // we cannot use <>.constructor.name since it will get destroyed + // when packaging the application. + const isTreeHighlightPlugin = + e?.value && + e.value?.hasOwnProperty('tree') && + e.value?.hasOwnProperty('decoratedTo') && + e.value?.hasOwnProperty('decorations') + + if (isTreeHighlightPlugin) { + let originalUpdate = e.value.update + // @ts-ignore + function performanceTrackingUpdate(args) { + /** + * TreeHighlighter.update will be called multiple times on start up. + * We do not want to track the highlight performance of an empty update. + * mark the syntax highlight one time when the new tree comes in with the + * initial code + */ + const treeIsDifferent = + // @ts-ignore + !sawATreeDiff && this.tree !== syntaxTree(args.state) + if (treeIsDifferent && !sawATreeDiff) { + markOnce('code/willSyntaxHighlight') + } + // Call the original function + // @ts-ignore + originalUpdate.apply(this, [args]) + if (treeIsDifferent && !sawATreeDiff) { + markOnce('code/didSyntaxHighlight') + sawATreeDiff = true + } + } + e.value.update = performanceTrackingUpdate + } + }) + } + + get isAllTextSelected() { + return this._isAllTextSelected } get editorView(): EditorView | null { @@ -73,6 +134,21 @@ export default class EditorManager { this._isShiftDown = isShiftDown } + private selectionsWithSafeEnds( + selection: Array + ): Array<[number, number]> { + if (!this._editorView) { + return selection.map((s): [number, number] => { + return [s[0], s[1]] + }) + } + + return selection.map((s): [number, number] => { + const safeEnd = Math.min(s[1], this._editorView?.state.doc.length || s[1]) + return [s[0], safeEnd] + }) + } + set selectionRanges(selectionRanges: Selections) { this._selectionRanges = selectionRanges } @@ -97,13 +173,10 @@ export default class EditorManager { return this._highlightRange } - setHighlightRange(selections: Array): void { - this._highlightRange = selections + setHighlightRange(range: Array): void { + const selectionsWithSafeEnds = this.selectionsWithSafeEnds(range) - const selectionsWithSafeEnds = selections.map((s): [number, number] => { - const safeEnd = Math.min(s[1], this._editorView?.state.doc.length || s[1]) - return [s[0], safeEnd] - }) + this._highlightRange = selectionsWithSafeEnds if (this._editorView) { this._editorView.dispatch({ @@ -117,20 +190,29 @@ export default class EditorManager { } } + /** + * Given an array of Diagnostics remove any duplicates by hashing a key + * in the format of from + ' ' + to + ' ' + message. + */ + makeUniqueDiagnostics(duplicatedDiagnostics: Diagnostic[]): Diagnostic[] { + const uniqueDiagnostics: Diagnostic[] = [] + const seenDiagnostic: { [key: string]: boolean } = {} + + duplicatedDiagnostics.forEach((diagnostic: Diagnostic) => { + const hash = `${diagnostic.from} ${diagnostic.to} ${diagnostic.message}` + if (!seenDiagnostic[hash]) { + uniqueDiagnostics.push(diagnostic) + seenDiagnostic[hash] = true + } + }) + + return uniqueDiagnostics + } + setDiagnostics(diagnostics: Diagnostic[]): void { if (!this._editorView) return // Clear out any existing diagnostics that are the same. - for (const diagnostic of diagnostics) { - for (const otherDiagnostic of diagnostics) { - if (diagnosticIsEqual(diagnostic, otherDiagnostic)) { - diagnostics = diagnostics.filter( - (d) => !diagnosticIsEqual(d, diagnostic) - ) - diagnostics.push(diagnostic) - break - } - } - } + diagnostics = this.makeUniqueDiagnostics(diagnostics) this._editorView.dispatch({ effects: [setDiagnosticsEffect.of(diagnostics)], @@ -142,6 +224,32 @@ export default class EditorManager { }) } + /** + * Scroll to the first selection in the editor. + */ + scrollToSelection() { + if (!this._editorView || !this._selectionRanges.graphSelections[0]) return + + const firstSelection = this._selectionRanges.graphSelections[0] + + this._editorView.focus() + this._editorView.dispatch({ + effects: [ + EditorView.scrollIntoView( + EditorSelection.range( + firstSelection.codeRef.range[0], + firstSelection.codeRef.range[1] + ), + { y: 'center' } + ), + ], + annotations: [ + updateOutsideEditorEvent, + Transaction.addToHistory.of(false), + ], + }) + } + scrollToFirstErrorDiagnosticIfExists() { if (!this._editorView) return @@ -204,23 +312,25 @@ export default class EditorManager { } selectRange(selections: Selections) { - if (selections.codeBasedSelections.length === 0) { + if (selections?.graphSelections?.length === 0) { return } let codeBasedSelections = [] - for (const selection of selections.codeBasedSelections) { + for (const selection of selections.graphSelections) { + const safeEnd = Math.min( + selection.codeRef.range[1], + this._editorView?.state.doc.length || selection.codeRef.range[1] + ) codeBasedSelections.push( - EditorSelection.range(selection.range[0], selection.range[1]) + EditorSelection.range(selection.codeRef.range[0], safeEnd) ) } - codeBasedSelections.push( - EditorSelection.cursor( - selections.codeBasedSelections[ - selections.codeBasedSelections.length - 1 - ].range[1] - ) - ) + const end = + selections.graphSelections[selections.graphSelections.length - 1].codeRef + .range[1] + const safeEnd = Math.min(end, this._editorView?.state.doc.length || end) + codeBasedSelections.push(EditorSelection.cursor(safeEnd)) if (!this._editorView) { return @@ -257,10 +367,21 @@ export default class EditorManager { return } + this._isAllTextSelected = viewUpdate.state.selection.ranges.some( + (selection) => { + return ( + // The user will need to select the empty new lines as well to be considered all of the text. + // CTRL+A is the best way to select all the text + selection.from === 0 && selection.to === viewUpdate.state.doc.length + ) + } + ) + const eventInfo = processCodeMirrorRanges({ codeMirrorRanges: viewUpdate.state.selection.ranges, selectionRanges: this._selectionRanges, isShiftDown: this._isShiftDown, + ast: kclManager.ast, }) if (!eventInfo) { diff --git a/src/editor/plugins/lsp/kcl/colors.ts b/src/editor/plugins/lsp/kcl/colors.ts new file mode 100644 index 000000000..30a626335 --- /dev/null +++ b/src/editor/plugins/lsp/kcl/colors.ts @@ -0,0 +1,327 @@ +import { + EditorView, + WidgetType, + ViewUpdate, + ViewPlugin, + DecorationSet, + Decoration, +} from '@codemirror/view' +import { Range, Extension, Text } from '@codemirror/state' +import { NodeProp, Tree } from '@lezer/common' +import { language, syntaxTree } from '@codemirror/language' + +interface PickerState { + from: number + to: number + alpha: string + colorType: ColorType +} + +export interface WidgetOptions extends PickerState { + color: string +} + +export type ColorData = Omit + +const pickerState = new WeakMap() + +export enum ColorType { + hex = 'HEX', +} + +const hexRegex = /(^|\b)(#[0-9a-f]{3,9})(\b|$)/i + +function discoverColorsInKCL( + syntaxTree: Tree, + from: number, + to: number, + typeName: string, + doc: Text, + language?: string +): WidgetOptions | Array | null { + switch (typeName) { + case 'Program': + case 'VariableDeclaration': + case 'CallExpression': + case 'ObjectExpression': + case 'ObjectProperty': + case 'ArgumentList': + case 'PipeExpression': { + let innerTree = syntaxTree.resolveInner(from, 0).tree + + if (!innerTree) { + innerTree = syntaxTree.resolveInner(from, 1).tree + if (!innerTree) { + return null + } + } + + const overlayTree = innerTree.prop(NodeProp.mounted)?.tree + + if (overlayTree?.type.name !== 'Styles') { + return null + } + + const ret: Array = [] + overlayTree.iterate({ + from: 0, + to: overlayTree.length, + enter: ({ type, from: overlayFrom, to: overlayTo }) => { + const maybeWidgetOptions = discoverColorsInKCL( + syntaxTree, + // We add one because the tree doesn't include the + // quotation mark from the style tag + from + 1 + overlayFrom, + from + 1 + overlayTo, + type.name, + doc, + language + ) + + if (maybeWidgetOptions) { + if (Array.isArray(maybeWidgetOptions)) { + console.error('Unexpected nested overlays') + ret.push(...maybeWidgetOptions) + } else { + ret.push(maybeWidgetOptions) + } + } + }, + }) + + return ret + } + + case 'String': { + const result = parseColorLiteral(doc.sliceString(from, to)) + if (!result) { + return null + } + return { + ...result, + from, + to, + } + } + + default: + return null + } +} + +export function parseColorLiteral(colorLiteral: string): ColorData | null { + const literal = colorLiteral.replace(/"/g, '') + const match = hexRegex.exec(literal) + if (!match) { + return null + } + const [color, alpha] = toFullHex(literal) + + return { + colorType: ColorType.hex, + color, + alpha, + } +} + +function colorPickersDecorations( + view: EditorView, + discoverColors: typeof discoverColorsInKCL +) { + const widgets: Array> = [] + + const st = syntaxTree(view.state) + + for (const range of view.visibleRanges) { + st.iterate({ + from: range.from, + to: range.to, + enter: ({ type, from, to }) => { + const maybeWidgetOptions = discoverColors( + st, + from, + to, + type.name, + view.state.doc, + view.state.facet(language)?.name + ) + + if (!maybeWidgetOptions) { + return + } + + if (!Array.isArray(maybeWidgetOptions)) { + widgets.push( + Decoration.widget({ + widget: new ColorPickerWidget(maybeWidgetOptions), + side: 1, + }).range(maybeWidgetOptions.from) + ) + + return + } + + for (const wo of maybeWidgetOptions) { + widgets.push( + Decoration.widget({ + widget: new ColorPickerWidget(wo), + side: 1, + }).range(wo.from) + ) + } + }, + }) + } + + return Decoration.set(widgets) +} + +function toFullHex(color: string): string[] { + if (color.length === 4) { + // 3-char hex + return [ + `#${color[1].repeat(2)}${color[2].repeat(2)}${color[3].repeat(2)}`, + '', + ] + } + + if (color.length === 5) { + // 4-char hex (alpha) + return [ + `#${color[1].repeat(2)}${color[2].repeat(2)}${color[3].repeat(2)}`, + color[4].repeat(2), + ] + } + + if (color.length === 9) { + // 8-char hex (alpha) + return [`#${color.slice(1, -2)}`, color.slice(-2)] + } + + return [color, ''] +} + +export const wrapperClassName = 'cm-css-color-picker-wrapper' + +class ColorPickerWidget extends WidgetType { + private readonly state: PickerState + private readonly color: string + + constructor({ color, ...state }: WidgetOptions) { + super() + this.state = state + this.color = color + } + + eq(other: ColorPickerWidget) { + return ( + other.state.colorType === this.state.colorType && + other.color === this.color && + other.state.from === this.state.from && + other.state.to === this.state.to && + other.state.alpha === this.state.alpha + ) + } + + toDOM() { + const picker = document.createElement('input') + pickerState.set(picker, this.state) + picker.type = 'color' + picker.value = this.color + + const wrapper = document.createElement('span') + wrapper.appendChild(picker) + wrapper.className = wrapperClassName + + return wrapper + } + + ignoreEvent() { + return false + } +} + +export const colorPickerTheme = EditorView.baseTheme({ + [`.${wrapperClassName}`]: { + display: 'inline-block', + outline: '1px solid #eee', + marginRight: '0.6ch', + height: '1em', + width: '1em', + transform: 'translateY(1px)', + }, + [`.${wrapperClassName} input[type="color"]`]: { + cursor: 'pointer', + height: '100%', + width: '100%', + padding: 0, + border: 'none', + '&::-webkit-color-swatch-wrapper': { + padding: 0, + }, + '&::-webkit-color-swatch': { + border: 'none', + }, + '&::-moz-color-swatch': { + border: 'none', + }, + }, +}) + +interface IFactoryOptions { + discoverColors: typeof discoverColorsInKCL +} + +export const makeColorPicker = (options: IFactoryOptions) => + ViewPlugin.fromClass( + class ColorPickerViewPlugin { + decorations: DecorationSet + + constructor(view: EditorView) { + this.decorations = colorPickersDecorations(view, options.discoverColors) + } + + update(update: ViewUpdate) { + if (update.docChanged || update.viewportChanged) { + this.decorations = colorPickersDecorations( + update.view, + options.discoverColors + ) + } + } + }, + { + decorations: (v) => v.decorations, + eventHandlers: { + change: (e, view) => { + const target = e.target as HTMLInputElement + if ( + target.nodeName !== 'INPUT' || + !target.parentElement || + !target.parentElement.classList.contains(wrapperClassName) + ) { + return false + } + + const data = pickerState.get(target)! + + let converted = '"' + target.value + data.alpha + '"' + + view.dispatch({ + changes: { + from: data.from, + to: data.to, + insert: converted, + }, + }) + + return true + }, + }, + } + ) + +export const colorPicker: Extension = [ + makeColorPicker({ discoverColors: discoverColorsInKCL }), + colorPickerTheme, +] diff --git a/src/editor/plugins/lsp/kcl/index.ts b/src/editor/plugins/lsp/kcl/index.ts index 42de1a5b2..205397b79 100644 --- a/src/editor/plugins/lsp/kcl/index.ts +++ b/src/editor/plugins/lsp/kcl/index.ts @@ -96,10 +96,10 @@ export class KclPlugin implements PluginValue { const newCode = viewUpdate.state.doc.toString() codeManager.code = newCode - // eslint-disable-next-line @typescript-eslint/no-floating-promises - codeManager.writeToFile() - this.scheduleUpdateDoc() + void codeManager.writeToFile().then(() => { + this.scheduleUpdateDoc() + }) } scheduleUpdateDoc() { diff --git a/src/editor/plugins/lsp/kcl/language.ts b/src/editor/plugins/lsp/kcl/language.ts index 6e2bc502b..d1884b498 100644 --- a/src/editor/plugins/lsp/kcl/language.ts +++ b/src/editor/plugins/lsp/kcl/language.ts @@ -1,22 +1,14 @@ // Code mirror language implementation for kcl. -import { - LRLanguage, - LanguageSupport, - indentNodeProp, - continuedIndent, - delimitedIndent, - foldNodeProp, - foldInside, -} from '@codemirror/language' +import { LanguageSupport } from '@codemirror/language' import { LanguageServerClient, LanguageServerPlugin, } from '@kittycad/codemirror-lsp-client' import { kclPlugin } from '.' import type * as LSP from 'vscode-languageserver-protocol' -// @ts-ignore: No types available -import { parser } from './kcl.grammar' +import { colorPicker } from './colors' +import { KclLanguage } from '@kittycad/codemirror-lang-kcl' export interface LanguageOptions { workspaceFolders: LSP.WorkspaceFolder[] @@ -28,40 +20,15 @@ export interface LanguageOptions { ) => void } -export const KclLanguage = LRLanguage.define({ - name: 'kcl', - parser: parser.configure({ - props: [ - indentNodeProp.add({ - Body: delimitedIndent({ closing: '}' }), - BlockComment: () => null, - 'Statement Property': continuedIndent({ except: /^{/ }), - }), - foldNodeProp.add({ - 'Body ArrayExpression ObjectExpression': foldInside, - BlockComment(tree) { - return { from: tree.from + 2, to: tree.to - 2 } - }, - PipeExpression(tree) { - return { from: tree.firstChild!.to, to: tree.to } - }, - }), - ], - }), - languageData: { - commentTokens: { line: '//', block: { open: '/*', close: '*/' } }, - }, -}) - export function kcl(options: LanguageOptions) { - return new LanguageSupport( - KclLanguage, + return new LanguageSupport(KclLanguage, [ + colorPicker, kclPlugin({ documentUri: options.documentUri, workspaceFolders: options.workspaceFolders, allowHTMLContent: true, client: options.client, processLspNotification: options.processLspNotification, - }) - ) + }), + ]) } diff --git a/src/editor/plugins/lsp/types.ts b/src/editor/plugins/lsp/types.ts index 417a5b6fe..b512de30f 100644 --- a/src/editor/plugins/lsp/types.ts +++ b/src/editor/plugins/lsp/types.ts @@ -1,7 +1,5 @@ import { LspWorkerEventType } from '@kittycad/codemirror-lsp-client' -import { UnitLength } from 'wasm-lib/kcl/bindings/UnitLength' - export enum LspWorker { Kcl = 'kcl', Copilot = 'copilot', @@ -9,7 +7,6 @@ export enum LspWorker { export interface KclWorkerOptions { wasmUrl: string token: string - baseUnit: UnitLength apiBaseUrl: string } diff --git a/src/editor/plugins/lsp/worker.ts b/src/editor/plugins/lsp/worker.ts index 950f8a435..ed91c5d20 100644 --- a/src/editor/plugins/lsp/worker.ts +++ b/src/editor/plugins/lsp/worker.ts @@ -17,7 +17,6 @@ import { KclWorkerOptions, CopilotWorkerOptions, } from 'editor/plugins/lsp/types' -import { EngineCommandManager } from 'lang/std/engineConnection' import { err, reportRejection } from 'lib/trap' const intoServer: IntoServer = new IntoServer() @@ -46,14 +45,12 @@ export async function copilotLspRun( export async function kclLspRun( config: ServerConfig, - engineCommandManager: EngineCommandManager | null, token: string, - baseUnit: string, baseUrl: string ) { try { console.log('start kcl lsp') - await kcl_lsp_run(config, engineCommandManager, baseUnit, token, baseUrl) + await kcl_lsp_run(config, null, undefined, token, baseUrl) } catch (e: any) { console.log('kcl lsp failed', e) // We can't restart here because a moved value, we should do this another way. @@ -82,13 +79,7 @@ onmessage = function (event: MessageEvent) { switch (worker) { case LspWorker.Kcl: const kclData = eventData as KclWorkerOptions - await kclLspRun( - config, - null, - kclData.token, - kclData.baseUnit, - kclData.apiBaseUrl - ) + await kclLspRun(config, kclData.token, kclData.apiBaseUrl) break case LspWorker.Copilot: let copilotData = eventData as CopilotWorkerOptions diff --git a/src/hooks/useEngineConnectionSubscriptions.ts b/src/hooks/useEngineConnectionSubscriptions.ts index 3bfeb5f14..ec2a34761 100644 --- a/src/hooks/useEngineConnectionSubscriptions.ts +++ b/src/hooks/useEngineConnectionSubscriptions.ts @@ -1,4 +1,4 @@ -import { useEffect } from 'react' +import { useEffect, useRef } from 'react' import { editorManager, engineCommandManager, @@ -9,22 +9,22 @@ import { useModelingContext } from './useModelingContext' import { getEventForSelectWithPoint } from 'lib/selections' import { getCapCodeRef, - getSweepEdgeCodeRef, getSweepFromSuspectedSweepSurface, - getEdgeCuteConsumedCodeRef, - getSolid2dCodeRef, getWallCodeRef, + getCodeRefsByArtifactId, getArtifactOfTypes, SegmentArtifact, } from 'lang/std/artifactGraph' import { err, reportRejection } from 'lib/trap' import { DefaultPlaneStr, getFaceDetails } from 'clientSideScene/sceneEntities' import { getNodeFromPath, getNodePathFromSourceRange } from 'lang/queryAst' -import { CallExpression } from 'lang/wasm' +import { CallExpression, defaultSourceRange } from 'lang/wasm' import { EdgeCutInfo, ExtrudeFacePlane } from 'machines/modelingMachine' export function useEngineConnectionSubscriptions() { const { send, context, state } = useModelingContext() + const stateRef = useRef(state) + stateRef.current = state useEffect(() => { if (!engineCommandManager) return @@ -34,69 +34,19 @@ export function useEngineConnectionSubscriptions() { event: 'highlight_set_entity', callback: ({ data }) => { if (data?.entity_id) { - const artifact = engineCommandManager.artifactGraph.get( - data.entity_id + const codeRefs = getCodeRefsByArtifactId( + data.entity_id, + engineCommandManager.artifactGraph ) - if (artifact?.type === 'solid2D') { - const codeRef = getSolid2dCodeRef( - artifact, - engineCommandManager.artifactGraph - ) - if (err(codeRef)) return - editorManager.setHighlightRange([codeRef.range]) - } else if (artifact?.type === 'cap') { - const codeRef = getCapCodeRef( - artifact, - engineCommandManager.artifactGraph - ) - if (err(codeRef)) return - editorManager.setHighlightRange([codeRef.range]) - } else if (artifact?.type === 'wall') { - const extrusion = getSweepFromSuspectedSweepSurface( - data.entity_id, - engineCommandManager.artifactGraph - ) - const codeRef = getWallCodeRef( - artifact, - engineCommandManager.artifactGraph - ) - if (err(codeRef)) return - editorManager.setHighlightRange( - err(extrusion) - ? [codeRef.range] - : [codeRef.range, extrusion.codeRef.range] - ) - } else if (artifact?.type === 'sweepEdge') { - const codeRef = getSweepEdgeCodeRef( - artifact, - engineCommandManager.artifactGraph - ) - if (err(codeRef)) return - editorManager.setHighlightRange([codeRef.range]) - } else if (artifact?.type === 'segment') { - editorManager.setHighlightRange([ - artifact?.codeRef?.range || [0, 0], - ]) - } else if (artifact?.type === 'edgeCut') { - const codeRef = artifact.codeRef - const consumedCodeRef = getEdgeCuteConsumedCodeRef( - artifact, - engineCommandManager.artifactGraph - ) - editorManager.setHighlightRange( - err(consumedCodeRef) - ? [codeRef.range] - : [codeRef.range, consumedCodeRef.range] - ) - } else { - editorManager.setHighlightRange([[0, 0]]) + if (codeRefs) { + editorManager.setHighlightRange(codeRefs.map(({ range }) => range)) } } else if ( !editorManager.highlightRange || (editorManager.highlightRange[0][0] !== 0 && editorManager.highlightRange[0][1] !== 0) ) { - editorManager.setHighlightRange([[0, 0]]) + editorManager.setHighlightRange([defaultSourceRange()]) } }, }) @@ -104,6 +54,7 @@ export function useEngineConnectionSubscriptions() { event: 'select_with_point', callback: (engineEvent) => { ;(async () => { + if (stateRef.current.matches('Sketch no face')) return const event = await getEventForSelectWithPoint(engineEvent) event && send(event) })().catch(reportRejection) @@ -186,8 +137,43 @@ export function useEngineConnectionSubscriptions() { }) return } + const artifact = + engineCommandManager.artifactGraph.get(planeOrFaceId) + + if (artifact?.type === 'plane') { + const planeInfo = await getFaceDetails(planeOrFaceId) + sceneInfra.modelingSend({ + type: 'Select default plane', + data: { + type: 'offsetPlane', + zAxis: [ + planeInfo.z_axis.x, + planeInfo.z_axis.y, + planeInfo.z_axis.z, + ], + yAxis: [ + planeInfo.y_axis.x, + planeInfo.y_axis.y, + planeInfo.y_axis.z, + ], + position: [ + planeInfo.origin.x, + planeInfo.origin.y, + planeInfo.origin.z, + ].map((num) => num / sceneInfra._baseUnitMultiplier) as [ + number, + number, + number + ], + planeId: planeOrFaceId, + pathToNode: artifact.codeRef.pathToNode, + }, + }) + return + } + + // Artifact is likely an extrusion face const faceId = planeOrFaceId - const artifact = engineCommandManager.artifactGraph.get(faceId) const extrusion = getSweepFromSuspectedSweepSurface( faceId, engineCommandManager.artifactGraph @@ -215,7 +201,7 @@ export function useEngineConnectionSubscriptions() { const { z_axis, y_axis, origin } = faceInfo const sketchPathToNode = getNodePathFromSourceRange( kclManager.ast, - err(codeRef) ? [0, 0] : codeRef.range + err(codeRef) ? defaultSourceRange() : codeRef.range ) const getEdgeCutMeta = (): null | EdgeCutInfo => { diff --git a/src/hooks/useProjectsContext.ts b/src/hooks/useProjectsContext.ts new file mode 100644 index 000000000..2cc3551be --- /dev/null +++ b/src/hooks/useProjectsContext.ts @@ -0,0 +1,6 @@ +import { ProjectsMachineContext } from 'components/ProjectsContextProvider' +import { useContext } from 'react' + +export const useProjectsContext = () => { + return useContext(ProjectsMachineContext) +} diff --git a/src/hooks/useRefreshSettings.ts b/src/hooks/useRefreshSettings.ts index 6c1447b7b..da7c440d2 100644 --- a/src/hooks/useRefreshSettings.ts +++ b/src/hooks/useRefreshSettings.ts @@ -26,6 +26,7 @@ export function useRefreshSettings(routeId: string = PATHS.INDEX) { ctx.settings.send({ type: 'Set all settings', settings: routeData, + doNotPersist: true, }) }, []) } diff --git a/src/hooks/useSetupEngineManager.ts b/src/hooks/useSetupEngineManager.ts index a8095b1b3..cb23e666f 100644 --- a/src/hooks/useSetupEngineManager.ts +++ b/src/hooks/useSetupEngineManager.ts @@ -2,7 +2,7 @@ import { useLayoutEffect, useEffect, useRef } from 'react' import { engineCommandManager, kclManager } from 'lib/singletons' import { deferExecution } from 'lib/utils' import { Themes } from 'lib/theme' -import { makeDefaultPlanes, modifyGrid } from 'lang/wasm' +import { makeDefaultPlanes } from 'lang/wasm' import { useModelingContext } from './useModelingContext' import { useNetworkContext } from 'hooks/useNetworkContext' import { useAppState, useAppStream } from 'AppState' @@ -56,9 +56,6 @@ export function useSetupEngineManager( makeDefaultPlanes: () => { return makeDefaultPlanes(kclManager.engineCommandManager) }, - modifyGrid: (hidden: boolean) => { - return modifyGrid(kclManager.engineCommandManager, hidden) - }, }) hasSetNonZeroDimensions.current = true } diff --git a/src/hooks/useStateMachineCommands.ts b/src/hooks/useStateMachineCommands.ts index 14adeb640..927def5be 100644 --- a/src/hooks/useStateMachineCommands.ts +++ b/src/hooks/useStateMachineCommands.ts @@ -5,7 +5,7 @@ import { useCommandsContext } from './useCommandsContext' import { modelingMachine } from 'machines/modelingMachine' import { authMachine } from 'machines/authMachine' import { settingsMachine } from 'machines/settingsMachine' -import { homeMachine } from 'machines/homeMachine' +import { projectsMachine } from 'machines/projectsMachine' import { Command, StateMachineCommandSetConfig, @@ -22,7 +22,7 @@ export type AllMachines = | typeof modelingMachine | typeof settingsMachine | typeof authMachine - | typeof homeMachine + | typeof projectsMachine interface UseStateMachineCommandsArgs< T extends AllMachines, diff --git a/src/hooks/useToolbarGuards.ts b/src/hooks/useToolbarGuards.ts index bfcb5eb80..36c99eff7 100644 --- a/src/hooks/useToolbarGuards.ts +++ b/src/hooks/useToolbarGuards.ts @@ -2,13 +2,13 @@ import { SetVarNameModal, createSetVarNameModal, } from 'components/SetVarNameModal' -import { editorManager, kclManager } from 'lib/singletons' -import { reportRejection, trap } from 'lib/trap' +import { editorManager, kclManager, codeManager } from 'lib/singletons' +import { reportRejection, trap, err } from 'lib/trap' import { moveValueIntoNewVariable } from 'lang/modifyAst' import { isNodeSafeToReplace } from 'lang/queryAst' import { useEffect, useState } from 'react' import { useModelingContext } from './useModelingContext' -import { PathToNode, SourceRange } from 'lang/wasm' +import { PathToNode, SourceRange, recast } from 'lang/wasm' import { useKclContext } from 'lang/KclProvider' import { toSync } from 'lib/utils' @@ -24,18 +24,22 @@ export function useConvertToVariable(range?: SourceRange) { }, [enable]) useEffect(() => { + // Return early if there are no selection ranges for whatever reason + if (!context.selectionRanges) return const parsed = ast const meta = isNodeSafeToReplace( parsed, - range || context.selectionRanges.codeBasedSelections?.[0]?.range || [] + range || + context.selectionRanges.graphSelections?.[0]?.codeRef?.range || + [] ) if (trap(meta)) return const { isSafe, value } = meta const canReplace = isSafe && value.type !== 'Identifier' const isOnlyOneSelection = - !!range || context.selectionRanges.codeBasedSelections.length === 1 + !!range || context.selectionRanges.graphSelections.length === 1 setEnabled(canReplace && isOnlyOneSelection) }, [context.selectionRanges]) @@ -52,11 +56,16 @@ export function useConvertToVariable(range?: SourceRange) { moveValueIntoNewVariable( ast, kclManager.programMemory, - range || context.selectionRanges.codeBasedSelections[0].range, + range || context.selectionRanges.graphSelections[0]?.codeRef?.range, variableName ) await kclManager.updateAst(_modifiedAst, true) + + const newCode = recast(_modifiedAst) + if (err(newCode)) return + codeManager.updateCodeEditor(newCode) + return pathToReplacedNode } catch (e) { console.log('error', e) diff --git a/src/index.css b/src/index.css index 7f659b645..90e9e9a84 100644 --- a/src/index.css +++ b/src/index.css @@ -85,7 +85,8 @@ textarea, } button { - @apply border border-chalkboard-30 m-0.5 px-3 rounded text-xs focus-visible:ring-primary; + @apply border border-chalkboard-30 m-0.5 px-3 rounded text-xs; + @apply focus-visible:outline-chalkboard-100; } button:hover { @@ -93,7 +94,7 @@ button:hover { } .dark button { - @apply border-chalkboard-70 focus-visible:ring-primary/50; + @apply border-chalkboard-70 focus-visible:outline-chalkboard-10; } .dark button:hover { @@ -311,9 +312,27 @@ code { @apply bg-chalkboard-20 text-chalkboard-80; @apply dark:bg-chalkboard-80 dark:text-chalkboard-30; } + + button.reset { + @apply bg-transparent border-transparent m-0 p-0 rounded-none text-base; + } + + button.reset:hover { + @apply bg-transparent border-transparent; + } + + /* Add an outline that matches the app foreground (or text) color */ + .outline-appForeground { + @apply outline-chalkboard-100 dark:outline-chalkboard-10; + } } #code-mirror-override .cm-scroller, #code-mirror-override .cm-editor { height: 100% !important; } + +/* Can't use #code-mirror-override here as we're outside of this div */ +.body-bg .cm-diagnosticAction { + @apply bg-primary; +} diff --git a/src/index.tsx b/src/index.tsx index 77aa7fe83..12d1c361a 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -8,8 +8,10 @@ import ModalContainer from 'react-modal-promise' import { isDesktop } from 'lib/isDesktop' import { AppStreamProvider } from 'AppState' import { ToastUpdate } from 'components/ToastUpdate' +import { markOnce } from 'lib/performance' import { AUTO_UPDATER_TOAST_ID } from 'lib/constants' +markOnce('code/willAuth') // uncomment for xstate inspector // import { DEV } from 'env' // import { inspect } from '@xstate/inspect' diff --git a/src/lang/KclProvider.tsx b/src/lang/KclProvider.tsx index c4d47c956..c2a6b3a45 100644 --- a/src/lang/KclProvider.tsx +++ b/src/lang/KclProvider.tsx @@ -1,16 +1,18 @@ -import { KCLError } from './errors' import { createContext, useContext, useEffect, useState } from 'react' import { type IndexLoaderData } from 'lib/types' import { useLoaderData } from 'react-router-dom' import { codeManager, kclManager } from 'lib/singletons' +import { Diagnostic } from '@codemirror/lint' +import { KCLError } from './errors' const KclContext = createContext({ code: codeManager?.code || '', programMemory: kclManager?.programMemory, ast: kclManager?.ast, isExecuting: kclManager?.isExecuting, - errors: kclManager?.kclErrors, + diagnostics: kclManager?.diagnostics, logs: kclManager?.logs, + errors: kclManager?.errors, wasmInitFailed: kclManager?.wasmInitFailed, }) @@ -32,6 +34,7 @@ export function KclContextProvider({ const [programMemory, setProgramMemory] = useState(kclManager.programMemory) const [ast, setAst] = useState(kclManager.ast) const [isExecuting, setIsExecuting] = useState(false) + const [diagnostics, setDiagnostics] = useState([]) const [errors, setErrors] = useState([]) const [logs, setLogs] = useState([]) const [wasmInitFailed, setWasmInitFailed] = useState(false) @@ -44,7 +47,8 @@ export function KclContextProvider({ setProgramMemory, setAst, setLogs, - setKclErrors: setErrors, + setErrors, + setDiagnostics, setIsExecuting, setWasmInitFailed, }) @@ -57,8 +61,9 @@ export function KclContextProvider({ programMemory, ast, isExecuting, - errors, + diagnostics, logs, + errors, wasmInitFailed, }} > diff --git a/src/lang/KclSingleton.ts b/src/lang/KclSingleton.ts index 8fa47120b..87b33bf64 100644 --- a/src/lang/KclSingleton.ts +++ b/src/lang/KclSingleton.ts @@ -1,6 +1,10 @@ import { executeAst, lintAst } from 'lang/langHelpers' -import { Selections } from 'lib/selections' -import { KCLError, kclErrorsToDiagnostics } from './errors' +import { handleSelectionBatch, Selections } from 'lib/selections' +import { + KCLError, + complilationErrorsToDiagnostics, + kclErrorsToDiagnostics, +} from './errors' import { uuidv4 } from 'lib/utils' import { EngineCommandManager } from './std/engineConnection' import { err } from 'lib/trap' @@ -8,6 +12,7 @@ import { EXECUTE_AST_INTERRUPT_ERROR_MESSAGE } from 'lib/constants' import { CallExpression, + clearSceneAndBustCache, emptyExecState, ExecState, initPromise, @@ -21,9 +26,16 @@ import { import { getNodeFromPath } from './queryAst' import { codeManager, editorManager, sceneInfra } from 'lib/singletons' import { Diagnostic } from '@codemirror/lint' +import { markOnce } from 'lib/performance' +import { Node } from 'wasm-lib/kcl/bindings/Node' +import { + EntityType_type, + ModelingCmdReq_type, +} from '@kittycad/lib/dist/types/src/models' +import { Operation } from 'wasm-lib/kcl/bindings/Operation' interface ExecuteArgs { - ast?: Program + ast?: Node zoomToFit?: boolean executionId?: number zoomOnRangeAndType?: { @@ -33,32 +45,38 @@ interface ExecuteArgs { } export class KclManager { - private _ast: Program = { + private _ast: Node = { body: [], + shebang: null, start: 0, end: 0, + moduleId: 0, nonCodeMeta: { nonCodeNodes: {}, - start: [], + startNodes: [], }, } private _execState: ExecState = emptyExecState() private _programMemory: ProgramMemory = ProgramMemory.empty() lastSuccessfulProgramMemory: ProgramMemory = ProgramMemory.empty() + lastSuccessfulOperations: Operation[] = [] private _logs: string[] = [] - private _lints: Diagnostic[] = [] - private _kclErrors: KCLError[] = [] + private _errors: KCLError[] = [] + private _diagnostics: Diagnostic[] = [] private _isExecuting = false private _executeIsStale: ExecuteArgs | null = null private _wasmInitFailed = true + private _hasErrors = false + private _switchedFiles = false engineCommandManager: EngineCommandManager private _isExecutingCallback: (arg: boolean) => void = () => {} - private _astCallBack: (arg: Program) => void = () => {} + private _astCallBack: (arg: Node) => void = () => {} private _programMemoryCallBack: (arg: ProgramMemory) => void = () => {} private _logsCallBack: (arg: string[]) => void = () => {} - private _kclErrorsCallBack: (arg: KCLError[]) => void = () => {} + private _kclErrorsCallBack: (errors: KCLError[]) => void = () => {} + private _diagnosticsCallback: (errors: Diagnostic[]) => void = () => {} private _wasmInitFailedCallback: (arg: boolean) => void = () => {} private _executeCallback: () => void = () => {} @@ -70,6 +88,10 @@ export class KclManager { this._astCallBack(ast) } + set switchedFiles(switchedFiles: boolean) { + this._switchedFiles = switchedFiles + } + get programMemory() { return this._programMemory } @@ -79,7 +101,7 @@ export class KclManager { this._programMemoryCallBack(programMemory) } - set execState(execState) { + private set execState(execState) { this._execState = execState this.programMemory = execState.memory } @@ -88,6 +110,13 @@ export class KclManager { return this._execState } + get errors() { + return this._errors + } + set errors(errors) { + this._errors = errors + this._kclErrorsCallBack(errors) + } get logs() { return this._logs } @@ -96,38 +125,28 @@ export class KclManager { this._logsCallBack(logs) } - get lints() { - return this._lints + get diagnostics() { + return this._diagnostics } - set lints(lints) { - if (lints === this._lints) return - this._lints = lints - // Run the lints through the diagnostics. - this.kclErrors = this._kclErrors - } - - get kclErrors() { - return this._kclErrors - } - set kclErrors(kclErrors) { - if (kclErrors === this._kclErrors && this.lints.length === 0) return - this._kclErrors = kclErrors + set diagnostics(ds) { + if (ds === this._diagnostics) return + this._diagnostics = ds this.setDiagnosticsForCurrentErrors() - this._kclErrorsCallBack(kclErrors) + } + + addDiagnostics(ds: Diagnostic[]) { + if (ds.length === 0) return + this.diagnostics = this.diagnostics.concat(ds) + } + + hasErrors(): boolean { + return this._hasErrors } setDiagnosticsForCurrentErrors() { - let diagnostics = kclErrorsToDiagnostics(this.kclErrors) - if (this.lints.length > 0) { - diagnostics = diagnostics.concat(this.lints) - } - editorManager.setDiagnostics(diagnostics) - } - - addKclErrors(kclErrors: KCLError[]) { - if (kclErrors.length === 0) return - this.kclErrors = this.kclErrors.concat(kclErrors) + editorManager?.setDiagnostics(this.diagnostics) + this._diagnosticsCallback(this.diagnostics) } get isExecuting() { @@ -167,8 +186,12 @@ export class KclManager { this.engineCommandManager = engineCommandManager // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.ensureWasmInit().then(() => { - this.ast = this.safeParse(codeManager.code) || this.ast + this.ensureWasmInit().then(async () => { + await this.safeParse(codeManager.code).then((ast) => { + if (ast) { + this.ast = ast + } + }) }) } @@ -176,21 +199,24 @@ export class KclManager { setProgramMemory, setAst, setLogs, - setKclErrors, + setErrors, + setDiagnostics, setIsExecuting, setWasmInitFailed, }: { setProgramMemory: (arg: ProgramMemory) => void - setAst: (arg: Program) => void + setAst: (arg: Node) => void setLogs: (arg: string[]) => void - setKclErrors: (arg: KCLError[]) => void + setErrors: (errors: KCLError[]) => void + setDiagnostics: (errors: Diagnostic[]) => void setIsExecuting: (arg: boolean) => void setWasmInitFailed: (arg: boolean) => void }) { this._programMemoryCallBack = setProgramMemory this._astCallBack = setAst this._logsCallBack = setLogs - this._kclErrorsCallBack = setKclErrors + this._kclErrorsCallBack = setErrors + this._diagnosticsCallback = setDiagnostics this._isExecutingCallback = setIsExecuting this._wasmInitFailedCallback = setWasmInitFailed } @@ -201,27 +227,59 @@ export class KclManager { clearAst() { this._ast = { body: [], + shebang: null, start: 0, end: 0, + moduleId: 0, nonCodeMeta: { nonCodeNodes: {}, - start: [], + startNodes: [], }, } } - safeParse(code: string): Program | null { - const ast = parse(code) - this.lints = [] - this.kclErrors = [] - if (!err(ast)) return ast - const kclerror: KCLError = ast as KCLError + // (jess) I'm not in love with this, but it ensures we clear the scene and + // bust the cache on + // errors from parsing when opening new files. + // Why not just clear the cache on all parse errors, you ask? well its actually + // really nice to keep the cache on parse errors within the same file, and + // only bust on engine errors esp if they take a long time to execute and + // you hit the wrong key! + private async checkIfSwitchedFilesShouldClear() { + // If we were switching files and we hit an error on parse we need to bust + // the cache and clear the scene. + if (this._hasErrors && this._switchedFiles) { + await clearSceneAndBustCache(this.engineCommandManager) + } else if (this._switchedFiles) { + // Reset the switched files boolean. + this._switchedFiles = false + } + } - this.addKclErrors([kclerror]) - // TODO: re-eval if session should end? - if (kclerror.msg === 'file is empty') - this.engineCommandManager?.endSession() - return null + async safeParse(code: string): Promise | null> { + const result = parse(code) + this.diagnostics = [] + this._hasErrors = false + + if (err(result)) { + const kclerror: KCLError = result as KCLError + this.diagnostics = kclErrorsToDiagnostics([kclerror]) + this._hasErrors = true + + await this.checkIfSwitchedFilesShouldClear() + return null + } + + this.addDiagnostics(complilationErrorsToDiagnostics(result.errors)) + this.addDiagnostics(complilationErrorsToDiagnostics(result.warnings)) + if (result.errors.length > 0) { + this._hasErrors = true + + await this.checkIfSwitchedFilesShouldClear() + return null + } + + return result.program } async ensureWasmInit() { @@ -254,27 +312,23 @@ export class KclManager { } const ast = args.ast || this.ast + markOnce('code/startExecuteAst') const currentExecutionId = args.executionId || Date.now() this._cancelTokens.set(currentExecutionId, false) this.isExecuting = true - // Make sure we clear before starting again. End session will do this. - this.engineCommandManager?.endSession() await this.ensureWasmInit() const { logs, errors, execState, isInterrupted } = await executeAst({ ast, - idGenerator: this.execState.idGenerator, engineCommandManager: this.engineCommandManager, }) // Program was not interrupted, setup the scene // Do not send send scene commands if the program was interrupted, go to clean up if (!isInterrupted) { - this.lints = await lintAst({ ast: ast }) - - sceneInfra.modelingSend({ type: 'code edit during sketch' }) - defaultSelectionFilter(execState.memory, this.engineCommandManager) + this.addDiagnostics(await lintAst({ ast: ast })) + setSelectionFilterToDefault(this.engineCommandManager) if (args.zoomToFit) { let zoomObjectId: string | undefined = '' @@ -312,22 +366,29 @@ export class KclManager { } this.logs = logs + this.errors = errors // Do not add the errors since the program was interrupted and the error is not a real KCL error - this.addKclErrors(isInterrupted ? [] : errors) - // Reset the next ID index so that we reuse the previous IDs next time. - execState.idGenerator.nextId = 0 + this.addDiagnostics(isInterrupted ? [] : kclErrorsToDiagnostics(errors)) this.execState = execState if (!errors.length) { this.lastSuccessfulProgramMemory = execState.memory + this.lastSuccessfulOperations = execState.operations } this.ast = { ...ast } + // updateArtifactGraph relies on updated executeState/programMemory + await this.engineCommandManager.updateArtifactGraph(this.ast) this._executeCallback() + if (!isInterrupted) { + sceneInfra.modelingSend({ type: 'code edit during sketch' }) + } + this.engineCommandManager.addCommandLog({ type: 'execution-done', data: null, }) this._cancelTokens.delete(currentExecutionId) + markOnce('code/endExecuteAst') } // NOTE: this always updates the code state and editor. // DO NOT CALL THIS from codemirror ever. @@ -346,29 +407,27 @@ export class KclManager { console.error(newCode) return } - const newAst = this.safeParse(newCode) + const newAst = await this.safeParse(newCode) if (!newAst) { this.clearAst() return } - codeManager.updateCodeEditor(newCode) - // Write the file to disk. - await codeManager.writeToFile() this._ast = { ...newAst } const { logs, errors, execState } = await executeAst({ ast: newAst, - idGenerator: this.execState.idGenerator, engineCommandManager: this.engineCommandManager, - useFakeExecutor: true, + // We make sure to send an empty program memory to denote we mean mock mode. + programMemoryOverride: ProgramMemory.empty(), }) this._logs = logs - this._kclErrors = errors + this.addDiagnostics(kclErrorsToDiagnostics(errors)) this._execState = execState this._programMemory = execState.memory if (!errors.length) { this.lastSuccessfulProgramMemory = execState.memory + this.lastSuccessfulOperations = execState.operations } if (updates !== 'artifactRanges') return @@ -377,7 +436,7 @@ export class KclManager { Array.from(this.engineCommandManager.artifactGraph).forEach( ([commandId, artifact]) => { if (!('codeRef' in artifact)) return - const _node1 = getNodeFromPath( + const _node1 = getNodeFromPath>( this.ast, artifact.codeRef.pathToNode, 'CallExpression' @@ -392,7 +451,7 @@ export class KclManager { ...artifact, codeRef: { ...artifact.codeRef, - range: [node.start, node.end], + range: [node.start, node.end, true], }, }) } @@ -404,17 +463,46 @@ export class KclManager { }) } async executeCode(zoomToFit?: boolean): Promise { - const ast = this.safeParse(codeManager.code) + const ast = await this.safeParse(codeManager.code) + if (!ast) { this.clearAst() return } + + zoomToFit = this.tryToZoomToFitOnCodeUpdate(ast, zoomToFit) + this.ast = { ...ast } return this.executeAst({ zoomToFit }) } - format() { + /** + * This will override the zoom to fit to zoom into the model if the previous AST was empty. + * Workflows this improves, + * When someone comments the entire file then uncomments the entire file it zooms to the model + * When someone CRTL+A and deletes the code then adds the code back it zooms to the model + * When someone CRTL+A and copies new code into the editor it zooms to the model + */ + tryToZoomToFitOnCodeUpdate( + ast: Node, + zoomToFit: boolean | undefined + ) { + const isAstEmpty = this._isAstEmpty(this._ast) + const isRequestedAstEmpty = this._isAstEmpty(ast) + + // If the AST went from empty to not empty or + // If the user has all of the content selected and they copy new code in + if ( + (isAstEmpty && !isRequestedAstEmpty) || + editorManager.isAllTextSelected + ) { + return true + } + + return zoomToFit + } + async format() { const originalCode = codeManager.code - const ast = this.safeParse(originalCode) + const ast = await this.safeParse(originalCode) if (!ast) { this.clearAst() return @@ -428,20 +516,16 @@ export class KclManager { // Update the code state and the editor. codeManager.updateCodeStateEditor(code) - // Write back to the file system. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - codeManager.writeToFile() - // execute the code. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.executeCode() + // Write back to the file system. + void codeManager.writeToFile().then(() => this.executeCode()) } // There's overlapping responsibility between updateAst and executeAst. // updateAst was added as it was used a lot before xState migration so makes the port easier. // but should probably have think about which of the function to keep // This always updates the code state and editor and writes to the file system. async updateAst( - ast: Program, + ast: Node, execute: boolean, optionalParams?: { focusPath?: Array @@ -452,19 +536,19 @@ export class KclManager { } } ): Promise<{ - newAst: Program + newAst: Node selections?: Selections }> { const newCode = recast(ast) if (err(newCode)) return Promise.reject(newCode) - const astWithUpdatedSource = this.safeParse(newCode) + const astWithUpdatedSource = await this.safeParse(newCode) if (!astWithUpdatedSource) return Promise.reject(new Error('bad ast')) let returnVal: Selections | undefined = undefined if (optionalParams?.focusPath) { returnVal = { - codeBasedSelections: [], + graphSelections: [], otherSelections: [], } @@ -486,20 +570,17 @@ export class KclManager { } if (start && end) { - returnVal.codeBasedSelections.push({ - type: 'default', - range: [start, end], + returnVal.graphSelections.push({ + codeRef: { + range: [start, end, true], + pathToNode: path, + }, }) } } } if (execute) { - // Call execute on the set ast. - // Update the code state and editor. - codeManager.updateCodeEditor(newCode) - // Write the file to disk. - await codeManager.writeToFile() await this.executeAst({ ast: astWithUpdatedSource, zoomToFit: optionalParams?.zoomToFit, @@ -570,8 +651,13 @@ export class KclManager { } return Promise.all(thePromises) } - defaultSelectionFilter() { - defaultSelectionFilter(this.programMemory, this.engineCommandManager) + /** TODO: this function is hiding unawaited asynchronous work */ + defaultSelectionFilter(selectionsToRestore?: Selections) { + setSelectionFilterToDefault(this.engineCommandManager, selectionsToRestore) + } + /** TODO: this function is hiding unawaited asynchronous work */ + setSelectionFilter(filter: EntityType_type[]) { + setSelectionFilter(filter, this.engineCommandManager) } /** @@ -588,23 +674,80 @@ export class KclManager { } // Determines if there is no KCL code which means it is executing a blank KCL file - _isAstEmpty(ast: Program) { + _isAstEmpty(ast: Node) { return ast.start === 0 && ast.end === 0 && ast.body.length === 0 } } -function defaultSelectionFilter( - programMemory: ProgramMemory, - engineCommandManager: EngineCommandManager +const defaultSelectionFilter: EntityType_type[] = [ + 'face', + 'edge', + 'solid2d', + 'curve', + 'object', +] + +/** TODO: This function is not synchronous but is currently treated as such */ +function setSelectionFilterToDefault( + engineCommandManager: EngineCommandManager, + selectionsToRestore?: Selections ) { // eslint-disable-next-line @typescript-eslint/no-floating-promises - programMemory.hasSketchOrSolid() && + setSelectionFilter( + defaultSelectionFilter, + engineCommandManager, + selectionsToRestore + ) +} + +/** TODO: This function is not synchronous but is currently treated as such */ +function setSelectionFilter( + filter: EntityType_type[], + engineCommandManager: EngineCommandManager, + selectionsToRestore?: Selections +) { + const { engineEvents } = selectionsToRestore + ? handleSelectionBatch({ + selections: selectionsToRestore, + }) + : { engineEvents: undefined } + if (!selectionsToRestore || !engineEvents) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises engineCommandManager.sendSceneCommand({ type: 'modeling_cmd_req', cmd_id: uuidv4(), cmd: { type: 'set_selection_filter', - filter: ['face', 'edge', 'solid2d', 'curve'], + filter, }, }) + return + } + const modelingCmd: ModelingCmdReq_type[] = [] + engineEvents.forEach((event) => { + if (event.type === 'modeling_cmd_req') { + modelingCmd.push({ + cmd_id: uuidv4(), + cmd: event.cmd, + }) + } + }) + // batch is needed other wise the selection flickers. + engineCommandManager + .sendSceneCommand({ + type: 'modeling_cmd_batch_req', + batch_id: uuidv4(), + requests: [ + { + cmd_id: uuidv4(), + cmd: { + type: 'set_selection_filter', + filter, + }, + }, + ...modelingCmd, + ], + responses: false, + }) + .catch(reportError) } diff --git a/src/lang/abstractSyntaxTree.test.ts b/src/lang/abstractSyntaxTree.test.ts index 6fc30dd39..1f19e9242 100644 --- a/src/lang/abstractSyntaxTree.test.ts +++ b/src/lang/abstractSyntaxTree.test.ts @@ -1,5 +1,4 @@ -import { KCLError } from './errors' -import { initPromise, parse } from './wasm' +import { assertParse, initPromise, parse } from './wasm' import { err } from 'lib/trap' beforeAll(async () => { @@ -8,10 +7,9 @@ beforeAll(async () => { describe('testing AST', () => { test('5 + 6', () => { - const result = parse('5 +6') - if (err(result)) throw result - delete (result as any).nonCodeMeta - expect(result.body).toEqual([ + const ast = assertParse('5 +6') + delete (ast as any).nonCodeMeta + expect(ast.body).toEqual([ { type: 'ExpressionStatement', start: 0, @@ -41,1868 +39,15 @@ describe('testing AST', () => { }, ]) }) - test('const myVar = 5', () => { - const ast = parse('const myVar = 5') - if (err(ast)) throw ast - const { body } = ast - expect(body).toEqual([ - { - type: 'VariableDeclaration', - start: 0, - end: 15, - kind: 'const', - - declarations: [ - { - type: 'VariableDeclarator', - start: 6, - end: 15, - - id: { - type: 'Identifier', - start: 6, - end: 11, - name: 'myVar', - }, - init: { - type: 'Literal', - start: 14, - end: 15, - value: 5, - raw: '5', - }, - }, - ], - }, - ]) - }) - test('multi-line', () => { - const code = `const myVar = 5 -const newVar = myVar + 1 -` - const ast = parse(code) - if (err(ast)) throw ast - const { body } = ast - expect(body).toEqual([ - { - type: 'VariableDeclaration', - start: 0, - end: 15, - kind: 'const', - - declarations: [ - { - type: 'VariableDeclarator', - start: 6, - end: 15, - - id: { - type: 'Identifier', - start: 6, - end: 11, - name: 'myVar', - }, - init: { - type: 'Literal', - start: 14, - end: 15, - value: 5, - raw: '5', - }, - }, - ], - }, - { - type: 'VariableDeclaration', - start: 16, - end: 40, - kind: 'const', - - declarations: [ - { - type: 'VariableDeclarator', - start: 22, - end: 40, - - id: { - type: 'Identifier', - start: 22, - end: 28, - name: 'newVar', - }, - init: { - type: 'BinaryExpression', - start: 31, - end: 40, - left: { - type: 'Identifier', - start: 31, - end: 36, - name: 'myVar', - }, - operator: '+', - right: { - type: 'Literal', - start: 39, - end: 40, - value: 1, - raw: '1', - }, - }, - }, - ], - }, - ]) - }) -}) - -describe('testing function declaration', () => { - test('fn funcN = (a, b) => {return a + b}', () => { - const ast = parse( - ['fn funcN = (a, b) => {', ' return a + b', '}'].join('\n') - ) - if (err(ast)) throw ast - const { body } = ast - delete (body[0] as any).declarations[0].init.body.nonCodeMeta - expect(body).toEqual([ - { - type: 'VariableDeclaration', - start: 0, - end: 39, - kind: 'fn', - - declarations: [ - { - type: 'VariableDeclarator', - start: 3, - end: 39, - - id: { - type: 'Identifier', - start: 3, - end: 8, - name: 'funcN', - }, - init: { - type: 'FunctionExpression', - start: 11, - end: 39, - - params: [ - { - type: 'Parameter', - identifier: { - type: 'Identifier', - start: 12, - end: 13, - name: 'a', - }, - optional: false, - }, - { - type: 'Parameter', - identifier: { - type: 'Identifier', - start: 15, - end: 16, - name: 'b', - }, - optional: false, - }, - ], - body: { - start: 21, - end: 39, - - body: [ - { - type: 'ReturnStatement', - start: 25, - end: 37, - - argument: { - type: 'BinaryExpression', - start: 32, - end: 37, - - left: { - type: 'Identifier', - start: 32, - end: 33, - name: 'a', - }, - operator: '+', - right: { - type: 'Identifier', - start: 36, - end: 37, - name: 'b', - }, - }, - }, - ], - }, - }, - }, - ], - }, - ]) - }) - test('call expression assignment', () => { - const code = `fn funcN = (a, b) => { return a + b } -const myVar = funcN(1, 2)` - const ast = parse(code) - if (err(ast)) throw ast - const { body } = ast - delete (body[0] as any).declarations[0].init.body.nonCodeMeta - expect(body).toEqual([ - { - type: 'VariableDeclaration', - start: 0, - end: 37, - kind: 'fn', - - declarations: [ - { - type: 'VariableDeclarator', - start: 3, - end: 37, - - id: { - type: 'Identifier', - start: 3, - end: 8, - name: 'funcN', - }, - init: { - type: 'FunctionExpression', - start: 11, - end: 37, - - params: [ - { - type: 'Parameter', - identifier: { - type: 'Identifier', - start: 12, - end: 13, - name: 'a', - }, - optional: false, - }, - { - type: 'Parameter', - identifier: { - type: 'Identifier', - start: 15, - end: 16, - name: 'b', - }, - optional: false, - }, - ], - body: { - start: 21, - end: 37, - - body: [ - { - type: 'ReturnStatement', - start: 23, - end: 35, - - argument: { - type: 'BinaryExpression', - start: 30, - end: 35, - - left: { - type: 'Identifier', - start: 30, - end: 31, - - name: 'a', - }, - operator: '+', - right: { - type: 'Identifier', - start: 34, - end: 35, - - name: 'b', - }, - }, - }, - ], - }, - }, - }, - ], - }, - { - type: 'VariableDeclaration', - start: 38, - end: 63, - kind: 'const', - - declarations: [ - { - type: 'VariableDeclarator', - start: 44, - end: 63, - - id: { - type: 'Identifier', - start: 44, - end: 49, - name: 'myVar', - }, - init: { - type: 'CallExpression', - start: 52, - end: 63, - - callee: { - type: 'Identifier', - start: 52, - end: 57, - name: 'funcN', - }, - arguments: [ - { - type: 'Literal', - start: 58, - end: 59, - value: 1, - raw: '1', - }, - { - type: 'Literal', - start: 61, - end: 62, - value: 2, - raw: '2', - }, - ], - optional: false, - }, - }, - ], - }, - ]) - }) -}) - -describe('testing pipe operator special', () => { - test('pipe operator with sketch', () => { - let code = `const mySketch = startSketchAt([0, 0]) - |> lineTo([2, 3], %) - |> lineTo([0, 1], %, $myPath) - |> lineTo([1, 1], %) - |> rx(45, %) -` - const ast = parse(code) - if (err(ast)) throw ast - const { body } = ast - delete (body[0] as any).declarations[0].init.nonCodeMeta - expect(body).toEqual([ - { - type: 'VariableDeclaration', - start: 0, - end: 131, - kind: 'const', - - declarations: [ - { - type: 'VariableDeclarator', - start: 6, - end: 131, - id: { - type: 'Identifier', - start: 6, - end: 14, - name: 'mySketch', - }, - - init: { - type: 'PipeExpression', - start: 17, - end: 131, - - body: [ - { - type: 'CallExpression', - start: 17, - end: 38, - - callee: { - type: 'Identifier', - start: 17, - end: 30, - name: 'startSketchAt', - }, - arguments: [ - { - type: 'ArrayExpression', - start: 31, - end: 37, - - elements: [ - { - type: 'Literal', - start: 32, - end: 33, - value: 0, - raw: '0', - }, - { - type: 'Literal', - start: 35, - end: 36, - value: 0, - raw: '0', - }, - ], - }, - ], - optional: false, - }, - { - type: 'CallExpression', - start: 44, - end: 61, - - callee: { - type: 'Identifier', - start: 44, - end: 50, - - name: 'lineTo', - }, - arguments: [ - { - type: 'ArrayExpression', - start: 51, - end: 57, - - elements: [ - { - type: 'Literal', - start: 52, - end: 53, - value: 2, - raw: '2', - }, - { - type: 'Literal', - start: 55, - end: 56, - value: 3, - raw: '3', - }, - ], - }, - { - type: 'PipeSubstitution', - start: 59, - end: 60, - }, - ], - optional: false, - }, - { - type: 'CallExpression', - start: 67, - end: 93, - - callee: { - type: 'Identifier', - start: 67, - end: 73, - name: 'lineTo', - }, - arguments: [ - { - type: 'ArrayExpression', - start: 74, - end: 80, - - elements: [ - { - type: 'Literal', - start: 75, - end: 76, - value: 0, - raw: '0', - }, - { - type: 'Literal', - start: 78, - end: 79, - value: 1, - raw: '1', - }, - ], - }, - { - type: 'PipeSubstitution', - start: 82, - end: 83, - }, - { - type: 'TagDeclarator', - start: 85, - end: 92, - value: 'myPath', - }, - ], - optional: false, - }, - { - type: 'CallExpression', - start: 99, - end: 116, - - callee: { - type: 'Identifier', - start: 99, - end: 105, - name: 'lineTo', - }, - arguments: [ - { - type: 'ArrayExpression', - start: 106, - end: 112, - - elements: [ - { - type: 'Literal', - start: 107, - end: 108, - value: 1, - raw: '1', - }, - { - type: 'Literal', - start: 110, - end: 111, - value: 1, - raw: '1', - }, - ], - }, - { - type: 'PipeSubstitution', - start: 114, - end: 115, - }, - ], - optional: false, - }, - { - type: 'CallExpression', - start: 122, - end: 131, - - callee: { - type: 'Identifier', - start: 122, - end: 124, - name: 'rx', - }, - arguments: [ - { - type: 'Literal', - start: 125, - end: 127, - value: 45, - raw: '45', - }, - { - type: 'PipeSubstitution', - start: 129, - end: 130, - }, - ], - optional: false, - }, - ], - }, - }, - ], - }, - ]) - }) - test('pipe operator with binary expression', () => { - let code = `const myVar = 5 + 6 |> myFunc(45, %)` - const ast = parse(code) - if (err(ast)) throw ast - const { body } = ast - delete (body as any)[0].declarations[0].init.nonCodeMeta - expect(body).toEqual([ - { - type: 'VariableDeclaration', - start: 0, - end: 36, - kind: 'const', - - declarations: [ - { - type: 'VariableDeclarator', - start: 6, - end: 36, - - id: { - type: 'Identifier', - start: 6, - end: 11, - name: 'myVar', - }, - init: { - type: 'PipeExpression', - start: 14, - end: 36, - - body: [ - { - type: 'BinaryExpression', - start: 14, - end: 19, - - left: { - type: 'Literal', - start: 14, - end: 15, - value: 5, - raw: '5', - }, - operator: '+', - right: { - type: 'Literal', - start: 18, - end: 19, - value: 6, - raw: '6', - }, - }, - { - type: 'CallExpression', - start: 23, - end: 36, - - callee: { - type: 'Identifier', - start: 23, - end: 29, - name: 'myFunc', - }, - arguments: [ - { - type: 'Literal', - start: 30, - end: 32, - value: 45, - raw: '45', - }, - { - type: 'PipeSubstitution', - start: 34, - end: 35, - }, - ], - optional: false, - }, - ], - }, - }, - ], - }, - ]) - }) - test('array expression', () => { - let code = `const yo = [1, '2', three, 4 + 5]` - const ast = parse(code) - if (err(ast)) throw ast - const { body } = ast - expect(body).toEqual([ - { - type: 'VariableDeclaration', - start: 0, - end: 33, - kind: 'const', - - declarations: [ - { - type: 'VariableDeclarator', - start: 6, - end: 33, - - id: { - type: 'Identifier', - start: 6, - end: 8, - name: 'yo', - }, - init: { - type: 'ArrayExpression', - start: 11, - end: 33, - - elements: [ - { - type: 'Literal', - start: 12, - end: 13, - value: 1, - raw: '1', - }, - { - type: 'Literal', - start: 15, - end: 18, - value: '2', - raw: "'2'", - }, - { - type: 'Identifier', - start: 20, - end: 25, - name: 'three', - }, - { - type: 'BinaryExpression', - start: 27, - end: 32, - - left: { - type: 'Literal', - start: 27, - end: 28, - value: 4, - raw: '4', - }, - operator: '+', - right: { - type: 'Literal', - start: 31, - end: 32, - value: 5, - raw: '5', - }, - }, - ], - }, - }, - ], - }, - ]) - }) - test('object expression ast', () => { - const code = [ - 'const three = 3', - "const yo = {aStr: 'str', anum: 2, identifier: three, binExp: 4 + 5}", - ].join('\n') - const ast = parse(code) - if (err(ast)) throw ast - const { body } = ast - expect(body).toEqual([ - { - type: 'VariableDeclaration', - start: 0, - end: 15, - kind: 'const', - - declarations: [ - { - type: 'VariableDeclarator', - start: 6, - end: 15, - - id: { - type: 'Identifier', - start: 6, - end: 11, - name: 'three', - }, - init: { - type: 'Literal', - start: 14, - end: 15, - value: 3, - raw: '3', - }, - }, - ], - }, - { - type: 'VariableDeclaration', - start: 16, - end: 83, - kind: 'const', - - declarations: [ - { - type: 'VariableDeclarator', - start: 22, - end: 83, - - id: { - type: 'Identifier', - start: 22, - end: 24, - name: 'yo', - }, - init: { - type: 'ObjectExpression', - start: 27, - end: 83, - - properties: [ - { - type: 'ObjectProperty', - start: 28, - end: 39, - - key: { - type: 'Identifier', - start: 28, - end: 32, - name: 'aStr', - }, - value: { - type: 'Literal', - start: 34, - end: 39, - value: 'str', - raw: "'str'", - }, - }, - { - type: 'ObjectProperty', - start: 41, - end: 48, - - key: { - type: 'Identifier', - start: 41, - end: 45, - name: 'anum', - }, - value: { - type: 'Literal', - start: 47, - end: 48, - value: 2, - raw: '2', - }, - }, - { - type: 'ObjectProperty', - start: 50, - end: 67, - - key: { - type: 'Identifier', - start: 50, - end: 60, - name: 'identifier', - }, - value: { - type: 'Identifier', - start: 62, - end: 67, - name: 'three', - }, - }, - { - type: 'ObjectProperty', - start: 69, - end: 82, - - key: { - type: 'Identifier', - start: 69, - end: 75, - name: 'binExp', - }, - value: { - type: 'BinaryExpression', - start: 77, - end: 82, - - left: { - type: 'Literal', - start: 77, - end: 78, - value: 4, - raw: '4', - }, - operator: '+', - right: { - type: 'Literal', - start: 81, - end: 82, - value: 5, - raw: '5', - }, - }, - }, - ], - }, - }, - ], - }, - ]) - }) - test('nested object expression ast', () => { - const code = `const yo = {key: { - key2: 'value' -}}` - const ast = parse(code) - if (err(ast)) throw ast - const { body } = ast - expect(body).toEqual([ - { - type: 'VariableDeclaration', - start: 0, - end: 37, - kind: 'const', - - declarations: [ - { - type: 'VariableDeclarator', - start: 6, - end: 37, - - id: { - type: 'Identifier', - start: 6, - end: 8, - name: 'yo', - }, - init: { - type: 'ObjectExpression', - start: 11, - end: 37, - - properties: [ - { - type: 'ObjectProperty', - start: 12, - end: 36, - - key: { - type: 'Identifier', - start: 12, - end: 15, - name: 'key', - }, - value: { - type: 'ObjectExpression', - start: 17, - end: 36, - - properties: [ - { - type: 'ObjectProperty', - start: 21, - end: 34, - - key: { - type: 'Identifier', - start: 21, - end: 25, - name: 'key2', - }, - value: { - type: 'Literal', - start: 27, - end: 34, - value: 'value', - raw: "'value'", - }, - }, - ], - }, - }, - ], - }, - }, - ], - }, - ]) - }) - test('object expression with array ast', () => { - const code = `const yo = {key: [1, '2']}` - const ast = parse(code) - if (err(ast)) throw ast - const { body } = ast - expect(body).toEqual([ - { - type: 'VariableDeclaration', - start: 0, - end: 26, - kind: 'const', - - declarations: [ - { - type: 'VariableDeclarator', - start: 6, - end: 26, - - id: { - type: 'Identifier', - start: 6, - end: 8, - name: 'yo', - }, - init: { - type: 'ObjectExpression', - start: 11, - end: 26, - - properties: [ - { - type: 'ObjectProperty', - start: 12, - end: 25, - - key: { - type: 'Identifier', - start: 12, - end: 15, - name: 'key', - }, - value: { - type: 'ArrayExpression', - start: 17, - end: 25, - - elements: [ - { - type: 'Literal', - start: 18, - end: 19, - value: 1, - raw: '1', - }, - { - type: 'Literal', - start: 21, - end: 24, - value: '2', - raw: "'2'", - }, - ], - }, - }, - ], - }, - }, - ], - }, - ]) - }) - test('object memberExpression simple', () => { - const code = `const prop = yo.one.two` - const ast = parse(code) - if (err(ast)) throw ast - const { body } = ast - expect(body).toEqual([ - { - type: 'VariableDeclaration', - start: 0, - end: 23, - kind: 'const', - - declarations: [ - { - type: 'VariableDeclarator', - start: 6, - end: 23, - - id: { - type: 'Identifier', - start: 6, - end: 10, - name: 'prop', - }, - init: { - type: 'MemberExpression', - start: 13, - end: 23, - computed: false, - - object: { - type: 'MemberExpression', - start: 13, - end: 19, - - computed: false, - object: { - type: 'Identifier', - start: 13, - end: 15, - name: 'yo', - }, - property: { - type: 'Identifier', - start: 16, - end: 19, - name: 'one', - }, - }, - property: { - type: 'Identifier', - start: 20, - end: 23, - name: 'two', - }, - }, - }, - ], - }, - ]) - }) - test('object memberExpression with square braces', () => { - const code = `const prop = yo.one["two"]` - const ast = parse(code) - if (err(ast)) throw ast - const { body } = ast - expect(body).toEqual([ - { - type: 'VariableDeclaration', - start: 0, - end: 26, - kind: 'const', - - declarations: [ - { - type: 'VariableDeclarator', - start: 6, - end: 26, - - id: { - type: 'Identifier', - start: 6, - end: 10, - name: 'prop', - }, - init: { - type: 'MemberExpression', - start: 13, - end: 26, - computed: false, - - object: { - type: 'MemberExpression', - start: 13, - end: 19, - computed: false, - - object: { - type: 'Identifier', - start: 13, - end: 15, - name: 'yo', - }, - property: { - type: 'Identifier', - start: 16, - end: 19, - name: 'one', - }, - }, - property: { - type: 'Literal', - start: 20, - end: 25, - value: 'two', - raw: '"two"', - }, - }, - }, - ], - }, - ]) - }) - test('object memberExpression with two square braces literal and identifier', () => { - const code = `const prop = yo["one"][two]` - const ast = parse(code) - if (err(ast)) throw ast - const { body } = ast - expect(body).toEqual([ - { - type: 'VariableDeclaration', - start: 0, - end: 27, - kind: 'const', - - declarations: [ - { - type: 'VariableDeclarator', - start: 6, - end: 27, - - id: { - type: 'Identifier', - start: 6, - end: 10, - name: 'prop', - }, - init: { - type: 'MemberExpression', - start: 13, - end: 27, - computed: true, - - object: { - type: 'MemberExpression', - start: 13, - end: 22, - - computed: false, - object: { - type: 'Identifier', - start: 13, - end: 15, - name: 'yo', - }, - property: { - type: 'Literal', - start: 16, - end: 21, - value: 'one', - raw: '"one"', - }, - }, - property: { - type: 'Identifier', - start: 23, - end: 26, - name: 'two', - }, - }, - }, - ], - }, - ]) - }) -}) - -describe('nests binary expressions correctly', () => { - it('works with the simple case', () => { - const code = `const yo = 1 + 2` - const ast = parse(code) - if (err(ast)) throw ast - const { body } = ast - expect(body[0]).toEqual({ - type: 'VariableDeclaration', - start: 0, - end: 16, - kind: 'const', - - declarations: [ - { - type: 'VariableDeclarator', - start: 6, - end: 16, - - id: { - type: 'Identifier', - start: 6, - end: 8, - name: 'yo', - }, - init: { - type: 'BinaryExpression', - start: 11, - end: 16, - - left: { - type: 'Literal', - start: 11, - end: 12, - value: 1, - raw: '1', - }, - operator: '+', - right: { - type: 'Literal', - start: 15, - end: 16, - value: 2, - raw: '2', - }, - }, - }, - ], - }) - }) - it('should nest according to precedence with multiply first', () => { - // should be binExp { binExp { lit-1 * lit-2 } + lit} - const code = `const yo = 1 * 2 + 3` - const ast = parse(code) - if (err(ast)) throw ast - const { body } = ast - expect(body[0]).toEqual({ - type: 'VariableDeclaration', - start: 0, - end: 20, - kind: 'const', - - declarations: [ - { - type: 'VariableDeclarator', - start: 6, - end: 20, - - id: { - type: 'Identifier', - start: 6, - end: 8, - name: 'yo', - }, - init: { - type: 'BinaryExpression', - start: 11, - end: 20, - - left: { - type: 'BinaryExpression', - start: 11, - end: 16, - - left: { - type: 'Literal', - start: 11, - end: 12, - value: 1, - raw: '1', - }, - operator: '*', - right: { - type: 'Literal', - start: 15, - end: 16, - value: 2, - raw: '2', - }, - }, - operator: '+', - right: { - type: 'Literal', - start: 19, - end: 20, - value: 3, - raw: '3', - }, - }, - }, - ], - }) - }) - it('should nest according to precedence with sum first', () => { - // should be binExp { lit-1 + binExp { lit-2 * lit-3 } } - const code = `const yo = 1 + 2 * 3` - const ast = parse(code) - if (err(ast)) throw ast - const { body } = ast - expect(body[0]).toEqual({ - type: 'VariableDeclaration', - start: 0, - end: 20, - kind: 'const', - - declarations: [ - { - type: 'VariableDeclarator', - start: 6, - end: 20, - - id: { - type: 'Identifier', - start: 6, - end: 8, - name: 'yo', - }, - init: { - type: 'BinaryExpression', - start: 11, - end: 20, - - left: { - type: 'Literal', - start: 11, - end: 12, - value: 1, - raw: '1', - }, - operator: '+', - right: { - type: 'BinaryExpression', - start: 15, - end: 20, - - left: { - type: 'Literal', - start: 15, - end: 16, - value: 2, - raw: '2', - }, - operator: '*', - right: { - type: 'Literal', - start: 19, - end: 20, - value: 3, - raw: '3', - }, - }, - }, - }, - ], - }) - }) - it('should nest properly with two operators of equal precedence', () => { - const code = `const yo = 1 + 2 - 3` - const ast = parse(code) - if (err(ast)) throw ast - const { body } = ast - expect((body[0] as any).declarations[0].init).toEqual({ - type: 'BinaryExpression', - start: 11, - end: 20, - - left: { - type: 'BinaryExpression', - start: 11, - end: 16, - - left: { - type: 'Literal', - start: 11, - end: 12, - value: 1, - raw: '1', - }, - operator: '+', - right: { - type: 'Literal', - start: 15, - end: 16, - value: 2, - raw: '2', - }, - }, - operator: '-', - right: { - type: 'Literal', - start: 19, - end: 20, - value: 3, - raw: '3', - }, - }) - }) - it('should nest properly with two operators of equal (but higher) precedence', () => { - const code = `const yo = 1 * 2 / 3` - const ast = parse(code) - if (err(ast)) throw ast - const { body } = ast - expect((body[0] as any).declarations[0].init).toEqual({ - type: 'BinaryExpression', - start: 11, - end: 20, - - left: { - type: 'BinaryExpression', - start: 11, - end: 16, - - left: { - type: 'Literal', - start: 11, - end: 12, - value: 1, - raw: '1', - }, - operator: '*', - right: { - type: 'Literal', - start: 15, - end: 16, - value: 2, - raw: '2', - }, - }, - operator: '/', - right: { - type: 'Literal', - start: 19, - end: 20, - value: 3, - raw: '3', - }, - }) - }) - it('should nest properly with longer example', () => { - const code = `const yo = 1 + 2 * (3 - 4) / 5 + 6` - const ast = parse(code) - if (err(ast)) throw ast - const { body } = ast - const init = (body[0] as any).declarations[0].init - expect(init).toEqual({ - type: 'BinaryExpression', - operator: '+', - start: 11, - end: 34, - - left: { - type: 'BinaryExpression', - operator: '+', - start: 11, - end: 30, - - left: { - type: 'Literal', - value: 1, - raw: '1', - start: 11, - end: 12, - }, - right: { - type: 'BinaryExpression', - operator: '/', - start: 15, - end: 30, - - left: { - type: 'BinaryExpression', - operator: '*', - start: 15, - end: 25, - - left: { - type: 'Literal', - value: 2, - raw: '2', - start: 15, - end: 16, - }, - right: { - type: 'BinaryExpression', - operator: '-', - start: 20, - end: 25, - - left: { - type: 'Literal', - value: 3, - raw: '3', - start: 20, - end: 21, - }, - right: { - type: 'Literal', - value: 4, - raw: '4', - start: 24, - end: 25, - }, - }, - }, - right: { - type: 'Literal', - value: 5, - raw: '5', - start: 29, - end: 30, - }, - }, - }, - right: { - type: 'Literal', - value: 6, - raw: '6', - start: 33, - end: 34, - }, - }) - }) -}) - -describe('check nonCodeMeta data is attached to the AST correctly', () => { - it('comments between expressions', () => { - const code = ` -const yo = { a: { b: { c: '123' } } } -// this is a comment -const key = 'c'` - const nonCodeMetaInstance = { - type: 'NonCodeNode', - start: code.indexOf('\n// this is a comment'), - end: code.indexOf('const key') - 1, - - value: { - type: 'blockComment', - style: 'line', - value: 'this is a comment', - }, - } - const ast = parse(code) - if (err(ast)) throw ast - const { nonCodeMeta } = ast - expect(nonCodeMeta.nonCodeNodes[0]?.[0]).toEqual(nonCodeMetaInstance) - - // extra whitespace won't change it's position (0) or value (NB the start end would have changed though) - const codeWithExtraStartWhitespace = '\n\n\n' + code - const ast2 = parse(codeWithExtraStartWhitespace) - if (err(ast2)) throw ast2 - const { nonCodeMeta: nonCodeMeta2 } = ast2 - expect(nonCodeMeta2.nonCodeNodes[0]?.[0].value).toStrictEqual( - nonCodeMetaInstance.value - ) - expect(nonCodeMeta2.nonCodeNodes[0]?.[0].start).not.toBe( - nonCodeMetaInstance.start - ) - }) - it('comments nested within a block statement', () => { - const code = `const mySketch = startSketchAt([0,0]) - |> lineTo([0, 1], %, $myPath) - |> lineTo([1, 1], %) /* this is - a comment - spanning a few lines */ - |> lineTo([1,0], %, $rightPath) - |> close(%) -` - - const ast = parse(code) - if (err(ast)) throw ast - const { body } = ast - const indexOfSecondLineToExpression = 2 - const sketchNonCodeMeta = (body as any)[0].declarations[0].init.nonCodeMeta - .nonCodeNodes - expect(sketchNonCodeMeta[indexOfSecondLineToExpression][0]).toEqual({ - type: 'NonCodeNode', - start: 92, - end: 149, - - value: { - type: 'inlineComment', - style: 'block', - value: 'this is\n a comment\n spanning a few lines', - }, - }) - }) - it('comments in a pipe expression', () => { - const code = [ - 'const mySk1 = startSketchAt([0, 0])', - ' |> lineTo([1, 1], %)', - ' |> lineTo([0, 1], %, $myPath)', - ' |> lineTo([1, 1], %)', - '// a comment', - ' |> rx(90, %)', - ].join('\n') - - const ast = parse(code) - if (err(ast)) throw ast - const { body } = ast - const sketchNonCodeMeta = (body[0] as any).declarations[0].init.nonCodeMeta - .nonCodeNodes[3][0] - expect(sketchNonCodeMeta).toEqual({ - type: 'NonCodeNode', - start: 113, - end: 126, - - value: { - type: 'blockComment', - value: 'a comment', - style: 'line', - }, - }) - }) -}) - -describe('test UnaryExpression', () => { - it('should parse a unary expression in simple var dec situation', () => { - const code = `const myVar = -min(4, 100)` - const ast = parse(code) - if (err(ast)) throw ast - const { body } = ast - const myVarInit = (body?.[0] as any).declarations[0]?.init - expect(myVarInit).toEqual({ - type: 'UnaryExpression', - operator: '-', - start: 14, - end: 26, - - argument: { - type: 'CallExpression', - start: 15, - end: 26, - - callee: { - type: 'Identifier', - start: 15, - end: 18, - name: 'min', - }, - arguments: [ - { - type: 'Literal', - start: 19, - end: 20, - value: 4, - raw: '4', - }, - { - type: 'Literal', - start: 22, - end: 25, - value: 100, - raw: '100', - }, - ], - optional: false, - }, - }) - }) -}) - -describe('testing nested call expressions', () => { - it('callExp in a binExp in a callExp', () => { - const code = 'const myVar = min(100, 1 + legLen(5, 3))' - const ast = parse(code) - if (err(ast)) throw ast - const { body } = ast - const myVarInit = (body?.[0] as any).declarations[0]?.init - expect(myVarInit).toEqual({ - type: 'CallExpression', - start: 14, - end: 40, - - callee: { - type: 'Identifier', - start: 14, - end: 17, - name: 'min', - }, - arguments: [ - { - type: 'Literal', - start: 18, - end: 21, - value: 100, - raw: '100', - }, - { - type: 'BinaryExpression', - operator: '+', - start: 23, - end: 39, - - left: { - type: 'Literal', - value: 1, - raw: '1', - start: 23, - end: 24, - }, - right: { - type: 'CallExpression', - start: 27, - end: 39, - - callee: { - type: 'Identifier', - start: 27, - end: 33, - name: 'legLen', - }, - arguments: [ - { - type: 'Literal', - start: 34, - end: 35, - value: 5, - raw: '5', - }, - { - type: 'Literal', - start: 37, - end: 38, - value: 3, - raw: '3', - }, - ], - optional: false, - }, - }, - ], - optional: false, - }) - }) -}) - -describe('should recognise callExpresions in binaryExpressions', () => { - const code = 'xLineTo(segEndX(seg02) + 1, %)' - it('should recognise the callExp', () => { - const ast = parse(code) - if (err(ast)) throw ast - const { body } = ast - const callExpArgs = (body?.[0] as any).expression?.arguments - expect(callExpArgs).toEqual([ - { - type: 'BinaryExpression', - operator: '+', - start: 8, - end: 26, - - left: { - type: 'CallExpression', - start: 8, - end: 22, - - callee: { - type: 'Identifier', - start: 8, - end: 15, - name: 'segEndX', - }, - arguments: [ - { - type: 'Identifier', - start: 16, - end: 21, - name: 'seg02', - }, - ], - optional: false, - }, - right: { - type: 'Literal', - value: 1, - raw: '1', - start: 25, - end: 26, - }, - }, - { type: 'PipeSubstitution', start: 28, end: 29 }, - ]) - }) }) describe('parsing errors', () => { it('should return an error when there is a unexpected closed curly brace', async () => { const code = `const myVar = startSketchAt([}], %)` const result = parse(code) - - expect(result).toBeInstanceOf(KCLError) - const error = result as KCLError - expect(error.kind).toBe('syntax') - expect(error.msg).toBe('Unexpected token: (') - expect(error.sourceRanges).toEqual([[27, 28]]) + if (err(result)) throw result + const error = result.errors[0] + expect(error.message).toBe('Unexpected token: (') + expect(error.sourceRange).toEqual([27, 28, 0]) }) }) diff --git a/src/lang/artifact.test.ts b/src/lang/artifact.test.ts index 5a6060703..4c0110d2d 100644 --- a/src/lang/artifact.test.ts +++ b/src/lang/artifact.test.ts @@ -1,4 +1,4 @@ -import { parse, initPromise } from './wasm' +import { assertParse, initPromise } from './wasm' import { enginelessExecutor } from '../lib/testHelpers' beforeAll(async () => { @@ -14,12 +14,11 @@ const mySketch001 = startSketchOn('XY') |> lineTo([-1.59, -1.54], %) |> lineTo([0.46, -5.82], %) // |> rx(45, %)` - const execState = await enginelessExecutor(parse(code)) + const execState = await enginelessExecutor(assertParse(code)) // @ts-ignore const sketch001 = execState.memory.get('mySketch001') expect(sketch001).toEqual({ - type: 'UserVal', - __meta: [{ sourceRange: [46, 71] }], + type: 'Sketch', value: { type: 'Sketch', on: expect.any(Object), @@ -29,7 +28,7 @@ const mySketch001 = startSketchOn('XY') tag: null, __geoMeta: { id: expect.any(String), - sourceRange: [46, 71], + sourceRange: [46, 71, 0], }, }, paths: [ @@ -39,7 +38,7 @@ const mySketch001 = startSketchOn('XY') to: [-1.59, -1.54], from: [0, 0], __geoMeta: { - sourceRange: [77, 102], + sourceRange: [77, 102, 0], id: expect.any(String), }, }, @@ -49,13 +48,13 @@ const mySketch001 = startSketchOn('XY') from: [-1.59, -1.54], tag: null, __geoMeta: { - sourceRange: [108, 132], + sourceRange: [108, 132, 0], id: expect.any(String), }, }, ], id: expect.any(String), - __meta: [{ sourceRange: [46, 71] }], + __meta: [{ sourceRange: [46, 71, 0] }], }, }) }) @@ -68,7 +67,7 @@ const mySketch001 = startSketchOn('XY') |> lineTo([0.46, -5.82], %) // |> rx(45, %) |> extrude(2, %)` - const execState = await enginelessExecutor(parse(code)) + const execState = await enginelessExecutor(assertParse(code)) // @ts-ignore const sketch001 = execState.memory.get('mySketch001') expect(sketch001).toEqual({ @@ -80,14 +79,14 @@ const mySketch001 = startSketchOn('XY') faceId: expect.any(String), tag: null, id: expect.any(String), - sourceRange: [77, 102], + sourceRange: [77, 102, 0], }, { type: 'extrudePlane', faceId: expect.any(String), tag: null, id: expect.any(String), - sourceRange: [108, 132], + sourceRange: [108, 132, 0], }, ], sketch: { @@ -104,7 +103,7 @@ const mySketch001 = startSketchOn('XY') tag: null, __geoMeta: { id: expect.any(String), - sourceRange: [77, 102], + sourceRange: [77, 102, 0], }, }, { @@ -114,7 +113,7 @@ const mySketch001 = startSketchOn('XY') tag: null, __geoMeta: { id: expect.any(String), - sourceRange: [108, 132], + sourceRange: [108, 132, 0], }, }, ], @@ -122,7 +121,7 @@ const mySketch001 = startSketchOn('XY') height: 2, startCapId: expect.any(String), endCapId: expect.any(String), - __meta: [{ sourceRange: [46, 71] }], + __meta: [{ sourceRange: [46, 71, 0] }], }) }) test('sketch extrude and sketch on one of the faces', async () => { @@ -148,7 +147,7 @@ const sk2 = startSketchOn('XY') |> extrude(2, %) ` - const execState = await enginelessExecutor(parse(code)) + const execState = await enginelessExecutor(assertParse(code)) const programMemory = execState.memory // @ts-ignore const geos = [programMemory.get('theExtrude'), programMemory.get('sk2')] @@ -162,7 +161,7 @@ const sk2 = startSketchOn('XY') faceId: expect.any(String), tag: null, id: expect.any(String), - sourceRange: [69, 89], + sourceRange: [69, 89, 0], }, { type: 'extrudePlane', @@ -174,14 +173,14 @@ const sk2 = startSketchOn('XY') value: 'p', }, id: expect.any(String), - sourceRange: [95, 117], + sourceRange: [95, 117, 0], }, { type: 'extrudePlane', faceId: expect.any(String), tag: null, id: expect.any(String), - sourceRange: [123, 142], + sourceRange: [123, 142, 0], }, ], sketch: { @@ -194,7 +193,7 @@ const sk2 = startSketchOn('XY') p: { __meta: [ { - sourceRange: [114, 116], + sourceRange: [114, 116, 0], }, ], type: 'TagIdentifier', @@ -210,7 +209,7 @@ const sk2 = startSketchOn('XY') tag: null, __geoMeta: { id: expect.any(String), - sourceRange: [69, 89], + sourceRange: [69, 89, 0], }, }, { @@ -225,7 +224,7 @@ const sk2 = startSketchOn('XY') }, __geoMeta: { id: expect.any(String), - sourceRange: [95, 117], + sourceRange: [95, 117, 0], }, }, { @@ -235,7 +234,7 @@ const sk2 = startSketchOn('XY') tag: null, __geoMeta: { id: expect.any(String), - sourceRange: [123, 142], + sourceRange: [123, 142, 0], }, }, ], @@ -243,7 +242,7 @@ const sk2 = startSketchOn('XY') height: 2, startCapId: expect.any(String), endCapId: expect.any(String), - __meta: [{ sourceRange: [38, 63] }], + __meta: [{ sourceRange: [38, 63, 0] }], }, { type: 'Solid', @@ -254,7 +253,7 @@ const sk2 = startSketchOn('XY') faceId: expect.any(String), tag: null, id: expect.any(String), - sourceRange: [373, 393], + sourceRange: [373, 393, 0], }, { type: 'extrudePlane', @@ -266,14 +265,14 @@ const sk2 = startSketchOn('XY') value: 'o', }, id: expect.any(String), - sourceRange: [399, 420], + sourceRange: [399, 420, 0], }, { type: 'extrudePlane', faceId: expect.any(String), tag: null, id: expect.any(String), - sourceRange: [426, 445], + sourceRange: [426, 445, 0], }, ], sketch: { @@ -286,7 +285,7 @@ const sk2 = startSketchOn('XY') o: { __meta: [ { - sourceRange: [417, 419], + sourceRange: [417, 419, 0], }, ], type: 'TagIdentifier', @@ -302,7 +301,7 @@ const sk2 = startSketchOn('XY') tag: null, __geoMeta: { id: expect.any(String), - sourceRange: [373, 393], + sourceRange: [373, 393, 0], }, }, { @@ -317,7 +316,7 @@ const sk2 = startSketchOn('XY') }, __geoMeta: { id: expect.any(String), - sourceRange: [399, 420], + sourceRange: [399, 420, 0], }, }, { @@ -327,7 +326,7 @@ const sk2 = startSketchOn('XY') tag: null, __geoMeta: { id: expect.any(String), - sourceRange: [426, 445], + sourceRange: [426, 445, 0], }, }, ], @@ -335,7 +334,7 @@ const sk2 = startSketchOn('XY') height: 2, startCapId: expect.any(String), endCapId: expect.any(String), - __meta: [{ sourceRange: [342, 367] }], + __meta: [{ sourceRange: [342, 367, 0] }], }, ]) }) diff --git a/src/lang/codeManager.ts b/src/lang/codeManager.ts index 5fdb72b32..257df317a 100644 --- a/src/lang/codeManager.ts +++ b/src/lang/codeManager.ts @@ -6,12 +6,17 @@ import { isDesktop } from 'lib/isDesktop' import toast from 'react-hot-toast' import { editorManager } from 'lib/singletons' import { Annotation, Transaction } from '@codemirror/state' -import { KeyBinding } from '@codemirror/view' +import { EditorView, KeyBinding } from '@codemirror/view' +import { recast, Program } from 'lang/wasm' +import { err } from 'lib/trap' +import { Compartment } from '@codemirror/state' +import { history } from '@codemirror/commands' const PERSIST_CODE_KEY = 'persistCode' const codeManagerUpdateAnnotation = Annotation.define() export const codeManagerUpdateEvent = codeManagerUpdateAnnotation.of(true) +export const codeManagerHistoryCompartment = new Compartment() export default class CodeManager { private _code: string = bracket @@ -40,7 +45,7 @@ export default class CodeManager { } else if (storedCode === null) { this.code = bracket } else { - this.code = storedCode + this.code = storedCode || '' } } @@ -52,6 +57,10 @@ export default class CodeManager { return this._code } + localStoragePersistCode(): string { + return safeLSGetItem(PERSIST_CODE_KEY) || '' + } + registerCallBacks({ setCode }: { setCode: (arg: string) => void }) { this.#updateState = setCode } @@ -88,9 +97,12 @@ export default class CodeManager { /** * Update the code in the editor. */ - updateCodeEditor(code: string): void { + updateCodeEditor(code: string, clearHistory?: boolean): void { this.code = code if (editorManager.editorView) { + if (clearHistory) { + clearCodeMirrorHistory(editorManager.editorView) + } editorManager.editorView.dispatch({ changes: { from: 0, @@ -99,7 +111,7 @@ export default class CodeManager { }, annotations: [ codeManagerUpdateEvent, - Transaction.addToHistory.of(true), + Transaction.addToHistory.of(!clearHistory), ], }) } @@ -108,11 +120,11 @@ export default class CodeManager { /** * Update the code, state, and the code the code mirror editor sees. */ - updateCodeStateEditor(code: string): void { + updateCodeStateEditor(code: string, clearHistory?: boolean): void { if (this._code !== code) { this.code = code this.#updateState(code) - this.updateCodeEditor(code) + this.updateCodeEditor(code, clearHistory) } } @@ -121,28 +133,43 @@ export default class CodeManager { // Only write our buffer contents to file once per second. Any faster // and file-system watchers which read, will receive empty data during // writes. + clearTimeout(this.timeoutWriter) this.writeCausedByAppCheckedInFileTreeFileSystemWatcher = true - this.timeoutWriter = setTimeout(() => { - // Wait one event loop to give a chance for params to be set - // Save the file to disk - this._currentFilePath && + + return new Promise((resolve, reject) => { + this.timeoutWriter = setTimeout(() => { + if (!this._currentFilePath) + return reject(new Error('currentFilePath not set')) + + // Wait one event loop to give a chance for params to be set + // Save the file to disk window.electron .writeFile(this._currentFilePath, this.code ?? '') + .then(resolve) .catch((err: Error) => { // TODO: add tracing per GH issue #254 (https://github.com/KittyCAD/modeling-app/issues/254) console.error('error saving file', err) toast.error('Error saving file, please check file permissions') + reject(err) }) - }, 1000) + }, 1000) + }) } else { safeLSSetItem(PERSIST_CODE_KEY, this.code) } } + + async updateEditorWithAstAndWriteToFile(ast: Program) { + const newCode = recast(ast) + if (err(newCode)) return + this.updateCodeStateEditor(newCode) + await this.writeToFile() + } } function safeLSGetItem(key: string) { - if (typeof window === 'undefined') return null + if (typeof window === 'undefined') return return localStorage?.getItem(key) } @@ -150,3 +177,17 @@ function safeLSSetItem(key: string, value: string) { if (typeof window === 'undefined') return localStorage?.setItem(key, value) } + +function clearCodeMirrorHistory(view: EditorView) { + // Clear history + view.dispatch({ + effects: [codeManagerHistoryCompartment.reconfigure([])], + annotations: [codeManagerUpdateEvent], + }) + + // Add history back + view.dispatch({ + effects: [codeManagerHistoryCompartment.reconfigure([history()])], + annotations: [codeManagerUpdateEvent], + }) +} diff --git a/src/lang/errors.test.ts b/src/lang/errors.test.ts index ec1bf7089..3ce2e9f69 100644 --- a/src/lang/errors.test.ts +++ b/src/lang/errors.test.ts @@ -8,20 +8,16 @@ describe('test kclErrToDiagnostic', () => { message: '', kind: 'semantic', msg: 'Semantic error', - sourceRanges: [ - [0, 1], - [2, 3], - ], + sourceRange: [0, 1, true], + operations: [], }, { name: '', message: '', kind: 'type', msg: 'Type error', - sourceRanges: [ - [4, 5], - [6, 7], - ], + sourceRange: [4, 5, true], + operations: [], }, ] const diagnostics = kclErrorsToDiagnostics(errors) @@ -32,24 +28,12 @@ describe('test kclErrToDiagnostic', () => { message: 'Semantic error', severity: 'error', }, - { - from: 2, - to: 3, - message: 'Semantic error', - severity: 'error', - }, { from: 4, to: 5, message: 'Type error', severity: 'error', }, - { - from: 6, - to: 7, - message: 'Type error', - severity: 'error', - }, ]) }) }) diff --git a/src/lang/errors.ts b/src/lang/errors.ts index 9ee093395..0ba0d83d1 100644 --- a/src/lang/errors.ts +++ b/src/lang/errors.ts @@ -1,86 +1,99 @@ import { KclError as RustKclError } from '../wasm-lib/kcl/bindings/KclError' +import { CompilationError } from 'wasm-lib/kcl/bindings/CompilationError' import { Diagnostic as CodeMirrorDiagnostic } from '@codemirror/lint' import { posToOffset } from '@kittycad/codemirror-lsp-client' import { Diagnostic as LspDiagnostic } from 'vscode-languageserver-protocol' import { Text } from '@codemirror/state' +import { EditorView } from 'codemirror' +import { SourceRange } from 'lang/wasm' +import { Operation } from 'wasm-lib/kcl/bindings/Operation' type ExtractKind = T extends { kind: infer K } ? K : never export class KCLError extends Error { kind: ExtractKind | 'name' - sourceRanges: [number, number][] + sourceRange: SourceRange msg: string + operations: Operation[] + constructor( kind: ExtractKind | 'name', msg: string, - sourceRanges: [number, number][] + sourceRange: SourceRange, + operations: Operation[] ) { super() this.kind = kind this.msg = msg - this.sourceRanges = sourceRanges + this.sourceRange = sourceRange + this.operations = operations Object.setPrototypeOf(this, KCLError.prototype) } } export class KCLLexicalError extends KCLError { - constructor(msg: string, sourceRanges: [number, number][]) { - super('lexical', msg, sourceRanges) + constructor(msg: string, sourceRange: SourceRange, operations: Operation[]) { + super('lexical', msg, sourceRange, operations) Object.setPrototypeOf(this, KCLSyntaxError.prototype) } } export class KCLInternalError extends KCLError { - constructor(msg: string, sourceRanges: [number, number][]) { - super('internal', msg, sourceRanges) + constructor(msg: string, sourceRange: SourceRange, operations: Operation[]) { + super('internal', msg, sourceRange, operations) Object.setPrototypeOf(this, KCLSyntaxError.prototype) } } export class KCLSyntaxError extends KCLError { - constructor(msg: string, sourceRanges: [number, number][]) { - super('syntax', msg, sourceRanges) + constructor(msg: string, sourceRange: SourceRange, operations: Operation[]) { + super('syntax', msg, sourceRange, operations) Object.setPrototypeOf(this, KCLSyntaxError.prototype) } } export class KCLSemanticError extends KCLError { - constructor(msg: string, sourceRanges: [number, number][]) { - super('semantic', msg, sourceRanges) + constructor(msg: string, sourceRange: SourceRange, operations: Operation[]) { + super('semantic', msg, sourceRange, operations) Object.setPrototypeOf(this, KCLSemanticError.prototype) } } export class KCLTypeError extends KCLError { - constructor(msg: string, sourceRanges: [number, number][]) { - super('type', msg, sourceRanges) + constructor(msg: string, sourceRange: SourceRange, operations: Operation[]) { + super('type', msg, sourceRange, operations) Object.setPrototypeOf(this, KCLTypeError.prototype) } } export class KCLUnimplementedError extends KCLError { - constructor(msg: string, sourceRanges: [number, number][]) { - super('unimplemented', msg, sourceRanges) + constructor(msg: string, sourceRange: SourceRange, operations: Operation[]) { + super('unimplemented', msg, sourceRange, operations) Object.setPrototypeOf(this, KCLUnimplementedError.prototype) } } export class KCLUnexpectedError extends KCLError { - constructor(msg: string, sourceRanges: [number, number][]) { - super('unexpected', msg, sourceRanges) + constructor(msg: string, sourceRange: SourceRange, operations: Operation[]) { + super('unexpected', msg, sourceRange, operations) Object.setPrototypeOf(this, KCLUnexpectedError.prototype) } } export class KCLValueAlreadyDefined extends KCLError { - constructor(key: string, sourceRanges: [number, number][]) { - super('name', `Key ${key} was already defined elsewhere`, sourceRanges) + constructor(key: string, sourceRange: SourceRange, operations: Operation[]) { + super( + 'name', + `Key ${key} was already defined elsewhere`, + sourceRange, + operations + ) Object.setPrototypeOf(this, KCLValueAlreadyDefined.prototype) } } export class KCLUndefinedValueError extends KCLError { - constructor(key: string, sourceRanges: [number, number][]) { - super('name', `Key ${key} has not been defined`, sourceRanges) + constructor(key: string, sourceRange: SourceRange, operations: Operation[]) { + super('name', `Key ${key} has not been defined`, sourceRange, operations) Object.setPrototypeOf(this, KCLUndefinedValueError.prototype) } } @@ -96,19 +109,16 @@ export function lspDiagnosticsToKclErrors( return diagnostics .flatMap( ({ range, message }) => - new KCLError('unexpected', message, [ - [posToOffset(doc, range.start)!, posToOffset(doc, range.end)!], - ]) + new KCLError( + 'unexpected', + message, + [posToOffset(doc, range.start)!, posToOffset(doc, range.end)!, true], + [] + ) ) - .filter(({ sourceRanges }) => { - const [from, to] = sourceRanges[0] - return ( - from !== null && to !== null && from !== undefined && to !== undefined - ) - }) .sort((a, b) => { - const c = a.sourceRanges[0][0] - const d = b.sourceRanges[0][0] + const c = a.sourceRange[0] + const d = b.sourceRange[0] switch (true) { case c < d: return -1 @@ -126,9 +136,48 @@ export function lspDiagnosticsToKclErrors( export function kclErrorsToDiagnostics( errors: KCLError[] ): CodeMirrorDiagnostic[] { - return errors?.flatMap((err) => { - return err.sourceRanges.map(([from, to]) => { - return { from, to, message: err.msg, severity: 'error' } + return errors + ?.filter((err) => err.sourceRange[2]) + .map((err) => { + return { + from: err.sourceRange[0], + to: err.sourceRange[1], + message: err.msg, + severity: 'error', + } + }) +} + +export function complilationErrorsToDiagnostics( + errors: CompilationError[] +): CodeMirrorDiagnostic[] { + return errors + ?.filter((err) => err.sourceRange[2] === 0) + .map((err) => { + let severity: any = 'error' + if (err.severity === 'Warning') { + severity = 'warning' + } + let actions + const suggestion = err.suggestion + if (suggestion) { + actions = [ + { + name: suggestion.title, + apply: (view: EditorView, from: number, to: number) => { + view.dispatch({ + changes: { from, to, insert: suggestion.insert }, + }) + }, + }, + ] + } + return { + from: err.sourceRange[0], + to: err.sourceRange[1], + message: err.message, + severity, + actions, + } }) - }) } diff --git a/src/lang/executor.test.ts b/src/lang/executor.test.ts index 825f84819..c932ec4b4 100644 --- a/src/lang/executor.test.ts +++ b/src/lang/executor.test.ts @@ -1,7 +1,7 @@ import fs from 'node:fs' import { - parse, + assertParse, ProgramMemory, Sketch, initPromise, @@ -58,14 +58,20 @@ const newVar = myVar + 1` ` const mem = await exe(code) // geo is three js buffer geometry and is very bloated to have in tests - const minusGeo = mem.get('mySketch')?.value?.paths + const sk = mem.get('mySketch') + expect(sk?.type).toEqual('Sketch') + if (sk?.type !== 'Sketch') { + return + } + + const minusGeo = sk?.value?.paths expect(minusGeo).toEqual([ { type: 'ToPoint', to: [0, 2], from: [0, 0], __geoMeta: { - sourceRange: [72, 97], + sourceRange: [72, 97, 0], id: expect.any(String), }, tag: { @@ -81,7 +87,7 @@ const newVar = myVar + 1` from: [0, 2], tag: null, __geoMeta: { - sourceRange: [103, 119], + sourceRange: [103, 119, 0], id: expect.any(String), }, }, @@ -90,7 +96,7 @@ const newVar = myVar + 1` to: [5, -1], from: [2, 3], __geoMeta: { - sourceRange: [125, 154], + sourceRange: [125, 154, 0], id: expect.any(String), }, tag: { @@ -150,7 +156,7 @@ const newVar = myVar + 1` ].join('\n') const mem = await exe(code) expect(mem.get('mySk1')).toEqual({ - type: 'UserVal', + type: 'Sketch', value: { type: 'Sketch', on: expect.any(Object), @@ -160,14 +166,14 @@ const newVar = myVar + 1` tag: null, __geoMeta: { id: expect.any(String), - sourceRange: [39, 63], + sourceRange: [39, 63, 0], }, }, tags: { myPath: { __meta: [ { - sourceRange: [109, 116], + sourceRange: [109, 116, 0], }, ], type: 'TagIdentifier', @@ -182,7 +188,7 @@ const newVar = myVar + 1` from: [0, 0], tag: null, __geoMeta: { - sourceRange: [69, 85], + sourceRange: [69, 85, 0], id: expect.any(String), }, }, @@ -191,7 +197,7 @@ const newVar = myVar + 1` to: [0, 1], from: [1, 1], __geoMeta: { - sourceRange: [91, 117], + sourceRange: [91, 117, 0], id: expect.any(String), }, tag: { @@ -207,15 +213,14 @@ const newVar = myVar + 1` from: [0, 1], tag: null, __geoMeta: { - sourceRange: [123, 139], + sourceRange: [123, 139, 0], id: expect.any(String), }, }, ], id: expect.any(String), - __meta: [{ sourceRange: [39, 63] }], + __meta: [{ sourceRange: [39, 63, 0] }], }, - __meta: [{ sourceRange: [39, 63] }], }) }) it('execute array expression', async () => { @@ -225,20 +230,29 @@ const newVar = myVar + 1` const mem = await exe(code) // TODO path to node is probably wrong here, zero indexes are not correct expect(mem.get('three')).toEqual({ - type: 'UserVal', + type: 'Number', value: 3, __meta: [ { - sourceRange: [14, 15], + sourceRange: [14, 15, 0], }, ], }) expect(mem.get('yo')).toEqual({ - type: 'UserVal', - value: [1, '2', 3, 9], + type: 'Array', + value: [ + { type: 'Number', value: 1, __meta: [{ sourceRange: [28, 29, 0] }] }, + { type: 'String', value: '2', __meta: [{ sourceRange: [31, 34, 0] }] }, + { type: 'Number', value: 3, __meta: [{ sourceRange: [14, 15, 0] }] }, + { + type: 'Number', + value: 9, + __meta: [{ sourceRange: [43, 44, 0] }, { sourceRange: [47, 48, 0] }], + }, + ], __meta: [ { - sourceRange: [27, 49], + sourceRange: [27, 49, 0], }, ], }) @@ -253,11 +267,32 @@ const newVar = myVar + 1` ].join('\n') const mem = await exe(code) expect(mem.get('yo')).toEqual({ - type: 'UserVal', - value: { aStr: 'str', anum: 2, identifier: 3, binExp: 9 }, + type: 'Object', + value: { + aStr: { + type: 'String', + value: 'str', + __meta: [{ sourceRange: [34, 39, 0] }], + }, + anum: { + type: 'Number', + value: 2, + __meta: [{ sourceRange: [47, 48, 0] }], + }, + identifier: { + type: 'Number', + value: 3, + __meta: [{ sourceRange: [14, 15, 0] }], + }, + binExp: { + type: 'Number', + value: 9, + __meta: [{ sourceRange: [77, 78, 0] }, { sourceRange: [81, 82, 0] }], + }, + }, __meta: [ { - sourceRange: [27, 83], + sourceRange: [27, 83, 0], }, ], }) @@ -268,11 +303,11 @@ const newVar = myVar + 1` ) const mem = await exe(code) expect(mem.get('myVar')).toEqual({ - type: 'UserVal', + type: 'String', value: '123', __meta: [ { - sourceRange: [41, 50], + sourceRange: [19, 24, 0], }, ], }) @@ -356,7 +391,26 @@ describe('testing math operators', () => { it('with unaryExpression in ArrayExpression', async () => { const code = 'const myVar = [1,-legLen(5, 4)]' const mem = await exe(code) - expect(mem.get('myVar')?.value).toEqual([1, -3]) + expect(mem.get('myVar')?.value).toEqual([ + { + __meta: [ + { + sourceRange: [15, 16, 0], + }, + ], + type: 'Number', + value: 1, + }, + { + __meta: [ + { + sourceRange: [17, 30, 0], + }, + ], + type: 'Number', + value: -3, + }, + ]) }) it('with unaryExpression in ArrayExpression in CallExpression, checking nothing funny happens when used in a sketch', async () => { const code = [ @@ -418,7 +472,7 @@ describe('Testing Errors', () => { const theExtrude = startSketchOn('XY') |> startProfileAt([0, 0], %) |> line([-2.4, 5], %) - |> line([-0.76], myVarZ, %) + |> line(myVarZ, %) |> line([5,5], %) |> close(%) |> extrude(4, %)` @@ -426,7 +480,8 @@ const theExtrude = startSketchOn('XY') new KCLError( 'undefined_value', 'memory item key `myVarZ` is not defined', - [[129, 135]] + [129, 135, true], + [] ) ) }) @@ -438,7 +493,7 @@ async function exe( code: string, programMemory: ProgramMemory = ProgramMemory.empty() ) { - const ast = parse(code) + const ast = assertParse(code) const execState = await enginelessExecutor(ast, programMemory) return execState.memory diff --git a/src/lang/getNodePathFromSourceRange.test.ts b/src/lang/getNodePathFromSourceRange.test.ts index 9b7903a63..7349bb602 100644 --- a/src/lang/getNodePathFromSourceRange.test.ts +++ b/src/lang/getNodePathFromSourceRange.test.ts @@ -1,5 +1,5 @@ import { getNodePathFromSourceRange, getNodeFromPath } from './queryAst' -import { Identifier, parse, initPromise, Parameter } from './wasm' +import { Identifier, assertParse, initPromise, Parameter } from './wasm' import { err } from 'lib/trap' beforeAll(async () => { @@ -17,19 +17,19 @@ const sk3 = startSketchAt([0, 0]) ` const subStr = 'lineTo([3, 4], %, $yo)' const lineToSubstringIndex = code.indexOf(subStr) - const sourceRange: [number, number] = [ + const sourceRange: [number, number, boolean] = [ lineToSubstringIndex, lineToSubstringIndex + subStr.length, + true, ] - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) const nodePath = getNodePathFromSourceRange(ast, sourceRange) const _node = getNodeFromPath(ast, nodePath) if (err(_node)) throw _node const { node } = _node - expect([node.start, node.end]).toEqual(sourceRange) + expect([node.start, node.end, true]).toEqual(sourceRange) expect(node.type).toBe('CallExpression') }) it('gets path right for function definition params', () => { @@ -45,13 +45,13 @@ const sk3 = startSketchAt([0, 0]) const b1 = cube([0,0], 10)` const subStr = 'pos, scale' const subStrIndex = code.indexOf(subStr) - const sourceRange: [number, number] = [ + const sourceRange: [number, number, boolean] = [ subStrIndex, subStrIndex + 'pos'.length, + true, ] - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) const nodePath = getNodePathFromSourceRange(ast, sourceRange) const _node = getNodeFromPath(ast, nodePath) if (err(_node)) throw _node @@ -60,8 +60,7 @@ const b1 = cube([0,0], 10)` expect(nodePath).toEqual([ ['body', ''], [0, 'index'], - ['declarations', 'VariableDeclaration'], - [0, 'index'], + ['declaration', 'VariableDeclaration'], ['init', ''], ['params', 'FunctionExpression'], [0, 'index'], @@ -82,13 +81,13 @@ const b1 = cube([0,0], 10)` const b1 = cube([0,0], 10)` const subStr = 'scale, 0' const subStrIndex = code.indexOf(subStr) - const sourceRange: [number, number] = [ + const sourceRange: [number, number, boolean] = [ subStrIndex, subStrIndex + 'scale'.length, + true, ] - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) const nodePath = getNodePathFromSourceRange(ast, sourceRange) const _node = getNodeFromPath(ast, nodePath) if (err(_node)) throw _node @@ -96,14 +95,12 @@ const b1 = cube([0,0], 10)` expect(nodePath).toEqual([ ['body', ''], [0, 'index'], - ['declarations', 'VariableDeclaration'], - [0, 'index'], + ['declaration', 'VariableDeclaration'], ['init', ''], ['body', 'FunctionExpression'], ['body', 'FunctionExpression'], [0, 'index'], - ['declarations', 'VariableDeclaration'], - [0, 'index'], + ['declaration', 'VariableDeclaration'], ['init', ''], ['body', 'PipeExpression'], [2, 'index'], diff --git a/src/lang/kclSamples.test.ts b/src/lang/kclSamples.test.ts new file mode 100644 index 000000000..c7ea9f9c5 --- /dev/null +++ b/src/lang/kclSamples.test.ts @@ -0,0 +1,79 @@ +import { assertParse, initPromise, programMemoryInit } from './wasm' +import { enginelessExecutor } from '../lib/testHelpers' +// These unit tests makes web requests to a public github repository. + +interface KclSampleFile { + file: string + title: string + filename: string + description: string +} + +beforeAll(async () => { + await initPromise +}) + +// Only used to actually fetch an older version of KCL code that will break in the parser. +/* eslint-disable @typescript-eslint/no-unused-vars */ +async function getBrokenSampleCodeForLocalTesting() { + const result = await fetch( + 'https://raw.githubusercontent.com/KittyCAD/kcl-samples/5ccd04a1773ebdbfd02684057917ce5dbe0eaab3/80-20-rail.kcl' + ) + const text = await result.text() + return text +} + +async function getKclSampleCodeFromGithub(file: string): Promise { + const result = await fetch( + `https://raw.githubusercontent.com/KittyCAD/kcl-samples/refs/heads/main/${file}/${file}.kcl` + ) + const text = await result.text() + return text +} + +async function getFileNamesFromManifestJSON(): Promise { + const result = await fetch( + 'https://raw.githubusercontent.com/KittyCAD/kcl-samples/refs/heads/main/manifest.json' + ) + const json = await result.json() + json.forEach((file: KclSampleFile) => { + const filenameWithoutExtension = file.file.split('.')[0] + file.filename = filenameWithoutExtension + }) + return json +} + +// Value to use across all tests! +let files: KclSampleFile[] = [] + +describe('Test KCL Samples from public Github repository', () => { + describe('When parsing source code', () => { + // THIS RUNS ACROSS OTHER TESTS! + it('should fetch files', async () => { + files = await getFileNamesFromManifestJSON() + }) + // Run through all of the files in the manifest json. This will allow us to be automatically updated + // with the latest changes in github. We won't be hard coding the filenames + files.forEach((file: KclSampleFile) => { + it(`should parse ${file.filename} without errors`, async () => { + const code = await getKclSampleCodeFromGithub(file.filename) + assertParse(code) + }, 1000) + }) + }) + + describe('when performing enginelessExecutor', () => { + it( + 'should run through all the files', + async () => { + for (let i = 0; i < files.length; i++) { + const file: KclSampleFile = files[i] + const code = await getKclSampleCodeFromGithub(file.filename) + const ast = assertParse(code) + await enginelessExecutor(ast, programMemoryInit()) + } + }, + files.length * 1000 + ) + }) +}) diff --git a/src/lang/langHelpers.ts b/src/lang/langHelpers.ts index 138b75809..64920e7ae 100644 --- a/src/lang/langHelpers.ts +++ b/src/lang/langHelpers.ts @@ -2,7 +2,6 @@ import { Program, _executor, ProgramMemory, - programMemoryInit, kclLint, emptyExecState, ExecState, @@ -11,7 +10,7 @@ import { enginelessExecutor } from 'lib/testHelpers' import { EngineCommandManager } from 'lang/std/engineConnection' import { KCLError } from 'lang/errors' import { Diagnostic } from '@codemirror/lint' -import { IdGenerator } from 'wasm-lib/kcl/bindings/IdGenerator' +import { Node } from 'wasm-lib/kcl/bindings/Node' export type ToolTip = | 'lineTo' @@ -48,15 +47,13 @@ export const toolTips: Array = [ export async function executeAst({ ast, engineCommandManager, - useFakeExecutor = false, + // If you set programMemoryOverride we assume you mean mock mode. Since that + // is the only way to go about it. programMemoryOverride, - idGenerator, }: { - ast: Program + ast: Node engineCommandManager: EngineCommandManager - useFakeExecutor?: boolean programMemoryOverride?: ProgramMemory - idGenerator?: IdGenerator isInterrupted?: boolean }): Promise<{ logs: string[] @@ -65,22 +62,12 @@ export async function executeAst({ isInterrupted: boolean }> { try { - if (!useFakeExecutor) { - engineCommandManager.endSession() - // eslint-disable-next-line @typescript-eslint/no-floating-promises - engineCommandManager.startNewSession() - } - const execState = await (useFakeExecutor - ? enginelessExecutor(ast, programMemoryOverride || programMemoryInit()) - : _executor( - ast, - programMemoryInit(), - idGenerator, - engineCommandManager, - false - )) + const execState = await (programMemoryOverride + ? enginelessExecutor(ast, programMemoryOverride) + : _executor(ast, engineCommandManager)) await engineCommandManager.waitForAllCommands() + return { logs: [], errors: [], diff --git a/src/lang/modifyAst.test.ts b/src/lang/modifyAst.test.ts index 7bc36905f..261e8875c 100644 --- a/src/lang/modifyAst.test.ts +++ b/src/lang/modifyAst.test.ts @@ -1,4 +1,4 @@ -import { parse, recast, initPromise, Identifier } from './wasm' +import { assertParse, recast, initPromise, Identifier } from './wasm' import { createLiteral, createIdentifier, @@ -21,6 +21,8 @@ import { enginelessExecutor } from '../lib/testHelpers' import { findUsesOfTagInPipe, getNodePathFromSourceRange } from './queryAst' import { err } from 'lib/trap' import { SimplifiedArgDetails } from './std/stdTypes' +import { Node } from 'wasm-lib/kcl/bindings/Node' +import { Artifact, codeRefFromRange } from './std/artifactGraph' beforeAll(async () => { await initPromise @@ -80,11 +82,11 @@ describe('Testing createVariableDeclaration', () => { it('should create a variable declaration', () => { const result = createVariableDeclaration('myVar', createLiteral(5)) expect(result.type).toBe('VariableDeclaration') - expect(result.declarations[0].type).toBe('VariableDeclarator') - expect(result.declarations[0].id.type).toBe('Identifier') - expect(result.declarations[0].id.name).toBe('myVar') - expect(result.declarations[0].init.type).toBe('Literal') - expect((result.declarations[0].init as any).value).toBe(5) + expect(result.declaration.type).toBe('VariableDeclarator') + expect(result.declaration.id.type).toBe('Identifier') + expect(result.declaration.id.name).toBe('myVar') + expect(result.declaration.init.type).toBe('Literal') + expect((result.declaration.init as any).value).toBe(5) }) }) describe('Testing createPipeExpression', () => { @@ -100,16 +102,16 @@ describe('Testing findUniqueName', () => { it('should find a unique name', () => { const result = findUniqueName( JSON.stringify([ - { type: 'Identifier', name: 'yo01', start: 0, end: 0 }, - { type: 'Identifier', name: 'yo02', start: 0, end: 0 }, - { type: 'Identifier', name: 'yo03', start: 0, end: 0 }, - { type: 'Identifier', name: 'yo04', start: 0, end: 0 }, - { type: 'Identifier', name: 'yo05', start: 0, end: 0 }, - { type: 'Identifier', name: 'yo06', start: 0, end: 0 }, - { type: 'Identifier', name: 'yo07', start: 0, end: 0 }, - { type: 'Identifier', name: 'yo08', start: 0, end: 0 }, - { type: 'Identifier', name: 'yo09', start: 0, end: 0 }, - ] satisfies Identifier[]), + { type: 'Identifier', name: 'yo01', start: 0, end: 0, moduleId: 0 }, + { type: 'Identifier', name: 'yo02', start: 0, end: 0, moduleId: 0 }, + { type: 'Identifier', name: 'yo03', start: 0, end: 0, moduleId: 0 }, + { type: 'Identifier', name: 'yo04', start: 0, end: 0, moduleId: 0 }, + { type: 'Identifier', name: 'yo05', start: 0, end: 0, moduleId: 0 }, + { type: 'Identifier', name: 'yo06', start: 0, end: 0, moduleId: 0 }, + { type: 'Identifier', name: 'yo07', start: 0, end: 0, moduleId: 0 }, + { type: 'Identifier', name: 'yo08', start: 0, end: 0, moduleId: 0 }, + { type: 'Identifier', name: 'yo09', start: 0, end: 0, moduleId: 0 }, + ] satisfies Node[]), 'yo', 2 ) @@ -121,9 +123,11 @@ describe('Testing addSketchTo', () => { const result = addSketchTo( { body: [], + shebang: null, start: 0, end: 0, - nonCodeMeta: { nonCodeNodes: {}, start: [] }, + moduleId: 0, + nonCodeMeta: { nonCodeNodes: {}, startNodes: [] }, }, 'yz' ) @@ -142,10 +146,13 @@ function giveSketchFnCallTagTestHelper( // giveSketchFnCallTag inputs and outputs an ast, which is very verbose for testing // this wrapper changes the input and output to code // making it more of an integration test, but easier to read the test intention is the goal - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) const start = code.indexOf(searchStr) - const range: [number, number] = [start, start + searchStr.length] + const range: [number, number, boolean] = [ + start, + start + searchStr.length, + true, + ] const sketchRes = giveSketchFnCallTag(ast, range) if (err(sketchRes)) throw sketchRes const { modifiedAst, tag, isTagExisting } = sketchRes @@ -217,14 +224,13 @@ part001 = startSketchOn('XY') |> angledLine([jkl(yo) + 2, 3.09], %) yo2 = hmm([identifierGuy + 5])` it('should move a binary expression into a new variable', async () => { - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) const execState = await enginelessExecutor(ast) const startIndex = code.indexOf('100 + 100') + 1 const { modifiedAst } = moveValueIntoNewVariable( ast, execState.memory, - [startIndex, startIndex], + [startIndex, startIndex, true], 'newVar' ) const newCode = recast(modifiedAst) @@ -232,14 +238,13 @@ yo2 = hmm([identifierGuy + 5])` expect(newCode).toContain(`angledLine([newVar, 3.09], %)`) }) it('should move a value into a new variable', async () => { - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) const execState = await enginelessExecutor(ast) const startIndex = code.indexOf('2.8') + 1 const { modifiedAst } = moveValueIntoNewVariable( ast, execState.memory, - [startIndex, startIndex], + [startIndex, startIndex, true], 'newVar' ) const newCode = recast(modifiedAst) @@ -247,14 +252,13 @@ yo2 = hmm([identifierGuy + 5])` expect(newCode).toContain(`line([newVar, 0], %)`) }) it('should move a callExpression into a new variable', async () => { - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) const execState = await enginelessExecutor(ast) const startIndex = code.indexOf('def(') const { modifiedAst } = moveValueIntoNewVariable( ast, execState.memory, - [startIndex, startIndex], + [startIndex, startIndex, true], 'newVar' ) const newCode = recast(modifiedAst) @@ -262,14 +266,13 @@ yo2 = hmm([identifierGuy + 5])` expect(newCode).toContain(`angledLine([newVar, 3.09], %)`) }) it('should move a binary expression with call expression into a new variable', async () => { - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) const execState = await enginelessExecutor(ast) const startIndex = code.indexOf('jkl(') + 1 const { modifiedAst } = moveValueIntoNewVariable( ast, execState.memory, - [startIndex, startIndex], + [startIndex, startIndex, true], 'newVar' ) const newCode = recast(modifiedAst) @@ -277,14 +280,13 @@ yo2 = hmm([identifierGuy + 5])` expect(newCode).toContain(`angledLine([newVar, 3.09], %)`) }) it('should move a identifier into a new variable', async () => { - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) const execState = await enginelessExecutor(ast) const startIndex = code.indexOf('identifierGuy +') + 1 const { modifiedAst } = moveValueIntoNewVariable( ast, execState.memory, - [startIndex, startIndex], + [startIndex, startIndex, true], 'newVar' ) const newCode = recast(modifiedAst) @@ -301,19 +303,20 @@ describe('testing sketchOnExtrudedFace', () => { |> line([8.62, -9.57], %) |> close(%) |> extrude(5 + 7, %)` - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) const segmentSnippet = `line([9.7, 9.19], %)` - const segmentRange: [number, number] = [ + const segmentRange: [number, number, boolean] = [ code.indexOf(segmentSnippet), code.indexOf(segmentSnippet) + segmentSnippet.length, + true, ] const segmentPathToNode = getNodePathFromSourceRange(ast, segmentRange) const extrudeSnippet = `extrude(5 + 7, %)` - const extrudeRange: [number, number] = [ + const extrudeRange: [number, number, boolean] = [ code.indexOf(extrudeSnippet), code.indexOf(extrudeSnippet) + extrudeSnippet.length, + true, ] const extrudePathToNode = getNodePathFromSourceRange(ast, extrudeRange) @@ -341,18 +344,19 @@ sketch001 = startSketchOn(part001, seg01)`) |> line([8.62, -9.57], %) |> close(%) |> extrude(5 + 7, %)` - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) const segmentSnippet = `close(%)` - const segmentRange: [number, number] = [ + const segmentRange: [number, number, boolean] = [ code.indexOf(segmentSnippet), code.indexOf(segmentSnippet) + segmentSnippet.length, + true, ] const segmentPathToNode = getNodePathFromSourceRange(ast, segmentRange) const extrudeSnippet = `extrude(5 + 7, %)` - const extrudeRange: [number, number] = [ + const extrudeRange: [number, number, boolean] = [ code.indexOf(extrudeSnippet), code.indexOf(extrudeSnippet) + extrudeSnippet.length, + true, ] const extrudePathToNode = getNodePathFromSourceRange(ast, extrudeRange) @@ -380,18 +384,19 @@ sketch001 = startSketchOn(part001, seg01)`) |> line([8.62, -9.57], %) |> close(%) |> extrude(5 + 7, %)` - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) const sketchSnippet = `startProfileAt([3.58, 2.06], %)` - const sketchRange: [number, number] = [ + const sketchRange: [number, number, boolean] = [ code.indexOf(sketchSnippet), code.indexOf(sketchSnippet) + sketchSnippet.length, + true, ] const sketchPathToNode = getNodePathFromSourceRange(ast, sketchRange) const extrudeSnippet = `extrude(5 + 7, %)` - const extrudeRange: [number, number] = [ + const extrudeRange: [number, number, boolean] = [ code.indexOf(extrudeSnippet), code.indexOf(extrudeSnippet) + extrudeSnippet.length, + true, ] const extrudePathToNode = getNodePathFromSourceRange(ast, extrudeRange) @@ -428,18 +433,19 @@ sketch001 = startSketchOn(part001, 'END')`) |> line([-17.67, 0.85], %) |> close(%) part001 = extrude(5 + 7, sketch001)` - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) const segmentSnippet = `line([4.99, -0.46], %)` - const segmentRange: [number, number] = [ + const segmentRange: [number, number, boolean] = [ code.indexOf(segmentSnippet), code.indexOf(segmentSnippet) + segmentSnippet.length, + true, ] const segmentPathToNode = getNodePathFromSourceRange(ast, segmentRange) const extrudeSnippet = `extrude(5 + 7, sketch001)` - const extrudeRange: [number, number] = [ + const extrudeRange: [number, number, boolean] = [ code.indexOf(extrudeSnippet), code.indexOf(extrudeSnippet) + extrudeSnippet.length, + true, ] const extrudePathToNode = getNodePathFromSourceRange(ast, extrudeRange) @@ -462,13 +468,13 @@ describe('Testing deleteSegmentFromPipeExpression', () => { |> line([306.21, 198.82], %) |> line([306.21, 198.85], %, $a) |> line([306.21, 198.87], %)` - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) const execState = await enginelessExecutor(ast) const lineOfInterest = 'line([306.21, 198.85], %, $a)' - const range: [number, number] = [ + const range: [number, number, boolean] = [ code.indexOf(lineOfInterest), code.indexOf(lineOfInterest) + lineOfInterest.length, + true, ] const pathToNode = getNodePathFromSourceRange(ast, range) const modifiedAst = deleteSegmentFromPipeExpression( @@ -515,38 +521,38 @@ ${!replace1 ? ` |> ${line}\n` : ''} |> angledLine([-65, ${ ], [ 'angledLineOfXLength', - 'angledLineOfXLength({ angle: 45.5, length: 198.85 }, %, $a)', + 'angledLineOfXLength({ angle = 45.5, length = 198.85 }, %, $a)', ['283.7', '45.5'], ], [ 'angledLineOfYLength', - 'angledLineOfYLength({ angle: 45.5, length: 198.85 }, %, $a)', + 'angledLineOfYLength({ angle = 45.5, length = 198.85 }, %, $a)', ['278.79', '45.5'], ], [ 'angledLineToX', - 'angledLineToX({ angle: 45.5, to: 198.85 }, %, $a)', + 'angledLineToX({ angle = 45.5, to = 198.85 }, %, $a)', ['231.33', '134.5'], ], [ 'angledLineToY', - 'angledLineToY({ angle: 45.5, to: 198.85 }, %, $a)', + 'angledLineToY({ angle = 45.5, to = 198.85 }, %, $a)', ['134.51', '45.5'], ], [ 'angledLineThatIntersects', - `angledLineThatIntersects({ angle: 45.5, intersectTag: b, offset: 198.85 }, %, $a)`, + `angledLineThatIntersects({ angle = 45.5, intersectTag = b, offset = 198.85 }, %, $a)`, ['918.4', '45.5'], ], ])(`%s`, async (_, line, [replace1, replace2]) => { const code = makeCode(line) - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) const execState = await enginelessExecutor(ast) const lineOfInterest = line - const range: [number, number] = [ + const range: [number, number, boolean] = [ code.indexOf(lineOfInterest), code.indexOf(lineOfInterest) + lineOfInterest.length, + true, ] const pathToNode = getNodePathFromSourceRange(ast, range) const dependentSegments = findUsesOfTagInPipe(ast, pathToNode) @@ -569,26 +575,26 @@ describe('Testing removeSingleConstraintInfo', () => { const code = `part001 = startSketchOn('-XZ') |> startProfileAt([0, 0], %) |> line([3 + 0, 4 + 0], %) - |> angledLine({ angle: 3 + 0, length: 3.14 + 0 }, %) + |> angledLine({ angle = 3 + 0, length = 3.14 + 0 }, %) |> lineTo([6.14 + 0, 3.14 + 0], %) |> xLineTo(8 + 0, %) |> yLineTo(5 + 0, %) |> yLine(3.14 + 0, %, $a) |> xLine(3.14 + 0, %) - |> angledLineOfXLength({ angle: 3 + 0, length: 3.14 + 0 }, %) - |> angledLineOfYLength({ angle: 30 + 0, length: 3 + 0 }, %) - |> angledLineToX({ angle: 12.14 + 0, to: 12 + 0 }, %) - |> angledLineToY({ angle: 30 + 0, to: 10.14 + 0 }, %) + |> angledLineOfXLength({ angle = 3 + 0, length = 3.14 + 0 }, %) + |> angledLineOfYLength({ angle = 30 + 0, length = 3 + 0 }, %) + |> angledLineToX({ angle = 12.14 + 0, to = 12 + 0 }, %) + |> angledLineToY({ angle = 30 + 0, to = 10.14 + 0 }, %) |> angledLineThatIntersects({ - angle: 3.14 + 0, - intersectTag: a, - offset: 0 + 0 + angle = 3.14 + 0, + intersectTag = a, + offset = 0 + 0 }, %) |> tangentialArcTo([3.14 + 0, 13.14 + 0], %)` test.each([ [' line([3 + 0, 4], %)', 'arrayIndex', 1], [ - 'angledLine({ angle: 3, length: 3.14 + 0 }, %)', + 'angledLine({ angle = 3, length = 3.14 + 0 }, %)', 'objectProperty', 'angle', ], @@ -598,44 +604,44 @@ describe('Testing removeSingleConstraintInfo', () => { ['yLine(3.14, %, $a)', '', ''], ['xLine(3.14, %)', '', ''], [ - 'angledLineOfXLength({ angle: 3, length: 3.14 + 0 }, %)', + 'angledLineOfXLength({ angle = 3, length = 3.14 + 0 }, %)', 'objectProperty', 'angle', ], [ - 'angledLineOfYLength({ angle: 30 + 0, length: 3 }, %)', + 'angledLineOfYLength({ angle = 30 + 0, length = 3 }, %)', 'objectProperty', 'length', ], [ - 'angledLineToX({ angle: 12.14 + 0, to: 12 }, %)', + 'angledLineToX({ angle = 12.14 + 0, to = 12 }, %)', 'objectProperty', 'to', ], [ - 'angledLineToY({ angle: 30, to: 10.14 + 0 }, %)', + 'angledLineToY({ angle = 30, to = 10.14 + 0 }, %)', 'objectProperty', 'angle', ], [ `angledLineThatIntersects({ - angle: 3.14 + 0, - offset: 0, - intersectTag: a + angle = 3.14 + 0, + offset = 0, + intersectTag = a }, %)`, 'objectProperty', 'offset', ], ['tangentialArcTo([3.14 + 0, 13.14], %)', 'arrayIndex', 1], ] as const)('stdlib fn: %s', async (expectedFinish, key, value) => { - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) const execState = await enginelessExecutor(ast) const lineOfInterest = expectedFinish.split('(')[0] + '(' - const range: [number, number] = [ + const range: [number, number, boolean] = [ code.indexOf(lineOfInterest) + 1, code.indexOf(lineOfInterest) + lineOfInterest.length, + true, ] const pathToNode = getNodePathFromSourceRange(ast, range) let argPosition: SimplifiedArgDetails @@ -682,14 +688,14 @@ describe('Testing removeSingleConstraintInfo', () => { ['angledLineToX([12.14 + 0, 12], %)', 'arrayIndex', 1], ['angledLineToY([30, 10.14 + 0], %)', 'arrayIndex', 0], ])('stdlib fn: %s', async (expectedFinish, key, value) => { - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) const execState = await enginelessExecutor(ast) const lineOfInterest = expectedFinish.split('(')[0] + '(' - const range: [number, number] = [ + const range: [number, number, boolean] = [ code.indexOf(lineOfInterest) + 1, code.indexOf(lineOfInterest) + lineOfInterest.length, + true, ] let argPosition: SimplifiedArgDetails if (key === 'arrayIndex' && typeof value === 'number') { @@ -733,7 +739,7 @@ sketch003 = startSketchOn('XZ') |> close(%)`, codeAfter: `myVar = 5\n`, lineOfInterest: 'line([-2.94, 2.7], %)', - type: 'default', + type: 'segment', }, ], [ @@ -759,7 +765,7 @@ const extrude001 = extrude(10, sketch001)`, |> line([-17.67, 0.85], %) |> close(%)\n`, lineOfInterest: 'line([2.66, 1.17], %)', - type: 'extrude-wall', + type: 'wall', }, ], [ @@ -798,11 +804,11 @@ sketch001 = startSketchOn('XZ') |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%) sketch002 = startSketchOn({ - plane: { - origin: { x: 1, y: 2, z: 3 }, - x_axis: { x: 4, y: 5, z: 6 }, - y_axis: { x: 7, y: 8, z: 9 }, - z_axis: { x: 10, y: 11, z: 12 } + plane = { + origin = { x = 1, y = 2, z = 3 }, + x_axis = { x = 4, y = 5, z = 6 }, + y_axis = { x = 7, y = 8, z = 9 }, + z_axis = { x = 10, y = 11, z = 12 } } }) |> startProfileAt([-12.55, 2.89], %) @@ -815,7 +821,7 @@ sketch002 = startSketchOn({ |> close(%) `, lineOfInterest: 'line([-11.18, -2.15], %)', - type: 'extrude-wall', + type: 'wall', }, ], [ @@ -854,11 +860,11 @@ sketch001 = startSketchOn('XZ') |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%) sketch002 = startSketchOn({ - plane: { - origin: { x: 1, y: 2, z: 3 }, - x_axis: { x: 4, y: 5, z: 6 }, - y_axis: { x: 7, y: 8, z: 9 }, - z_axis: { x: 10, y: 11, z: 12 } + plane = { + origin = { x = 1, y = 2, z = 3 }, + x_axis = { x = 4, y = 5, z = 6 }, + y_axis = { x = 7, y = 8, z = 9 }, + z_axis = { x = 10, y = 11, z = 12 } } }) |> startProfileAt([-12.55, 2.89], %) @@ -871,7 +877,7 @@ sketch002 = startSketchOn({ |> close(%) `, lineOfInterest: 'startProfileAt([4.46, 5.12], %, $tag)', - type: 'end-cap', + type: 'cap', }, ], ] as const @@ -879,20 +885,21 @@ sketch002 = startSketchOn({ '%s', async (name, { codeBefore, codeAfter, lineOfInterest, type }) => { // const lineOfInterest = 'line([-2.94, 2.7], %)' - const ast = parse(codeBefore) - if (err(ast)) throw ast + const ast = assertParse(codeBefore) const execState = await enginelessExecutor(ast) // deleteFromSelection - const range: [number, number] = [ + const range: [number, number, boolean] = [ codeBefore.indexOf(lineOfInterest), codeBefore.indexOf(lineOfInterest) + lineOfInterest.length, + true, ] + const artifact = { type } as Artifact const newAst = await deleteFromSelection( ast, { - range, - type, + codeRef: codeRefFromRange(range, ast), + artifact, }, execState.memory, async () => { diff --git a/src/lang/modifyAst.ts b/src/lang/modifyAst.ts index 048bdf001..c6becbaa1 100644 --- a/src/lang/modifyAst.ts +++ b/src/lang/modifyAst.ts @@ -1,5 +1,5 @@ -import { Selection } from 'lib/selections' import { err, reportRejection, trap } from 'lib/trap' +import { Selection } from 'lib/selections' import { Program, CallExpression, @@ -8,6 +8,7 @@ import { VariableDeclarator, Expr, Literal, + LiteralValue, PipeSubstitution, Identifier, ArrayExpression, @@ -18,6 +19,7 @@ import { ProgramMemory, SourceRange, sketchFromKclValue, + isPathToNodeNumber, } from './wasm' import { isNodeSafeToReplacePath, @@ -42,12 +44,14 @@ import { SimplifiedArgDetails } from './std/stdTypes' import { TagDeclarator } from 'wasm-lib/kcl/bindings/TagDeclarator' import { Models } from '@kittycad/lib' import { ExtrudeFacePlane } from 'machines/modelingMachine' +import { Node } from 'wasm-lib/kcl/bindings/Node' +import { KclExpressionWithVariable } from 'lib/commandTypes' export function startSketchOnDefault( - node: Program, + node: Node, axis: DefaultPlaneStr, name = '' -): { modifiedAst: Program; id: string; pathToNode: PathToNode } { +): { modifiedAst: Node; id: string; pathToNode: PathToNode } { const _node = { ...node } const _name = name || findUniqueName(node, KCL_DEFAULT_CONSTANT_PREFIXES.SKETCH) @@ -63,8 +67,7 @@ export function startSketchOnDefault( let pathToNode: PathToNode = [ ['body', ''], [sketchIndex, 'index'], - ['declarations', 'VariableDeclaration'], - ['0', 'index'], + ['declaration', 'VariableDeclaration'], ['init', 'VariableDeclarator'], ] @@ -76,10 +79,10 @@ export function startSketchOnDefault( } export function addStartProfileAt( - node: Program, + node: Node, pathToNode: PathToNode, at: [number, number] -): { modifiedAst: Program; pathToNode: PathToNode } | Error { +): { modifiedAst: Node; pathToNode: PathToNode } | Error { const _node1 = getNodeFromPath( node, pathToNode, @@ -91,7 +94,7 @@ export function addStartProfileAt( return new Error('variableDeclaration.init.type !== PipeExpression') } const _node = { ...node } - const init = variableDeclaration.declarations[0].init + const init = variableDeclaration.declaration.init const startProfileAt = createCallExpressionStdLib('startProfileAt', [ createArrayExpression([ createLiteral(roundOff(at[0])), @@ -102,7 +105,7 @@ export function addStartProfileAt( if (init.type === 'PipeExpression') { init.body.splice(1, 0, startProfileAt) } else { - variableDeclaration.declarations[0].init = createPipeExpression([ + variableDeclaration.declaration.init = createPipeExpression([ init, startProfileAt, ]) @@ -114,7 +117,7 @@ export function addStartProfileAt( } export function addSketchTo( - node: Program, + node: Node, axis: 'xy' | 'xz' | 'yz', name = '' ): { modifiedAst: Program; id: string; pathToNode: PathToNode } { @@ -146,8 +149,7 @@ export function addSketchTo( let pathToNode: PathToNode = [ ['body', ''], [sketchIndex, 'index'], - ['declarations', 'VariableDeclaration'], - ['0', 'index'], + ['declaration', 'VariableDeclaration'], ['init', 'VariableDeclarator'], ] if (axis !== 'xy') { @@ -210,7 +212,7 @@ export function mutateArrExp(node: Expr, updateWith: ArrayExpression): boolean { export function mutateObjExpProp( node: Expr, - updateWith: Literal | ArrayExpression, + updateWith: Node | Node, key: string ): boolean { if (node.type === 'ObjectExpression') { @@ -241,6 +243,7 @@ export function mutateObjExpProp( value: updateWith, start: 0, end: 0, + moduleId: 0, }) } } @@ -248,13 +251,13 @@ export function mutateObjExpProp( } export function extrudeSketch( - node: Program, + node: Node, pathToNode: PathToNode, shouldPipe = false, distance: Expr = createLiteral(4) ): | { - modifiedAst: Program + modifiedAst: Node pathToNode: PathToNode pathToExtrudeArg: PathToNode } @@ -329,8 +332,7 @@ export function extrudeSketch( const pathToExtrudeArg: PathToNode = [ ['body', ''], [sketchIndexInBody + 1, 'index'], - ['declarations', 'VariableDeclaration'], - [0, 'index'], + ['declaration', 'VariableDeclaration'], ['init', 'VariableDeclarator'], ['arguments', 'CallExpression'], [0, 'index'], @@ -342,14 +344,44 @@ export function extrudeSketch( } } +export function loftSketches( + node: Node, + declarators: VariableDeclarator[] +): { + modifiedAst: Node + pathToNode: PathToNode +} { + const modifiedAst = structuredClone(node) + const name = findUniqueName(node, KCL_DEFAULT_CONSTANT_PREFIXES.LOFT) + const elements = declarators.map((d) => createIdentifier(d.id.name)) + const loft = createCallExpressionStdLib('loft', [ + createArrayExpression(elements), + ]) + const declaration = createVariableDeclaration(name, loft) + modifiedAst.body.push(declaration) + const pathToNode: PathToNode = [ + ['body', ''], + [modifiedAst.body.length - 1, 'index'], + ['declaration', 'VariableDeclaration'], + ['init', 'VariableDeclarator'], + ['arguments', 'CallExpression'], + [0, 'index'], + ] + + return { + modifiedAst, + pathToNode, + } +} + export function revolveSketch( - node: Program, + node: Node, pathToNode: PathToNode, shouldPipe = false, angle: Expr = createLiteral(4) ): | { - modifiedAst: Program + modifiedAst: Node pathToNode: PathToNode pathToRevolveArg: PathToNode } @@ -425,8 +457,7 @@ export function revolveSketch( const pathToRevolveArg: PathToNode = [ ['body', ''], [sketchIndexInBody + 1, 'index'], - ['declarations', 'VariableDeclaration'], - [0, 'index'], + ['declaration', 'VariableDeclaration'], ['init', 'VariableDeclarator'], ['arguments', 'CallExpression'], [0, 'index'], @@ -439,7 +470,7 @@ export function revolveSketch( } export function sketchOnExtrudedFace( - node: Program, + node: Node, sketchPathToNode: PathToNode, extrudePathToNode: PathToNode, info: ExtrudeFacePlane['faceInfo'] = { type: 'wall' } @@ -512,8 +543,7 @@ export function sketchOnExtrudedFace( const newpathToNode: PathToNode = [ ['body', ''], [expressionIndex + 1, 'index'], - ['declarations', 'VariableDeclaration'], - [0, 'index'], + ['declaration', 'VariableDeclaration'], ['init', 'VariableDeclarator'], ] @@ -523,6 +553,117 @@ export function sketchOnExtrudedFace( } } +/** + * Append an offset plane to the AST + */ +export function addOffsetPlane({ + node, + defaultPlane, + offset, +}: { + node: Node + defaultPlane: DefaultPlaneStr + offset: Expr +}): { modifiedAst: Node; pathToNode: PathToNode } { + const modifiedAst = structuredClone(node) + const newPlaneName = findUniqueName(node, KCL_DEFAULT_CONSTANT_PREFIXES.PLANE) + + const newPlane = createVariableDeclaration( + newPlaneName, + createCallExpressionStdLib('offsetPlane', [ + createLiteral(defaultPlane.toUpperCase()), + offset, + ]) + ) + + modifiedAst.body.push(newPlane) + const pathToNode: PathToNode = [ + ['body', ''], + [modifiedAst.body.length - 1, 'index'], + ['declaration', 'VariableDeclaration'], + ['init', 'VariableDeclarator'], + ['arguments', 'CallExpression'], + [0, 'index'], + ] + return { + modifiedAst, + pathToNode, + } +} + +/** + * Return a modified clone of an AST with a named constant inserted into the body + */ +export function insertNamedConstant({ + node, + newExpression, +}: { + node: Node + newExpression: KclExpressionWithVariable +}): Node { + const ast = structuredClone(node) + ast.body.splice( + newExpression.insertIndex, + 0, + newExpression.variableDeclarationAst + ) + return ast +} + +/** + * Modify the AST to create a new sketch using the variable declaration + * of an offset plane. The new sketch just has to come after the offset + * plane declaration. + */ +export function sketchOnOffsetPlane( + node: Node, + offsetPathToNode: PathToNode +) { + let _node = { ...node } + + // Find the offset plane declaration + const offsetPlaneDeclarator = getNodeFromPath( + _node, + offsetPathToNode, + 'VariableDeclarator', + true + ) + if (err(offsetPlaneDeclarator)) return offsetPlaneDeclarator + const { node: offsetPlaneNode } = offsetPlaneDeclarator + const offsetPlaneName = offsetPlaneNode.id.name + + // Create a new sketch declaration + const newSketchName = findUniqueName( + node, + KCL_DEFAULT_CONSTANT_PREFIXES.SKETCH + ) + const newSketch = createVariableDeclaration( + newSketchName, + createCallExpressionStdLib('startSketchOn', [ + createIdentifier(offsetPlaneName), + ]), + undefined, + 'const' + ) + + // Decide where to insert the new sketch declaration + const offsetIndex = offsetPathToNode[1][0] + + if (!isPathToNodeNumber(offsetIndex)) { + return new Error('Expected offsetIndex to be a number') + } + // and insert it + _node.body.splice(offsetIndex + 1, 0, newSketch) + const newPathToNode = structuredClone(offsetPathToNode) + newPathToNode[1][0] = offsetIndex + 1 + + // Return the modified AST and the path to the new sketch declaration + return { + modifiedAst: _node, + pathToNode: newPathToNode, + } +} + export const getLastIndex = (pathToNode: PathToNode): number => splitPathAtLastIndex(pathToNode).index @@ -571,60 +712,65 @@ export function splitPathAtPipeExpression(pathToNode: PathToNode): { return splitPathAtPipeExpression(pathToNode.slice(0, -1)) } -export function createLiteral(value: string | number): Literal { +export function createLiteral(value: LiteralValue): Node { return { type: 'Literal', start: 0, end: 0, + moduleId: 0, value, raw: `${value}`, } } -export function createTagDeclarator(value: string): TagDeclarator { +export function createTagDeclarator(value: string): Node { return { type: 'TagDeclarator', start: 0, end: 0, + moduleId: 0, value, } } -export function createIdentifier(name: string): Identifier { +export function createIdentifier(name: string): Node { return { type: 'Identifier', start: 0, end: 0, + moduleId: 0, name, } } -export function createPipeSubstitution(): PipeSubstitution { +export function createPipeSubstitution(): Node { return { type: 'PipeSubstitution', start: 0, end: 0, + moduleId: 0, } } export function createCallExpressionStdLib( name: string, args: CallExpression['arguments'] -): CallExpression { +): Node { return { type: 'CallExpression', start: 0, end: 0, + moduleId: 0, callee: { type: 'Identifier', start: 0, end: 0, + moduleId: 0, name, }, - optional: false, arguments: args, } } @@ -632,30 +778,32 @@ export function createCallExpressionStdLib( export function createCallExpression( name: string, args: CallExpression['arguments'] -): CallExpression { +): Node { return { type: 'CallExpression', start: 0, end: 0, + moduleId: 0, callee: { type: 'Identifier', start: 0, end: 0, + moduleId: 0, name, }, - optional: false, arguments: args, } } export function createArrayExpression( elements: ArrayExpression['elements'] -): ArrayExpression { +): Node { return { type: 'ArrayExpression', start: 0, end: 0, + moduleId: 0, nonCodeMeta: nonCodeMetaEmpty(), elements, @@ -664,11 +812,12 @@ export function createArrayExpression( export function createPipeExpression( body: PipeExpression['body'] -): PipeExpression { +): Node { return { type: 'PipeExpression', start: 0, end: 0, + moduleId: 0, body, nonCodeMeta: nonCodeMetaEmpty(), @@ -680,22 +829,22 @@ export function createVariableDeclaration( init: VariableDeclarator['init'], visibility: VariableDeclaration['visibility'] = 'default', kind: VariableDeclaration['kind'] = 'const' -): VariableDeclaration { +): Node { return { type: 'VariableDeclaration', start: 0, end: 0, + moduleId: 0, - declarations: [ - { - type: 'VariableDeclarator', - start: 0, - end: 0, + declaration: { + type: 'VariableDeclarator', + start: 0, + end: 0, + moduleId: 0, - id: createIdentifier(varName), - init, - }, - ], + id: createIdentifier(varName), + init, + }, visibility, kind, } @@ -703,17 +852,19 @@ export function createVariableDeclaration( export function createObjectExpression(properties: { [key: string]: Expr -}): ObjectExpression { +}): Node { return { type: 'ObjectExpression', start: 0, end: 0, + moduleId: 0, nonCodeMeta: nonCodeMetaEmpty(), properties: Object.entries(properties).map(([key, value]) => ({ type: 'ObjectProperty', start: 0, end: 0, + moduleId: 0, key: createIdentifier(key), value, @@ -724,11 +875,12 @@ export function createObjectExpression(properties: { export function createUnaryExpression( argument: UnaryExpression['argument'], operator: UnaryExpression['operator'] = '-' -): UnaryExpression { +): Node { return { type: 'UnaryExpression', start: 0, end: 0, + moduleId: 0, operator, argument, @@ -739,11 +891,12 @@ export function createBinaryExpression([left, operator, right]: [ BinaryExpression['left'], BinaryExpression['operator'], BinaryExpression['right'] -]): BinaryExpression { +]): Node { return { type: 'BinaryExpression', start: 0, end: 0, + moduleId: 0, operator, left, @@ -754,19 +907,19 @@ export function createBinaryExpression([left, operator, right]: [ export function createBinaryExpressionWithUnary([left, right]: [ BinaryExpression['left'], BinaryExpression['right'] -]): BinaryExpression { +]): Node { if (right.type === 'UnaryExpression' && right.operator === '-') return createBinaryExpression([left, '-', right.argument]) return createBinaryExpression([left, '+', right]) } export function giveSketchFnCallTag( - ast: Program, - range: Selection['range'], + ast: Node, + range: SourceRange, tag?: string ): | { - modifiedAst: Program + modifiedAst: Node tag: string isTagExisting: boolean pathToNode: PathToNode @@ -800,8 +953,33 @@ export function giveSketchFnCallTag( } } +/** + * Replace a + */ +export function replaceValueAtNodePath({ + ast, + pathToNode, + newExpressionString, +}: { + ast: Node + pathToNode: PathToNode + newExpressionString: string +}) { + const replaceCheckResult = isNodeSafeToReplacePath(ast, pathToNode) + if (err(replaceCheckResult)) { + return replaceCheckResult + } + const { isSafe, value, replacer } = replaceCheckResult + + if (!isSafe || value.type === 'Identifier') { + return new Error('Not safe to replace') + } + + return replacer(ast, newExpressionString) +} + export function moveValueIntoNewVariablePath( - ast: Program, + ast: Node, programMemory: ProgramMemory, pathToNode: PathToNode, variableName: string @@ -834,12 +1012,12 @@ export function moveValueIntoNewVariablePath( } export function moveValueIntoNewVariable( - ast: Program, + ast: Node, programMemory: ProgramMemory, - sourceRange: Selection['range'], + sourceRange: SourceRange, variableName: string ): { - modifiedAst: Program + modifiedAst: Node pathToReplacedNode?: PathToNode } { const meta = isNodeSafeToReplace(ast, sourceRange) @@ -872,17 +1050,17 @@ export function moveValueIntoNewVariable( */ export function deleteSegmentFromPipeExpression( dependentRanges: SourceRange[], - modifiedAst: Program, + modifiedAst: Node, programMemory: ProgramMemory, code: string, pathToNode: PathToNode -): Program | Error { +): Node | Error { let _modifiedAst = structuredClone(modifiedAst) dependentRanges.forEach((range) => { const path = getNodePathFromSourceRange(_modifiedAst, range) - const callExp = getNodeFromPath( + const callExp = getNodeFromPath>( _modifiedAst, path, 'CallExpression', @@ -928,11 +1106,11 @@ export function deleteSegmentFromPipeExpression( export function removeSingleConstraintInfo( pathToCallExp: PathToNode, argDetails: SimplifiedArgDetails, - ast: Program, + ast: Node, programMemory: ProgramMemory ): | { - modifiedAst: Program + modifiedAst: Node pathToNodeMap: PathToNodeMap } | false { @@ -954,48 +1132,57 @@ export function removeSingleConstraintInfo( } export async function deleteFromSelection( - ast: Program, + ast: Node, selection: Selection, programMemory: ProgramMemory, getFaceDetails: (id: string) => Promise = () => ({} as any) -): Promise { +): Promise | Error> { const astClone = structuredClone(ast) - const range = selection.range - const path = getNodePathFromSourceRange(ast, range) const varDec = getNodeFromPath( ast, - path, + selection?.codeRef?.pathToNode, 'VariableDeclarator' ) if (err(varDec)) return varDec if ( - (selection.type === 'extrude-wall' || - selection.type === 'end-cap' || - selection.type === 'start-cap') && - varDec.node.init.type === 'PipeExpression' + ((selection?.artifact?.type === 'wall' || + selection?.artifact?.type === 'cap') && + varDec.node.init.type === 'PipeExpression') || + selection.artifact?.type === 'sweep' ) { - const varDecName = varDec.node.id.name - let pathToNode: PathToNode | null = null let extrudeNameToDelete = '' - traverse(astClone, { - enter: (node, path) => { - if (node.type === 'VariableDeclaration') { - const dec = node.declarations[0] - if ( - dec.init.type === 'CallExpression' && - (dec.init.callee.name === 'extrude' || - dec.init.callee.name === 'revolve') && - dec.init.arguments?.[1].type === 'Identifier' && - dec.init.arguments?.[1].name === varDecName - ) { - pathToNode = path - extrudeNameToDelete = dec.id.name + let pathToNode: PathToNode | null = null + if (selection.artifact?.type !== 'sweep') { + const varDecName = varDec.node.id.name + traverse(astClone, { + enter: (node, path) => { + if (node.type === 'VariableDeclaration') { + const dec = node.declaration + if ( + dec.init.type === 'CallExpression' && + (dec.init.callee.name === 'extrude' || + dec.init.callee.name === 'revolve') && + dec.init.arguments?.[1].type === 'Identifier' && + dec.init.arguments?.[1].name === varDecName + ) { + pathToNode = path + extrudeNameToDelete = dec.id.name + } } - } - }, - }) - if (!pathToNode) return new Error('Could not find extrude variable') + }, + }) + if (!pathToNode) return new Error('Could not find extrude variable') + } else { + pathToNode = selection.codeRef.pathToNode + const extrudeVarDec = getNodeFromPath( + astClone, + pathToNode, + 'VariableDeclarator' + ) + if (err(extrudeVarDec)) return extrudeVarDec + extrudeNameToDelete = extrudeVarDec.node.id.name + } const expressionIndex = pathToNode[1][0] as number astClone.body.splice(expressionIndex, 1) @@ -1016,7 +1203,7 @@ export async function deleteFromSelection( enter: (node, path) => { ;(async () => { if (node.type === 'VariableDeclaration') { - currentVariableName = node.declarations[0].id.name + currentVariableName = node.declaration.id.name } if ( // match startSketchOn(${extrudeNameToDelete}) @@ -1052,7 +1239,6 @@ export async function deleteFromSelection( sketchName ) if (err(sketchToPreserve)) return sketchToPreserve - console.log('sketchName', sketchName) // Can't kick off multiple requests at once as getFaceDetails // is three engine calls in one and they conflict const faceDetails = await getFaceDetails(sketchToPreserve.on.id) @@ -1134,5 +1320,5 @@ export async function deleteFromSelection( } const nonCodeMetaEmpty = () => { - return { nonCodeNodes: {}, start: [] } + return { nonCodeNodes: {}, startNodes: [], start: 0, end: 0 } } diff --git a/src/lang/modifyAst/addFillet.test.ts b/src/lang/modifyAst/addEdgeTreatment.test.ts similarity index 56% rename from src/lang/modifyAst/addFillet.test.ts rename to src/lang/modifyAst/addEdgeTreatment.test.ts index 1b9be4cba..930599229 100644 --- a/src/lang/modifyAst/addFillet.test.ts +++ b/src/lang/modifyAst/addEdgeTreatment.test.ts @@ -1,5 +1,5 @@ import { - parse, + assertParse, recast, initPromise, PathToNode, @@ -10,18 +10,23 @@ import { VariableDeclarator, } from '../wasm' import { + EdgeTreatmentType, getPathToExtrudeForSegmentSelection, - hasValidFilletSelection, - isTagUsedInFillet, - modifyAstCloneWithFilletAndTag, -} from './addFillet' + hasValidEdgeTreatmentSelection, + isTagUsedInEdgeTreatment, + modifyAstWithEdgeTreatmentAndTag, + FilletParameters, + ChamferParameters, + EdgeTreatmentParameters, +} from './addEdgeTreatment' import { getNodeFromPath, getNodePathFromSourceRange } from '../queryAst' import { createLiteral } from 'lang/modifyAst' import { err } from 'lib/trap' -import { Selections } from 'lib/selections' +import { Selection, Selections } from 'lib/selections' import { engineCommandManager, kclManager } from 'lib/singletons' import { VITE_KC_DEV_TOKEN } from 'env' -import { KclCommandValue } from 'lib/commandTypes' +import { isOverlap } from 'lib/utils' +import { codeRefFromRange } from 'lang/std/artifactGraph' beforeAll(async () => { await initPromise @@ -35,7 +40,6 @@ beforeAll(async () => { makeDefaultPlanes: () => makeDefaultPlanes(engineCommandManager), setMediaStream: () => {}, setIsStreamReady: () => {}, - modifyGrid: async () => {}, callbackOnEngineLiteConnect: () => { resolve(true) }, @@ -73,46 +77,48 @@ const runGetPathToExtrudeForSegmentSelectionTest = async ( code: string, expectedExtrudeSnippet: string ): CallExpression | PipeExpression | Error { - const extrudeRange: [number, number] = [ + const extrudeRange: [number, number, boolean] = [ code.indexOf(expectedExtrudeSnippet), code.indexOf(expectedExtrudeSnippet) + expectedExtrudeSnippet.length, + true, ] - const expedtedExtrudePath = getNodePathFromSourceRange(ast, extrudeRange) - const expedtedExtrudeNodeResult = getNodeFromPath( - ast, - expedtedExtrudePath - ) - if (err(expedtedExtrudeNodeResult)) { - return expedtedExtrudeNodeResult + const expectedExtrudePath = getNodePathFromSourceRange(ast, extrudeRange) + const expectedExtrudeNodeResult = getNodeFromPath< + VariableDeclarator | CallExpression + >(ast, expectedExtrudePath) + if (err(expectedExtrudeNodeResult)) { + return expectedExtrudeNodeResult } - const expectedExtrudeNode = expedtedExtrudeNodeResult.node - const init = expectedExtrudeNode.init - if (init.type !== 'CallExpression' && init.type !== 'PipeExpression') { - return new Error( - 'Expected extrude expression is not a CallExpression or PipeExpression' - ) + const expectedExtrudeNode = expectedExtrudeNodeResult.node + + // check whether extrude is in the sketch pipe + const extrudeInSketchPipe = expectedExtrudeNode.type === 'CallExpression' + if (extrudeInSketchPipe) { + return expectedExtrudeNode } - return init + if (!extrudeInSketchPipe) { + const init = expectedExtrudeNode.init + if (init.type !== 'CallExpression' && init.type !== 'PipeExpression') { + return new Error( + 'Expected extrude expression is not a CallExpression or PipeExpression' + ) + } + return init + } + return new Error('Expected extrude expression not found') } // ast - const astOrError = parse(code) - if (err(astOrError)) return new Error('AST not found') - const ast = astOrError + const ast = assertParse(code) // selection - const segmentRange: [number, number] = [ + const segmentRange: [number, number, boolean] = [ code.indexOf(selectedSegmentSnippet), code.indexOf(selectedSegmentSnippet) + selectedSegmentSnippet.length, + true, ] - const selection: Selections = { - codeBasedSelections: [ - { - range: segmentRange, - type: 'default', - }, - ], - otherSelections: [], + const selection: Selection = { + codeRef: codeRefFromRange(segmentRange, ast), } // executeAst and artifactGraph @@ -160,6 +166,23 @@ extrude001 = extrude(-15, sketch001)` expectedExtrudeSnippet ) }, 5_000) + it('should return the correct paths when extrusion occurs within the sketch pipe', async () => { + const code = `sketch001 = startSketchOn('XY') + |> startProfileAt([-10, 10], %) + |> line([20, 0], %) + |> line([0, -20], %) + |> line([-20, 0], %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) + |> extrude(15, %)` + const selectedSegmentSnippet = `line([20, 0], %)` + const expectedExtrudeSnippet = `extrude(15, %)` + await runGetPathToExtrudeForSegmentSelectionTest( + code, + selectedSegmentSnippet, + expectedExtrudeSnippet + ) + }, 5_000) it('should return the correct paths for a valid selection and extrusion in case of several extrusions and sketches', async () => { const code = `sketch001 = startSketchOn('XY') |> startProfileAt([-30, 30], %) @@ -224,49 +247,47 @@ extrude003 = extrude(-15, sketch003)` selectedSegmentSnippet, expectedExtrudeSnippet ) - }) + }, 5_000) }) -const runModifyAstCloneWithFilletAndTag = async ( +const runModifyAstCloneWithEdgeTreatmentAndTag = async ( code: string, selectionSnippets: Array, - radiusValue: number, + parameters: EdgeTreatmentParameters, expectedCode: string ) => { // ast - const astOrError = parse(code) - if (err(astOrError)) { - return new Error('AST not found') - } - const ast = astOrError + const ast = assertParse(code) // selection - const segmentRanges: Array<[number, number]> = selectionSnippets.map( + const segmentRanges: Array<[number, number, boolean]> = selectionSnippets.map( (selectionSnippet) => [ code.indexOf(selectionSnippet), code.indexOf(selectionSnippet) + selectionSnippet.length, + true, ] ) - const selection: Selections = { - codeBasedSelections: segmentRanges.map((segmentRange) => ({ - range: segmentRange, - type: 'default', - })), - otherSelections: [], - } - - // radius - const radius: KclCommandValue = { - valueAst: createLiteral(radiusValue), - valueText: radiusValue.toString(), - valueCalculated: radiusValue.toString(), - } // executeAst await kclManager.executeAst({ ast }) + const artifactGraph = engineCommandManager.artifactGraph - // apply fillet to selection - const result = modifyAstCloneWithFilletAndTag(ast, selection, radius) + const selection: Selections = { + graphSelections: segmentRanges.map((segmentRange) => { + const maybeArtifact = [...artifactGraph].find(([, a]) => { + if (!('codeRef' in a)) return false + return isOverlap(a.codeRef.range, segmentRange) + }) + return { + codeRef: codeRefFromRange(segmentRange, ast), + artifact: maybeArtifact ? maybeArtifact[1] : undefined, + } + }), + otherSelections: [], + } + + // apply edge treatment to seleciton + const result = modifyAstWithEdgeTreatmentAndTag(ast, selection, parameters) if (err(result)) { return result } @@ -276,9 +297,42 @@ const runModifyAstCloneWithFilletAndTag = async ( expect(newCode).toContain(expectedCode) } -describe('Testing applyFilletToSelection', () => { - it('should add a fillet to a specific segment', async () => { - const code = `sketch001 = startSketchOn('XY') +const createFilletParameters = (radiusValue: number): FilletParameters => ({ + type: EdgeTreatmentType.Fillet, + radius: { + valueAst: createLiteral(radiusValue), + valueText: radiusValue.toString(), + valueCalculated: radiusValue.toString(), + }, +}) +const createChamferParameters = (lengthValue: number): ChamferParameters => ({ + type: EdgeTreatmentType.Chamfer, + length: { + valueAst: createLiteral(lengthValue), + valueText: lengthValue.toString(), + valueCalculated: lengthValue.toString(), + }, +}) +// Iterate tests over all edge treatment types +Object.values(EdgeTreatmentType).forEach( + (edgeTreatmentType: EdgeTreatmentType) => { + // create parameters based on the edge treatment type + let parameterName: string + let parameters: EdgeTreatmentParameters + if (edgeTreatmentType === EdgeTreatmentType.Fillet) { + parameterName = 'radius' + parameters = createFilletParameters(3) + } else if (edgeTreatmentType === EdgeTreatmentType.Chamfer) { + parameterName = 'length' + parameters = createChamferParameters(3) + } else { + // Handle future edge treatments + return new Error(`Unsupported edge treatment type: ${edgeTreatmentType}`) + } + // run tests + describe(`Testing modifyAstCloneWithEdgeTreatmentAndTag with ${edgeTreatmentType}s`, () => { + it(`should add a ${edgeTreatmentType} to a specific segment`, async () => { + const code = `sketch001 = startSketchOn('XY') |> startProfileAt([-10, 10], %) |> line([20, 0], %) |> line([0, -20], %) @@ -286,9 +340,8 @@ describe('Testing applyFilletToSelection', () => { |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%) extrude001 = extrude(-15, sketch001)` - const segmentSnippets = ['line([0, -20], %)'] - const radiusValue = 3 - const expectedCode = `sketch001 = startSketchOn('XY') + const segmentSnippets = ['line([0, -20], %)'] + const expectedCode = `sketch001 = startSketchOn('XY') |> startProfileAt([-10, 10], %) |> line([20, 0], %) |> line([0, -20], %, $seg01) @@ -296,17 +349,44 @@ extrude001 = extrude(-15, sketch001)` |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%) extrude001 = extrude(-15, sketch001) - |> fillet({ radius: 3, tags: [seg01] }, %)` + |> ${edgeTreatmentType}({ ${parameterName} = 3, tags = [seg01] }, %)` - await runModifyAstCloneWithFilletAndTag( - code, - segmentSnippets, - radiusValue, - expectedCode - ) - }) - it('should add a fillet to an already tagged segment', async () => { - const code = `sketch001 = startSketchOn('XY') + await runModifyAstCloneWithEdgeTreatmentAndTag( + code, + segmentSnippets, + parameters, + expectedCode + ) + }) + it(`should add a ${edgeTreatmentType} to the sketch pipe`, async () => { + const code = `sketch001 = startSketchOn('XY') + |> startProfileAt([-10, 10], %) + |> line([20, 0], %) + |> line([0, -20], %) + |> line([-20, 0], %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) + |> extrude(-15, %)` + const segmentSnippets = ['line([0, -20], %)'] + const expectedCode = `sketch001 = startSketchOn('XY') + |> startProfileAt([-10, 10], %) + |> line([20, 0], %) + |> line([0, -20], %, $seg01) + |> line([-20, 0], %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) + |> extrude(-15, %) + |> ${edgeTreatmentType}({ ${parameterName} = 3, tags = [seg01] }, %)` + + await runModifyAstCloneWithEdgeTreatmentAndTag( + code, + segmentSnippets, + parameters, + expectedCode + ) + }) + it(`should add a ${edgeTreatmentType} to an already tagged segment`, async () => { + const code = `sketch001 = startSketchOn('XY') |> startProfileAt([-10, 10], %) |> line([20, 0], %) |> line([0, -20], %, $seg01) @@ -314,9 +394,8 @@ extrude001 = extrude(-15, sketch001) |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%) extrude001 = extrude(-15, sketch001)` - const segmentSnippets = ['line([0, -20], %, $seg01)'] - const radiusValue = 3 - const expectedCode = `sketch001 = startSketchOn('XY') + const segmentSnippets = ['line([0, -20], %, $seg01)'] + const expectedCode = `sketch001 = startSketchOn('XY') |> startProfileAt([-10, 10], %) |> line([20, 0], %) |> line([0, -20], %, $seg01) @@ -324,17 +403,17 @@ extrude001 = extrude(-15, sketch001)` |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%) extrude001 = extrude(-15, sketch001) - |> fillet({ radius: 3, tags: [seg01] }, %)` + |> ${edgeTreatmentType}({ ${parameterName} = 3, tags = [seg01] }, %)` - await runModifyAstCloneWithFilletAndTag( - code, - segmentSnippets, - radiusValue, - expectedCode - ) - }) - it('should add a fillet with existing tag on other segment', async () => { - const code = `sketch001 = startSketchOn('XY') + await runModifyAstCloneWithEdgeTreatmentAndTag( + code, + segmentSnippets, + parameters, + expectedCode + ) + }) + it(`should add a ${edgeTreatmentType} with existing tag on other segment`, async () => { + const code = `sketch001 = startSketchOn('XY') |> startProfileAt([-10, 10], %) |> line([20, 0], %, $seg01) |> line([0, -20], %) @@ -342,9 +421,8 @@ extrude001 = extrude(-15, sketch001) |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%) extrude001 = extrude(-15, sketch001)` - const segmentSnippets = ['line([-20, 0], %)'] - const radiusValue = 3 - const expectedCode = `sketch001 = startSketchOn('XY') + const segmentSnippets = ['line([-20, 0], %)'] + const expectedCode = `sketch001 = startSketchOn('XY') |> startProfileAt([-10, 10], %) |> line([20, 0], %, $seg01) |> line([0, -20], %) @@ -352,17 +430,17 @@ extrude001 = extrude(-15, sketch001)` |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%) extrude001 = extrude(-15, sketch001) - |> fillet({ radius: 3, tags: [seg02] }, %)` + |> ${edgeTreatmentType}({ ${parameterName} = 3, tags = [seg02] }, %)` - await runModifyAstCloneWithFilletAndTag( - code, - segmentSnippets, - radiusValue, - expectedCode - ) - }) - it('should add a fillet with existing fillet on other segment', async () => { - const code = `sketch001 = startSketchOn('XY') + await runModifyAstCloneWithEdgeTreatmentAndTag( + code, + segmentSnippets, + parameters, + expectedCode + ) + }) + it(`should add a ${edgeTreatmentType} with existing fillet on other segment`, async () => { + const code = `sketch001 = startSketchOn('XY') |> startProfileAt([-10, 10], %) |> line([20, 0], %, $seg01) |> line([0, -20], %) @@ -370,10 +448,9 @@ extrude001 = extrude(-15, sketch001) |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%) extrude001 = extrude(-15, sketch001) - |> fillet({ radius: 5, tags: [seg01] }, %)` - const segmentSnippets = ['line([-20, 0], %)'] - const radiusValue = 3 - const expectedCode = `sketch001 = startSketchOn('XY') + |> fillet({ radius = 5, tags = [seg01] }, %)` + const segmentSnippets = ['line([-20, 0], %)'] + const expectedCode = `sketch001 = startSketchOn('XY') |> startProfileAt([-10, 10], %) |> line([20, 0], %, $seg01) |> line([0, -20], %) @@ -381,18 +458,47 @@ extrude001 = extrude(-15, sketch001) |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%) extrude001 = extrude(-15, sketch001) - |> fillet({ radius: 5, tags: [seg01] }, %) - |> fillet({ radius: 3, tags: [seg02] }, %)` + |> fillet({ radius = 5, tags = [seg01] }, %) + |> ${edgeTreatmentType}({ ${parameterName} = 3, tags = [seg02] }, %)` - await runModifyAstCloneWithFilletAndTag( - code, - segmentSnippets, - radiusValue, - expectedCode - ) - }) - it('should add a fillet to two segments of a single extrusion', async () => { - const code = `sketch001 = startSketchOn('XY') + await runModifyAstCloneWithEdgeTreatmentAndTag( + code, + segmentSnippets, + parameters, + expectedCode + ) + }) + it(`should add a ${edgeTreatmentType} with existing chamfer on other segment`, async () => { + const code = `sketch001 = startSketchOn('XY') + |> startProfileAt([-10, 10], %) + |> line([20, 0], %, $seg01) + |> line([0, -20], %) + |> line([-20, 0], %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) +extrude001 = extrude(-15, sketch001) + |> chamfer({ length = 5, tags = [seg01] }, %)` + const segmentSnippets = ['line([-20, 0], %)'] + const expectedCode = `sketch001 = startSketchOn('XY') + |> startProfileAt([-10, 10], %) + |> line([20, 0], %, $seg01) + |> line([0, -20], %) + |> line([-20, 0], %, $seg02) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) +extrude001 = extrude(-15, sketch001) + |> chamfer({ length = 5, tags = [seg01] }, %) + |> ${edgeTreatmentType}({ ${parameterName} = 3, tags = [seg02] }, %)` + + await runModifyAstCloneWithEdgeTreatmentAndTag( + code, + segmentSnippets, + parameters, + expectedCode + ) + }) + it(`should add a ${edgeTreatmentType} to two segments of a single extrusion`, async () => { + const code = `sketch001 = startSketchOn('XY') |> startProfileAt([-10, 10], %) |> line([20, 0], %) |> line([0, -20], %) @@ -400,9 +506,8 @@ extrude001 = extrude(-15, sketch001) |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%) extrude001 = extrude(-15, sketch001)` - const segmentSnippets = ['line([20, 0], %)', 'line([-20, 0], %)'] - const radiusValue = 3 - const expectedCode = `sketch001 = startSketchOn('XY') + const segmentSnippets = ['line([20, 0], %)', 'line([-20, 0], %)'] + const expectedCode = `sketch001 = startSketchOn('XY') |> startProfileAt([-10, 10], %) |> line([20, 0], %, $seg01) |> line([0, -20], %) @@ -410,17 +515,17 @@ extrude001 = extrude(-15, sketch001)` |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%) extrude001 = extrude(-15, sketch001) - |> fillet({ radius: 3, tags: [seg01, seg02] }, %)` + |> ${edgeTreatmentType}({ ${parameterName} = 3, tags = [seg01, seg02] }, %)` - await runModifyAstCloneWithFilletAndTag( - code, - segmentSnippets, - radiusValue, - expectedCode - ) - }) - it('should add fillets to two bodies', async () => { - const code = `sketch001 = startSketchOn('XY') + await runModifyAstCloneWithEdgeTreatmentAndTag( + code, + segmentSnippets, + parameters, + expectedCode + ) + }) + it(`should add ${edgeTreatmentType}s to two bodies`, async () => { + const code = `sketch001 = startSketchOn('XY') |> startProfileAt([-10, 10], %) |> line([20, 0], %) |> line([0, -20], %) @@ -436,13 +541,12 @@ sketch002 = startSketchOn('XY') |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%) extrude002 = extrude(-25, sketch002)` // <--- body 2 - const segmentSnippets = [ - 'line([20, 0], %)', - 'line([-20, 0], %)', - 'line([0, -15], %)', - ] - const radiusValue = 3 - const expectedCode = `sketch001 = startSketchOn('XY') + const segmentSnippets = [ + 'line([20, 0], %)', + 'line([-20, 0], %)', + 'line([0, -15], %)', + ] + const expectedCode = `sketch001 = startSketchOn('XY') |> startProfileAt([-10, 10], %) |> line([20, 0], %, $seg01) |> line([0, -20], %) @@ -450,7 +554,7 @@ extrude002 = extrude(-25, sketch002)` // <--- body 2 |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%) extrude001 = extrude(-15, sketch001) - |> fillet({ radius: 3, tags: [seg01, seg02] }, %) + |> ${edgeTreatmentType}({ ${parameterName} = 3, tags = [seg01, seg02] }, %) sketch002 = startSketchOn('XY') |> startProfileAt([30, 10], %) |> line([15, 0], %) @@ -459,18 +563,20 @@ sketch002 = startSketchOn('XY') |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%) extrude002 = extrude(-25, sketch002) - |> fillet({ radius: 3, tags: [seg03] }, %)` // <-- able to add a new one + |> ${edgeTreatmentType}({ ${parameterName} = 3, tags = [seg03] }, %)` // <-- able to add a new one - await runModifyAstCloneWithFilletAndTag( - code, - segmentSnippets, - radiusValue, - expectedCode - ) - }) -}) + await runModifyAstCloneWithEdgeTreatmentAndTag( + code, + segmentSnippets, + parameters, + expectedCode + ) + }) + }) + } +) -describe('Testing isTagUsedInFillet', () => { +describe('Testing isTagUsedInEdgeTreatment', () => { const code = `sketch001 = startSketchOn('XZ') |> startProfileAt([7.72, 4.13], %) |> line([7.11, 3.48], %, $seg01) @@ -479,8 +585,8 @@ describe('Testing isTagUsedInFillet', () => { |> close(%) extrude001 = extrude(-5, sketch001) |> fillet({ - radius: 1.11, - tags: [ + radius = 1.11, + tags = [ getOppositeEdge(seg01), seg01, getPreviousAdjacentEdge(seg02) @@ -488,12 +594,12 @@ extrude001 = extrude(-5, sketch001) }, %) ` it('should correctly identify getOppositeEdge and baseEdge edges', () => { - const ast = parse(code) - if (err(ast)) return + const ast = assertParse(code) const lineOfInterest = `line([7.11, 3.48], %, $seg01)` - const range: [number, number] = [ + const range: [number, number, boolean] = [ code.indexOf(lineOfInterest), code.indexOf(lineOfInterest) + lineOfInterest.length, + true, ] const pathToNode = getNodePathFromSourceRange(ast, range) if (err(pathToNode)) return @@ -503,16 +609,16 @@ extrude001 = extrude(-5, sketch001) 'CallExpression' ) if (err(callExp)) return - const edges = isTagUsedInFillet({ ast, callExp: callExp.node }) + const edges = isTagUsedInEdgeTreatment({ ast, callExp: callExp.node }) expect(edges).toEqual(['getOppositeEdge', 'baseEdge']) }) it('should correctly identify getPreviousAdjacentEdge edges', () => { - const ast = parse(code) - if (err(ast)) return + const ast = assertParse(code) const lineOfInterest = `line([-6.37, 3.88], %, $seg02)` - const range: [number, number] = [ + const range: [number, number, boolean] = [ code.indexOf(lineOfInterest), code.indexOf(lineOfInterest) + lineOfInterest.length, + true, ] const pathToNode = getNodePathFromSourceRange(ast, range) if (err(pathToNode)) return @@ -522,16 +628,16 @@ extrude001 = extrude(-5, sketch001) 'CallExpression' ) if (err(callExp)) return - const edges = isTagUsedInFillet({ ast, callExp: callExp.node }) + const edges = isTagUsedInEdgeTreatment({ ast, callExp: callExp.node }) expect(edges).toEqual(['getPreviousAdjacentEdge']) }) it('should correctly identify no edges', () => { - const ast = parse(code) - if (err(ast)) return + const ast = assertParse(code) const lineOfInterest = `line([-3.29, -13.85], %)` - const range: [number, number] = [ + const range: [number, number, boolean] = [ code.indexOf(lineOfInterest), code.indexOf(lineOfInterest) + lineOfInterest.length, + true, ] const pathToNode = getNodePathFromSourceRange(ast, range) if (err(pathToNode)) return @@ -541,7 +647,7 @@ extrude001 = extrude(-5, sketch001) 'CallExpression' ) if (err(callExp)) return - const edges = isTagUsedInFillet({ ast, callExp: callExp.node }) + const edges = isTagUsedInEdgeTreatment({ ast, callExp: callExp.node }) expect(edges).toEqual([]) }) }) @@ -552,33 +658,27 @@ describe('Testing button states', () => { segmentSnippet: string, expectedState: boolean ) => { - // ast - const astOrError = parse(code) - if (err(astOrError)) { - return new Error('AST not found') - } - const ast = astOrError + const ast = assertParse(code) - // selectionRanges - const range: [number, number] = segmentSnippet + const range: [number, number, boolean] = segmentSnippet ? [ code.indexOf(segmentSnippet), code.indexOf(segmentSnippet) + segmentSnippet.length, + true, ] - : [ast.end, ast.end] // empty line in the end of the code + : [ast.end, ast.end, true] // empty line in the end of the code const selectionRanges: Selections = { - codeBasedSelections: [ + graphSelections: [ { - range, - type: 'default', + codeRef: codeRefFromRange(range, ast), }, ], otherSelections: [], } // state - const buttonState = hasValidFilletSelection({ + const buttonState = hasValidEdgeTreatmentSelection({ ast, selectionRanges, code, diff --git a/src/lang/modifyAst/addFillet.ts b/src/lang/modifyAst/addEdgeTreatment.ts similarity index 53% rename from src/lang/modifyAst/addFillet.ts rename to src/lang/modifyAst/addEdgeTreatment.ts index 47be3940b..baa0f702f 100644 --- a/src/lang/modifyAst/addFillet.ts +++ b/src/lang/modifyAst/addEdgeTreatment.ts @@ -29,40 +29,64 @@ import { sketchLineHelperMap, } from '../std/sketch' import { err, trap } from 'lib/trap' -import { Selections } from 'lib/selections' +import { Selection, Selections } from 'lib/selections' import { KclCommandValue } from 'lib/commandTypes' import { + Artifact, ArtifactGraph, getSweepFromSuspectedPath, } from 'lang/std/artifactGraph' -import { kclManager, engineCommandManager, editorManager } from 'lib/singletons' +import { + kclManager, + engineCommandManager, + editorManager, + codeManager, +} from 'lib/singletons' +import { Node } from 'wasm-lib/kcl/bindings/Node' -// Apply Fillet To Selection +// Edge Treatment Types +export enum EdgeTreatmentType { + Chamfer = 'chamfer', + Fillet = 'fillet', +} -export function applyFilletToSelection( - ast: Program, - selection: Selections, +export interface ChamferParameters { + type: EdgeTreatmentType.Chamfer + length: KclCommandValue +} +export interface FilletParameters { + type: EdgeTreatmentType.Fillet radius: KclCommandValue +} +export type EdgeTreatmentParameters = ChamferParameters | FilletParameters + +// Apply Edge Treatment (Fillet or Chamfer) To Selection +export function applyEdgeTreatmentToSelection( + ast: Node, + selection: Selections, + parameters: EdgeTreatmentParameters ): void | Error { - // 1. clone and modify with fillet and tag - const result = modifyAstCloneWithFilletAndTag(ast, selection, radius) + // 1. clone and modify with edge treatment and tag + const result = modifyAstWithEdgeTreatmentAndTag(ast, selection, parameters) if (err(result)) return result - const { modifiedAst, pathToFilletNode } = result + const { modifiedAst, pathToEdgeTreatmentNode } = result // 2. update ast // eslint-disable-next-line @typescript-eslint/no-floating-promises - updateAstAndFocus(modifiedAst, pathToFilletNode) + updateAstAndFocus(modifiedAst, pathToEdgeTreatmentNode) } -export function modifyAstCloneWithFilletAndTag( - ast: Program, - selection: Selections, - radius: KclCommandValue -): { modifiedAst: Program; pathToFilletNode: Array } | Error { +export function modifyAstWithEdgeTreatmentAndTag( + ast: Node, + selections: Selections, + parameters: EdgeTreatmentParameters +): + | { modifiedAst: Node; pathToEdgeTreatmentNode: Array } + | Error { let clonedAst = structuredClone(ast) const clonedAstForGetExtrude = structuredClone(ast) - const astResult = insertRadiusIntoAst(clonedAst, radius) + const astResult = insertParametersIntoAst(clonedAst, parameters) if (err(astResult)) return astResult const artifactGraph = engineCommandManager.artifactGraph @@ -70,20 +94,14 @@ export function modifyAstCloneWithFilletAndTag( // Step 1: modify ast with tags and group them by extrude nodes (bodies) const extrudeToTagsMap: Map< PathToNode, - Array<{ tag: string; selectionType: string }> + Array<{ tag: string; artifact: Artifact }> > = new Map() const lookupMap: Map = new Map() // work around for Map key comparison - for (const selectionRange of selection.codeBasedSelections) { - const singleSelection = { - codeBasedSelections: [selectionRange], - otherSelections: [], - } - const selectionType = singleSelection.codeBasedSelections[0].type - + for (const selection of selections.graphSelections) { const result = getPathToExtrudeForSegmentSelection( clonedAstForGetExtrude, - singleSelection, + selection, artifactGraph ) if (err(result)) return result @@ -95,36 +113,44 @@ export function modifyAstCloneWithFilletAndTag( ) if (err(tagResult)) return tagResult const { tag } = tagResult - const tagInfo = { tag, selectionType } // Group tags by their corresponding extrude node const extrudeKey = JSON.stringify(pathToExtrudeNode) - if (lookupMap.has(extrudeKey)) { + if (lookupMap.has(extrudeKey) && selection.artifact) { const existingPath = lookupMap.get(extrudeKey) if (!existingPath) return new Error('Path to extrude node not found.') - extrudeToTagsMap.get(existingPath)?.push(tagInfo) - } else { + extrudeToTagsMap + .get(existingPath) + ?.push({ tag, artifact: selection.artifact } as const) + } else if (selection.artifact) { lookupMap.set(extrudeKey, pathToExtrudeNode) - extrudeToTagsMap.set(pathToExtrudeNode, [tagInfo]) + extrudeToTagsMap.set(pathToExtrudeNode, [ + { tag, artifact: selection.artifact } as const, + ]) } } - // Step 2: Apply fillet(s) for each extrude node (body) - let pathToFilletNodes: Array = [] + // Step 2: Apply edge treatments for each extrude node (body) + let pathToEdgeTreatmentNodes: Array = [] for (const [pathToExtrudeNode, tagInfos] of extrudeToTagsMap.entries()) { - // Create a fillet expression with multiple tags - const radiusValue = - 'variableName' in radius ? radius.variableIdentifierAst : radius.valueAst + // Create an edge treatment expression with multiple tags - const tagCalls = tagInfos.map(({ tag, selectionType }) => { - return getEdgeTagCall(tag, selectionType) + // edge treatment parameter + const parameterResult = getParameterNameAndValue(parameters) + if (err(parameterResult)) return parameterResult + const { parameterName, parameterValue } = parameterResult + + // tag calls + const tagCalls = tagInfos.map(({ tag, artifact }) => { + return getEdgeTagCall(tag, artifact) }) const firstTag = tagCalls[0] // can be Identifier or CallExpression (for opposite and adjacent edges) - const filletCall = createCallExpressionStdLib('fillet', [ + // edge treatment call + const edgeTreatmentCall = createCallExpressionStdLib(parameters.type, [ createObjectExpression({ - radius: radiusValue, + [parameterName]: parameterValue, tags: createArrayExpression(tagCalls), }), createPipeSubstitution(), @@ -138,72 +164,89 @@ export function modifyAstCloneWithFilletAndTag( if (err(locatedExtrudeDeclarator)) return locatedExtrudeDeclarator const { extrudeDeclarator } = locatedExtrudeDeclarator - // Modify the extrude expression to include this fillet expression - // CallExpression - no fillet - // PipeExpression - fillet exists + // Modify the extrude expression to include this edge treatment expression + // CallExpression - no edge treatment + // PipeExpression - edge treatment exists or body in sketch pipe - let pathToFilletNode: PathToNode = [] + let pathToEdgeTreatmentNode: PathToNode if (extrudeDeclarator.init.type === 'CallExpression') { - // 1. case when no fillet exists + // 1. case when no edge treatment exists - // modify ast with new fillet call by mutating the extrude node + // modify ast with new edge treatment call by mutating the extrude node extrudeDeclarator.init = createPipeExpression([ extrudeDeclarator.init, - filletCall, + edgeTreatmentCall, ]) - // get path to the fillet node - pathToFilletNode = getPathToNodeOfFilletLiteral( + // get path to the edge treatment node + pathToEdgeTreatmentNode = getPathToNodeOfEdgeTreatmentLiteral( pathToExtrudeNode, extrudeDeclarator, - firstTag + firstTag, + parameters ) - pathToFilletNodes.push(pathToFilletNode) + pathToEdgeTreatmentNodes.push(pathToEdgeTreatmentNode) } else if (extrudeDeclarator.init.type === 'PipeExpression') { - // 2. case when fillet exists + // 2. case when edge treatment exists or extrude in sketch pipe - const existingFilletCall = extrudeDeclarator.init.body.find((node) => { - return node.type === 'CallExpression' && node.callee.name === 'fillet' - }) + // mutate the extrude node with the new edge treatment call + extrudeDeclarator.init.body.push(edgeTreatmentCall) - if (!existingFilletCall || existingFilletCall.type !== 'CallExpression') { - return new Error('Fillet CallExpression not found.') - } - - // mutate the extrude node with the new fillet call - extrudeDeclarator.init.body.push(filletCall) - - // get path to the fillet node - pathToFilletNode = getPathToNodeOfFilletLiteral( + // get path to the edge treatment node + pathToEdgeTreatmentNode = getPathToNodeOfEdgeTreatmentLiteral( pathToExtrudeNode, extrudeDeclarator, - firstTag + firstTag, + parameters ) - pathToFilletNodes.push(pathToFilletNode) + pathToEdgeTreatmentNodes.push(pathToEdgeTreatmentNode) } else { return new Error('Unsupported extrude type.') } } - return { modifiedAst: clonedAst, pathToFilletNode: pathToFilletNodes } + return { + modifiedAst: clonedAst, + pathToEdgeTreatmentNode: pathToEdgeTreatmentNodes, + } } -function insertRadiusIntoAst( +function insertParametersIntoAst( ast: Program, - radius: KclCommandValue + parameters: EdgeTreatmentParameters ): { ast: Program } | Error { try { - // Validate and update AST + const newAst = structuredClone(ast) + + // handle radius parameter if ( - 'variableName' in radius && - radius.variableName && - radius.insertIndex !== undefined + parameters.type === EdgeTreatmentType.Fillet && + 'variableName' in parameters.radius && + parameters.radius.variableName && + parameters.radius.insertIndex !== undefined ) { - const newAst = structuredClone(ast) - newAst.body.splice(radius.insertIndex, 0, radius.variableDeclarationAst) - return { ast: newAst } + newAst.body.splice( + parameters.radius.insertIndex, + 0, + parameters.radius.variableDeclarationAst + ) } - return { ast } + // handle length parameter + if ( + parameters.type === EdgeTreatmentType.Chamfer && + 'variableName' in parameters.length && + parameters.length.variableName && + parameters.length.insertIndex !== undefined + ) { + newAst.body.splice( + parameters.length.insertIndex, + 0, + parameters.length.variableDeclarationAst + ) + } + + // handle upcoming parameters here (for blend, bevel, etc.) + return { ast: newAst } } catch (error) { return new Error(`Failed to handle AST: ${(error as Error).message}`) } @@ -211,12 +254,12 @@ function insertRadiusIntoAst( export function getPathToExtrudeForSegmentSelection( ast: Program, - selection: Selections, + selection: Selection, artifactGraph: ArtifactGraph ): { pathToSegmentNode: PathToNode; pathToExtrudeNode: PathToNode } | Error { const pathToSegmentNode = getNodePathFromSourceRange( ast, - selection.codeBasedSelections[0].range + selection.codeRef?.range ) const varDecNode = getNodeFromPath( @@ -225,7 +268,7 @@ export function getPathToExtrudeForSegmentSelection( 'VariableDeclaration' ) if (err(varDecNode)) return varDecNode - const sketchVar = varDecNode.node.declarations[0].id.name + const sketchVar = varDecNode.node.declaration.id.name const sketch = sketchFromKclValue( kclManager.programMemory.get(sketchVar), @@ -246,19 +289,22 @@ export function getPathToExtrudeForSegmentSelection( } async function updateAstAndFocus( - modifiedAst: Program, - pathToFilletNode: Array + modifiedAst: Node, + pathToEdgeTreatmentNode: Array ) { const updatedAst = await kclManager.updateAst(modifiedAst, true, { - focusPath: pathToFilletNode, + focusPath: pathToEdgeTreatmentNode, }) + + await codeManager.updateEditorWithAstAndWriteToFile(updatedAst.newAst) + if (updatedAst?.selections) { editorManager.selectRange(updatedAst?.selections) } } -function mutateAstWithTagForSketchSegment( - astClone: Program, +export function mutateAstWithTagForSketchSegment( + astClone: Node, pathToSegmentNode: PathToNode ): { modifiedAst: Program; tag: string } | Error { const segmentNode = getNodeFromPath( @@ -289,16 +335,16 @@ function mutateAstWithTagForSketchSegment( return { modifiedAst: astClone, tag } } -function getEdgeTagCall( +export function getEdgeTagCall( tag: string, - selectionType: string -): Identifier | CallExpression { + artifact: Artifact +): Node { let tagCall: Expr = createIdentifier(tag) // Modify the tag based on selectionType - if (selectionType === 'edge') { + if (artifact.type === 'sweepEdge' && artifact.subType === 'opposite') { tagCall = createCallExpressionStdLib('getOppositeEdge', [tagCall]) - } else if (selectionType === 'adjacent-edge') { + } else if (artifact.type === 'sweepEdge' && artifact.subType === 'adjacent') { tagCall = createCallExpressionStdLib('getNextAdjacentEdge', [tagCall]) } return tagCall @@ -308,15 +354,15 @@ function locateExtrudeDeclarator( node: Program, pathToExtrudeNode: PathToNode ): { extrudeDeclarator: VariableDeclarator } | Error { - const extrudeChunk = getNodeFromPath( + const nodeOfExtrudeCall = getNodeFromPath( node, pathToExtrudeNode, 'VariableDeclaration' ) - if (err(extrudeChunk)) return extrudeChunk + if (err(nodeOfExtrudeCall)) return nodeOfExtrudeCall - const { node: extrudeVarDecl } = extrudeChunk - const extrudeDeclarator = extrudeVarDecl.declarations[0] + const { node: extrudeVarDecl } = nodeOfExtrudeCall + const extrudeDeclarator = extrudeVarDecl.declaration if (!extrudeDeclarator) { return new Error('Extrude Declarator not found.') } @@ -336,27 +382,38 @@ function locateExtrudeDeclarator( return { extrudeDeclarator } } -function getPathToNodeOfFilletLiteral( +function getPathToNodeOfEdgeTreatmentLiteral( pathToExtrudeNode: PathToNode, extrudeDeclarator: VariableDeclarator, - tag: Identifier | CallExpression + tag: Identifier | CallExpression, + parameters: EdgeTreatmentParameters ): PathToNode { - let pathToFilletObj: PathToNode = [] - let inFillet = false + let pathToEdgeTreatmentObj: PathToNode = [] + let inEdgeTreatment = false traverse(extrudeDeclarator.init, { enter(node, path) { - if (node.type === 'CallExpression' && node.callee.name === 'fillet') { - inFillet = true + if ( + node.type === 'CallExpression' && + node.callee.name === parameters.type + ) { + inEdgeTreatment = true } - if (inFillet && node.type === 'ObjectExpression') { + if (inEdgeTreatment && node.type === 'ObjectExpression') { if (!hasTag(node, tag)) return false - pathToFilletObj = getPathToRadiusLiteral(node, path) + pathToEdgeTreatmentObj = getPathToEdgeTreatmentParameterLiteral( + node, + path, + parameters + ) } }, leave(node) { - if (node.type === 'CallExpression' && node.callee.name === 'fillet') { - inFillet = false + if ( + node.type === 'CallExpression' && + node.callee.name === parameters.type + ) { + inEdgeTreatment = false } }, }) @@ -371,7 +428,7 @@ function getPathToNodeOfFilletLiteral( return [ ...pathToExtrudeNode.slice(0, indexOfPipeExpression), - ...pathToFilletObj, + ...pathToEdgeTreatmentObj, ] } @@ -404,36 +461,78 @@ function hasTag( }) } -function getPathToRadiusLiteral(node: ObjectExpression, path: any): PathToNode { - let pathToFilletObj = path +function getPathToEdgeTreatmentParameterLiteral( + node: ObjectExpression, + path: any, + parameters: EdgeTreatmentParameters +): PathToNode { + let pathToEdgeTreatmentObj = path + const parameterResult = getParameterNameAndValue(parameters) + if (err(parameterResult)) return pathToEdgeTreatmentObj + const { parameterName } = parameterResult + node.properties.forEach((prop, index) => { - if (prop.key.name === 'radius') { - pathToFilletObj.push( + if (prop.key.name === parameterName) { + pathToEdgeTreatmentObj.push( ['properties', 'ObjectExpression'], [index, 'index'], ['value', 'Property'] ) } }) - return pathToFilletObj + return pathToEdgeTreatmentObj +} + +function getParameterNameAndValue( + parameters: EdgeTreatmentParameters +): { parameterName: string; parameterValue: Expr } | Error { + if (parameters.type === EdgeTreatmentType.Fillet) { + const parameterValue = + 'variableName' in parameters.radius + ? parameters.radius.variableIdentifierAst + : parameters.radius.valueAst + return { parameterName: 'radius', parameterValue } + } else if (parameters.type === EdgeTreatmentType.Chamfer) { + const parameterValue = + 'variableName' in parameters.length + ? parameters.length.variableIdentifierAst + : parameters.length.valueAst + return { parameterName: 'length', parameterValue } + } else { + return new Error('Unsupported edge treatment type}') + } +} + +// Type Guards +function isEdgeTreatmentType(name: string): name is EdgeTreatmentType { + return name === EdgeTreatmentType.Chamfer || name === EdgeTreatmentType.Fillet +} +function isEdgeType(name: string): name is EdgeTypes { + return ( + name === 'getNextAdjacentEdge' || + name === 'getPreviousAdjacentEdge' || + name === 'getOppositeEdge' + ) } // Button states - -export const hasValidFilletSelection = ({ +export const hasValidEdgeTreatmentSelection = ({ selectionRanges, ast, code, }: { selectionRanges: Selections - ast: Program + ast: Node code: string }) => { - // check if there is anything filletable in the scene + // check if there is anything valid for the edge treatment in the scene let extrudeExists = false traverse(ast, { enter(node) { - if (node.type === 'CallExpression' && node.callee.name === 'extrude') { + if ( + node.type === 'CallExpression' && + (node.callee.name === 'extrude' || node.callee.name === 'revolve') + ) { extrudeExists = true } }, @@ -441,22 +540,21 @@ export const hasValidFilletSelection = ({ if (!extrudeExists) return false // check if nothing is selected - if (selectionRanges.codeBasedSelections.length === 0) { + if (selectionRanges.graphSelections.length === 0) { return true } // check if selection is last string in code - if (selectionRanges.codeBasedSelections[0].range[0] === code.length) { + if (selectionRanges.graphSelections[0]?.codeRef?.range[0] === code.length) { return true } // selection exists: - for (const selection of selectionRanges.codeBasedSelections) { + for (const selection of selectionRanges.graphSelections) { // check if all selections are in sketchLineHelperMap - const path = getNodePathFromSourceRange(ast, selection.range) - const segmentNode = getNodeFromPath( + const segmentNode = getNodeFromPath>( ast, - path, + selection.codeRef.pathToNode, 'CallExpression' ) if (err(segmentNode)) return false @@ -491,32 +589,39 @@ export const hasValidFilletSelection = ({ }, }) - // check if tag is used in fillet - if (tagExists) { + // check if tag is used in edge treatment + if (tagExists && selection.artifact) { // create tag call - let tagCall: Expr = getEdgeTagCall(tag, selection.type) + let tagCall: Expr = getEdgeTagCall(tag, selection.artifact) + + // check if tag is used in edge treatment + let inEdgeTreatment = false + let tagUsedInEdgeTreatment = false - // check if tag is used in fillet - let inFillet = false - let tagUsedInFillet = false traverse(ast, { enter(node) { - if (node.type === 'CallExpression' && node.callee.name === 'fillet') { - inFillet = true + if ( + node.type === 'CallExpression' && + isEdgeTreatmentType(node.callee.name) + ) { + inEdgeTreatment = true } - if (inFillet && node.type === 'ObjectExpression') { + if (inEdgeTreatment && node.type === 'ObjectExpression') { if (hasTag(node, tagCall)) { - tagUsedInFillet = true + tagUsedInEdgeTreatment = true } } }, leave(node) { - if (node.type === 'CallExpression' && node.callee.name === 'fillet') { - inFillet = false + if ( + node.type === 'CallExpression' && + isEdgeTreatmentType(node.callee.name) + ) { + inEdgeTreatment = false } }, }) - if (tagUsedInFillet) { + if (tagUsedInEdgeTreatment) { return false } } @@ -530,26 +635,31 @@ type EdgeTypes = | 'getPreviousAdjacentEdge' | 'getOppositeEdge' -export const isTagUsedInFillet = ({ +export const isTagUsedInEdgeTreatment = ({ ast, callExp, }: { - ast: Program + ast: Node callExp: CallExpression }): Array => { const tag = getTagFromCallExpression(callExp) if (err(tag)) return [] - let inFillet = false + let inEdgeTreatment = false let inObj = false let inTagHelper: EdgeTypes | '' = '' const edges: Array = [] + traverse(ast, { enter: (node) => { - if (node.type === 'CallExpression' && node.callee.name === 'fillet') { - inFillet = true + // Check if we are entering an edge treatment call + if ( + node.type === 'CallExpression' && + isEdgeTreatmentType(node.callee.name) + ) { + inEdgeTreatment = true } - if (inFillet && node.type === 'ObjectExpression') { + if (inEdgeTreatment && node.type === 'ObjectExpression') { node.properties.forEach((prop) => { if ( prop.key.name === 'tags' && @@ -561,17 +671,15 @@ export const isTagUsedInFillet = ({ } if ( inObj && - inFillet && + inEdgeTreatment && node.type === 'CallExpression' && - (node.callee.name === 'getOppositeEdge' || - node.callee.name === 'getNextAdjacentEdge' || - node.callee.name === 'getPreviousAdjacentEdge') + isEdgeType(node.callee.name) ) { inTagHelper = node.callee.name } if ( inObj && - inFillet && + inEdgeTreatment && !inTagHelper && node.type === 'Identifier' && node.name === tag @@ -580,7 +688,7 @@ export const isTagUsedInFillet = ({ } if ( inObj && - inFillet && + inEdgeTreatment && inTagHelper && node.type === 'Identifier' && node.name === tag @@ -589,10 +697,13 @@ export const isTagUsedInFillet = ({ } }, leave: (node) => { - if (node.type === 'CallExpression' && node.callee.name === 'fillet') { - inFillet = false + if ( + node.type === 'CallExpression' && + isEdgeTreatmentType(node.callee.name) + ) { + inEdgeTreatment = false } - if (inFillet && node.type === 'ObjectExpression') { + if (inEdgeTreatment && node.type === 'ObjectExpression') { node.properties.forEach((prop) => { if ( prop.key.name === 'tags' && @@ -604,11 +715,9 @@ export const isTagUsedInFillet = ({ } if ( inObj && - inFillet && + inEdgeTreatment && node.type === 'CallExpression' && - (node.callee.name === 'getOppositeEdge' || - node.callee.name === 'getNextAdjacentEdge' || - node.callee.name === 'getPreviousAdjacentEdge') + isEdgeType(node.callee.name) ) { inTagHelper = '' } diff --git a/src/lang/modifyAst/addRevolve.ts b/src/lang/modifyAst/addRevolve.ts new file mode 100644 index 000000000..d9af1917a --- /dev/null +++ b/src/lang/modifyAst/addRevolve.ts @@ -0,0 +1,154 @@ +import { err } from 'lib/trap' +import { KCL_DEFAULT_CONSTANT_PREFIXES } from 'lib/constants' +import { + Program, + PathToNode, + Expr, + CallExpression, + PipeExpression, + VariableDeclarator, +} from 'lang/wasm' +import { Selections } from 'lib/selections' +import { Node } from 'wasm-lib/kcl/bindings/Node' +import { + createLiteral, + createCallExpressionStdLib, + createObjectExpression, + createIdentifier, + createPipeExpression, + findUniqueName, + createVariableDeclaration, +} from 'lang/modifyAst' +import { getNodeFromPath, getNodePathFromSourceRange } from 'lang/queryAst' +import { + mutateAstWithTagForSketchSegment, + getEdgeTagCall, +} from 'lang/modifyAst/addEdgeTreatment' +export function revolveSketch( + ast: Node, + pathToSketchNode: PathToNode, + shouldPipe = false, + angle: Expr = createLiteral(4), + axis: Selections +): + | { + modifiedAst: Node + pathToSketchNode: PathToNode + pathToRevolveArg: PathToNode + } + | Error { + const clonedAst = structuredClone(ast) + const sketchNode = getNodeFromPath(clonedAst, pathToSketchNode) + if (err(sketchNode)) return sketchNode + + // testing code + const pathToAxisSelection = getNodePathFromSourceRange( + clonedAst, + axis.graphSelections[0]?.codeRef.range + ) + + const lineNode = getNodeFromPath( + clonedAst, + pathToAxisSelection, + 'CallExpression' + ) + if (err(lineNode)) return lineNode + + // TODO Kevin: What if |> close(%)? + // TODO Kevin: What if opposite edge + // TODO Kevin: What if the edge isn't planar to the sketch? + // TODO Kevin: add a tag. + const tagResult = mutateAstWithTagForSketchSegment( + clonedAst, + pathToAxisSelection + ) + + // Have the tag whether it is already created or a new one is generated + if (err(tagResult)) return tagResult + const { tag } = tagResult + + /* Original Code */ + const { node: sketchExpression } = sketchNode + + // determine if sketchExpression is in a pipeExpression or not + const sketchPipeExpressionNode = getNodeFromPath( + clonedAst, + pathToSketchNode, + 'PipeExpression' + ) + if (err(sketchPipeExpressionNode)) return sketchPipeExpressionNode + const { node: sketchPipeExpression } = sketchPipeExpressionNode + const isInPipeExpression = sketchPipeExpression.type === 'PipeExpression' + + const sketchVariableDeclaratorNode = getNodeFromPath( + clonedAst, + pathToSketchNode, + 'VariableDeclarator' + ) + if (err(sketchVariableDeclaratorNode)) return sketchVariableDeclaratorNode + const { + node: sketchVariableDeclarator, + shallowPath: sketchPathToDecleration, + } = sketchVariableDeclaratorNode + + const axisSelection = axis?.graphSelections[0]?.artifact + + if (!axisSelection) return new Error('Axis selection is missing.') + + const revolveCall = createCallExpressionStdLib('revolve', [ + createObjectExpression({ + angle: angle, + axis: getEdgeTagCall(tag, axisSelection), + }), + createIdentifier(sketchVariableDeclarator.id.name), + ]) + + if (shouldPipe) { + const pipeChain = createPipeExpression( + isInPipeExpression + ? [...sketchPipeExpression.body, revolveCall] + : [sketchExpression as any, revolveCall] + ) + + sketchVariableDeclarator.init = pipeChain + const pathToRevolveArg: PathToNode = [ + ...sketchPathToDecleration, + ['init', 'VariableDeclarator'], + ['body', ''], + [pipeChain.body.length - 1, 'index'], + ['arguments', 'CallExpression'], + [0, 'index'], + ] + + return { + modifiedAst: clonedAst, + pathToSketchNode, + pathToRevolveArg, + } + } + + // We're not creating a pipe expression, + // but rather a separate constant for the extrusion + const name = findUniqueName(clonedAst, KCL_DEFAULT_CONSTANT_PREFIXES.REVOLVE) + const VariableDeclaration = createVariableDeclaration(name, revolveCall) + const sketchIndexInPathToNode = + sketchPathToDecleration.findIndex((a) => a[0] === 'body') + 1 + const sketchIndexInBody = sketchPathToDecleration[sketchIndexInPathToNode][0] + if (typeof sketchIndexInBody !== 'number') + return new Error('expected sketchIndexInBody to be a number') + clonedAst.body.splice(sketchIndexInBody + 1, 0, VariableDeclaration) + + const pathToRevolveArg: PathToNode = [ + ['body', ''], + [sketchIndexInBody + 1, 'index'], + ['declaration', 'VariableDeclaration'], + ['init', 'VariableDeclarator'], + ['arguments', 'CallExpression'], + [0, 'index'], + ] + return { + modifiedAst: clonedAst, + pathToSketchNode: [...pathToSketchNode.slice(0, -1), [-1, 'index']], + pathToRevolveArg, + } +} diff --git a/src/lang/modifyAst/addShell.ts b/src/lang/modifyAst/addShell.ts new file mode 100644 index 000000000..229d2ea71 --- /dev/null +++ b/src/lang/modifyAst/addShell.ts @@ -0,0 +1,123 @@ +import { ArtifactGraph } from 'lang/std/artifactGraph' +import { Selections } from 'lib/selections' +import { Expr } from 'wasm-lib/kcl/bindings/Expr' +import { Program } from 'wasm-lib/kcl/bindings/Program' +import { Node } from 'wasm-lib/kcl/bindings/Node' +import { PathToNode, VariableDeclarator } from 'lang/wasm' +import { + getPathToExtrudeForSegmentSelection, + mutateAstWithTagForSketchSegment, +} from './addEdgeTreatment' +import { getNodeFromPath } from 'lang/queryAst' +import { err } from 'lib/trap' +import { + createLiteral, + createIdentifier, + findUniqueName, + createCallExpressionStdLib, + createObjectExpression, + createArrayExpression, + createVariableDeclaration, +} from 'lang/modifyAst' +import { KCL_DEFAULT_CONSTANT_PREFIXES } from 'lib/constants' + +export function addShell({ + node, + selection, + artifactGraph, + thickness, +}: { + node: Node + selection: Selections + artifactGraph: ArtifactGraph + thickness: Expr +}): Error | { modifiedAst: Node; pathToNode: PathToNode } { + const modifiedAst = structuredClone(node) + + // Look up the corresponding extrude + const clonedAstForGetExtrude = structuredClone(modifiedAst) + + const expressions: Expr[] = [] + let pathToExtrudeNode: PathToNode | undefined = undefined + for (const graphSelection of selection.graphSelections) { + const extrudeLookupResult = getPathToExtrudeForSegmentSelection( + clonedAstForGetExtrude, + graphSelection, + artifactGraph + ) + if (err(extrudeLookupResult)) { + return new Error("Couldn't find extrude") + } + + pathToExtrudeNode = extrudeLookupResult.pathToExtrudeNode + // Get the sketch ref from the selection + // TODO: this assumes the segment is piped directly from the sketch, with no intermediate `VariableDeclarator` between. + // We must find a technique for these situations that is robust to intermediate declarations + const sketchNode = getNodeFromPath( + modifiedAst, + graphSelection.codeRef.pathToNode, + 'VariableDeclarator' + ) + if (err(sketchNode)) { + return sketchNode + } + + const selectedArtifact = graphSelection.artifact + if (!selectedArtifact) { + return new Error('Bad artifact') + } + + // Check on the selection, and handle the wall vs cap casees + let expr: Expr + if (selectedArtifact.type === 'cap') { + expr = createLiteral(selectedArtifact.subType) + } else if (selectedArtifact.type === 'wall') { + const tagResult = mutateAstWithTagForSketchSegment( + modifiedAst, + extrudeLookupResult.pathToSegmentNode + ) + if (err(tagResult)) return tagResult + const { tag } = tagResult + expr = createIdentifier(tag) + } else { + continue + } + expressions.push(expr) + } + + if (!pathToExtrudeNode) return new Error('No extrude found') + + const extrudeNode = getNodeFromPath( + modifiedAst, + pathToExtrudeNode, + 'VariableDeclarator' + ) + if (err(extrudeNode)) { + return extrudeNode + } + + const name = findUniqueName(node, KCL_DEFAULT_CONSTANT_PREFIXES.SHELL) + const shell = createCallExpressionStdLib('shell', [ + createObjectExpression({ + faces: createArrayExpression(expressions), + thickness, + }), + createIdentifier(extrudeNode.node.id.name), + ]) + const declaration = createVariableDeclaration(name, shell) + + // TODO: check if we should append at the end like here or right after the extrude + modifiedAst.body.push(declaration) + const pathToNode: PathToNode = [ + ['body', ''], + [modifiedAst.body.length - 1, 'index'], + ['declaration', 'VariableDeclaration'], + ['init', 'VariableDeclarator'], + ['arguments', 'CallExpression'], + [0, 'index'], + ] + return { + modifiedAst, + pathToNode, + } +} diff --git a/src/lang/queryAst.test.ts b/src/lang/queryAst.test.ts index f5ca44ab1..d250c5f07 100644 --- a/src/lang/queryAst.test.ts +++ b/src/lang/queryAst.test.ts @@ -1,15 +1,22 @@ -import { parse, recast, initPromise, PathToNode } from './wasm' +import { + assertParse, + recast, + initPromise, + PathToNode, + Identifier, +} from './wasm' import { findAllPreviousVariables, isNodeSafeToReplace, isTypeInValue, getNodePathFromSourceRange, - doesPipeHaveCallExp, hasExtrudeSketch, findUsesOfTagInPipe, hasSketchPipeBeenExtruded, doesSceneHaveSweepableSketch, traverse, + getNodeFromPath, + doesSceneHaveExtrudedSketch, } from './queryAst' import { enginelessExecutor } from '../lib/testHelpers' import { @@ -19,6 +26,7 @@ import { createPipeSubstitution, } from './modifyAst' import { err } from 'lib/trap' +import { codeRefFromRange } from './std/artifactGraph' beforeAll(async () => { await initPromise @@ -43,14 +51,13 @@ part001 = startSketchOn('XY') variableBelowShouldNotBeIncluded = 3 ` const rangeStart = code.indexOf('// selection-range-7ish-before-this') - 7 - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) const execState = await enginelessExecutor(ast) const { variables, bodyPath, insertIndex } = findAllPreviousVariables( ast, execState.memory, - [rangeStart, rangeStart] + [rangeStart, rangeStart, true] ) expect(variables).toEqual([ { key: 'baseThick', value: 1 }, @@ -78,10 +85,9 @@ describe('testing argIsNotIdentifier', () => { yo = 5 + 6 yo2 = hmm([identifierGuy + 5])` it('find a safe binaryExpression', () => { - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) const rangeStart = code.indexOf('100 + 100') + 2 - const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart]) + const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart, true]) if (err(result)) throw result expect(result.isSafe).toBe(true) expect(result.value?.type).toBe('BinaryExpression') @@ -92,20 +98,18 @@ yo2 = hmm([identifierGuy + 5])` expect(outCode).toContain(`angledLine([replaceName, 3.09], %)`) }) it('find a safe Identifier', () => { - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) const rangeStart = code.indexOf('abc') - const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart]) + const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart, true]) if (err(result)) throw result expect(result.isSafe).toBe(true) expect(result.value?.type).toBe('Identifier') expect(code.slice(result.value.start, result.value.end)).toBe('abc') }) it('find a safe CallExpression', () => { - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) const rangeStart = code.indexOf('def') - const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart]) + const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart, true]) if (err(result)) throw result expect(result.isSafe).toBe(true) expect(result.value?.type).toBe('CallExpression') @@ -116,10 +120,9 @@ yo2 = hmm([identifierGuy + 5])` expect(outCode).toContain(`angledLine([replaceName, 3.09], %)`) }) it('find an UNsafe CallExpression, as it has a PipeSubstitution', () => { - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) const rangeStart = code.indexOf('ghi') - const range: [number, number] = [rangeStart, rangeStart] + const range: [number, number, boolean] = [rangeStart, rangeStart, true] const result = isNodeSafeToReplace(ast, range) if (err(result)) throw result expect(result.isSafe).toBe(false) @@ -127,10 +130,9 @@ yo2 = hmm([identifierGuy + 5])` expect(code.slice(result.value.start, result.value.end)).toBe('ghi(%)') }) it('find an UNsafe Identifier, as it is a callee', () => { - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) const rangeStart = code.indexOf('ine([2.8,') - const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart]) + const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart, true]) if (err(result)) throw result expect(result.isSafe).toBe(false) expect(result.value?.type).toBe('CallExpression') @@ -139,10 +141,9 @@ yo2 = hmm([identifierGuy + 5])` ) }) it("find a safe BinaryExpression that's assigned to a variable", () => { - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) const rangeStart = code.indexOf('5 + 6') + 1 - const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart]) + const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart, true]) if (err(result)) throw result expect(result.isSafe).toBe(true) expect(result.value?.type).toBe('BinaryExpression') @@ -153,10 +154,9 @@ yo2 = hmm([identifierGuy + 5])` expect(outCode).toContain(`yo = replaceName`) }) it('find a safe BinaryExpression that has a CallExpression within', () => { - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) const rangeStart = code.indexOf('jkl') + 1 - const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart]) + const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart, true]) if (err(result)) throw result expect(result.isSafe).toBe(true) expect(result.value?.type).toBe('BinaryExpression') @@ -170,11 +170,10 @@ yo2 = hmm([identifierGuy + 5])` expect(outCode).toContain(`angledLine([replaceName, 3.09], %)`) }) it('find a safe BinaryExpression within a CallExpression', () => { - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) const rangeStart = code.indexOf('identifierGuy') + 1 - const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart]) + const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart, true]) if (err(result)) throw result expect(result.isSafe).toBe(true) @@ -221,15 +220,17 @@ describe('testing getNodePathFromSourceRange', () => { it('finds the second line when cursor is put at the end', () => { const searchLn = `line([0.94, 2.61], %)` const sourceIndex = code.indexOf(searchLn) + searchLn.length - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) - const result = getNodePathFromSourceRange(ast, [sourceIndex, sourceIndex]) + const result = getNodePathFromSourceRange(ast, [ + sourceIndex, + sourceIndex, + true, + ]) expect(result).toEqual([ ['body', ''], [0, 'index'], - ['declarations', 'VariableDeclaration'], - [0, 'index'], + ['declaration', 'VariableDeclaration'], ['init', ''], ['body', 'PipeExpression'], [2, 'index'], @@ -238,15 +239,17 @@ describe('testing getNodePathFromSourceRange', () => { it('finds the last line when cursor is put at the end', () => { const searchLn = `line([-0.21, -1.4], %)` const sourceIndex = code.indexOf(searchLn) + searchLn.length - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) - const result = getNodePathFromSourceRange(ast, [sourceIndex, sourceIndex]) + const result = getNodePathFromSourceRange(ast, [ + sourceIndex, + sourceIndex, + true, + ]) const expected = [ ['body', ''], [0, 'index'], - ['declarations', 'VariableDeclaration'], - [0, 'index'], + ['declaration', 'VariableDeclaration'], ['init', ''], ['body', 'PipeExpression'], [3, 'index'], @@ -257,86 +260,104 @@ describe('testing getNodePathFromSourceRange', () => { const startResult = getNodePathFromSourceRange(ast, [ startSourceIndex, startSourceIndex, + true, ]) expect(startResult).toEqual([...expected, ['callee', 'CallExpression']]) // expect similar result when whole line is selected const selectWholeThing = getNodePathFromSourceRange(ast, [ startSourceIndex, sourceIndex, + true, ]) expect(selectWholeThing).toEqual(expected) }) -}) -describe('testing doesPipeHave', () => { - it('finds close', () => { - const exampleCode = `length001 = 2 -part001 = startSketchAt([-1.41, 3.46]) - |> line([19.49, 1.16], %, $seg01) - |> angledLine([-35, length001], %) - |> line([-3.22, -7.36], %) - |> angledLine([-175, segLen(seg01)], %) - |> close(%) -` - const ast = parse(exampleCode) - if (err(ast)) throw ast + it('finds the node in if-else condition', () => { + const code = `y = 0 + x = if x > y { + x + 1 + } else { + y + }` + const searchLn = `x > y` + const sourceIndex = code.indexOf(searchLn) + const ast = assertParse(code) - const result = doesPipeHaveCallExp({ - calleeName: 'close', - ast, - selection: { type: 'default', range: [100, 101] }, - }) - expect(result).toEqual(true) + const result = getNodePathFromSourceRange(ast, [ + sourceIndex, + sourceIndex, + true, + ]) + expect(result).toEqual([ + ['body', ''], + [1, 'index'], + ['declaration', 'VariableDeclaration'], + ['init', ''], + ['cond', 'IfExpression'], + ['left', 'BinaryExpression'], + ]) + const _node = getNodeFromPath(ast, result) + if (err(_node)) throw _node + expect(_node.node.type).toEqual('Identifier') + expect(_node.node.name).toEqual('x') }) - it('finds extrude', () => { - const exampleCode = `length001 = 2 -part001 = startSketchAt([-1.41, 3.46]) - |> line([19.49, 1.16], %, $seg01) - |> angledLine([-35, length001], %) - |> line([-3.22, -7.36], %) - |> angledLine([-175, segLen(seg01)], %) - |> close(%) - |> extrude(1, %) -` - const ast = parse(exampleCode) - if (err(ast)) throw ast - const result = doesPipeHaveCallExp({ - calleeName: 'extrude', - ast, - selection: { type: 'default', range: [100, 101] }, - }) - expect(result).toEqual(true) + it('finds the node in if-else then', () => { + const code = `y = 0 + x = if x > y { + x + 1 + } else { + y + }` + const searchLn = `x + 1` + const sourceIndex = code.indexOf(searchLn) + const ast = assertParse(code) + + const result = getNodePathFromSourceRange(ast, [ + sourceIndex, + sourceIndex, + true, + ]) + expect(result).toEqual([ + ['body', ''], + [1, 'index'], + ['declaration', 'VariableDeclaration'], + ['init', ''], + ['then_val', 'IfExpression'], + ['body', 'IfExpression'], + [0, 'index'], + ['expression', 'ExpressionStatement'], + ['left', 'BinaryExpression'], + ]) + const _node = getNodeFromPath(ast, result) + if (err(_node)) throw _node + expect(_node.node.type).toEqual('Identifier') + expect(_node.node.name).toEqual('x') }) - it('does NOT find close', () => { - const exampleCode = `length001 = 2 -part001 = startSketchAt([-1.41, 3.46]) - |> line([19.49, 1.16], %, $seg01) - |> angledLine([-35, length001], %) - |> line([-3.22, -7.36], %) - |> angledLine([-175, segLen(seg01)], %) -` - const ast = parse(exampleCode) - if (err(ast)) throw ast - const result = doesPipeHaveCallExp({ - calleeName: 'close', - ast, - selection: { type: 'default', range: [100, 101] }, - }) - expect(result).toEqual(false) - }) - it('returns false if not a pipe', () => { - const exampleCode = `length001 = 2` - const ast = parse(exampleCode) - if (err(ast)) throw ast + it('finds the node in import statement item', () => { + const code = `import foo, bar as baz from 'thing.kcl'` + const searchLn = `bar` + const sourceIndex = code.indexOf(searchLn) + const ast = assertParse(code) - const result = doesPipeHaveCallExp({ - calleeName: 'close', - ast, - selection: { type: 'default', range: [9, 10] }, - }) - expect(result).toEqual(false) + const result = getNodePathFromSourceRange(ast, [ + sourceIndex, + sourceIndex, + true, + ]) + expect(result).toEqual([ + ['body', ''], + [0, 'index'], + ['selector', 'ImportStatement'], + ['items', 'ImportSelector'], + [1, 'index'], + ['name', 'ImportItem'], + ]) + const _node = getNodeFromPath(ast, result) + if (err(_node)) throw _node + expect(_node.node.type).toEqual('Identifier') + expect(_node.node.name).toEqual('bar') }) }) @@ -348,13 +369,14 @@ part001 = startSketchAt([-1.41, 3.46]) |> angledLine([-35, length001], %) |> line([-3.22, -7.36], %) |> angledLine([-175, segLen(seg01)], %)` - const ast = parse(exampleCode) - if (err(ast)) throw ast + const ast = assertParse(exampleCode) const execState = await enginelessExecutor(ast) const result = hasExtrudeSketch({ ast, - selection: { type: 'default', range: [100, 101] }, + selection: { + codeRef: codeRefFromRange([100, 101, true], ast), + }, programMemory: execState.memory, }) expect(result).toEqual(true) @@ -367,26 +389,28 @@ part001 = startSketchAt([-1.41, 3.46]) |> line([-3.22, -7.36], %) |> angledLine([-175, segLen(seg01)], %) |> extrude(1, %)` - const ast = parse(exampleCode) - if (err(ast)) throw ast + const ast = assertParse(exampleCode) const execState = await enginelessExecutor(ast) const result = hasExtrudeSketch({ ast, - selection: { type: 'default', range: [100, 101] }, + selection: { + codeRef: codeRefFromRange([100, 101, true], ast), + }, programMemory: execState.memory, }) expect(result).toEqual(true) }) it('finds nothing', async () => { const exampleCode = `length001 = 2` - const ast = parse(exampleCode) - if (err(ast)) throw ast + const ast = assertParse(exampleCode) const execState = await enginelessExecutor(ast) const result = hasExtrudeSketch({ ast, - selection: { type: 'default', range: [10, 11] }, + selection: { + codeRef: codeRefFromRange([10, 11, true], ast), + }, programMemory: execState.memory, }) expect(result).toEqual(false) @@ -402,8 +426,7 @@ describe('Testing findUsesOfTagInPipe', () => { |> line([306.21, 198.87], %) |> angledLine([65, segLen(seg01)], %)` it('finds the current segment', async () => { - const ast = parse(exampleCode) - if (err(ast)) throw ast + const ast = assertParse(exampleCode) const lineOfInterest = `198.85], %, $seg01` const characterIndex = @@ -411,6 +434,7 @@ describe('Testing findUsesOfTagInPipe', () => { const pathToNode = getNodePathFromSourceRange(ast, [ characterIndex, characterIndex, + true, ]) const result = findUsesOfTagInPipe(ast, pathToNode) expect(result).toHaveLength(2) @@ -419,8 +443,7 @@ describe('Testing findUsesOfTagInPipe', () => { }) }) it('find no tag if line has no tag', () => { - const ast = parse(exampleCode) - if (err(ast)) throw ast + const ast = assertParse(exampleCode) const lineOfInterest = `line([306.21, 198.82], %)` const characterIndex = @@ -428,6 +451,7 @@ describe('Testing findUsesOfTagInPipe', () => { const pathToNode = getNodePathFromSourceRange(ast, [ characterIndex, characterIndex, + true, ]) const result = findUsesOfTagInPipe(ast, pathToNode) expect(result).toHaveLength(0) @@ -449,43 +473,63 @@ describe('Testing hasSketchPipeBeenExtruded', () => { |> line([-17.67, 0.85], %) |> close(%) extrude001 = extrude(10, sketch001) -sketch002 = startSketchOn(extrude001, $seg01) +sketch002 = startSketchOn(extrude001, seg01) |> startProfileAt([-12.94, 6.6], %) |> line([2.45, -0.2], %) |> line([-2, -1.25], %) |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%) +sketch003 = startSketchOn(extrude001, 'END') + |> startProfileAt([8.14, 2.8], %) + |> line([-1.24, 4.39], %) + |> line([3.79, 1.91], %) + |> line([1.77, -2.95], %) + |> line([3.12, 1.74], %) + |> line([1.91, -4.09], %) + |> line([-5.6, -2.75], %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) + |> extrude(3.14, %) ` - it('finds sketch001 pipe to be extruded', async () => { - const ast = parse(exampleCode) - if (err(ast)) throw ast + it('identifies sketch001 pipe as extruded (extrusion after pipe)', async () => { + const ast = assertParse(exampleCode) const lineOfInterest = `line([4.99, -0.46], %, $seg01)` const characterIndex = exampleCode.indexOf(lineOfInterest) + lineOfInterest.length const extruded = hasSketchPipeBeenExtruded( { - range: [characterIndex, characterIndex], - type: 'default', + codeRef: codeRefFromRange([characterIndex, characterIndex, true], ast), }, ast ) expect(extruded).toBeTruthy() }) - it('find sketch002 NOT pipe to be extruded', async () => { - const ast = parse(exampleCode) - if (err(ast)) throw ast + it('identifies sketch002 pipe as not extruded', async () => { + const ast = assertParse(exampleCode) const lineOfInterest = `line([2.45, -0.2], %)` const characterIndex = exampleCode.indexOf(lineOfInterest) + lineOfInterest.length const extruded = hasSketchPipeBeenExtruded( { - range: [characterIndex, characterIndex], - type: 'default', + codeRef: codeRefFromRange([characterIndex, characterIndex, true], ast), }, ast ) expect(extruded).toBeFalsy() }) + it('identifies sketch003 pipe as extruded (extrusion within pipe)', async () => { + const ast = assertParse(exampleCode) + const lineOfInterest = `|> line([3.12, 1.74], %)` + const characterIndex = + exampleCode.indexOf(lineOfInterest) + lineOfInterest.length + const extruded = hasSketchPipeBeenExtruded( + { + codeRef: codeRefFromRange([characterIndex, characterIndex, true], ast), + }, + ast + ) + expect(extruded).toBeTruthy() + }) }) describe('Testing doesSceneHaveSweepableSketch', () => { @@ -504,11 +548,21 @@ sketch002 = startSketchOn(extrude001, $seg01) |> lineTo([profileStartX(%), profileStartY(%)], %) |> close(%) ` - const ast = parse(exampleCode) - if (err(ast)) throw ast + const ast = assertParse(exampleCode) const extrudable = doesSceneHaveSweepableSketch(ast) expect(extrudable).toBeTruthy() }) + it('finds sketch001 and sketch002 pipes to be lofted', async () => { + const exampleCode = `sketch001 = startSketchOn('XZ') + |> circle({ center = [0, 0], radius = 1 }, %) +plane001 = offsetPlane('XZ', 2) +sketch002 = startSketchOn(plane001) + |> circle({ center = [0, 0], radius = 3 }, %) +` + const ast = assertParse(exampleCode) + const extrudable = doesSceneHaveSweepableSketch(ast, 2) + expect(extrudable).toBeTruthy() + }) it('find sketch002 NOT pipe to be extruded', async () => { const exampleCode = `sketch001 = startSketchOn('XZ') |> startProfileAt([3.29, 7.86], %) @@ -518,13 +572,44 @@ sketch002 = startSketchOn(extrude001, $seg01) |> close(%) extrude001 = extrude(10, sketch001) ` - const ast = parse(exampleCode) - if (err(ast)) throw ast + const ast = assertParse(exampleCode) const extrudable = doesSceneHaveSweepableSketch(ast) expect(extrudable).toBeFalsy() }) }) +describe('Testing doesSceneHaveExtrudedSketch', () => { + it('finds extruded sketch as variable', async () => { + const exampleCode = `sketch001 = startSketchOn('XZ') + |> circle({ center = [0, 0], radius = 1 }, %) +extrude001 = extrude(1, sketch001) +` + const ast = assertParse(exampleCode) + if (err(ast)) throw ast + const extrudable = doesSceneHaveExtrudedSketch(ast) + expect(extrudable).toBeTruthy() + }) + it('finds extruded sketch in pipe', async () => { + const exampleCode = `extrude001 = startSketchOn('XZ') + |> circle({ center = [0, 0], radius = 1 }, %) + |> extrude(1, %) +` + const ast = assertParse(exampleCode) + if (err(ast)) throw ast + const extrudable = doesSceneHaveExtrudedSketch(ast) + expect(extrudable).toBeTruthy() + }) + it('finds no extrusion with sketch only', async () => { + const exampleCode = `extrude001 = startSketchOn('XZ') + |> circle({ center = [0, 0], radius = 1 }, %) +` + const ast = assertParse(exampleCode) + if (err(ast)) throw ast + const extrudable = doesSceneHaveExtrudedSketch(ast) + expect(extrudable).toBeFalsy() + }) +}) + describe('Testing traverse and pathToNode', () => { it.each([ ['basic', '2.73'], @@ -547,8 +632,7 @@ myNestedVar = [ } ] ` - const ast = parse(code) - if (err(ast)) throw ast + const ast = assertParse(code) let pathToNode: PathToNode = [] traverse(ast, { enter: (node, path) => { @@ -570,6 +654,7 @@ myNestedVar = [ const pathToNode2 = getNodePathFromSourceRange(ast, [ literalIndex + 2, literalIndex + 2, + true, ]) expect(pathToNode).toEqual(pathToNode2) }) diff --git a/src/lang/queryAst.ts b/src/lang/queryAst.ts index 6b91a76d1..77885aa74 100644 --- a/src/lang/queryAst.ts +++ b/src/lang/queryAst.ts @@ -14,7 +14,9 @@ import { ProgramMemory, ReturnStatement, sketchFromKclValue, + sketchFromKclValueOptional, SourceRange, + sourceRangeFromRust, SyntaxType, VariableDeclaration, VariableDeclarator, @@ -27,8 +29,10 @@ import { getConstraintLevelFromSourceRange, getConstraintType, } from './std/sketchcombos' -import { err } from 'lib/trap' +import { err, Reason } from 'lib/trap' import { ImportStatement } from 'wasm-lib/kcl/bindings/ImportStatement' +import { Node } from 'wasm-lib/kcl/bindings/Node' +import { ArtifactGraph, codeRefFromRange } from './std/artifactGraph' /** * Retrieves a node from a given path within a Program node structure, optionally stopping at a specified node type. @@ -121,13 +125,14 @@ export function getNodeFromPathCurry( } function moreNodePathFromSourceRange( - node: + node: Node< | Expr | ImportStatement | ExpressionStatement | VariableDeclaration - | ReturnStatement, - sourceRange: Selection['range'], + | ReturnStatement + >, + sourceRange: SourceRange, previousPath: PathToNode = [['body', '']] ): PathToNode { const [start, end] = sourceRange @@ -169,6 +174,30 @@ function moreNodePathFromSourceRange( } return path } + + if (_node.type === 'CallExpressionKw' && isInRange) { + const { callee, arguments: args } = _node + if ( + callee.type === 'Identifier' && + callee.start <= start && + callee.end >= end + ) { + path.push(['callee', 'CallExpressionKw']) + return path + } + if (args.length > 0) { + for (let argIndex = 0; argIndex < args.length; argIndex++) { + const arg = args[argIndex].arg + if (arg.start <= start && arg.end >= end) { + path.push(['arguments', 'CallExpressionKw']) + path.push([argIndex, 'index']) + return moreNodePathFromSourceRange(arg, sourceRange, path) + } + } + } + return path + } + if (_node.type === 'BinaryExpression' && isInRange) { const { left, right } = _node if (left.start <= start && left.end >= end) { @@ -230,34 +259,26 @@ function moreNodePathFromSourceRange( return moreNodePathFromSourceRange(expression, sourceRange, path) } if (_node.type === 'VariableDeclaration' && isInRange) { - const declarations = _node.declarations + const declaration = _node.declaration - for (let decIndex = 0; decIndex < declarations.length; decIndex++) { - const declaration = declarations[decIndex] - if (declaration.start <= start && declaration.end >= end) { - path.push(['declarations', 'VariableDeclaration']) - path.push([decIndex, 'index']) - const init = declaration.init - if (init.start <= start && init.end >= end) { - path.push(['init', '']) - return moreNodePathFromSourceRange(init, sourceRange, path) - } + if (declaration.start <= start && declaration.end >= end) { + path.push(['declaration', 'VariableDeclaration']) + const init = declaration.init + if (init.start <= start && init.end >= end) { + path.push(['init', '']) + return moreNodePathFromSourceRange(init, sourceRange, path) } } } if (_node.type === 'VariableDeclaration' && isInRange) { - const declarations = _node.declarations + const declaration = _node.declaration - for (let decIndex = 0; decIndex < declarations.length; decIndex++) { - const declaration = declarations[decIndex] - if (declaration.start <= start && declaration.end >= end) { - const init = declaration.init - if (init.start <= start && init.end >= end) { - path.push(['declarations', 'VariableDeclaration']) - path.push([decIndex, 'index']) - path.push(['init', '']) - return moreNodePathFromSourceRange(init, sourceRange, path) - } + if (declaration.start <= start && declaration.end >= end) { + const init = declaration.init + if (init.start <= start && init.end >= end) { + path.push(['declaration', 'VariableDeclaration']) + path.push(['init', '']) + return moreNodePathFromSourceRange(init, sourceRange, path) } } return path @@ -315,6 +336,70 @@ function moreNodePathFromSourceRange( } if (_node.type === 'PipeSubstitution' && isInRange) return path + + if (_node.type === 'IfExpression' && isInRange) { + const { cond, then_val, else_ifs, final_else } = _node + if (cond.start <= start && cond.end >= end) { + path.push(['cond', 'IfExpression']) + return moreNodePathFromSourceRange(cond, sourceRange, path) + } + if (then_val.start <= start && then_val.end >= end) { + path.push(['then_val', 'IfExpression']) + path.push(['body', 'IfExpression']) + return getNodePathFromSourceRange(then_val, sourceRange, path) + } + for (let i = 0; i < else_ifs.length; i++) { + const else_if = else_ifs[i] + if (else_if.start <= start && else_if.end >= end) { + path.push(['else_ifs', 'IfExpression']) + path.push([i, 'index']) + const { cond, then_val } = else_if + if (cond.start <= start && cond.end >= end) { + path.push(['cond', 'IfExpression']) + return moreNodePathFromSourceRange(cond, sourceRange, path) + } + path.push(['then_val', 'IfExpression']) + path.push(['body', 'IfExpression']) + return getNodePathFromSourceRange(then_val, sourceRange, path) + } + } + if (final_else.start <= start && final_else.end >= end) { + path.push(['final_else', 'IfExpression']) + path.push(['body', 'IfExpression']) + return getNodePathFromSourceRange(final_else, sourceRange, path) + } + return path + } + + if (_node.type === 'ImportStatement' && isInRange) { + if (_node.selector && _node.selector.type === 'List') { + path.push(['selector', 'ImportStatement']) + const { items } = _node.selector + for (let i = 0; i < items.length; i++) { + const item = items[i] + if (item.start <= start && item.end >= end) { + path.push(['items', 'ImportSelector']) + path.push([i, 'index']) + if (item.name.start <= start && item.name.end >= end) { + path.push(['name', 'ImportItem']) + return path + } + if ( + item.alias && + item.alias.start <= start && + item.alias.end >= end + ) { + path.push(['alias', 'ImportItem']) + return path + } + return path + } + } + return path + } + return path + } + console.error('not implemented: ' + node.type) return path @@ -322,7 +407,7 @@ function moreNodePathFromSourceRange( export function getNodePathFromSourceRange( node: Program, - sourceRange: Selection['range'], + sourceRange: SourceRange, previousPath: PathToNode = [['body', '']] ): PathToNode { const [start, end] = sourceRange || [] @@ -344,15 +429,16 @@ export function getNodePathFromSourceRange( return path } -type KCLNode = +type KCLNode = Node< | Expr | ExpressionStatement | VariableDeclaration | VariableDeclarator | ReturnStatement +> export function traverse( - node: KCLNode | Program, + node: KCLNode | Node, option: { enter?: (node: KCLNode, pathToNode: PathToNode) => void leave?: (node: KCLNode) => void @@ -365,13 +451,10 @@ export function traverse( traverse(node, option, pathToNode) if (_node.type === 'VariableDeclaration') { - _node.declarations.forEach((declaration, index) => - _traverse(declaration, [ - ...pathToNode, - ['declarations', 'VariableDeclaration'], - [index, 'index'], - ]) - ) + _traverse(_node.declaration, [ + ...pathToNode, + ['declaration', 'VariableDeclaration'], + ]) } else if (_node.type === 'VariableDeclarator') { _traverse(_node.init, [...pathToNode, ['init', '']]) } else if (_node.type === 'PipeExpression') { @@ -481,7 +564,7 @@ export function findAllPreviousVariablesPath( const variables: PrevVariable[] = [] bodyItems?.forEach?.((item) => { if (item.type !== 'VariableDeclaration' || item.end > startRange) return - const varName = item.declarations[0].id.name + const varName = item.declaration.id.name const varValue = programMemory?.get(varName) if (!varValue || typeof varValue?.value !== type) return variables.push({ @@ -500,7 +583,7 @@ export function findAllPreviousVariablesPath( export function findAllPreviousVariables( ast: Program, programMemory: ProgramMemory, - sourceRange: Selection['range'], + sourceRange: SourceRange, type: 'number' | 'string' = 'number' ): { variables: PrevVariable[] @@ -512,9 +595,9 @@ export function findAllPreviousVariables( } type ReplacerFn = ( - _ast: Program, + _ast: Node, varName: string -) => { modifiedAst: Program; pathToReplaced: PathToNode } | Error +) => { modifiedAst: Node; pathToReplaced: PathToNode } | Error export function isNodeSafeToReplacePath( ast: Program, @@ -583,12 +666,12 @@ export function isNodeSafeToReplacePath( } export function isNodeSafeToReplace( - ast: Program, - sourceRange: [number, number] + ast: Node, + sourceRange: SourceRange ): | { isSafe: boolean - value: Expr + value: Node replacer: ReplacerFn } | Error { @@ -645,19 +728,26 @@ export function isValueZero(val?: Expr): boolean { export function isLinesParallelAndConstrained( ast: Program, + artifactGraph: ArtifactGraph, programMemory: ProgramMemory, primaryLine: Selection, secondaryLine: Selection ): | { isParallelAndConstrained: boolean - sourceRange: SourceRange + selection: Selection | null } | Error { try { const EPSILON = 0.005 - const primaryPath = getNodePathFromSourceRange(ast, primaryLine.range) - const secondaryPath = getNodePathFromSourceRange(ast, secondaryLine.range) + const primaryPath = getNodePathFromSourceRange( + ast, + primaryLine?.codeRef?.range + ) + const secondaryPath = getNodePathFromSourceRange( + ast, + secondaryLine?.codeRef?.range + ) const _secondaryNode = getNodeFromPath( ast, secondaryPath, @@ -668,17 +758,20 @@ export function isLinesParallelAndConstrained( const _varDec = getNodeFromPath(ast, primaryPath, 'VariableDeclaration') if (err(_varDec)) return _varDec const varDec = _varDec.node - const varName = (varDec as VariableDeclaration)?.declarations[0]?.id?.name + const varName = (varDec as VariableDeclaration)?.declaration.id?.name const sg = sketchFromKclValue(programMemory?.get(varName), varName) if (err(sg)) return sg const _primarySegment = getSketchSegmentFromSourceRange( sg, - primaryLine.range + primaryLine?.codeRef?.range ) if (err(_primarySegment)) return _primarySegment const primarySegment = _primarySegment.segment - const _segment = getSketchSegmentFromSourceRange(sg, secondaryLine.range) + const _segment = getSketchSegmentFromSourceRange( + sg, + secondaryLine?.codeRef?.range + ) if (err(_segment)) return _segment const { segment: secondarySegment, index: secondaryIndex } = _segment const primaryAngle = getAngle(primarySegment.from, primarySegment.to) @@ -691,7 +784,7 @@ export function isLinesParallelAndConstrained( Math.abs(primaryAngle - secondaryAngle) < EPSILON || Math.abs(primaryAngle - secondaryAngleAlt) < EPSILON - // is secordary line fully constrain, or has constrain type of 'angle' + // is secondary line fully constrain, or has constrain type of 'angle' const secondaryFirstArg = getFirstArg(secondaryNode) if (err(secondaryFirstArg)) return secondaryFirstArg @@ -701,14 +794,14 @@ export function isLinesParallelAndConstrained( ) const constraintLevelMeta = getConstraintLevelFromSourceRange( - secondaryLine.range, + secondaryLine?.codeRef.range, ast ) if (err(constraintLevelMeta)) { console.error(constraintLevelMeta) return { isParallelAndConstrained: false, - sourceRange: [0, 0], + selection: null, } } const constraintLevel = constraintLevelMeta.level @@ -725,44 +818,19 @@ export function isLinesParallelAndConstrained( return { isParallelAndConstrained, - sourceRange: prevSourceRange, + selection: { + codeRef: codeRefFromRange(sourceRangeFromRust(prevSourceRange), ast), + artifact: artifactGraph.get(prevSegment.__geoMeta.id), + }, } } catch (e) { return { isParallelAndConstrained: false, - sourceRange: [0, 0], + selection: null, } } } -export function doesPipeHaveCallExp({ - ast, - selection, - calleeName, -}: { - calleeName: string - ast: Program - selection: Selection -}): boolean { - const pathToNode = getNodePathFromSourceRange(ast, selection.range) - const pipeExpressionMeta = getNodeFromPath( - ast, - pathToNode, - 'PipeExpression' - ) - if (err(pipeExpressionMeta)) { - console.error(pipeExpressionMeta) - return false - } - const pipeExpression = pipeExpressionMeta.node - if (pipeExpression.type !== 'PipeExpression') return false - return pipeExpression.body.some( - (expression) => - expression.type === 'CallExpression' && - expression.callee.name === calleeName - ) -} - export function hasExtrudeSketch({ ast, selection, @@ -772,10 +840,9 @@ export function hasExtrudeSketch({ selection: Selection programMemory: ProgramMemory }): boolean { - const pathToNode = getNodePathFromSourceRange(ast, selection.range) const varDecMeta = getNodeFromPath( ast, - pathToNode, + selection?.codeRef?.pathToNode, 'VariableDeclaration' ) if (err(varDecMeta)) { @@ -784,10 +851,19 @@ export function hasExtrudeSketch({ } const varDec = varDecMeta.node if (varDec.type !== 'VariableDeclaration') return false - const varName = varDec.declarations[0].id.name + const varName = varDec.declaration.id.name const varValue = programMemory?.get(varName) return ( - varValue?.type === 'Solid' || !err(sketchFromKclValue(varValue, varName)) + varValue?.type === 'Solid' || + !(sketchFromKclValueOptional(varValue, varName) instanceof Reason) + ) +} + +export function artifactIsPlaneWithPaths(selectionRanges: Selections) { + return ( + selectionRanges.graphSelections.length && + selectionRanges.graphSelections[0].artifact?.type === 'plane' && + selectionRanges.graphSelections[0].artifact.pathIds.length ) } @@ -795,9 +871,9 @@ export function isSingleCursorInPipe( selectionRanges: Selections, ast: Program ) { - if (selectionRanges.codeBasedSelections.length !== 1) return false - const selection = selectionRanges.codeBasedSelections[0] - const pathToNode = getNodePathFromSourceRange(ast, selection.range) + if (selectionRanges.graphSelections.length !== 1) return false + const selection = selectionRanges.graphSelections[0] + const pathToNode = getNodePathFromSourceRange(ast, selection?.codeRef?.range) const nodeTypes = pathToNode.map(([, type]) => type) if (nodeTypes.includes('FunctionExpression')) return false if (!nodeTypes.includes('VariableDeclaration')) return false @@ -837,7 +913,7 @@ export function findUsesOfTagInPipe( ? String(thirdParam.value) : thirdParam.name - const varDec = getNodeFromPath( + const varDec = getNodeFromPath>( ast, pathToNode, 'VariableDeclaration' @@ -860,45 +936,65 @@ export function findUsesOfTagInPipe( return const tagArgValue = tagArg.type === 'TagDeclarator' ? String(tagArg.value) : tagArg.name - if (tagArgValue === tag) dependentRanges.push([node.start, node.end]) + if (tagArgValue === tag) + dependentRanges.push([node.start, node.end, true]) }, }) return dependentRanges } export function hasSketchPipeBeenExtruded(selection: Selection, ast: Program) { - const path = getNodePathFromSourceRange(ast, selection.range) - const _node = getNodeFromPath(ast, path, 'PipeExpression') + const _node = getNodeFromPath>( + ast, + selection.codeRef.pathToNode, + 'PipeExpression' + ) if (err(_node)) return false const { node: pipeExpression } = _node if (pipeExpression.type !== 'PipeExpression') return false const _varDec = getNodeFromPath( ast, - path, + selection.codeRef.pathToNode, 'VariableDeclarator' ) if (err(_varDec)) return false const varDec = _varDec.node if (varDec.type !== 'VariableDeclarator') return false let extruded = false - traverse(ast as any, { + // option 1: extrude or revolve is called in the sketch pipe + traverse(pipeExpression, { enter(node) { if ( node.type === 'CallExpression' && - node.callee.type === 'Identifier' && - (node.callee.name === 'extrude' || node.callee.name === 'revolve') && - node.arguments?.[1]?.type === 'Identifier' && - node.arguments[1].name === varDec.id.name + (node.callee.name === 'extrude' || node.callee.name === 'revolve') ) { extruded = true } }, }) + // option 2: extrude or revolve is called in the separate pipe + if (!extruded) { + traverse(ast as any, { + enter(node) { + if ( + node.type === 'CallExpression' && + node.callee.type === 'Identifier' && + (node.callee.name === 'extrude' || + node.callee.name === 'revolve' || + node.callee.name === 'loft') && + node.arguments?.[1]?.type === 'Identifier' && + node.arguments[1].name === varDec.id.name + ) { + extruded = true + } + }, + }) + } return extruded } /** File must contain at least one sketch that has not been extruded already */ -export function doesSceneHaveSweepableSketch(ast: Program) { +export function doesSceneHaveSweepableSketch(ast: Node, count = 1) { const theMap: any = {} traverse(ast as any, { enter(node) { @@ -947,6 +1043,35 @@ export function doesSceneHaveSweepableSketch(ast: Program) { } }, }) + return Object.keys(theMap).length >= count +} + +export function doesSceneHaveExtrudedSketch(ast: Node) { + const theMap: any = {} + traverse(ast as any, { + enter(node) { + if ( + node.type === 'VariableDeclarator' && + node.init?.type === 'PipeExpression' + ) { + for (const pipe of node.init.body) { + if ( + pipe.type === 'CallExpression' && + pipe.callee.name === 'extrude' + ) { + theMap[node.id.name] = true + break + } + } + } else if ( + node.type === 'CallExpression' && + node.callee.name === 'extrude' && + node.arguments[1]?.type === 'Identifier' + ) { + theMap[node.moduleId] = true + } + }, + }) return Object.keys(theMap).length > 0 } diff --git a/src/lang/recast.test.ts b/src/lang/recast.test.ts index e1fad3ce2..56d083083 100644 --- a/src/lang/recast.test.ts +++ b/src/lang/recast.test.ts @@ -1,4 +1,4 @@ -import { parse, Program, recast, initPromise } from './wasm' +import { assertParse, Program, recast, initPromise } from './wasm' import fs from 'node:fs' import { err } from 'lib/trap' @@ -63,7 +63,7 @@ log(5, myVar) }) it('function declaration with call', () => { const code = [ - 'fn funcN = (a, b) => {', + 'fn funcN(a, b) {', ' return a + b', '}', 'theVar = 60', @@ -101,7 +101,7 @@ log(5, myVar) }) it('recast BinaryExpression piped into CallExpression', () => { const code = [ - 'fn myFn = (a) => {', + 'fn myFn(a) {', ' return a + 1', '}', 'myVar = 5 + 1', @@ -173,10 +173,10 @@ log(5, myVar) it('recast long object execution', () => { const code = `three = 3 yo = { - aStr: 'str', - anum: 2, - identifier: three, - binExp: 4 + 5 + aStr = 'str', + anum = 2, + identifier = three, + binExp = 4 + 5 } ` const { ast } = code2ast(code) @@ -185,7 +185,7 @@ yo = { expect(recasted).toBe(code) }) it('recast short object execution', () => { - const code = `yo = { key: 'val' } + const code = `yo = { key = 'val' } ` const { ast } = code2ast(code) const recasted = recast(ast) @@ -193,7 +193,7 @@ yo = { expect(recasted).toBe(code) }) it('recast object execution with member expression', () => { - const code = `yo = { a: { b: { c: '123' } } } + const code = `yo = { a = { b = { c = '123' } } } key = 'c' myVar = yo.a['b'][key] key2 = 'b' @@ -208,7 +208,7 @@ myVar2 = yo['a'][key2].c describe('testing recasting with comments and whitespace', () => { it('code with comments', () => { - const code = `yo = { a: { b: { c: '123' } } } + const code = `yo = { a = { b = { c = '123' } } } // this is a comment key = 'c' ` @@ -234,7 +234,7 @@ yo = 'bing' }) it('comments at the start and end', () => { const code = `// this is a comment -yo = { a: { b: { c: '123' } } } +yo = { a = { b = { c = '123' } } } key = 'c' // this is also a comment @@ -245,9 +245,9 @@ key = 'c' expect(recasted).toBe(code) }) it('comments in a fn block', () => { - const code = `fn myFn = () => { + const code = `fn myFn() { // this is a comment - yo = { a: { b: { c: '123' } } } + yo = { a = { b = { c = '123' } } } /* block comment */ @@ -357,9 +357,9 @@ describe('it recasts wrapped object expressions in pipe bodies with correct inde |> line([0.62, 4.15], %, $seg01) |> line([2.77, -1.24], %) |> angledLineThatIntersects({ - angle: 201, - offset: -1.35, - intersectTag: $seg01 + angle = 201, + offset = -1.35, + intersectTag = $seg01 }, %) |> line([-0.42, -1.72], %) ` @@ -370,9 +370,9 @@ describe('it recasts wrapped object expressions in pipe bodies with correct inde }) it('recasts wrapped object expressions NOT in pipe body correctly', () => { const code = `angledLineThatIntersects({ - angle: 201, - offset: -1.35, - intersectTag: $seg01 + angle = 201, + offset = -1.35, + intersectTag = $seg01 }, %) ` const { ast } = code2ast(code) @@ -394,8 +394,6 @@ describe('it recasts binary expression using brackets where needed', () => { // helpers function code2ast(code: string): { ast: Program } { - const ast = parse(code) - // eslint-ignore-next-line - if (err(ast)) throw ast + const ast = assertParse(code) return { ast } } diff --git a/src/lang/std/__snapshots__/artifactGraph.test.ts.snap b/src/lang/std/__snapshots__/artifactGraph.test.ts.snap index d0a9a13e6..d31574a2d 100644 --- a/src/lang/std/__snapshots__/artifactGraph.test.ts.snap +++ b/src/lang/std/__snapshots__/artifactGraph.test.ts.snap @@ -11,10 +11,12 @@ Map { ], ], "range": [ - 37, - 64, + 12, + 31, + true, ], }, + "id": "UUID", "pathIds": [ "UUID", ], @@ -31,8 +33,10 @@ Map { "range": [ 37, 64, + true, ], }, + "id": "UUID", "planeId": "UUID", "segIds": [ "UUID", @@ -56,12 +60,14 @@ Map { "range": [ 70, 86, + true, ], }, "edgeIds": [ "UUID", "UUID", ], + "id": "UUID", "pathId": "UUID", "surfaceId": "UUID", "type": "segment", @@ -77,6 +83,7 @@ Map { "range": [ 92, 119, + true, ], }, "edgeCutId": "UUID", @@ -84,6 +91,7 @@ Map { "UUID", "UUID", ], + "id": "UUID", "pathId": "UUID", "surfaceId": "UUID", "type": "segment", @@ -99,12 +107,14 @@ Map { "range": [ 125, 150, + true, ], }, "edgeIds": [ "UUID", "UUID", ], + "id": "UUID", "pathId": "UUID", "surfaceId": "UUID", "type": "segment", @@ -120,12 +130,14 @@ Map { "range": [ 156, 203, + true, ], }, "edgeIds": [ "UUID", "UUID", ], + "id": "UUID", "pathId": "UUID", "surfaceId": "UUID", "type": "segment", @@ -141,13 +153,16 @@ Map { "range": [ 209, 217, + true, ], }, "edgeIds": [], + "id": "UUID", "pathId": "UUID", "type": "segment", }, "UUID-7" => { + "id": "UUID", "pathId": "UUID", "type": "solid2D", }, @@ -162,6 +177,7 @@ Map { "range": [ 231, 254, + true, ], }, "edgeIds": [ @@ -174,6 +190,7 @@ Map { "UUID", "UUID", ], + "id": "UUID", "pathId": "UUID", "subType": "extrusion", "surfaceIds": [ @@ -188,6 +205,7 @@ Map { }, "UUID-9" => { "edgeCutEdgeIds": [], + "id": "UUID", "pathIds": [], "segId": "UUID", "sweepId": "UUID", @@ -195,6 +213,7 @@ Map { }, "UUID-10" => { "edgeCutEdgeIds": [], + "id": "UUID", "pathIds": [ "UUID", ], @@ -204,6 +223,7 @@ Map { }, "UUID-11" => { "edgeCutEdgeIds": [], + "id": "UUID", "pathIds": [], "segId": "UUID", "sweepId": "UUID", @@ -211,6 +231,7 @@ Map { }, "UUID-12" => { "edgeCutEdgeIds": [], + "id": "UUID", "pathIds": [], "segId": "UUID", "sweepId": "UUID", @@ -218,6 +239,7 @@ Map { }, "UUID-13" => { "edgeCutEdgeIds": [], + "id": "UUID", "pathIds": [], "subType": "start", "sweepId": "UUID", @@ -225,54 +247,63 @@ Map { }, "UUID-14" => { "edgeCutEdgeIds": [], + "id": "UUID", "pathIds": [], "subType": "end", "sweepId": "UUID", "type": "cap", }, "UUID-15" => { + "id": "UUID", "segId": "UUID", "subType": "opposite", "sweepId": "UUID", "type": "sweepEdge", }, "UUID-16" => { + "id": "UUID", "segId": "UUID", "subType": "adjacent", "sweepId": "UUID", "type": "sweepEdge", }, "UUID-17" => { + "id": "UUID", "segId": "UUID", "subType": "opposite", "sweepId": "UUID", "type": "sweepEdge", }, "UUID-18" => { + "id": "UUID", "segId": "UUID", "subType": "adjacent", "sweepId": "UUID", "type": "sweepEdge", }, "UUID-19" => { + "id": "UUID", "segId": "UUID", "subType": "opposite", "sweepId": "UUID", "type": "sweepEdge", }, "UUID-20" => { + "id": "UUID", "segId": "UUID", "subType": "adjacent", "sweepId": "UUID", "type": "sweepEdge", }, "UUID-21" => { + "id": "UUID", "segId": "UUID", "subType": "opposite", "sweepId": "UUID", "type": "sweepEdge", }, "UUID-22" => { + "id": "UUID", "segId": "UUID", "subType": "adjacent", "sweepId": "UUID", @@ -289,10 +320,12 @@ Map { "range": [ 260, 299, + true, ], }, "consumedEdgeId": "UUID", "edgeIds": [], + "id": "UUID", "subType": "fillet", "type": "edgeCut", }, @@ -307,8 +340,10 @@ Map { "range": [ 350, 377, + true, ], }, + "id": "UUID", "planeId": "UUID", "segIds": [ "UUID", @@ -331,12 +366,14 @@ Map { "range": [ 383, 398, + true, ], }, "edgeIds": [ "UUID", "UUID", ], + "id": "UUID", "pathId": "UUID", "surfaceId": "UUID", "type": "segment", @@ -352,12 +389,14 @@ Map { "range": [ 404, 420, + true, ], }, "edgeIds": [ "UUID", "UUID", ], + "id": "UUID", "pathId": "UUID", "surfaceId": "UUID", "type": "segment", @@ -373,12 +412,14 @@ Map { "range": [ 426, 473, + true, ], }, "edgeIds": [ "UUID", "UUID", ], + "id": "UUID", "pathId": "UUID", "surfaceId": "UUID", "type": "segment", @@ -394,13 +435,16 @@ Map { "range": [ 479, 487, + true, ], }, "edgeIds": [], + "id": "UUID", "pathId": "UUID", "type": "segment", }, "UUID-29" => { + "id": "UUID", "pathId": "UUID", "type": "solid2D", }, @@ -415,6 +459,7 @@ Map { "range": [ 501, 522, + true, ], }, "edgeIds": [ @@ -425,6 +470,7 @@ Map { "UUID", "UUID", ], + "id": "UUID", "pathId": "UUID", "subType": "extrusion", "surfaceIds": [ @@ -432,12 +478,12 @@ Map { "UUID", "UUID", "UUID", - "UUID", ], "type": "sweep", }, "UUID-31" => { "edgeCutEdgeIds": [], + "id": "UUID", "pathIds": [], "segId": "UUID", "sweepId": "UUID", @@ -445,6 +491,7 @@ Map { }, "UUID-32" => { "edgeCutEdgeIds": [], + "id": "UUID", "pathIds": [], "segId": "UUID", "sweepId": "UUID", @@ -452,6 +499,7 @@ Map { }, "UUID-33" => { "edgeCutEdgeIds": [], + "id": "UUID", "pathIds": [], "segId": "UUID", "sweepId": "UUID", @@ -459,49 +507,49 @@ Map { }, "UUID-34" => { "edgeCutEdgeIds": [], - "pathIds": [], - "subType": "start", - "sweepId": "UUID", - "type": "cap", - }, - "UUID-35" => { - "edgeCutEdgeIds": [], + "id": "UUID", "pathIds": [], "subType": "end", "sweepId": "UUID", "type": "cap", }, - "UUID-36" => { + "UUID-35" => { + "id": "UUID", "segId": "UUID", "subType": "opposite", "sweepId": "UUID", "type": "sweepEdge", }, + "UUID-36" => { + "id": "UUID", + "segId": "UUID", + "subType": "adjacent", + "sweepId": "UUID", + "type": "sweepEdge", + }, "UUID-37" => { + "id": "UUID", "segId": "UUID", - "subType": "adjacent", + "subType": "opposite", "sweepId": "UUID", "type": "sweepEdge", }, "UUID-38" => { - "segId": "UUID", - "subType": "opposite", - "sweepId": "UUID", - "type": "sweepEdge", - }, - "UUID-39" => { + "id": "UUID", "segId": "UUID", "subType": "adjacent", "sweepId": "UUID", "type": "sweepEdge", }, - "UUID-40" => { + "UUID-39" => { + "id": "UUID", "segId": "UUID", "subType": "opposite", "sweepId": "UUID", "type": "sweepEdge", }, - "UUID-41" => { + "UUID-40" => { + "id": "UUID", "segId": "UUID", "subType": "adjacent", "sweepId": "UUID", diff --git a/src/lang/std/artifactGraph.test.ts b/src/lang/std/artifactGraph.test.ts index a36ef9e82..2870fe42a 100644 --- a/src/lang/std/artifactGraph.test.ts +++ b/src/lang/std/artifactGraph.test.ts @@ -1,4 +1,4 @@ -import { makeDefaultPlanes, parse, initPromise, Program } from 'lang/wasm' +import { makeDefaultPlanes, assertParse, initPromise, Program } from 'lang/wasm' import { Models } from '@kittycad/lib' import { OrderedCommand, @@ -49,6 +49,26 @@ sketch002 = startSketchOn(extrude001, seg02) extrude002 = extrude(5, sketch002) ` +const exampleCodeNo3D = `sketch003 = startSketchOn('YZ') + |> startProfileAt([5.82, 0], %) + |> angledLine([180, 11.54], %, $rectangleSegmentA001) + |> angledLine([ + segAng(rectangleSegmentA001) - 90, + 8.21 + ], %, $rectangleSegmentB001) + |> angledLine([ + segAng(rectangleSegmentA001), + -segLen(rectangleSegmentA001) + ], %, $rectangleSegmentC001) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) +sketch004 = startSketchOn('-XZ') + |> startProfileAt([0, 14.36], %) + |> line([15.49, 0.05], %) + |> tangentialArcTo([0, 0], %) + |> tangentialArcTo([-6.8, 8.17], %) +` + const sketchOnFaceOnFaceEtc = `sketch001 = startSketchOn('XZ') |> startProfileAt([0, 0], %) |> line([4, 8], %) @@ -78,11 +98,22 @@ sketch004 = startSketchOn(extrude003, seg02) |> close(%) extrude004 = extrude(3, sketch004) ` +const exampleCodeOffsetPlanes = ` +offsetPlane001 = offsetPlane("XY", 20) +offsetPlane002 = offsetPlane("XZ", -50) +offsetPlane003 = offsetPlane("YZ", 10) + +sketch002 = startSketchOn(offsetPlane001) + |> startProfileAt([0, 0], %) + |> line([6.78, 15.01], %) +` // add more code snippets here and use `getCommands` to get the orderedCommands and responseMap for more tests const codeToWriteCacheFor = { exampleCode1, sketchOnFaceOnFaceEtc, + exampleCodeNo3D, + exampleCodeOffsetPlanes, } as const type CodeKey = keyof typeof codeToWriteCacheFor @@ -108,7 +139,6 @@ beforeAll(async () => { makeDefaultPlanes: () => makeDefaultPlanes(engineCommandManager), setMediaStream: () => {}, setIsStreamReady: () => {}, - modifyGrid: async () => {}, // eslint-disable-next-line @typescript-eslint/no-misused-promises callbackOnEngineLiteConnect: async () => { const cacheEntries = Object.entries(codeToWriteCacheFor) as [ @@ -117,11 +147,7 @@ beforeAll(async () => { ][] const cacheToWriteToFileTemp: Partial = {} for (const [codeKey, code] of cacheEntries) { - const ast = parse(code) - if (err(ast)) { - console.error(ast) - return Promise.reject(ast) - } + const ast = assertParse(code) await kclManager.executeAst({ ast }) cacheToWriteToFileTemp[codeKey] = { @@ -144,6 +170,52 @@ afterAll(() => { }) describe('testing createArtifactGraph', () => { + describe('code with offset planes and a sketch:', () => { + let ast: Program + let theMap: ReturnType + + it('setup', () => { + // putting this logic in here because describe blocks runs before beforeAll has finished + const { + orderedCommands, + responseMap, + ast: _ast, + } = getCommands('exampleCodeOffsetPlanes') + ast = _ast + theMap = createArtifactGraph({ orderedCommands, responseMap, ast }) + }) + + it(`there should be one sketch`, () => { + const sketches = [...filterArtifacts({ types: ['path'] }, theMap)].map( + (path) => expandPath(path[1], theMap) + ) + expect(sketches).toHaveLength(1) + sketches.forEach((path) => { + if (err(path)) throw path + expect(path.type).toBe('path') + }) + }) + + it(`there should be three offsetPlanes`, () => { + const offsetPlanes = [ + ...filterArtifacts({ types: ['plane'] }, theMap), + ].map((plane) => expandPlane(plane[1], theMap)) + expect(offsetPlanes).toHaveLength(3) + offsetPlanes.forEach((path) => { + expect(path.type).toBe('plane') + }) + }) + + it(`Only one offset plane should have a path`, () => { + const offsetPlanes = [ + ...filterArtifacts({ types: ['plane'] }, theMap), + ].map((plane) => expandPlane(plane[1], theMap)) + const offsetPlaneWithPaths = offsetPlanes.filter( + (plane) => plane.paths.length + ) + expect(offsetPlaneWithPaths).toHaveLength(1) + }) + }) describe('code with an extrusion, fillet and sketch of face:', () => { let ast: Program let theMap: ReturnType @@ -187,11 +259,13 @@ describe('testing createArtifactGraph', () => { if (err(extrusion)) throw extrusion expect(extrusion.type).toBe('sweep') const firstExtrusionIsACubeIE6Sides = 6 - const secondExtrusionIsATriangularPrismIE5Sides = 5 + // Each face of the triangular prism (5), but without the bottom cap. + // The engine doesn't generate that. + const secondExtrusionIsATriangularPrism = 4 expect(extrusion.surfaces.length).toBe( !index ? firstExtrusionIsACubeIE6Sides - : secondExtrusionIsATriangularPrismIE5Sides + : secondExtrusionIsATriangularPrism ) }) }) @@ -236,6 +310,69 @@ describe('testing createArtifactGraph', () => { await GraphTheGraph(theMap, 2000, 2000, 'exampleCode1.png') }, 20000) }) + + describe(`code with sketches but no extrusions or other 3D elements`, () => { + let ast: Program + let theMap: ReturnType + it(`setup`, () => { + // putting this logic in here because describe blocks runs before beforeAll has finished + const { + orderedCommands, + responseMap, + ast: _ast, + } = getCommands('exampleCodeNo3D') + ast = _ast + theMap = createArtifactGraph({ orderedCommands, responseMap, ast }) + }) + + it('there should be two planes, one for each sketch path', () => { + const planes = [...filterArtifacts({ types: ['plane'] }, theMap)].map( + (plane) => expandPlane(plane[1], theMap) + ) + expect(planes).toHaveLength(2) + planes.forEach((path) => { + expect(path.type).toBe('plane') + }) + }) + it('there should be two paths, one on each plane', () => { + const paths = [...filterArtifacts({ types: ['path'] }, theMap)].map( + (path) => expandPath(path[1], theMap) + ) + expect(paths).toHaveLength(2) + paths.forEach((path) => { + if (err(path)) throw path + expect(path.type).toBe('path') + }) + }) + + it(`there should be 1 solid2D, just for the first closed path`, () => { + const solid2Ds = [...filterArtifacts({ types: ['solid2D'] }, theMap)] + expect(solid2Ds).toHaveLength(1) + }) + + it('there should be no extrusions', () => { + const extrusions = [...filterArtifacts({ types: ['sweep'] }, theMap)].map( + (extrusion) => expandSweep(extrusion[1], theMap) + ) + expect(extrusions).toHaveLength(0) + }) + + it('there should be 8 segments, 4 + 1 (close) from the first sketch and 3 from the second', () => { + const segments = [...filterArtifacts({ types: ['segment'] }, theMap)].map( + (segment) => expandSegment(segment[1], theMap) + ) + expect(segments).toHaveLength(8) + }) + + it('screenshot graph', async () => { + // Ostensibly this takes a screen shot of the graph of the artifactGraph + // but it's it also tests that all of the id links are correct because if one + // of the edges refers to a non-existent node, the graph will throw. + // further more we can check that each edge is bi-directional, if it's not + // by checking the arrow heads going both ways, on the graph. + await GraphTheGraph(theMap, 2000, 2000, 'exampleCodeNo3D.png') + }, 20000) + }) }) describe('capture graph of sketchOnFaceOnFace...', () => { @@ -263,11 +400,7 @@ describe('capture graph of sketchOnFaceOnFace...', () => { }) function getCommands(codeKey: CodeKey): CacheShape[CodeKey] & { ast: Program } { - const ast = parse(codeKey) - if (err(ast)) { - console.error(ast) - throw ast - } + const ast = assertParse(codeKey) const file = fs.readFileSync(fullPath, 'utf-8') const parsed: CacheShape = JSON.parse(file) // these either already exist from the last run, or were created in @@ -298,7 +431,8 @@ async function GraphTheGraph( if ( propName === 'type' || propName === 'codeRef' || - propName === 'subType' + propName === 'subType' || + propName === 'id' ) return if (Array.isArray(value)) @@ -457,7 +591,10 @@ async function GraphTheGraph( `./src/lang/std/artifactMapGraphs/${imageName}` ) // chop the top 30 pixels off the image - const originalImg = PNG.sync.read(fs.readFileSync(originalImgPath)) + const originalImgExists = fs.existsSync(originalImgPath) + const originalImg = originalImgExists + ? PNG.sync.read(fs.readFileSync(originalImgPath)) + : null // const img1Data = new Uint8Array(img1.data) // const img1DataChopped = img1Data.slice(30 * img1.width * 4) // img1.data = Buffer.from(img1DataChopped) @@ -468,10 +605,10 @@ async function GraphTheGraph( const newImageDataChopped = newImageData.slice(30 * newImage.width * 4) newImage.data = Buffer.from(newImageDataChopped) - const { width, height } = originalImg + const { width, height } = originalImg ?? newImage const diff = new PNG({ width, height }) - const imageSizeDifferent = originalImg.data.length !== newImage.data.length + const imageSizeDifferent = originalImg?.data.length !== newImage.data.length let numDiffPixels = 0 if (!imageSizeDifferent) { numDiffPixels = pixelmatch( @@ -519,11 +656,12 @@ describe('testing getArtifactsToUpdate', () => { { type: 'path', segIds: [], + id: expect.any(String), planeId: 'UUID-1', sweepId: '', codeRef: { pathToNode: [['body', '']], - range: [37, 64], + range: [37, 64, true], }, }, ]) @@ -532,20 +670,22 @@ describe('testing getArtifactsToUpdate', () => { type: 'sweep', subType: 'extrusion', pathId: expect.any(String), + id: expect.any(String), surfaceIds: [], edgeIds: [], codeRef: { - range: [231, 254], + range: [231, 254, true], pathToNode: [['body', '']], }, }, { type: 'path', + id: expect.any(String), segIds: expect.any(Array), planeId: expect.any(String), sweepId: expect.any(String), codeRef: { - range: [37, 64], + range: [37, 64, true], pathToNode: [['body', '']], }, solid2dId: expect.any(String), @@ -554,21 +694,23 @@ describe('testing getArtifactsToUpdate', () => { expect(getUpdateObjects('extend_path')).toEqual([ { type: 'segment', + id: expect.any(String), pathId: expect.any(String), surfaceId: '', edgeIds: [], codeRef: { - range: [70, 86], + range: [70, 86, true], pathToNode: [['body', '']], }, }, { type: 'path', + id: expect.any(String), segIds: expect.any(Array), planeId: expect.any(String), sweepId: expect.any(String), codeRef: { - range: [37, 64], + range: [37, 64, true], pathToNode: [['body', '']], }, solid2dId: expect.any(String), @@ -578,21 +720,23 @@ describe('testing getArtifactsToUpdate', () => { { type: 'edgeCut', subType: 'fillet', + id: expect.any(String), consumedEdgeId: expect.any(String), edgeIds: [], surfaceId: '', codeRef: { - range: [260, 299], + range: [260, 299, true], pathToNode: [['body', '']], }, }, { type: 'segment', + id: expect.any(String), pathId: expect.any(String), surfaceId: expect.any(String), edgeIds: expect.any(Array), codeRef: { - range: [92, 119], + range: [92, 119, true], pathToNode: [['body', '']], }, edgeCutId: expect.any(String), @@ -601,6 +745,7 @@ describe('testing getArtifactsToUpdate', () => { expect(getUpdateObjects('solid3d_get_extrusion_face_info')).toEqual([ { type: 'wall', + id: expect.any(String), segId: expect.any(String), edgeCutEdgeIds: [], sweepId: expect.any(String), @@ -608,27 +753,30 @@ describe('testing getArtifactsToUpdate', () => { }, { type: 'segment', + id: expect.any(String), pathId: expect.any(String), surfaceId: expect.any(String), edgeIds: expect.any(Array), codeRef: { - range: [156, 203], + range: [156, 203, true], pathToNode: [['body', '']], }, }, { type: 'sweep', subType: 'extrusion', + id: expect.any(String), pathId: expect.any(String), surfaceIds: expect.any(Array), edgeIds: expect.any(Array), codeRef: { - range: [231, 254], + range: [231, 254, true], pathToNode: [['body', '']], }, }, { type: 'wall', + id: expect.any(String), segId: expect.any(String), edgeCutEdgeIds: [], sweepId: expect.any(String), @@ -636,27 +784,30 @@ describe('testing getArtifactsToUpdate', () => { }, { type: 'segment', + id: expect.any(String), pathId: expect.any(String), surfaceId: expect.any(String), edgeIds: expect.any(Array), codeRef: { - range: [125, 150], + range: [125, 150, true], pathToNode: [['body', '']], }, }, { type: 'sweep', subType: 'extrusion', + id: expect.any(String), pathId: expect.any(String), surfaceIds: expect.any(Array), edgeIds: expect.any(Array), codeRef: { - range: [231, 254], + range: [231, 254, true], pathToNode: [['body', '']], }, }, { type: 'wall', + id: expect.any(String), segId: expect.any(String), edgeCutEdgeIds: [], sweepId: expect.any(String), @@ -664,11 +815,12 @@ describe('testing getArtifactsToUpdate', () => { }, { type: 'segment', + id: expect.any(String), pathId: expect.any(String), surfaceId: expect.any(String), edgeIds: expect.any(Array), codeRef: { - range: [92, 119], + range: [92, 119, true], pathToNode: [['body', '']], }, edgeCutId: expect.any(String), @@ -676,16 +828,18 @@ describe('testing getArtifactsToUpdate', () => { { type: 'sweep', subType: 'extrusion', + id: expect.any(String), pathId: expect.any(String), surfaceIds: expect.any(Array), edgeIds: expect.any(Array), codeRef: { - range: [231, 254], + range: [231, 254, true], pathToNode: [['body', '']], }, }, { type: 'wall', + id: expect.any(String), segId: expect.any(String), edgeCutEdgeIds: [], sweepId: expect.any(String), @@ -693,28 +847,31 @@ describe('testing getArtifactsToUpdate', () => { }, { type: 'segment', + id: expect.any(String), pathId: expect.any(String), surfaceId: expect.any(String), edgeIds: expect.any(Array), codeRef: { - range: [70, 86], + range: [70, 86, true], pathToNode: [['body', '']], }, }, { type: 'sweep', subType: 'extrusion', + id: expect.any(String), pathId: expect.any(String), surfaceIds: expect.any(Array), edgeIds: expect.any(Array), codeRef: { - range: [231, 254], + range: [231, 254, true], pathToNode: [['body', '']], }, }, { type: 'cap', subType: 'start', + id: expect.any(String), edgeCutEdgeIds: [], sweepId: expect.any(String), pathIds: [], @@ -722,17 +879,19 @@ describe('testing getArtifactsToUpdate', () => { { type: 'sweep', subType: 'extrusion', + id: expect.any(String), pathId: expect.any(String), surfaceIds: expect.any(Array), edgeIds: expect.any(Array), codeRef: { - range: [231, 254], + range: [231, 254, true], pathToNode: [['body', '']], }, }, { type: 'cap', subType: 'end', + id: expect.any(String), edgeCutEdgeIds: [], sweepId: expect.any(String), pathIds: [], @@ -740,11 +899,12 @@ describe('testing getArtifactsToUpdate', () => { { type: 'sweep', subType: 'extrusion', + id: expect.any(String), pathId: expect.any(String), surfaceIds: expect.any(Array), edgeIds: expect.any(Array), codeRef: { - range: [231, 254], + range: [231, 254, true], pathToNode: [['body', '']], }, }, diff --git a/src/lang/std/artifactGraph.ts b/src/lang/std/artifactGraph.ts index fc7625576..b7938c1fd 100644 --- a/src/lang/std/artifactGraph.ts +++ b/src/lang/std/artifactGraph.ts @@ -5,86 +5,93 @@ import { err } from 'lib/trap' export type ArtifactId = string -interface CommonCommandProperties { +interface BaseArtifact { + id: ArtifactId +} + +export interface CodeRef { range: SourceRange pathToNode: PathToNode } -export interface PlaneArtifact { +export interface PlaneArtifact extends BaseArtifact { type: 'plane' pathIds: Array - codeRef: CommonCommandProperties + codeRef: CodeRef } -export interface PlaneArtifactRich { +export interface PlaneArtifactRich extends BaseArtifact { type: 'plane' paths: Array - codeRef: CommonCommandProperties + codeRef: CodeRef } -export interface PathArtifact { +export interface PathArtifact extends BaseArtifact { type: 'path' planeId: ArtifactId segIds: Array sweepId: ArtifactId solid2dId?: ArtifactId - codeRef: CommonCommandProperties + codeRef: CodeRef } -interface solid2D { +interface solid2D extends BaseArtifact { type: 'solid2D' pathId: ArtifactId } -export interface PathArtifactRich { +export interface PathArtifactRich extends BaseArtifact { type: 'path' + /** A path must always lie on a plane */ plane: PlaneArtifact | WallArtifact + /** A path must always contain 0 or more segments */ segments: Array - sweep: SweepArtifact - codeRef: CommonCommandProperties + /** A path may not result in a sweep artifact */ + sweep?: SweepArtifact + codeRef: CodeRef } -export interface SegmentArtifact { +export interface SegmentArtifact extends BaseArtifact { type: 'segment' pathId: ArtifactId surfaceId: ArtifactId edgeIds: Array edgeCutId?: ArtifactId - codeRef: CommonCommandProperties + codeRef: CodeRef } -interface SegmentArtifactRich { +interface SegmentArtifactRich extends BaseArtifact { type: 'segment' path: PathArtifact surf: WallArtifact edges: Array edgeCut?: EdgeCut - codeRef: CommonCommandProperties + codeRef: CodeRef } /** A Sweep is a more generic term for extrude, revolve, loft and sweep*/ -interface SweepArtifact { +interface SweepArtifact extends BaseArtifact { type: 'sweep' subType: 'extrusion' | 'revolve' pathId: string surfaceIds: Array edgeIds: Array - codeRef: CommonCommandProperties + codeRef: CodeRef } -interface SweepArtifactRich { +interface SweepArtifactRich extends BaseArtifact { type: 'sweep' subType: 'extrusion' | 'revolve' path: PathArtifact surfaces: Array edges: Array - codeRef: CommonCommandProperties + codeRef: CodeRef } -interface WallArtifact { +interface WallArtifact extends BaseArtifact { type: 'wall' segId: ArtifactId edgeCutEdgeIds: Array sweepId: ArtifactId pathIds: Array } -interface CapArtifact { +interface CapArtifact extends BaseArtifact { type: 'cap' subType: 'start' | 'end' edgeCutEdgeIds: Array @@ -92,7 +99,7 @@ interface CapArtifact { pathIds: Array } -interface SweepEdge { +interface SweepEdge extends BaseArtifact { type: 'sweepEdge' segId: ArtifactId sweepId: ArtifactId @@ -100,16 +107,16 @@ interface SweepEdge { } /** A edgeCut is a more generic term for both fillet or chamfer */ -interface EdgeCut { +interface EdgeCut extends BaseArtifact { type: 'edgeCut' subType: 'fillet' | 'chamfer' consumedEdgeId: ArtifactId edgeIds: Array surfaceId: ArtifactId - codeRef: CommonCommandProperties + codeRef: CodeRef } -interface EdgeCutEdge { +interface EdgeCutEdge extends BaseArtifact { type: 'edgeCutEdge' edgeCutId: ArtifactId surfaceId: ArtifactId @@ -246,7 +253,21 @@ export function getArtifactsToUpdate({ const cmd = command.cmd const returnArr: ReturnType = [] if (!response) return returnArr - if (cmd.type === 'enable_sketch_mode') { + if (cmd.type === 'make_plane' && range[1] !== 0) { + // If we're calling `make_plane` and the code range doesn't end at `0` + // it's not a default plane, but a custom one from the offsetPlane standard library function + return [ + { + id, + artifact: { + type: 'plane', + id, + pathIds: [], + codeRef: { range, pathToNode }, + }, + }, + ] + } else if (cmd.type === 'enable_sketch_mode') { const plane = getArtifact(currentPlaneId) const pathIds = plane?.type === 'plane' ? plane?.pathIds : [] const codeRef = @@ -258,6 +279,7 @@ export function getArtifactsToUpdate({ id: currentPlaneId, artifact: { type: 'wall', + id: currentPlaneId, segId: existingPlane.segId, edgeCutEdgeIds: existingPlane.edgeCutEdgeIds, sweepId: existingPlane.sweepId, @@ -267,7 +289,10 @@ export function getArtifactsToUpdate({ ] } else { return [ - { id: currentPlaneId, artifact: { type: 'plane', pathIds, codeRef } }, + { + id: currentPlaneId, + artifact: { type: 'plane', id: currentPlaneId, pathIds, codeRef }, + }, ] } } else if (cmd.type === 'start_path') { @@ -275,6 +300,7 @@ export function getArtifactsToUpdate({ id, artifact: { type: 'path', + id, segIds: [], planeId: currentPlaneId, sweepId: '', @@ -287,7 +313,7 @@ export function getArtifactsToUpdate({ if (plane?.type === 'plane') { returnArr.push({ id: currentPlaneId, - artifact: { type: 'plane', pathIds: [id], codeRef }, + artifact: { type: 'plane', id: currentPlaneId, pathIds: [id], codeRef }, }) } if (plane?.type === 'wall') { @@ -295,6 +321,7 @@ export function getArtifactsToUpdate({ id: currentPlaneId, artifact: { type: 'wall', + id: currentPlaneId, segId: plane.segId, edgeCutEdgeIds: plane.edgeCutEdgeIds, sweepId: plane.sweepId, @@ -309,6 +336,7 @@ export function getArtifactsToUpdate({ id, artifact: { type: 'segment', + id, pathId, surfaceId: '', edgeIds: [], @@ -327,7 +355,11 @@ export function getArtifactsToUpdate({ ) { returnArr.push({ id: response.data.modeling_response.data.face_id, - artifact: { type: 'solid2D', pathId }, + artifact: { + type: 'solid2D', + id: response.data.modeling_response.data.face_id, + pathId, + }, }) const path = getArtifact(pathId) if (path?.type === 'path') @@ -347,6 +379,7 @@ export function getArtifactsToUpdate({ artifact: { type: 'sweep', subType: subType, + id, pathId: cmd.target, surfaceIds: [], edgeIds: [], @@ -378,6 +411,7 @@ export function getArtifactsToUpdate({ id: face_id, artifact: { type: 'wall', + id: face_id, segId: curve_id, edgeCutEdgeIds: [], sweepId: path.sweepId, @@ -410,6 +444,7 @@ export function getArtifactsToUpdate({ id: face_id, artifact: { type: 'cap', + id: face_id, subType: cap === 'bottom' ? 'start' : 'end', edgeCutEdgeIds: [], sweepId: path.sweepId, @@ -456,6 +491,7 @@ export function getArtifactsToUpdate({ id: response.data.modeling_response.data.edge, artifact: { type: 'sweepEdge', + id: response.data.modeling_response.data.edge, subType: cmd.type === 'solid3d_get_next_adjacent_edge' ? 'adjacent' @@ -484,6 +520,7 @@ export function getArtifactsToUpdate({ id, artifact: { type: 'edgeCut', + id, subType: cmd.cut_type, consumedEdgeId: cmd.edge_id, edgeIds: [], @@ -574,6 +611,7 @@ export function expandPlane( ) return { type: 'plane', + id: plane.id, paths: Array.from(paths.values()), codeRef: plane.codeRef, } @@ -587,13 +625,15 @@ export function expandPath( { keys: path.segIds, types: ['segment'] }, artifactGraph ) - const sweep = getArtifactOfTypes( - { - key: path.sweepId, - types: ['sweep'], - }, - artifactGraph - ) + const sweep = path.sweepId + ? getArtifactOfTypes( + { + key: path.sweepId, + types: ['sweep'], + }, + artifactGraph + ) + : undefined const plane = getArtifactOfTypes( { key: path.planeId, types: ['plane', 'wall'] }, artifactGraph @@ -602,6 +642,7 @@ export function expandPath( if (err(plane)) return plane return { type: 'path', + id: path.id, segments: Array.from(segs.values()), sweep, plane, @@ -628,7 +669,8 @@ export function expandSweep( if (err(path)) return path return { type: 'sweep', - subType: 'extrusion', + subType: sweep.subType, + id: sweep.id, surfaces: Array.from(surfs.values()), edges: Array.from(edges.values()), path, @@ -664,6 +706,7 @@ export function expandSegment( return { type: 'segment', + id: segment.id, path, surf, edges: Array.from(edges.values()), @@ -675,7 +718,7 @@ export function expandSegment( export function getCapCodeRef( cap: CapArtifact, artifactGraph: ArtifactGraph -): CommonCommandProperties | Error { +): CodeRef | Error { const sweep = getArtifactOfTypes( { key: cap.sweepId, types: ['sweep'] }, artifactGraph @@ -692,7 +735,7 @@ export function getCapCodeRef( export function getSolid2dCodeRef( solid2D: solid2D, artifactGraph: ArtifactGraph -): CommonCommandProperties | Error { +): CodeRef | Error { const path = getArtifactOfTypes( { key: solid2D.pathId, types: ['path'] }, artifactGraph @@ -704,7 +747,7 @@ export function getSolid2dCodeRef( export function getWallCodeRef( wall: WallArtifact, artifactGraph: ArtifactGraph -): CommonCommandProperties | Error { +): CodeRef | Error { const seg = getArtifactOfTypes( { key: wall.segId, types: ['segment'] }, artifactGraph @@ -716,7 +759,7 @@ export function getWallCodeRef( export function getSweepEdgeCodeRef( edge: SweepEdge, artifactGraph: ArtifactGraph -): CommonCommandProperties | Error { +): CodeRef | Error { const seg = getArtifactOfTypes( { key: edge.segId, types: ['segment'] }, artifactGraph @@ -724,10 +767,10 @@ export function getSweepEdgeCodeRef( if (err(seg)) return seg return seg.codeRef } -export function getEdgeCuteConsumedCodeRef( +export function getEdgeCutConsumedCodeRef( edge: EdgeCut, artifactGraph: ArtifactGraph -): CommonCommandProperties | Error { +): CodeRef | Error { const seg = getArtifactOfTypes( { key: edge.consumedEdgeId, types: ['segment', 'sweepEdge'] }, artifactGraph @@ -785,3 +828,64 @@ export function getSweepFromSuspectedPath( artifactGraph ) } + +export function getCodeRefsByArtifactId( + id: string, + artifactGraph: ArtifactGraph +): Array | null { + const artifact = artifactGraph.get(id) + if (artifact?.type === 'solid2D') { + const codeRef = getSolid2dCodeRef(artifact, artifactGraph) + if (err(codeRef)) return null + return [codeRef] + } else if (artifact?.type === 'cap') { + const codeRef = getCapCodeRef(artifact, artifactGraph) + if (err(codeRef)) return null + return [codeRef] + } else if (artifact?.type === 'wall') { + const extrusion = getSweepFromSuspectedSweepSurface(id, artifactGraph) + const codeRef = getWallCodeRef(artifact, artifactGraph) + if (err(codeRef)) return null + return err(extrusion) ? [codeRef] : [codeRef, extrusion.codeRef] + } else if (artifact?.type === 'sweepEdge') { + const codeRef = getSweepEdgeCodeRef(artifact, artifactGraph) + if (err(codeRef)) return null + return [codeRef] + } else if (artifact?.type === 'segment') { + return [artifact.codeRef] + } else if (artifact?.type === 'edgeCut') { + const codeRef = artifact.codeRef + const consumedCodeRef = getEdgeCutConsumedCodeRef(artifact, artifactGraph) + if (err(consumedCodeRef)) return [codeRef] + return [codeRef, consumedCodeRef] + } else if (artifact && 'codeRef' in artifact) { + return [artifact.codeRef] + } else { + return null + } +} + +export function codeRefFromRange(range: SourceRange, ast: Program): CodeRef { + return { + range, + pathToNode: getNodePathFromSourceRange(ast, range), + } +} + +/** + * Get an artifact from a code source range + */ +export function getArtifactFromRange( + range: SourceRange, + artifactGraph: ArtifactGraph +): Artifact | null { + for (const artifact of artifactGraph.values()) { + if ('codeRef' in artifact) { + const match = + artifact.codeRef?.range[0] === range[0] && + artifact.codeRef.range[1] === range[1] + if (match) return artifact + } + } + return null +} diff --git a/src/lang/std/artifactMapGraphs/exampleCode1.png b/src/lang/std/artifactMapGraphs/exampleCode1.png index c56d2030f..a8454337e 100644 Binary files a/src/lang/std/artifactMapGraphs/exampleCode1.png and b/src/lang/std/artifactMapGraphs/exampleCode1.png differ diff --git a/src/lang/std/artifactMapGraphs/exampleCodeNo3D.png b/src/lang/std/artifactMapGraphs/exampleCodeNo3D.png new file mode 100644 index 000000000..0afc93af9 Binary files /dev/null and b/src/lang/std/artifactMapGraphs/exampleCodeNo3D.png differ diff --git a/src/lang/std/artifactMapGraphs/sketchOnFaceOnFaceEtc.png b/src/lang/std/artifactMapGraphs/sketchOnFaceOnFaceEtc.png index 4a18696a8..1bec224d5 100644 Binary files a/src/lang/std/artifactMapGraphs/sketchOnFaceOnFaceEtc.png and b/src/lang/std/artifactMapGraphs/sketchOnFaceOnFaceEtc.png differ diff --git a/src/lang/std/engineConnection.ts b/src/lang/std/engineConnection.ts index 9f1ddc90f..1f7418f10 100644 --- a/src/lang/std/engineConnection.ts +++ b/src/lang/std/engineConnection.ts @@ -1,4 +1,11 @@ -import { Program, SourceRange } from 'lang/wasm' +import { + defaultRustSourceRange, + defaultSourceRange, + Program, + RustSourceRange, + SourceRange, + sourceRangeFromRust, +} from 'lang/wasm' import { VITE_KC_API_WS_MODELING_URL, VITE_KC_DEV_TOKEN } from 'env' import { Models } from '@kittycad/lib' import { exportSave } from 'lib/exportSave' @@ -28,6 +35,7 @@ import { } from 'lib/constants' import { KclManager } from 'lang/KclSingleton' import { reportRejection } from 'lib/trap' +import { markOnce } from 'lib/performance' import { MachineManager } from 'components/MachineManagerProvider' // TODO(paultag): This ought to be tweakable. @@ -330,6 +338,7 @@ class EngineConnection extends EventTarget { token?: string callbackOnEngineLiteConnect?: () => void }) { + markOnce('code/startInitialEngineConnect') super() this.engineCommandManager = engineCommandManager @@ -785,6 +794,7 @@ class EngineConnection extends EventTarget { this.dispatchEvent( new CustomEvent(EngineConnectionEvents.Opened, { detail: this }) ) + markOnce('code/endInitialEngineConnect') } this.unreliableDataChannel?.addEventListener( 'open', @@ -1299,8 +1309,8 @@ export enum EngineCommandManagerEvents { interface PendingMessage { command: EngineCommand - range: SourceRange - idToRangeMap: { [key: string]: SourceRange } + range: RustSourceRange + idToRangeMap: { [key: string]: RustSourceRange } resolve: (data: [Models['WebSocketResponse_type']]) => void reject: (reason: string) => void promise: Promise<[Models['WebSocketResponse_type']]> @@ -1395,13 +1405,7 @@ export class EngineCommandManager extends EventTarget { this._camControlsCameraChange = cb } - private getAst: () => Program = () => - ({ start: 0, end: 0, body: [], nonCodeMeta: {} } as any) - set getAstCb(cb: () => Program) { - this.getAst = cb - } private makeDefaultPlanes: () => Promise | null = () => null - private modifyGrid: (hidden: boolean) => Promise | null = () => null private onEngineConnectionOpened = () => {} private onEngineConnectionClosed = () => {} @@ -1434,7 +1438,6 @@ export class EngineCommandManager extends EventTarget { height, token, makeDefaultPlanes, - modifyGrid, settings = { pool: null, theme: Themes.Dark, @@ -1454,14 +1457,12 @@ export class EngineCommandManager extends EventTarget { height: number token?: string makeDefaultPlanes: () => Promise - modifyGrid: (hidden: boolean) => Promise settings?: SettingsViaQueryString }) { if (settings) { this.settings = settings } this.makeDefaultPlanes = makeDefaultPlanes - this.modifyGrid = modifyGrid if (width === 0 || height === 0) { return } @@ -1541,21 +1542,15 @@ export class EngineCommandManager extends EventTarget { type: 'default_camera_get_settings', }, }) - // We want modify the grid first because we don't want it to flash. - // Ideally these would already be default hidden in engine (TODO do - // that) https://github.com/KittyCAD/engine/issues/2282 - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.modifyGrid(!this.settings.showScaleGrid)?.then(async () => { - await this.initPlanes() - setIsStreamReady(true) + await this.initPlanes() + setIsStreamReady(true) - // Other parts of the application should use this to react on scene ready. - this.dispatchEvent( - new CustomEvent(EngineCommandManagerEvents.SceneReady, { - detail: this.engineConnection, - }) - ) - }) + // Other parts of the application should use this to react on scene ready. + this.dispatchEvent( + new CustomEvent(EngineCommandManagerEvents.SceneReady, { + detail: this.engineConnection, + }) + ) } this.engineConnection.addEventListener( @@ -1628,7 +1623,11 @@ export class EngineCommandManager extends EventTarget { switch (this.exportInfo.intent) { case ExportIntent.Save: { - exportSave(event.data, this.pendingExport.toastId).then(() => { + exportSave({ + data: event.data, + fileName: this.exportInfo.name, + toastId: this.pendingExport.toastId, + }).then(() => { this.pendingExport?.resolve(null) }, this.pendingExport?.reject) break @@ -1877,17 +1876,6 @@ export class EngineCommandManager extends EventTarget { } return JSON.stringify(this.defaultPlanes) } - endSession() { - const deleteCmd: EngineCommand = { - type: 'modeling_cmd_req', - cmd_id: uuidv4(), - cmd: { - type: 'scene_clear_all', - }, - } - this.clearDefaultPlanes() - this.engineConnection?.send(deleteCmd) - } addCommandLog(message: CommandLog) { if (this.commandLogs.length > 500) { this.commandLogs.shift() @@ -2012,7 +2000,7 @@ export class EngineCommandManager extends EventTarget { { command, idToRangeMap: {}, - range: [0, 0], + range: defaultRustSourceRange(), }, true // isSceneCommand ) @@ -2043,9 +2031,9 @@ export class EngineCommandManager extends EventTarget { return Promise.reject(new Error('rangeStr is undefined')) if (commandStr === undefined) return Promise.reject(new Error('commandStr is undefined')) - const range: SourceRange = JSON.parse(rangeStr) + const range: RustSourceRange = JSON.parse(rangeStr) const command: EngineCommand = JSON.parse(commandStr) - const idToRangeMap: { [key: string]: SourceRange } = + const idToRangeMap: { [key: string]: RustSourceRange } = JSON.parse(idToRangeStr) // Current executeAst is stale, going to interrupt, a new executeAst will trigger @@ -2088,10 +2076,14 @@ export class EngineCommandManager extends EventTarget { if (message.command.type === 'modeling_cmd_req') { this.orderedCommands.push({ command: message.command, - range: message.range, + range: sourceRangeFromRust(message.range), }) } else if (message.command.type === 'modeling_cmd_batch_req') { message.command.requests.forEach((req) => { + const cmdId = req.cmd_id || '' + const range = cmdId + ? sourceRangeFromRust(message.idToRangeMap[cmdId]) + : defaultSourceRange() const cmd: EngineCommand = { type: 'modeling_cmd_req', cmd_id: req.cmd_id, @@ -2099,7 +2091,7 @@ export class EngineCommandManager extends EventTarget { } this.orderedCommands.push({ command: cmd, - range: message.idToRangeMap[req.cmd_id || ''], + range, }) }) } @@ -2118,13 +2110,18 @@ export class EngineCommandManager extends EventTarget { * When an execution takes place we want to wait until we've got replies for all of the commands * When this is done when we build the artifact map synchronously. */ - async waitForAllCommands() { - await Promise.all(Object.values(this.pendingCommands).map((a) => a.promise)) + waitForAllCommands() { + return Promise.all( + Object.values(this.pendingCommands).map((a) => a.promise) + ) + } + updateArtifactGraph(ast: Program) { this.artifactGraph = createArtifactGraph({ orderedCommands: this.orderedCommands, responseMap: this.responseMap, - ast: this.getAst(), + ast, }) + // TODO check if these still need to be deferred once e2e tests are working again. if (this.artifactGraph.size) { this.deferredArtifactEmptied(null) } else { @@ -2209,15 +2206,6 @@ export class EngineCommandManager extends EventTarget { }).catch(reportRejection) } - /** - * Set the visibility of the scale grid in the engine scene. - * @param visible - whether to show or hide the scale grid - */ - setScaleGridVisibility(visible: boolean) { - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.modifyGrid(!visible) - } - // Some "objects" have the same source range, such as sketch_mode_start and start_path. // So when passing a range, we need to also specify the command type mapRangeToObjectId( diff --git a/src/lang/std/sketch.test.ts b/src/lang/std/sketch.test.ts index 37ca212c7..60dd3f4ed 100644 --- a/src/lang/std/sketch.test.ts +++ b/src/lang/std/sketch.test.ts @@ -8,7 +8,7 @@ import { getConstraintInfo, } from './sketch' import { - parse, + assertParse, recast, initPromise, SourceRange, @@ -17,6 +17,7 @@ import { import { getNodeFromPath, getNodePathFromSourceRange } from '../queryAst' import { enginelessExecutor } from '../../lib/testHelpers' import { err } from 'lib/trap' +import { Node } from 'wasm-lib/kcl/bindings/Node' const eachQuad: [number, [number, number]][] = [ [-315, [1, 1]], @@ -114,8 +115,7 @@ describe('testing changeSketchArguments', () => { ` const code = genCode(lineToChange) const expectedCode = genCode(lineAfterChange) - const ast = parse(code) - if (err(ast)) return ast + const ast = assertParse(code) const execState = await enginelessExecutor(ast) const sourceStart = code.indexOf(lineToChange) @@ -124,7 +124,7 @@ describe('testing changeSketchArguments', () => { execState.memory, { type: 'sourceRange', - sourceRange: [sourceStart, sourceStart + lineToChange.length], + sourceRange: [sourceStart, sourceStart + lineToChange.length, true], }, { type: 'straight-segment', @@ -147,8 +147,7 @@ mySketch001 = startSketchOn('XY') // |> rx(45, %) |> lineTo([-1.59, -1.54], %) |> lineTo([0.46, -5.82], %)` - const ast = parse(code) - if (err(ast)) return ast + const ast = assertParse(code) const execState = await enginelessExecutor(ast) const sourceStart = code.indexOf(lineToChange) @@ -165,8 +164,7 @@ mySketch001 = startSketchOn('XY') pathToNode: [ ['body', ''], [0, 'index'], - ['declarations', 'VariableDeclaration'], - [0, 'index'], + ['declaration', 'VariableDeclaration'], ['init', 'VariableDeclarator'], ], }) @@ -190,8 +188,7 @@ mySketch001 = startSketchOn('XY') pathToNode: [ ['body', ''], [0, 'index'], - ['declarations', 'VariableDeclaration'], - [0, 'index'], + ['declaration', 'VariableDeclaration'], ['init', 'VariableDeclarator'], ], }) @@ -219,12 +216,13 @@ describe('testing addTagForSketchOnFace', () => { |> lineTo([0.46, -5.82], %) ` const code = genCode(originalLine) - const ast = parse(code) + const ast = assertParse(code) await enginelessExecutor(ast) const sourceStart = code.indexOf(originalLine) - const sourceRange: [number, number] = [ + const sourceRange: [number, number, boolean] = [ sourceStart, sourceStart + originalLine.length, + true, ] if (err(ast)) return ast const pathToNode = getNodePathFromSourceRange(ast, sourceRange) @@ -247,26 +245,26 @@ describe('testing addTagForSketchOnFace', () => { { desc: 'chamfer in pipeExpr', originalChamfer: ` |> chamfer({ - length: 30, - tags: [seg01, getOppositeEdge(seg01)] + length = 30, + tags = [seg01, getOppositeEdge(seg01)] }, %)`, expectedChamfer: ` |> chamfer({ - length: 30, - tags: [getOppositeEdge(seg01)] + length = 30, + tags = [getOppositeEdge(seg01)] }, %, $seg03) - |> chamfer({ length: 30, tags: [seg01] }, %)`, + |> chamfer({ length = 30, tags = [seg01] }, %)`, }, { desc: 'chamfer with its own variable', originalChamfer: `chamf = chamfer({ - length: 30, - tags: [seg01, getOppositeEdge(seg01)] + length = 30, + tags = [seg01, getOppositeEdge(seg01)] }, extrude001)`, expectedChamfer: `chamf = chamfer({ - length: 30, - tags: [getOppositeEdge(seg01)] + length = 30, + tags = [getOppositeEdge(seg01)] }, extrude001, $seg03) - |> chamfer({ length: 30, tags: [seg01] }, %)`, + |> chamfer({ length = 30, tags = [seg01] }, %)`, }, // Add more test cases here if needed ] as const @@ -290,13 +288,14 @@ extrude001 = extrude(100, sketch001) ${insertCode} ` const code = genCode(originalChamfer) - const ast = parse(code) + const ast = assertParse(code) await enginelessExecutor(ast) const sourceStart = code.indexOf(originalChamfer) const extraChars = originalChamfer.indexOf('chamfer') - const sourceRange: [number, number] = [ + const sourceRange: [number, number, boolean] = [ sourceStart + extraChars, sourceStart + originalChamfer.length - extraChars, + true, ] if (err(ast)) throw ast @@ -328,37 +327,37 @@ describe('testing getConstraintInfo', () => { |> startProfileAt([0,0], %) |> line([3, 4], %) |> angledLine({ - angle: 3.14, - length: 3.14, + angle = 3.14, + length = 3.14, }, %) |> lineTo([6.14, 3.14], %) |> xLineTo(8, %) |> yLineTo(5, %) - |> yLine(3.14, %, 'a') + |> yLine(3.14, %, $a) |> xLine(3.14, %) |> angledLineOfXLength({ - angle: 3.14, - length: 3.14, + angle = 3.14, + length = 3.14, }, %) |> angledLineOfYLength({ - angle: 30, - length: 3, + angle = 30, + length = 3, }, %) |> angledLineToX({ - angle: 12.14, - to: 12, + angle = 12.14, + to = 12, }, %) |> angledLineToY({ - angle: 30, - to: 10.14, + angle = 30, + to = 10.14, }, %) |> angledLineThatIntersects({ - angle: 3.14, - intersectTag: 'a', - offset: 0 + angle = 3.14, + intersectTag = a, + offset = 0 }, %) |> tangentialArcTo([3.14, 13.14], %)` - const ast = parse(code) + const ast = assertParse(code) test.each([ [ 'line', @@ -367,7 +366,7 @@ describe('testing getConstraintInfo', () => { type: 'xRelative', isConstrained: false, value: '3', - sourceRange: [78, 79], + sourceRange: [78, 79, true], argPosition: { type: 'arrayItem', index: 0 }, pathToNode: expect.any(Array), stdLibFnName: 'line', @@ -376,7 +375,7 @@ describe('testing getConstraintInfo', () => { type: 'yRelative', isConstrained: false, value: '4', - sourceRange: [81, 82], + sourceRange: [81, 82, true], argPosition: { type: 'arrayItem', index: 1 }, pathToNode: expect.any(Array), stdLibFnName: 'line', @@ -390,7 +389,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: false, value: '3.14', - sourceRange: [117, 121], + sourceRange: [118, 122, true], argPosition: { type: 'objectProperty', key: 'angle' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLine', @@ -399,7 +398,7 @@ describe('testing getConstraintInfo', () => { type: 'length', isConstrained: false, value: '3.14', - sourceRange: [135, 139], + sourceRange: [137, 141, true], argPosition: { type: 'objectProperty', key: 'length' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLine', @@ -413,7 +412,7 @@ describe('testing getConstraintInfo', () => { type: 'xAbsolute', isConstrained: false, value: '6.14', - sourceRange: [162, 166], + sourceRange: [164, 168, true], argPosition: { type: 'arrayItem', index: 0 }, pathToNode: expect.any(Array), stdLibFnName: 'lineTo', @@ -422,7 +421,7 @@ describe('testing getConstraintInfo', () => { type: 'yAbsolute', isConstrained: false, value: '3.14', - sourceRange: [168, 172], + sourceRange: [170, 174, true], argPosition: { type: 'arrayItem', index: 1 }, pathToNode: expect.any(Array), stdLibFnName: 'lineTo', @@ -436,7 +435,7 @@ describe('testing getConstraintInfo', () => { type: 'horizontal', isConstrained: true, value: 'xLineTo', - sourceRange: [183, 190], + sourceRange: [185, 192, true], argPosition: undefined, pathToNode: expect.any(Array), stdLibFnName: 'xLineTo', @@ -445,7 +444,7 @@ describe('testing getConstraintInfo', () => { type: 'xAbsolute', isConstrained: false, value: '8', - sourceRange: [191, 192], + sourceRange: [193, 194, true], argPosition: { type: 'singleValue' }, pathToNode: expect.any(Array), stdLibFnName: 'xLineTo', @@ -459,7 +458,7 @@ describe('testing getConstraintInfo', () => { type: 'vertical', isConstrained: true, value: 'yLineTo', - sourceRange: [202, 209], + sourceRange: [204, 211, true], argPosition: undefined, pathToNode: expect.any(Array), stdLibFnName: 'yLineTo', @@ -468,7 +467,7 @@ describe('testing getConstraintInfo', () => { type: 'yAbsolute', isConstrained: false, value: '5', - sourceRange: [210, 211], + sourceRange: [212, 213, true], argPosition: { type: 'singleValue' }, pathToNode: expect.any(Array), stdLibFnName: 'yLineTo', @@ -482,7 +481,7 @@ describe('testing getConstraintInfo', () => { type: 'vertical', isConstrained: true, value: 'yLine', - sourceRange: [221, 226], + sourceRange: [223, 228, true], argPosition: undefined, pathToNode: expect.any(Array), stdLibFnName: 'yLine', @@ -491,7 +490,7 @@ describe('testing getConstraintInfo', () => { type: 'yRelative', isConstrained: false, value: '3.14', - sourceRange: [227, 231], + sourceRange: [229, 233, true], argPosition: { type: 'singleValue' }, pathToNode: expect.any(Array), stdLibFnName: 'yLine', @@ -505,7 +504,7 @@ describe('testing getConstraintInfo', () => { type: 'horizontal', isConstrained: true, value: 'xLine', - sourceRange: [246, 251], + sourceRange: [247, 252, true], argPosition: undefined, pathToNode: expect.any(Array), stdLibFnName: 'xLine', @@ -514,7 +513,7 @@ describe('testing getConstraintInfo', () => { type: 'xRelative', isConstrained: false, value: '3.14', - sourceRange: [252, 256], + sourceRange: [253, 257, true], argPosition: { type: 'singleValue' }, pathToNode: expect.any(Array), stdLibFnName: 'xLine', @@ -528,7 +527,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: false, value: '3.14', - sourceRange: [299, 303], + sourceRange: [301, 305, true], argPosition: { type: 'objectProperty', key: 'angle' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineOfXLength', @@ -537,7 +536,7 @@ describe('testing getConstraintInfo', () => { type: 'xRelative', isConstrained: false, value: '3.14', - sourceRange: [317, 321], + sourceRange: [320, 324, true], argPosition: { type: 'objectProperty', key: 'length' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineOfXLength', @@ -551,7 +550,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: false, value: '30', - sourceRange: [369, 371], + sourceRange: [373, 375, true], argPosition: { type: 'objectProperty', key: 'angle' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineOfYLength', @@ -560,7 +559,7 @@ describe('testing getConstraintInfo', () => { type: 'yRelative', isConstrained: false, value: '3', - sourceRange: [385, 386], + sourceRange: [390, 391, true], argPosition: { type: 'objectProperty', key: 'length' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineOfYLength', @@ -574,7 +573,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: false, value: '12.14', - sourceRange: [428, 433], + sourceRange: [434, 439, true], argPosition: { type: 'objectProperty', key: 'angle' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineToX', @@ -583,7 +582,7 @@ describe('testing getConstraintInfo', () => { type: 'xAbsolute', isConstrained: false, value: '12', - sourceRange: [443, 445], + sourceRange: [450, 452, true], argPosition: { type: 'objectProperty', key: 'to' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineToX', @@ -597,7 +596,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: false, value: '30', - sourceRange: [487, 489], + sourceRange: [495, 497, true], argPosition: { type: 'objectProperty', key: 'angle' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineToY', @@ -606,7 +605,7 @@ describe('testing getConstraintInfo', () => { type: 'yAbsolute', isConstrained: false, value: '10.14', - sourceRange: [499, 504], + sourceRange: [508, 513, true], argPosition: { type: 'objectProperty', key: 'to' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineToY', @@ -620,7 +619,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: false, value: '3.14', - sourceRange: [557, 561], + sourceRange: [567, 571, true], argPosition: { type: 'objectProperty', key: 'angle' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineThatIntersects', @@ -629,7 +628,7 @@ describe('testing getConstraintInfo', () => { type: 'intersectionOffset', isConstrained: false, value: '0', - sourceRange: [598, 599], + sourceRange: [608, 609, true], argPosition: { type: 'objectProperty', key: 'offset' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineThatIntersects', @@ -637,8 +636,8 @@ describe('testing getConstraintInfo', () => { { type: 'intersectionTag', isConstrained: false, - value: "'a'", - sourceRange: [581, 584], + value: 'a', + sourceRange: [592, 593, true], argPosition: { key: 'intersectTag', type: 'objectProperty', @@ -655,7 +654,7 @@ describe('testing getConstraintInfo', () => { type: 'tangentialWithPrevious', isConstrained: true, value: 'tangentialArcTo', - sourceRange: [613, 628], + sourceRange: [623, 638, true], argPosition: undefined, pathToNode: expect.any(Array), stdLibFnName: 'tangentialArcTo', @@ -664,7 +663,7 @@ describe('testing getConstraintInfo', () => { type: 'xAbsolute', isConstrained: false, value: '3.14', - sourceRange: [630, 634], + sourceRange: [640, 644, true], argPosition: { type: 'arrayItem', index: 0 }, pathToNode: expect.any(Array), stdLibFnName: 'tangentialArcTo', @@ -673,7 +672,7 @@ describe('testing getConstraintInfo', () => { type: 'yAbsolute', isConstrained: false, value: '13.14', - sourceRange: [636, 641], + sourceRange: [646, 651, true], argPosition: { type: 'arrayItem', index: 1 }, pathToNode: expect.any(Array), stdLibFnName: 'tangentialArcTo', @@ -684,10 +683,11 @@ describe('testing getConstraintInfo', () => { const sourceRange: SourceRange = [ code.indexOf(functionName), code.indexOf(functionName) + functionName.length, + true, ] if (err(ast)) return ast const pathToNode = getNodePathFromSourceRange(ast, sourceRange) - const callExp = getNodeFromPath( + const callExp = getNodeFromPath>( ast, pathToNode, 'CallExpression' @@ -705,19 +705,19 @@ describe('testing getConstraintInfo', () => { |> lineTo([6.14, 3.14], %) |> xLineTo(8, %) |> yLineTo(5, %) - |> yLine(3.14, %, 'a') + |> yLine(3.14, %, $a) |> xLine(3.14, %) |> angledLineOfXLength([3.14, 3.14], %) |> angledLineOfYLength([30, 3], %) |> angledLineToX([12, 12], %) |> angledLineToY([30, 10], %) |> angledLineThatIntersects({ - angle: 3.14, - intersectTag: 'a', - offset: 0 + angle = 3.14, + intersectTag = a, + offset = 0 }, %) |> tangentialArcTo([3.14, 13.14], %)` - const ast = parse(code) + const ast = assertParse(code) test.each([ [ `angledLine(`, @@ -726,7 +726,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: false, value: '3.14', - sourceRange: [112, 116], + sourceRange: [112, 116, true], argPosition: { type: 'arrayItem', index: 0 }, pathToNode: expect.any(Array), stdLibFnName: 'angledLine', @@ -735,7 +735,7 @@ describe('testing getConstraintInfo', () => { type: 'length', isConstrained: false, value: '3.14', - sourceRange: [118, 122], + sourceRange: [118, 122, true], argPosition: { type: 'arrayItem', index: 1 }, pathToNode: expect.any(Array), stdLibFnName: 'angledLine', @@ -749,7 +749,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: false, value: '3.14', - sourceRange: [278, 282], + sourceRange: [277, 281, true], argPosition: { type: 'arrayItem', index: 0 }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineOfXLength', @@ -758,7 +758,7 @@ describe('testing getConstraintInfo', () => { type: 'xRelative', isConstrained: false, value: '3.14', - sourceRange: [284, 288], + sourceRange: [283, 287, true], argPosition: { type: 'arrayItem', index: 1 }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineOfXLength', @@ -772,7 +772,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: false, value: '30', - sourceRange: [322, 324], + sourceRange: [321, 323, true], argPosition: { type: 'arrayItem', index: 0 }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineOfYLength', @@ -781,7 +781,7 @@ describe('testing getConstraintInfo', () => { type: 'yRelative', isConstrained: false, value: '3', - sourceRange: [326, 327], + sourceRange: [325, 326, true], argPosition: { type: 'arrayItem', index: 1 }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineOfYLength', @@ -795,7 +795,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: false, value: '12', - sourceRange: [355, 357], + sourceRange: [354, 356, true], argPosition: { type: 'arrayItem', index: 0 }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineToX', @@ -804,7 +804,7 @@ describe('testing getConstraintInfo', () => { type: 'xAbsolute', isConstrained: false, value: '12', - sourceRange: [359, 361], + sourceRange: [358, 360, true], argPosition: { type: 'arrayItem', index: 1 }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineToX', @@ -818,7 +818,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: false, value: '30', - sourceRange: [389, 391], + sourceRange: [388, 390, true], argPosition: { type: 'arrayItem', index: 0 }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineToY', @@ -827,7 +827,7 @@ describe('testing getConstraintInfo', () => { type: 'yAbsolute', isConstrained: false, value: '10', - sourceRange: [393, 395], + sourceRange: [392, 394, true], argPosition: { type: 'arrayItem', index: 1 }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineToY', @@ -838,10 +838,11 @@ describe('testing getConstraintInfo', () => { const sourceRange: SourceRange = [ code.indexOf(functionName), code.indexOf(functionName) + functionName.length, + true, ] if (err(ast)) return ast const pathToNode = getNodePathFromSourceRange(ast, sourceRange) - const callExp = getNodeFromPath( + const callExp = getNodeFromPath>( ast, pathToNode, 'CallExpression' @@ -855,23 +856,23 @@ describe('testing getConstraintInfo', () => { const code = `const part001 = startSketchOn('-XZ') |> startProfileAt([0, 0], %) |> line([3 + 0, 4 + 0], %) - |> angledLine({ angle: 3.14 + 0, length: 3.14 + 0 }, %) + |> angledLine({ angle = 3.14 + 0, length = 3.14 + 0 }, %) |> lineTo([6.14 + 0, 3.14 + 0], %) |> xLineTo(8 + 0, %) |> yLineTo(5 + 0, %) - |> yLine(3.14 + 0, %, 'a') + |> yLine(3.14 + 0, %, $a) |> xLine(3.14 + 0, %) - |> angledLineOfXLength({ angle: 3.14 + 0, length: 3.14 + 0 }, %) - |> angledLineOfYLength({ angle: 30 + 0, length: 3 + 0 }, %) - |> angledLineToX({ angle: 12.14 + 0, to: 12 + 0 }, %) - |> angledLineToY({ angle: 30 + 0, to: 10.14 + 0 }, %) + |> angledLineOfXLength({ angle = 3.14 + 0, length = 3.14 + 0 }, %) + |> angledLineOfYLength({ angle = 30 + 0, length = 3 + 0 }, %) + |> angledLineToX({ angle = 12.14 + 0, to = 12 + 0 }, %) + |> angledLineToY({ angle = 30 + 0, to = 10.14 + 0 }, %) |> angledLineThatIntersects({ - angle: 3.14 + 0, - intersectTag: 'a', - offset: 0 + 0 + angle = 3.14 + 0, + intersectTag = a, + offset = 0 + 0 }, %) |> tangentialArcTo([3.14 + 0, 13.14 + 0], %)` - const ast = parse(code) + const ast = assertParse(code) test.each([ [ 'line', @@ -880,7 +881,7 @@ describe('testing getConstraintInfo', () => { type: 'xRelative', isConstrained: true, value: '3 + 0', - sourceRange: [83, 88], + sourceRange: [83, 88, true], argPosition: { type: 'arrayItem', index: 0 }, pathToNode: expect.any(Array), stdLibFnName: 'line', @@ -889,7 +890,7 @@ describe('testing getConstraintInfo', () => { type: 'yRelative', isConstrained: true, value: '4 + 0', - sourceRange: [90, 95], + sourceRange: [90, 95, true], argPosition: { type: 'arrayItem', index: 1 }, pathToNode: expect.any(Array), stdLibFnName: 'line', @@ -903,7 +904,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: true, value: '3.14 + 0', - sourceRange: [128, 136], + sourceRange: [129, 137, true], argPosition: { type: 'objectProperty', key: 'angle' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLine', @@ -912,7 +913,7 @@ describe('testing getConstraintInfo', () => { type: 'length', isConstrained: true, value: '3.14 + 0', - sourceRange: [146, 154], + sourceRange: [148, 156, true], argPosition: { type: 'objectProperty', key: 'length' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLine', @@ -926,7 +927,7 @@ describe('testing getConstraintInfo', () => { type: 'xAbsolute', isConstrained: true, value: '6.14 + 0', - sourceRange: [176, 184], + sourceRange: [178, 186, true], argPosition: { type: 'arrayItem', index: 0 }, pathToNode: expect.any(Array), stdLibFnName: 'lineTo', @@ -935,7 +936,7 @@ describe('testing getConstraintInfo', () => { type: 'yAbsolute', isConstrained: true, value: '3.14 + 0', - sourceRange: [186, 194], + sourceRange: [188, 196, true], argPosition: { type: 'arrayItem', index: 1 }, pathToNode: expect.any(Array), stdLibFnName: 'lineTo', @@ -949,7 +950,7 @@ describe('testing getConstraintInfo', () => { type: 'horizontal', isConstrained: true, value: 'xLineTo', - sourceRange: [207, 214], + sourceRange: [209, 216, true], argPosition: undefined, pathToNode: expect.any(Array), stdLibFnName: 'xLineTo', @@ -958,7 +959,7 @@ describe('testing getConstraintInfo', () => { type: 'xAbsolute', isConstrained: true, value: '8 + 0', - sourceRange: [215, 220], + sourceRange: [217, 222, true], argPosition: { type: 'singleValue' }, pathToNode: expect.any(Array), stdLibFnName: 'xLineTo', @@ -972,7 +973,7 @@ describe('testing getConstraintInfo', () => { type: 'vertical', isConstrained: true, value: 'yLineTo', - sourceRange: [232, 239], + sourceRange: [234, 241, true], argPosition: undefined, pathToNode: expect.any(Array), stdLibFnName: 'yLineTo', @@ -981,7 +982,7 @@ describe('testing getConstraintInfo', () => { type: 'yAbsolute', isConstrained: true, value: '5 + 0', - sourceRange: [240, 245], + sourceRange: [242, 247, true], argPosition: { type: 'singleValue' }, pathToNode: expect.any(Array), stdLibFnName: 'yLineTo', @@ -995,7 +996,7 @@ describe('testing getConstraintInfo', () => { type: 'vertical', isConstrained: true, value: 'yLine', - sourceRange: [257, 262], + sourceRange: [259, 264, true], argPosition: undefined, pathToNode: expect.any(Array), stdLibFnName: 'yLine', @@ -1004,7 +1005,7 @@ describe('testing getConstraintInfo', () => { type: 'yRelative', isConstrained: true, value: '3.14 + 0', - sourceRange: [263, 271], + sourceRange: [265, 273, true], argPosition: { type: 'singleValue' }, pathToNode: expect.any(Array), stdLibFnName: 'yLine', @@ -1018,7 +1019,7 @@ describe('testing getConstraintInfo', () => { type: 'horizontal', isConstrained: true, value: 'xLine', - sourceRange: [288, 293], + sourceRange: [289, 294, true], argPosition: undefined, pathToNode: expect.any(Array), stdLibFnName: 'xLine', @@ -1027,7 +1028,7 @@ describe('testing getConstraintInfo', () => { type: 'xRelative', isConstrained: true, value: '3.14 + 0', - sourceRange: [294, 302], + sourceRange: [295, 303, true], argPosition: { type: 'singleValue' }, pathToNode: expect.any(Array), stdLibFnName: 'xLine', @@ -1041,7 +1042,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: true, value: '3.14 + 0', - sourceRange: [343, 351], + sourceRange: [345, 353, true], argPosition: { type: 'objectProperty', key: 'angle' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineOfXLength', @@ -1050,7 +1051,7 @@ describe('testing getConstraintInfo', () => { type: 'xRelative', isConstrained: true, value: '3.14 + 0', - sourceRange: [361, 369], + sourceRange: [364, 372, true], argPosition: { type: 'objectProperty', key: 'length' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineOfXLength', @@ -1064,7 +1065,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: true, value: '30 + 0', - sourceRange: [412, 418], + sourceRange: [416, 422, true], argPosition: { type: 'objectProperty', key: 'angle' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineOfYLength', @@ -1073,7 +1074,7 @@ describe('testing getConstraintInfo', () => { type: 'yRelative', isConstrained: true, value: '3 + 0', - sourceRange: [428, 433], + sourceRange: [433, 438, true], argPosition: { type: 'objectProperty', key: 'length' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineOfYLength', @@ -1087,7 +1088,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: true, value: '12.14 + 0', - sourceRange: [470, 479], + sourceRange: [476, 485, true], argPosition: { type: 'objectProperty', key: 'angle' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineToX', @@ -1096,7 +1097,7 @@ describe('testing getConstraintInfo', () => { type: 'xAbsolute', isConstrained: true, value: '12 + 0', - sourceRange: [485, 491], + sourceRange: [492, 498, true], argPosition: { type: 'objectProperty', key: 'to' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineToX', @@ -1110,7 +1111,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: true, value: '30 + 0', - sourceRange: [528, 534], + sourceRange: [536, 542, true], argPosition: { type: 'objectProperty', key: 'angle' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineToY', @@ -1119,7 +1120,7 @@ describe('testing getConstraintInfo', () => { type: 'yAbsolute', isConstrained: true, value: '10.14 + 0', - sourceRange: [540, 549], + sourceRange: [549, 558, true], argPosition: { type: 'objectProperty', key: 'to' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineToY', @@ -1133,7 +1134,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: true, value: '3.14 + 0', - sourceRange: [606, 614], + sourceRange: [616, 624, true], argPosition: { type: 'objectProperty', key: 'angle' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineThatIntersects', @@ -1142,7 +1143,7 @@ describe('testing getConstraintInfo', () => { type: 'intersectionOffset', isConstrained: true, value: '0 + 0', - sourceRange: [661, 666], + sourceRange: [671, 676, true], argPosition: { type: 'objectProperty', key: 'offset' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineThatIntersects', @@ -1150,8 +1151,8 @@ describe('testing getConstraintInfo', () => { { type: 'intersectionTag', isConstrained: false, - value: "'a'", - sourceRange: [639, 642], + value: 'a', + sourceRange: [650, 651, true], argPosition: { key: 'intersectTag', type: 'objectProperty' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineThatIntersects', @@ -1165,7 +1166,7 @@ describe('testing getConstraintInfo', () => { type: 'tangentialWithPrevious', isConstrained: true, value: 'tangentialArcTo', - sourceRange: [687, 702], + sourceRange: [697, 712, true], argPosition: undefined, pathToNode: expect.any(Array), stdLibFnName: 'tangentialArcTo', @@ -1174,7 +1175,7 @@ describe('testing getConstraintInfo', () => { type: 'xAbsolute', isConstrained: true, value: '3.14 + 0', - sourceRange: [704, 712], + sourceRange: [714, 722, true], argPosition: { type: 'arrayItem', index: 0 }, pathToNode: expect.any(Array), stdLibFnName: 'tangentialArcTo', @@ -1183,7 +1184,7 @@ describe('testing getConstraintInfo', () => { type: 'yAbsolute', isConstrained: true, value: '13.14 + 0', - sourceRange: [714, 723], + sourceRange: [724, 733, true], argPosition: { type: 'arrayItem', index: 1 }, pathToNode: expect.any(Array), stdLibFnName: 'tangentialArcTo', @@ -1194,10 +1195,11 @@ describe('testing getConstraintInfo', () => { const sourceRange: SourceRange = [ code.indexOf(functionName), code.indexOf(functionName) + functionName.length, + true, ] if (err(ast)) return ast const pathToNode = getNodePathFromSourceRange(ast, sourceRange) - const callExp = getNodeFromPath( + const callExp = getNodeFromPath>( ast, pathToNode, 'CallExpression' diff --git a/src/lang/std/sketch.ts b/src/lang/std/sketch.ts index f1fb7699d..947db85c7 100644 --- a/src/lang/std/sketch.ts +++ b/src/lang/std/sketch.ts @@ -55,6 +55,7 @@ import { err } from 'lib/trap' import { perpendicularDistance } from 'sketch-helpers' import { TagDeclarator } from 'wasm-lib/kcl/bindings/TagDeclarator' import { EdgeCutInfo } from 'machines/modelingMachine' +import { Node } from 'wasm-lib/kcl/bindings/Node' const STRAIGHT_SEGMENT_ERR = new Error( 'Invalid input, expected "straight-segment"' @@ -221,7 +222,7 @@ const commonConstraintInfoHelper = ( code.slice(input1.start, input1.end), stdLibFnName, isArr ? abbreviatedInputs[0].arrayInput : abbreviatedInputs[0].objInput, - [input1.start, input1.end], + [input1.start, input1.end, true], pathToFirstArg ) ) @@ -233,7 +234,7 @@ const commonConstraintInfoHelper = ( code.slice(input2.start, input2.end), stdLibFnName, isArr ? abbreviatedInputs[1].arrayInput : abbreviatedInputs[1].objInput, - [input2.start, input2.end], + [input2.start, input2.end, true], pathToSecondArg ) ) @@ -265,7 +266,7 @@ const horzVertConstraintInfoHelper = ( callee.name, stdLibFnName, undefined, - [callee.start, callee.end], + [callee.start, callee.end, true], pathToCallee ), constrainInfo( @@ -274,7 +275,7 @@ const horzVertConstraintInfoHelper = ( code.slice(firstArg.start, firstArg.end), stdLibFnName, abbreviatedInput, - [firstArg.start, firstArg.end], + [firstArg.start, firstArg.end, true], pathToFirstArg ), ] @@ -904,7 +905,7 @@ export const tangentialArcTo: SketchLineHelper = { callee.name, 'tangentialArcTo', undefined, - [callee.start, callee.end], + [callee.start, callee.end, true], pathToCallee ), constrainInfo( @@ -913,7 +914,7 @@ export const tangentialArcTo: SketchLineHelper = { code.slice(firstArg.elements[0].start, firstArg.elements[0].end), 'tangentialArcTo', 0, - [firstArg.elements[0].start, firstArg.elements[0].end], + [firstArg.elements[0].start, firstArg.elements[0].end, true], pathToFirstArg ), constrainInfo( @@ -922,7 +923,7 @@ export const tangentialArcTo: SketchLineHelper = { code.slice(firstArg.elements[1].start, firstArg.elements[1].end), 'tangentialArcTo', 1, - [firstArg.elements[1].start, firstArg.elements[1].end], + [firstArg.elements[1].start, firstArg.elements[1].end, true], pathToSecondArg ), ] @@ -1051,7 +1052,7 @@ export const circle: SketchLineHelper = { code.slice(radiusDetails.expr.start, radiusDetails.expr.end), 'circle', 'radius', - [radiusDetails.expr.start, radiusDetails.expr.end], + [radiusDetails.expr.start, radiusDetails.expr.end, true], pathToRadiusLiteral ), { @@ -1063,6 +1064,7 @@ export const circle: SketchLineHelper = { sourceRange: [ centerDetails.expr.elements[0].start, centerDetails.expr.elements[0].end, + true, ], pathToNode: pathToXArg, value: code.slice( @@ -1084,6 +1086,7 @@ export const circle: SketchLineHelper = { sourceRange: [ centerDetails.expr.elements[1].start, centerDetails.expr.elements[1].end, + true, ], pathToNode: pathToYArg, value: code.slice( @@ -1698,7 +1701,7 @@ export const angledLineThatIntersects: SketchLineHelper = { if (err(nodeMeta2)) return nodeMeta2 const { node: varDec } = nodeMeta2 - const varName = varDec.declarations[0].id.name + const varName = varDec.declaration.id.name const sketch = sketchFromKclValue( previousProgramMemory.get(varName), varName @@ -1760,7 +1763,7 @@ export const angledLineThatIntersects: SketchLineHelper = { code.slice(angle.start, angle.end), 'angledLineThatIntersects', 'angle', - [angle.start, angle.end], + [angle.start, angle.end, true], pathToAngleProp ) ) @@ -1779,13 +1782,13 @@ export const angledLineThatIntersects: SketchLineHelper = { code.slice(offset.start, offset.end), 'angledLineThatIntersects', 'offset', - [offset.start, offset.end], + [offset.start, offset.end, true], pathToOffsetProp ) ) } if (intersectTag !== -1) { - const tag = firstArg.properties[intersectTag]?.value as Identifier + const tag = firstArg.properties[intersectTag]?.value as Node const pathToTagProp: PathToNode = [ ...pathToObjectExp, [intersectTag, 'index'], @@ -1798,7 +1801,7 @@ export const angledLineThatIntersects: SketchLineHelper = { code.slice(tag.start, tag.end), 'angledLineThatIntersects', 'intersectTag', - [tag.start, tag.end], + [tag.start, tag.end, true], pathToTagProp ) returnVal.push(info) @@ -1822,10 +1825,15 @@ export const updateStartProfileAtArgs: SketchLineHelper['updateArgs'] = ({ modifiedAst: { start: 0, end: 0, + shebang: null, + moduleId: 0, body: [], nonCodeMeta: { - start: [], + start: 0, + end: 0, + moduleId: 0, + startNodes: [], nonCodeNodes: [], }, }, @@ -1865,7 +1873,7 @@ export const sketchLineHelperMap: { [key: string]: SketchLineHelper } = { } as const export function changeSketchArguments( - node: Program, + node: Node, programMemory: ProgramMemory, sourceRangeOrPath: | { @@ -1877,7 +1885,7 @@ export function changeSketchArguments( pathToNode: PathToNode }, input: SegmentInputs -): { modifiedAst: Program; pathToNode: PathToNode } | Error { +): { modifiedAst: Node; pathToNode: PathToNode } | Error { const _node = { ...node } const thePath = sourceRangeOrPath.type === 'sourceRange' @@ -1906,7 +1914,7 @@ export function changeSketchArguments( } export function getConstraintInfo( - callExpression: CallExpression, + callExpression: Node, code: string, pathToNode: PathToNode ): ConstrainInfo[] { @@ -1944,7 +1952,7 @@ export function compareVec2Epsilon2( } interface CreateLineFnCallArgs { - node: Program + node: Node programMemory: ProgramMemory input: SegmentInputs fnName: ToolTip @@ -1961,7 +1969,7 @@ export function addNewSketchLn({ spliceBetween = false, }: CreateLineFnCallArgs): | { - modifiedAst: Program + modifiedAst: Node pathToNode: PathToNode } | Error { @@ -1971,8 +1979,12 @@ export function addNewSketchLn({ return new Error('not a sketch line helper') } - getNodeFromPath(node, pathToNode, 'VariableDeclarator') - getNodeFromPath( + getNodeFromPath>( + node, + pathToNode, + 'VariableDeclarator' + ) + getNodeFromPath>( node, pathToNode, 'PipeExpression' @@ -1991,13 +2003,13 @@ export function addCallExpressionsToPipe({ pathToNode, expressions, }: { - node: Program + node: Node programMemory: ProgramMemory pathToNode: PathToNode - expressions: CallExpression[] + expressions: Node[] }) { const _node = { ...node } - const pipeExpression = getNodeFromPath( + const pipeExpression = getNodeFromPath>( _node, pathToNode, 'PipeExpression' @@ -2046,7 +2058,7 @@ export function replaceSketchLine({ replaceExistingCallback, referencedSegment, }: { - node: Program + node: Node programMemory: ProgramMemory pathToNode: PathToNode fnName: ToolTip @@ -2055,7 +2067,7 @@ export function replaceSketchLine({ referencedSegment?: Path }): | { - modifiedAst: Program + modifiedAst: Node valueUsedInTransform?: number pathToNode: PathToNode } @@ -2107,7 +2119,7 @@ function addTagToChamfer( edgeCutMeta: EdgeCutInfo | null ): | { - modifiedAst: Program + modifiedAst: Node tag: string } | Error { @@ -2234,7 +2246,7 @@ export function addTagForSketchOnFace( edgeCutMeta: EdgeCutInfo | null ): | { - modifiedAst: Program + modifiedAst: Node tag: string } | Error { @@ -2272,12 +2284,14 @@ function isAngleLiteral(lineArugement: Expr): boolean { : false } -type addTagFn = (a: AddTagInfo) => { modifiedAst: Program; tag: string } | Error +type addTagFn = ( + a: AddTagInfo +) => { modifiedAst: Node; tag: string } | Error function addTag(tagIndex = 2): addTagFn { return ({ node, pathToNode }) => { const _node = { ...node } - const callExpr = getNodeFromPath( + const callExpr = getNodeFromPath>( _node, pathToNode, 'CallExpression' diff --git a/src/lang/std/sketchConstraints.test.ts b/src/lang/std/sketchConstraints.test.ts index 08869ae91..5d4734956 100644 --- a/src/lang/std/sketchConstraints.test.ts +++ b/src/lang/std/sketchConstraints.test.ts @@ -1,13 +1,20 @@ -import { parse, Sketch, recast, initPromise, sketchFromKclValue } from '../wasm' +import { + assertParse, + Sketch, + recast, + initPromise, + sketchFromKclValue, + SourceRange, +} from '../wasm' import { ConstraintType, getTransformInfos, transformAstSketchLines, } from './sketchcombos' import { getSketchSegmentFromSourceRange } from './sketchConstraints' -import { Selection } from 'lib/selections' import { enginelessExecutor } from '../../lib/testHelpers' import { err } from 'lib/trap' +import { codeRefFromRange } from './artifactGraph' beforeAll(async () => { await initPromise @@ -24,19 +31,19 @@ async function testingSwapSketchFnCall({ constraintType: ConstraintType }): Promise<{ newCode: string - originalRange: [number, number] + originalRange: [number, number, boolean] }> { const startIndex = inputCode.indexOf(callToSwap) - const range: Selection = { - type: 'default', - range: [startIndex, startIndex + callToSwap.length], - } - const ast = parse(inputCode) - if (err(ast)) return Promise.reject(ast) + const range: SourceRange = [startIndex, startIndex + callToSwap.length, true] + const ast = assertParse(inputCode) const execState = await enginelessExecutor(ast) const selections = { - codeBasedSelections: [range], + graphSelections: [ + { + codeRef: codeRefFromRange(range, ast), + }, + ], otherSelections: [], } const transformInfos = getTransformInfos(selections, ast, constraintType) @@ -57,7 +64,7 @@ async function testingSwapSketchFnCall({ return { newCode, - originalRange: range.range, + originalRange: range, } } @@ -67,11 +74,11 @@ describe('testing swapping out sketch calls with xLine/xLineTo', () => { ` |> startProfileAt([0, 0], %)`, ` |> lineTo([1, 1], %, $abc1)`, ` |> line([-2.04, -0.7], %, $abc2)`, - ` |> angledLine({ angle: 157, length: 1.69 }, %, $abc3)`, - ` |> angledLineOfXLength({ angle: 217, length: 0.86 }, %, $abc4)`, - ` |> angledLineOfYLength({ angle: 104, length: 1.58 }, %, $abc5)`, - ` |> angledLineToX({ angle: 55, to: -2.89 }, %, $abc6)`, - ` |> angledLineToY({ angle: 330, to: 2.53 }, %, $abc7)`, + ` |> angledLine({ angle = 157, length = 1.69 }, %, $abc3)`, + ` |> angledLineOfXLength({ angle = 217, length = 0.86 }, %, $abc4)`, + ` |> angledLineOfYLength({ angle = 104, length = 1.58 }, %, $abc5)`, + ` |> angledLineToX({ angle = 55, to = -2.89 }, %, $abc6)`, + ` |> angledLineToY({ angle = 330, to = 2.53 }, %, $abc7)`, ` |> xLine(1.47, %, $abc8)`, ` |> yLine(1.57, %, $abc9)`, ` |> xLineTo(1.49, %, $abc10)`, @@ -138,7 +145,7 @@ describe('testing swapping out sketch calls with xLine/xLineTo', () => { it('angledLine with tag converts to xLine', async () => { const { newCode, originalRange } = await testingSwapSketchFnCall({ inputCode: bigExample, - callToSwap: 'angledLine({ angle: 157, length: 1.69 }, %, $abc3)', + callToSwap: 'angledLine({ angle = 157, length = 1.69 }, %, $abc3)', constraintType: 'horizontal', }) const expectedLine = 'xLine(-1.56, %, $abc3)' @@ -161,7 +168,8 @@ describe('testing swapping out sketch calls with xLine/xLineTo', () => { it('angledLineOfXLength with tag converts to xLine', async () => { const { newCode, originalRange } = await testingSwapSketchFnCall({ inputCode: bigExample, - callToSwap: 'angledLineOfXLength({ angle: 217, length: 0.86 }, %, $abc4)', + callToSwap: + 'angledLineOfXLength({ angle = 217, length = 0.86 }, %, $abc4)', constraintType: 'horizontal', }) const expectedLine = 'xLine(-0.86, %, $abc4)' @@ -184,7 +192,8 @@ describe('testing swapping out sketch calls with xLine/xLineTo', () => { it('angledLineOfYLength with tag converts to yLine', async () => { const { newCode, originalRange } = await testingSwapSketchFnCall({ inputCode: bigExample, - callToSwap: 'angledLineOfYLength({ angle: 104, length: 1.58 }, %, $abc5)', + callToSwap: + 'angledLineOfYLength({ angle = 104, length = 1.58 }, %, $abc5)', constraintType: 'vertical', }) const expectedLine = 'yLine(1.58, %, $abc5)' @@ -206,7 +215,7 @@ describe('testing swapping out sketch calls with xLine/xLineTo', () => { it('angledLineToX with tag converts to xLineTo', async () => { const { newCode, originalRange } = await testingSwapSketchFnCall({ inputCode: bigExample, - callToSwap: 'angledLineToX({ angle: 55, to: -2.89 }, %, $abc6)', + callToSwap: 'angledLineToX({ angle = 55, to = -2.89 }, %, $abc6)', constraintType: 'horizontal', }) const expectedLine = 'xLineTo(-2.89, %, $abc6)' @@ -228,7 +237,7 @@ describe('testing swapping out sketch calls with xLine/xLineTo', () => { it('angledLineToY with tag converts to yLineTo', async () => { const { newCode, originalRange } = await testingSwapSketchFnCall({ inputCode: bigExample, - callToSwap: 'angledLineToY({ angle: 330, to: 2.53 }, %, $abc7)', + callToSwap: 'angledLineToY({ angle = 330, to = 2.53 }, %, $abc7)', constraintType: 'vertical', }) const expectedLine = 'yLineTo(2.53, %, $abc7)' @@ -360,13 +369,13 @@ part001 = startSketchOn('XY') |> line([2.14, 1.35], %) // normal-segment |> xLine(3.54, %)` it('normal case works', async () => { - const execState = await enginelessExecutor(parse(code)) + const execState = await enginelessExecutor(assertParse(code)) const index = code.indexOf('// normal-segment') - 7 const sg = sketchFromKclValue( execState.memory.get('part001'), 'part001' ) as Sketch - const _segment = getSketchSegmentFromSourceRange(sg, [index, index]) + const _segment = getSketchSegmentFromSourceRange(sg, [index, index, true]) if (err(_segment)) throw _segment const { __geoMeta, ...segment } = _segment.segment expect(segment).toEqual({ @@ -377,11 +386,11 @@ part001 = startSketchOn('XY') }) }) it('verify it works when the segment is in the `start` property', async () => { - const execState = await enginelessExecutor(parse(code)) + const execState = await enginelessExecutor(assertParse(code)) const index = code.indexOf('// segment-in-start') - 7 const _segment = getSketchSegmentFromSourceRange( sketchFromKclValue(execState.memory.get('part001'), 'part001') as Sketch, - [index, index] + [index, index, true] ) if (err(_segment)) throw _segment const { __geoMeta, ...segment } = _segment.segment diff --git a/src/lang/std/sketchConstraints.ts b/src/lang/std/sketchConstraints.ts index 591154e1b..95f3e84fb 100644 --- a/src/lang/std/sketchConstraints.ts +++ b/src/lang/std/sketchConstraints.ts @@ -31,7 +31,7 @@ export function getSketchSegmentFromPathToNode( const node = nodeMeta.node if (!node || typeof node.start !== 'number' || !node.end) return new Error('no node found') - const sourceRange: SourceRange = [node.start, node.end] + const sourceRange: SourceRange = [node.start, node.end, true] return getSketchSegmentFromSourceRange(sketch, sourceRange) } export function getSketchSegmentFromSourceRange( @@ -111,12 +111,10 @@ export function isSketchVariablesLinked( let nextVarDec: VariableDeclarator | undefined for (const node of ast.body) { if (node.type !== 'VariableDeclaration') continue - const found = node.declarations.find( - ({ id }) => id?.name === secondArg.name - ) - if (!found) continue - nextVarDec = found - break + if (node.declaration.id.name === secondArg.name) { + nextVarDec = node.declaration + break + } } if (!nextVarDec) return false return isSketchVariablesLinked(nextVarDec, primaryVarDec, ast) diff --git a/src/lang/std/sketchcombos.test.ts b/src/lang/std/sketchcombos.test.ts index 48fc80edb..8c809fb63 100644 --- a/src/lang/std/sketchcombos.test.ts +++ b/src/lang/std/sketchcombos.test.ts @@ -1,4 +1,4 @@ -import { parse, Expr, recast, initPromise } from '../wasm' +import { assertParse, Expr, recast, initPromise, Program } from '../wasm' import { getConstraintType, getTransformInfos, @@ -9,9 +9,10 @@ import { getConstraintLevelFromSourceRange, } from './sketchcombos' import { ToolTip } from 'lang/langHelpers' -import { Selection, Selections } from 'lib/selections' +import { Selections, Selection } from 'lib/selections' import { err } from 'lib/trap' import { enginelessExecutor } from '../../lib/testHelpers' +import { codeRefFromRange } from './artifactGraph' beforeAll(async () => { await initPromise @@ -65,8 +66,7 @@ describe('testing getConstraintType', () => { function getConstraintTypeFromSourceHelper( code: string ): ReturnType | Error { - const ast = parse(code) - if (err(ast)) return ast + const ast = assertParse(code) const args = (ast.body[0] as any).expression.arguments[0].elements as [ Expr, @@ -78,8 +78,7 @@ function getConstraintTypeFromSourceHelper( function getConstraintTypeFromSourceHelper2( code: string ): ReturnType | Error { - const ast = parse(code) - if (err(ast)) return ast + const ast = assertParse(code) const arg = (ast.body[0] as any).expression.arguments[0] as Expr const fnName = (ast.body[0] as any).expression.callee.name as ToolTip @@ -87,10 +86,10 @@ function getConstraintTypeFromSourceHelper2( } function makeSelections( - codeBaseSelections: Selections['codeBasedSelections'] + graphSelections: Selections['graphSelections'] ): Selections { return { - codeBasedSelections: codeBaseSelections, + graphSelections: graphSelections, otherSelections: [], } } @@ -112,7 +111,11 @@ describe('testing transformAstForSketchLines for equal length constraint', () => |> close(%) ` - const selectLine = (script: string, lineNumber: number): Selection => { + const selectLine = ( + script: string, + lineNumber: number, + ast: Program + ): Selection => { const lines = script.split('\n') const codeBeforeLine = lines.slice(0, lineNumber).join('\n').length const line = lines.find((_, i) => i === lineNumber) @@ -122,19 +125,17 @@ describe('testing transformAstForSketchLines for equal length constraint', () => ) } const start = codeBeforeLine + line.indexOf('|> ' + 5) - const range: [number, number] = [start, start] + const range: [number, number, boolean] = [start, start, true] return { - type: 'default', - range, + codeRef: codeRefFromRange(range, ast), } } async function applyTransformation( inputCode: string, - selectionRanges: Selections['codeBasedSelections'] + selectionRanges: Selections['graphSelections'] ) { - const ast = parse(inputCode) - if (err(ast)) return Promise.reject(ast) + const ast = assertParse(inputCode) const execState = await enginelessExecutor(ast) const transformInfos = getTransformInfos( makeSelections(selectionRanges.slice(1)), @@ -157,9 +158,10 @@ describe('testing transformAstForSketchLines for equal length constraint', () => } it(`Should reorder when user selects first-to-last`, async () => { - const selectionRanges: Selections['codeBasedSelections'] = [ - selectLine(inputScript, 3), - selectLine(inputScript, 4), + const ast = assertParse(inputScript) + const selectionRanges: Selections['graphSelections'] = [ + selectLine(inputScript, 3, ast), + selectLine(inputScript, 4, ast), ] const newCode = await applyTransformation(inputScript, selectionRanges) @@ -167,9 +169,10 @@ describe('testing transformAstForSketchLines for equal length constraint', () => }) it(`Should reorder when user selects last-to-first`, async () => { - const selectionRanges: Selections['codeBasedSelections'] = [ - selectLine(inputScript, 4), - selectLine(inputScript, 3), + const ast = assertParse(inputScript) + const selectionRanges: Selections['graphSelections'] = [ + selectLine(inputScript, 4, ast), + selectLine(inputScript, 3, ast), ] const newCode = await applyTransformation(inputScript, selectionRanges) @@ -285,18 +288,16 @@ part001 = startSketchOn('XY') |> yLine(segLen(seg01), %) // ln-yLineTo-free should convert to yLine ` it('should transform the ast', async () => { - const ast = parse(inputScript) - if (err(ast)) return Promise.reject(ast) + const ast = assertParse(inputScript) - const selectionRanges: Selections['codeBasedSelections'] = inputScript + const selectionRanges: Selections['graphSelections'] = inputScript .split('\n') .filter((ln) => ln.includes('//')) .map((ln) => { const comment = ln.split('//')[1] const start = inputScript.indexOf('//' + comment) - 7 return { - type: 'default', - range: [start, start], + codeRef: codeRefFromRange([start, start, true], ast), } }) @@ -376,18 +377,16 @@ part001 = startSketchOn('XY') |> xLineTo(myVar3, %) // select for horizontal constraint 10 |> angledLineToY([301, myVar], %) // select for vertical constraint 10 ` - const ast = parse(inputScript) - if (err(ast)) return Promise.reject(ast) + const ast = assertParse(inputScript) - const selectionRanges: Selections['codeBasedSelections'] = inputScript + const selectionRanges: Selections['graphSelections'] = inputScript .split('\n') .filter((ln) => ln.includes('// select for horizontal constraint')) .map((ln) => { const comment = ln.split('//')[1] const start = inputScript.indexOf('//' + comment) - 7 return { - type: 'default', - range: [start, start], + codeRef: codeRefFromRange([start, start, true], ast), } }) @@ -438,18 +437,16 @@ part001 = startSketchOn('XY') |> angledLineToX([333, myVar3], %) // select for horizontal constraint 10 |> yLineTo(myVar, %) // select for vertical constraint 10 ` - const ast = parse(inputScript) - if (err(ast)) return Promise.reject(ast) + const ast = assertParse(inputScript) - const selectionRanges: Selections['codeBasedSelections'] = inputScript + const selectionRanges: Selections['graphSelections'] = inputScript .split('\n') .filter((ln) => ln.includes('// select for vertical constraint')) .map((ln) => { const comment = ln.split('//')[1] const start = inputScript.indexOf('//' + comment) - 7 return { - type: 'default', - range: [start, start], + codeRef: codeRefFromRange([start, start, true], ast), } }) @@ -533,10 +530,9 @@ async function helperThing( linesOfInterest: string[], constraint: ConstraintType ): Promise { - const ast = parse(inputScript) - if (err(ast)) return Promise.reject(ast) + const ast = assertParse(inputScript) - const selectionRanges: Selections['codeBasedSelections'] = inputScript + const selectionRanges: Selections['graphSelections'] = inputScript .split('\n') .filter((ln) => linesOfInterest.some((lineOfInterest) => ln.includes(lineOfInterest)) @@ -545,8 +541,7 @@ async function helperThing( const comment = ln.split('//')[1] const start = inputScript.indexOf('//' + comment) - 7 return { - type: 'default', - range: [start, start], + codeRef: codeRefFromRange([start, start, true], ast), } }) @@ -602,10 +597,10 @@ part001 = startSketchOn('XY') |> line([-1.49, 1.06], %) // free |> xLine(-3.43 + 0, %) // full |> angledLineOfXLength([243 + 0, 1.2 + 0], %) // full` - const ast = parse(code) + const ast = assertParse(code) const constraintLevels: ConstraintLevel[] = ['full', 'partial', 'free'] constraintLevels.forEach((constraintLevel) => { - const recursivelySeachCommentsAndCheckConstraintLevel = ( + const recursivelySearchCommentsAndCheckConstraintLevel = ( str: string, offset: number = 0 ): null => { @@ -615,19 +610,19 @@ part001 = startSketchOn('XY') } const offsetIndex = index - 7 const expectedConstraintLevel = getConstraintLevelFromSourceRange( - [offsetIndex, offsetIndex], + [offsetIndex, offsetIndex, true], ast ) if (err(expectedConstraintLevel)) { throw expectedConstraintLevel } expect(expectedConstraintLevel.level).toBe(constraintLevel) - return recursivelySeachCommentsAndCheckConstraintLevel( + return recursivelySearchCommentsAndCheckConstraintLevel( str, index + constraintLevel.length ) } - recursivelySeachCommentsAndCheckConstraintLevel(code) + recursivelySearchCommentsAndCheckConstraintLevel(code) }) }) }) diff --git a/src/lang/std/sketchcombos.ts b/src/lang/std/sketchcombos.ts index f9ea371a5..5e2e3f061 100644 --- a/src/lang/std/sketchcombos.ts +++ b/src/lang/std/sketchcombos.ts @@ -7,7 +7,7 @@ import { TransformInfo, } from './stdTypes' import { ToolTip, toolTips } from 'lang/langHelpers' -import { Selections, Selection } from 'lib/selections' +import { Selections } from 'lib/selections' import { cleanErrs, err } from 'lib/trap' import { CallExpression, @@ -19,6 +19,7 @@ import { ProgramMemory, sketchFromKclValue, Literal, + SourceRange, } from '../wasm' import { getNodeFromPath, @@ -49,6 +50,7 @@ import { getSketchSegmentFromSourceRange, } from './sketchConstraints' import { getAngle, roundOff, normaliseAngle } from '../../lib/utils' +import { Node } from 'wasm-lib/kcl/bindings/Node' export type LineInputsType = | 'xAbsolute' @@ -325,7 +327,7 @@ const setHorzVertDistanceCreateNode = if (isUndef(refNum) || err(literalArg)) return REF_NUM_ERR const valueUsedInTransform = roundOff(literalArg - refNum, 2) - let finalValue: Expr = createBinaryExpressionWithUnary([ + let finalValue: Node = createBinaryExpressionWithUnary([ createSegEnd(referenceSegName, !index), forceValueUsedInTransform || createLiteral(valueUsedInTransform), ]) @@ -683,6 +685,14 @@ const transformMap: TransformMap = { tag ), }, + xAbs: { + tooltip: 'lineTo', + createNode: setAbsDistanceCreateNode('x'), + }, + yAbs: { + tooltip: 'lineTo', + createNode: setAbsDistanceCreateNode('y'), + }, }, xAbsolute: { equalLength: { @@ -1474,11 +1484,8 @@ export function getTransformInfos( ast: Program, constraintType: ConstraintType ): TransformInfo[] { - const paths = selectionRanges.codeBasedSelections.map(({ range }) => - getNodePathFromSourceRange(ast, range) - ) - const nodes = paths.map((pathToNode) => - getNodeFromPath(ast, pathToNode, 'CallExpression') + const nodes = selectionRanges.graphSelections.map(({ codeRef }) => + getNodeFromPath(ast, codeRef.pathToNode, 'CallExpression') ) try { @@ -1506,12 +1513,8 @@ export function getRemoveConstraintsTransforms( ast: Program, constraintType: ConstraintType ): TransformInfo[] | Error { - // return () - const paths = selectionRanges.codeBasedSelections.map((selectionRange) => - getNodePathFromSourceRange(ast, selectionRange.range) - ) - const nodes = paths.map((pathToNode) => - getNodeFromPath(ast, pathToNode) + const nodes = selectionRanges.graphSelections.map(({ codeRef }) => + getNodeFromPath(ast, codeRef.pathToNode) ) const theTransforms = nodes.map((nodeMeta) => { @@ -1541,7 +1544,7 @@ export function transformSecondarySketchLinesTagFirst({ forceSegName, forceValueUsedInTransform, }: { - ast: Program + ast: Node selectionRanges: Selections transformInfos: TransformInfo[] programMemory: ProgramMemory @@ -1549,7 +1552,7 @@ export function transformSecondarySketchLinesTagFirst({ forceValueUsedInTransform?: BinaryPart }): | { - modifiedAst: Program + modifiedAst: Node valueUsedInTransform?: number pathToNodeMap: PathToNodeMap tagInfo: { @@ -1562,11 +1565,10 @@ export function transformSecondarySketchLinesTagFirst({ // We need to sort the selections by their start position // so that we can process them in dependency order and not write invalid KCL. - const sortedCodeBasedSelections = - selectionRanges.codeBasedSelections.toSorted( - (a, b) => a.range[0] - b.range[0] - ) - const primarySelection = sortedCodeBasedSelections[0].range + const sortedCodeBasedSelections = selectionRanges.graphSelections.toSorted( + (a, b) => a?.codeRef?.range[0] - b?.codeRef?.range[0] + ) + const primarySelection = sortedCodeBasedSelections[0]?.codeRef?.range const secondarySelections = sortedCodeBasedSelections.slice(1) const _tag = giveSketchFnCallTag(ast, primarySelection, forceSegName) @@ -1577,7 +1579,7 @@ export function transformSecondarySketchLinesTagFirst({ ast: modifiedAst, selectionRanges: { ...selectionRanges, - codeBasedSelections: secondarySelections, + graphSelections: secondarySelections, }, referencedSegmentRange: primarySelection, transformInfos, @@ -1620,16 +1622,16 @@ export function transformAstSketchLines({ forceValueUsedInTransform, referencedSegmentRange, }: { - ast: Program + ast: Node selectionRanges: Selections | PathToNode[] transformInfos: TransformInfo[] programMemory: ProgramMemory referenceSegName: string + referencedSegmentRange?: SourceRange forceValueUsedInTransform?: BinaryPart - referencedSegmentRange?: Selection['range'] }): | { - modifiedAst: Program + modifiedAst: Node valueUsedInTransform?: number pathToNodeMap: PathToNodeMap } @@ -1647,7 +1649,7 @@ export function transformAstSketchLines({ const getNode = getNodeFromPathCurry(node, _pathToNode) - const callExp = getNode('CallExpression') + const callExp = getNode>('CallExpression') if (err(callExp)) return callExp const varDec = getNode('VariableDeclarator') if (err(varDec)) return varDec @@ -1777,11 +1779,11 @@ export function transformAstSketchLines({ } } - if ('codeBasedSelections' in selectionRanges) { + if ('graphSelections' in selectionRanges) { // If the processing of any of the selections failed, return the first error - const maybeProcessErrors = selectionRanges.codeBasedSelections - .map(({ range }, index) => - processSelection(getNodePathFromSourceRange(node, range), index) + const maybeProcessErrors = selectionRanges.graphSelections + .map(({ codeRef }, index) => + processSelection(getNodePathFromSourceRange(node, codeRef.range), index) ) .filter(err) @@ -1806,13 +1808,16 @@ function createSegAngle(referenceSegName: string): BinaryPart { return createCallExpression('segAng', [createIdentifier(referenceSegName)]) } -function createSegEnd(referenceSegName: string, isX: boolean): CallExpression { +function createSegEnd( + referenceSegName: string, + isX: boolean +): Node { return createCallExpression(isX ? 'segEndX' : 'segEndY', [ createIdentifier(referenceSegName), ]) } -function createLastSeg(isX: boolean): CallExpression { +function createLastSeg(isX: boolean): Node { return createCallExpression(isX ? 'lastSegX' : 'lastSegY', [ createPipeSubstitution(), ]) @@ -1826,11 +1831,11 @@ function getArgLiteralVal(arg: Literal): number | Error { export type ConstraintLevel = 'free' | 'partial' | 'full' export function getConstraintLevelFromSourceRange( - cursorRange: Selection['range'], + cursorRange: SourceRange, ast: Program | Error ): Error | { range: [number, number]; level: ConstraintLevel } { if (err(ast)) return ast - const nodeMeta = getNodeFromPath( + const nodeMeta = getNodeFromPath>( ast, getNodePathFromSourceRange(ast, cursorRange), 'CallExpression' diff --git a/src/lang/std/std.test.ts b/src/lang/std/std.test.ts index c351d0129..5356754e8 100644 --- a/src/lang/std/std.test.ts +++ b/src/lang/std/std.test.ts @@ -1,4 +1,4 @@ -import { parse, initPromise } from '../wasm' +import { assertParse, initPromise } from '../wasm' import { enginelessExecutor } from '../../lib/testHelpers' beforeAll(async () => { @@ -17,9 +17,9 @@ describe('testing angledLineThatIntersects', () => { offset: ${offset}, }, %, $yo2) intersect = segEndX(yo2)` - const execState = await enginelessExecutor(parse(code('-1'))) + const execState = await enginelessExecutor(assertParse(code('-1'))) expect(execState.memory.get('intersect')?.value).toBe(1 + Math.sqrt(2)) - const noOffset = await enginelessExecutor(parse(code('0'))) + const noOffset = await enginelessExecutor(assertParse(code('0'))) expect(noOffset.memory.get('intersect')?.value).toBeCloseTo(1) }) }) diff --git a/src/lang/std/stdTypes.ts b/src/lang/std/stdTypes.ts index fb9dcbb97..add077935 100644 --- a/src/lang/std/stdTypes.ts +++ b/src/lang/std/stdTypes.ts @@ -11,16 +11,17 @@ import { BinaryPart, } from '../wasm' import { LineInputsType } from './sketchcombos' +import { Node } from 'wasm-lib/kcl/bindings/Node' export interface ModifyAstBase { - node: Program + node: Node // TODO #896: Remove ProgramMemory from this interface previousProgramMemory: ProgramMemory pathToNode: PathToNode } export interface AddTagInfo { - node: Program + node: Node pathToNode: PathToNode } @@ -134,7 +135,7 @@ type _InputArg = * Which is why a union type is used that can be type narrowed using the {@link RawArg.type} property * {@link RawArg.expr} is common to all of these types */ -export type InputArg = _InputArg +export type InputArg = _InputArg> /** * {@link RawArg.expr} is the literal equivalent of whatever current expression is @@ -142,7 +143,7 @@ export type InputArg = _InputArg * but of course works for expressions like myVar + someFn() etc too * This is useful in cases where we want to "un-constrain" inputs to segments */ -type RawArg = _InputArg +type RawArg = _InputArg> export type InputArgs = Array @@ -186,7 +187,7 @@ export type CreateStdLibSketchCallExpr = (args: { inputs: InputArgs rawArgs: RawArgs referenceSegName: string - tag?: Expr + tag?: Node forceValueUsedInTransform?: BinaryPart referencedSegment?: Path }) => CreatedSketchExprResult | Error @@ -215,26 +216,26 @@ export interface ConstrainInfo { export interface SketchLineHelper { add: (a: addCall) => | { - modifiedAst: Program + modifiedAst: Node pathToNode: PathToNode valueUsedInTransform?: number } | Error updateArgs: (a: updateArgs) => | { - modifiedAst: Program + modifiedAst: Node pathToNode: PathToNode } | Error getTag: (a: CallExpression) => string | Error addTag: (a: AddTagInfo) => | { - modifiedAst: Program + modifiedAst: Node tag: string } | Error getConstraintInfo: ( - callExp: CallExpression, + callExp: Node, code: string, pathToNode: PathToNode ) => ConstrainInfo[] diff --git a/src/lang/tokeniser.test.ts b/src/lang/tokeniser.test.ts deleted file mode 100644 index 7a6998a6c..000000000 --- a/src/lang/tokeniser.test.ts +++ /dev/null @@ -1,382 +0,0 @@ -import { lexer, initPromise } from './wasm' -import { err } from 'lib/trap' - -beforeAll(async () => { - await initPromise -}) - -describe('testing lexer', () => { - it('async lexer works too', async () => { - const code = '1 + 2' - const code2 = `const yo = {key: 'value'}` - const code3 = `const yo = 45 /* this is a comment -const ya = 6 */ -const yi=45` - expect(lexer(code)).toEqual(lexer(code)) - expect(lexer(code2)).toEqual(lexer(code2)) - expect(lexer(code3)).toEqual(lexer(code3)) - }) - it('test lexer', () => { - expect(stringSummaryLexer('1 + 2')).toEqual([ - "number '1' from 0 to 1", - "whitespace ' ' from 1 to 3", - "operator '+' from 3 to 4", - "whitespace ' ' from 4 to 5", - "number '2' from 5 to 6", - ]) - expect(stringSummaryLexer('54 + 22500 + 6')).toEqual([ - "number '54' from 0 to 2", - "whitespace ' ' from 2 to 3", - "operator '+' from 3 to 4", - "whitespace ' ' from 4 to 5", - "number '22500' from 5 to 10", - "whitespace ' ' from 10 to 11", - "operator '+' from 11 to 12", - "whitespace ' ' from 12 to 13", - "number '6' from 13 to 14", - ]) - expect(stringSummaryLexer('a + bo + t5 - 6')).toEqual([ - "word 'a' from 0 to 1", - "whitespace ' ' from 1 to 2", - "operator '+' from 2 to 3", - "whitespace ' ' from 3 to 4", - "word 'bo' from 4 to 6", - "whitespace ' ' from 6 to 7", - "operator '+' from 7 to 8", - "whitespace ' ' from 8 to 9", - "word 't5' from 9 to 11", - "whitespace ' ' from 11 to 12", - "operator '-' from 12 to 13", - "whitespace ' ' from 13 to 14", - "number '6' from 14 to 15", - ]) - expect(stringSummaryLexer('a + "a str" - 6')).toEqual([ - "word 'a' from 0 to 1", - "whitespace ' ' from 1 to 2", - "operator '+' from 2 to 3", - "whitespace ' ' from 3 to 4", - 'string \'"a str"\' from 4 to 11', - "whitespace ' ' from 11 to 12", - "operator '-' from 12 to 13", - "whitespace ' ' from 13 to 14", - "number '6' from 14 to 15", - ]) - expect(stringSummaryLexer("a + 'str'")).toEqual([ - "word 'a' from 0 to 1", - "whitespace ' ' from 1 to 2", - "operator '+' from 2 to 3", - "whitespace ' ' from 3 to 4", - "string ''str'' from 4 to 9", - ]) - expect(stringSummaryLexer("a +'str'")).toEqual([ - "word 'a' from 0 to 1", - "whitespace ' ' from 1 to 2", - "operator '+' from 2 to 3", - "string ''str'' from 3 to 8", - ]) - - expect(stringSummaryLexer('a + (sick)')).toEqual([ - "word 'a' from 0 to 1", - "whitespace ' ' from 1 to 2", - "operator '+' from 2 to 3", - "whitespace ' ' from 3 to 4", - "brace '(' from 4 to 5", - "word 'sick' from 5 to 9", - "brace ')' from 9 to 10", - ]) - - expect(stringSummaryLexer('a + { sick}')).toEqual([ - "word 'a' from 0 to 1", - "whitespace ' ' from 1 to 2", - "operator '+' from 2 to 3", - "whitespace ' ' from 3 to 4", - "brace '{' from 4 to 5", - "whitespace ' ' from 5 to 6", - "word 'sick' from 6 to 10", - "brace '}' from 10 to 11", - ]) - - expect(stringSummaryLexer("log('hi')")).toEqual([ - "word 'log' from 0 to 3", - "brace '(' from 3 to 4", - "string ''hi'' from 4 to 8", - "brace ')' from 8 to 9", - ]) - expect(stringSummaryLexer("log('hi', 'hello')")).toEqual([ - "word 'log' from 0 to 3", - "brace '(' from 3 to 4", - "string ''hi'' from 4 to 8", - "comma ',' from 8 to 9", - "whitespace ' ' from 9 to 10", - "string ''hello'' from 10 to 17", - "brace ')' from 17 to 18", - ]) - expect(stringSummaryLexer('fn funcName = (param1, param2) => {}')).toEqual([ - "keyword 'fn' from 0 to 2", - "whitespace ' ' from 2 to 3", - "word 'funcName' from 3 to 11", - "whitespace ' ' from 11 to 12", - "operator '=' from 12 to 13", - "whitespace ' ' from 13 to 14", - "brace '(' from 14 to 15", - "word 'param1' from 15 to 21", - "comma ',' from 21 to 22", - "whitespace ' ' from 22 to 23", - "word 'param2' from 23 to 29", - "brace ')' from 29 to 30", - "whitespace ' ' from 30 to 31", - "operator '=>' from 31 to 33", - "whitespace ' ' from 33 to 34", - "brace '{' from 34 to 35", - "brace '}' from 35 to 36", - ]) - }) - it('test negative and decimal numbers', () => { - expect(stringSummaryLexer('-1')).toEqual([ - "operator '-' from 0 to 1", - "number '1' from 1 to 2", - ]) - expect(stringSummaryLexer('-1.5')).toEqual([ - "operator '-' from 0 to 1", - "number '1.5' from 1 to 4", - ]) - expect(stringSummaryLexer('1.5')).toEqual([ - "number '1.5' from 0 to 3", - ]) - expect(stringSummaryLexer('1.5 + 2.5')).toEqual([ - "number '1.5' from 0 to 3", - "whitespace ' ' from 3 to 4", - "operator '+' from 4 to 5", - "whitespace ' ' from 5 to 6", - "number '2.5' from 6 to 9", - ]) - expect(stringSummaryLexer('1.5 - 2.5')).toEqual([ - "number '1.5' from 0 to 3", - "whitespace ' ' from 3 to 4", - "operator '-' from 4 to 5", - "whitespace ' ' from 5 to 6", - "number '2.5' from 6 to 9", - ]) - expect(stringSummaryLexer('1.5 + -2.5')).toEqual([ - "number '1.5' from 0 to 3", - "whitespace ' ' from 3 to 4", - "operator '+' from 4 to 5", - "whitespace ' ' from 5 to 6", - "operator '-' from 6 to 7", - "number '2.5' from 7 to 10", - ]) - expect(stringSummaryLexer('-1.5 + 2.5')).toEqual([ - "operator '-' from 0 to 1", - "number '1.5' from 1 to 4", - "whitespace ' ' from 4 to 5", - "operator '+' from 5 to 6", - "whitespace ' ' from 6 to 7", - "number '2.5' from 7 to 10", - ]) - }) - it('testing piping operator', () => { - const result = stringSummaryLexer(`sketch mySketch { - lineTo(2, 3) - } |> rx(45, %)`) - expect(result).toEqual([ - "type 'sketch' from 0 to 6", - "whitespace ' ' from 6 to 7", - "word 'mySketch' from 7 to 15", - "whitespace ' ' from 15 to 16", - "brace '{' from 16 to 17", - "whitespace '\n ' from 17 to 24", - "word 'lineTo' from 24 to 30", - "brace '(' from 30 to 31", - "number '2' from 31 to 32", - "comma ',' from 32 to 33", - "whitespace ' ' from 33 to 34", - "number '3' from 34 to 35", - "brace ')' from 35 to 36", - "whitespace '\n ' from 36 to 41", - "brace '}' from 41 to 42", - "whitespace ' ' from 42 to 43", - "operator '|>' from 43 to 45", - "whitespace ' ' from 45 to 46", - "word 'rx' from 46 to 48", - "brace '(' from 48 to 49", - "number '45' from 49 to 51", - "comma ',' from 51 to 52", - "whitespace ' ' from 52 to 53", - "operator '%' from 53 to 54", - "brace ')' from 54 to 55", - ]) - }) - it('testing array declaration', () => { - const result = stringSummaryLexer(`const yo = [1, 2]`) - expect(result).toEqual([ - "keyword 'const' from 0 to 5", - "whitespace ' ' from 5 to 6", - "word 'yo' from 6 to 8", - "whitespace ' ' from 8 to 9", - "operator '=' from 9 to 10", - "whitespace ' ' from 10 to 11", - "brace '[' from 11 to 12", - "number '1' from 12 to 13", - "comma ',' from 13 to 14", - "whitespace ' ' from 14 to 15", - "number '2' from 15 to 16", - "brace ']' from 16 to 17", - ]) - }) - it('testing object declaration', () => { - const result = stringSummaryLexer(`const yo = {key: 'value'}`) - expect(result).toEqual([ - "keyword 'const' from 0 to 5", - "whitespace ' ' from 5 to 6", - "word 'yo' from 6 to 8", - "whitespace ' ' from 8 to 9", - "operator '=' from 9 to 10", - "whitespace ' ' from 10 to 11", - "brace '{' from 11 to 12", - "word 'key' from 12 to 15", - "colon ':' from 15 to 16", - "whitespace ' ' from 16 to 17", - "string ''value'' from 17 to 24", - "brace '}' from 24 to 25", - ]) - }) - it('testing object property access', () => { - const result = stringSummaryLexer(`const yo = {key: 'value'} -const prop = yo.key -const prop2 = yo['key'] -const key = 'key' -const prop3 = yo[key]`) - expect(result).toEqual([ - "keyword 'const' from 0 to 5", - "whitespace ' ' from 5 to 6", - "word 'yo' from 6 to 8", - "whitespace ' ' from 8 to 9", - "operator '=' from 9 to 10", - "whitespace ' ' from 10 to 11", - "brace '{' from 11 to 12", - "word 'key' from 12 to 15", - "colon ':' from 15 to 16", - "whitespace ' ' from 16 to 17", - "string ''value'' from 17 to 24", - "brace '}' from 24 to 25", - "whitespace '\n' from 25 to 26", - "keyword 'const' from 26 to 31", - "whitespace ' ' from 31 to 32", - "word 'prop' from 32 to 36", - "whitespace ' ' from 36 to 37", - "operator '=' from 37 to 38", - "whitespace ' ' from 38 to 39", - "word 'yo' from 39 to 41", - "period '.' from 41 to 42", - "word 'key' from 42 to 45", - "whitespace '\n' from 45 to 46", - "keyword 'const' from 46 to 51", - "whitespace ' ' from 51 to 52", - "word 'prop2' from 52 to 57", - "whitespace ' ' from 57 to 58", - "operator '=' from 58 to 59", - "whitespace ' ' from 59 to 60", - "word 'yo' from 60 to 62", - "brace '[' from 62 to 63", - "string ''key'' from 63 to 68", - "brace ']' from 68 to 69", - "whitespace '\n' from 69 to 70", - "keyword 'const' from 70 to 75", - "whitespace ' ' from 75 to 76", - "word 'key' from 76 to 79", - "whitespace ' ' from 79 to 80", - "operator '=' from 80 to 81", - "whitespace ' ' from 81 to 82", - "string ''key'' from 82 to 87", - "whitespace '\n' from 87 to 88", - "keyword 'const' from 88 to 93", - "whitespace ' ' from 93 to 94", - "word 'prop3' from 94 to 99", - "whitespace ' ' from 99 to 100", - "operator '=' from 100 to 101", - "whitespace ' ' from 101 to 102", - "word 'yo' from 102 to 104", - "brace '[' from 104 to 105", - "word 'key' from 105 to 108", - "brace ']' from 108 to 109", - ]) - }) - it('testing tokenising line comments', () => { - const result = stringSummaryLexer(`const yo = 45 // this is a comment -const yo = 6`) - expect(result).toEqual([ - "keyword 'const' from 0 to 5", - "whitespace ' ' from 5 to 6", - "word 'yo' from 6 to 8", - "whitespace ' ' from 8 to 9", - "operator '=' from 9 to 10", - "whitespace ' ' from 10 to 11", - "number '45' from 11 to 13", - "whitespace ' ' from 13 to 14", - "lineComment '// this is a comment' from 14 to 34", - "whitespace '\n' from 34 to 35", - "keyword 'const' from 35 to 40", - "whitespace ' ' from 40 to 41", - "word 'yo' from 41 to 43", - "whitespace ' ' from 43 to 44", - "operator '=' from 44 to 45", - "whitespace ' ' from 45 to 46", - "number '6' from 46 to 47", - ]) - }) - it('testing tokenising line comments by itself', () => { - const result = stringSummaryLexer(`log('hi') -// comment on a line by itself -const yo=45`) - expect(result).toEqual([ - "word 'log' from 0 to 3", - "brace '(' from 3 to 4", - "string ''hi'' from 4 to 8", - "brace ')' from 8 to 9", - "whitespace '\n' from 9 to 10", - "lineComment '// comment on a line by itself' from 10 to 40", - "whitespace '\n' from 40 to 41", - "keyword 'const' from 41 to 46", - "whitespace ' ' from 46 to 47", - "word 'yo' from 47 to 49", - "operator '=' from 49 to 50", - "number '45' from 50 to 52", - ]) - }) - it('testing tokenising block comments', () => { - const result = stringSummaryLexer(`const yo = 45 /* this is a comment -const ya = 6 */ -const yi=45`) - expect(result).toEqual([ - "keyword 'const' from 0 to 5", - "whitespace ' ' from 5 to 6", - "word 'yo' from 6 to 8", - "whitespace ' ' from 8 to 9", - "operator '=' from 9 to 10", - "whitespace ' ' from 10 to 11", - "number '45' from 11 to 13", - "whitespace ' ' from 13 to 14", - `blockComment '/* this is a comment -const ya = 6 */' from 14 to 50`, - "whitespace '\n' from 50 to 51", - "keyword 'const' from 51 to 56", - "whitespace ' ' from 56 to 57", - "word 'yi' from 57 to 59", - "operator '=' from 59 to 60", - "number '45' from 60 to 62", - ]) - }) -}) - -// helpers - -const stringSummaryLexer = (input: string) => { - const tokens = lexer(input) - if (err(tokens)) return [] - return tokens.map( - ({ type, value, start, end }) => - `${type.padEnd(12, ' ')} ${`'${value}'`.padEnd(10, ' ')} from ${String( - start - ).padEnd(3, ' ')} to ${end}` - ) -} diff --git a/src/lang/util.ts b/src/lang/util.ts index 3f25861fa..f7147fd04 100644 --- a/src/lang/util.ts +++ b/src/lang/util.ts @@ -1,45 +1,13 @@ import { Selections } from 'lib/selections' -import { Program, PathToNode } from './wasm' -import { getNodeFromPath } from './queryAst' +import { + PathToNode, + CallExpression, + Literal, + ArrayExpression, + BinaryExpression, +} from './wasm' import { ArtifactGraph, filterArtifacts } from 'lang/std/artifactGraph' import { isOverlap } from 'lib/utils' -import { err } from 'lib/trap' - -export function pathMapToSelections( - ast: Program, - prevSelections: Selections, - pathToNodeMap: { [key: number]: PathToNode } -): Selections { - const newSelections: Selections = { - ...prevSelections, - codeBasedSelections: [], - } - Object.entries(pathToNodeMap).forEach(([index, path]) => { - const nodeMeta = getNodeFromPath(ast, path) - if (err(nodeMeta)) return - const node = nodeMeta.node as any - const selection = prevSelections.codeBasedSelections[Number(index)] - if (node) { - if ( - selection.type === 'base-edgeCut' || - selection.type === 'adjacent-edgeCut' || - selection.type === 'opposite-edgeCut' - ) { - newSelections.codeBasedSelections.push({ - range: [node.start, node.end], - type: selection.type, - secondaryRange: selection.secondaryRange, - }) - } else { - newSelections.codeBasedSelections.push({ - range: [node.start, node.end], - type: selection.type, - }) - } - } - }) - return newSelections -} export function updatePathToNodeFromMap( oldPath: PathToNode, @@ -65,11 +33,11 @@ export function isCursorInSketchCommandRange( { types: ['segment', 'path'], predicate: (artifact) => { - return selectionRanges.codeBasedSelections.some( + return selectionRanges.graphSelections.some( (selection) => - Array.isArray(selection?.range) && + Array.isArray(selection?.codeRef?.range) && Array.isArray(artifact?.codeRef?.range) && - isOverlap(selection.range, artifact.codeRef.range) + isOverlap(selection?.codeRef?.range, artifact.codeRef.range) ) }, }, @@ -84,3 +52,19 @@ export function isCursorInSketchCommandRange( ([, artifact]) => artifact.type === 'path' )?.[0] || false } + +export function isCallExpression(e: any): e is CallExpression { + return e && e.type === 'CallExpression' +} + +export function isArrayExpression(e: any): e is ArrayExpression { + return e && e.type === 'ArrayExpression' +} + +export function isLiteral(e: any): e is Literal { + return e && e.type === 'Literal' +} + +export function isBinaryExpression(e: any): e is BinaryExpression { + return e && e.type === 'BinaryExpression' +} diff --git a/src/lang/wasm.test.ts b/src/lang/wasm.test.ts new file mode 100644 index 000000000..5cb9c5f23 --- /dev/null +++ b/src/lang/wasm.test.ts @@ -0,0 +1,22 @@ +import { err } from 'lib/trap' +import { initPromise, parse, ParseResult } from './wasm' +import { enginelessExecutor } from 'lib/testHelpers' +import { Node } from 'wasm-lib/kcl/bindings/Node' +import { Program } from '../wasm-lib/kcl/bindings/Program' + +beforeEach(async () => { + await initPromise +}) + +it('can execute parsed AST', async () => { + const code = `x = 1 +// A comment.` + const result = parse(code) + expect(err(result)).toEqual(false) + const pResult = result as ParseResult + expect(pResult.errors.length).toEqual(0) + expect(pResult.program).not.toEqual(null) + const execState = await enginelessExecutor(pResult.program as Node) + expect(err(execState)).toEqual(false) + expect(execState.memory.get('x')?.value).toEqual(1) +}) diff --git a/src/lang/wasm.ts b/src/lang/wasm.ts index 705c9c555..31e8d7135 100644 --- a/src/lang/wasm.ts +++ b/src/lang/wasm.ts @@ -1,15 +1,13 @@ import init, { parse_wasm, recast_wasm, - execute_wasm, + execute, kcl_lint, - lexer_wasm, modify_ast_for_sketch_wasm, is_points_ccw, get_tangential_arc_to_info, program_memory_init, make_default_planes, - modify_grid, coredump, toml_stringify, default_app_settings, @@ -17,6 +15,7 @@ import init, { parse_project_settings, default_project_settings, base64_decode, + clear_scene_and_bust_cache, } from '../wasm-lib/pkg/wasm_lib' import { KCLError } from './errors' import { KclError as RustKclError } from '../wasm-lib/kcl/bindings/KclError' @@ -24,7 +23,6 @@ import { EngineCommandManager } from './std/engineConnection' import { Discovered } from '../wasm-lib/kcl/bindings/Discovered' import { KclValue } from '../wasm-lib/kcl/bindings/KclValue' import type { Program } from '../wasm-lib/kcl/bindings/Program' -import type { Token } from '../wasm-lib/kcl/bindings/Token' import { Coords2d } from './std/sketch' import { fileSystemManager } from 'lang/std/fileSystemManager' import { CoreDumpInfo } from 'wasm-lib/kcl/bindings/CoreDumpInfo' @@ -32,17 +30,23 @@ import { CoreDumpManager } from 'lib/coredump' import openWindow from 'lib/openWindow' import { DefaultPlanes } from 'wasm-lib/kcl/bindings/DefaultPlanes' import { TEST } from 'env' -import { err } from 'lib/trap' +import { err, Reason } from 'lib/trap' import { Configuration } from 'wasm-lib/kcl/bindings/Configuration' import { DeepPartial } from 'lib/types' import { ProjectConfiguration } from 'wasm-lib/kcl/bindings/ProjectConfiguration' import { Sketch } from '../wasm-lib/kcl/bindings/Sketch' -import { IdGenerator } from 'wasm-lib/kcl/bindings/IdGenerator' -import { ExecState as RawExecState } from '../wasm-lib/kcl/bindings/ExecState' +import { ExecOutcome as RustExecOutcome } from 'wasm-lib/kcl/bindings/ExecOutcome' import { ProgramMemory as RawProgramMemory } from '../wasm-lib/kcl/bindings/ProgramMemory' import { EnvironmentRef } from '../wasm-lib/kcl/bindings/EnvironmentRef' import { Environment } from '../wasm-lib/kcl/bindings/Environment' +import { Node } from 'wasm-lib/kcl/bindings/Node' +import { CompilationError } from 'wasm-lib/kcl/bindings/CompilationError' +import { SourceRange as RustSourceRange } from 'wasm-lib/kcl/bindings/SourceRange' +import { getAllCurrentSettings } from 'lib/settings/settingsUtils' +import { Operation } from 'wasm-lib/kcl/bindings/Operation' +import { KclErrorWithOutputs } from 'wasm-lib/kcl/bindings/KclErrorWithOutputs' +export type { Configuration } from 'wasm-lib/kcl/bindings/Configuration' export type { Program } from '../wasm-lib/kcl/bindings/Program' export type { Expr } from '../wasm-lib/kcl/bindings/Expr' export type { ObjectExpression } from '../wasm-lib/kcl/bindings/ObjectExpression' @@ -61,7 +65,9 @@ export type { CallExpression } from '../wasm-lib/kcl/bindings/CallExpression' export type { VariableDeclarator } from '../wasm-lib/kcl/bindings/VariableDeclarator' export type { BinaryPart } from '../wasm-lib/kcl/bindings/BinaryPart' export type { Literal } from '../wasm-lib/kcl/bindings/Literal' +export type { LiteralValue } from '../wasm-lib/kcl/bindings/LiteralValue' export type { ArrayExpression } from '../wasm-lib/kcl/bindings/ArrayExpression' +export type { SourceRange as RustSourceRange } from 'wasm-lib/kcl/bindings/SourceRange' export type SyntaxType = | 'Program' @@ -80,16 +86,47 @@ export type SyntaxType = | 'PipeExpression' | 'PipeSubstitution' | 'Literal' + | 'LiteralValue' | 'NonCodeNode' | 'UnaryExpression' -export type { SourceRange } from '../wasm-lib/kcl/bindings/SourceRange' export type { Path } from '../wasm-lib/kcl/bindings/Path' export type { Sketch } from '../wasm-lib/kcl/bindings/Sketch' export type { Solid } from '../wasm-lib/kcl/bindings/Solid' export type { KclValue } from '../wasm-lib/kcl/bindings/KclValue' export type { ExtrudeSurface } from '../wasm-lib/kcl/bindings/ExtrudeSurface' +/** + * The first two items are the start and end points (byte offsets from the start of the file). + * The third item is whether the source range belongs to the 'main' file, i.e., the file currently + * being rendered/displayed in the editor (TODO we need to handle modules better in the frontend). + */ +export type SourceRange = [number, number, boolean] + +/** + * Convert a SourceRange as used inside the KCL interpreter into the above one for use in the + * frontend (essentially we're eagerly checking whether the frontend should care about the SourceRange + * so as not to expose details of the interpreter's current representation of module ids throughout + * the frontend). + */ +export function sourceRangeFromRust(s: RustSourceRange): SourceRange { + return [s[0], s[1], s[2] === 0] +} + +/** + * Create a default SourceRange for testing or as a placeholder. + */ +export function defaultSourceRange(): SourceRange { + return [0, 0, true] +} + +/** + * Create a default RustSourceRange for testing or as a placeholder. + */ +export function defaultRustSourceRange(): RustSourceRange { + return [0, 0, 0] +} + export const wasmUrl = () => { // For when we're in electron (file based) or web server (network based) // For some reason relative paths don't work as expected. Otherwise we would @@ -110,7 +147,7 @@ const initialise = async () => { const fullUrl = wasmUrl() const input = await fetch(fullUrl) const buffer = await input.arrayBuffer() - return await init(buffer) + return await init({ module_or_path: buffer }) } catch (e) { console.log('Error initialising WASM', e) return Promise.reject(e) @@ -119,31 +156,97 @@ const initialise = async () => { export const initPromise = initialise() -export const rangeTypeFix = (ranges: number[][]): [number, number][] => - ranges.map(([start, end]) => [start, end]) +const splitErrors = ( + input: CompilationError[] +): { errors: CompilationError[]; warnings: CompilationError[] } => { + let errors = [] + let warnings = [] + for (const i of input) { + if (i.severity === 'Warning') { + warnings.push(i) + } else { + errors.push(i) + } + } -export const parse = (code: string | Error): Program | Error => { + return { errors, warnings } +} + +export class ParseResult { + program: Node | null + errors: CompilationError[] + warnings: CompilationError[] + + constructor( + program: Node | null, + errors: CompilationError[], + warnings: CompilationError[] + ) { + this.program = program + this.errors = errors + this.warnings = warnings + } +} + +/** + * Parsing was successful. There is guaranteed to be an AST and no fatal errors. There may or may + * not be warnings or non-fatal errors. + */ +class SuccessParseResult extends ParseResult { + program: Node + + constructor( + program: Node, + errors: CompilationError[], + warnings: CompilationError[] + ) { + super(program, errors, warnings) + this.program = program + } +} + +export function resultIsOk(result: ParseResult): result is SuccessParseResult { + return !!result.program && result.errors.length === 0 +} + +export const parse = (code: string | Error): ParseResult | Error => { if (err(code)) return code try { - const program: Program = parse_wasm(code) - return program + const parsed: [Node, CompilationError[]] = parse_wasm(code) + let errs = splitErrors(parsed[1]) + return new ParseResult(parsed[0], errs.errors, errs.warnings) } catch (e: any) { // throw e const parsed: RustKclError = JSON.parse(e.toString()) return new KCLError( parsed.kind, parsed.msg, - rangeTypeFix(parsed.sourceRanges) + sourceRangeFromRust(parsed.sourceRanges[0]), + [] ) } } +// Parse and throw an exception if there are any errors (probably not suitable for use outside of testing). +export const assertParse = (code: string): Node => { + const result = parse(code) + // eslint-disable-next-line suggest-no-throw/suggest-no-throw + if (err(result) || !resultIsOk(result)) throw result + return result.program +} + export type PathToNode = [string | number, string][] +export const isPathToNodeNumber = ( + pathToNode: string | number +): pathToNode is number => { + return typeof pathToNode === 'number' +} + export interface ExecState { memory: ProgramMemory - idGenerator: IdGenerator + operations: Operation[] } /** @@ -153,21 +256,14 @@ export interface ExecState { export function emptyExecState(): ExecState { return { memory: ProgramMemory.empty(), - idGenerator: defaultIdGenerator(), + operations: [], } } -function execStateFromRaw(raw: RawExecState): ExecState { +function execStateFromRust(execOutcome: RustExecOutcome): ExecState { return { - memory: ProgramMemory.fromRaw(raw.memory), - idGenerator: raw.idGenerator, - } -} - -export function defaultIdGenerator(): IdGenerator { - return { - nextId: 0, - ids: [], + memory: ProgramMemory.fromRaw(execOutcome.memory), + operations: execOutcome.operations, } } @@ -181,6 +277,19 @@ function emptyEnvironment(): Environment { return { bindings: {}, parent: null } } +function emptyRootEnvironment(): Environment { + return { + // This is dumb this is copied from rust. + bindings: { + ZERO: { type: 'Number', value: 0.0, __meta: [] }, + QUARTER_TURN: { type: 'Number', value: 90.0, __meta: [] }, + HALF_TURN: { type: 'Number', value: 180.0, __meta: [] }, + THREE_QUARTER_TURN: { type: 'Number', value: 270.0, __meta: [] }, + }, + parent: null, + } +} + /** * This duplicates logic in Rust. The hope is to keep ProgramMemory internals * isolated from the rest of the TypeScript code so that we can move it to Rust @@ -203,7 +312,7 @@ export class ProgramMemory { } constructor( - environments: Environment[] = [emptyEnvironment()], + environments: Environment[] = [emptyRootEnvironment()], currentEnv: EnvironmentRef = ROOT_ENVIRONMENT_REF, returnVal: KclValue | null = null ) { @@ -335,7 +444,7 @@ export class ProgramMemory { */ hasSketchOrSolid(): boolean { for (const node of this.visibleEntries().values()) { - if (node.type === 'Solid' || node.value?.type === 'Sketch') { + if (node.type === 'Solid' || node.type === 'Sketch') { return true } } @@ -356,10 +465,10 @@ export class ProgramMemory { } // TODO: In the future, make the parameter be a KclValue. -export function sketchFromKclValue( +export function sketchFromKclValueOptional( obj: any, varName: string | null -): Sketch | Error { +): Sketch | Reason { if (obj?.value?.type === 'Sketch') return obj.value if (obj?.value?.type === 'Solid') return obj.value.sketch if (obj?.type === 'Solid') return obj.sketch @@ -368,75 +477,80 @@ export function sketchFromKclValue( } const actualType = obj?.value?.type ?? obj?.type if (actualType) { - console.log(obj) - return new Error( + return new Reason( `Expected ${varName} to be a sketch or solid, but it was ${actualType} instead.` ) } else { - return new Error(`Expected ${varName} to be a sketch, but it wasn't.`) + return new Reason(`Expected ${varName} to be a sketch, but it wasn't.`) } } +// TODO: In the future, make the parameter be a KclValue. +export function sketchFromKclValue( + obj: any, + varName: string | null +): Sketch | Error { + const result = sketchFromKclValueOptional(obj, varName) + if (result instanceof Reason) { + return result.toError() + } + return result +} + export const executor = async ( - node: Program, - programMemory: ProgramMemory | Error = ProgramMemory.empty(), - idGenerator: IdGenerator = defaultIdGenerator(), + node: Node, engineCommandManager: EngineCommandManager, - isMock: boolean = false + programMemoryOverride: ProgramMemory | Error | null = null ): Promise => { - if (err(programMemory)) return Promise.reject(programMemory) + if (programMemoryOverride !== null && err(programMemoryOverride)) + return Promise.reject(programMemoryOverride) // eslint-disable-next-line @typescript-eslint/no-floating-promises engineCommandManager.startNewSession() const _programMemory = await _executor( node, - programMemory, - idGenerator, engineCommandManager, - isMock + programMemoryOverride ) await engineCommandManager.waitForAllCommands() - engineCommandManager.endSession() return _programMemory } export const _executor = async ( - node: Program, - programMemory: ProgramMemory | Error = ProgramMemory.empty(), - idGenerator: IdGenerator = defaultIdGenerator(), + node: Node, engineCommandManager: EngineCommandManager, - isMock: boolean + programMemoryOverride: ProgramMemory | Error | null = null ): Promise => { - if (err(programMemory)) return Promise.reject(programMemory) + if (programMemoryOverride !== null && err(programMemoryOverride)) + return Promise.reject(programMemoryOverride) try { - let baseUnit = 'mm' + let jsAppSettings = default_app_settings() if (!TEST) { - const getSettingsState = import('components/SettingsAuthProvider').then( - (module) => module.getSettingsState - ) - baseUnit = - (await getSettingsState)()?.modeling.defaultUnit.current || 'mm' + const lastSettingsSnapshot = await import( + 'components/SettingsAuthProvider' + ).then((module) => module.lastSettingsContextSnapshot) + if (lastSettingsSnapshot) { + jsAppSettings = getAllCurrentSettings(lastSettingsSnapshot) + } } - const execState: RawExecState = await execute_wasm( + const execOutcome: RustExecOutcome = await execute( JSON.stringify(node), - JSON.stringify(programMemory.toRaw()), - JSON.stringify(idGenerator), - baseUnit, + JSON.stringify(programMemoryOverride?.toRaw() || null), + JSON.stringify({ settings: jsAppSettings }), engineCommandManager, - fileSystemManager, - undefined, - isMock + fileSystemManager ) - return execStateFromRaw(execState) + return execStateFromRust(execOutcome) } catch (e: any) { console.log(e) - const parsed: RustKclError = JSON.parse(e.toString()) + const parsed: KclErrorWithOutputs = JSON.parse(e.toString()) const kclError = new KCLError( - parsed.kind, - parsed.msg, - rangeTypeFix(parsed.sourceRanges) + parsed.error.kind, + parsed.error.msg, + sourceRangeFromRust(parsed.error.sourceRanges[0]), + parsed.operations ) return Promise.reject(kclError) @@ -473,33 +587,15 @@ export const makeDefaultPlanes = async ( } } -export const modifyGrid = async ( - engineCommandManager: EngineCommandManager, - hidden: boolean -): Promise => { - try { - await modify_grid(engineCommandManager, hidden) - return - } catch (e) { - // TODO: do something real with the error. - console.log('modify grid error', e) - return Promise.reject(e) - } -} - -export function lexer(str: string): Token[] | Error { - return lexer_wasm(str) -} - export const modifyAstForSketch = async ( engineCommandManager: EngineCommandManager, - ast: Program, + ast: Node, variableName: string, currentPlane: string, engineId: string -): Promise => { +): Promise> => { try { - const updatedAst: Program = await modify_ast_for_sketch_wasm( + const updatedAst: Node = await modify_ast_for_sketch_wasm( engineCommandManager, JSON.stringify(ast), variableName, @@ -513,7 +609,8 @@ export const modifyAstForSketch = async ( const kclError = new KCLError( parsed.kind, parsed.msg, - rangeTypeFix(parsed.sourceRanges) + sourceRangeFromRust(parsed.sourceRanges[0]), + [] ) console.log(kclError) @@ -581,7 +678,8 @@ export function programMemoryInit(): ProgramMemory | Error { return new KCLError( parsed.kind, parsed.msg, - rangeTypeFix(parsed.sourceRanges) + sourceRangeFromRust(parsed.sourceRanges[0]), + [] ) } } @@ -624,6 +722,21 @@ export function defaultAppSettings(): DeepPartial | Error { return default_app_settings() } +export async function clearSceneAndBustCache( + engineCommandManager: EngineCommandManager +): Promise { + try { + await clear_scene_and_bust_cache(engineCommandManager) + } catch (e: any) { + console.error('clear_scene_and_bust_cache: error', e) + return Promise.reject( + new Error(`Error on clear_scene_and_bust_cache: ${e}`) + ) + } + + return null +} + export function parseAppSettings( toml: string ): DeepPartial | Error { diff --git a/src/lib/cameraControls.ts b/src/lib/cameraControls.ts index 07fac6435..906a6e275 100644 --- a/src/lib/cameraControls.ts +++ b/src/lib/cameraControls.ts @@ -10,7 +10,7 @@ const noModifiersPressed = (e: MouseEvent) => !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey export type CameraSystem = - | 'KittyCAD' + | 'Zoo' | 'OnShape' | 'Trackpad Friendly' | 'Solidworks' @@ -19,7 +19,7 @@ export type CameraSystem = | 'AutoCAD' export const cameraSystems: CameraSystem[] = [ - 'KittyCAD', + 'Zoo', 'OnShape', 'Trackpad Friendly', 'Solidworks', @@ -32,8 +32,13 @@ export function mouseControlsToCameraSystem( mouseControl: MouseControlType | undefined ): CameraSystem | undefined { switch (mouseControl) { - case 'kitty_cad': - return 'KittyCAD' + // TODO: understand why the values come back without underscores and fix the root cause + // @ts-ignore: TS2678 + case 'zoo': + return 'Zoo' + // TODO: understand why the values come back without underscores and fix the root cause + // @ts-ignore: TS2678 + case 'onshape': case 'on_shape': return 'OnShape' case 'trackpad_friendly': @@ -44,6 +49,9 @@ export function mouseControlsToCameraSystem( return 'NX' case 'creo': return 'Creo' + // TODO: understand why the values come back without underscores and fix the root cause + // @ts-ignore: TS2678 + case 'autocad': case 'auto_cad': return 'AutoCAD' default: @@ -77,7 +85,7 @@ export const btnName = (e: MouseEvent) => ({ }) export const cameraMouseDragGuards: Record = { - KittyCAD: { + Zoo: { pan: { description: 'Shift + Right click drag or middle click drag', callback: (e) => diff --git a/src/lib/commandBarConfigs/modelingCommandConfig.ts b/src/lib/commandBarConfigs/modelingCommandConfig.ts index 416a05056..d7d79beb3 100644 --- a/src/lib/commandBarConfigs/modelingCommandConfig.ts +++ b/src/lib/commandBarConfigs/modelingCommandConfig.ts @@ -1,9 +1,15 @@ import { Models } from '@kittycad/lib' +import { angleLengthInfo } from 'components/Toolbar/setAngleLength' +import { transformAstSketchLines } from 'lang/std/sketchcombos' +import { PathToNode } from 'lang/wasm' import { StateMachineCommandSetConfig, KclCommandValue } from 'lib/commandTypes' import { KCL_DEFAULT_LENGTH, KCL_DEFAULT_DEGREE } from 'lib/constants' import { components } from 'lib/machine-api' import { Selections } from 'lib/selections' +import { kclManager } from 'lib/singletons' +import { err } from 'lib/trap' import { modelingMachine, SketchTool } from 'machines/modelingMachine' +import { loftValidator, revolveAxisValidator } from './validators' type OutputFormat = Models['OutputFormat_type'] type OutputTypeKey = OutputFormat['type'] @@ -31,21 +37,49 @@ export type ModelingCommandSchema = { // result: (typeof EXTRUSION_RESULTS)[number] distance: KclCommandValue } + Loft: { + selection: Selections + } + Shell: { + selection: Selections + thickness: KclCommandValue + } Revolve: { selection: Selections angle: KclCommandValue + axis: Selections } Fillet: { // todo selection: Selections radius: KclCommandValue } + 'Offset plane': { + plane: Selections + distance: KclCommandValue + } 'change tool': { tool: SketchTool } + 'Constrain length': { + selection: Selections + length: KclCommandValue + } + 'Constrain with named value': { + currentValue: { + valueText: string + pathToNode: PathToNode + variableName: string + } + namedValue: KclCommandValue + } 'Text-to-CAD': { prompt: string } + 'Prompt-to-edit': { + prompt: string + selection: Selections + } } export const modelingMachineCommandConfig: StateMachineCommandSetConfig< @@ -233,8 +267,7 @@ export const modelingMachineCommandConfig: StateMachineCommandSetConfig< args: { selection: { inputType: 'selection', - // TODO: These are products of an extrude - selectionTypes: ['extrude-wall', 'start-cap', 'end-cap'], + selectionTypes: ['solid2D', 'segment'], multiple: false, // TODO: multiple selection required: true, skip: true, @@ -257,6 +290,40 @@ export const modelingMachineCommandConfig: StateMachineCommandSetConfig< }, }, }, + Loft: { + description: 'Create a 3D body by blending between two or more sketches', + icon: 'loft', + needsReview: true, + args: { + selection: { + inputType: 'selection', + selectionTypes: ['solid2D'], + multiple: true, + required: true, + skip: false, + validation: loftValidator, + }, + }, + }, + Shell: { + description: 'Hollow out a 3D solid.', + icon: 'shell', + needsReview: true, + args: { + selection: { + inputType: 'selection', + selectionTypes: ['cap', 'wall'], + multiple: true, + required: true, + skip: false, + }, + thickness: { + inputType: 'kcl', + defaultValue: KCL_DEFAULT_LENGTH, + required: true, + }, + }, + }, // TODO: Update this configuration, copied from extrude for MVP of revolve, specifically the args.selection Revolve: { description: 'Create a 3D body by rotating a sketch region about an axis.', @@ -265,11 +332,18 @@ export const modelingMachineCommandConfig: StateMachineCommandSetConfig< args: { selection: { inputType: 'selection', - selectionTypes: ['extrude-wall', 'start-cap', 'end-cap'], + selectionTypes: ['solid2D', 'segment'], multiple: false, // TODO: multiple selection required: true, skip: true, }, + axis: { + required: true, + inputType: 'selection', + selectionTypes: ['segment', 'sweepEdge', 'edgeCutEdge'], + multiple: false, + validation: revolveAxisValidator, + }, angle: { inputType: 'kcl', defaultValue: KCL_DEFAULT_DEGREE, @@ -277,27 +351,33 @@ export const modelingMachineCommandConfig: StateMachineCommandSetConfig< }, }, }, + 'Offset plane': { + description: 'Offset a plane.', + icon: 'plane', + args: { + plane: { + inputType: 'selection', + selectionTypes: ['plane'], + multiple: false, + required: true, + skip: true, + }, + distance: { + inputType: 'kcl', + defaultValue: KCL_DEFAULT_LENGTH, + required: true, + }, + }, + }, Fillet: { description: 'Fillet edge', icon: 'fillet', + status: 'development', needsReview: true, args: { selection: { inputType: 'selection', - selectionTypes: [ - 'default', - 'line-end', - 'line-mid', - 'extrude-wall', - 'solid2D', - 'start-cap', - 'end-cap', - 'point', - 'edge', - 'line', - 'arc', - 'all', - ], + selectionTypes: ['segment', 'sweepEdge', 'edgeCutEdge'], multiple: true, required: true, skip: false, @@ -311,6 +391,88 @@ export const modelingMachineCommandConfig: StateMachineCommandSetConfig< }, }, }, + 'Constrain length': { + description: 'Constrain the length of one or more segments.', + icon: 'dimension', + args: { + selection: { + inputType: 'selection', + selectionTypes: ['segment'], + multiple: false, + required: true, + skip: true, + }, + length: { + inputType: 'kcl', + required: true, + createVariableByDefault: true, + defaultValue(_, machineContext) { + const selectionRanges = machineContext?.selectionRanges + if (!selectionRanges) return KCL_DEFAULT_LENGTH + const angleLength = angleLengthInfo({ + selectionRanges, + angleOrLength: 'setLength', + }) + if (err(angleLength)) return KCL_DEFAULT_LENGTH + const { transforms } = angleLength + + // QUESTION: is it okay to reference kclManager here? will its state be up to date? + const sketched = transformAstSketchLines({ + ast: structuredClone(kclManager.ast), + selectionRanges, + transformInfos: transforms, + programMemory: kclManager.programMemory, + referenceSegName: '', + }) + if (err(sketched)) return KCL_DEFAULT_LENGTH + const { valueUsedInTransform } = sketched + return valueUsedInTransform?.toString() || KCL_DEFAULT_LENGTH + }, + }, + }, + }, + 'Constrain with named value': { + description: 'Constrain a value by making it a named constant.', + icon: 'make-variable', + args: { + currentValue: { + description: + 'Path to the node in the AST to constrain. This is never shown to the user.', + inputType: 'text', + required: false, + skip: true, + }, + namedValue: { + inputType: 'kcl', + required: true, + createVariableByDefault: true, + variableName(commandBarContext, machineContext) { + const { currentValue } = commandBarContext.argumentsToSubmit + if ( + !currentValue || + !(currentValue instanceof Object) || + !('variableName' in currentValue) || + typeof currentValue.variableName !== 'string' + ) { + return 'value' + } + return currentValue.variableName + }, + defaultValue: (commandBarContext) => { + const { currentValue } = commandBarContext.argumentsToSubmit + if ( + !currentValue || + !(currentValue instanceof Object) || + !('valueText' in currentValue) || + typeof currentValue.valueText !== 'string' + ) { + return KCL_DEFAULT_LENGTH + } + return currentValue.valueText + }, + }, + }, + }, 'Text-to-CAD': { description: 'Use the Zoo Text-to-CAD API to generate part starters.', icon: 'chat', @@ -321,4 +483,29 @@ export const modelingMachineCommandConfig: StateMachineCommandSetConfig< }, }, }, + 'Prompt-to-edit': { + description: 'Use Zoo AI to edit your kcl', + icon: 'chat', + args: { + selection: { + inputType: 'selection', + selectionTypes: [ + 'solid2D', + 'segment', + 'sweepEdge', + 'cap', + 'wall', + 'edgeCut', + 'edgeCutEdge', + ], + multiple: true, + required: true, + skip: true, + }, + prompt: { + inputType: 'text', + required: true, + }, + }, + }, } diff --git a/src/lib/commandBarConfigs/homeCommandConfig.ts b/src/lib/commandBarConfigs/projectsCommandConfig.ts similarity index 76% rename from src/lib/commandBarConfigs/homeCommandConfig.ts rename to src/lib/commandBarConfigs/projectsCommandConfig.ts index 4ca29bbdc..deec0a8bd 100644 --- a/src/lib/commandBarConfigs/homeCommandConfig.ts +++ b/src/lib/commandBarConfigs/projectsCommandConfig.ts @@ -1,7 +1,8 @@ +import { CommandBarOverwriteWarning } from 'components/CommandBarOverwriteWarning' import { StateMachineCommandSetConfig } from 'lib/commandTypes' -import { homeMachine } from 'machines/homeMachine' +import { projectsMachine } from 'machines/projectsMachine' -export type HomeCommandSchema = { +export type ProjectsCommandSchema = { 'Read projects': {} 'Create project': { name: string @@ -18,9 +19,9 @@ export type HomeCommandSchema = { } } -export const homeCommandBarConfig: StateMachineCommandSetConfig< - typeof homeMachine, - HomeCommandSchema +export const projectsCommandBarConfig: StateMachineCommandSetConfig< + typeof projectsMachine, + ProjectsCommandSchema > = { 'Open project': { icon: 'arrowRight', @@ -53,6 +54,11 @@ export const homeCommandBarConfig: StateMachineCommandSetConfig< icon: 'close', description: 'Delete a project', needsReview: true, + reviewMessage: ({ argumentsToSubmit }) => + CommandBarOverwriteWarning({ + heading: 'Are you sure you want to delete?', + message: `This will permanently delete the project "${argumentsToSubmit.name}" and all its contents.`, + }), args: { name: { inputType: 'options', diff --git a/src/lib/commandBarConfigs/routeCommandConfig.ts b/src/lib/commandBarConfigs/routeCommandConfig.ts new file mode 100644 index 000000000..4c058137d --- /dev/null +++ b/src/lib/commandBarConfigs/routeCommandConfig.ts @@ -0,0 +1,52 @@ +import { Command } from '../commandTypes' +import { PATHS } from 'lib/paths' +import { NavigateFunction, Location } from 'react-router-dom' +export function createRouteCommands( + navigate: NavigateFunction, + location: Location, + filePath: string +) { + const RouteTelemetryCommand: Command = { + name: 'Go to Telemetry', + displayName: `Go to Telemetry`, + description: 'View the Telemetry metrics', + groupId: 'routes', + icon: 'settings', + needsReview: false, + onSubmit: (data) => { + const path = location.pathname.includes(PATHS.FILE) + ? filePath + PATHS.TELEMETRY + '?tab=project' + : PATHS.HOME + PATHS.TELEMETRY + navigate(path) + }, + } + + const RouteHomeCommand: Command = { + name: 'Go to Home', + displayName: `Go to Home`, + description: 'Go to the home page', + groupId: 'routes', + icon: 'settings', + needsReview: false, + onSubmit: (data) => { + navigate(PATHS.HOME) + }, + } + + const RouteSettingsCommand: Command = { + name: 'Go to Settings', + displayName: `Go to Settings`, + description: 'Go to the settings page', + groupId: 'routes', + icon: 'settings', + needsReview: false, + onSubmit: (data) => { + const path = location.pathname.includes(PATHS.FILE) + ? filePath + PATHS.SETTINGS + '?tab=project' + : PATHS.HOME + PATHS.SETTINGS + navigate(path) + }, + } + + return { RouteTelemetryCommand, RouteHomeCommand, RouteSettingsCommand } +} diff --git a/src/lib/commandBarConfigs/validators.ts b/src/lib/commandBarConfigs/validators.ts new file mode 100644 index 000000000..41522c25c --- /dev/null +++ b/src/lib/commandBarConfigs/validators.ts @@ -0,0 +1,155 @@ +import { Models } from '@kittycad/lib' +import { engineCommandManager } from 'lib/singletons' +import { uuidv4 } from 'lib/utils' +import { CommandBarContext } from 'machines/commandBarMachine' +import { Selections } from 'lib/selections' + +export const disableDryRunWithRetry = async (numberOfRetries = 3) => { + for (let tries = 0; tries < numberOfRetries; tries++) { + try { + await engineCommandManager.sendSceneCommand({ + type: 'modeling_cmd_req', + cmd_id: uuidv4(), + cmd: { type: 'disable_dry_run' }, + }) + // Exit out since the command was successful + return + } catch (e) { + console.error(e) + console.error('disable_dry_run failed. This is bad!') + } + } +} + +// Takes a callback function and wraps it around enable_dry_run and disable_dry_run +export const dryRunWrapper = async (callback: () => Promise) => { + // Gotcha: What about race conditions? + try { + await engineCommandManager.sendSceneCommand({ + type: 'modeling_cmd_req', + cmd_id: uuidv4(), + cmd: { type: 'enable_dry_run' }, + }) + const result = await callback() + return result + } catch (e) { + console.error(e) + } finally { + await disableDryRunWithRetry(5) + } +} + +function isSelections(selections: unknown): selections is Selections { + return ( + (selections as Selections).graphSelections !== undefined && + (selections as Selections).otherSelections !== undefined + ) +} + +export const revolveAxisValidator = async ({ + data, + context, +}: { + data: { [key: string]: Selections } + context: CommandBarContext +}): Promise => { + if (!isSelections(context.argumentsToSubmit.selection)) { + return 'Unable to revolve, selections are missing' + } + const artifact = + context.argumentsToSubmit.selection.graphSelections[0].artifact + + if (!artifact) { + return 'Unable to revolve, sketch not found' + } + + if (!('pathId' in artifact)) { + return 'Unable to revolve, sketch has no path' + } + + const sketchSelection = artifact.pathId + let edgeSelection = data.axis.graphSelections[0].artifact?.id + + if (!sketchSelection) { + return 'Unable to revolve, sketch is missing' + } + + if (!edgeSelection) { + return 'Unable to revolve, edge is missing' + } + + const angleInDegrees: Models['Angle_type'] = { + unit: 'degrees', + value: 360, + } + + const revolveAboutEdgeCommand = async () => { + return await engineCommandManager.sendSceneCommand({ + type: 'modeling_cmd_req', + cmd_id: uuidv4(), + cmd: { + type: 'revolve_about_edge', + angle: angleInDegrees, + edge_id: edgeSelection, + target: sketchSelection, + tolerance: 0.0001, + }, + }) + } + const attemptRevolve = await dryRunWrapper(revolveAboutEdgeCommand) + if (attemptRevolve?.success) { + return true + } else { + // return error message for the toast + return 'Unable to revolve with selected axis' + } +} + +export const loftValidator = async ({ + data, +}: { + data: { [key: string]: Selections } + context: CommandBarContext +}): Promise => { + if (!isSelections(data.selection)) { + return 'Unable to loft, selections are missing' + } + const { selection } = data + + if (selection.graphSelections.some((s) => s.artifact?.type !== 'solid2D')) { + return 'Unable to loft, some selection are not solid2Ds' + } + + const sectionIds = data.selection.graphSelections.flatMap((s) => + s.artifact?.type === 'solid2D' ? s.artifact.pathId : [] + ) + + if (sectionIds.length < 2) { + return 'Unable to loft, selection contains less than two solid2Ds' + } + + const loftCommand = async () => { + // TODO: check what to do with these + const DEFAULT_V_DEGREE = 2 + const DEFAULT_TOLERANCE = 2 + const DEFAULT_BEZ_APPROXIMATE_RATIONAL = false + return await engineCommandManager.sendSceneCommand({ + type: 'modeling_cmd_req', + cmd_id: uuidv4(), + cmd: { + section_ids: sectionIds, + type: 'loft', + bez_approximate_rational: DEFAULT_BEZ_APPROXIMATE_RATIONAL, + tolerance: DEFAULT_TOLERANCE, + v_degree: DEFAULT_V_DEGREE, + }, + }) + } + const attempt = await dryRunWrapper(loftCommand) + if (attempt?.success) { + return true + } else { + // return error message for the toast + return 'Unable to loft with selected sketches' + } +} diff --git a/src/lib/commandTypes.ts b/src/lib/commandTypes.ts index 72d0ab9b1..2d5a7e9ea 100644 --- a/src/lib/commandTypes.ts +++ b/src/lib/commandTypes.ts @@ -1,12 +1,13 @@ import { CustomIconName } from 'components/CustomIcon' import { AllMachines } from 'hooks/useStateMachineCommands' import { Actor, AnyStateMachine, ContextFrom, EventFrom } from 'xstate' -import { Selection } from './selections' import { Identifier, Expr, VariableDeclaration } from 'lang/wasm' import { commandBarMachine } from 'machines/commandBarMachine' import { ReactNode } from 'react' import { MachineManager } from 'components/MachineManagerProvider' - +import { Node } from 'wasm-lib/kcl/bindings/Node' +import { Artifact } from 'lang/std/artifactGraph' +import { CommandBarContext } from 'machines/commandBarMachine' type Icon = CustomIconName const PLATFORMS = ['both', 'web', 'desktop'] as const const INPUT_TYPES = [ @@ -24,8 +25,8 @@ export interface KclExpression { } export interface KclExpressionWithVariable extends KclExpression { variableName: string - variableDeclarationAst: VariableDeclaration - variableIdentifierAst: Identifier + variableDeclarationAst: Node + variableIdentifierAst: Node insertIndex: number } export type KclCommandValue = KclExpression | KclExpressionWithVariable @@ -95,6 +96,7 @@ export type CommandConfig< 'name' | 'groupId' | 'onSubmit' | 'onCancel' | 'args' | 'needsReview' > & { needsReview?: true + status?: 'active' | 'development' | 'inactive' args?: { [ArgName in keyof CommandSchema]: CommandArgumentConfig< CommandSchema[ArgName], @@ -143,10 +145,32 @@ export type CommandArgumentConfig< } | { inputType: 'selection' - selectionTypes: Selection['type'][] + selectionTypes: Artifact['type'][] multiple: boolean + validation?: ({ + data, + context, + }: { + data: any + context: CommandBarContext + }) => Promise + } + | { + inputType: 'kcl' + createVariableByDefault?: boolean + variableName?: + | string + | (( + commandBarContext: ContextFrom, + machineContext?: C + ) => string) + defaultValue?: + | string + | (( + commandBarContext: ContextFrom, + machineContext?: C + ) => string) } - | { inputType: 'kcl'; defaultValue?: string } // KCL expression inputs have simple strings as default values | { inputType: 'string' defaultValue?: @@ -217,10 +241,32 @@ export type CommandArgument< } | { inputType: 'selection' - selectionTypes: Selection['type'][] + selectionTypes: Artifact['type'][] multiple: boolean + validation?: ({ + data, + context, + }: { + data: any + context: CommandBarContext + }) => Promise + } + | { + inputType: 'kcl' + createVariableByDefault?: boolean + variableName?: + | string + | (( + commandBarContext: ContextFrom, + machineContext?: ContextFrom + ) => string) + defaultValue?: + | string + | (( + commandBarContext: ContextFrom, + machineContext?: ContextFrom + ) => string) } - | { inputType: 'kcl'; defaultValue?: string } // KCL expression inputs have simple strings as default value | { inputType: 'string' defaultValue?: diff --git a/src/lib/constants.ts b/src/lib/constants.ts index ae0ec5ea9..40417c262 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -52,8 +52,11 @@ export const ONBOARDING_PROJECT_NAME = 'Tutorial Project $nn' export const KCL_DEFAULT_CONSTANT_PREFIXES = { SKETCH: 'sketch', EXTRUDE: 'extrude', + LOFT: 'loft', + SHELL: 'shell', SEGMENT: 'seg', REVOLVE: 'revolve', + PLANE: 'plane', } as const /** The default KCL length expression */ export const KCL_DEFAULT_LENGTH = `5` @@ -69,6 +72,8 @@ export const SETTINGS_FILE_NAME = 'settings.toml' export const TOKEN_FILE_NAME = 'token.txt' export const PROJECT_SETTINGS_FILE_NAME = 'project.toml' export const COOKIE_NAME = '__Secure-next-auth.session-token' +export const TELEMETRY_FILE_NAME = 'boot.txt' +export const TELEMETRY_RAW_FILE_NAME = 'raw-metrics.txt' /** localStorage key to determine if we're in Playwright tests */ export const PLAYWRIGHT_KEY = 'playwright' @@ -106,3 +111,30 @@ export const KCL_SAMPLES_MANIFEST_URLS = { /** Toast id for the app auto-updater toast */ export const AUTO_UPDATER_TOAST_ID = 'auto-updater-toast' + +/** Local sketch axis values in KCL for operations, it could either be 'X' or 'Y' */ +export const KCL_AXIS_X = 'X' +export const KCL_AXIS_Y = 'Y' +export const KCL_AXIS_NEG_X = '-X' +export const KCL_AXIS_NEG_Y = '-Y' +export const KCL_DEFAULT_AXIS = 'X' + +export enum AxisNames { + X = 'x', + Y = 'y', + Z = 'z', + NEG_X = '-x', + NEG_Y = '-y', + NEG_Z = '-z', +} +/** Semantic names of views from AxisNames */ +export const VIEW_NAMES_SEMANTIC = { + [AxisNames.X]: 'Right', + [AxisNames.Y]: 'Back', + [AxisNames.Z]: 'Top', + [AxisNames.NEG_X]: 'Left', + [AxisNames.NEG_Y]: 'Front', + [AxisNames.NEG_Z]: 'Bottom', +} as const +/** The modeling sidebar buttons' IDs get a suffix to prevent collisions */ +export const SIDEBAR_BUTTON_SUFFIX = '-pane-button' diff --git a/src/lib/createMachineCommand.ts b/src/lib/createMachineCommand.ts index 8903f2b5f..abd0c5917 100644 --- a/src/lib/createMachineCommand.ts +++ b/src/lib/createMachineCommand.ts @@ -14,6 +14,7 @@ import { StateMachineCommandSetConfig, StateMachineCommandSetSchema, } from './commandTypes' +import { DEV } from 'env' interface CreateMachineCommandProps< T extends AnyStateMachine, @@ -48,6 +49,7 @@ export function createMachineCommand< const commandConfig = commandBarConfig && commandBarConfig[type] // There may be no command config for this event type, + // or the command may be inactive or hidden, // or there may be multiple commands to create. if (!commandConfig) { return null @@ -72,13 +74,17 @@ export function createMachineCommand< .filter((c) => c !== null) as Command[] } - // Hide commands based on platform by returning `null` + // Hide commands based on platform or development status by returning `null` // so the consumer can filter them out if ('hide' in commandConfig) { const { hide } = commandConfig if (hide === 'both') return null else if (hide === 'desktop' && isDesktop()) return null else if (hide === 'web' && !isDesktop()) return null + } else if ('status' in commandConfig) { + const { status } = commandConfig + if (status === 'inactive') return null + if (status === 'development' && !DEV) return null } const icon = ('icon' in commandConfig && commandConfig.icon) || undefined @@ -111,6 +117,9 @@ export function createMachineCommand< if ('displayName' in commandConfig) { command.displayName = commandConfig.displayName } + if ('reviewMessage' in commandConfig) { + command.reviewMessage = commandConfig.reviewMessage + } return command } @@ -146,6 +155,8 @@ export function buildCommandArgument< context: ContextFrom, machineActor: Actor ): CommandArgument & { inputType: typeof arg.inputType } { + // GOTCHA: modelingCommandConfig is not a 1:1 mapping to this baseCommandArgument + // You need to manually add key/value pairs here. const baseCommandArgument = { description: arg.description, required: arg.required, @@ -172,10 +183,13 @@ export function buildCommandArgument< ...baseCommandArgument, multiple: arg.multiple, selectionTypes: arg.selectionTypes, + validation: arg.validation, } satisfies CommandArgument & { inputType: 'selection' } } else if (arg.inputType === 'kcl') { return { inputType: arg.inputType, + createVariableByDefault: arg.createVariableByDefault, + variableName: arg.variableName, defaultValue: arg.defaultValue, ...baseCommandArgument, } satisfies CommandArgument & { inputType: 'kcl' } diff --git a/src/lib/desktop.test.ts b/src/lib/desktop.test.ts new file mode 100644 index 000000000..5edcdf894 --- /dev/null +++ b/src/lib/desktop.test.ts @@ -0,0 +1,152 @@ +import { vi, describe, it, expect, beforeEach } from 'vitest' +import { listProjects } from './desktop' +import { DeepPartial } from './types' +import { Configuration } from 'wasm-lib/kcl/bindings/Configuration' + +// Mock the electron window global +const mockElectron = { + readdir: vi.fn(), + path: { + join: vi.fn(), + basename: vi.fn(), + dirname: vi.fn(), + }, + stat: vi.fn(), + statIsDirectory: vi.fn(), + exists: vi.fn(), + writeFile: vi.fn(), + readFile: vi.fn(), + os: { + isMac: false, + isWindows: false, + }, + process: { + env: {}, + }, + getPath: vi.fn(), + kittycad: vi.fn(), +} + +vi.stubGlobal('window', { electron: mockElectron }) + +describe('desktop utilities', () => { + const mockConfig: DeepPartial = { + settings: { + project: { + directory: '/test/projects', + }, + }, + } + + const mockFileSystem: { [key: string]: string[] } = { + '/test/projects': [ + '.hidden-project', + 'valid-project', + '.git', + 'project-without-kcl-files', + 'another-valid-project', + ], + '/test/projects/valid-project': [ + 'file1.kcl', + 'file2.stp', + 'file3.kcl', + 'directory1', + ], + '/test/projects/valid-project/directory1': [], + '/test/projects/project-without-kcl-files': ['file3.glb'], + '/test/projects/another-valid-project': [ + 'file4.kcl', + 'directory2', + 'directory3', + ], + '/test/projects/another-valid-project/directory2': [], + '/test/projects/another-valid-project/directory3': [], + } + + beforeEach(() => { + vi.clearAllMocks() + + // Setup default mock implementations + mockElectron.path.join.mockImplementation((...parts: string[]) => + parts.join('/') + ) + mockElectron.path.basename.mockImplementation((path: string) => + path.split('/').pop() + ) + mockElectron.path.dirname.mockImplementation((path: string) => + path.split('/').slice(0, -1).join('/') + ) + + // Mock readdir to return the entries for the given path + mockElectron.readdir.mockImplementation(async (path: string) => { + return mockFileSystem[path] || [] + }) + + // Mock statIsDirectory to return true if the path exists in mockFileSystem + mockElectron.statIsDirectory.mockImplementation(async (path: string) => { + return path in mockFileSystem + }) + + // Mock stat to always resolve with dummy metadata + mockElectron.stat.mockResolvedValue({ + mtimeMs: 123, + atimeMs: 456, + ctimeMs: 789, + size: 100, + mode: 0o666, + }) + + mockElectron.exists.mockResolvedValue(true) + mockElectron.readFile.mockResolvedValue('') + mockElectron.writeFile.mockResolvedValue(undefined) + mockElectron.getPath.mockResolvedValue('/appData') + mockElectron.kittycad.mockResolvedValue({}) + }) + + describe('listProjects', () => { + it('does not list .git directories', async () => { + const projects = await listProjects(mockConfig) + expect(projects.map((p) => p.name)).not.toContain('.git') + }) + it('lists projects excluding hidden and without .kcl files', async () => { + const projects = await listProjects(mockConfig) + + // Verify only non-dot projects with .kcl files were included + expect(projects.map((p) => p.name)).toEqual([ + 'valid-project', + 'another-valid-project', + ]) + + // Verify we didn't try to get project info for dot directories + expect(mockElectron.stat).not.toHaveBeenCalledWith( + expect.stringContaining('/.hidden-project') + ) + expect(mockElectron.stat).not.toHaveBeenCalledWith( + expect.stringContaining('/.git') + ) + + // Verify that projects without .kcl files are not included + expect(projects.map((p) => p.name)).not.toContain( + 'project-without-kcl-files' + ) + }) + + it('correctly counts directories and files', async () => { + const projects = await listProjects(mockConfig) + // Verify that directories and files are counted correctly + expect(projects[0].directory_count).toEqual(1) + expect(projects[0].kcl_file_count).toEqual(2) + expect(projects[1].directory_count).toEqual(2) + expect(projects[1].kcl_file_count).toEqual(1) + }) + + it('handles empty project directory', async () => { + // Adjust mockFileSystem to simulate empty directory + mockFileSystem['/test/projects'] = [] + + const projects = await listProjects(mockConfig) + + expect(projects).toEqual([]) + }) + }) +}) diff --git a/src/lib/desktop.ts b/src/lib/desktop.ts index 247c36dd2..0525655e5 100644 --- a/src/lib/desktop.ts +++ b/src/lib/desktop.ts @@ -12,6 +12,8 @@ import { PROJECT_FOLDER, PROJECT_SETTINGS_FILE_NAME, SETTINGS_FILE_NAME, + TELEMETRY_FILE_NAME, + TELEMETRY_RAW_FILE_NAME, TOKEN_FILE_NAME, } from './constants' import { DeepPartial } from './types' @@ -139,6 +141,11 @@ export async function listProjects( const entries = await window.electron.readdir(projectDir) for (let entry of entries) { + // Skip directories that start with a dot + if (entry.startsWith('.')) { + continue + } + const projectPath = window.electron.path.join(projectDir, entry) // if it's not a directory ignore. const isDirectory = await window.electron.statIsDirectory(projectPath) @@ -300,7 +307,10 @@ const directoryCount = (file: FileEntry) => { let count = 0 if (file.children) { for (let entry of file.children) { - count += 1 + // We only want to count FileEntries with children, e.g. folders + if (entry.children !== null) { + count += 1 + } directoryCount(entry) } } @@ -381,7 +391,9 @@ const getAppFolderName = () => { export const getAppSettingsFilePath = async () => { const isTestEnv = window.electron.process.env.IS_PLAYWRIGHT === 'true' - const testSettingsPath = window.electron.process.env.TEST_SETTINGS_FILE_KEY + const testSettingsPath = await window.electron.getAppTestProperty( + 'TEST_SETTINGS_FILE_KEY' + ) const appConfig = await window.electron.getPath('appData') const fullPath = isTestEnv ? testSettingsPath @@ -398,7 +410,9 @@ export const getAppSettingsFilePath = async () => { } const getTokenFilePath = async () => { const isTestEnv = window.electron.process.env.IS_PLAYWRIGHT === 'true' - const testSettingsPath = window.electron.process.env.TEST_SETTINGS_FILE_KEY + const testSettingsPath = await window.electron.getAppTestProperty( + 'TEST_SETTINGS_FILE_KEY' + ) const appConfig = await window.electron.getPath('appData') const fullPath = isTestEnv ? testSettingsPath @@ -414,6 +428,34 @@ const getTokenFilePath = async () => { return window.electron.path.join(fullPath, TOKEN_FILE_NAME) } +const getTelemetryFilePath = async () => { + const appConfig = await window.electron.getPath('appData') + const fullPath = window.electron.path.join(appConfig, getAppFolderName()) + try { + await window.electron.stat(fullPath) + } catch (e) { + // File/path doesn't exist + if (e === 'ENOENT') { + await window.electron.mkdir(fullPath, { recursive: true }) + } + } + return window.electron.path.join(fullPath, TELEMETRY_FILE_NAME) +} + +const getRawTelemetryFilePath = async () => { + const appConfig = await window.electron.getPath('appData') + const fullPath = window.electron.path.join(appConfig, getAppFolderName()) + try { + await window.electron.stat(fullPath) + } catch (e) { + // File/path doesn't exist + if (e === 'ENOENT') { + await window.electron.mkdir(fullPath, { recursive: true }) + } + } + return window.electron.path.join(fullPath, TELEMETRY_RAW_FILE_NAME) +} + const getProjectSettingsFilePath = async (projectPath: string) => { try { await window.electron.stat(projectPath) @@ -547,6 +589,18 @@ export const writeTokenFile = async (token: string) => { return window.electron.writeFile(tokenFilePath, token) } +export const writeTelemetryFile = async (content: string) => { + const telemetryFilePath = await getTelemetryFilePath() + if (err(content)) return Promise.reject(content) + return window.electron.writeFile(telemetryFilePath, content) +} + +export const writeRawTelemetryFile = async (content: string) => { + const rawTelemetryFilePath = await getRawTelemetryFilePath() + if (err(content)) return Promise.reject(content) + return window.electron.writeFile(rawTelemetryFilePath, content) +} + let appStateStore: Project | undefined = undefined export const getState = async (): Promise => { diff --git a/src/lib/desktopFS.ts b/src/lib/desktopFS.ts index 56093fe66..c09845127 100644 --- a/src/lib/desktopFS.ts +++ b/src/lib/desktopFS.ts @@ -5,7 +5,6 @@ import { INDEX_IDENTIFIER, MAX_PADDING, ONBOARDING_PROJECT_NAME, - PROJECT_ENTRYPOINT, } from 'lib/constants' import { bracket } from './exampleKcl' import { PATHS } from './paths' @@ -14,7 +13,6 @@ import { listProjects, readAppSettingsFile, } from './desktop' -import { engineCommandManager } from './singletons' export const isHidden = (fileOrDir: FileEntry) => !!fileOrDir.name?.startsWith('.') @@ -22,36 +20,20 @@ export const isHidden = (fileOrDir: FileEntry) => export const isDir = (fileOrDir: FileEntry) => 'children' in fileOrDir && fileOrDir.children !== undefined -// Deeply sort the files and directories in a project like VS Code does: -// The main.kcl file is always first, then files, then directories +// Shallow sort the files and directories // Files and directories are sorted alphabetically -export function sortProject(project: FileEntry[]): FileEntry[] { - const sortedProject = project.sort((a, b) => { - if (a.name === PROJECT_ENTRYPOINT) { - return -1 - } else if (b.name === PROJECT_ENTRYPOINT) { +export function sortFilesAndDirectories(files: FileEntry[]): FileEntry[] { + return files.sort((a, b) => { + if (a.children === null && b.children !== null) { return 1 - } else if (a.children === null && b.children !== null) { - return -1 } else if (a.children !== null && b.children === null) { - return 1 + return -1 } else if (a.name && b.name) { return a.name.localeCompare(b.name) } else { return 0 } }) - - return sortedProject.map((fileOrDir: FileEntry) => { - if ('children' in fileOrDir && fileOrDir.children !== null) { - return { - ...fileOrDir, - children: sortProject(fileOrDir.children || []), - } - } else { - return fileOrDir - } - }) } // create a regex to match the project name @@ -120,7 +102,7 @@ export async function getSettingsFolderPaths(projectPath?: string) { } } -export async function createAndOpenNewProject({ +export async function createAndOpenNewTutorialProject({ onProjectOpen, navigate, }: { @@ -133,9 +115,6 @@ export async function createAndOpenNewProject({ ) => void navigate: (path: string) => void }) { - // Clear the scene and end the session. - engineCommandManager.endSession() - // Create a new project with the onboarding project name const configuration = await readAppSettingsFile() const projects = await listProjects(configuration) @@ -144,6 +123,22 @@ export async function createAndOpenNewProject({ ONBOARDING_PROJECT_NAME, nextIndex ) + + // Delete the tutorial project if it already exists. + if (isDesktop()) { + if (configuration.settings?.project?.directory === undefined) { + return Promise.reject(new Error('configuration settings are undefined')) + } + + const fullPath = window.electron.join( + configuration.settings.project.directory, + name + ) + if (window.electron.exists(fullPath)) { + await window.electron.rm(fullPath) + } + } + const newProject = await createNewProjectDirectory( name, bracket, diff --git a/src/lib/exampleKcl.ts b/src/lib/exampleKcl.ts index 8e8138bb0..03da27626 100644 --- a/src/lib/exampleKcl.ts +++ b/src/lib/exampleKcl.ts @@ -3,109 +3,109 @@ export const bracket = `// Shelf Bracket // Define constants -const sigmaAllow = 35000 // psi (6061-T6 aluminum) -const width = 6 // inch -const p = 300 // Force on shelf - lbs -const factorOfSafety = 1.2 // FOS of 1.2 -const shelfMountL = 5 // inches -const wallMountL = 2 // inches -const shelfDepth = 12 // Shelf is 12 inches in depth from the wall -const moment = shelfDepth * p // assume the force is applied at the end of the shelf to be conservative (lb-in) +sigmaAllow = 35000 // psi (6061-T6 aluminum) +width = 6 // inch +p = 300 // Force on shelf - lbs +factorOfSafety = 1.2 // FOS of 1.2 +shelfMountL = 5 // inches +wallMountL = 2 // inches +shelfDepth = 12 // Shelf is 12 inches in depth from the wall +moment = shelfDepth * p // assume the force is applied at the end of the shelf to be conservative (lb-in) -const filletRadius = .375 // inches -const extFilletRadius = .25 // inches -const mountingHoleDiameter = 0.5 // inches +filletRadius = .375 // inches +extFilletRadius = .25 // inches +mountingHoleDiameter = 0.5 // inches // Calculate required thickness of bracket -const thickness = sqrt(moment * factorOfSafety * 6 / (sigmaAllow * width)) // this is the calculation of two brackets holding up the shelf (inches) +thickness = sqrt(moment * factorOfSafety * 6 / (sigmaAllow * width)) // this is the calculation of two brackets holding up the shelf (inches) // Sketch the bracket body and fillet the inner and outer edges of the bend -const bracketLeg1Sketch = startSketchOn('XY') +bracketLeg1Sketch = startSketchOn('XY') |> startProfileAt([0, 0], %) |> line([shelfMountL - filletRadius, 0], %, $fillet1) |> line([0, width], %, $fillet2) |> line([-shelfMountL + filletRadius, 0], %) |> close(%) |> hole(circle({ - center: [1, 1], - radius: mountingHoleDiameter / 2 + center = [1, 1], + radius = mountingHoleDiameter / 2 }, %), %) |> hole(circle({ - center: [shelfMountL - 1.5, width - 1], - radius: mountingHoleDiameter / 2 + center = [shelfMountL - 1.5, width - 1], + radius = mountingHoleDiameter / 2 }, %), %) |> hole(circle({ - center: [1, width - 1], - radius: mountingHoleDiameter / 2 + center = [1, width - 1], + radius = mountingHoleDiameter / 2 }, %), %) |> hole(circle({ - center: [shelfMountL - 1.5, 1], - radius: mountingHoleDiameter / 2 + center = [shelfMountL - 1.5, 1], + radius = mountingHoleDiameter / 2 }, %), %) // Extrude the leg 2 bracket sketch -const bracketLeg1Extrude = extrude(thickness, bracketLeg1Sketch) +bracketLeg1Extrude = extrude(thickness, bracketLeg1Sketch) |> fillet({ - radius: extFilletRadius, - tags: [ + radius = extFilletRadius, + tags = [ getNextAdjacentEdge(fillet1), getNextAdjacentEdge(fillet2) ] }, %) // Sketch the fillet arc -const filletSketch = startSketchOn('XZ') +filletSketch = startSketchOn('XZ') |> startProfileAt([0, 0], %) |> line([0, thickness], %) |> arc({ - angleEnd: 180, - angleStart: 90, - radius: filletRadius + thickness + angleEnd = 180, + angleStart = 90, + radius = filletRadius + thickness }, %) |> line([thickness, 0], %) |> arc({ - angleEnd: 90, - angleStart: 180, - radius: filletRadius + angleEnd = 90, + angleStart = 180, + radius = filletRadius }, %) // Sketch the bend -const filletExtrude = extrude(-width, filletSketch) +filletExtrude = extrude(-width, filletSketch) // Create a custom plane for the leg that sits on the wall -const customPlane = { - plane: { - origin: { x: -filletRadius, y: 0, z: 0 }, - xAxis: { x: 0, y: 1, z: 0 }, - yAxis: { x: 0, y: 0, z: 1 }, - zAxis: { x: 1, y: 0, z: 0 } +customPlane = { + plane = { + origin = { x = -filletRadius, y = 0, z = 0 }, + xAxis = { x = 0, y = 1, z = 0 }, + yAxis = { x = 0, y = 0, z = 1 }, + zAxis = { x = 1, y = 0, z = 0 } } } // Create a sketch for the second leg -const bracketLeg2Sketch = startSketchOn(customPlane) +bracketLeg2Sketch = startSketchOn(customPlane) |> startProfileAt([0, -filletRadius], %) |> line([width, 0], %) |> line([0, -wallMountL], %, $fillet3) |> line([-width, 0], %, $fillet4) |> close(%) |> hole(circle({ - center: [1, -1.5], - radius: mountingHoleDiameter / 2 + center = [1, -1.5], + radius = mountingHoleDiameter / 2 }, %), %) |> hole(circle({ - center: [5, -1.5], - radius: mountingHoleDiameter / 2 + center = [5, -1.5], + radius = mountingHoleDiameter / 2 }, %), %) // Extrude the second leg -const bracketLeg2Extrude = extrude(-thickness, bracketLeg2Sketch) +bracketLeg2Extrude = extrude(-thickness, bracketLeg2Sketch) |> fillet({ - radius: extFilletRadius, - tags: [ + radius = extFilletRadius, + tags = [ getNextAdjacentEdge(fillet3), getNextAdjacentEdge(fillet4) ] @@ -135,8 +135,8 @@ function findLineInExampleCode({ } export const bracketWidthConstantLine = findLineInExampleCode({ - searchText: 'const width', + searchText: 'width =', }) export const bracketThicknessCalculationLine = findLineInExampleCode({ - searchText: 'const thickness', + searchText: 'thickness =', }) diff --git a/src/lib/exportSave.ts b/src/lib/exportSave.ts index 9adbd1b21..54394e4f3 100644 --- a/src/lib/exportSave.ts +++ b/src/lib/exportSave.ts @@ -17,9 +17,17 @@ const save_ = async (file: ModelingAppFile, toastId: string) => { } if (window.electron.process.env.IS_PLAYWRIGHT) { - // skip file picker, save to default location + // Skip file picker, save to the test dir downloads directory + const testSettingsPath = await window.electron.getAppTestProperty( + 'TEST_SETTINGS_FILE_KEY' + ) + const downloadDir = window.electron.join( + testSettingsPath, + 'downloads-during-playwright' + ) + await window.electron.mkdir(downloadDir, { recursive: true }) await window.electron.writeFile( - file.name, + window.electron.join(downloadDir, file.name), new Uint8Array(file.contents) ) toast.success(EXPORT_TOAST_MESSAGES.SUCCESS, { id: toastId }) @@ -68,7 +76,16 @@ const save_ = async (file: ModelingAppFile, toastId: string) => { } // Saves files locally from an export call. -export async function exportSave(data: ArrayBuffer, toastId: string) { +// We override the file's name with one passed in from the client side. +export async function exportSave({ + data, + fileName, + toastId, +}: { + data: ArrayBuffer + fileName: string + toastId: string +}) { // This converts the ArrayBuffer to a Rust equivalent Vec. let uintArray = new Uint8Array(data) @@ -80,9 +97,10 @@ export async function exportSave(data: ArrayBuffer, toastId: string) { zip.file(file.name, new Uint8Array(file.contents), { binary: true }) } return zip.generateAsync({ type: 'array' }).then((contents) => { - return save_({ name: 'output.zip', contents }, toastId) + return save_({ name: `${fileName || 'output'}.zip`, contents }, toastId) }) } else { + files[0].name = fileName || files[0].name return save_(files[0], toastId) } } diff --git a/src/lib/getCurrentProjectFile.ts b/src/lib/getCurrentProjectFile.ts index 27d25c4bb..d3638cb26 100644 --- a/src/lib/getCurrentProjectFile.ts +++ b/src/lib/getCurrentProjectFile.ts @@ -1,5 +1,6 @@ import * as path from 'path' import * as fs from 'fs/promises' +import { Stats } from 'fs' import { Models } from '@kittycad/lib/dist/types/src' import { PROJECT_ENTRYPOINT } from './constants' @@ -43,8 +44,16 @@ export default async function getCurrentProjectFile( ? sourcePath : path.join(process.cwd(), sourcePath) + let stats: Stats + try { + stats = await fs.stat(sourcePath) + } catch (error) { + return new Error( + `Unable to access the path: ${sourcePath}. Error: ${error}` + ) + } + // If the path is a directory, let's assume it is a project directory. - const stats = await fs.stat(sourcePath) if (stats.isDirectory()) { // Walk the directory and look for a kcl file. const files = await fs.readdir(sourcePath) diff --git a/src/lib/kclCommands.ts b/src/lib/kclCommands.ts index f83392b44..1e0ed9dd5 100644 --- a/src/lib/kclCommands.ts +++ b/src/lib/kclCommands.ts @@ -5,7 +5,7 @@ import { isDesktop } from './isDesktop' import { FILE_EXT, PROJECT_SETTINGS_FILE_NAME } from './constants' import { UnitLength_type } from '@kittycad/lib/dist/types/src/models' import { parseProjectSettings } from 'lang/wasm' -import { err } from './trap' +import { err, reportRejection } from './trap' import { projectConfigurationToSettingsPayload } from './settings/settingsUtils' interface OnSubmitProps { @@ -28,7 +28,7 @@ export function kclCommands( groupId: 'code', icon: 'code', onSubmit: () => { - kclManager.format() + kclManager.format().catch(reportRejection) }, }, { diff --git a/src/lib/operations.test.ts b/src/lib/operations.test.ts new file mode 100644 index 000000000..5aeb27836 --- /dev/null +++ b/src/lib/operations.test.ts @@ -0,0 +1,122 @@ +import { defaultRustSourceRange } from 'lang/wasm' +import { filterOperations } from './operations' +import { Operation } from 'wasm-lib/kcl/bindings/Operation' + +function stdlib(name: string): Operation { + return { + type: 'StdLibCall', + name, + unlabeledArg: null, + labeledArgs: {}, + sourceRange: defaultRustSourceRange(), + isError: false, + } +} + +function userCall(name: string): Operation { + return { + type: 'UserDefinedFunctionCall', + name, + functionSourceRange: defaultRustSourceRange(), + unlabeledArg: null, + labeledArgs: {}, + sourceRange: defaultRustSourceRange(), + } +} +function userReturn(): Operation { + return { + type: 'UserDefinedFunctionReturn', + } +} + +describe('operations filtering', () => { + it('drops stdlib operations inside a user-defined function call', async () => { + const operations = [ + stdlib('std1'), + userCall('foo'), + stdlib('std2'), + stdlib('std3'), + userReturn(), + stdlib('std4'), + stdlib('std5'), + ] + const actual = filterOperations(operations) + expect(actual).toEqual([ + stdlib('std1'), + userCall('foo'), + stdlib('std4'), + stdlib('std5'), + ]) + }) + it('drops user-defined function calls that contain no stdlib operations', async () => { + const operations = [ + stdlib('std1'), + userCall('foo'), + userReturn(), + stdlib('std2'), + userCall('bar'), + userReturn(), + stdlib('std3'), + ] + const actual = filterOperations(operations) + expect(actual).toEqual([stdlib('std1'), stdlib('std2'), stdlib('std3')]) + }) + it('preserves user-defined function calls at the end of the list', async () => { + const operations = [stdlib('std1'), userCall('foo')] + const actual = filterOperations(operations) + expect(actual).toEqual([stdlib('std1'), userCall('foo')]) + }) + it('drops all user-defined function return operations', async () => { + // The returns allow us to group operations with the call, but we never + // display the returns. + const operations = [ + stdlib('std1'), + userCall('foo'), + stdlib('std2'), + userReturn(), + stdlib('std3'), + stdlib('std4'), + userCall('foo2'), + stdlib('std5'), + stdlib('std6'), + userReturn(), + stdlib('std7'), + ] + const actual = filterOperations(operations) + expect(actual).toEqual([ + stdlib('std1'), + userCall('foo'), + stdlib('std3'), + stdlib('std4'), + userCall('foo2'), + stdlib('std7'), + ]) + }) + it('correctly filters with nested function calls', async () => { + const operations = [ + stdlib('std1'), + userCall('foo'), + stdlib('std2'), + userReturn(), + stdlib('std3'), + stdlib('std4'), + userCall('foo2'), + stdlib('std5'), + userCall('foo3-nested'), + stdlib('std6'), + userReturn(), + stdlib('std7'), + userReturn(), + stdlib('std8'), + ] + const actual = filterOperations(operations) + expect(actual).toEqual([ + stdlib('std1'), + userCall('foo'), + stdlib('std3'), + stdlib('std4'), + userCall('foo2'), + stdlib('std8'), + ]) + }) +}) diff --git a/src/lib/operations.ts b/src/lib/operations.ts new file mode 100644 index 000000000..163abf8d6 --- /dev/null +++ b/src/lib/operations.ts @@ -0,0 +1,180 @@ +import { CustomIconName } from 'components/CustomIcon' +import { Operation } from 'wasm-lib/kcl/bindings/Operation' + +interface StdLibCallInfo { + label: string + icon: CustomIconName +} + +const stdLibMap: Record = { + chamfer: { + label: 'Chamfer', + icon: 'chamfer3d', + }, + extrude: { + label: 'Extrude', + icon: 'extrude', + }, + fillet: { + label: 'Fillet', + icon: 'fillet3d', + }, + hole: { + label: 'Hole', + icon: 'hole', + }, + hollow: { + label: 'Hollow', + icon: 'hollow', + }, + import: { + label: 'Import', + icon: 'import', + }, + loft: { + label: 'Loft', + icon: 'loft', + }, + offsetPlane: { + label: 'Offset Plane', + icon: 'plane', + }, + patternCircular2d: { + label: 'Circular Pattern', + icon: 'patternCircular2d', + }, + patternCircular3d: { + label: 'Circular Pattern', + icon: 'patternCircular3d', + }, + patternLinear2d: { + label: 'Linear Pattern', + icon: 'patternLinear2d', + }, + patternLinear3d: { + label: 'Linear Pattern', + icon: 'patternLinear3d', + }, + revolve: { + label: 'Revolve', + icon: 'revolve', + }, + shell: { + label: 'Shell', + icon: 'shell', + }, + startSketchOn: { + label: 'Sketch', + icon: 'sketch', + }, + sweep: { + label: 'Sweep', + icon: 'sweep', + }, +} + +/** + * Returns the label of the operation + */ +export function getOperationLabel(op: Operation): string { + switch (op.type) { + case 'StdLibCall': + return stdLibMap[op.name]?.label ?? op.name + case 'UserDefinedFunctionCall': + return op.name ?? 'Anonymous custom function' + case 'UserDefinedFunctionReturn': + return 'User function return' + } +} + +/** + * Returns the icon of the operation + */ +export function getOperationIcon(op: Operation): CustomIconName { + switch (op.type) { + case 'StdLibCall': + return stdLibMap[op.name]?.icon ?? 'questionMark' + default: + return 'make-variable' + } +} + +/** + * Apply all filters to a list of operations. + */ +export function filterOperations(operations: Operation[]): Operation[] { + return operationFilters.reduce((ops, filterFn) => filterFn(ops), operations) +} + +/** + * The filters to apply to a list of operations + * for use in the feature tree UI + */ +const operationFilters = [ + isNotUserFunctionWithNoOperations, + isNotInsideUserFunction, + isNotUserFunctionReturn, +] + +/** + * A filter to exclude everything that occurs inside a UserDefinedFunctionCall + * and its corresponding UserDefinedFunctionReturn from a list of operations. + * This works even when there are nested function calls. + */ +function isNotInsideUserFunction(operations: Operation[]): Operation[] { + const ops: Operation[] = [] + let depth = 0 + for (const op of operations) { + if (depth === 0) { + ops.push(op) + } + if (op.type === 'UserDefinedFunctionCall') { + depth++ + } + if (op.type === 'UserDefinedFunctionReturn') { + depth-- + console.assert( + depth >= 0, + 'Unbalanced UserDefinedFunctionCall and UserDefinedFunctionReturn; too many returns' + ) + } + } + // Depth could be non-zero here if there was an error in execution. + return ops +} + +/** + * A filter to exclude UserDefinedFunctionCall operations and their + * corresponding UserDefinedFunctionReturn that don't have any operations inside + * them from a list of operations. + */ +function isNotUserFunctionWithNoOperations( + operations: Operation[] +): Operation[] { + return operations.filter((op, index) => { + if ( + op.type === 'UserDefinedFunctionCall' && + // If this is a call at the end of the array, it's preserved. + index < operations.length - 1 && + operations[index + 1].type === 'UserDefinedFunctionReturn' + ) + return false + if ( + op.type === 'UserDefinedFunctionReturn' && + // If this return is at the beginning of the array, it's preserved. + index > 0 && + operations[index - 1].type === 'UserDefinedFunctionCall' + ) + return false + + return true + }) +} + +/** + * A filter to exclude UserDefinedFunctionReturn operations from a list of + * operations. + */ +function isNotUserFunctionReturn(ops: Operation[]): Operation[] { + return ops.filter((op) => op.type !== 'UserDefinedFunctionReturn') +} diff --git a/src/lib/paths.ts b/src/lib/paths.ts index 785acaceb..952b72fd6 100644 --- a/src/lib/paths.ts +++ b/src/lib/paths.ts @@ -42,6 +42,7 @@ export const PATHS = { SETTINGS_KEYBINDINGS: `${SETTINGS}?tab=keybindings` as const, SIGN_IN: '/signin', ONBOARDING: prependRoutes(onboardingPaths)('/onboarding') as OnboardingPaths, + TELEMETRY: '/telemetry', } as const export const BROWSER_PATH = `%2F${BROWSER_PROJECT_NAME}%2F${BROWSER_FILE_NAME}${FILE_EXT}` diff --git a/src/lib/performance.ts b/src/lib/performance.ts new file mode 100644 index 000000000..c9b359bf0 --- /dev/null +++ b/src/lib/performance.ts @@ -0,0 +1,127 @@ +import { isDesktop } from 'lib/isDesktop' + +function isWeb(): boolean { + // Identify browser environment when following property is not present + // https://nodejs.org/dist/latest-v16.x/docs/api/perf_hooks.html#performancenodetiming + return ( + typeof performance === 'object' && + typeof performance.mark === 'function' && + // @ts-ignore + !performance.nodeTiming + ) +} + +function isNode(): boolean { + // @ts-ignore + return typeof process === 'object' && performance.nodeTiming +} + +function getRuntime(): string { + if (isDesktop()) { + return 'electron' + } else if (isNode()) { + return 'nodejs' + } else if (isWeb()) { + return 'web' + } + return 'runtime unknown, could not detect' +} + +export interface PerformanceMarkDetail { + [key: string]: any +} + +export interface PerformanceMark { + name: string + startTime: number + entryType: string + detail: null | PerformanceMarkDetail + duration?: number +} + +export interface MarkHelpers { + mark(name: string, options?: PerformanceMark): void + markOnce(name: string, options?: PerformanceMark): void + getMarks(): PerformanceMark[] +} + +/** + * Detect performance API environment, either Web or Node.js + */ +function detectEnvironment(): MarkHelpers { + const seenMarks: { [key: string]: boolean } = {} + if (isWeb() || isNode() || isDesktop()) { + // in a browser context, reuse performance-util + // https://developer.mozilla.org/en-US/docs/Web/API/Performance + + function _mark(name: string, options?: PerformanceMark) { + const _options = { + ...options, + } + + // Automatically append detail data for a canonical form + if (!_options.detail) { + _options.detail = {} + } + _options.detail.runtime = getRuntime() + + performance.mark(name, _options) + } + + const _helpers: MarkHelpers = { + mark(name: string, options?: PerformanceMark) { + _mark(name, options) + }, + markOnce(name: string, options?: PerformanceMark) { + if (seenMarks[name]) { + return + } + _mark(name, options) + seenMarks[name] = true + }, + getMarks() { + let timeOrigin = performance.timeOrigin + const result: PerformanceMark[] = [ + { + name: 'code/timeOrigin', + startTime: Math.round(timeOrigin), + detail: { runtime: getRuntime() }, + entryType: 'mark', + }, + ] + for (const entry of performance.getEntriesByType('mark')) { + result.push({ + name: entry.name, + // Make everything unix time + startTime: Math.round(timeOrigin + entry.startTime), + // @ts-ignore - we can assume this is just any object with [key:string]: any + detail: entry.detail, + entryType: entry.entryType, + }) + } + return result + }, + } + return _helpers + } else { + // This would be browsers that do not support the performance API. + // TODO: Implement a polyfill + console.error('No performance API found globally. Going to be a bad time.') + return { + mark() { + /*no op*/ + }, + markOnce() { + /*no op*/ + }, + getMarks() { + return [] + }, + } + } +} + +const env = detectEnvironment() +export const mark = env.mark +export const getMarks = env.getMarks +export const markOnce = env.markOnce diff --git a/src/lib/promptToEdit.ts b/src/lib/promptToEdit.ts new file mode 100644 index 000000000..d52fc3c3e --- /dev/null +++ b/src/lib/promptToEdit.ts @@ -0,0 +1,345 @@ +import { Models } from '@kittycad/lib' +import { VITE_KC_API_BASE_URL } from 'env' +import crossPlatformFetch from './crossPlatformFetch' +import { err, reportRejection } from './trap' +import { Selections } from './selections' +import { ArtifactGraph, getArtifactOfTypes } from 'lang/std/artifactGraph' +import { SourceRange } from 'lang/wasm' +import toast from 'react-hot-toast' +import { codeManager, editorManager, kclManager } from './singletons' +import { ToastPromptToEditCadSuccess } from 'components/ToastTextToCad' +import { uuidv4 } from './utils' +import { diffLines } from 'diff' +import { Transaction, EditorSelection, SelectionRange } from '@codemirror/state' +import { modelingMachineEvent } from 'editor/manager' + +function sourceIndexToLineColumn( + code: string, + index: number +): { line: number; column: number } { + const codeStart = code.slice(0, index) + const lines = codeStart.split('\n') + const line = lines.length + const column = lines[lines.length - 1].length + return { line, column } +} + +function convertAppRangeToApiRange( + range: SourceRange, + code: string +): Models['SourceRange_type'] { + return { + start: sourceIndexToLineColumn(code, range[0]), + end: sourceIndexToLineColumn(code, range[1]), + } +} + +export async function submitPromptToEditToQueue({ + prompt, + selections, + code, + token, + artifactGraph, +}: { + prompt: string + selections: Selections + code: string + token?: string + artifactGraph: ArtifactGraph +}): Promise { + const ranges: Models['TextToCadIterationBody_type']['source_ranges'] = + selections.graphSelections.flatMap((selection) => { + const artifact = selection.artifact + const prompts: Models['TextToCadIterationBody_type']['source_ranges'] = [] + + if (artifact?.type === 'cap') { + prompts.push({ + prompt: `The users main selection is the end cap of a general-sweep (that is an extrusion, revolve, sweep or loft). +The source range most likely refers to "startProfileAt" simply because this is the start of the profile that was swept. +If you need to operate on this cap, for example for sketching on the face, you can use the special string ${ + artifact.subType === 'end' ? 'END' : 'START' + } i.e. \`startSketchOn(someSweepVariable, ${ + artifact.subType === 'end' ? 'END' : 'START' + })\` +When they made this selection they main have intended this surface directly or meant something more general like the sweep body. +See later source ranges for more context.`, + range: convertAppRangeToApiRange(selection.codeRef.range, code), + }) + let sweep = getArtifactOfTypes( + { key: artifact.sweepId, types: ['sweep'] }, + artifactGraph + ) + if (!err(sweep)) { + prompts.push({ + prompt: `This is the sweep's source range from the user's main selection of the end cap.`, + range: convertAppRangeToApiRange(sweep.codeRef.range, code), + }) + } + } + if (artifact?.type === 'wall') { + prompts.push({ + prompt: `The users main selection is the wall of a general-sweep (that is an extrusion, revolve, sweep or loft). +The source range though is for the original segment before it was extruded, you can add a tag to that segment in order to refer to this wall, for example "startSketchOn(someSweepVariable, segmentTag)" +But it's also worth bearing in mind that the user may have intended to select the sweep itself, not this individual wall, see later source ranges for more context. about the sweep`, + range: convertAppRangeToApiRange(selection.codeRef.range, code), + }) + let sweep = getArtifactOfTypes( + { key: artifact.sweepId, types: ['sweep'] }, + artifactGraph + ) + if (!err(sweep)) { + prompts.push({ + prompt: `This is the sweep's source range from the user's main selection of the end cap.`, + range: convertAppRangeToApiRange(sweep.codeRef.range, code), + }) + } + } + if (artifact?.type === 'sweepEdge') { + prompts.push({ + prompt: `The users main selection is the edge of a general-sweep (that is an extrusion, revolve, sweep or loft). +it is an ${ + artifact.subType + } edge, in order to refer to this edge you should add a tag to the segment function in this source range, +and then use the function ${ + artifact.subType === 'adjacent' + ? 'getAdjacentEdge' + : 'getOppositeEdge' + } +See later source ranges for more context. about the sweep`, + range: convertAppRangeToApiRange(selection.codeRef.range, code), + }) + let sweep = getArtifactOfTypes( + { key: artifact.sweepId, types: ['sweep'] }, + artifactGraph + ) + if (!err(sweep)) { + prompts.push({ + prompt: `This is the sweep's source range from the user's main selection of the end cap.`, + range: convertAppRangeToApiRange(sweep.codeRef.range, code), + }) + } + } + if (artifact?.type === 'segment') { + if (!artifact.surfaceId) { + prompts.push({ + prompt: `This selection is of a segment, likely an individual part of a profile. Segments are often "constrained" by the use of variables and relationships with other segments. Adding tags to segments helps refer to their length, angle or other properties`, + range: convertAppRangeToApiRange(selection.codeRef.range, code), + }) + } else { + prompts.push({ + prompt: `This selection is for a segment (line, xLine, angledLine etc) that has been swept (a general-sweep, either an extrusion, revolve, sweep or loft). +Because it now refers to an edge the way to refer to this edge is to add a tag to the segment, and then use that tag directly. +i.e. \`fillet({ radius = someInteger, tags = [newTag] }, %)\` will work in the case of filleting this edge +See later source ranges for more context. about the sweep`, + range: convertAppRangeToApiRange(selection.codeRef.range, code), + }) + let path = getArtifactOfTypes( + { key: artifact.pathId, types: ['path'] }, + artifactGraph + ) + if (!err(path)) { + const sweep = getArtifactOfTypes( + { key: path.sweepId, types: ['sweep'] }, + artifactGraph + ) + if (!err(sweep)) { + prompts.push({ + prompt: `This is the sweep's source range from the user's main selection of the edge.`, + range: convertAppRangeToApiRange(sweep.codeRef.range, code), + }) + } + } + } + } + return prompts + }) + const body: Models['TextToCadIterationBody_type'] = { + original_source_code: code, + prompt, + source_ranges: ranges, + } + const url = VITE_KC_API_BASE_URL + '/ml/text-to-cad/iteration' + const data: Models['TextToCadIteration_type'] | Error = + await crossPlatformFetch( + url, + { + method: 'POST', + body: JSON.stringify(body), + }, + token + ) + + // Make sure we have an id. + if (data instanceof Error) { + return data + } + + if (!data.id) { + return new Error('No id returned from Text-to-CAD API') + } + return data +} + +export async function getPromptToEditResult( + id: string, + token?: string +): Promise { + const url = VITE_KC_API_BASE_URL + '/async/operations/' + id + const data: Models['TextToCadIteration_type'] | Error = + await crossPlatformFetch( + url, + { + method: 'GET', + }, + token + ) + + return data +} + +export async function doPromptEdit({ + prompt, + selections, + code, + token, + artifactGraph, +}: { + prompt: string + selections: Selections + code: string + token?: string + artifactGraph: ArtifactGraph +}): Promise { + const toastId = toast.loading('Submitting to Text-to-CAD API...') + const submitResult = await submitPromptToEditToQueue({ + prompt, + selections, + code, + token, + artifactGraph, + }) + if (err(submitResult)) return submitResult + + const textToCadComplete = new Promise( + (resolve, reject) => { + ;(async () => { + const MAX_CHECK_TIMEOUT = 3 * 60_000 + const CHECK_DELAY = 200 + + let timeElapsed = 0 + + while (timeElapsed < MAX_CHECK_TIMEOUT) { + const check = await getPromptToEditResult(submitResult.id, token) + if (check instanceof Error || check.status === 'failed') { + reject(check) + return + } else if (check.status === 'completed') { + resolve(check) + return + } + + await new Promise((r) => setTimeout(r, CHECK_DELAY)) + timeElapsed += CHECK_DELAY + } + + reject(new Error('Text-to-CAD API timed out')) + })().catch(reportRejection) + } + ) + + try { + const result = await textToCadComplete + toast.dismiss(toastId) + return result + } catch (e) { + toast.dismiss(toastId) + toast.error( + 'Failed to edit your KCL code, please try again with a different prompt or selection' + ) + console.error('textToCadComplete', e) + } + + return textToCadComplete +} + +/** takes care of the whole submit prompt to endpoint flow including the accept-reject toast once the result is back */ +export async function promptToEditFlow({ + prompt, + selections, + code, + token, + artifactGraph, +}: { + prompt: string + selections: Selections + code: string + token?: string + artifactGraph: ArtifactGraph +}) { + const result = await doPromptEdit({ + prompt, + selections, + code, + token, + artifactGraph, + }) + if (err(result)) return Promise.reject(result) + const oldCode = codeManager.code + const { code: newCode } = result + codeManager.updateCodeEditor(newCode) + const diff = reBuildNewCodeWithRanges(oldCode, newCode) + const ranges: SelectionRange[] = diff.insertRanges.map((range) => + EditorSelection.range(range[0], range[1]) + ) + editorManager?.editorView?.dispatch({ + selection: EditorSelection.create( + ranges, + selections.graphSelections.length - 1 + ), + annotations: [modelingMachineEvent, Transaction.addToHistory.of(false)], + }) + await kclManager.executeCode() + const toastId = uuidv4() + + toast.success( + () => + ToastPromptToEditCadSuccess({ + toastId, + data: result, + token, + oldCode, + }), + { + id: toastId, + duration: Infinity, + icon: null, + } + ) +} + +const reBuildNewCodeWithRanges = ( + oldCode: string, + newCode: string +): { + newCode: string + insertRanges: SourceRange[] +} => { + let insertRanges: SourceRange[] = [] + const changes = diffLines(oldCode, newCode) + let newCodeWithRanges = '' + for (const change of changes) { + if (!change.added && !change.removed) { + // no change add it to newCodeWithRanges + newCodeWithRanges += change.value + } else if (change.added && !change.removed) { + const start = newCodeWithRanges.length + const end = start + change.value.length + insertRanges.push([start, end, true]) + newCodeWithRanges += change.value + } + } + return { + newCode: newCodeWithRanges, + insertRanges, + } +} diff --git a/src/lib/rectangleTool.ts b/src/lib/rectangleTool.ts index 5b6dd3f98..6b9fdc66f 100644 --- a/src/lib/rectangleTool.ts +++ b/src/lib/rectangleTool.ts @@ -9,8 +9,16 @@ import { createUnaryExpression, } from 'lang/modifyAst' import { ArrayExpression, CallExpression, PipeExpression } from 'lang/wasm' +import { roundOff } from 'lib/utils' +import { + isCallExpression, + isArrayExpression, + isLiteral, + isBinaryExpression, +} from 'lang/util' /** + * It does not create the startSketchOn and it does not create the startProfileAt. * Returns AST expressions for this KCL code: * const yo = startSketchOn('XY') * |> startProfileAt([0, 0], %) @@ -92,3 +100,69 @@ export function updateRectangleSketch( createLiteral(Math.abs(y)), // This will be the height of the rectangle ]) } + +/** + * Mutates the pipeExpression to update the center rectangle sketch + * @param pipeExpression + * @param x + * @param y + * @param tag + */ +export function updateCenterRectangleSketch( + pipeExpression: PipeExpression, + deltaX: number, + deltaY: number, + tag: string, + originX: number, + originY: number +) { + let startX = originX - Math.abs(deltaX) + let startY = originY - Math.abs(deltaY) + + // pipeExpression.body[1] is startProfileAt + let callExpression = pipeExpression.body[1] + if (isCallExpression(callExpression)) { + const arrayExpression = callExpression.arguments[0] + if (isArrayExpression(arrayExpression)) { + callExpression.arguments[0] = createArrayExpression([ + createLiteral(roundOff(startX)), + createLiteral(roundOff(startY)), + ]) + } + } + + const twoX = deltaX * 2 + const twoY = deltaY * 2 + + callExpression = pipeExpression.body[2] + if (isCallExpression(callExpression)) { + const arrayExpression = callExpression.arguments[0] + if (isArrayExpression(arrayExpression)) { + const literal = arrayExpression.elements[0] + if (isLiteral(literal)) { + callExpression.arguments[0] = createArrayExpression([ + createLiteral(literal.value), + createLiteral(Math.abs(twoX)), + ]) + } + } + } + + callExpression = pipeExpression.body[3] + if (isCallExpression(callExpression)) { + const arrayExpression = callExpression.arguments[0] + if (isArrayExpression(arrayExpression)) { + const binaryExpression = arrayExpression.elements[0] + if (isBinaryExpression(binaryExpression)) { + callExpression.arguments[0] = createArrayExpression([ + createBinaryExpression([ + createCallExpressionStdLib('segAng', [createIdentifier(tag)]), + binaryExpression.operator, + createLiteral(90), + ]), // 90 offset from the previous line + createLiteral(Math.abs(twoY)), // This will be the height of the rectangle + ]) + } + } + } +} diff --git a/src/lib/routeLoaders.ts b/src/lib/routeLoaders.ts index 14e4d5c4f..94237ac86 100644 --- a/src/lib/routeLoaders.ts +++ b/src/lib/routeLoaders.ts @@ -15,6 +15,7 @@ import { fileSystemManager } from 'lang/std/fileSystemManager' import { getProjectInfo } from './desktop' import { createSettings } from './settings/initialSettings' import { normalizeLineEndings } from 'lib/codeEditor' +import { OnboardingStatus } from 'wasm-lib/kcl/bindings/OnboardingStatus' // The root loader simply resolves the settings and any errors that // occurred during the settings load @@ -44,17 +45,24 @@ export const settingsLoader: LoaderFunction = async ({ return settings } +export const telemetryLoader: LoaderFunction = async ({ + params, +}): Promise => { + return null +} + // Redirect users to the appropriate onboarding page if they haven't completed it export const onboardingRedirectLoader: ActionFunction = async (args) => { const { settings } = await loadAndValidateSettings() - const onboardingStatus = settings.app.onboardingStatus.current || '' + const onboardingStatus: OnboardingStatus = + settings.app.onboardingStatus.current || '' const notEnRouteToOnboarding = !args.request.url.includes( PATHS.ONBOARDING.INDEX ) - // '' is the initial state, 'done' and 'dismissed' are the final states + // '' is the initial state, 'completed' and 'dismissed' are the final states const hasValidOnboardingStatus = onboardingStatus.length === 0 || - !(onboardingStatus === 'done' || onboardingStatus === 'dismissed') + !(onboardingStatus === 'completed' || onboardingStatus === 'dismissed') const shouldRedirectToOnboarding = notEnRouteToOnboarding && hasValidOnboardingStatus @@ -79,12 +87,13 @@ export const fileLoader: LoaderFunction = async ( ) const isBrowserProject = params.id === decodeURIComponent(BROWSER_PATH) + let code = '' + if (!isBrowserProject && projectPathData) { const { projectName, projectPath, currentFileName, currentFilePath } = projectPathData const urlObj = new URL(routerData.request.url) - let code = '' if (!urlObj.pathname.endsWith('/settings')) { const fallbackFile = isDesktop() @@ -114,11 +123,19 @@ export const fileLoader: LoaderFunction = async ( }) code = normalizeLineEndings(code) + // If persistCode in localStorage is present, it'll persist that code + // through *anything*. INTENDED FOR TESTS. + if (window.electron.process.env.IS_PLAYWRIGHT) { + code = codeManager.localStoragePersistCode() || code + } + // Update both the state and the editor's code. // We explicitly do not write to the file here since we are loading from // the file system and not the editor. codeManager.updateCurrentFilePath(currentFilePath) - codeManager.updateCodeStateEditor(code) + // We pass true on the end here to clear the code editor history. + // This way undo and redo are not super weird when opening new files. + codeManager.updateCodeStateEditor(code, true) } // Set the file system manager to the project path @@ -139,12 +156,6 @@ export const fileLoader: LoaderFunction = async ( ? await getProjectInfo(projectPath) : null - console.log('maybeProjectInfo', { - maybeProjectInfo, - defaultProjectData, - projectPathData, - }) - const projectData: IndexLoaderData = { code, project: maybeProjectInfo ?? defaultProjectData, @@ -161,7 +172,7 @@ export const fileLoader: LoaderFunction = async ( } return { - code: '', + code, project: { name: BROWSER_PROJECT_NAME, path: '/' + BROWSER_PROJECT_NAME, diff --git a/src/lib/screenshot.ts b/src/lib/screenshot.ts index aee920155..190a94997 100644 --- a/src/lib/screenshot.ts +++ b/src/lib/screenshot.ts @@ -1,6 +1,24 @@ -import html2canvas from 'html2canvas-pro' +function takeScreenshotOfVideoStreamCanvas() { + const canvas = document.querySelector('[data-engine]') + const video = document.getElementById('video-stream') + if ( + canvas && + video && + canvas instanceof HTMLCanvasElement && + video instanceof HTMLVideoElement + ) { + const videoCanvas = document.createElement('canvas') + videoCanvas.width = canvas.width + videoCanvas.height = canvas.height + const context = videoCanvas.getContext('2d') + context?.drawImage(video, 0, 0, videoCanvas.width, videoCanvas.height) + const url = videoCanvas.toDataURL('image/png') + return url + } else { + return '' + } +} -// Return a data URL (png format) of the screenshot of the current page. export default async function screenshot(): Promise { if (typeof window === 'undefined') { return Promise.reject( @@ -9,11 +27,17 @@ export default async function screenshot(): Promise { ) ) } - return html2canvas(document.documentElement) - .then((canvas) => { - return canvas.toDataURL() - }) - .catch((error) => { - return Promise.reject(error) - }) + + if (window.electron) { + const canvas = document.querySelector('[data-engine]') + if (canvas instanceof HTMLCanvasElement) { + const url = await window.electron.takeElectronWindowScreenshot({ + width: canvas?.width || 500, + height: canvas?.height || 500, + }) + return url !== '' ? url : takeScreenshotOfVideoStreamCanvas() + } + } + + return takeScreenshotOfVideoStreamCanvas() } diff --git a/src/lib/selections.ts b/src/lib/selections.ts index 0e1ff2a15..e6cc5a91a 100644 --- a/src/lib/selections.ts +++ b/src/lib/selections.ts @@ -5,7 +5,12 @@ import { kclManager, sceneEntitiesManager, } from 'lib/singletons' -import { CallExpression, SourceRange, Expr, parse } from 'lang/wasm' +import { + CallExpression, + SourceRange, + Expr, + defaultSourceRange, +} from 'lang/wasm' import { ModelingMachineEvent } from 'machines/modelingMachine' import { isNonNullable, uuidv4 } from 'lib/utils' import { EditorSelection, SelectionRange } from '@codemirror/state' @@ -13,13 +18,13 @@ import { getNormalisedCoordinates, isOverlap } from 'lib/utils' import { isCursorInSketchCommandRange } from 'lang/util' import { Program } from 'lang/wasm' import { - doesPipeHaveCallExp, getNodeFromPath, - hasSketchPipeBeenExtruded, + getNodePathFromSourceRange, isSingleCursorInPipe, } from 'lang/queryAst' import { CommandArgument } from './commandTypes' import { + DefaultPlaneStr, getParentGroup, SEGMENT_BODIES_PLUS_PROFILE_START, } from 'clientSideScene/sceneEntities' @@ -28,21 +33,30 @@ import { AXIS_GROUP, X_AXIS } from 'clientSideScene/sceneInfra' import { PathToNodeMap } from 'lang/std/sketchcombos' import { err } from 'lib/trap' import { + Artifact, getArtifactOfTypes, getArtifactsOfTypes, getCapCodeRef, getSweepEdgeCodeRef, getSolid2dCodeRef, getWallCodeRef, + CodeRef, + getCodeRefsByArtifactId, ArtifactId, } from 'lang/std/artifactGraph' +import { Node } from 'wasm-lib/kcl/bindings/Node' export const X_AXIS_UUID = 'ad792545-7fd3-482a-a602-a93924e3055b' export const Y_AXIS_UUID = '680fd157-266f-4b8a-984f-cdf46b8bdf01' export type Axis = 'y-axis' | 'x-axis' | 'z-axis' +export type DefaultPlaneSelection = { + name: DefaultPlaneStr + id: string +} -export type Selection = +/** @deprecated Use {@link Artifact} instead. */ +type Selection__old = | { type: | 'default' @@ -66,9 +80,90 @@ export type Selection = // TODO this is a temporary measure that well be made redundant with: https://github.com/KittyCAD/modeling-app/pull/3836 secondaryRange: SourceRange } +export type NonCodeSelection = Axis | DefaultPlaneSelection + +/** @deprecated Use {@link Selection} instead. */ +export type Selections__old = { + otherSelections: NonCodeSelection[] + codeBasedSelections: Selection__old[] +} +export interface Selection { + artifact?: Artifact + codeRef: CodeRef +} export type Selections = { - otherSelections: Axis[] - codeBasedSelections: Selection[] + otherSelections: Array + graphSelections: Array +} + +/** @deprecated If you're writing a new function, it should use {@link Selection} and not {@link Selection__old} + * this function should only be used for backwards compatibility with old functions. + */ +function convertSelectionToOld(selection: Selection): Selection__old | null { + // return {} as Selection__old + // TODO implementation + const _artifact = selection.artifact + if (_artifact?.type === 'solid2D') { + const codeRef = getSolid2dCodeRef( + _artifact, + engineCommandManager.artifactGraph + ) + if (err(codeRef)) return null + return { range: codeRef.range, type: 'solid2D' } + } + if (_artifact?.type === 'cap') { + const codeRef = getCapCodeRef(_artifact, engineCommandManager.artifactGraph) + if (err(codeRef)) return null + return { + range: codeRef.range, + type: _artifact?.subType === 'end' ? 'end-cap' : 'start-cap', + } + } + if (_artifact?.type === 'wall') { + const codeRef = getWallCodeRef( + _artifact, + engineCommandManager.artifactGraph + ) + if (err(codeRef)) return null + return { range: codeRef.range, type: 'extrude-wall' } + } + if (_artifact?.type === 'segment' || _artifact?.type === 'path') { + return { range: _artifact.codeRef.range, type: 'default' } + } + if (_artifact?.type === 'sweepEdge') { + const codeRef = getSweepEdgeCodeRef( + _artifact, + engineCommandManager.artifactGraph + ) + if (err(codeRef)) return null + if (_artifact?.subType === 'adjacent') { + return { range: codeRef.range, type: 'adjacent-edge' } + } + return { range: codeRef.range, type: 'edge' } + } + if (_artifact?.type === 'edgeCut') { + const codeRef = _artifact.codeRef + return { range: codeRef.range, type: 'default' } + } + if (selection?.codeRef?.range) { + return { range: selection.codeRef.range, type: 'default' } + } + return null +} +/** @deprecated If you're writing a new function, it should use {@link Selection} and not {@link Selection__old} + * this function should only be used for backwards compatibility with old functions. + */ +export function convertSelectionsToOld(selection: Selections): Selections__old { + const selections: Selection__old[] = [] + for (const artifact of selection.graphSelections) { + const converted = convertSelectionToOld(artifact) + if (converted) selections.push(converted) + } + const selectionsOld: Selections__old = { + otherSelections: selection.otherSelections, + codeBasedSelections: selections, + } + return selectionsOld } export async function getEventForSelectWithPoint({ @@ -87,133 +182,44 @@ export async function getEventForSelectWithPoint({ return { type: 'Set selection', data: { - selectionType: 'otherSelection', + selectionType: 'axisSelection', selection: X_AXIS_UUID === data.entity_id ? 'x-axis' : 'y-axis', }, } } + + // Check for default plane selection + const foundDefaultPlane = + engineCommandManager.defaultPlanes !== null && + Object.entries(engineCommandManager.defaultPlanes).find( + ([, plane]) => plane === data.entity_id + ) + if (foundDefaultPlane) { + return { + type: 'Set selection', + data: { + selectionType: 'defaultPlaneSelection', + selection: { + name: foundDefaultPlane[0] as DefaultPlaneStr, + id: data.entity_id, + }, + }, + } + } + let _artifact = engineCommandManager.artifactGraph.get(data.entity_id) - if (!_artifact) - return { - type: 'Set selection', - data: { selectionType: 'singleCodeCursor' }, - } - if (_artifact.type === 'solid2D') { - const codeRef = getSolid2dCodeRef( - _artifact, - engineCommandManager.artifactGraph - ) - if (err(codeRef)) return null - return { - type: 'Set selection', - data: { - selectionType: 'singleCodeCursor', - selection: { range: codeRef.range, type: 'solid2D' }, - }, - } - } - if (_artifact.type === 'cap') { - const codeRef = getCapCodeRef(_artifact, engineCommandManager.artifactGraph) - if (err(codeRef)) return null + const codeRefs = getCodeRefsByArtifactId( + data.entity_id, + engineCommandManager.artifactGraph + ) + if (_artifact && codeRefs) { return { type: 'Set selection', data: { selectionType: 'singleCodeCursor', selection: { - range: codeRef.range, - type: _artifact?.subType === 'end' ? 'end-cap' : 'start-cap', - }, - }, - } - } - if (_artifact.type === 'wall') { - const codeRef = getWallCodeRef( - _artifact, - engineCommandManager.artifactGraph - ) - if (err(codeRef)) return null - return { - type: 'Set selection', - data: { - selectionType: 'singleCodeCursor', - selection: { range: codeRef.range, type: 'extrude-wall' }, - }, - } - } - if (_artifact.type === 'segment' || _artifact.type === 'path') { - return { - type: 'Set selection', - data: { - selectionType: 'singleCodeCursor', - selection: { range: _artifact.codeRef.range, type: 'default' }, - }, - } - } - if (_artifact.type === 'sweepEdge') { - const codeRef = getSweepEdgeCodeRef( - _artifact, - engineCommandManager.artifactGraph - ) - if (err(codeRef)) return null - if (_artifact?.subType === 'adjacent') { - return { - type: 'Set selection', - data: { - selectionType: 'singleCodeCursor', - selection: { range: codeRef.range, type: 'adjacent-edge' }, - }, - } - } - return { - type: 'Set selection', - data: { - selectionType: 'singleCodeCursor', - selection: { range: codeRef.range, type: 'edge' }, - }, - } - } - if (_artifact.type === 'edgeCut') { - const consumedEdge = getArtifactOfTypes( - { key: _artifact.consumedEdgeId, types: ['segment', 'sweepEdge'] }, - engineCommandManager.artifactGraph - ) - if (err(consumedEdge)) - return { - type: 'Set selection', - data: { - selectionType: 'singleCodeCursor', - selection: { range: _artifact.codeRef.range, type: 'default' }, - }, - } - if (consumedEdge.type === 'segment') { - return { - type: 'Set selection', - data: { - selectionType: 'singleCodeCursor', - selection: { - range: _artifact.codeRef.range, - type: 'base-edgeCut', - secondaryRange: consumedEdge.codeRef.range, - }, - }, - } - } - const segment = getArtifactOfTypes( - { key: consumedEdge.segId, types: ['segment'] }, - engineCommandManager.artifactGraph - ) - if (err(segment)) return null - return { - type: 'Set selection', - data: { - selectionType: 'singleCodeCursor', - selection: { - range: _artifact.codeRef.range, - type: - consumedEdge.subType === 'adjacent' - ? 'adjacent-edgeCut' - : 'opposite-edgeCut', - secondaryRange: segment.codeRef.range, + artifact: _artifact, + codeRef: codeRefs[0], }, }, } @@ -231,33 +237,60 @@ export function getEventForSegmentSelection( return { type: 'Set selection', data: { - selectionType: 'otherSelection', + selectionType: 'axisSelection', selection: obj?.userData?.type === X_AXIS ? 'x-axis' : 'y-axis', }, } } - const pathToNode = group?.userData?.pathToNode - if (!pathToNode) return null - // previous drags don't update ast for efficiency reasons - // So we want to make sure we have and updated ast with - // accurate source ranges - const updatedAst = parse(codeManager.code) - if (err(updatedAst)) return null + // id does not match up with the artifact graph when in sketch mode, because mock executions + // do not update the artifact graph, therefore we match up the pathToNode instead + // we can reliably use `type === 'segment'` since it's in sketch mode and we're concerned with segments + const segWithMatchingPathToNode__Id = [ + ...engineCommandManager.artifactGraph, + ].find((entry) => { + return ( + entry[1].type === 'segment' && + JSON.stringify(entry[1].codeRef.pathToNode) === + JSON.stringify(group?.userData?.pathToNode) + ) + })?.[0] - const nodeMeta = getNodeFromPath( - updatedAst, - pathToNode, - 'CallExpression' + const id = segWithMatchingPathToNode__Id + + if (!id && group) { + const node = getNodeFromPath( + kclManager.ast, + group.userData.pathToNode + ) + if (err(node)) return null + return { + type: 'Set selection', + data: { + selectionType: 'singleCodeCursor', + selection: { + codeRef: { + range: [node.node.start, node.node.end, true], + pathToNode: group.userData.pathToNode, + }, + }, + }, + } + } + if (!id || !group) return null + const artifact = engineCommandManager.artifactGraph.get(id) + const codeRefs = getCodeRefsByArtifactId( + id, + engineCommandManager.artifactGraph ) - if (err(nodeMeta)) return null - - const node = nodeMeta.node - const range: SourceRange = [node.start, node.end] + if (!artifact || !codeRefs) return null return { type: 'Set selection', data: { selectionType: 'singleCodeCursor', - selection: { range, type: 'default' }, + selection: { + artifact, + codeRef: codeRefs[0], + }, }, } } @@ -269,17 +302,29 @@ export function handleSelectionBatch({ }): { engineEvents: Models['WebSocketRequest_type'][] codeMirrorSelection: EditorSelection - otherSelections: Axis[] updateSceneObjectColors: () => void } { const ranges: ReturnType[] = [] + const selectionToEngine: SelectionToEngine[] = [] + + selections.graphSelections.forEach(({ artifact }) => { + artifact?.id && + selectionToEngine.push({ + type: 'default', + id: artifact?.id, + range: + getCodeRefsByArtifactId( + artifact.id, + engineCommandManager.artifactGraph + )?.[0].range || defaultSourceRange(), + }) + }) const engineEvents: Models['WebSocketRequest_type'][] = - resetAndSetEngineEntitySelectionCmds( - codeToIdSelections(selections.codeBasedSelections) - ) - selections.codeBasedSelections.forEach(({ range, type }) => { - if (range?.[1]) { - ranges.push(EditorSelection.cursor(range[1])) + resetAndSetEngineEntitySelectionCmds(selectionToEngine) + selections.graphSelections.forEach(({ codeRef }) => { + if (codeRef.range?.[1]) { + const safeEnd = Math.min(codeRef.range[1], codeManager.code.length) + ranges.push(EditorSelection.cursor(safeEnd)) } }) if (ranges.length) @@ -287,11 +332,10 @@ export function handleSelectionBatch({ engineEvents, codeMirrorSelection: EditorSelection.create( ranges, - selections.codeBasedSelections.length - 1 + selections.graphSelections.length - 1 ), - otherSelections: selections.otherSelections, updateSceneObjectColors: () => - updateSceneObjectColors(selections.codeBasedSelections), + updateSceneObjectColors(selections.graphSelections), } return { @@ -300,45 +344,76 @@ export function handleSelectionBatch({ 0 ), engineEvents, - otherSelections: selections.otherSelections, updateSceneObjectColors: () => - updateSceneObjectColors(selections.codeBasedSelections), + updateSceneObjectColors(selections.graphSelections), } } -type SelectionToEngine = { type: Selection['type']; id: string } +type SelectionToEngine = { + type: Selection__old['type'] + id?: string + range: SourceRange +} export function processCodeMirrorRanges({ codeMirrorRanges, selectionRanges, isShiftDown, + ast, }: { codeMirrorRanges: readonly SelectionRange[] selectionRanges: Selections isShiftDown: boolean + ast: Program }): null | { modelingEvent: ModelingMachineEvent engineEvents: Models['WebSocketRequest_type'][] } { const isChange = - codeMirrorRanges.length !== selectionRanges.codeBasedSelections.length || + codeMirrorRanges.length !== selectionRanges?.graphSelections?.length || codeMirrorRanges.some(({ from, to }, i) => { return ( - from !== selectionRanges.codeBasedSelections[i].range[0] || - to !== selectionRanges.codeBasedSelections[i].range[1] + from !== selectionRanges.graphSelections[i]?.codeRef?.range[0] || + to !== selectionRanges.graphSelections[i]?.codeRef?.range[1] ) }) if (!isChange) return null - const codeBasedSelections: Selections['codeBasedSelections'] = + const codeBasedSelections: Selections['graphSelections'] = codeMirrorRanges.map(({ from, to }) => { + const pathToNode = getNodePathFromSourceRange(ast, [from, to, true]) return { - type: 'default', - range: [from, to], + codeRef: { + range: [from, to, true], + pathToNode, + }, } }) const idBasedSelections: SelectionToEngine[] = codeToIdSelections(codeBasedSelections) + const selections: Selection[] = [] + for (const { id, range } of idBasedSelections) { + if (!id) { + const pathToNode = getNodePathFromSourceRange(ast, range) + selections.push({ + codeRef: { + range, + pathToNode, + }, + }) + continue + } + const artifact = engineCommandManager.artifactGraph.get(id) + const codeRefs = getCodeRefsByArtifactId( + id, + engineCommandManager.artifactGraph + ) + if (artifact && codeRefs) { + selections.push({ artifact, codeRef: codeRefs[0] }) + } else if (codeRefs) { + selections.push({ codeRef: codeRefs[0] }) + } + } if (!selectionRanges) return null updateSceneObjectColors(codeBasedSelections) @@ -349,11 +424,13 @@ export function processCodeMirrorRanges({ selectionType: 'mirrorCodeMirrorSelections', selection: { otherSelections: isShiftDown ? selectionRanges.otherSelections : [], - codeBasedSelections, + graphSelections: selections, }, }, }, - engineEvents: resetAndSetEngineEntitySelectionCmds(idBasedSelections), + engineEvents: resetAndSetEngineEntitySelectionCmds( + idBasedSelections.filter(({ id }) => !!id) + ), } } @@ -362,7 +439,7 @@ function updateSceneObjectColors(codeBasedSelections: Selection[]) { Object.values(sceneEntitiesManager.activeSegments).forEach((segmentGroup) => { if (!SEGMENT_BODIES_PLUS_PROFILE_START.includes(segmentGroup?.name)) return - const nodeMeta = getNodeFromPath( + const nodeMeta = getNodeFromPath>( updated, segmentGroup.userData.pathToNode, 'CallExpression' @@ -370,7 +447,7 @@ function updateSceneObjectColors(codeBasedSelections: Selection[]) { if (err(nodeMeta)) return const node = nodeMeta.node const groupHasCursor = codeBasedSelections.some((selection) => { - return isOverlap(selection.range, [node.start, node.end]) + return isOverlap(selection?.codeRef?.range, [node.start, node.end, true]) }) const color = groupHasCursor @@ -405,13 +482,16 @@ function resetAndSetEngineEntitySelectionCmds( type: 'modeling_cmd_req', cmd: { type: 'select_add', - entities: selections.map(({ id }) => id), + entities: selections.map(({ id }) => id).filter(isNonNullable), }, cmd_id: uuidv4(), }, ] } +/** + * Is the selection a single cursor in a sketch pipe expression chain? + */ export function isSketchPipe(selectionRanges: Selections) { if (!isSingleCursorInPipe(selectionRanges, kclManager.ast)) return false return isCursorInSketchCommandRange( @@ -420,100 +500,9 @@ export function isSketchPipe(selectionRanges: Selections) { ) } -export function isSelectionLastLine( - selectionRanges: Selections, - code: string, - i = 0 -) { - return selectionRanges.codeBasedSelections[i].range[1] === code.length -} - -export function isRangeBetweenCharacters(selectionRanges: Selections) { - return ( - selectionRanges.codeBasedSelections.length === 1 && - selectionRanges.codeBasedSelections[0].range[0] === 0 && - selectionRanges.codeBasedSelections[0].range[1] === 0 - ) -} - -export type CommonASTNode = { - selection: Selection - ast: Program -} - -function buildCommonNodeFromSelection(selectionRanges: Selections, i: number) { - return { - selection: selectionRanges.codeBasedSelections[i], - ast: kclManager.ast, - } -} - -function nodeHasExtrude(node: CommonASTNode) { - return ( - doesPipeHaveCallExp({ - calleeName: 'extrude', - ...node, - }) || - doesPipeHaveCallExp({ - calleeName: 'revolve', - ...node, - }) - ) -} - -function nodeHasClose(node: CommonASTNode) { - return doesPipeHaveCallExp({ - calleeName: 'close', - ...node, - }) -} -function nodeHasCircle(node: CommonASTNode) { - return doesPipeHaveCallExp({ - calleeName: 'circle', - ...node, - }) -} - -export function canSweepSelection(selection: Selections) { - const commonNodes = selection.codeBasedSelections.map((_, i) => - buildCommonNodeFromSelection(selection, i) - ) - return ( - !!isSketchPipe(selection) && - commonNodes.every((n) => !hasSketchPipeBeenExtruded(n.selection, n.ast)) && - (commonNodes.every((n) => nodeHasClose(n)) || - commonNodes.every((n) => nodeHasCircle(n))) && - commonNodes.every((n) => !nodeHasExtrude(n)) - ) -} - -export function canFilletSelection(selection: Selections) { - const commonNodes = selection.codeBasedSelections.map((_, i) => - buildCommonNodeFromSelection(selection, i) - ) // TODO FILLET DUMMY PLACEHOLDER - return ( - !!isSketchPipe(selection) && - commonNodes.every((n) => nodeHasClose(n)) && - commonNodes.every((n) => !nodeHasExtrude(n)) - ) -} - -function canExtrudeSelectionItem(selection: Selections, i: number) { - const isolatedSelection = { - ...selection, - codeBasedSelections: [selection.codeBasedSelections[i]], - } - const commonNode = buildCommonNodeFromSelection(selection, i) - - return ( - !!isSketchPipe(isolatedSelection) && - (nodeHasClose(commonNode) || nodeHasCircle(commonNode)) && - !nodeHasExtrude(commonNode) - ) -} - // This accounts for non-geometry selections under "other" -export type ResolvedSelectionType = [Selection['type'] | 'other', number] +export type ResolvedSelectionType = Artifact['type'] | 'other' +export type SelectionCountsByType = Map /** * In the future, I'd like this function to properly return the type of each selected entity based on @@ -522,46 +511,84 @@ export type ResolvedSelectionType = [Selection['type'] | 'other', number] * @param selection * @returns */ -export function getSelectionType( +export function getSelectionCountByType( selection?: Selections -): ResolvedSelectionType[] { - if (!selection) return [] - const extrudableCount = selection.codeBasedSelections.filter((_, i) => { - const singleSelection = { - ...selection, - codeBasedSelections: [selection.codeBasedSelections[i]], - } - return canExtrudeSelectionItem(singleSelection, 0) - }).length +): SelectionCountsByType | 'none' { + const selectionsByType: SelectionCountsByType = new Map() + if ( + !selection || + (!selection.graphSelections.length && !selection.otherSelections.length) + ) + return 'none' - return extrudableCount === selection.codeBasedSelections.length - ? [['extrude-wall', extrudableCount]] - : [['other', selection.codeBasedSelections.length]] + function incrementOrInitializeSelectionType(type: ResolvedSelectionType) { + const count = selectionsByType.get(type) || 0 + selectionsByType.set(type, count + 1) + } + + selection.otherSelections.forEach((selection) => { + if (typeof selection === 'string') { + incrementOrInitializeSelectionType('other') + } else if ('name' in selection) { + incrementOrInitializeSelectionType('plane') + } + }) + + selection.graphSelections.forEach((graphSelection) => { + if (!graphSelection.artifact) { + /** + * TODO: remove this heuristic-based selection type detection. + * Currently, if you've created a sketch and have not left sketch mode, + * the selection will be a segment selection with no artifact. + * This is because the mock execution does not update the artifact graph. + * Once we move the artifactGraph creation to WASM, we can remove this, + * as the artifactGraph will always be up-to-date. + */ + if (isSingleCursorInPipe(selection, kclManager.ast)) { + incrementOrInitializeSelectionType('segment') + return + } else { + console.warn( + 'Selection is outside of a sketch but has no artifact. Sketch segment selections are the only kind that can have a valid selection with no artifact.', + JSON.stringify(graphSelection) + ) + incrementOrInitializeSelectionType('other') + return + } + } + incrementOrInitializeSelectionType(graphSelection.artifact.type) + }) + + return selectionsByType } export function getSelectionTypeDisplayText( selection?: Selections ): string | null { - const selectionsByType = getSelectionType(selection) + const selectionsByType = getSelectionCountByType(selection) + if (selectionsByType === 'none') return null - return (selectionsByType as Exclude) + return selectionsByType + .entries() .map( // Hack for showing "face" instead of "extrude-wall" in command bar text ([type, count]) => - `${count} ${type.replace('extrude-wall', 'face')}${ - count > 1 ? 's' : '' - }` + `${count} ${type + .replace('wall', 'face') + .replace('solid2D', 'face') + .replace('segment', 'face')}${count > 1 ? 's' : ''}` ) + .toArray() .join(', ') } export function canSubmitSelectionArg( - selectionsByType: 'none' | ResolvedSelectionType[], + selectionsByType: 'none' | Map, argument: CommandArgument & { inputType: 'selection' } ) { return ( selectionsByType !== 'none' && - selectionsByType.every(([type, count]) => { + selectionsByType.entries().every(([type, count]) => { const foundIndex = argument.selectionTypes.findIndex((s) => s === type) return ( foundIndex !== -1 && @@ -571,10 +598,14 @@ export function canSubmitSelectionArg( ) } -function codeToIdSelections( - codeBasedSelections: Selection[] +export function codeToIdSelections( + selections: Selection[] ): SelectionToEngine[] { - return codeBasedSelections + const selectionsOld = convertSelectionsToOld({ + graphSelections: selections, + otherSelections: [], + }).codeBasedSelections + return selectionsOld .flatMap((selection): null | SelectionToEngine[] => { const { type } = selection // TODO #868: loops over all artifacts will become inefficient at a large scale @@ -606,19 +637,26 @@ function codeToIdSelections( | { id: ArtifactId artifact: unknown - selection: Selection + selection: Selection__old } | undefined overlappingEntries.forEach((entry) => { + // TODO probably need to remove much of the `type === 'xyz'` below if (type === 'default' && entry.artifact.type === 'segment') { bestCandidate = entry return } - if (type === 'solid2D' && entry.artifact.type === 'path') { - const solid = engineCommandManager.artifactGraph.get( + if (entry.artifact.type === 'path') { + const artifact = engineCommandManager.artifactGraph.get( entry.artifact.solid2dId || '' ) - if (solid?.type !== 'solid2D') return + if (artifact?.type !== 'solid2D') { + bestCandidate = { + artifact: entry.artifact, + selection, + id: entry.id, + } + } if (!entry.artifact.solid2dId) { console.error( 'Expected PathArtifact to have solid2dId, but none found' @@ -626,7 +664,7 @@ function codeToIdSelections( return } bestCandidate = { - artifact: solid, + artifact: artifact, selection, id: entry.artifact.solid2dId, } @@ -744,6 +782,14 @@ function codeToIdSelections( } } } + + if (entry.artifact.type === 'sweep') { + bestCandidate = { + artifact: entry.artifact, + selection, + id: entry.id, + } + } }) if (bestCandidate) { @@ -751,10 +797,11 @@ function codeToIdSelections( { type, id: bestCandidate.id, + range: bestCandidate.selection.range, }, ] } - return null + return [selection] }) .filter(isNonNullable) } @@ -797,32 +844,58 @@ export function updateSelections( const newSelections = Object.entries(pathToNodeMap) .map(([index, pathToNode]): Selection | undefined => { + const previousSelection = + prevSelectionRanges.graphSelections[Number(index)] const nodeMeta = getNodeFromPath(ast, pathToNode) if (err(nodeMeta)) return undefined const node = nodeMeta.node - const selection = prevSelectionRanges.codeBasedSelections[Number(index)] - if ( - selection?.type === 'base-edgeCut' || - selection?.type === 'adjacent-edgeCut' || - selection?.type === 'opposite-edgeCut' - ) - return { - range: [node.start, node.end], - type: selection?.type, - secondaryRange: selection?.secondaryRange, + let artifact: Artifact | null = null + for (const [id, a] of engineCommandManager.artifactGraph) { + if (previousSelection?.artifact?.type === a.type) { + const codeRefs = getCodeRefsByArtifactId( + id, + engineCommandManager.artifactGraph + ) + if (!codeRefs) continue + if ( + JSON.stringify(codeRefs[0].pathToNode) === + JSON.stringify(pathToNode) + ) { + artifact = a + console.log('found artifact', a) + break + } } + } + if (!artifact) return undefined return { - range: [node.start, node.end], - type: selection?.type, + artifact: artifact, + codeRef: { + range: [node.start, node.end, true], + pathToNode: pathToNode, + }, } }) .filter((x?: Selection) => x !== undefined) as Selection[] + // for when there is no artifact (sketch mode since mock execute does not update artifactGraph) + const pathToNodeBasedSelections: Selections['graphSelections'] = [] + for (const pathToNode of Object.values(pathToNodeMap)) { + const node = getNodeFromPath(ast, pathToNode) + if (err(node)) return node + pathToNodeBasedSelections.push({ + codeRef: { + range: [node.node.start, node.node.end, true], + pathToNode: pathToNode, + }, + }) + } + return { - codeBasedSelections: - newSelections.length > 0 + graphSelections: + newSelections.length >= pathToNodeBasedSelections.length ? newSelections - : prevSelectionRanges.codeBasedSelections, + : pathToNodeBasedSelections, otherSelections: prevSelectionRanges.otherSelections, } } diff --git a/src/lib/settings/initialKeybindings.ts b/src/lib/settings/initialKeybindings.ts index caead9e5e..2071068e1 100644 --- a/src/lib/settings/initialKeybindings.ts +++ b/src/lib/settings/initialKeybindings.ts @@ -12,7 +12,7 @@ export type InteractionMapItem = { * Controls both the available names for interaction map categories * and the order in which they are displayed. */ -export const interactionMapCategories = [ +const interactionMapCategories = [ 'Sketching', 'Modeling', 'Command Palette', diff --git a/src/lib/settings/initialSettings.tsx b/src/lib/settings/initialSettings.tsx index 9da74c9cf..61b512e22 100644 --- a/src/lib/settings/initialSettings.tsx +++ b/src/lib/settings/initialSettings.tsx @@ -19,6 +19,7 @@ import Tooltip from 'components/Tooltip' import { toSync } from 'lib/utils' import { reportRejection } from 'lib/trap' import { CameraProjectionType } from 'wasm-lib/kcl/bindings/CameraProjectionType' +import { OnboardingStatus } from 'wasm-lib/kcl/bindings/OnboardingStatus' /** * A setting that can be set at the user or project level @@ -189,8 +190,10 @@ export function createSettings() { inputType: 'boolean', }, }), - onboardingStatus: new Setting({ + onboardingStatus: new Setting({ defaultValue: '', + // TODO: this could be better but we don't have a TS side real enum + // for this yet validate: (v) => typeof v === 'string', hideOnPlatform: 'both', }), @@ -283,7 +286,7 @@ export function createSettings() { * The controls for how to navigate the 3D view */ mouseControls: new Setting({ - defaultValue: 'KittyCAD', + defaultValue: 'Zoo', description: 'The controls for how to navigate the 3D view', validate: (v) => cameraSystems.includes(v as CameraSystem), hideOnLevel: 'project', diff --git a/src/lib/settings/settingsUtils.test.ts b/src/lib/settings/settingsUtils.test.ts index f0a598a8c..20a65a18b 100644 --- a/src/lib/settings/settingsUtils.test.ts +++ b/src/lib/settings/settingsUtils.test.ts @@ -2,6 +2,7 @@ import { DeepPartial } from 'lib/types' import { Configuration } from 'wasm-lib/kcl/bindings/Configuration' import { configurationToSettingsPayload, + getAllCurrentSettings, projectConfigurationToSettingsPayload, setSettingsAtLevel, } from './settingsUtils' @@ -65,3 +66,48 @@ describe(`testing settings initialization`, () => { expect(settings.app.themeColor.current).toBe('200') }) }) + +describe(`testing getAllCurrentSettings`, () => { + it(`returns the correct settings`, () => { + // Set up the settings + let settings = createSettings() + const appConfiguration: DeepPartial = { + settings: { + app: { + appearance: { + theme: 'dark', + color: 190, + }, + }, + }, + } + const projectConfiguration: DeepPartial = { + settings: { + app: { + appearance: { + theme: 'light', + color: 200, + }, + }, + modeling: { + base_unit: 'ft', + }, + }, + } + + const appSettingsPayload = configurationToSettingsPayload(appConfiguration) + const projectSettingsPayload = + projectConfigurationToSettingsPayload(projectConfiguration) + + setSettingsAtLevel(settings, 'user', appSettingsPayload) + setSettingsAtLevel(settings, 'project', projectSettingsPayload) + + // Now the test: get all the settings' current resolved values + const allCurrentSettings = getAllCurrentSettings(settings) + // This one gets the 'user'-level theme because it's ignored at the project level + // (see the test "doesn't read theme from project settings") + expect(allCurrentSettings.app.theme).toBe('dark') + expect(allCurrentSettings.app.themeColor).toBe('200') + expect(allCurrentSettings.modeling.defaultUnit).toBe('ft') + }) +}) diff --git a/src/lib/settings/settingsUtils.ts b/src/lib/settings/settingsUtils.ts index 283301ace..36c9bef22 100644 --- a/src/lib/settings/settingsUtils.ts +++ b/src/lib/settings/settingsUtils.ts @@ -178,6 +178,7 @@ export async function loadAndValidateSettings( if (err(appSettingsPayload)) return Promise.reject(appSettingsPayload) let settingsNext = createSettings() + // Because getting the default directory is async, we need to set it after if (onDesktop) { settings.app.projectDirectory.default = await getInitialDefaultDir() @@ -285,6 +286,27 @@ export function getChangedSettingsAtLevel( return changedSettings } +export function getAllCurrentSettings( + allSettings: typeof settings +): SaveSettingsPayload { + const currentSettings = {} as SaveSettingsPayload + Object.entries(allSettings).forEach(([category, settingsCategory]) => { + const categoryKey = category as keyof typeof settings + Object.entries(settingsCategory).forEach( + ([setting, settingValue]: [string, Setting]) => { + const settingKey = + setting as keyof (typeof settings)[typeof categoryKey] + currentSettings[categoryKey] = { + ...currentSettings[categoryKey], + [settingKey]: settingValue.current, + } + } + ) + }) + + return currentSettings +} + export function setSettingsAtLevel( allSettings: typeof settings, level: SettingsLevel, diff --git a/src/lib/singletons.ts b/src/lib/singletons.ts index a4d1e8d1b..4f9481b72 100644 --- a/src/lib/singletons.ts +++ b/src/lib/singletons.ts @@ -18,13 +18,17 @@ window.tearDown = engineCommandManager.tearDown export const kclManager = new KclManager(engineCommandManager) engineCommandManager.kclManager = kclManager -engineCommandManager.getAstCb = () => kclManager.ast - export const sceneInfra = new SceneInfra(engineCommandManager) engineCommandManager.camControlsCameraChange = sceneInfra.onCameraChange export const sceneEntitiesManager = new SceneEntities(engineCommandManager) +declare global { + interface Window { + editorManager: EditorManager + } +} + // This needs to be after sceneInfra and engineCommandManager are is created. export const editorManager = new EditorManager() diff --git a/src/lib/telemetry.test.ts b/src/lib/telemetry.test.ts new file mode 100644 index 000000000..9c1d6b45e --- /dev/null +++ b/src/lib/telemetry.test.ts @@ -0,0 +1,109 @@ +import { + columnWidth, + MaxWidth, + printHeader, + printDivider, + printRow, +} from 'lib/telemetry' + +describe('Telemetry', () => { + describe('columnWidth', () => { + it('should return 0', () => { + const actual = columnWidth([{ '': '' }], '') + const expected = 0 + expect(actual).toBe(expected) + }) + it('should return 10 from column length', () => { + const actual = columnWidth([{ thisisten_: 'dog' }], 'thisisten_') + const expected = 10 + expect(actual).toBe(expected) + }) + it('should return 5 from the key length', () => { + const actual = columnWidth([{ mph: 'five5' }], 'mph') + const expected = 5 + expect(actual).toBe(expected) + }) + it('should return 6 from multiple values', () => { + const actual = columnWidth( + [ + { mph: '555' }, + { mph: '33' }, + { mph: '789' }, + { mph: '1231' }, + { mph: '129532' }, + ], + 'mph' + ) + const expected = 6 + expect(actual).toBe(expected) + }) + }) + describe('printHeader', () => { + it('should print a header based on MaxWidth interface with value lengths', () => { + const widths: MaxWidth = { + metricA: 7, + metricB: 8, + metricC: 9, + metricD: 10, + } + const actual = printHeader(widths) + const expected = '| metricA | metricB | metricC | metricD |' + expect(actual).toBe(expected) + }) + it('should print a header based on MaxWidth interface with key lengths', () => { + const widths: MaxWidth = { + aa: 2, + bb: 2, + cc: 2, + dd: 2, + } + const actual = printHeader(widths) + const expected = '| aa | bb | cc | dd |' + expect(actual).toBe(expected) + }) + }) + describe('printDivider', () => { + it('should print a divider based on MaxWidth interface with value lengths', () => { + const widths: MaxWidth = { + metricA: 7, + metricB: 8, + metricC: 9, + metricD: 10, + } + const actual = printDivider(widths) + const expected = '| ------- | -------- | --------- | ---------- |' + expect(actual).toBe(expected) + }) + + it('should print a divider based on MaxWidth interface with key lengths', () => { + const widths: MaxWidth = { + aa: 2, + bb: 2, + cc: 2, + dd: 2, + } + const actual = printDivider(widths) + const expected = '| -- | -- | -- | -- |' + expect(actual).toBe(expected) + }) + }) + describe('printRow', () => { + it('should print a row', () => { + const widths: MaxWidth = { + metricA: 7, + metricB: 8, + metricC: 9, + metricD: 10, + } + const row = { + metricA: 'aa', + metricB: 'bb', + metricC: 'cc', + metricD: 'dd', + } + const actual = printRow(row, widths) + const expected = '| aa | bb | cc | dd |' + expect(actual).toBe(expected) + }) + }) +}) diff --git a/src/lib/telemetry.ts b/src/lib/telemetry.ts new file mode 100644 index 000000000..6258d8f89 --- /dev/null +++ b/src/lib/telemetry.ts @@ -0,0 +1,170 @@ +import { PerformanceMark, getMarks } from 'lib/performance' +import { writeTelemetryFile, writeRawTelemetryFile } from 'lib/desktop' +let args: any = null + +// Get the longest width of values or column name +export function columnWidth(arr: { [key: string]: any }, key: string): number { + let maxLength = key.length + + // for each value of that key, check if the length is longer + arr.forEach((value: any) => { + const valueAsString = String(value[key]) + maxLength = + valueAsString.length > maxLength ? valueAsString.length : maxLength + }) + return maxLength +} + +export function printHeader(columnWidths: MaxWidth): string { + const headers = ['|'] + const padLeft = ' ' + Object.keys(columnWidths).forEach((key) => { + const maxWidth = columnWidths[key] + const padLength = maxWidth - key.length + const paddingRight = ' '.repeat(padLength + 1) + headers.push(padLeft, key, paddingRight, '|') + }) + return headers.join('') +} + +export function printDivider(columnWidths: MaxWidth): string { + const headers = ['|'] + const padLeft = ' ' + Object.keys(columnWidths).forEach((key) => { + const keyMaxLength = columnWidths[key] + const dashedLines = '-'.repeat(keyMaxLength) + headers.push(padLeft, dashedLines, ' ', '|') + }) + return headers.join('') +} + +export function printRow( + row: { [key: string]: any }, + columnWidths: MaxWidth +): string { + const _row = ['|'] + const padLeft = ' ' + Object.keys(row).forEach((key) => { + const value = String(row[key]) + const valueLength = value && value.length ? value.length : 0 + const padLength = columnWidths[key] - valueLength + const paddingRight = ' '.repeat(padLength + 1) + _row.push(padLeft, value, paddingRight, '|') + }) + return _row.join('') +} + +export interface MaxWidth { + [key: string]: number +} + +export function printMarkDownTable( + marks: Array<{ [key: string]: any }> +): Array { + if (marks.length === 0) { + return [] + } + const sample = marks[0] + const columnWidths: MaxWidth = {} + Object.keys(sample).forEach((key) => { + const width = columnWidth(marks, key) + columnWidths[key] = width + }) + + const lines = [] + lines.push(printHeader(columnWidths)) + lines.push(printDivider(columnWidths)) + marks.forEach((row) => { + lines.push(printRow(row, columnWidths)) + }) + return lines +} + +export interface PerformanceDeltaTotal { + name: string + startTime: number + delta: string + total: string +} + +export function computeDeltaTotal( + marks: Array +): Array { + let startTime = -1 + let total = 0 + const deltaTotalArray: Array = marks.map( + (row: PerformanceMark) => { + const delta = + startTime === -1 ? 0 : Number(row.startTime) - Number(startTime) + startTime = row.startTime + total += delta + const formatted: PerformanceDeltaTotal = { + name: row.name, + startTime: row.startTime, + delta: delta.toFixed(2), + total: total.toFixed(2), + } + return formatted + } + ) + return deltaTotalArray +} + +export function printDeltaTotal(marks: Array): string[] { + const deltaTotalArray = computeDeltaTotal(marks) + return printMarkDownTable(deltaTotalArray) +} + +export function printRawRow(row: { [key: string]: any }): string { + const _row = [''] + Object.keys(row).forEach((key) => { + const value = String(row[key]) + _row.push(value, ' ') + }) + return _row.join('') +} + +export function printRawMarks(marks: Array): string[] { + const headers = ['Name', 'Timestamp', 'Delta', 'Total', 'Detail'] + const lines = ['```', headers.join(' ')] + const deltaTotalArray = computeDeltaTotal(marks) + deltaTotalArray.forEach((row) => { + lines.push(printRawRow(row)) + }) + lines.push('```') + return lines +} + +export function printInvocationCount(marks: Array): string[] { + const counts: { [key: string]: number } = {} + marks.forEach((mark: PerformanceMark) => { + counts[mark.name] = + counts[mark.name] === undefined ? 1 : counts[mark.name] + 1 + }) + + const formattedCounts = Object.entries(counts).map((entry) => { + return { + name: entry[0], + count: entry[1], + } + }) + return printMarkDownTable(formattedCounts) +} + +export async function maybeWriteToDisk() { + if (!args) { + args = await window.electron.getArgvParsed() + } + if (args.telemetry) { + setInterval(() => { + const marks = getMarks() + const deltaTotalTable = printDeltaTotal(marks) + writeTelemetryFile(deltaTotalTable.join('\n')) + .then(() => {}) + .catch(() => {}) + writeRawTelemetryFile(JSON.stringify(marks)) + .then(() => {}) + .catch(() => {}) + }, 5000) + } +} diff --git a/src/lib/testHelpers.ts b/src/lib/testHelpers.ts index e93b28a34..7453086ae 100644 --- a/src/lib/testHelpers.ts +++ b/src/lib/testHelpers.ts @@ -4,7 +4,6 @@ import { _executor, SourceRange, ExecState, - defaultIdGenerator, } from '../lang/wasm' import { EngineCommandManager, @@ -16,7 +15,7 @@ import { v4 as uuidv4 } from 'uuid' import { DefaultPlanes } from 'wasm-lib/kcl/bindings/DefaultPlanes' import { err, reportRejection } from 'lib/trap' import { toSync } from './utils' -import { IdGenerator } from 'wasm-lib/kcl/bindings/IdGenerator' +import { Node } from 'wasm-lib/kcl/bindings/Node' type WebSocketResponse = Models['WebSocketResponse_type'] @@ -84,12 +83,10 @@ class MockEngineCommandManager { } export async function enginelessExecutor( - ast: Program | Error, - pm: ProgramMemory | Error = ProgramMemory.empty(), - idGenerator: IdGenerator = defaultIdGenerator() + ast: Node, + pmo: ProgramMemory | Error = ProgramMemory.empty() ): Promise { - if (err(ast)) return Promise.reject(ast) - if (err(pm)) return Promise.reject(pm) + if (pmo !== null && err(pmo)) return Promise.reject(pmo) const mockEngineCommandManager = new MockEngineCommandManager({ setIsStreamReady: () => {}, @@ -97,21 +94,14 @@ export async function enginelessExecutor( }) as any as EngineCommandManager // eslint-disable-next-line @typescript-eslint/no-floating-promises mockEngineCommandManager.startNewSession() - const execState = await _executor( - ast, - pm, - idGenerator, - mockEngineCommandManager, - true - ) + const execState = await _executor(ast, mockEngineCommandManager, pmo) await mockEngineCommandManager.waitForAllCommands() return execState } export async function executor( - ast: Program, - pm: ProgramMemory = ProgramMemory.empty(), - idGenerator: IdGenerator = defaultIdGenerator() + ast: Node, + pmo: ProgramMemory = ProgramMemory.empty() ): Promise { const engineCommandManager = new EngineCommandManager() engineCommandManager.start({ @@ -122,9 +112,6 @@ export async function executor( makeDefaultPlanes: () => { return new Promise((resolve) => resolve(defaultPlanes)) }, - modifyGrid: (hidden: boolean) => { - return new Promise((resolve) => resolve()) - }, }) return new Promise((resolve) => { @@ -133,13 +120,7 @@ export async function executor( toSync(async () => { // eslint-disable-next-line @typescript-eslint/no-floating-promises engineCommandManager.startNewSession() - const execState = await _executor( - ast, - pm, - idGenerator, - engineCommandManager, - false - ) + const execState = await _executor(ast, engineCommandManager, pmo) await engineCommandManager.waitForAllCommands() resolve(execState) }, reportRejection) diff --git a/src/lib/textToCad.ts b/src/lib/textToCad.ts index fd6b9bcae..f63941e27 100644 --- a/src/lib/textToCad.ts +++ b/src/lib/textToCad.ts @@ -17,7 +17,7 @@ import { getNextFileName } from './desktopFS' import { reportRejection } from './trap' import { toSync } from './utils' -export async function submitTextToCadPrompt( +async function submitTextToCadPrompt( prompt: string, token?: string ): Promise { @@ -45,7 +45,7 @@ export async function submitTextToCadPrompt( return data } -export async function getTextToCadResult( +async function getTextToCadResult( id: string, token?: string ): Promise { diff --git a/src/lib/toolbar.ts b/src/lib/toolbar.ts index 988a29d47..ddc68f059 100644 --- a/src/lib/toolbar.ts +++ b/src/lib/toolbar.ts @@ -39,6 +39,9 @@ export type ToolbarItem = { description: string links: { label: string; url: string }[] isActive?: (state: StateFrom) => boolean + disabledReason?: + | string + | ((state: StateFrom) => string | undefined) } export type ToolbarItemResolved = Omit< @@ -68,7 +71,6 @@ export const toolbarConfig: Record = { : modelingSend({ type: 'Enter sketch' }), icon: 'sketch', status: 'available', - disabled: (state) => !state.matches('idle'), title: ({ sketchPathId }) => `${sketchPathId ? 'Edit' : 'Start'} Sketch`, showTitle: true, @@ -86,7 +88,6 @@ export const toolbarConfig: Record = { type: 'Find and select command', data: { name: 'Extrude', groupId: 'modeling' }, }), - disabled: (state) => !state.can({ type: 'Extrude' }), icon: 'extrude', status: 'available', title: 'Extrude', @@ -101,9 +102,6 @@ export const toolbarConfig: Record = { type: 'Find and select command', data: { name: 'Revolve', groupId: 'modeling' }, }), - // TODO: disabled - // Who's state is this? - disabled: (state) => !state.can({ type: 'Revolve' }), icon: 'revolve', status: DEV ? 'available' : 'kcl-only', title: 'Revolve', @@ -136,9 +134,13 @@ export const toolbarConfig: Record = { }, { id: 'loft', - onClick: () => console.error('Loft not yet implemented'), + onClick: ({ commandBarSend }) => + commandBarSend({ + type: 'Find and select command', + data: { name: 'Loft', groupId: 'modeling' }, + }), icon: 'loft', - status: 'kcl-only', + status: 'available', title: 'Loft', hotkey: 'L', description: @@ -148,10 +150,6 @@ export const toolbarConfig: Record = { label: 'KCL docs', url: 'https://zoo.dev/docs/kcl/loft', }, - { - label: 'GitHub discussion', - url: 'https://github.com/KittyCAD/modeling-app/discussions/613', - }, ], }, 'break', @@ -164,7 +162,6 @@ export const toolbarConfig: Record = { }), icon: 'fillet3d', status: DEV ? 'available' : 'kcl-only', - disabled: (state) => !state.can({ type: 'Fillet' }), title: 'Fillet', hotkey: 'F', description: 'Round the edges of a 3D solid.', @@ -182,9 +179,14 @@ export const toolbarConfig: Record = { }, { id: 'shell', - onClick: () => console.error('Shell not yet implemented'), + onClick: ({ commandBarSend }) => { + commandBarSend({ + type: 'Find and select command', + data: { name: 'Shell', groupId: 'modeling' }, + }) + }, icon: 'shell', - status: 'kcl-only', + status: 'available', title: 'Shell', description: 'Hollow out a 3D solid.', links: [{ label: 'KCL docs', url: 'https://zoo.dev/docs/kcl/shell' }], @@ -249,10 +251,15 @@ export const toolbarConfig: Record = { [ { id: 'plane-offset', - onClick: () => - console.error('Plane through normal not yet implemented'), + onClick: ({ commandBarSend }) => { + commandBarSend({ + type: 'Find and select command', + data: { name: 'Offset plane', groupId: 'modeling' }, + }) + }, + hotkey: 'O', icon: 'plane', - status: 'unavailable', + status: 'available', title: 'Offset plane', description: 'Create a plane parallel to an existing plane.', links: [], @@ -267,6 +274,35 @@ export const toolbarConfig: Record = { links: [], }, ], + 'break', + [ + { + id: 'text-to-cad', + onClick: ({ commandBarSend }) => + commandBarSend({ + type: 'Find and select command', + data: { name: 'Text-to-CAD', groupId: 'modeling' }, + }), + icon: 'sparkles', + status: 'available', + title: 'Text-to-CAD', + description: 'Generate geometry from a text prompt.', + links: [], + }, + { + id: 'prompt-to-edit', + onClick: ({ commandBarSend }) => + commandBarSend({ + type: 'Find and select command', + data: { name: 'Prompt-to-edit', groupId: 'modeling' }, + }), + icon: 'sparkles', + status: 'available', + title: 'Prompt-to-Edit', + description: 'Edit geometry based on a text prompt.', + links: [], + }, + ], ], }, sketching: { @@ -349,6 +385,11 @@ export const toolbarConfig: Record = { (!isEditingExistingSketch(state.context) && !state.matches({ Sketch: 'Tangential arc to' })) || pipeHasCircle(state.context), + disabledReason: (state) => + !isEditingExistingSketch(state.context) && + !state.matches({ Sketch: 'Tangential arc to' }) + ? "Cannot start a tangential arc because there's no previous line to be tangential to. Try drawing a line first or selecting an existing sketch to edit." + : undefined, title: 'Tangential Arc', hotkey: (state) => state.matches({ Sketch: 'Tangential arc to' }) ? ['Esc', 'A'] : 'A', @@ -399,8 +440,9 @@ export const toolbarConfig: Record = { status: 'available', title: 'Center circle', disabled: (state) => - !canRectangleOrCircleTool(state.context) && - !state.matches({ Sketch: 'Circle tool' }), + state.matches('Sketch no face') || + (!canRectangleOrCircleTool(state.context) && + !state.matches({ Sketch: 'Circle tool' })), isActive: (state) => state.matches({ Sketch: 'Circle tool' }), hotkey: (state) => state.matches({ Sketch: 'Circle tool' }) ? ['Esc', 'C'] : 'C', @@ -415,10 +457,19 @@ export const toolbarConfig: Record = { }, { id: 'circle-three-points', - onClick: () => - console.error('Three-point circle not yet implemented'), + onClick: ({ modelingState, modelingSend }) => + modelingSend({ + type: 'change tool', + data: { + tool: !modelingState.matches({ + Sketch: 'circle3PointToolSelect', + }) + ? 'circle3Points' + : 'none', + }, + }), icon: 'circle', - status: 'unavailable', + status: 'available', title: 'Three-point circle', showTitle: false, description: 'Draw a circle defined by three points', @@ -440,8 +491,9 @@ export const toolbarConfig: Record = { icon: 'rectangle', status: 'available', disabled: (state) => - !canRectangleOrCircleTool(state.context) && - !state.matches({ Sketch: 'Rectangle tool' }), + state.matches('Sketch no face') || + (!canRectangleOrCircleTool(state.context) && + !state.matches({ Sketch: 'Rectangle tool' })), title: 'Corner rectangle', hotkey: (state) => state.matches({ Sketch: 'Rectangle tool' }) ? ['Esc', 'R'] : 'R', @@ -451,13 +503,33 @@ export const toolbarConfig: Record = { }, { id: 'center-rectangle', - onClick: () => console.error('Center rectangle not yet implemented'), - icon: 'rectangle', - status: 'unavailable', + onClick: ({ modelingState, modelingSend }) => + modelingSend({ + type: 'change tool', + data: { + tool: !modelingState.matches({ + Sketch: 'Center Rectangle tool', + }) + ? 'center rectangle' + : 'none', + }, + }), + icon: 'arc', + status: 'available', + disabled: (state) => + state.matches('Sketch no face') || + (!canRectangleOrCircleTool(state.context) && + !state.matches({ Sketch: 'Center Rectangle tool' })), title: 'Center rectangle', - showTitle: false, + hotkey: (state) => + state.matches({ Sketch: 'Center Rectangle tool' }) + ? ['Esc', 'C'] + : 'C', description: 'Start drawing a rectangle from its center', links: [], + isActive: (state) => { + return state.matches({ Sketch: 'Center Rectangle tool' }) + }, }, ], { @@ -494,13 +566,15 @@ export const toolbarConfig: Record = { [ { id: 'constraint-length', - disabled: (state) => - !( - state.matches({ Sketch: 'SketchIdle' }) && - state.can({ type: 'Constrain length' }) - ), - onClick: ({ modelingSend }) => - modelingSend({ type: 'Constrain length' }), + disabled: (state) => !state.matches({ Sketch: 'SketchIdle' }), + onClick: ({ commandBarSend }) => + commandBarSend({ + type: 'Find and select command', + data: { + name: 'Constrain length', + groupId: 'modeling', + }, + }), icon: 'dimension', status: 'available', title: 'Length', diff --git a/src/lib/trap.ts b/src/lib/trap.ts index 686571d79..ab4551a42 100644 --- a/src/lib/trap.ts +++ b/src/lib/trap.ts @@ -2,6 +2,23 @@ import toast from 'react-hot-toast' type ExcludeErr = Exclude +/** + * Similar to Error, but more lightweight, without the stack trace. It can also + * be used to represent a reason for not being able to provide an alternative, + * which isn't necessarily an error. + */ +export class Reason { + message: string + + constructor(message: string) { + this.message = message + } + + toError() { + return new Error(this.message) + } +} + /** * This is intentionally *not* exported due to misuse. We'd like to add a lint. */ diff --git a/src/lib/useCalculateKclExpression.ts b/src/lib/useCalculateKclExpression.ts index cb195cc6f..d758d7b09 100644 --- a/src/lib/useCalculateKclExpression.ts +++ b/src/lib/useCalculateKclExpression.ts @@ -3,7 +3,7 @@ import { kclManager, engineCommandManager } from 'lib/singletons' import { useKclContext } from 'lang/KclProvider' import { findUniqueName } from 'lang/modifyAst' import { PrevVariable, findAllPreviousVariables } from 'lang/queryAst' -import { ProgramMemory, Expr, parse } from 'lang/wasm' +import { ProgramMemory, Expr, parse, resultIsOk } from 'lang/wasm' import { useEffect, useRef, useState } from 'react' import { executeAst } from 'lang/langHelpers' import { err, trap } from 'lib/trap' @@ -34,9 +34,11 @@ export function useCalculateKclExpression({ } { const { programMemory, code } = useKclContext() const { context } = useModelingContext() + // If there is no selection, use the end of the code + // so all variables are available const selectionRange: - | (typeof context.selectionRanges.codeBasedSelections)[number]['range'] - | undefined = context.selectionRanges.codeBasedSelections[0]?.range + | (typeof context)['selectionRanges']['graphSelections'][number]['codeRef']['range'] + | undefined = context.selectionRanges.graphSelections[0]?.codeRef?.range const inputRef = useRef(null) const [availableVarInfo, setAvailableVarInfo] = useState< ReturnType @@ -72,11 +74,12 @@ export function useCalculateKclExpression({ }, [programMemory, newVariableName]) useEffect(() => { - if (!programMemory || !selectionRange) return + if (!programMemory) return const varInfo = findAllPreviousVariables( kclManager.ast, kclManager.programMemory, - selectionRange + // If there is no selection, use the end of the code + selectionRange || [code.length, code.length] ) setAvailableVarInfo(varInfo) }, [kclManager.ast, kclManager.programMemory, selectionRange]) @@ -84,14 +87,14 @@ export function useCalculateKclExpression({ useEffect(() => { const execAstAndSetResult = async () => { const _code = `const __result__ = ${value}` - const ast = parse(_code) - if (err(ast)) return - if (trap(ast, { suppress: true })) return + const pResult = parse(_code) + if (err(pResult) || !resultIsOk(pResult)) return + const ast = pResult.program const _programMem: ProgramMemory = ProgramMemory.empty() for (const { key, value } of availableVarInfo.variables) { const error = _programMem.set(key, { - type: 'UserVal', + type: 'String', value, __meta: [], }) @@ -100,21 +103,22 @@ export function useCalculateKclExpression({ const { execState } = await executeAst({ ast, engineCommandManager, - useFakeExecutor: true, + // We make sure to send an empty program memory to denote we mean mock mode. programMemoryOverride: kclManager.programMemory.clone(), }) const resultDeclaration = ast.body.find( (a) => a.type === 'VariableDeclaration' && - a.declarations?.[0]?.id?.name === '__result__' + a.declaration.id?.name === '__result__' ) const init = resultDeclaration?.type === 'VariableDeclaration' && - resultDeclaration?.declarations?.[0]?.init + resultDeclaration?.declaration.init const result = execState.memory?.get('__result__')?.value setCalcResult(typeof result === 'number' ? String(result) : 'NAN') init && setValueNode(init) } + if (!value) return execAstAndSetResult().catch(() => { setCalcResult('NAN') setValueNode(null) diff --git a/src/lib/usePreviousVariables.ts b/src/lib/usePreviousVariables.ts index 19db4ee5a..4082f6800 100644 --- a/src/lib/usePreviousVariables.ts +++ b/src/lib/usePreviousVariables.ts @@ -7,7 +7,7 @@ import { useEffect, useState } from 'react' export function usePreviousVariables() { const { programMemory, code } = useKclContext() const { context } = useModelingContext() - const selectionRange = context.selectionRanges.codeBasedSelections[0] + const selectionRange = context.selectionRanges.graphSelections[0]?.codeRef ?.range || [code.length, code.length] const [previousVariablesInfo, setPreviousVariablesInfo] = useState< ReturnType diff --git a/src/lib/utils.test.ts b/src/lib/utils.test.ts index 6d1fcbcc1..959b55f7c 100644 --- a/src/lib/utils.test.ts +++ b/src/lib/utils.test.ts @@ -1,14 +1,21 @@ -import { isOverlap, roundOff } from './utils' +import { + isOverlap, + roundOff, + simulateOnMouseDragMatch, + onDragNumberCalculation, + hasLeadingZero, + hasDigitsLeftOfDecimal, +} from './utils' import { SourceRange } from '../lang/wasm' describe('testing isOverlapping', () => { - testBothOrders([0, 3], [3, 10]) - testBothOrders([0, 5], [3, 4]) - testBothOrders([0, 5], [5, 10]) - testBothOrders([0, 5], [6, 10], false) - testBothOrders([0, 5], [-1, 1]) - testBothOrders([0, 5], [-1, 0]) - testBothOrders([0, 5], [-2, -1], false) + testBothOrders([0, 3, true], [3, 10, true]) + testBothOrders([0, 5, true], [3, 4, true]) + testBothOrders([0, 5, true], [5, 10, true]) + testBothOrders([0, 5, true], [6, 10, true], false) + testBothOrders([0, 5, true], [-1, 1, true]) + testBothOrders([0, 5, true], [-1, 0, true]) + testBothOrders([0, 5, true], [-2, -1, true], false) }) function testBothOrders(a: SourceRange, b: SourceRange, result = true) { @@ -32,3 +39,1217 @@ describe('testing roundOff', () => { expect(roundOff(1.273456789, 1)).toBe(1.3) }) }) + +describe('testing hasLeadingZero', () => { + it('.1 should have no leading zero', () => { + const actual = hasLeadingZero('.1') + const expected = false + expect(actual).toBe(expected) + }) + it('1.1 should have no leading zero', () => { + const actual = hasLeadingZero('1.1') + const expected = false + expect(actual).toBe(expected) + }) + it('0.1 should have leading zero', () => { + const actual = hasLeadingZero('0.1') + const expected = true + expect(actual).toBe(expected) + }) + it('10 should have no leading zero', () => { + const actual = hasLeadingZero('10') + const expected = false + expect(actual).toBe(expected) + }) + it('0.375 should have leading zero', () => { + const actual = hasLeadingZero('0.375') + const expected = true + expect(actual).toBe(expected) + }) + it('-0.375 should have leading zero', () => { + const actual = hasLeadingZero('-0.375') + const expected = true + expect(actual).toBe(expected) + }) + it('-0.0 should have leading zero', () => { + const actual = hasLeadingZero('-0.0') + const expected = true + expect(actual).toBe(expected) + }) + it('0.0 should have leading zero', () => { + const actual = hasLeadingZero('0.0') + const expected = true + expect(actual).toBe(expected) + }) +}) + +describe('testing hasDigitsLeftOfDecimal', () => { + it('0.25 should be whole', () => { + const actual = hasDigitsLeftOfDecimal('0.25') + const expected = true + expect(actual).toBe(expected) + }) +}) + +describe('testing simulateOnMouseDragMatch', () => { + // positive numbers + + it('works with 0.0', () => { + const actual = simulateOnMouseDragMatch('0.0') + const expected = ['0.0'] + expect(actual).toStrictEqual(expected) + }) + + it('works with 0.1', () => { + const actual = simulateOnMouseDragMatch('0.1') + const expected = ['0.1'] + expect(actual).toStrictEqual(expected) + }) + + it('works with 0.10', () => { + const actual = simulateOnMouseDragMatch('0.10') + const expected = ['0.10'] + expect(actual).toStrictEqual(expected) + }) + + it('works with 0.100', () => { + const actual = simulateOnMouseDragMatch('0.100') + const expected = ['0.100'] + expect(actual).toStrictEqual(expected) + }) + + it('works with 0.01', () => { + const actual = simulateOnMouseDragMatch('0.01') + const expected = ['0.01'] + expect(actual).toStrictEqual(expected) + }) + + it('works with 0.001', () => { + const actual = simulateOnMouseDragMatch('0.001') + const expected = ['0.001'] + expect(actual).toStrictEqual(expected) + }) + + it('works with 0.0001', () => { + const actual = simulateOnMouseDragMatch('0.0001') + const expected = ['0.0001'] + expect(actual).toStrictEqual(expected) + }) + + it('works with .0', () => { + const actual = simulateOnMouseDragMatch('.0') + const expected = ['.0'] + expect(actual).toStrictEqual(expected) + }) + + it('works with .1', () => { + const actual = simulateOnMouseDragMatch('.1') + const expected = ['.1'] + expect(actual).toStrictEqual(expected) + }) + + it('works with .10', () => { + const actual = simulateOnMouseDragMatch('.10') + const expected = ['.10'] + expect(actual).toStrictEqual(expected) + }) + + it('works with .100', () => { + const actual = simulateOnMouseDragMatch('.100') + const expected = ['.100'] + expect(actual).toStrictEqual(expected) + }) + + it('works with .1000', () => { + const actual = simulateOnMouseDragMatch('.1000') + const expected = ['.1000'] + expect(actual).toStrictEqual(expected) + }) + + it('works with .01', () => { + const actual = simulateOnMouseDragMatch('.01') + const expected = ['.01'] + expect(actual).toStrictEqual(expected) + }) + + it('works with .001', () => { + const actual = simulateOnMouseDragMatch('.001') + const expected = ['.001'] + expect(actual).toStrictEqual(expected) + }) + + it('works with .0001', () => { + const actual = simulateOnMouseDragMatch('.0001') + const expected = ['.0001'] + expect(actual).toStrictEqual(expected) + }) + + it('works with 1.0', () => { + const actual = simulateOnMouseDragMatch('1.0') + const expected = ['1.0'] + expect(actual).toStrictEqual(expected) + }) + + it('works with 10.0', () => { + const actual = simulateOnMouseDragMatch('10.0') + const expected = ['10.0'] + expect(actual).toStrictEqual(expected) + }) + + it('works with 100.0', () => { + const actual = simulateOnMouseDragMatch('100.0') + const expected = ['100.0'] + expect(actual).toStrictEqual(expected) + }) + + it('works with 1000.0', () => { + const actual = simulateOnMouseDragMatch('1000.0') + const expected = ['1000.0'] + expect(actual).toStrictEqual(expected) + }) + + it('works with 1.1', () => { + const actual = simulateOnMouseDragMatch('1.1') + const expected = ['1.1'] + expect(actual).toStrictEqual(expected) + }) + + it('works with 10.01', () => { + const actual = simulateOnMouseDragMatch('10.01') + const expected = ['10.01'] + expect(actual).toStrictEqual(expected) + }) + + it('works with 1', () => { + const actual = simulateOnMouseDragMatch('1') + const expected = ['1'] + expect(actual).toStrictEqual(expected) + }) + + it('works with 10', () => { + const actual = simulateOnMouseDragMatch('10') + const expected = ['10'] + expect(actual).toStrictEqual(expected) + }) + + it('works with 100', () => { + const actual = simulateOnMouseDragMatch('100') + const expected = ['100'] + expect(actual).toStrictEqual(expected) + }) + + it('works with 1000', () => { + const actual = simulateOnMouseDragMatch('1000') + const expected = ['1000'] + expect(actual).toStrictEqual(expected) + }) + + // negative numbers + + it('works with -0.0', () => { + const actual = simulateOnMouseDragMatch('-0.0') + const expected = ['-0.0'] + expect(actual).toStrictEqual(expected) + }) + + it('works with -0.1', () => { + const actual = simulateOnMouseDragMatch('-0.1') + const expected = ['-0.1'] + expect(actual).toStrictEqual(expected) + }) + + it('works with -0.10', () => { + const actual = simulateOnMouseDragMatch('-0.10') + const expected = ['-0.10'] + expect(actual).toStrictEqual(expected) + }) + + it('works with -0.100', () => { + const actual = simulateOnMouseDragMatch('-0.100') + const expected = ['-0.100'] + expect(actual).toStrictEqual(expected) + }) + + it('works with -0.01', () => { + const actual = simulateOnMouseDragMatch('-0.01') + const expected = ['-0.01'] + expect(actual).toStrictEqual(expected) + }) + + it('works with -0.001', () => { + const actual = simulateOnMouseDragMatch('-0.001') + const expected = ['-0.001'] + expect(actual).toStrictEqual(expected) + }) + + it('works with -0.0001', () => { + const actual = simulateOnMouseDragMatch('-0.0001') + const expected = ['-0.0001'] + expect(actual).toStrictEqual(expected) + }) + + it('works with -.0', () => { + const actual = simulateOnMouseDragMatch('-.0') + const expected = ['-.0'] + expect(actual).toStrictEqual(expected) + }) + + it('works with -.1', () => { + const actual = simulateOnMouseDragMatch('-.1') + const expected = ['-.1'] + expect(actual).toStrictEqual(expected) + }) + + it('works with -.10', () => { + const actual = simulateOnMouseDragMatch('-.10') + const expected = ['-.10'] + expect(actual).toStrictEqual(expected) + }) + + it('works with -.100', () => { + const actual = simulateOnMouseDragMatch('-.100') + const expected = ['-.100'] + expect(actual).toStrictEqual(expected) + }) + + it('works with -.1000', () => { + const actual = simulateOnMouseDragMatch('-.1000') + const expected = ['-.1000'] + expect(actual).toStrictEqual(expected) + }) + + it('works with -.01', () => { + const actual = simulateOnMouseDragMatch('-.01') + const expected = ['-.01'] + expect(actual).toStrictEqual(expected) + }) + + it('works with -.001', () => { + const actual = simulateOnMouseDragMatch('-.001') + const expected = ['-.001'] + expect(actual).toStrictEqual(expected) + }) + + it('works with -.0001', () => { + const actual = simulateOnMouseDragMatch('-.0001') + const expected = ['-.0001'] + expect(actual).toStrictEqual(expected) + }) + + it('works with -1.0', () => { + const actual = simulateOnMouseDragMatch('-1.0') + const expected = ['-1.0'] + expect(actual).toStrictEqual(expected) + }) + + it('works with -10.0', () => { + const actual = simulateOnMouseDragMatch('-10.0') + const expected = ['-10.0'] + expect(actual).toStrictEqual(expected) + }) + + it('works with -100.0', () => { + const actual = simulateOnMouseDragMatch('-100.0') + const expected = ['-100.0'] + expect(actual).toStrictEqual(expected) + }) + + it('works with -1000.0', () => { + const actual = simulateOnMouseDragMatch('-1000.0') + const expected = ['-1000.0'] + expect(actual).toStrictEqual(expected) + }) + + it('works with -1.1', () => { + const actual = simulateOnMouseDragMatch('-1.1') + const expected = ['-1.1'] + expect(actual).toStrictEqual(expected) + }) + + it('works with -10.01', () => { + const actual = simulateOnMouseDragMatch('-10.01') + const expected = ['-10.01'] + expect(actual).toStrictEqual(expected) + }) + + it('works with -1', () => { + const actual = simulateOnMouseDragMatch('-1') + const expected = ['-1'] + expect(actual).toStrictEqual(expected) + }) + + it('works with -10', () => { + const actual = simulateOnMouseDragMatch('-10') + const expected = ['-10'] + expect(actual).toStrictEqual(expected) + }) + + it('works with -100', () => { + const actual = simulateOnMouseDragMatch('-100') + const expected = ['-100'] + expect(actual).toStrictEqual(expected) + }) + + it('works with -1000', () => { + const actual = simulateOnMouseDragMatch('-1000') + const expected = ['-1000'] + expect(actual).toStrictEqual(expected) + }) + + it('works with =-500', () => { + const actual = simulateOnMouseDragMatch('=-500') + const expected = ['-500'] + expect(actual).toStrictEqual(expected) + }) + + it('works with =500', () => { + const actual = simulateOnMouseDragMatch('=500') + const expected = ['500'] + expect(actual).toStrictEqual(expected) + }) + + it('works with = 500', () => { + const actual = simulateOnMouseDragMatch('= 500') + const expected = ['500'] + expect(actual).toStrictEqual(expected) + }) +}) + +describe('testing onDragNumberCalculation', () => { + // Need to simulate the MouseEvent object with limited values + const positiveHundredsDecimalEvent = new MouseEvent('mousemove', { + shiftKey: true, + metaKey: true, + movementX: 1, + }) + const positiveTensDecimalEvent = new MouseEvent('mousemove', { + metaKey: true, + movementX: 1, + }) + const positiveTensEvent = new MouseEvent('mousemove', { + shiftKey: true, + movementX: 1, + }) + const positiveOnesEvent = new MouseEvent('mousemove', { movementX: 1 }) + const negativeHundredsDecimalEvent = new MouseEvent('mousemove', { + shiftKey: true, + metaKey: true, + movementX: -1, + }) + const negativeTensDecimalEvent = new MouseEvent('mousemove', { + metaKey: true, + movementX: -1, + }) + const negativeTensEvent = new MouseEvent('mousemove', { + shiftKey: true, + movementX: -1, + }) + const negativeOnesEvent = new MouseEvent('mousemove', { movementX: -1 }) + describe('positive direction', () => { + describe('ones event', () => { + test('works with 0.0', () => { + const match = simulateOnMouseDragMatch('0.0') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, positiveOnesEvent) + const expected = '1.0' + expect(actual).toBe(expected) + }) + + test('works with 1', () => { + const match = simulateOnMouseDragMatch('1') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, positiveOnesEvent) + const expected = '2' + expect(actual).toBe(expected) + }) + + test('works with 0.5', () => { + const match = simulateOnMouseDragMatch('0.5') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, positiveOnesEvent) + const expected = '1.5' + expect(actual).toBe(expected) + }) + + test('works with 0.66', () => { + const match = simulateOnMouseDragMatch('0.66') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, positiveOnesEvent) + const expected = '1.66' + expect(actual).toBe(expected) + }) + + test('works with 0.375', () => { + const match = simulateOnMouseDragMatch('0.375') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, positiveOnesEvent) + const expected = '1.375' + expect(actual).toBe(expected) + }) + + test('works with 0.1', () => { + const match = simulateOnMouseDragMatch('0.1') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, positiveOnesEvent) + const expected = '1.1' + expect(actual).toBe(expected) + }) + + test('works with .0', () => { + const match = simulateOnMouseDragMatch('.0') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, positiveOnesEvent) + const expected = '1.0' + expect(actual).toBe(expected) + }) + + test('works with 1.0', () => { + const match = simulateOnMouseDragMatch('1.0') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, positiveOnesEvent) + const expected = '2.0' + expect(actual).toBe(expected) + }) + + test('works with 1.66', () => { + const match = simulateOnMouseDragMatch('1.66') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, positiveOnesEvent) + const expected = '2.66' + expect(actual).toBe(expected) + }) + + test('works with 0.0000001', () => { + const match = simulateOnMouseDragMatch('0.0000001') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, positiveOnesEvent) + const expected = '1.0000001' + expect(actual).toBe(expected) + }) + + test('works with 9', () => { + const match = simulateOnMouseDragMatch('9') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, positiveOnesEvent) + const expected = '10' + expect(actual).toBe(expected) + }) + + test('works with 99', () => { + const match = simulateOnMouseDragMatch('99') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, positiveOnesEvent) + const expected = '100' + expect(actual).toBe(expected) + }) + + test('works with .123', () => { + const match = simulateOnMouseDragMatch('.123') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, positiveOnesEvent) + const expected = '1.123' + expect(actual).toBe(expected) + }) + }) + describe('tens event', () => { + test('works with 0.0', () => { + const match = simulateOnMouseDragMatch('0.0') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, positiveTensEvent) + const expected = '10.0' + expect(actual).toBe(expected) + }) + + test('works with 1', () => { + const match = simulateOnMouseDragMatch('1') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, positiveTensEvent) + const expected = '11' + expect(actual).toBe(expected) + }) + + test('works with 0.5', () => { + const match = simulateOnMouseDragMatch('0.5') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, positiveTensEvent) + const expected = '10.5' + expect(actual).toBe(expected) + }) + + test('works with 0.66', () => { + const match = simulateOnMouseDragMatch('0.66') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, positiveTensEvent) + const expected = '10.66' + expect(actual).toBe(expected) + }) + + test('works with 0.375', () => { + const match = simulateOnMouseDragMatch('0.375') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, positiveTensEvent) + const expected = '10.375' + expect(actual).toBe(expected) + }) + + test('works with 0.1', () => { + const match = simulateOnMouseDragMatch('0.1') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, positiveTensEvent) + const expected = '10.1' + expect(actual).toBe(expected) + }) + + test('works with 90', () => { + const match = simulateOnMouseDragMatch('90') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, positiveTensEvent) + const expected = '100' + expect(actual).toBe(expected) + }) + + test('works with .0', () => { + const match = simulateOnMouseDragMatch('.0') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, positiveTensEvent) + const expected = '10.0' + expect(actual).toBe(expected) + }) + + test('works with .1', () => { + const match = simulateOnMouseDragMatch('.1') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, positiveTensEvent) + const expected = '10.1' + expect(actual).toBe(expected) + }) + }) + describe('tens decimal event', () => { + test('works with 0.0', () => { + const match = simulateOnMouseDragMatch('0.0') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + positiveTensDecimalEvent + ) + const expected = '0.1' + expect(actual).toBe(expected) + }) + + test('works with 1', () => { + const match = simulateOnMouseDragMatch('1') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + positiveTensDecimalEvent + ) + const expected = '1.1' + expect(actual).toBe(expected) + }) + + test('works with 0.5', () => { + const match = simulateOnMouseDragMatch('0.5') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + positiveTensDecimalEvent + ) + const expected = '0.6' + expect(actual).toBe(expected) + }) + + test('works with 0.66', () => { + const match = simulateOnMouseDragMatch('0.66') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + positiveTensDecimalEvent + ) + const expected = '0.76' + expect(actual).toBe(expected) + }) + + test('works with 0.375', () => { + const match = simulateOnMouseDragMatch('0.375') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + positiveTensDecimalEvent + ) + const expected = '0.475' + expect(actual).toBe(expected) + }) + + test('works with 0.1', () => { + const match = simulateOnMouseDragMatch('0.1') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + positiveTensDecimalEvent + ) + const expected = '0.2' + expect(actual).toBe(expected) + }) + + test('works with .1', () => { + const match = simulateOnMouseDragMatch('.1') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + positiveTensDecimalEvent + ) + const expected = '.2' + expect(actual).toBe(expected) + }) + + test('works with 10', () => { + const match = simulateOnMouseDragMatch('10') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + positiveTensDecimalEvent + ) + const expected = '10.1' + expect(actual).toBe(expected) + }) + + test('works with .0', () => { + const match = simulateOnMouseDragMatch('.0') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + positiveTensDecimalEvent + ) + const expected = '.1' + expect(actual).toBe(expected) + }) + + test('works with .01', () => { + const match = simulateOnMouseDragMatch('.01') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + positiveTensDecimalEvent + ) + const expected = '.11' + expect(actual).toBe(expected) + }) + }) + describe('hundreds decimal event', () => { + test('works with 0.0', () => { + const match = simulateOnMouseDragMatch('0.0') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + positiveHundredsDecimalEvent + ) + const expected = '0.01' + expect(actual).toBe(expected) + }) + + test('works with 1', () => { + const match = simulateOnMouseDragMatch('1') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + positiveHundredsDecimalEvent + ) + const expected = '1.01' + expect(actual).toBe(expected) + }) + + test('works with 0.5', () => { + const match = simulateOnMouseDragMatch('0.5') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + positiveHundredsDecimalEvent + ) + const expected = '0.51' + expect(actual).toBe(expected) + }) + + test('works with 0.66', () => { + const match = simulateOnMouseDragMatch('0.66') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + positiveHundredsDecimalEvent + ) + const expected = '0.67' + expect(actual).toBe(expected) + }) + + test('works with 0.375', () => { + const match = simulateOnMouseDragMatch('0.375') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + positiveHundredsDecimalEvent + ) + const expected = '0.385' + expect(actual).toBe(expected) + }) + + test('works with 0.1', () => { + const match = simulateOnMouseDragMatch('0.1') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + positiveHundredsDecimalEvent + ) + const expected = '0.11' + expect(actual).toBe(expected) + }) + + test('works with .1', () => { + const match = simulateOnMouseDragMatch('.1') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + positiveHundredsDecimalEvent + ) + const expected = '.11' + expect(actual).toBe(expected) + }) + + test('works with .11', () => { + const match = simulateOnMouseDragMatch('.11') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + positiveHundredsDecimalEvent + ) + const expected = '.12' + expect(actual).toBe(expected) + }) + + test('works with 10', () => { + const match = simulateOnMouseDragMatch('10') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + positiveHundredsDecimalEvent + ) + const expected = '10.01' + expect(actual).toBe(expected) + }) + + test('works with 10.02', () => { + const match = simulateOnMouseDragMatch('10.02') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + positiveHundredsDecimalEvent + ) + const expected = '10.03' + expect(actual).toBe(expected) + }) + }) + }) + + // NEGATIVE DIRECTION + + describe('negative direction', () => { + describe('ones event', () => { + test('works with 0.0', () => { + const match = simulateOnMouseDragMatch('0.0') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, negativeOnesEvent) + const expected = '-1.0' + expect(actual).toBe(expected) + }) + + test('works with 1', () => { + const match = simulateOnMouseDragMatch('1') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, negativeOnesEvent) + const expected = '0' + expect(actual).toBe(expected) + }) + + test('works with 0.5', () => { + const match = simulateOnMouseDragMatch('0.5') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, negativeOnesEvent) + const expected = '-0.5' + expect(actual).toBe(expected) + }) + + test('works with 0.66', () => { + const match = simulateOnMouseDragMatch('0.66') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, negativeOnesEvent) + const expected = '-0.34' + expect(actual).toBe(expected) + }) + + test('works with 0.375', () => { + const match = simulateOnMouseDragMatch('0.375') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, negativeOnesEvent) + const expected = '-0.625' + expect(actual).toBe(expected) + }) + + test('works with 0.1', () => { + const match = simulateOnMouseDragMatch('0.1') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, negativeOnesEvent) + const expected = '-0.9' + expect(actual).toBe(expected) + }) + + test('works with .0', () => { + const match = simulateOnMouseDragMatch('.0') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, negativeOnesEvent) + const expected = '-1.0' + expect(actual).toBe(expected) + }) + + test('works with 1.0', () => { + const match = simulateOnMouseDragMatch('1.0') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, negativeOnesEvent) + const expected = '0.0' + expect(actual).toBe(expected) + }) + + test('works with 1.66', () => { + const match = simulateOnMouseDragMatch('1.66') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, negativeOnesEvent) + const expected = '0.66' + expect(actual).toBe(expected) + }) + + test('works with 0.0000001', () => { + const match = simulateOnMouseDragMatch('0.0000001') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, negativeOnesEvent) + const expected = '-0.9999999' + expect(actual).toBe(expected) + }) + + test('works with 9', () => { + const match = simulateOnMouseDragMatch('9') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, negativeOnesEvent) + const expected = '8' + expect(actual).toBe(expected) + }) + + test('works with 100', () => { + const match = simulateOnMouseDragMatch('100') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, negativeOnesEvent) + const expected = '99' + expect(actual).toBe(expected) + }) + + test('works with .123', () => { + const match = simulateOnMouseDragMatch('.123') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, negativeOnesEvent) + const expected = '-0.877' + expect(actual).toBe(expected) + }) + }) + describe('tens event', () => { + test('works with 0.0', () => { + const match = simulateOnMouseDragMatch('0.0') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, negativeTensEvent) + const expected = '-10.0' + expect(actual).toBe(expected) + }) + + test('works with 1', () => { + const match = simulateOnMouseDragMatch('1') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, negativeTensEvent) + const expected = '-9' + expect(actual).toBe(expected) + }) + + test('works with 0.5', () => { + const match = simulateOnMouseDragMatch('0.5') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, negativeTensEvent) + const expected = '-9.5' + expect(actual).toBe(expected) + }) + + test('works with 0.66', () => { + const match = simulateOnMouseDragMatch('0.66') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, negativeTensEvent) + const expected = '-9.34' + expect(actual).toBe(expected) + }) + + test('works with 0.375', () => { + const match = simulateOnMouseDragMatch('0.375') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, negativeTensEvent) + const expected = '-9.625' + expect(actual).toBe(expected) + }) + + test('works with 0.1', () => { + const match = simulateOnMouseDragMatch('0.1') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, negativeTensEvent) + const expected = '-9.9' + expect(actual).toBe(expected) + }) + + test('works with 90', () => { + const match = simulateOnMouseDragMatch('90') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, negativeTensEvent) + const expected = '80' + expect(actual).toBe(expected) + }) + + test('works with .0', () => { + const match = simulateOnMouseDragMatch('.0') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, negativeTensEvent) + const expected = '-10.0' + expect(actual).toBe(expected) + }) + + test('works with .1', () => { + const match = simulateOnMouseDragMatch('.1') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation(matchedText, negativeTensEvent) + const expected = '-9.9' + expect(actual).toBe(expected) + }) + }) + describe('tens decimal event', () => { + test('works with 0.0', () => { + const match = simulateOnMouseDragMatch('0.0') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + negativeTensDecimalEvent + ) + const expected = '-0.1' + expect(actual).toBe(expected) + }) + + test('works with 1', () => { + const match = simulateOnMouseDragMatch('1') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + negativeTensDecimalEvent + ) + const expected = '0.9' + expect(actual).toBe(expected) + }) + + test('works with 0.5', () => { + const match = simulateOnMouseDragMatch('0.5') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + negativeTensDecimalEvent + ) + const expected = '0.4' + expect(actual).toBe(expected) + }) + + test('works with 0.66', () => { + const match = simulateOnMouseDragMatch('0.66') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + negativeTensDecimalEvent + ) + const expected = '0.56' + expect(actual).toBe(expected) + }) + + test('works with 0.375', () => { + const match = simulateOnMouseDragMatch('0.375') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + negativeTensDecimalEvent + ) + const expected = '0.275' + expect(actual).toBe(expected) + }) + + test('works with 0.1', () => { + const match = simulateOnMouseDragMatch('0.1') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + negativeTensDecimalEvent + ) + const expected = '0.0' + expect(actual).toBe(expected) + }) + + test('works with .1', () => { + const match = simulateOnMouseDragMatch('.1') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + negativeTensDecimalEvent + ) + const expected = '.0' + expect(actual).toBe(expected) + }) + + test('works with 10', () => { + const match = simulateOnMouseDragMatch('10') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + negativeTensDecimalEvent + ) + const expected = '9.9' + expect(actual).toBe(expected) + }) + + test('works with .0', () => { + const match = simulateOnMouseDragMatch('.0') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + negativeTensDecimalEvent + ) + const expected = '-.1' + expect(actual).toBe(expected) + }) + + test('works with .01', () => { + const match = simulateOnMouseDragMatch('.01') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + negativeTensDecimalEvent + ) + const expected = '-.09' + expect(actual).toBe(expected) + }) + }) + describe('hundreds decimal event', () => { + test('works with 0.0', () => { + const match = simulateOnMouseDragMatch('0.0') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + negativeHundredsDecimalEvent + ) + const expected = '-0.01' + expect(actual).toBe(expected) + }) + + test('works with 1', () => { + const match = simulateOnMouseDragMatch('1') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + negativeHundredsDecimalEvent + ) + const expected = '0.99' + expect(actual).toBe(expected) + }) + + test('works with 0.5', () => { + const match = simulateOnMouseDragMatch('0.5') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + negativeHundredsDecimalEvent + ) + const expected = '0.49' + expect(actual).toBe(expected) + }) + + test('works with 0.66', () => { + const match = simulateOnMouseDragMatch('0.66') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + negativeHundredsDecimalEvent + ) + const expected = '0.65' + expect(actual).toBe(expected) + }) + + test('works with 0.375', () => { + const match = simulateOnMouseDragMatch('0.375') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + negativeHundredsDecimalEvent + ) + const expected = '0.365' + expect(actual).toBe(expected) + }) + + test('works with 0.1', () => { + const match = simulateOnMouseDragMatch('0.1') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + negativeHundredsDecimalEvent + ) + const expected = '0.09' + expect(actual).toBe(expected) + }) + + test('works with .1', () => { + const match = simulateOnMouseDragMatch('.1') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + negativeHundredsDecimalEvent + ) + const expected = '.09' + expect(actual).toBe(expected) + }) + + test('works with .11', () => { + const match = simulateOnMouseDragMatch('.11') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + negativeHundredsDecimalEvent + ) + const expected = '.1' + expect(actual).toBe(expected) + }) + + test('works with 10', () => { + const match = simulateOnMouseDragMatch('10') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + negativeHundredsDecimalEvent + ) + const expected = '9.99' + expect(actual).toBe(expected) + }) + + test('works with 10.02', () => { + const match = simulateOnMouseDragMatch('10.02') + const matchedText = match ? match[0] : '' + const actual = onDragNumberCalculation( + matchedText, + negativeHundredsDecimalEvent + ) + const expected = '10.01' + expect(actual).toBe(expected) + }) + }) + }) +}) diff --git a/src/lib/utils.ts b/src/lib/utils.ts index a738232ae..9fea0403d 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -53,11 +53,6 @@ export function isOverlap(a: SourceRange, b: SourceRange) { return lastOfFirst >= firstOfSecond } -export function roundOff(num: number, places: number = 2): number { - const x = Math.pow(10, places) - return Math.round(num * x) / x -} - export function getLength(a: [number, number], b: [number, number]): number { const x = b[0] - a[0] const y = b[1] - a[1] @@ -269,3 +264,127 @@ export function XOR(bool1: boolean, bool2: boolean): boolean { export function getActorNextEvents(snapshot: AnyMachineSnapshot) { return [...new Set([...snapshot._nodes.flatMap((sn) => sn.ownEvents)])] } + +export const onMouseDragRegex = /-?\.?\b\d+\.?\d*\b/g + +export function simulateOnMouseDragMatch(text: string) { + return text.match(onMouseDragRegex) +} + +export function roundOff(num: number, precision: number = 2): number { + const x = Math.pow(10, precision) + return Math.round(num * x) / x +} + +/** + * Determine if the number as a string has any precision in the decimal places + * '1' -> 0 + * '1.0' -> 1 + * '1.01' -> 2 + */ +function getPrecision(text: string): number { + const wholeFractionSplit = text.split('.') + const precision = + wholeFractionSplit.length === 2 ? wholeFractionSplit[1].split('').length : 0 + return precision +} + +/** + * Determines if a number string has a leading digit + * 0.1 -> yes + * -0.1 -> yes + * .1 -> no + * 10.1 -> no + * The text.split('.') should evaluate to ['',''] + */ +export function hasLeadingZero(text: string): boolean { + const wholeFractionSplit = text.split('.') + return wholeFractionSplit.length === 2 + ? wholeFractionSplit[0] === '0' || wholeFractionSplit[0] === '-0' + : false +} + +export function hasDigitsLeftOfDecimal(text: string): boolean | undefined { + const wholeFractionSplit = text.split('.') + + if (wholeFractionSplit.length === 2) { + const wholeNumber = wholeFractionSplit[0] + + if (wholeNumber.length === 0) { + return false + } else { + return true + } + } + + if (wholeFractionSplit.length === 1) { + return true + } + + // What if someone passes in 1..2.3.1...1.1.43 + return undefined +} + +export function onDragNumberCalculation(text: string, e: MouseEvent) { + const multiplier = + e.shiftKey && e.metaKey ? 0.01 : e.metaKey ? 0.1 : e.shiftKey ? 10 : 1 + + const delta = e.movementX * multiplier + const hasPeriod = text.includes('.') + const leadsWithZero = hasLeadingZero(text) + const addition = Number(text) + delta + const positiveAddition = e.movementX > 0 + const negativeAddition = e.movementX < 0 + const containsDigitsLeftOfDecimal = hasDigitsLeftOfDecimal(text) + let precision = Math.max( + getPrecision(text), + getPrecision(multiplier.toString()) + ) + const newVal = roundOff(addition, precision) + + if (isNaN(newVal)) { + return + } + + let formattedString = newVal.toString() + if (hasPeriod && !formattedString.includes('.')) { + // If the original number included a period lets add that back to the output string + // e.g. '1.0' add +1 then we get 2, we want to send '2.0' back since the original one had a decimal place + formattedString = formattedString.toString() + '.0' + } + + /** + * Whenever you add two numbers you can always remove the the leading zero the result will make sense + * 1 + -0.01 = 0.99, the code would remove the leading 0 to make it .99 but since the number has a + * digit left of the decimal to begin with I want to make it 0.99. + * negativeAddition with fractional numbers will provide a leading 0. + */ + const removeZeros = + positiveAddition || + (negativeAddition && multiplier < 1 && !containsDigitsLeftOfDecimal) + + /** + * If the original value has no leading 0 + * If if the new updated value has a leading zero + * If the math operation means you can actually remove the zero. + */ + if (!leadsWithZero && hasLeadingZero(formattedString) && removeZeros) { + if (formattedString[0] === '-') { + return ['-', formattedString.split('.')[1]].join('.') + } else { + return formattedString.substring(1) + } + } + + return formattedString +} + +export function onMouseDragMakeANewNumber( + text: string, + setText: (t: string) => void, + e: MouseEvent +) { + const newVal = onDragNumberCalculation(text, e) + if (!newVal) return + setText(newVal) +} diff --git a/src/machines/authMachine.ts b/src/machines/authMachine.ts index a55cd6d46..5a7b4a0e9 100644 --- a/src/machines/authMachine.ts +++ b/src/machines/authMachine.ts @@ -14,6 +14,7 @@ import { writeTokenFile, } from 'lib/desktop' import { COOKIE_NAME } from 'lib/constants' +import { markOnce } from 'lib/performance' const SKIP_AUTH = VITE_KC_SKIP_AUTH === 'true' && DEV @@ -156,6 +157,7 @@ async function getUser(input: { token?: string }) { LOCAL_USER.image = '' } + markOnce('code/didAuth') return { user: LOCAL_USER, token, @@ -181,6 +183,7 @@ async function getUser(input: { token?: string }) { if ('error_code' in user) return Promise.reject(new Error(user.message)) + markOnce('code/didAuth') return { user: user as Models['User_type'], token, diff --git a/src/machines/commandBarMachine.ts b/src/machines/commandBarMachine.ts index fe74361ac..796067b0f 100644 --- a/src/machines/commandBarMachine.ts +++ b/src/machines/commandBarMachine.ts @@ -5,15 +5,16 @@ import { CommandArgumentWithName, KclCommandValue, } from 'lib/commandTypes' -import { Selections } from 'lib/selections' +import { Selections__old } from 'lib/selections' import { getCommandArgumentKclValuesOnly } from 'lib/commandUtils' import { MachineManager } from 'components/MachineManagerProvider' +import toast from 'react-hot-toast' export type CommandBarContext = { commands: Command[] selectedCommand?: Command currentArgument?: CommandArgument & { name: string } - selectionRanges: Selections + selectionRanges: Selections__old argumentsToSubmit: { [x: string]: unknown } machineManager: MachineManager } @@ -247,14 +248,69 @@ export const commandBarMachine = setup({ 'All arguments are skippable': () => false, }, actors: { - 'Validate argument': fromPromise(({ input }) => { - return new Promise((resolve, reject) => { - // TODO: figure out if we should validate argument data here or in the form itself, - // and if we should support people configuring a argument's validation function + 'Validate argument': fromPromise( + ({ + input, + }: { + input: { + context: CommandBarContext | undefined + event: CommandBarMachineEvent | undefined + } + }) => { + return new Promise((resolve, reject) => { + if (!input || input?.event?.type !== 'Submit argument') { + toast.error(`Unable to validate, wrong event type.`) + return reject(`Unable to validate, wrong event type`) + } - resolve(input) - }) - }), + const context = input?.context + + if (!context) { + toast.error(`Unable to validate, wrong argument.`) + return reject(`Unable to validate, wrong argument`) + } + + const data = input.event.data + const argName = context.currentArgument?.name + const args = context?.selectedCommand?.args + const argConfig = args && argName ? args[argName] : undefined + // Only do a validation check if the argument, selectedCommand, and the validation function are defined + if ( + context.currentArgument && + context.selectedCommand && + argConfig?.inputType === 'selection' && + argConfig?.validation + ) { + argConfig + .validation({ context, data }) + .then((result) => { + if (typeof result === 'boolean' && result === true) { + return resolve(data) + } else { + // validation failed + if (typeof result === 'string') { + // The result of the validation is the error message + toast.error(result) + return reject( + `unable to validate ${argName}, Message: ${result}` + ) + } else { + // Default message if there is not a custom one sent + toast.error(`Unable to validate ${argName}`) + return reject(`unable to validate ${argName}}`) + } + } + }) + .catch(() => { + return reject(`unable to validate ${argName}}`) + }) + } else { + // Missing several requirements for validate argument, just bypass + return resolve(data) + } + }) + } + ), 'Validate all arguments': fromPromise( ({ input }: { input: CommandBarContext }) => { return new Promise((resolve, reject) => { @@ -449,9 +505,10 @@ export const commandBarMachine = setup({ invoke: { src: 'Validate argument', id: 'validateSingleArgument', - input: ({ event }) => { - if (event.type !== 'Submit argument') return {} - return event.data + input: ({ event, context }) => { + if (event.type !== 'Submit argument') + return { event: undefined, context: undefined } + return { event, context } }, onDone: { target: '#Command Bar.Checking Arguments', diff --git a/src/machines/featureTreeMachine.ts b/src/machines/featureTreeMachine.ts new file mode 100644 index 000000000..e91569b6c --- /dev/null +++ b/src/machines/featureTreeMachine.ts @@ -0,0 +1,157 @@ +import { SourceRange } from 'lang/wasm' +import { assign, setup } from 'xstate' + +type FeatureTreeEvent = + | { + type: 'goToKclSource' + data: { targetSourceRange: SourceRange } + } + | { + type: 'selectOperation' + data: { targetSourceRange: SourceRange } + } + | { + type: 'enterEditFlow' + data: { targetSourceRange: SourceRange } + } + | { type: 'goToError' } + | { type: 'codePaneOpened' } + | { type: 'selected' } + | { type: 'done' } + +export const featureTreeMachine = setup({ + types: { + context: {} as { targetSourceRange?: SourceRange }, + events: {} as FeatureTreeEvent, + }, + guards: { + codePaneIsOpen: () => false, + }, + actions: { + saveTargetSourceRange: assign({ + targetSourceRange: ({ event }) => + 'data' in event ? event.data.targetSourceRange : undefined, + }), + clearTargetSourceRange: assign({ + targetSourceRange: undefined, + }), + sendSelectionEvent: () => {}, + openCodePane: () => {}, + sendEditFlowStart: () => {}, + scrollToError: () => {}, + }, +}).createMachine({ + /** @xstate-layout N4IgpgJg5mDOIC5QDMwEMAuBXATmAKnmAHQCWEANmAMRQD2+dA0gMYUDKduLYA2gAwBdRKAAOdWKQyk6AOxEgAHogCMAFn7EAbAFYAHAHYAnGoOm9OgMw6tAGhABPRBsvF+a6wYBM-A-0uWepYGAL4h9qiYuAREZJQ0sGBULBgA8qJgOJgysgLCSCDiktJyCsoIKipabmo6-Co2Wip+-DoG9k4IWpp+Ae6W-N16KpZeYRHo2HiEYCTkVNRgshiZAKIQUgBiFHQA7nkKRVI5ZapergN6el46515GVdYdiN4GbjpGXiNGV2pan+MQJEpjFZsR6KRZFBGKwOFwcDxiIlktIodRkWAUpADgUjiV5AVyipWipiGZupYVCY1D5+F5ngg-jpiJ8DFo1OoDA13GNwkDJtEZiQIVCYWxONwSBA5DQcWIJMdSoTVG0yTodGoPAZKfwjP52o5EHVNIYvNd9M0zJZAcDBbERdDmOL4Yi6BlZJCoABhOgQMAABTQshoLF9AaDYHSS2xQkOCvxpy6lWIbS0Bm8JkM+ksDKZLK8bL0-S8NOCNoF01iGJSnqRSUxqKg6PrWIgcsK8ZOyq6aj0avTbU1Hg0KgZzVcrU+Xn+9Q+dPLUUrYOrjeI0uD1HbeK7oCJBj7xkafhMX28agZJeqHz0RhstTUD21WgXIKFxCWKxwnvWWx2uzrKKes2KIxvk8rFDuShGpY1RaKMRiHr4va9gyegPsQQRmiYVK+GYL52mCH6ZN+GwYNsexrjKm6xrinZKruqhaLBmr8PUvj6F4nGoeoxDEpYCFMVSowfPhS7CnQnqMKsOA4HQODEG6Syej6fqBhuoaqRGUbBm2NHgYqBIMV0-EproxLpoE7hWGOnFeGSxgaPwei6EYmaiaCczxLQDB0NJsk4FudGGVBFRpsQwRGGmgx6n4cH0oaFSVH21i6LqD5mtYejuW+DpSTJcmURugUQfRIX6MQfwcpqDxpUETwJSoXxqMQ04PjoSXspYtRhHyshhvABS2mJcYlcF5QALR2Al43TtoVJDD46ZfJS1p8kNHlxFQI0GYmNJjn8c21PuIzjuq2X2hJopOnCkrbQm3ZdXZNhsl1fzOSW1kJdYzKeK5VQqJh+7nWCuXXRKCIkCunp3ZB5RFq46ofOq6geDeo4JZqdlaEWt66l8jXfcD4mSWDLpSjKMOlUSzSwXS2qztVfy5jS2g43UnyVOcZ1rRWG2g7C4Ouu6ylhmpYCU2NiD8Zoz1wZq2NaB9OYYyz2O6gE3TtR8XVEwBDbQ7Ro2JtYT1pnLb2K7UyudIrFU3h8ZoamafhZTzi4bVDUJ6zWUIS7trGmS98vvVb+1GBhjUPtqer3KxOi657UCFeLhs7d2FmHe1ARmFr54NdqLUFrZnLBFUutEV+UI-mRf5+w9NgYZSNyBHB6rxTbcHhTY5wmDVMGrRM7tvhXJG-hRid10ZGjNUEjVWM533t4gaHh8aFgaOc+7XOXyzEVXpHkf+64p-p91T744VBEE7h0oEGpTZ0Dx2Sbhi9r4ozNLroN+XJk8hTBV51SRQGE7JiS9ErJjgnSRWC0bCu0Hq+C6JMf7yUUh6KEKlwzBj-uUKqKYgFQNAYrMcVI+yVFcqxfwFhAhf0uo6FByccHLyaC1JygRp5FkagaTo5CyFUj1KxO+gReRhCAA */ + id: 'featureTree', + description: 'Workflows for interacting with the feature tree pane', + states: { + idle: { + on: { + goToKclSource: { + target: 'goingToKclSource', + actions: 'saveTargetSourceRange', + }, + + selectOperation: { + target: 'selecting', + actions: 'saveTargetSourceRange', + }, + + enterEditFlow: { + target: 'enteringEditFlow', + actions: 'saveTargetSourceRange', + }, + + goToError: 'goingToError', + }, + }, + + goingToKclSource: { + states: { + selecting: { + on: { + selected: { + target: 'done', + }, + }, + + entry: ['sendSelectionEvent'], + }, + + done: { + entry: ['clearTargetSourceRange'], + always: '#featureTree.idle', + }, + + openingCodePane: { + on: { + codePaneOpened: 'selecting', + }, + + entry: 'openCodePane', + }, + }, + + initial: 'openingCodePane', + }, + + selecting: { + states: { + selecting: { + on: { + selected: 'done', + }, + + entry: 'sendSelectionEvent', + }, + + done: { + always: '#featureTree.idle', + entry: 'clearTargetSourceRange', + }, + }, + + initial: 'selecting', + }, + + enteringEditFlow: { + states: { + selecting: { + on: { + selected: 'done', + }, + }, + + done: { + always: '#featureTree.idle', + }, + }, + + initial: 'selecting', + entry: 'sendSelectionEvent', + exit: ['clearTargetSourceRange', 'sendEditFlowStart'], + }, + + goingToError: { + states: { + openingCodePane: { + entry: 'openCodePane', + + on: { + codePaneOpened: 'done', + }, + }, + + done: { + entry: 'scrollToError', + + always: '#featureTree.idle', + }, + }, + + initial: 'openingCodePane', + }, + }, + + initial: 'idle', +}) diff --git a/src/machines/kclEditorMachine.ts b/src/machines/kclEditorMachine.ts new file mode 100644 index 000000000..86c16efe6 --- /dev/null +++ b/src/machines/kclEditorMachine.ts @@ -0,0 +1,67 @@ +import { assign, createActor, setup, StateFrom } from 'xstate' +import { EditorSelection } from '@codemirror/state' + +type SelectionEvent = { + codeMirrorSelection: EditorSelection + scrollIntoView: boolean +} +type KclEditorMachineEvent = + | { type: 'setKclEditorMounted'; data: boolean } + | { type: 'setLastSelectionEvent'; data?: SelectionEvent } + +interface KclEditorMachineContext { + isKclEditorMounted: boolean + lastSelectionEvent?: SelectionEvent +} + +/** + * This is a one-off XState machine not tied to React, so that we can publish + * state to it from singletons and other parts of the app. + */ +export const kclEditorMachine = setup({ + types: { + events: {} as KclEditorMachineEvent, + context: {} as KclEditorMachineContext, + }, + actions: { + setKclEditorMounted: assign({ + isKclEditorMounted: ({ context, event }) => + event.type === 'setKclEditorMounted' + ? event.data + : context.isKclEditorMounted, + }), + setLastSelectionEvent: assign({ + lastSelectionEvent: ({ context, event }) => + event.type === 'setLastSelectionEvent' + ? event.data + : context.lastSelectionEvent, + }), + }, +}).createMachine({ + /** @xstate-layout N4IgpgJg5mDOIC5QGsDGAbAohAlgFwHsAnAWQENUALHAOzAGJYw8BpDbfYkggVxr0gBtAAwBdRKAAOBWPhwEaEkAA9EARmEB2AHTCALACYAzGs0BWMwDYAHNZOWANCACeiALRrL2tQesGzamZ+FgYAnJqaAL7RTjQEEHBKaFi4hKQU1HRK0rJ48opIKupq2tZmwgZ6RpZ6msJGeqaOLupG1tq+bQFalZqWZtHRQA */ + id: 'kclEditorMachine', + context: { + isKclEditorMounted: false, + lastSelectionEvent: undefined, + }, + on: { + setKclEditorMounted: { + actions: 'setKclEditorMounted', + }, + setLastSelectionEvent: { + actions: 'setLastSelectionEvent', + }, + }, +}) + +export const kclEditorActor = createActor(kclEditorMachine).start() + +/** Watch for changes to `lastSelectionEvent` */ +export const selectionEventSelector = ( + snapshot?: StateFrom +) => snapshot?.context?.lastSelectionEvent + +/** Watch for the editorView to be mounted */ +export const editorIsMountedSelector = ( + snapshot?: StateFrom +) => snapshot?.context?.isKclEditorMounted diff --git a/src/machines/modelingMachine.ts b/src/machines/modelingMachine.ts index 156bec8b6..bf720e794 100644 --- a/src/machines/modelingMachine.ts +++ b/src/machines/modelingMachine.ts @@ -1,12 +1,20 @@ import { PathToNode, + ProgramMemory, VariableDeclaration, VariableDeclarator, parse, recast, + resultIsOk, } from 'lang/wasm' -import { Axis, Selection, Selections, updateSelections } from 'lib/selections' -import { assign, fromPromise, setup } from 'xstate' +import { + Axis, + DefaultPlaneSelection, + Selections, + Selection, + updateSelections, +} from 'lib/selections' +import { assign, fromPromise, fromCallback, setup } from 'xstate' import { SidebarType } from 'components/ModelingSidebar/ModelingPanes' import { isNodeSafeToReplacePath, @@ -18,6 +26,7 @@ import { sceneEntitiesManager, engineCommandManager, editorManager, + codeManager, } from 'lib/singletons' import { horzVertInfo, @@ -33,12 +42,18 @@ import { applyConstraintEqualLength, setEqualLengthInfo, } from 'components/Toolbar/EqualLength' +import { revolveSketch } from 'lang/modifyAst/addRevolve' import { + addOffsetPlane, deleteFromSelection, extrudeSketch, - revolveSketch, + loftSketches, } from 'lang/modifyAst' -import { applyFilletToSelection } from 'lang/modifyAst/addFillet' +import { + applyEdgeTreatmentToSelection, + EdgeTreatmentType, + FilletParameters, +} from 'lang/modifyAst/addEdgeTreatment' import { getNodeFromPath } from '../lang/queryAst' import { applyConstraintEqualAngle, @@ -65,6 +80,8 @@ import { ToolbarModeName } from 'lib/toolbar' import { quaternionFromUpNForward } from 'clientSideScene/helpers' import { Vector3 } from 'three' import { MachineManager } from 'components/MachineManagerProvider' +import { addShell } from 'lang/modifyAst/addShell' +import { KclCommandValue } from 'lib/commandTypes' export const MODELING_PERSIST_KEY = 'MODELING_PERSIST_KEY' @@ -72,11 +89,16 @@ export type SetSelections = | { selectionType: 'singleCodeCursor' selection?: Selection + scrollIntoView?: boolean } | { - selectionType: 'otherSelection' + selectionType: 'axisSelection' selection: Axis } + | { + selectionType: 'defaultPlaneSelection' + selection: DefaultPlaneSelection + } | { selectionType: 'completeSelection' selection: Selections @@ -158,6 +180,15 @@ export type DefaultPlane = { yAxis: [number, number, number] } +export type OffsetPlane = { + type: 'offsetPlane' + position: [number, number, number] + planeId: string + pathToNode: PathToNode + zAxis: [number, number, number] + yAxis: [number, number, number] +} + export type SegmentOverlayPayload = | { type: 'set-one' @@ -183,7 +214,9 @@ export type SketchTool = | 'line' | 'tangentialArc' | 'rectangle' + | 'center rectangle' | 'circle' + | 'circle3Points' | 'none' export type ModelingMachineEvent = @@ -196,7 +229,7 @@ export type ModelingMachineEvent = | { type: 'Sketch On Face' } | { type: 'Select default plane' - data: DefaultPlane | ExtrudeFacePlane + data: DefaultPlane | ExtrudeFacePlane | OffsetPlane } | { type: 'Set selection' @@ -207,7 +240,7 @@ export type ModelingMachineEvent = } | { type: 'Sketch no face' } | { type: 'Toggle gui mode' } - | { type: 'Cancel' } + | { type: 'Cancel'; cleanup?: () => void } | { type: 'CancelSketch' } | { type: 'Add start point' } | { type: 'Make segment horizontal' } @@ -222,7 +255,10 @@ export type ModelingMachineEvent = | { type: 'Constrain vertically align' } | { type: 'Constrain snap to X' } | { type: 'Constrain snap to Y' } - | { type: 'Constrain length' } + | { + type: 'Constrain length' + data: ModelingCommandSchema['Constrain length'] + } | { type: 'Constrain equal length' } | { type: 'Constrain parallel' } | { type: 'Constrain remove constraints'; data?: PathToNode } @@ -230,13 +266,21 @@ export type ModelingMachineEvent = | { type: 'Export'; data: ModelingCommandSchema['Export'] } | { type: 'Make'; data: ModelingCommandSchema['Make'] } | { type: 'Extrude'; data?: ModelingCommandSchema['Extrude'] } + | { type: 'Loft'; data?: ModelingCommandSchema['Loft'] } + | { type: 'Shell'; data?: ModelingCommandSchema['Shell'] } | { type: 'Revolve'; data?: ModelingCommandSchema['Revolve'] } | { type: 'Fillet'; data?: ModelingCommandSchema['Fillet'] } + | { type: 'Offset plane'; data: ModelingCommandSchema['Offset plane'] } | { type: 'Text-to-CAD'; data: ModelingCommandSchema['Text-to-CAD'] } + | { type: 'Prompt-to-edit'; data: ModelingCommandSchema['Prompt-to-edit'] } | { type: 'Add rectangle origin' data: [x: number, y: number] } + | { + type: 'Add center rectangle origin' + data: [x: number, y: number] + } | { type: 'Add circle origin' data: [x: number, y: number] @@ -264,11 +308,8 @@ export type ModelingMachineEvent = type: 'code edit during sketch' } | { - type: 'Convert to variable' - data: { - pathToNode: PathToNode - variableName: string - } + type: 'Constrain with named value' + data: ModelingCommandSchema['Constrain with named value'] } | { type: 'change tool' @@ -277,9 +318,11 @@ export type ModelingMachineEvent = } } | { type: 'Finish rectangle' } + | { type: 'Finish center rectangle' } | { type: 'Finish circle' } | { type: 'Artifact graph populated' } | { type: 'Artifact graph emptied' } + | { type: 'stop-internal' } export type MoveDesc = { line: number; snippet: string } @@ -327,7 +370,7 @@ export const modelingMachineDefaultContext: ModelingMachineContext = { selection: [], selectionRanges: { otherSelections: [], - codeBasedSelections: [], + graphSelections: [], }, sketchDetails: { sketchPathToNode: [], @@ -354,8 +397,6 @@ export const modelingMachine = setup({ }, guards: { 'Selection is on face': () => false, - 'has valid sweep selection': () => false, - 'has valid fillet selection': () => false, 'Has exportable geometry': () => false, 'has valid selection for deletion': () => false, 'has made first point': ({ context }) => { @@ -389,7 +430,7 @@ export const modelingMachine = setup({ }, 'Can constrain horizontal distance': ({ context: { selectionRanges } }) => { const info = horzVertDistanceInfo({ - selectionRanges, + selectionRanges: selectionRanges, constraint: 'setHorzDistance', }) if (trap(info)) return false @@ -397,24 +438,32 @@ export const modelingMachine = setup({ }, 'Can constrain vertical distance': ({ context: { selectionRanges } }) => { const info = horzVertDistanceInfo({ - selectionRanges, + selectionRanges: selectionRanges, constraint: 'setVertDistance', }) if (trap(info)) return false return info.enabled }, 'Can constrain ABS X': ({ context: { selectionRanges } }) => { - const info = absDistanceInfo({ selectionRanges, constraint: 'xAbs' }) + const info = absDistanceInfo({ + selectionRanges, + constraint: 'xAbs', + }) if (trap(info)) return false return info.enabled }, 'Can constrain ABS Y': ({ context: { selectionRanges } }) => { - const info = absDistanceInfo({ selectionRanges, constraint: 'yAbs' }) + const info = absDistanceInfo({ + selectionRanges, + constraint: 'yAbs', + }) if (trap(info)) return false return info.enabled }, 'Can constrain angle': ({ context: { selectionRanges } }) => { - const angleBetween = angleBetweenInfo({ selectionRanges }) + const angleBetween = angleBetweenInfo({ + selectionRanges, + }) if (trap(angleBetween)) return false const angleLength = angleLengthInfo({ selectionRanges, @@ -424,7 +473,9 @@ export const modelingMachine = setup({ return angleBetween.enabled || angleLength.enabled }, 'Can constrain length': ({ context: { selectionRanges } }) => { - const angleLength = angleLengthInfo({ selectionRanges }) + const angleLength = angleLengthInfo({ + selectionRanges, + }) if (trap(angleLength)) return false return angleLength.enabled }, @@ -437,7 +488,7 @@ export const modelingMachine = setup({ }, 'Can constrain horizontally align': ({ context: { selectionRanges } }) => { const info = horzVertDistanceInfo({ - selectionRanges, + selectionRanges: selectionRanges, constraint: 'setHorzDistance', }) if (trap(info)) return false @@ -445,7 +496,7 @@ export const modelingMachine = setup({ }, 'Can constrain vertically align': ({ context: { selectionRanges } }) => { const info = horzVertDistanceInfo({ - selectionRanges, + selectionRanges: selectionRanges, constraint: 'setHorzDistance', }) if (trap(info)) return false @@ -468,12 +519,16 @@ export const modelingMachine = setup({ return info.enabled }, 'Can constrain equal length': ({ context: { selectionRanges } }) => { - const info = setEqualLengthInfo({ selectionRanges }) + const info = setEqualLengthInfo({ + selectionRanges, + }) if (trap(info)) return false return info.enabled }, 'Can canstrain parallel': ({ context: { selectionRanges } }) => { - const info = equalAngleInfo({ selectionRanges }) + const info = equalAngleInfo({ + selectionRanges, + }) if (err(info)) return false return info.enabled }, @@ -489,12 +544,16 @@ export const modelingMachine = setup({ if (trap(info)) return false return info.enabled }, - 'Can convert to variable': ({ event }) => { - if (event.type !== 'Convert to variable') return false + 'Can convert to named value': ({ event }) => { + if (event.type !== 'Constrain with named value') return false if (!event.data) return false const ast = parse(recast(kclManager.ast)) - if (err(ast)) return false - const isSafeRetVal = isNodeSafeToReplacePath(ast, event.data.pathToNode) + if (err(ast) || !ast.program || ast.errors.length > 0) return false + const isSafeRetVal = isNodeSafeToReplacePath( + ast.program, + + event.data.currentValue.pathToNode + ) if (err(isSafeRetVal)) return false return isSafeRetVal.isSafe }, @@ -505,8 +564,14 @@ export const modelingMachine = setup({ 'next is rectangle': ({ context: { sketchDetails, currentTool } }) => currentTool === 'rectangle' && canRectangleOrCircleTool({ sketchDetails }), + 'next is center rectangle': ({ context: { sketchDetails, currentTool } }) => + currentTool === 'center rectangle' && + canRectangleOrCircleTool({ sketchDetails }), 'next is circle': ({ context: { sketchDetails, currentTool } }) => currentTool === 'circle' && canRectangleOrCircleTool({ sketchDetails }), + 'next is circle 3 point': ({ context: { sketchDetails, currentTool } }) => + currentTool === 'circle3Points' && + canRectangleOrCircleTool({ sketchDetails }), 'next is line': ({ context }) => context.currentTool === 'line', 'next is none': ({ context }) => context.currentTool === 'none', }, @@ -518,6 +583,9 @@ export const modelingMachine = setup({ ? event.data.tool : 'none', }), + 'reset selections': assign({ + selectionRanges: { graphSelections: [], otherSelections: [] }, + }), 'enter sketching mode': assign({ currentMode: 'sketching' }), 'enter modeling mode': assign({ currentMode: 'modeling' }), 'set sketchMetadata from pathToNode': assign( @@ -531,8 +599,10 @@ export const modelingMachine = setup({ } } ), - // eslint-disable-next-line @typescript-eslint/no-misused-promises - 'hide default planes': () => kclManager.hidePlanes(), + 'hide default planes': () => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises + kclManager.hidePlanes() + }, 'reset sketch metadata': assign({ sketchDetails: null, sketchEnginePathId: '', @@ -582,7 +652,7 @@ export const modelingMachine = setup({ } const pathToNode = getNodePathFromSourceRange( ast, - selection.codeBasedSelections[0].range + selection.graphSelections[0]?.codeRef.range ) const extrudeSketchRes = extrudeSketch( ast, @@ -595,20 +665,17 @@ export const modelingMachine = setup({ if (trap(extrudeSketchRes)) return const { modifiedAst, pathToExtrudeArg } = extrudeSketchRes - store.videoElement?.pause() const updatedAst = await kclManager.updateAst(modifiedAst, true, { focusPath: [pathToExtrudeArg], zoomToFit: true, zoomOnRangeAndType: { - range: selection.codeBasedSelections[0].range, + range: selection.graphSelections[0]?.codeRef.range, type: 'path', }, }) - if (!engineCommandManager.engineConnection?.idleMode) { - store.videoElement?.play().catch((e) => { - console.warn('Video playing was prevented', e) - }) - } + + await codeManager.updateEditorWithAstAndWriteToFile(updatedAst.newAst) + if (updatedAst?.selections) { editorManager.selectRange(updatedAst?.selections) } @@ -618,7 +685,7 @@ export const modelingMachine = setup({ if (event.type !== 'Revolve') return ;(async () => { if (!event.data) return - const { selection, angle } = event.data + const { selection, angle, axis } = event.data let ast = kclManager.ast if ( 'variableName' in angle && @@ -629,33 +696,36 @@ export const modelingMachine = setup({ newBody.splice(angle.insertIndex, 0, angle.variableDeclarationAst) ast.body = newBody } + + // This is the selection of the sketch that will be revolved const pathToNode = getNodePathFromSourceRange( ast, - selection.codeBasedSelections[0].range + selection.graphSelections[0]?.codeRef.range ) + const revolveSketchRes = revolveSketch( ast, pathToNode, false, - 'variableName' in angle ? angle.variableIdentifierAst : angle.valueAst + 'variableName' in angle + ? angle.variableIdentifierAst + : angle.valueAst, + axis ) if (trap(revolveSketchRes)) return const { modifiedAst, pathToRevolveArg } = revolveSketchRes - store.videoElement?.pause() const updatedAst = await kclManager.updateAst(modifiedAst, true, { focusPath: [pathToRevolveArg], zoomToFit: true, zoomOnRangeAndType: { - range: selection.codeBasedSelections[0].range, + range: selection.graphSelections[0]?.codeRef.range, type: 'path', }, }) - if (!engineCommandManager.engineConnection?.idleMode) { - store.videoElement?.play().catch((e) => { - console.warn('Video playing was prevented', e) - }) - } + + await codeManager.updateEditorWithAstAndWriteToFile(updatedAst.newAst) + if (updatedAst?.selections) { editorManager.selectRange(updatedAst?.selections) } @@ -663,28 +733,34 @@ export const modelingMachine = setup({ }, 'AST delete selection': ({ context: { selectionRanges } }) => { ;(async () => { + const errorMessage = + 'Unable to delete selection. Please edit manually in code pane.' let ast = kclManager.ast const modifiedAst = await deleteFromSelection( ast, - selectionRanges.codeBasedSelections[0], + selectionRanges.graphSelections[0], kclManager.programMemory, getFaceDetails ) - if (err(modifiedAst)) return + if (err(modifiedAst)) { + toast.error(errorMessage) + return + } const testExecute = await executeAst({ ast: modifiedAst, - idGenerator: kclManager.execState.idGenerator, - useFakeExecutor: true, engineCommandManager, + // We make sure to send an empty program memory to denote we mean mock mode. + programMemoryOverride: ProgramMemory.empty(), }) if (testExecute.errors.length) { - toast.error('Unable to delete part') + toast.error(errorMessage) return } await kclManager.updateAst(modifiedAst, true) + await codeManager.updateEditorWithAstAndWriteToFile(modifiedAst) })().catch(reportRejection) }, 'AST fillet': ({ event }) => { @@ -694,14 +770,22 @@ export const modelingMachine = setup({ // Extract inputs const ast = kclManager.ast const { selection, radius } = event.data + const parameters: FilletParameters = { + type: EdgeTreatmentType.Fillet, + radius, + } // Apply fillet to selection - const applyFilletToSelectionResult = applyFilletToSelection( + const applyEdgeTreatmentToSelectionResult = applyEdgeTreatmentToSelection( ast, selection, - radius + parameters ) - if (err(applyFilletToSelectionResult)) return applyFilletToSelectionResult + if (err(applyEdgeTreatmentToSelectionResult)) + return applyEdgeTreatmentToSelectionResult + + // eslint-disable-next-line @typescript-eslint/no-floating-promises + codeManager.updateEditorWithAstAndWriteToFile(kclManager.ast) }, 'set selection filter to curves only': () => { ;(async () => { @@ -715,14 +799,6 @@ export const modelingMachine = setup({ }) })().catch(reportRejection) }, - 'conditionally equip line tool': ({ event: { type } }) => { - if (type === 'xstate.done.actor.animate-to-face') { - sceneInfra.modelingSend({ - type: 'change tool', - data: { tool: 'line' }, - }) - } - }, 'setup client side sketch segments': ({ context: { sketchDetails, selectionRanges }, }) => { @@ -758,25 +834,35 @@ export const modelingMachine = setup({ 'remove sketch grid': () => sceneEntitiesManager.removeSketchGrid(), 'set up draft line': ({ context: { sketchDetails } }) => { if (!sketchDetails) return + // eslint-disable-next-line @typescript-eslint/no-floating-promises - sceneEntitiesManager.setUpDraftSegment( - sketchDetails.sketchPathToNode, - sketchDetails.zAxis, - sketchDetails.yAxis, - sketchDetails.origin, - 'line' - ) + sceneEntitiesManager + .setupDraftSegment( + sketchDetails.sketchPathToNode, + sketchDetails.zAxis, + sketchDetails.yAxis, + sketchDetails.origin, + 'line' + ) + .then(() => { + return codeManager.updateEditorWithAstAndWriteToFile(kclManager.ast) + }) }, 'set up draft arc': ({ context: { sketchDetails } }) => { if (!sketchDetails) return + // eslint-disable-next-line @typescript-eslint/no-floating-promises - sceneEntitiesManager.setUpDraftSegment( - sketchDetails.sketchPathToNode, - sketchDetails.zAxis, - sketchDetails.yAxis, - sketchDetails.origin, - 'tangentialArcTo' - ) + sceneEntitiesManager + .setupDraftSegment( + sketchDetails.sketchPathToNode, + sketchDetails.zAxis, + sketchDetails.yAxis, + sketchDetails.origin, + 'tangentialArcTo' + ) + .then(() => { + return codeManager.updateEditorWithAstAndWriteToFile(kclManager.ast) + }) }, 'listen for rectangle origin': ({ context: { sketchDetails } }) => { if (!sketchDetails) return @@ -795,9 +881,28 @@ export const modelingMachine = setup({ }, }) }, + + 'listen for center rectangle origin': ({ context: { sketchDetails } }) => { + if (!sketchDetails) return + // setupNoPointsListener has the code for startProfileAt onClick + sceneEntitiesManager.setupNoPointsListener({ + sketchDetails, + afterClick: (args) => { + const twoD = args.intersectionPoint?.twoD + if (twoD) { + sceneInfra.modelingSend({ + type: 'Add center rectangle origin', + data: [twoD.x, twoD.y], + }) + } else { + console.error('No intersection point found') + } + }, + }) + }, + 'listen for circle origin': ({ context: { sketchDetails } }) => { if (!sketchDetails) return - sceneEntitiesManager.createIntersectionPlane() const quaternion = quaternionFromUpNForward( new Vector3(...sketchDetails.yAxis), new Vector3(...sketchDetails.zAxis) @@ -834,8 +939,28 @@ export const modelingMachine = setup({ 'set up draft rectangle': ({ context: { sketchDetails }, event }) => { if (event.type !== 'Add rectangle origin') return if (!sketchDetails || !event.data) return + // eslint-disable-next-line @typescript-eslint/no-floating-promises - sceneEntitiesManager.setupDraftRectangle( + sceneEntitiesManager + .setupDraftRectangle( + sketchDetails.sketchPathToNode, + sketchDetails.zAxis, + sketchDetails.yAxis, + sketchDetails.origin, + event.data + ) + .then(() => { + return codeManager.updateEditorWithAstAndWriteToFile(kclManager.ast) + }) + }, + 'set up draft center rectangle': ({ + context: { sketchDetails }, + event, + }) => { + if (event.type !== 'Add center rectangle origin') return + if (!sketchDetails || !event.data) return + // eslint-disable-next-line @typescript-eslint/no-floating-promises + sceneEntitiesManager.setupDraftCenterRectangle( sketchDetails.sketchPathToNode, sketchDetails.zAxis, sketchDetails.yAxis, @@ -846,26 +971,36 @@ export const modelingMachine = setup({ 'set up draft circle': ({ context: { sketchDetails }, event }) => { if (event.type !== 'Add circle origin') return if (!sketchDetails || !event.data) return + // eslint-disable-next-line @typescript-eslint/no-floating-promises - sceneEntitiesManager.setupDraftCircle( - sketchDetails.sketchPathToNode, - sketchDetails.zAxis, - sketchDetails.yAxis, - sketchDetails.origin, - event.data - ) + sceneEntitiesManager + .setupDraftCircle( + sketchDetails.sketchPathToNode, + sketchDetails.zAxis, + sketchDetails.yAxis, + sketchDetails.origin, + event.data + ) + .then(() => { + return codeManager.updateEditorWithAstAndWriteToFile(kclManager.ast) + }) }, 'set up draft line without teardown': ({ context: { sketchDetails } }) => { if (!sketchDetails) return + // eslint-disable-next-line @typescript-eslint/no-floating-promises - sceneEntitiesManager.setUpDraftSegment( - sketchDetails.sketchPathToNode, - sketchDetails.zAxis, - sketchDetails.yAxis, - sketchDetails.origin, - 'line', - false - ) + sceneEntitiesManager + .setupDraftSegment( + sketchDetails.sketchPathToNode, + sketchDetails.zAxis, + sketchDetails.yAxis, + sketchDetails.origin, + 'line', + false + ) + .then(() => { + return codeManager.updateEditorWithAstAndWriteToFile(kclManager.ast) + }) }, 'show default planes': () => { // eslint-disable-next-line @typescript-eslint/no-floating-promises @@ -873,7 +1008,6 @@ export const modelingMachine = setup({ }, 'setup noPoints onClick listener': ({ context: { sketchDetails } }) => { if (!sketchDetails) return - sceneEntitiesManager.setupNoPointsListener({ sketchDetails, afterClick: () => sceneInfra.modelingSend({ type: 'Add start point' }), @@ -882,12 +1016,17 @@ export const modelingMachine = setup({ 'add axis n grid': ({ context: { sketchDetails } }) => { if (!sketchDetails) return if (localStorage.getItem('disableAxis')) return + + // eslint-disable-next-line @typescript-eslint/no-floating-promises sceneEntitiesManager.createSketchAxis( sketchDetails.sketchPathToNode || [], sketchDetails.zAxis, sketchDetails.yAxis, sketchDetails.origin ) + + // eslint-disable-next-line @typescript-eslint/no-floating-promises + codeManager.updateEditorWithAstAndWriteToFile(kclManager.ast) }, 'reset client scene mouse handlers': () => { // when not in sketch mode we don't need any mouse listeners @@ -900,26 +1039,23 @@ export const modelingMachine = setup({ 'engineToClient cam sync direction': () => { sceneInfra.camControls.syncDirection = 'engineToClient' }, + /** TODO: this action is hiding unawaited asynchronous code */ 'set selection filter to faces only': () => { - // eslint-disable-next-line @typescript-eslint/no-floating-promises - engineCommandManager.sendSceneCommand({ - type: 'modeling_cmd_req', - cmd_id: uuidv4(), - cmd: { - type: 'set_selection_filter', - filter: ['face', 'object'], - }, - }) + kclManager.setSelectionFilter(['face', 'object']) }, + /** TODO: this action is hiding unawaited asynchronous code */ 'set selection filter to defaults': () => kclManager.defaultSelectionFilter(), 'Delete segment': ({ context: { sketchDetails }, event }) => { if (event.type !== 'Delete segment') return if (!sketchDetails || !event.data) return + // eslint-disable-next-line @typescript-eslint/no-floating-promises deleteSegment({ pathToNode: event.data, sketchDetails, + }).then(() => { + return codeManager.updateEditorWithAstAndWriteToFile(kclManager.ast) }) }, 'Reset Segment Overlays': () => sceneEntitiesManager.resetOverlays(), @@ -984,6 +1120,9 @@ export const modelingMachine = setup({ ) if (trap(updatedAst, { suppress: true })) return if (!updatedAst) return + + await codeManager.updateEditorWithAstAndWriteToFile(updatedAst.newAst) + return { selectionType: 'completeSelection', selection: updateSelections( @@ -1018,6 +1157,7 @@ export const modelingMachine = setup({ ) if (trap(updatedAst, { suppress: true })) return if (!updatedAst) return + await codeManager.updateEditorWithAstAndWriteToFile(updatedAst.newAst) return { selectionType: 'completeSelection', selection: updateSelections( @@ -1052,6 +1192,7 @@ export const modelingMachine = setup({ ) if (trap(updatedAst, { suppress: true })) return if (!updatedAst) return + await codeManager.updateEditorWithAstAndWriteToFile(updatedAst.newAst) return { selectionType: 'completeSelection', selection: updateSelections( @@ -1069,7 +1210,7 @@ export const modelingMachine = setup({ input: Pick }) => { const constraint = applyConstraintHorzVertAlign({ - selectionRanges, + selectionRanges: selectionRanges, constraint: 'setVertDistance', }) if (trap(constraint)) return @@ -1084,6 +1225,7 @@ export const modelingMachine = setup({ ) if (trap(updatedAst, { suppress: true })) return if (!updatedAst) return + await codeManager.updateEditorWithAstAndWriteToFile(updatedAst.newAst) const updatedSelectionRanges = updateSelections( pathToNodeMap, selectionRanges, @@ -1102,7 +1244,7 @@ export const modelingMachine = setup({ input: Pick }) => { const constraint = applyConstraintHorzVertAlign({ - selectionRanges, + selectionRanges: selectionRanges, constraint: 'setHorzDistance', }) if (trap(constraint)) return @@ -1117,6 +1259,7 @@ export const modelingMachine = setup({ ) if (trap(updatedAst, { suppress: true })) return if (!updatedAst) return + await codeManager.updateEditorWithAstAndWriteToFile(updatedAst.newAst) const updatedSelectionRanges = updateSelections( pathToNodeMap, selectionRanges, @@ -1150,6 +1293,7 @@ export const modelingMachine = setup({ ) if (trap(updatedAst, { suppress: true })) return if (!updatedAst) return + await codeManager.updateEditorWithAstAndWriteToFile(updatedAst.newAst) const updatedSelectionRanges = updateSelections( pathToNodeMap, selectionRanges, @@ -1183,6 +1327,7 @@ export const modelingMachine = setup({ ) if (trap(updatedAst, { suppress: true })) return if (!updatedAst) return + await codeManager.updateEditorWithAstAndWriteToFile(updatedAst.newAst) const updatedSelectionRanges = updateSelections( pathToNodeMap, selectionRanges, @@ -1211,15 +1356,20 @@ export const modelingMachine = setup({ return } + const recastAst = parse(recast(modifiedAst)) + if (err(recastAst) || !resultIsOk(recastAst)) return + const updatedAst = await sceneEntitiesManager.updateAstAndRejigSketch( sketchDetails?.sketchPathToNode || [], - parse(recast(modifiedAst)), + recastAst.program, sketchDetails.zAxis, sketchDetails.yAxis, sketchDetails.origin ) if (trap(updatedAst, { suppress: true })) return if (!updatedAst) return + await codeManager.updateEditorWithAstAndWriteToFile(updatedAst.newAst) + const updatedSelectionRanges = updateSelections( pathToNodeMap, selectionRanges, @@ -1252,6 +1402,7 @@ export const modelingMachine = setup({ ) if (trap(updatedAst, { suppress: true })) return if (!updatedAst) return + await codeManager.updateEditorWithAstAndWriteToFile(updatedAst.newAst) const updatedSelectionRanges = updateSelections( pathToNodeMap, selectionRanges, @@ -1304,7 +1455,7 @@ export const modelingMachine = setup({ } ), 'animate-to-face': fromPromise( - async (_: { input?: ExtrudeFacePlane | DefaultPlane }) => { + async (_: { input?: ExtrudeFacePlane | DefaultPlane | OffsetPlane }) => { return {} as | undefined | { @@ -1332,32 +1483,227 @@ export const modelingMachine = setup({ return {} as SetSelections } ), - 'Get length info': fromPromise( - async (_: { - input: Pick - }) => { - return {} as SetSelections - } - ), - 'Get convert to variable info': fromPromise( + astConstrainLength: fromPromise( async (_: { input: Pick< ModelingMachineContext, 'sketchDetails' | 'selectionRanges' > & { - data?: { - variableName: string - pathToNode: PathToNode - } + lengthValue?: KclCommandValue } }) => { return {} as SetSelections } ), + 'Apply named value constraint': fromPromise( + async (_: { + input: Pick< + ModelingMachineContext, + 'sketchDetails' | 'selectionRanges' + > & { + data?: ModelingCommandSchema['Constrain with named value'] + } + }) => { + return {} as SetSelections + } + ), + offsetPlaneAstMod: fromPromise( + async ({ + input, + }: { + input: ModelingCommandSchema['Offset plane'] | undefined + }) => { + if (!input) return new Error('No input provided') + // Extract inputs + const ast = kclManager.ast + const { plane: selection, distance } = input + + // Extract the default plane from selection + const plane = selection.otherSelections[0] + if (!(plane && plane instanceof Object && 'name' in plane)) + return trap('No plane selected') + + // Insert the distance variable if it exists + if ( + 'variableName' in distance && + distance.variableName && + distance.insertIndex !== undefined + ) { + const newBody = [...ast.body] + newBody.splice( + distance.insertIndex, + 0, + distance.variableDeclarationAst + ) + ast.body = newBody + } + + // Get the default plane name from the selection + + const offsetPlaneResult = addOffsetPlane({ + node: ast, + defaultPlane: plane.name, + offset: + 'variableName' in distance + ? distance.variableIdentifierAst + : distance.valueAst, + }) + + const updateAstResult = await kclManager.updateAst( + offsetPlaneResult.modifiedAst, + true, + { + focusPath: [offsetPlaneResult.pathToNode], + } + ) + + await codeManager.updateEditorWithAstAndWriteToFile( + updateAstResult.newAst + ) + + if (updateAstResult?.selections) { + editorManager.selectRange(updateAstResult?.selections) + } + } + ), + loftAstMod: fromPromise( + async ({ + input, + }: { + input: ModelingCommandSchema['Loft'] | undefined + }) => { + if (!input) return new Error('No input provided') + // Extract inputs + const ast = kclManager.ast + const { selection } = input + const declarators = selection.graphSelections.flatMap((s) => { + const path = getNodePathFromSourceRange(ast, s?.codeRef.range) + const nodeFromPath = getNodeFromPath( + ast, + path, + 'VariableDeclarator' + ) + return err(nodeFromPath) ? [] : nodeFromPath.node + }) + + // TODO: add better validation on selection + if (!(declarators && declarators.length > 1)) { + trap('Not enough sketches selected') + } + + // Perform the loft + const loftSketchesRes = loftSketches(ast, declarators) + const updateAstResult = await kclManager.updateAst( + loftSketchesRes.modifiedAst, + true, + { + focusPath: [loftSketchesRes.pathToNode], + } + ) + + await codeManager.updateEditorWithAstAndWriteToFile( + updateAstResult.newAst + ) + + if (updateAstResult?.selections) { + editorManager.selectRange(updateAstResult?.selections) + } + } + ), + shellAstMod: fromPromise( + async ({ + input, + }: { + input: ModelingCommandSchema['Shell'] | undefined + }) => { + if (!input) { + return new Error('No input provided') + } + + // Extract inputs + const ast = kclManager.ast + const { selection, thickness } = input + + // Insert the thickness variable if it exists + if ( + 'variableName' in thickness && + thickness.variableName && + thickness.insertIndex !== undefined + ) { + const newBody = [...ast.body] + newBody.splice( + thickness.insertIndex, + 0, + thickness.variableDeclarationAst + ) + ast.body = newBody + } + + // Perform the shell op + const shellResult = addShell({ + node: ast, + selection, + artifactGraph: engineCommandManager.artifactGraph, + thickness: + 'variableName' in thickness + ? thickness.variableIdentifierAst + : thickness.valueAst, + }) + if (err(shellResult)) { + return err(shellResult) + } + + const updateAstResult = await kclManager.updateAst( + shellResult.modifiedAst, + true, + { + focusPath: [shellResult.pathToNode], + } + ) + + await codeManager.updateEditorWithAstAndWriteToFile( + updateAstResult.newAst + ) + + if (updateAstResult?.selections) { + editorManager.selectRange(updateAstResult?.selections) + } + } + ), + 'submit-prompt-edit': fromPromise( + async ({ input }: { input: ModelingCommandSchema['Prompt-to-edit'] }) => { + console.log('doing thing', input) + } + ), + // lee: I REALLY wanted to inline this at the location of the actor invocation + // but the type checker loses it's fricking mind because the `actors` prop + // this exists on now doesn't have the correct type if I do that. *agh*. + actorCircle3Point: fromCallback< + { type: '' }, // Not used. We receive() no events in this actor. + SketchDetails | undefined, + // Doesn't type-check anything for some reason. + { type: 'stop-internal' } // The 1 event we sendBack(). + >(function ({ sendBack, receive, input: sketchDetails }) { + // In the wild event we have no sketch details, return immediately, + // destroying the actor and going back to idle state. + if (!sketchDetails) return + + const cleanupFn = sceneEntitiesManager.entryDraftCircle3Point( + // I make it clear that the stop is coming from an internal call + () => sendBack({ type: 'stop-internal' }), + sketchDetails.sketchPathToNode, + new Vector3(...sketchDetails.zAxis), + new Vector3(...sketchDetails.yAxis), + new Vector3(...sketchDetails.origin) + ) + + // When the state is exited (by anything, even itself), this is run! + return cleanupFn + }), }, - // end services + // end actors }).createMachine({ - /** @xstate-layout N4IgpgJg5mDOIC5QFkD2EwBsCWA7KAxAMICGuAxlgNoAMAuoqAA6qzYAu2qujIAHogC0ANhoBWAHQAOAMwB2KQEY5AFgCcGqWqkAaEAE9Ew0RLEqa64TIBMKmTUXCAvk71oMOfAQDKYdgAJYLDByTm5aBiQQFjYwniiBBEEpYSkJOUUaOWsxeylrWzk9QwQClQkrVOsZNWExFItnVxB3LDxCXwCAW1QAVyDA9hJ2MAjeGI4ueNBE5KkaCWspZfMM+XE1YsQZMQWxNQtxao0ZeRc3dDavTv9ybhG+djGoibjeWZSZCRUxJa1flTCNTWLYIYS2CT2RSKdRyGhZawWc4tS6eDp+fy+KBdMC4AIAeQAbmAAE6YEj6WDPZisSbcd5CYHCSFqOQ1NSKWRiMRA0HqSTKblSX48+pKZGtNESbAQTBgAgAUTxpMCAGs-OQABbU6K0t4JIQ5RTfNQyYSZTm2YFiUHZNTpKQKR0KYQqRQ5CWo9rS2XypUjElqjXaxSRGmxKYMpJlB3WKqKVnLOoggxGc2mbnQ11iOTaDmejzemVyxWPEm9DA616Rg1JHPWdLg7PwtRu06gwVpHaibTzApZMQFq5QH0lgBKYEJqEwxKreprMyEOeNv3y8xUUhUChkHeFaV2pv2Mk3NhkQ6lxflADFsJg5U96ON5-Ta4Ic19W8saMY2fCCh2VHMdIciyGR3WPapzyLX1SxYEkHzDXUIxfRc61USFFHfONjnsFMSkcepFhoLRc0RGwNEUKD8FHeVkBIdU52Q6Z+CXORJB+DdWV+URuR3VMEEwwEKlUKxvx+eRVCokdLwIAARYIRkCYJQimRi6WY2Z32kTIsmMMDOQsDs1EIlRrFNORwRbMyz2aSVoJLAAVMBHkEdhUEEIgAEFZLU-VULfdCFG0RQakAmRTI7cKFi0a16h5QC3SkmiJE1GUwAABXJXA4AITz4OwAAzEhQn8KASRIJhNX8FgmF6ckRggXyFxYpIeIqDcsi3Cx8myDsxMhVIFBhXJzVsJLLwkWBNVQAB3TKyByvLOCKkqyoqqqwC6JhOEgJqUJat9tHSHNTLkDI4zhPDEHdTkKgsYzgQutkmguQtqO8dV2C1YgyEoTAPuDPaNMQYzymMN0FAyeoMk2fj3WqCpEWenYCjqGzXuHCQAa+zU5IUsAlOxXEEKfJioyUL4CjOizzFMjk+JKA4JAcLcrVp-JXSS7HvruDB-EgDh-AgXoSXaIMcaBqNoRCiRakdMDxEyV1QVZBtRo0GhjxhfJKNsr13s+rUscNzUAEkYLo9VCZxPF-GJfLyBITBJdrTJ9nSGoc1kBNdhzADuWkBxjPEb2DikLmTeN4NzZLS2CaCInbem0WAC97idl3UMyOwJAI04TvyQFIrMZmtybVIYSbCPgyjnGY-lIhuFgdhyrwfxk+wNO8SdoXsGb37RkfF5n2BgSaAKUwNdpuEajY0FbGPDNVByA9fk16ucdrrV6+IJuW5INv7c4R3MF7-uKEHxDq32xJMnkUwaGM-JrAsnkGcQapHGZuNMm0F-hDZBvI23MzYwUbrgZurdcD+E8gAIW8P4AAGpnFqbsPytlsNyH8GR54aDkN8aG4hdLHiyEAzUW9QElnAZAg+0C4EIIAJooNvuIL4uZlimkwtCHYoIwJgUWC-MudQORiBCmQihO9qH7zbmQKAcpmHXWlrLcw3JgQhTqGdeeZh7QWSIUsBEpC9ZvRHCAiRYC95QP8HKfA7BtRD3DOpKWbtZYFFOKyABuZjzz2MMaF+IU6bGVsCocRIDJEWNodVUkTBcQQGwOQOqJBAyxPPpQBRCA8HMx5BYew8g3EqHnsKfBBRLQv1UMKQcRjMamNCeYiB0joEdy7kMO8+h-BO2wFAXAaS77GjdL8TC2hiLCg7EKdIrIzqlNzHCOQISTZhLqZYo+cSnaYFae0zp3SLD4LzOaBwoj5aw3wsYNIj9lDVDZHkmZlSpTVLmbUmhbdYC4Aqv4NySDNlKGkIiXItQQoZAUPPYi5RshsQ5HUcE4drneludHe59TAjPKYK81A-gmH2KQo412xFjRWHsBueQOQ1zzwTAsIhdRH4AMdMoWZsKqHhLbmAAAjr0Hu1ioC2M2eCZmUM76rBsPkuGEzZY2AKKI787iXoomMRQsxdKFkRKYIklZ1B0XX1Hr-SQ9RTgbhSFuA8RkmbS1bI-Y8lhglQoNjXGpcqHnQJJJtVAxJbj0rxFSVVI8pYOHwY4DkKQOS1HkLuNkphOSbjMLIdQx4aV1xghOQQzkQi9BGN0qK3x7qckwlkb8wg+qbmZp7XY4UQpYOjdvGCvMCYCwCMLUW+BxZam6dCcomttBwnHrsN0V0x5mgqDYZGdh-mSrspaze1qG7cCPsiu2iTsAkAAEbyPdWTV2N0BGFIOLUesNp+L8vtByPx6h5i4SHfrExkcx0EC1LIgmblpxpIKBCK0m4tw-C1R2TkkgrDWDvgibIVhxGeRmgfAIjT06n2SUMC+-g8AFVQAQCA3AwDSlwFOdUEgYDsEEKB7umBBAwdQPe0CzNNYwk1mxH4Ob+K2C5TsF9OtaicwtWemugHgPt1QKnMDZ9IOUGg7gWDBBSQkg4xIJg9VYMki6OhvwWGOOdzA3h-jBGl2YtQkjL4ACm0JnmBZTc89TLlDMDkHI5gwKpHNRjG5kdWOCyWSfbjA8+MCYQ9lZDqGkMYcEHZp2inYOEfmBUVsZgdIXUwvPGwzIJLKAyFyXMFTLPQus0B2zpJj49wg45-DgmSTCZJKJ8THGpOee87h-D-njRmlsFoJQIUEzzyWGDABvxVDHiBDmADyWAj0KQU5uDLmkN4Hc9JzD87YCCD4L55TV8PW1kRMKDC8s-gHDirw+EYNTJFvxZrLcHW2PdcQb17LuX8vDAk0VmTo3xuTf85IDW5pTJxnHnUXBhEGhe0wqI+Ku3BbdYYYd-rbnUBoc85d-Q12VN+RanN8o+6Nzgo3LkXh0JSXwkdG-cK93vtdfgaiw7QmRNidO4V4bghQfg+m8utTxFNUngAQcS0mteGImZMuaGUIzqmix20-Acp-uIcB8Di7POwDk9JqpqH1PpBezqP8OmugqP7HtHYWw2Fvwv3i1KqpSW2OyN51l-HeXCfsDOyT3XIuysQ+aokObRTRB7jYlYOE26Sgr3tOabRuQWzhS52y2xfPXODaBx5mTvvNSi+HpTiXshZZaHdB1OWYWqMgtMMmAzN0fY+9xOyqq+ucsE4K5Jknofw8OMh9boFFQcxDKPcZRQ3j5uOEAsNH+sgufRJJNE3AsT4nkiSX3HjBMssA8D4LzD7fO-d4SSSQQGWL4l4xWXj+JGQ2+xFEoc079SgpHwfLGojeTgvzb1EmJcSp8Oag7n47RuTeefHyfnviSZ-94HvPtVUYyIrkzdyQljgQoFITNIBcmCuoKaIfkxjKgADJ4A3qoDTiXqajXrIp3qW43wfx9qyzGDgimjmDAi1AqxcrEQ-zZKAg2CQoJYjpGxQHZRIGYASCmy4AcAECEbiAsgAiOhmRsjy4lDZBsLmC6pDIJjaDiJUEwHTh0EMHsBMGhhi6L6lAOBfA1BkR07Vb-j8SyB7CnBeqPw5iFrCHQE0ESAAByKK6UqAeA7AsAuUEAEAgwiSAQLA5h96boxoPBw0oUHalG3B34zMygMuZgQIogFmmuVmNcIhBhxh-gph5hlhpAF8zsKB6q5o+C9QHI7ov4pwc8-ELWsswUnIZofahi5BzGm89BjBaSCgkgFgC8Bm34ywdecM6uGBxkoiyOmmGuw6xRRspRkhVA0hEe4uiQ+QCwgEFkKMACG4kU4Uiw7BGQvh9O4iDk16eIs6p8iS5AyK8BiBt68RFOAx2wp0jY9Qj8A46wm+pEREYEZ0hBfi4ivQXeKK-c8EIC+IuA8G-OI+SGnk3gDkggdxCGggjx7AzxXSCRUsZoK4zo36PwwoGgAq3Boiuc2YCOCgW4rY4iE4oQZuNBmx+AohOxMhVuH8OspgbEOYxkACNQVgfUVgucqgwIa4ZknIVyRRMqGJkGcieJEgNmnAdaQQdwXezqJI2UJIBAN4DBU0-g9qmJwuaSYEgE3Kx4PIoKFk9RjMLBdR2SipiU4BpibJWJ2xXJnWYscmUAeAVhNhUp7JvOJpeAsp4EtJZo4yxwygtoOc5cSwrIcuZBwRiWNcepwuBhYpfcmokA-g-pHJTBoJrspkLhjgqQaOpSXaGSeq34jg8wwoPw4i5AcoZAgQ9U8oja0ejgBQsePInCXBiiAcuwR6+Kdg2gJ60qpi3JzqKGqWU6hIM686JYw+KGQeJO-JR8rk7kHZosXZ5uSmhGbpACZQbodQ5gXaEWOK2guQ4kxkNgXOA5bZbyI5s6C68oBuJ2xuxOnmm58EQ5XmnZe5r+M2VO7s22D2K87uzu+x48kIZkmpKQloG5LqkpDqTq-JtqFhbxAevZaG-xAF9Sgg9qPQxIggEFUCJM-RshiIpkssuwxZPwZknau4ACiwFJMM-Kh6358qbc2GzSqywFA2oFSG4FLqsmnGOGqyhGcIucI0BwmsHCXa-i5QzOqO2Q+wZ0xFtqdsqWyyLSlFAuNF7k8FtCXmolJ8TFUZVOZ00gnE8wWyOwPCcMTeLiG4MIgi-hQl8KZFKyayOAnSElHxEgtFJFuA9F8mjFYO6yIJuxyFqZ3Koq4Ie+sIIyCJgE4KOQGg-Y1gRliy8lplbS5lrxPZQ2NltqclDsplpOUVk5XwDgxErYlQ0IrIHYrozIKQvwBwHBWgdQoVESTyLybyiCll1F1l0ldFFVTA55fAhGQIucwICU2sZQgKKl4IA6tRrIYiOp2ugsMljyiKU6DCNVsV9VtlAJiK55+gzFlRSwogMIx4rYxKqQXyMZbEp4bI7Rp6MqzZY10CTKLKp8oe01fZcVkF51PmoerVwxSgG436pwZogEHYbEaQyYvE8UQIO2w1LGnWLZwliq5Ud4WA11YFs18V4Nyq+JSFhJchKlJBoiYE+6fscMgyHsnC1G+wcY4iRACBuJ-gDksBmAkZrlyN1GDYdgboDg5oyg7o76OQiwh4gy2Qxm6MPpFB5CxNiB5NcBvR1NqBpQlQiJSpOQTo48rNkg1k+wOmoqkEQNm8AtpNQtlNVA1goto8SwLFXsmFNQ9Gct7NOwnNoqnIRNJNMAZNFNTBMgutUYbi9oWYog4IcUbIptCtFt3NZC-guAKKK08ovgcoJUGARUdU9hWUl8BJYtggPsGYG+tQgI-ScJH8xgeFB13I-SL8ZoSUZA2AXQwwYsbyhO2U0NSGhdxdIw55wdaScOssv8ygsJPsm+F0jYbI50uQSsQRHREg1dJddabyzk-eYssAJsldA9DBNdIubkAJJsDdKQTd2hSgeyxgeB-ExgDYhwoiiIxm8wh10qg9PJUAU65d+5eehuBeUmJ9c97k9dSlqCbNcYW4CgHFWFFkvCrIvagE36f850TQzQgdGA8AUQHRcdo8ggTuzMpoxtiIxx9Q88IaW4CYjgr8a2Qh4Bl4kDUYIgOYsDbiQxiDFZCAWgCwQ0qJPi1WzJvN0kvoKUaU802UYDpeyNIgj8hD8DLYIc76ABjoTIfqSwIUag40DDU0s0zDcAuDr4KMDosJHF9guYhy107a0xmaHBWQ7BZCMjqEXdpc1RtgtRSg+mLh4qr175Z0fdR1MKMacoujqCzNUupkj8wI8I9Qnh101QzIroYEWCm4yO3p-dTZINJl4Gz+F+SmDjt8EteCcI2BhcKjpQ9NqlXNy4tQLoXOJW5+vG+G0T105K6Q6DTeg6OVVGZkDY3ESsoibWm4XO+2vW+TAkPivay5GgXEuYnjpQrIH40MrReVPI9TOOf2eTSNYtcZxo1OGFlJkMSOWQwEZSr9wI+dqtRszZWJozbD4z4Muc2+qg22qOWiCJNgXs34RxYEmeNiOeUTYziRhEtQ48Kd4a4k3iuYZt+6donwtDwTI19hx+Xep+veOTg+NzWziRbNmlxwhwf9BSj636KJzOZEeh1B2xTTTJOKUIv+4UGORQW9yggBKdhB4ICYPNPzoR+hBp3RaL-qvaDgWL9NACtoUxxycYcsQWgEyLnJgdkmTsTTqMzIBzAlmE6lXT2Rmg0IsgX60ynL4RJhZhrqfLxS0gxtkMx4UMoI64DoOS+QJCJaqz5CVLtz5MSwRE36-hnBuL+EriiMoEVgvwcYuQCxSxnAPcaxyKTT4UPw3wGimgYKnIoIFJAi3jJLn8tQtx9xthTxJsLxaL0JsDxS4IawTaoIYoGBpqDzBFusLJupIQVpeJfL247NBQmVZSgkAb8zdoZosgGZ4gDZWufpub+pFNhpwG49IQ3ANhdwQppIfL3sRbWF4xSgZgGrXrf9naJCdLoj+rEg4ZvOBp3JxposppzEb+s2nwmSdQmQriHIlriA2R7pJEXp6JjbAZBpQZU0oZs7YAvbAcqsezCIOSKsQEpk6NOwT2e+WZOZ0CsA+ZaLxZsDqskMzohkcMSs3rmCDg-YnpxFk625l59jRrrsHtkIy4HCACjzu7CAEWDY5SzoGgogYB2bvzoN8K0FjqBMp1FhaLo0BC9gZgdgWmz5Ak5SJolJNWOq1jjZxHp17GDF5FJQYLUsNH4k4gYUTaXFpwdNJz8IQIIUFz07J1P5JWqy1H7otHonDH+lAEQEZmkasIDHZVpFcmTSEVzlqndNnu7F+ymicMPywkdHIU4qmEhn0CynZlHSK7N5qCwnln7jTJX9cMdrsDygHUbE68CnINPHjVU6iC1HELVemsuQcYKMgKdQUu1OponpxELnCKlVKKDCcXkgOwbakLdrXa8L0UUUzR+6YbEXbGPH91l1Weti5n6nVn-nX1NQwqJZZGO7ZkOX8NkNmAcXbC6Vm4mspwywmHCY21m6n46hWgpLNjkc6tttmtfLIxGB292Bj8ZkXTEr8tHNStft+rAdQdxU17iH-kxmFQc5joD2Lam+NQXwBVNgRwgh1oBdM9Q9Z9ZdMdTTjoiMlW61qQlW7daXkaHV+HJ0dbUoJ9pdKKo9zc49JsTTbzuYr6xypBs5Aby9-Y4Eqw3CLgLgQAA */ + /** @xstate-layout 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-u+1vzXM7OCDMSxIK-FUmeB0kgrC5Ght8+EVhBlHTdmUgIoq2HBKpQMMJ-g8A4VQAQCA3AwDelwF+cMEgYDk0y5ozAggCuoGCy5Mo0NoTRLMByJGQIDQ7Ai32JD2QUtpb3nV8VITcuUHy7gQrBBiTEyJBIQGgxCtEg6NVvwghxswMa7N5rUHcp01a6aETWM5ipCWD18EZh8j5HMCkpYI30v+KgVonLeiZtzZK8DcrlWys1cEJa7AQS9uFZa3MGqx4zBjUzqFJGCMIRxzjmyacvK+0-oPall7wOgmTc+01+bRJFvLc1mtjbgPce7aaxDu0KZbBaCUKsLGSNQJV1NEcVQNpgQ7me3vCZtSvtFZ+2VvA-3NvkxIAAI1gIIPgYODsQrM8dgUIU0OgUdG9VZ5Qq45BY42xdvb9leaLdj-nVTBeE4W6gJbK32Dk4l4IaXsv5c08O+dRIcUYW1FTDkHsaT1WiVmoacQNt2ShWG9+1TWPRsBAF5MoXxXSt-dQFVwHzvBD6AVxDy29QGdDnHo1VZNE2tVESfdX3fO48W4T1b4nNvSerZtxTrbGes9u6V9Bz3FRJDCjsKaWo6ZoarORqYFYwobLKGnHs9aJuY8vYuX6RPIuU9p9b-gP02f3cINEj36QaCYqVwyEULY+QNA-GXeFE0sd0fG6GRIM3ARF-9zryTu3Dv08b4Ix3iJR3u+FnSFEFgjNGQ3ECRnZFzFTDeUaiPHuhSyYEBklSnTBTAwAzwHYCT1+zF1TzKyOm8E2kEHuDQNwEEGQPBV-w9131kCYi0DyENmXiUED1ImzVMCHFsFsGTgwXgMQOBWxGnRViIPNRxCJzfzJ2bwf3wMIPA1IL4JnW311jiirh3AxjmFQUUCRVV0nBLF+B7AdBn1yUOUf1ViJWxFJXJUpR0Smxf320wNFwqxwMd0JSJGJTMNJCJEEA+zCS307z-133WQKEwUFCUFTCSVIi+HIjQxOEnFOFjir2MOcNMJB3MPxzy1fwb3f3EMBycJcKSLcI8MsL0W8IoJ31Ina1MGo3ZGbUklCNAixmkGZCiOyBiKN1n3v0wjwAC1QG-E3kjH8xjS6NgR8MoNIjkyYmMH3AQnMEyGXifjnT7HSTsDqlAkGXaOBn6O-AkH-lwA4AIBa3EAhAxQtBzGZBP0QF9TzHMGLAxixg4ijznx-lWM6I2K2J2KoCbGKIUIcAUhOESgH0ZzsgqkqFMDOFg0cTNGcTuLaI6PWMwAkAADlUB-ACZUB0DYBJYIADNdFfJVYUScRgsSw7RfVbZbpzQ6MKpYRUllAYozBgQLMVjoTAtYSESkTcT2A0TSAwlBiPioVUwYlaC8gbIzgzRsxuFNAoRZA4sDVBkXiMDrkFAoYchFjbATQRQzwb8xiAQJxpJx9pTtjZT3jTMu8SgEQfhREdhM4LRHp7oFhs0oRUhB9BlNp-McRsAtEKVyB+iei+jGTrk0VyIEk5hagzQ1hQiEp0h2tqgKh4kPMMdo8f5ugSVESsT2AClcRcBbDV9cDJCEyStBBkzUy5V5CoUUwxxCx4RbYBQNAV0ziCgeEsM0FIJjxBkPxQhn8YSvT8AniuTDTfCwjcgx92Q0cslnNzZvhlB1BQJJzWQWiDCi0WzctLkuyH9Y9j4ggiCDN7giRgYiQCBdJtiXZ-AgNWyv9fToRRMTiOQ3RUh1CKpahJARQLAzgBRPpITDl5y2zGTlz0tj4bcZU8B0SDMjyFyl9fyoA8BTzjh7R5MdUIplARTm4ex9x4p5pZhmyQhgKly9ydE+IDN3yv9diiyr4chCTHBexCxOczZbyUgfhwTUxewe9fhBkiApQQw8LFz2y-NOyYSOFdRVgFIvhaT9wH1hQyTEhIsmIMUqhzBjgHImKWKZQ2Kl9PzH9j5Nztzdy8BsK7h5LDz0Ln9fTIQDjcghRdVaMzwCgs0W5UhIRshljXyi1mLgwFK9Kv8YSvzxgBNQL-yjoMTtKnLdLjz2KvLCyhiSikp5454Uk7Nqh7JjA9wfkrAHBbL8079DlHK6xFLMLNKXZIB-B0rWKXLFyCLQqFDsg61QI31VBoZ8gzwDVcF51mNMllNYz7jpFyA-QyBAhNZ-RhNqDHBOxaCOR3NTibkcFdhVDG07BtBmrUqHLuBgcBNY09Ncr8QjN-QV9sCqsSBFFh1fE4S5RIAAA1NalrbhayTsByXNaSkfVMKHAUe6ZNRqawJi+agJY+Jag6gzVazAYzEQ9IsQ9bCQba9gXas5fa-TY6n6kzMGXspNXMRdP3fIDkTVVZaSiEDIR87ndMOIwQkdIDLoUDXG3xNkjMzasrXMoms5QQfGkDAjSm9A06g0fBfqnQ48KTJOcIwA5kFYBCTFW4zze-Iw+mvxHbCVUm+wqrCm6Q0Wm1FrWEe0O2Wod+SiR6BycM0QKoM-aoHGzTKnMWjaiW8mg6YWoHN6oJWWwikiH5CIoqOYR1HYFZJOS6xSC0aETZGknW4g1RX8sVa1W1HAWVcW8XKW4g7bH2rLG1J3AOkK7kwCZGO0b5fIfcKImEcy2shyAvM-DOW8T2oQ17K1CVKVaOoOhwkOoQ02t7CVKOmVGOns4YhEbhBwCoY8KwaiFIaKaqL4I4KeAcZeW-Voww2PVAvOstJgfo2pEuyW426Q0eimOXFrYEe0TID6aEPsWwDNaoGqGxCk+KVYXOkdUe8eyZSeo2qQ0O2e-aTPOWqGUCUQaEG0Y8VtXsRNYi4M44FSfesZMAcdSdWQyME+iQMu8NQjH+hrMghe+YV2z+PilMByWqrVNgsqd6YESCT+oFJgU9fSLAABoB3xQQDBhULB7smG+u10LpNuZnPPLBJOVVFBdzLIB5Gagehy3orizaAY4q2Oq23rC-EsJKu09mjVUsdIBCfYC7TdDyeyg9IgVhmAfwdh7ot4kq+MHsGTXNU0fIAsROIR-IERxCcRu7fQwtaR2R-uBRzAXY6wZRuOnpMfJYI4NSfsaLXRlaMRxOjDJi0x+RjhqgGQaxkiOFXMKEYwa-N6ZkZx+eUR1VVeBxzxvo8x3YlQfxumVQiEX4eqWEWoBCMkoRvsaOVFHmtBZqKRn+GR+JnxsQZJz3VJh6jJuod9HJ2ZZUjZE0ayrGDdJh2c6R7AIkdqrsjsuRn0y2i6cSjQJxQsaS+6aspIKjQ0QS2wM0ESpinpvptylSzyo+MC9MnyjclZkCzZ8C4Z60PfcPLnD6R0FDXfKON1CY2OUKKCZZ3ppSgY9yzgATN8EgXeXoDS-cgQvZ6Gi+Xs+wBCdIRq1YTRpgu8b3DINg50VjR51Zz8rCnKgzIgf5zhuukopOu0H1MZyCPQk0Wq10eq8faq1ITp4x0+fwXAREv2HiVUXjMAWWDWAGcWa5QQDBOxEI5eIEZVaZxCrmnYccXIWObOSEsgbADoQYd6xElbYGABiVqVoYOeul65C0NIY0XFtmgEGo00Pcbm0sO+SPAWxV6Vxa2V8WP623AGjbU15Vy+1Vo5pp+ebIIsd+DIURVZaihTYi7QO5nsTyO1mV4OPgSw1c8hBV7YpVgjS+2AchNVr4JiF0WaNMDkWkkcOdQ4PICTL5fu3JI6BAm1H836f6VWS1g28XXCP6PwT2YGI6RRdweVHBCqoV3mnYbIflnQsofVO81pl8gWgtxA4t6t1lr2K1xve3cQqt-6WtsAet9gRtp1m5RkLW34dJNBGo+CUxVQd1FMDnTyQdotgTTAXCDAithwk9vCedxdqpjsTegcNkEVoSyFk0e82DYwY8acDQCl+cQ9-QY+S9jA63a1pvQGwD699AdlrlJiAsc0+OFpVtcEUQBqD6L95eA9wt-9gTHK-SABnDzACD7WJdwQcKNreJf1591taggk2zRs79jDod7DviXD4Didh3fDwjqDudW8WOCjhD6xdg9IOuD1uj9DyEv94+ImEmMmOenjPD7oKXDoDgfB4mUOQjXePyTF3WDl3cB+DIZGBJaEBHBwMoJNeDUTn9r0CTgTKTtTy+uT1jjIwG2ABTpT8mJgVTmTnjdl5QA0PTzIVpocIz6xRCRNJxVDjQMTx8GljAeAKIY3Lhi6QQWEKGBCRxo8AheiHMdIGEewYy6oC0R2MARL6YIccid9dL+p4ULkWg+0CqkLEqEUIroWEWWduLkhkokQOob1OFPsDL6rpOV9eo5iYEWok4Zrl2d2NrkroQc0vMF6B7SoL982Fxxg28FIV0CeFxGb7kYlsZuKKqmS6ZwQGECSrGdQZSZCdjdxasHbgR-fHIOoALghRpyqY4NIbIJZDkFiF0FK5h+fMbcO+rFI6bJrO71uiSyMyYgRD1USRY6QSCTdHm7tSzuM6RIwvWkH6wwrcH3YPMRwVQLmKk9ugTzIUwXQ19+DPvOIgXGpIXcH26o0SszpHcGY6xFICyCfGiauAvGnmvenrTnk26nvFmk4btS57YF0f0zZeYicsVgWwehfVysHwXq+auCiFeB7dGEapGunTRuYGKdrbgm1Xg0FAQ8DdgXHi8VzGFrDdJpFacPRvPHML4c4Ep9Hoe7IxIslNwrHgXjroxfcSQB2iKCwCwB6VlULXIBQR7luIx-dB4hkgYu72uWTBwaoxY00EcFOFByM1piTPNyl6RR4tymUu7+oSAyEDPivCX5kdneYhg6HWS93ihEvz8ml9bGBHbzsOKxddYcfO217rnCSpnCUuTAZFviQNvl55k5E1E7vjlaQNSfMG0cfGriweb+wdyfpNjSfsv1XkiMCcM4yoEE4iXvISCqylMc0juePzHH+J0zsl0t03p-onbqZgqMrzQeoVMEarJDZd7u02OBIZBkOZJMgMF8gFk7u3Sb1Byn3CooRMDmWYGMRcwyR2mMZWagekyowlu+UEERp2BbrcoqoI4brhFjhzAhXIf3Lpj-GwHKUVy2HEINwA3I25ty3fdBPgI9a1RGC0zexqaQ4LHA7ar6NCoFWeYbF1mUAJUAc2EiGIVGrvelEFx45RFa+Z1RChVVUDH4qBRfChLQJebIscK-gTKmwJwTPxwiBqY4MPlvKOQcguyHYGkiiJyV-KOg78N320BwYe8V+aiKET4ovwu0eQbQOmH2AOCMqhVUQbCXEFgYtyxId-tDF5DuCW4ng8ytCHip9IkqOQTQQn2kT5VnKIgpcuEOCrRCdg9oOIfHVWAd1cw92PPPYFgzpD7+mQnSk4NhJ6DcqWQgwSEOK4H8LoW-WIQKA8FQgvBeAndtymPyopBkfTTqrAG6p3d+q3qZ+PmDLLTRBuJoH4M+wcB3gUgX6BXnNQqxvVzW1LT6oZihrg9dGOwFYP8ATgZAJeCMA0DyjLLftbwM5LQa82Hp41gMhNC3u10BbDFJIBodJuIDuhnYmCMWAqAhAYIiZMMaDFRDLS2AB8eSeQH4DATMB2ARM9mJOGcB+E2Bdg26PihgP+4-whautM2n7XB5wjfhiIyaBHw1QOR5gKSZMDCCREQiRaQPcVCbztTSDq05mEkTASVoYYYqScZNDVBsi7IsRhfDIRQnxFe09aLI6OsSJ+FcjygPI1INFEKF1BxyF2ZjAyMCBRox6saGpEcOD7KEYhCMc0hmiHD74e8IIqqjULR5iih6wtTUeWkRKTI9Rl4WEIaNUbDhrEygZ6E9E1J54xOmwgHgEDtHf0J0wSMgjKPhHAt5Rbqc-u6nXQDVokPqDIBqIIZnpMARw+ZE3SWDQwnyhYGaM-T7qWRKg8MOJmw2T4dDPcDkJ1OMRWhTEYW0WVXK42iYSM7+1oiQGiyeZdlcBm9fvNzQBC+djA+Y0TDsFzT9jryz1Sfh2MRYvM8hUgtgbo17HyAxxiFDNNc0LC3Nx8DzScf8zWb0CJBHzL5h8JkE2MFxKYPsQUCSyvcm4L8cCLC3T47AEWoQiQE0NRb-N5xBUM8UuIvEriQuerViJCCUhNEXE1LWlnLHaEwjAIJHI4DVCHBHE-cS8UIicH4q8Ik0-YOzCKK9BBtdhcrcCZ8JKIAFk6+4e+r2Hpy6tgRPxdQH3VUCo9KwWEiQbGh2hhtsO5CHbo72nCRZxENgFiK917BpA7wbkZYH0IY5HsJB07NEDhJ24kd1AczdiLmnGixwespo0qOLxWjaBWxlYazhIMA6SSyuPXSrneRGr6N98E+L9qIEyTCSsOEg-DjpJ3B6S-W-XQyQoHmCap+sqYAEMlnE6YdJOnncmPZw042TyuaXeyVV0Mkpp4RjaOgsC15guAgAA */ id: 'Modeling', context: ({ input }) => ({ @@ -1378,21 +1724,28 @@ export const modelingMachine = setup({ Extrude: { target: 'idle', - guard: 'has valid sweep selection', actions: ['AST extrude'], reenter: false, }, Revolve: { target: 'idle', - guard: 'has valid sweep selection', actions: ['AST revolve'], reenter: false, }, + Loft: { + target: 'Applying loft', + reenter: true, + }, + + Shell: { + target: 'Applying shell', + reenter: true, + }, + Fillet: { target: 'idle', - guard: 'has valid fillet selection', // TODO: fix selections actions: ['AST fillet'], reenter: false, }, @@ -1423,6 +1776,13 @@ export const modelingMachine = setup({ reenter: false, actions: ['Submit to Text-to-CAD API'], }, + + 'Offset plane': { + target: 'Applying offset plane', + reenter: true, + }, + + 'Prompt-to-edit': 'Applying Prompt-to-edit', }, entry: 'reset client scene mouse handlers', @@ -1494,7 +1854,7 @@ export const modelingMachine = setup({ }, 'Constrain length': { - target: 'Await length info', + target: 'Apply length constraint', guard: 'Can constrain length', }, @@ -1546,9 +1906,9 @@ export const modelingMachine = setup({ 'code edit during sketch': 'clean slate', - 'Convert to variable': { - target: 'Await convert to variable', - guard: 'Can convert to variable', + 'Constrain with named value': { + target: 'Converting to named value', + guard: 'Can convert to named value', }, 'change tool': { @@ -1556,7 +1916,7 @@ export const modelingMachine = setup({ }, }, - entry: 'setup client side sketch segments', + entry: ['setup client side sketch segments'], }, 'Await horizontal distance info': { @@ -1639,14 +1999,19 @@ export const modelingMachine = setup({ }, }, - 'Await length info': { + 'Apply length constraint': { invoke: { - src: 'Get length info', - id: 'get-length-info', - input: ({ context: { selectionRanges, sketchDetails } }) => ({ - selectionRanges, - sketchDetails, - }), + src: 'astConstrainLength', + id: 'AST-constrain-length', + input: ({ context: { selectionRanges, sketchDetails }, event }) => { + const data = + event.type === 'Constrain length' ? event.data : undefined + return { + selectionRanges, + sketchDetails, + lengthValue: data?.length, + } + }, onDone: { target: 'SketchIdle', actions: 'Set selection', @@ -1776,16 +2141,50 @@ export const modelingMachine = setup({ }, }, + 'Center Rectangle tool': { + entry: ['listen for center rectangle origin'], + + states: { + 'Awaiting corner': { + on: { + 'Finish center rectangle': 'Finished Center Rectangle', + }, + }, + + 'Awaiting origin': { + on: { + 'Add center rectangle origin': { + target: 'Awaiting corner', + // TODO + actions: 'set up draft center rectangle', + }, + }, + }, + + 'Finished Center Rectangle': { + always: '#Modeling.Sketch.SketchIdle', + }, + }, + + initial: 'Awaiting origin', + + on: { + 'change tool': { + target: 'Change Tool', + }, + }, + }, + 'clean slate': { always: 'SketchIdle', }, - 'Await convert to variable': { + 'Converting to named value': { invoke: { - src: 'Get convert to variable info', - id: 'get-convert-to-variable-info', + src: 'Apply named value constraint', + id: 'astConstrainNamedValue', input: ({ context: { selectionRanges, sketchDetails }, event }) => { - if (event.type !== 'Convert to variable') { + if (event.type !== 'Constrain with named value') { return { selectionRanges, sketchDetails, @@ -1801,7 +2200,7 @@ export const modelingMachine = setup({ onError: 'SketchIdle', onDone: { target: 'SketchIdle', - actions: ['Set selection'], + actions: 'Set selection', }, }, }, @@ -1969,9 +2368,18 @@ export const modelingMachine = setup({ target: 'Circle tool', guard: 'next is circle', }, + { + target: 'Center Rectangle tool', + guard: 'next is center rectangle', + }, + { + target: 'circle3PointToolSelect', + reenter: true, + guard: 'next is circle 3 point', + }, ], - entry: 'assign tool in context', + entry: ['assign tool in context', 'reset selections'], }, 'Circle tool': { on: { @@ -2002,6 +2410,29 @@ export const modelingMachine = setup({ initial: 'Awaiting origin', entry: 'listen for circle origin', }, + circle3PointToolSelect: { + invoke: { + id: 'actor-circle-3-point', + input: function ({ context, event }) { + // These are not really necessary but I believe they are needed + // to satisfy TypeScript type narrowing or undefined check. + if (event.type !== 'change tool') return + if (event.data?.tool !== 'circle3Points') return + if (!context.sketchDetails) return + + return context.sketchDetails + }, + src: 'actorCircle3Point', + }, + on: { + // We still need this action to trigger (legacy code support) + 'change tool': 'Change Tool', + // On stop event, transition to our usual SketchIdle state + 'stop-internal': { + target: '#Modeling.Sketch.SketchIdle', + }, + }, + }, }, initial: 'Init', @@ -2025,11 +2456,7 @@ export const modelingMachine = setup({ 'enable copilot', ], - entry: [ - 'add axis n grid', - 'conditionally equip line tool', - 'clientToEngine cam sync direction', - ], + entry: ['add axis n grid', 'clientToEngine cam sync direction'], }, 'Sketch no face': { @@ -2086,6 +2513,65 @@ export const modelingMachine = setup({ }, }, }, + + 'Applying offset plane': { + invoke: { + src: 'offsetPlaneAstMod', + id: 'offsetPlaneAstMod', + input: ({ event }) => { + if (event.type !== 'Offset plane') return undefined + return event.data + }, + onDone: ['idle'], + onError: ['idle'], + }, + }, + + 'Applying loft': { + invoke: { + src: 'loftAstMod', + id: 'loftAstMod', + input: ({ event }) => { + if (event.type !== 'Loft') return undefined + return event.data + }, + onDone: ['idle'], + onError: ['idle'], + }, + }, + + 'Applying shell': { + invoke: { + src: 'shellAstMod', + id: 'shellAstMod', + input: ({ event }) => { + if (event.type !== 'Shell') return undefined + return event.data + }, + onDone: ['idle'], + onError: ['idle'], + }, + }, + + 'Applying Prompt-to-edit': { + invoke: { + src: 'submit-prompt-edit', + id: 'submit-prompt-edit', + + input: ({ event }) => { + if (event.type !== 'Prompt-to-edit' || !event.data) { + return { + prompt: '', + selection: { graphSelections: [], otherSelections: [] }, + } + } + return event.data + }, + + onDone: 'idle', + onError: 'idle', + }, + }, }, initial: 'idle', @@ -2186,7 +2672,7 @@ export function canRectangleOrCircleTool({ // This should not be returning false, and it should be caught // but we need to simulate old behavior to move on. if (err(node)) return false - return node.node?.declarations?.[0]?.init.type !== 'PipeExpression' + return node.node?.declaration.init.type !== 'PipeExpression' } /** If the sketch contains `close` or `circle` stdlib functions it must be closed */ @@ -2203,8 +2689,8 @@ export function isClosedSketch({ // This should not be returning false, and it should be caught // but we need to simulate old behavior to move on. if (err(node)) return false - if (node.node?.declarations?.[0]?.init.type !== 'PipeExpression') return false - return node.node.declarations[0].init.body.some( + if (node.node?.declaration?.init?.type !== 'PipeExpression') return false + return node.node.declaration.init.body.some( (node) => node.type === 'CallExpression' && (node.callee.name === 'close' || node.callee.name === 'circle') diff --git a/src/machines/homeMachine.ts b/src/machines/projectsMachine.ts similarity index 57% rename from src/machines/homeMachine.ts rename to src/machines/projectsMachine.ts index ca9a50e81..322e9c0f6 100644 --- a/src/machines/homeMachine.ts +++ b/src/machines/projectsMachine.ts @@ -1,8 +1,9 @@ import { assign, fromPromise, setup } from 'xstate' -import { HomeCommandSchema } from 'lib/commandBarConfigs/homeCommandConfig' +import { ProjectsCommandSchema } from 'lib/commandBarConfigs/projectsCommandConfig' import { Project } from 'lib/project' +import { isArray } from 'lib/utils' -export const homeMachine = setup({ +export const projectsMachine = setup({ types: { context: {} as { projects: Project[] @@ -11,15 +12,36 @@ export const homeMachine = setup({ }, events: {} as | { type: 'Read projects'; data: {} } - | { type: 'Open project'; data: HomeCommandSchema['Open project'] } - | { type: 'Rename project'; data: HomeCommandSchema['Rename project'] } - | { type: 'Create project'; data: HomeCommandSchema['Create project'] } - | { type: 'Delete project'; data: HomeCommandSchema['Delete project'] } + | { type: 'Open project'; data: ProjectsCommandSchema['Open project'] } + | { + type: 'Rename project' + data: ProjectsCommandSchema['Rename project'] + } + | { + type: 'Create project' + data: ProjectsCommandSchema['Create project'] + } + | { + type: 'Delete project' + data: ProjectsCommandSchema['Delete project'] + } | { type: 'navigate'; data: { name: string } } | { type: 'xstate.done.actor.read-projects' output: Project[] } + | { + type: 'xstate.done.actor.delete-project' + output: { message: string; name: string } + } + | { + type: 'xstate.done.actor.create-project' + output: { message: string; name: string } + } + | { + type: 'xstate.done.actor.rename-project' + output: { message: string; oldName: string; newName: string } + } | { type: 'assign'; data: { [key: string]: any } }, input: {} as { projects: Project[] @@ -30,16 +52,20 @@ export const homeMachine = setup({ actions: { setProjects: assign({ projects: ({ context, event }) => - 'output' in event ? event.output : context.projects, + 'output' in event && isArray(event.output) + ? event.output + : context.projects, }), toastSuccess: () => {}, toastError: () => {}, navigateToProject: () => {}, + navigateToProjectIfNeeded: () => {}, }, actors: { readProjects: fromPromise(() => Promise.resolve([] as Project[])), - createProject: fromPromise((_: { input: { name: string } }) => - Promise.resolve('') + createProject: fromPromise( + (_: { input: { name: string; projects: Project[] } }) => + Promise.resolve({ message: '' }) ), renameProject: fromPromise( (_: { @@ -48,28 +74,35 @@ export const homeMachine = setup({ newName: string defaultProjectName: string defaultDirectory: string + projects: Project[] } - }) => Promise.resolve('') + }) => + Promise.resolve({ + message: '', + oldName: '', + newName: '', + }) ), deleteProject: fromPromise( (_: { input: { defaultDirectory: string; name: string } }) => - Promise.resolve('') + Promise.resolve({ + message: '', + name: '', + }) ), }, guards: { 'Has at least 1 project': () => false, }, }).createMachine({ - /** @xstate-layout N4IgpgJg5mDOIC5QAkD2BbMACdBDAxgBYCWAdmAHTK6xampYAOATqgFZj4AusAxAMLMwuLthbtOXANoAGALqJQjVLGJdiqUopAAPRAHYAbPooAWABwBGUwE5zAJgeGArM-MAaEAE9EN0wGYKGX97GX1nGVNDS0MbfwBfeM80TBwCEnIqGiZWDm4+ACUwUlxU8TzpeW1lVXVNbT0EcJNg02d-fzt7fU77Tx8EQ0iKCPtnfUsjGRtLGXtE5IxsPCIySmpacsk+QWFRHIluWQUkEBq1DS1TxqN7ChjzOxtXf0t7a37EcwsRibH-ZzRezA8wLEApZbpNZZTa5ba8AAiYAANmB9lsjlVTuc6ldQDdDOYKP5bm0os5TDJDJ8mlEzPpzIZHA4bO9umCIWlVpkNgcKnwAPKMYp8yTHaoqC71a6IEmBUz6BkWZzWDq2Uw0qzOIJAwz+PXWfSmeZJcFLLkZSi7ERkKCi7i8CCaShkABuqAA1pR8EIRGAALQYyonJSS3ENRDA2wUeyvd6dPVhGw0-RhGOp8IA8xGFkc80rS0Ua3qUh2oO8MDMVjMCiMZEiABmqGY6AoPr2AaD4uxYcuEYQoQpQWNNjsMnMgLGKbT3TC7TcOfsNjzqQL0KKJXQtvtXEdzoobs9lCEm87cMxIbOvel+MQqtMQRmS5ks31sZpAUsZkcIX+cQZJIrpC3KUBupTbuWlbVrW9ZcE2LYUCepRnocwYSrUfYyggbzvBQ+jMq49imLYwTUt4iCft+5i-u0-7UfoQEWtCSKoiWZbnruTqZIeXoUBAKJoihFTdqGGE3rod7UdqsQTI8hiGAqrIauRA7RvYeoqhO1jtAqjFrpkLFohBHEVlWzYwY2zatvxrFCWKWKiVKeISdh4yBJE-jGs4fhhA4zg0kRNgxhplhaW0nn4XpUKZEUuAQMZqF8FxLqkO6vG+hAgYcbAIlXmJzmNERdy0RYNiKgpthxDSEU6q8MSTJYjWGFFIEULF8WljuSX7jxx7CJlQY5ZYl44pht4IP61gyPc8njt0lIuH51UKrVVITEyMy2C1hbtQl-KmdBdaWQhGVZYluWjeJjSTf402shMEyuEyljPAFL0UNmMiuN86lWHMiSmvQ-HwKcnL6WA6FOf2k3mESMRDA4RpUm4U4qf6gSEt0QIvvqfjOCaiyrtF6zZPQXWQ+GWFlUEsbmNMf1TV9NLeXDcqRIySnNaaYPEzC5M9vl-b+IyFCjupryPF9jKWP5Kks-cbMWLERHRNt0LFntkgU2NLk4dqsz43YsTK++Kk2C+MbTOOcxzOMrhqzFxTgZ1Qba1dd6BUE1jGsLMxxK9KlDNqm3tMLUQvqYlgO5QhlsTubsFXesTTUuPTfHExshDS0RftRftGgEnTZtHbX9Zr+QJ-2S4Y3qnmTC+4tMyp1EfeOnmeQqdOhyXQrFOXXCV1hCkmLDOnBJYvRRDSsyRzGjiKj0lKdAkANAA */ + /** @xstate-layout N4IgpgJg5mDOIC5QAkD2BbMACdBDAxgBYCWAdmAMS6yzFSkDaADALqKgAOqtALsaqXYgAHogAsAJgA0IAJ6IAjBIkA2AHQAOCUw0qNkjQE4xYjQF8zMtJhwES5NcmpZSqLBwBOqAFZh8PWAoAJTBcCHcvX39YZjYkEC5efkF40QQFFQBmAHY1Qwz9QwBWU0NMrRl5BGyxBTUVJlVM01rtBXNLEGtsPCIyMEdnVwifPwCKAGEPUJ5sT1H-WKFE4j4BITSMzMzNIsyJDSZMhSYmFWzKxAkTNSYxIuU9zOKT7IsrDB67fsHYEajxiEwv8xjFWMtuKtkhsrpJboZsioincFMdTIjLggVGJ1GImMVMg0JISjEV3l1PrY+g4nH95gDAiFSLgbPSxkt4is1ilQGlrhJ4YjkbU0RoMXJEIYkWoikV8hJinjdOdyd0qfYBrSQdFJtNcLNtTwOZxIdyYQh+YKkSjReKqqYBQoEQpsgiSi9MqrKb0Nb9DYEACJgAA2YANbMW4M5puhqVhAvxQptCnRKkxCleuw0Gm2+2aRVRXpsPp+Woj4wA8hwwKRDcaEjH1nGLXDE9aRSmxWmJVipWocmdsbL8kxC501SWHFMZmQoIaKBABAMyAA3VAAawG+D1swAtOX61zY7zENlEWoMkoatcdPoipjCWIZRIirozsPiYYi19qQNp-rZ3nMAPC8Dw1A4YN9QAM1QDx0DUbcZjAfdInZKMTSSJsT2qc9Lwka8lTvTFTB2WUMiyQwc3yPRv3VH4mRZQDywXJc1FXDcBmmZlMBQhYjXQhtMJ5ERT1wlQr0kQj7kxKiZTxM5s2zbQEVoycBgY9AmNQ-wKGA0DwMgngYLgtQuJZZCDwEo8sJEnD1Dwgjb2kntig0GUkWVfZDEMfFVO+Bwg1DPhSDnZjFwcdjNzUCAQzDCztP4uIMKhGy0jPezxPwySnPvHsTjlPIhyOHRsnwlM-N-NRArDLS+N0kDYIM6DYPgmKgvivjD0bYS+VbBF21RTs7UUUcimfRpXyYRF8LFCrfSBCBaoZFiItINcor1CBeIZLqhPNdKL0yxzs2cqoNDqdpSo0EoSoLOb6NCRaQv9FblzWjjTMe7bQQYBQksElKesUMRjFubRMllCHsm2a5MVldRDBfFpmj0IpxPuhwFqW0F6v0iDmpMzbvuiXbAfNFNQcaI5IaKaH9jETFsUMNRVDxOU5TxBULE6VwYvgeIJ38sAIT25td27KpdzG7yZeho5slHVmMc1IY3HLfnkrNZt2hOW5smRCQM2uhQHkZ6VtkRBFnmu0qFGVv11ZFsnm0kdN8QFJVjlUPZ9co+3-2C0KEqdrXsJMJ8ryc86iUyYiCvxFNzldb3jHtjTsf8EPj1ssQchZlR8jR5EmDRrIGZcuF7maF1aZtslx29IWqtiwPDSz1LxDxepnlOfYDghp03eyOpngzXuYdHNPHozgJ26B9IXR2cTvP0BVkSRXKqgLtyq8OfQcXOwlubMIA */ id: 'Home machine', initial: 'Reading projects', - context: { - projects: [], - defaultProjectName: '', - defaultDirectory: '', - }, + context: ({ input }) => ({ + ...input, + }), on: { assign: { @@ -110,7 +143,9 @@ export const homeMachine = setup({ }, 'Open project': { - target: 'Opening project', + target: 'Reading projects', + actions: 'navigateToProject', + reenter: true, }, }, }, @@ -119,20 +154,22 @@ export const homeMachine = setup({ invoke: { id: 'create-project', src: 'createProject', - input: ({ event }) => { + input: ({ event, context }) => { if (event.type !== 'Create project') { return { name: '', + projects: context.projects, } } return { name: event.data.name, + projects: context.projects, } }, onDone: [ { target: 'Reading projects', - actions: ['toastSuccess'], + actions: ['toastSuccess', 'navigateToProject'], }, ], onError: [ @@ -156,6 +193,7 @@ export const homeMachine = setup({ defaultDirectory: context.defaultDirectory, oldName: '', newName: '', + projects: context.projects, } } return { @@ -163,12 +201,13 @@ export const homeMachine = setup({ defaultDirectory: context.defaultDirectory, oldName: event.data.oldName, newName: event.data.newName, + projects: context.projects, } }, onDone: [ { target: '#Home machine.Reading projects', - actions: ['toastSuccess'], + actions: ['toastSuccess', 'navigateToProjectIfNeeded'], }, ], onError: [ @@ -199,7 +238,7 @@ export const homeMachine = setup({ }, onDone: [ { - actions: ['toastSuccess'], + actions: ['toastSuccess', 'navigateToProjectIfNeeded'], target: '#Home machine.Reading projects', }, ], @@ -233,9 +272,5 @@ export const homeMachine = setup({ ], }, }, - - 'Opening project': { - entry: ['navigateToProject'], - }, }, }) diff --git a/src/machines/settingsMachine.ts b/src/machines/settingsMachine.ts index 571aa606d..1c432c923 100644 --- a/src/machines/settingsMachine.ts +++ b/src/machines/settingsMachine.ts @@ -42,8 +42,6 @@ export const settingsMachine = setup({ setClientTheme: () => {}, 'Execute AST': () => {}, toastSuccess: () => {}, - setEngineEdges: () => {}, - setEngineScaleGridVisibility: () => {}, setClientSideSceneUnits: () => {}, persistSettings: () => {}, resetSettings: assign(({ context, event }) => { @@ -172,7 +170,7 @@ export const settingsMachine = setup({ 'set.modeling.highlightEdges': { target: 'persisting settings', - actions: ['setSettingAtLevel', 'toastSuccess', 'setEngineEdges'], + actions: ['setSettingAtLevel', 'toastSuccess', 'Execute AST'], }, 'Reset settings': { @@ -201,11 +199,7 @@ export const settingsMachine = setup({ 'set.modeling.showScaleGrid': { target: 'persisting settings', - actions: [ - 'setSettingAtLevel', - 'toastSuccess', - 'setEngineScaleGridVisibility', - ], + actions: ['setSettingAtLevel', 'toastSuccess', 'Execute AST'], }, }, }, diff --git a/src/main.ts b/src/main.ts index 93400b1ce..1750d8207 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,6 +1,5 @@ // Some of the following was taken from bits and pieces of the vite-typescript // template that ElectronJS provides. - import dotenv from 'dotenv' import { app, @@ -9,6 +8,8 @@ import { dialog, shell, nativeTheme, + desktopCapturer, + systemPreferences, } from 'electron' import path from 'path' import { Issuer } from 'openid-client' @@ -20,6 +21,9 @@ import minimist from 'minimist' import getCurrentProjectFile from 'lib/getCurrentProjectFile' import os from 'node:os' import { reportRejection } from 'lib/trap' +import argvFromYargs from './commandLineArgs' + +import * as packageJSON from '../package.json' let mainWindow: BrowserWindow | null = null @@ -44,11 +48,6 @@ process.env.VITE_KC_SITE_BASE_URL ??= 'https://zoo.dev' process.env.VITE_KC_SKIP_AUTH ??= 'false' process.env.VITE_KC_CONNECTION_TIMEOUT_MS ??= '15000' -// Handle creating/removing shortcuts on Windows when installing/uninstalling. -if (require('electron-squirrel-startup')) { - app.quit() -} - const ZOO_STUDIO_PROTOCOL = 'zoo-studio' /// Register our application to handle all "electron-fiddle://" protocols. @@ -66,23 +65,30 @@ if (process.defaultApp) { // Must be done before ready event. registerStartupListeners() -const createWindow = (filePath?: string): BrowserWindow => { - const newWindow = new BrowserWindow({ - autoHideMenuBar: true, - show: false, - width: 1800, - height: 1200, - webPreferences: { - nodeIntegration: false, // do not give the application implicit system access - contextIsolation: true, // expose system functions in preload - sandbox: false, // expose nodejs in preload - preload: path.join(__dirname, './preload.js'), - }, - icon: path.resolve(process.cwd(), 'assets', 'icon.png'), - frame: os.platform() !== 'darwin', - titleBarStyle: 'hiddenInset', - backgroundColor: nativeTheme.shouldUseDarkColors ? '#1C1C1C' : '#FCFCFC', - }) +const createWindow = (filePath?: string, reuse?: boolean): BrowserWindow => { + let newWindow + + if (reuse) { + newWindow = mainWindow + } + if (!newWindow) { + newWindow = new BrowserWindow({ + autoHideMenuBar: true, + show: false, + width: 1800, + height: 1200, + webPreferences: { + nodeIntegration: false, // do not give the application implicit system access + contextIsolation: true, // expose system functions in preload + sandbox: false, // expose nodejs in preload + preload: path.join(__dirname, './preload.js'), + }, + icon: path.resolve(process.cwd(), 'assets', 'icon.png'), + frame: os.platform() !== 'darwin', + titleBarStyle: 'hiddenInset', + backgroundColor: nativeTheme.shouldUseDarkColors ? '#1C1C1C' : '#FCFCFC', + }) + } // and load the index.html of the app. if (MAIN_WINDOW_VITE_DEV_SERVER_URL) { @@ -115,7 +121,9 @@ const createWindow = (filePath?: string): BrowserWindow => { // Open the DevTools. // mainWindow.webContents.openDevTools() - newWindow.show() + if (!reuse) { + if (!process.env.HEADLESS) newWindow.show() + } return newWindow } @@ -139,6 +147,25 @@ app.on('ready', (event, data) => { // There is just not enough code to warrant it and further abstracts everything // which is already quite abstracted +// @ts-ignore +// electron/electron.d.ts has done type = App, making declaration merging not +// possible :( +app.resizeWindow = async (width: number, height: number) => { + return mainWindow?.setSize(width, height) +} + +// @ts-ignore can't declaration merge with App +app.testProperty = {} + +ipcMain.handle('app.testProperty', (event, propertyName) => { + // @ts-ignore can't declaration merge with App + return app.testProperty[propertyName] +}) + +ipcMain.handle('app.resizeWindow', (event, data) => { + return mainWindow?.setSize(data[0], data[1]) +}) + ipcMain.handle('app.getPath', (event, data) => { return app.getPath(data) }) @@ -158,6 +185,48 @@ ipcMain.handle('shell.openExternal', (event, data) => { return shell.openExternal(data) }) +ipcMain.handle( + 'take.screenshot', + async (event, data: { width: number; height: number }) => { + /** + * Operation system access to getting screen sources, even though we are only use application windows + * Linux: Yes! + * Mac OS: This user consent was not required on macOS 10.13 High Sierra so this method will always return granted. macOS 10.14 Mojave or higher requires consent for microphone and camera access. macOS 10.15 Catalina or higher requires consent for screen access. + * Windows 10: has a global setting controlling microphone and camera access for all win32 applications. It will always return granted for screen and for all media types on older versions of Windows. + */ + let accessToScreenSources = true + + // Can we check for access and if so, is it granted + // Linux does not even have access to the function getMediaAccessStatus, not going to polyfill + if (systemPreferences && systemPreferences.getMediaAccessStatus) { + const accessString = systemPreferences.getMediaAccessStatus('screen') + accessToScreenSources = accessString === 'granted' ? true : false + } + + if (accessToScreenSources) { + const sources = await desktopCapturer.getSources({ + types: ['window'], + thumbnailSize: { width: data.width, height: data.height }, + }) + + for (const source of sources) { + // electron-builder uses the value of productName in package.json for the title of the application + if (source.name === packageJSON.productName) { + // @ts-ignore image/png is real. + return source.thumbnail.toDataURL('image/png') // The image to display the screenshot + } + } + } + + // Cannot take a native desktop screenshot, unable to access screens + return '' + } +) + +ipcMain.handle('argv.parser', (event, data) => { + return argvFromYargs +}) + ipcMain.handle('startDeviceFlow', async (_, host: string) => { // Do an OAuth 2.0 Device Authorization Grant dance to get a token. // We quiet ts because we are not using this in the standard way. @@ -252,6 +321,9 @@ export function getAutoUpdater(): AppUpdater { app.on('ready', () => { const autoUpdater = getAutoUpdater() + // TODO: we're getting `Error: Response ends without calling any handlers` with our setup, + // so at the moment this isn't worth enabling + autoUpdater.disableDifferentialDownload = true setTimeout(() => { autoUpdater.checkForUpdates().catch(reportRejection) }, 1000) diff --git a/src/preload.ts b/src/preload.ts index 5a3c6962e..6a0188004 100644 --- a/src/preload.ts +++ b/src/preload.ts @@ -7,9 +7,18 @@ import packageJson from '../package.json' import { MachinesListing } from 'components/MachineManagerProvider' import chokidar from 'chokidar' +const resizeWindow = (width: number, height: number) => + ipcRenderer.invoke('app.resizeWindow', [width, height]) const open = (args: any) => ipcRenderer.invoke('dialog.showOpenDialog', args) const save = (args: any) => ipcRenderer.invoke('dialog.showSaveDialog', args) const openExternal = (url: any) => ipcRenderer.invoke('shell.openExternal', url) +const takeElectronWindowScreenshot = ({ + width, + height, +}: { + width: number + height: number +}) => ipcRenderer.invoke('take.screenshot', { width, height }) const showInFolder = (path: string) => ipcRenderer.invoke('shell.showItemInFolder', path) const startDeviceFlow = (host: string): Promise => @@ -18,13 +27,19 @@ const loginWithDeviceFlow = (): Promise => ipcRenderer.invoke('loginWithDeviceFlow') const onUpdateDownloaded = ( callback: (value: { version: string; releaseNotes: string }) => void -) => ipcRenderer.on('update-downloaded', (_event, value) => callback(value)) +) => + ipcRenderer.on('update-downloaded', (_event: any, value) => callback(value)) const onUpdateDownloadStart = ( callback: (value: { version: string }) => void -) => ipcRenderer.on('update-download-start', (_event, value) => callback(value)) +) => + ipcRenderer.on('update-download-start', (_event: any, value) => + callback(value) + ) const onUpdateError = (callback: (value: Error) => void) => - ipcRenderer.on('update-error', (_event, value) => callback(value)) + ipcRenderer.on('update-error', (_event: any, value) => callback(value)) const appRestart = () => ipcRenderer.invoke('app.restart') +const getAppTestProperty = (propertyName: string) => + ipcRenderer.invoke('app.testProperty', propertyName) const isMac = os.platform() === 'darwin' const isWindows = os.platform() === 'win32' @@ -117,6 +132,10 @@ const listMachines = async ( const getMachineApiIp = async (): Promise => ipcRenderer.invoke('find_machine_api') +const getArgvParsed = () => { + return ipcRenderer.invoke('argv.parser') +} + contextBridge.exposeInMainWorld('electron', { startDeviceFlow, loginWithDeviceFlow, @@ -148,19 +167,21 @@ contextBridge.exposeInMainWorld('electron', { version: process.version, join: path.join, sep: path.sep, + takeElectronWindowScreenshot, os: { isMac, isWindows, isLinux, }, + // Use this to access dynamic properties from the node side. + // INTENDED ONLY TO BE USED FOR TESTS. + getAppTestProperty, process: { - // Setter/getter has to be created because - // these are read-only over the boundary. + // These are read-only over the boundary. env: Object.assign( {}, exposeProcessEnvs([ 'NODE_ENV', - 'TEST_SETTINGS_FILE_KEY', 'VITE_KC_API_WS_MODELING_URL', 'VITE_KC_API_BASE_URL', 'VITE_KC_SITE_BASE_URL', @@ -184,4 +205,6 @@ contextBridge.exposeInMainWorld('electron', { onUpdateDownloaded, onUpdateError, appRestart, + getArgvParsed, + resizeWindow, }) diff --git a/src/routes/Home.tsx b/src/routes/Home.tsx index 0a5331fd7..3c4839637 100644 --- a/src/routes/Home.tsx +++ b/src/routes/Home.tsx @@ -1,63 +1,48 @@ import { FormEvent, useEffect, useRef, useState } from 'react' -import { - getNextProjectIndex, - interpolateProjectNameWithIndex, - doesProjectNameNeedInterpolated, -} from 'lib/desktopFS' import { ActionButton } from 'components/ActionButton' -import { toast } from 'react-hot-toast' import { AppHeader } from 'components/AppHeader' import ProjectCard from 'components/ProjectCard/ProjectCard' import { useNavigate, useSearchParams } from 'react-router-dom' import { Link } from 'react-router-dom' +import { toast } from 'react-hot-toast' import Loading from 'components/Loading' -import { useMachine } from '@xstate/react' -import { homeMachine } from '../machines/homeMachine' -import { fromPromise } from 'xstate' import { PATHS } from 'lib/paths' import { getNextSearchParams, getSortFunction, getSortIcon, } from '../lib/sorting' -import useStateMachineCommands from '../hooks/useStateMachineCommands' import { useSettingsAuthContext } from 'hooks/useSettingsAuthContext' -import { useCommandsContext } from 'hooks/useCommandsContext' -import { homeCommandBarConfig } from 'lib/commandBarConfigs/homeCommandConfig' import { useHotkeys } from 'react-hotkeys-hook' import { isDesktop } from 'lib/isDesktop' import { kclManager } from 'lib/singletons' -import { useLspContext } from 'components/LspProvider' import { useRefreshSettings } from 'hooks/useRefreshSettings' import { LowerRightControls } from 'components/LowerRightControls' -import { - createNewProjectDirectory, - listProjects, - renameProjectDirectory, -} from 'lib/desktop' import { ProjectSearchBar, useProjectSearch } from 'components/ProjectSearchBar' import { Project } from 'lib/project' +import { markOnce } from 'lib/performance' import { useFileSystemWatcher } from 'hooks/useFileSystemWatcher' import { useProjectsLoader } from 'hooks/useProjectsLoader' +import { useProjectsContext } from 'hooks/useProjectsContext' +import { useCommandsContext } from 'hooks/useCommandsContext' // This route only opens in the desktop context for now, // as defined in Router.tsx, so we can use the desktop APIs and types. const Home = () => { + const { state, send } = useProjectsContext() + const { commandBarSend } = useCommandsContext() const [projectsLoaderTrigger, setProjectsLoaderTrigger] = useState(0) - const { projectPaths, projectsDir } = useProjectsLoader([ - projectsLoaderTrigger, - ]) + const { projectsDir } = useProjectsLoader([projectsLoaderTrigger]) useRefreshSettings(PATHS.HOME + 'SETTINGS') - const { commandBarSend } = useCommandsContext() const navigate = useNavigate() const { settings: { context: settings }, } = useSettingsAuthContext() - const { onProjectOpen } = useLspContext() // Cancel all KCL executions while on the home page useEffect(() => { + markOnce('code/didLoadHome') kclManager.cancelAllExecutions() }, []) @@ -73,107 +58,6 @@ const Home = () => { ) const ref = useRef(null) - const [state, send, actor] = useMachine( - homeMachine.provide({ - actions: { - navigateToProject: ({ context, event }) => { - if ('data' in event && event.data && 'name' in event.data) { - let projectPath = - context.defaultDirectory + - window.electron.path.sep + - event.data.name - onProjectOpen( - { - name: event.data.name, - path: projectPath, - }, - null - ) - commandBarSend({ type: 'Close' }) - navigate(`${PATHS.FILE}/${encodeURIComponent(projectPath)}`) - } - }, - toastSuccess: ({ event }) => - toast.success( - ('data' in event && typeof event.data === 'string' && event.data) || - ('output' in event && - typeof event.output === 'string' && - event.output) || - '' - ), - toastError: ({ event }) => - toast.error( - ('data' in event && typeof event.data === 'string' && event.data) || - ('output' in event && - typeof event.output === 'string' && - event.output) || - '' - ), - }, - actors: { - readProjects: fromPromise(() => listProjects()), - createProject: fromPromise(async ({ input }) => { - let name = ( - input && 'name' in input && input.name - ? input.name - : settings.projects.defaultProjectName.current - ).trim() - - if (doesProjectNameNeedInterpolated(name)) { - const nextIndex = getNextProjectIndex(name, projects) - name = interpolateProjectNameWithIndex(name, nextIndex) - } - - await createNewProjectDirectory(name) - - return `Successfully created "${name}"` - }), - renameProject: fromPromise(async ({ input }) => { - const { oldName, newName, defaultProjectName, defaultDirectory } = - input - let name = newName ? newName : defaultProjectName - if (doesProjectNameNeedInterpolated(name)) { - const nextIndex = await getNextProjectIndex(name, projects) - name = interpolateProjectNameWithIndex(name, nextIndex) - } - - await renameProjectDirectory( - window.electron.path.join(defaultDirectory, oldName), - name - ) - return `Successfully renamed "${oldName}" to "${name}"` - }), - deleteProject: fromPromise(async ({ input }) => { - await window.electron.rm( - window.electron.path.join(input.defaultDirectory, input.name), - { - recursive: true, - } - ) - return `Successfully deleted "${input.name}"` - }), - }, - guards: { - 'Has at least 1 project': ({ event }) => { - if (event.type !== 'xstate.done.actor.read-projects') return false - console.log(`from has at least 1 project: ${event.output.length}`) - return event.output.length ? event.output.length >= 1 : false - }, - }, - }), - { - input: { - projects: projectPaths, - defaultProjectName: settings.projects.defaultProjectName.current, - defaultDirectory: settings.app.projectDirectory.current, - }, - } - ) - - useEffect(() => { - send({ type: 'Read projects', data: {} }) - }, [projectPaths]) - // Re-read projects listing if the projectDir has any updates. useFileSystemWatcher( async () => { @@ -182,21 +66,13 @@ const Home = () => { projectsDir ? [projectsDir] : [] ) - const { projects } = state.context + const projects = state?.context.projects ?? [] const [searchParams, setSearchParams] = useSearchParams() const { searchResults, query, setQuery } = useProjectSearch(projects) const sort = searchParams.get('sort_by') ?? 'modified:desc' const isSortByModified = sort?.includes('modified') || !sort || sort === null - useStateMachineCommands({ - machineId: 'home', - send, - state, - commandBarConfig: homeCommandBarConfig, - actor, - }) - // Update the default project name and directory in the home machine // when the settings change useEffect(() => { @@ -221,6 +97,11 @@ const Home = () => { new FormData(e.target as HTMLFormElement) ) + if (typeof newProjectName === 'string' && newProjectName.startsWith('.')) { + toast.error('Project names cannot start with a dot (.)') + return + } + if (newProjectName !== project.name) { send({ type: 'Rename project', @@ -247,7 +128,16 @@ const Home = () => { - send({ type: 'Create project', data: { name: '' } }) + commandBarSend({ + type: 'Find and select command', + data: { + groupId: 'projects', + name: 'Create project', + argDefaultValues: { + name: settings.projects.defaultProjectName.current, + }, + }, + }) } className="group !bg-primary !text-chalkboard-10 !border-primary hover:shadow-inner hover:hue-rotate-15" iconStart={{ @@ -326,7 +216,7 @@ const Home = () => { data-testid="home-section" className="flex-1 overflow-y-auto pr-2 pb-24" > - {state.matches('Reading projects') ? ( + {state?.matches('Reading projects') ? ( Loading your Projects... ) : ( <> diff --git a/src/routes/Onboarding/Introduction.tsx b/src/routes/Onboarding/Introduction.tsx index 8270fc78d..9dac8f05c 100644 --- a/src/routes/Onboarding/Introduction.tsx +++ b/src/routes/Onboarding/Introduction.tsx @@ -3,7 +3,7 @@ import { onboardingPaths } from 'routes/Onboarding/paths' import { useSettingsAuthContext } from 'hooks/useSettingsAuthContext' import { Themes, getSystemTheme } from 'lib/theme' import { bracket } from 'lib/exampleKcl' -import { createAndOpenNewProject } from 'lib/desktopFS' +import { createAndOpenNewTutorialProject } from 'lib/desktopFS' import { isDesktop } from 'lib/isDesktop' import { useNavigate, useRouteLoaderData } from 'react-router-dom' import { codeManager, kclManager } from 'lib/singletons' @@ -63,7 +63,7 @@ function OnboardingWarningDesktop(props: OnboardingResetWarningProps) { fileContext.project.path || null, false ) - await createAndOpenNewProject({ onProjectOpen, navigate }) + await createAndOpenNewTutorialProject({ onProjectOpen, navigate }) props.setShouldShowWarning(false) } diff --git a/src/routes/Onboarding/paths.ts b/src/routes/Onboarding/paths.ts index 3c564c426..ec02a4534 100644 --- a/src/routes/Onboarding/paths.ts +++ b/src/routes/Onboarding/paths.ts @@ -1,4 +1,6 @@ -export const onboardingPaths = { +import { OnboardingStatus } from 'wasm-lib/kcl/bindings/OnboardingStatus' + +export const onboardingPaths: Record = { INDEX: '/', CAMERA: '/camera', STREAMING: '/streaming', diff --git a/src/routes/Settings.tsx b/src/routes/Settings.tsx index 3c3f853e0..cb1808cd9 100644 --- a/src/routes/Settings.tsx +++ b/src/routes/Settings.tsx @@ -26,6 +26,18 @@ export const APP_VERSION = window.electron.packageJson.version : 'main' +export const PACKAGE_NAME = isDesktop() + ? window.electron.packageJson.name + : 'zoo-modeling-app' + +export const IS_NIGHTLY = PACKAGE_NAME.indexOf('-nightly') > -1 + +export function getReleaseUrl(version: string = APP_VERSION) { + return `https://github.com/KittyCAD/modeling-app/releases/tag/${ + IS_NIGHTLY ? 'nightly-' : '' + }v${version}` +} + export const Settings = () => { const navigate = useNavigate() const [searchParams, setSearchParams] = useSearchParams() diff --git a/src/routes/Telemetry.tsx b/src/routes/Telemetry.tsx new file mode 100644 index 000000000..a5cd91b0d --- /dev/null +++ b/src/routes/Telemetry.tsx @@ -0,0 +1,72 @@ +import { useLocation, useNavigate } from 'react-router-dom' +import { useHotkeys } from 'react-hotkeys-hook' +import { PATHS } from 'lib/paths' +import { useDotDotSlash } from 'hooks/useDotDotSlash' +import { Fragment } from 'react' +import { Dialog, Transition } from '@headlessui/react' +import { CustomIcon } from 'components/CustomIcon' +import { TelemetryExplorer } from 'components/TelemetryExplorer' + +export const Telemetry = () => { + const navigate = useNavigate() + const close = () => navigate(location.pathname.replace(PATHS.TELEMETRY, '')) + const location = useLocation() + const dotDotSlash = useDotDotSlash() + useHotkeys('esc', () => navigate(dotDotSlash())) + return ( + + + + + + + + +
    +

    Telemetry

    +
    + +
    +
    +
    + +
    +
    +
    +
    +
    + ) +} diff --git a/src/wasm-lib/.config/insta.yaml b/src/wasm-lib/.config/insta.yaml new file mode 100644 index 000000000..24d8c60c6 --- /dev/null +++ b/src/wasm-lib/.config/insta.yaml @@ -0,0 +1,2 @@ +test: + runner: nextest diff --git a/src/wasm-lib/Cargo.lock b/src/wasm-lib/Cargo.lock index ce887a7e8..0d175108a 100644 --- a/src/wasm-lib/Cargo.lock +++ b/src/wasm-lib/Cargo.lock @@ -121,9 +121,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.91" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" dependencies = [ "backtrace", ] @@ -165,7 +165,7 @@ dependencies = [ "futures-sink", "log", "pin-project-lite", - "thiserror", + "thiserror 1.0.68", ] [[package]] @@ -176,7 +176,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -187,7 +187,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -204,7 +204,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -228,6 +228,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "backtrace-ext" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "537beee3be4a18fb023b570f80e3ae28003db9167a751266b259926e25539d50" +dependencies = [ + "backtrace", +] + [[package]] name = "base64" version = "0.13.1" @@ -307,7 +316,7 @@ dependencies = [ "bitvec", "chrono", "hex", - "indexmap 2.6.0", + "indexmap 2.7.0", "js-sys", "once_cell", "rand 0.8.5", @@ -392,9 +401,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ "android-tzdata", "iana-time-zone", @@ -434,9 +443,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.20" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" dependencies = [ "clap_builder", "clap_derive", @@ -444,9 +453,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.20" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" dependencies = [ "anstream", "anstyle", @@ -465,14 +474,14 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "colorchoice" @@ -656,7 +665,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -667,7 +676,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -703,29 +712,6 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" -[[package]] -name = "databake" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a04fbfbecca8f0679c8c06fef907594adcc3e2052e11163a6d30535a1a5604d" -dependencies = [ - "databake-derive", - "proc-macro2", - "quote", -] - -[[package]] -name = "databake-derive" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4078275de501a61ceb9e759d37bdd3d7210e654dbc167ac1a3678ef4435ed57b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", - "synstructure", -] - [[package]] name = "deranged" version = "0.3.11" @@ -737,7 +723,7 @@ dependencies = [ [[package]] name = "derive-docs" -version = "0.1.29" +version = "0.1.33" dependencies = [ "Inflector", "anyhow", @@ -751,7 +737,7 @@ dependencies = [ "rustfmt-wrapper", "serde", "serde_tokenstream", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -762,7 +748,23 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", +] + +[[package]] +name = "dhat" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98cd11d84628e233de0ce467de10b8633f4ddaecafadefc86e13b84b8739b827" +dependencies = [ + "backtrace", + "lazy_static", + "mintex", + "parking_lot 0.12.3", + "rustc-hash 1.1.0", + "serde", + "serde_json", + "thousands", ] [[package]] @@ -789,7 +791,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -827,7 +829,7 @@ checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -988,7 +990,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -1084,7 +1086,7 @@ dependencies = [ "inflections", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -1110,8 +1112,8 @@ dependencies = [ "fnv", "futures-core", "futures-sink", - "http 1.1.0", - "indexmap 2.6.0", + "http 1.2.0", + "indexmap 2.7.0", "slab", "tokio", "tokio-util", @@ -1130,16 +1132,17 @@ dependencies = [ [[package]] name = "handlebars" -version = "6.1.0" +version = "6.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce25b617d1375ef96eeb920ae717e3da34a02fc979fe632c75128350f9e1f74a" +checksum = "fd4ccde012831f9a071a637b0d4e31df31c0f6c525784b35ae76a9ac6bc1e315" dependencies = [ "log", + "num-order", "pest", "pest_derive", "serde", "serde_json", - "thiserror", + "thiserror 1.0.68", ] [[package]] @@ -1156,9 +1159,9 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] name = "heck" @@ -1212,9 +1215,9 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -1239,7 +1242,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.1.0", + "http 1.2.0", ] [[package]] @@ -1250,7 +1253,7 @@ checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "pin-project-lite", ] @@ -1300,7 +1303,7 @@ dependencies = [ "futures-channel", "futures-util", "h2", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "httparse", "itoa", @@ -1317,7 +1320,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", - "http 1.1.0", + "http 1.2.0", "hyper 1.4.1", "hyper-util", "rustls", @@ -1337,7 +1340,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "hyper 1.4.1", "pin-project-lite", @@ -1376,6 +1379,124 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -1384,19 +1505,30 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", ] [[package]] name = "image" -version = "0.25.3" +version = "0.25.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97eb9a8e0cd5b76afea91d7eecd5cf8338cd44ced04256cf1f800474b227c52" +checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" dependencies = [ "bytemuck", "byteorder-lite", @@ -1413,7 +1545,7 @@ dependencies = [ "image", "itertools 0.12.1", "rayon", - "thiserror", + "thiserror 1.0.68", ] [[package]] @@ -1429,12 +1561,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", - "hashbrown 0.15.0", + "hashbrown 0.15.2", "serde", ] @@ -1452,13 +1584,16 @@ checksum = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a" [[package]] name = "insta" -version = "1.40.0" +version = "1.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6593a41c7a73841868772495db7dc1e8ecab43bb5c0b6da2059246c4b506ab60" +checksum = "7e9ffc4d4892617c50a928c52b2961cb5174b6fc6ebf252b2fac9d21955c48b8" dependencies = [ "console", "lazy_static", "linked-hash-map", + "pest", + "pest_derive", + "regex", "serde", "similar", ] @@ -1492,6 +1627,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "is_ci" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" + [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -1533,16 +1674,17 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ + "once_cell", "wasm-bindgen", ] [[package]] name = "kcl-lib" -version = "0.2.23" +version = "0.2.29" dependencies = [ "anyhow", "approx 0.5.1", @@ -1555,18 +1697,19 @@ dependencies = [ "convert_case", "criterion", "dashmap 6.1.0", - "databake", "derive-docs", + "dhat", "expectorate", + "fnv", "form_urlencoded", "futures", "git_rev", "gltf-json", "handlebars", - "http 1.1.0", + "http 1.2.0", "iai", "image", - "indexmap 2.6.0", + "indexmap 2.7.0", "insta", "itertools 0.13.0", "js-sys", @@ -1574,18 +1717,21 @@ dependencies = [ "kittycad-modeling-cmds", "lazy_static", "measurements", + "miette", "mime_guess", "parse-display 0.9.1", "pretty_assertions", "pyo3", + "regex", "reqwest", + "rgba_simple", "ropey", "schemars", "serde", "serde_json", "sha2", "tabled", - "thiserror", + "thiserror 2.0.0", "tokio", "tokio-tungstenite", "toml", @@ -1599,25 +1745,14 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", + "web-time", "winnow", "zip", ] -[[package]] -name = "kcl-macros" -version = "0.1.0" -dependencies = [ - "databake", - "kcl-lib", - "pretty_assertions", - "proc-macro2", - "quote", - "syn 2.0.85", -] - [[package]] name = "kcl-test-server" -version = "0.1.15" +version = "0.1.19" dependencies = [ "anyhow", "hyper 0.14.30", @@ -1634,7 +1769,7 @@ version = "0.1.0" dependencies = [ "anyhow", "async-trait", - "indexmap 2.6.0", + "indexmap 2.7.0", "kcl-lib", "kittycad", "kittycad-modeling-cmds", @@ -1644,9 +1779,9 @@ dependencies = [ [[package]] name = "kittycad" -version = "0.3.25" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6359cc0a1bbccbcf78775eea17a033cf2aa89d3fe6a9784f8ce94e5f882c185" +checksum = "933cb5f77624386c87d296e3fd493daf50156d1cbfa03b9f333a6d4da2896369" dependencies = [ "anyhow", "async-trait", @@ -1658,7 +1793,7 @@ dependencies = [ "data-encoding", "format_serde_error", "futures", - "http 1.1.0", + "http 1.2.0", "itertools 0.13.0", "log", "mime_guess", @@ -1675,7 +1810,7 @@ dependencies = [ "serde_bytes", "serde_json", "serde_urlencoded", - "thiserror", + "thiserror 2.0.0", "tokio", "tracing", "url", @@ -1684,9 +1819,9 @@ dependencies = [ [[package]] name = "kittycad-modeling-cmds" -version = "0.2.71" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6d2160dcb0e5373b1242a760dbf17fb9c12de523c410c11b145381c852b377b" +checksum = "10a9cab4476455be70ea57643c31444068b056d091bd348cab6044c0d8ad7fcc" dependencies = [ "anyhow", "chrono", @@ -1694,7 +1829,7 @@ dependencies = [ "enum-iterator", "enum-iterator-derive", "euler", - "http 0.2.12", + "http 1.2.0", "kittycad-modeling-cmds-macros", "kittycad-unit-conversion-derive", "measurements", @@ -1716,7 +1851,7 @@ dependencies = [ "kittycad-modeling-cmds-macros-impl", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -1727,7 +1862,7 @@ checksum = "6607507a8a0e4273b943179f0a3ef8e90712308d1d3095246040c29cfdbf985b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -1772,6 +1907,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" + [[package]] name = "lock_api" version = "0.4.12" @@ -1843,6 +1984,37 @@ dependencies = [ "autocfg", ] +[[package]] +name = "miette" +version = "7.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4edc8853320c2a0dab800fbda86253c8938f6ea88510dc92c5f1ed20e794afc1" +dependencies = [ + "backtrace", + "backtrace-ext", + "cfg-if", + "miette-derive", + "owo-colors", + "supports-color", + "supports-hyperlinks", + "supports-unicode", + "terminal_size", + "textwrap", + "thiserror 1.0.68", + "unicode-width 0.1.14", +] + +[[package]] +name = "miette-derive" +version = "7.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf09caffaac8068c346b6df2a7fc27a177fd20b39421a39ce0a211bde679a6c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + [[package]] name = "mime" version = "0.3.17" @@ -1881,6 +2053,12 @@ version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e53debba6bda7a793e5f99b8dacf19e626084f525f7829104ba9898f367d85ff" +[[package]] +name = "mintex" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bec4598fddb13cc7b528819e697852653252b760f1228b7642679bf2ff2cd07" + [[package]] name = "mio" version = "1.0.2" @@ -1937,6 +2115,21 @@ dependencies = [ "num-traits 0.2.19", ] +[[package]] +name = "num-modular" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17bb261bf36fa7d83f4c294f834e91256769097b3cb505d44831e0a179ac647f" + +[[package]] +name = "num-order" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "537b596b97c40fcf8056d153049eb22f481c17ebce72a513ec9286e4986d1bb6" +dependencies = [ + "num-modular", +] + [[package]] name = "num-traits" version = "0.1.43" @@ -1999,7 +2192,7 @@ dependencies = [ "js-sys", "once_cell", "pin-project-lite", - "thiserror", + "thiserror 1.0.68", ] [[package]] @@ -2017,9 +2210,15 @@ dependencies = [ "opentelemetry", "percent-encoding", "rand 0.8.5", - "thiserror", + "thiserror 1.0.68", ] +[[package]] +name = "owo-colors" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb37767f6569cd834a413442455e0f066d0d522de8630436e2a1761d9726ba56" + [[package]] name = "papergrid" version = "0.11.0" @@ -2112,7 +2311,7 @@ dependencies = [ "regex", "regex-syntax 0.8.5", "structmeta", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -2126,7 +2325,7 @@ dependencies = [ "regex", "regex-syntax 0.8.5", "structmeta", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -2142,7 +2341,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdbef9d1d47087a895abd220ed25eb4ad973a5e26f6a4367b038c25e28dfc2d9" dependencies = [ "memchr", - "thiserror", + "thiserror 1.0.68", "ucd-trie", ] @@ -2166,7 +2365,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -2198,7 +2397,7 @@ dependencies = [ "serde", "serde_derive", "strum", - "thiserror", + "thiserror 1.0.68", ] [[package]] @@ -2224,7 +2423,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -2336,19 +2535,41 @@ dependencies = [ ] [[package]] -name = "proc-macro2" -version = "1.0.89" +name = "proc-macro-error-attr2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "proc-macro2" +version = "1.0.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" -version = "0.22.5" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d922163ba1f79c04bc49073ba7b32fd5a8d3b76a87c955921234b8e77333c51" +checksum = "f402062616ab18202ae8319da13fa4279883a2b8a9d9f83f20dbade813ce1884" dependencies = [ "cfg-if", "indoc", @@ -2364,9 +2585,9 @@ dependencies = [ [[package]] name = "pyo3-build-config" -version = "0.22.5" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc38c5feeb496c8321091edf3d63e9a6829eab4b863b4a6a65f26f3e9cc6b179" +checksum = "b14b5775b5ff446dd1056212d778012cbe8a0fbffd368029fd9e25b514479c38" dependencies = [ "once_cell", "target-lexicon", @@ -2374,9 +2595,9 @@ dependencies = [ [[package]] name = "pyo3-ffi" -version = "0.22.5" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94845622d88ae274d2729fcefc850e63d7a3ddff5e3ce11bd88486db9f1d357d" +checksum = "9ab5bcf04a2cdcbb50c7d6105de943f543f9ed92af55818fd17b660390fc8636" dependencies = [ "libc", "pyo3-build-config", @@ -2384,27 +2605,27 @@ dependencies = [ [[package]] name = "pyo3-macros" -version = "0.22.5" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e655aad15e09b94ffdb3ce3d217acf652e26bbc37697ef012f5e5e348c716e5e" +checksum = "0fd24d897903a9e6d80b968368a34e1525aeb719d568dba8b3d4bfa5dc67d453" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] name = "pyo3-macros-backend" -version = "0.22.5" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1e3f09eecd94618f60a455a23def79f79eba4dc561a97324bf9ac8c6df30ce" +checksum = "36c011a03ba1e50152b4b394b479826cad97e7a21eb52df179cd91ac411cbfbe" dependencies = [ "heck 0.5.0", "proc-macro2", "pyo3-build-config", "quote", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -2426,10 +2647,10 @@ dependencies = [ "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash", + "rustc-hash 2.0.0", "rustls", "socket2", - "thiserror", + "thiserror 1.0.68", "tokio", "tracing", ] @@ -2443,10 +2664,10 @@ dependencies = [ "bytes", "rand 0.8.5", "ring", - "rustc-hash", + "rustc-hash 2.0.0", "rustls", "slab", - "thiserror", + "thiserror 1.0.68", "tinyvec", "tracing", ] @@ -2466,9 +2687,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -2633,16 +2854,16 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.8" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ "base64 0.22.1", "bytes", "futures-core", "futures-util", "h2", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "http-body-util", "hyper 1.4.1", @@ -2679,47 +2900,48 @@ dependencies = [ [[package]] name = "reqwest-conditional-middleware" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1663d9d4fbb6e3900f91455d6d7833301c91ae3c7fc6e116fd7acd40e478a93" +checksum = "f67ad7fdf5c0a015763fcd164bee294b13fb7b6f89f1b55961d40f00c3e32d6b" dependencies = [ "async-trait", - "http 1.1.0", + "http 1.2.0", "reqwest", "reqwest-middleware", ] [[package]] name = "reqwest-middleware" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562ceb5a604d3f7c885a792d42c199fd8af239d0a51b2fa6a78aafa092452b04" +checksum = "d1ccd3b55e711f91a9885a2fa6fbbb2e39db1776420b062efc058c6410f7e5e3" dependencies = [ "anyhow", "async-trait", - "http 1.1.0", + "http 1.2.0", "reqwest", "serde", - "thiserror", + "thiserror 1.0.68", "tower-service", ] [[package]] name = "reqwest-retry" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a83df1aaec00176d0fabb65dea13f832d2a446ca99107afc17c5d2d4981221d0" +checksum = "29c73e4195a6bfbcb174b790d9b3407ab90646976c55de58a6515da25d851178" dependencies = [ "anyhow", "async-trait", "futures", "getrandom", - "http 1.1.0", + "http 1.2.0", "hyper 1.4.1", "parking_lot 0.11.2", "reqwest", "reqwest-middleware", "retry-policies", + "thiserror 1.0.68", "tokio", "tracing", "wasm-timer", @@ -2727,14 +2949,14 @@ dependencies = [ [[package]] name = "reqwest-tracing" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfdd9bfa64c72233d8dd99ab7883efcdefe9e16d46488ecb9228b71a2e2ceb45" +checksum = "ff82cf5730a1311fb9413b0bc2b8e743e0157cd73f010ab4ec374a923873b6a2" dependencies = [ "anyhow", "async-trait", "getrandom", - "http 1.1.0", + "http 1.2.0", "matchit", "opentelemetry", "reqwest", @@ -2752,6 +2974,12 @@ dependencies = [ "rand 0.8.5", ] +[[package]] +name = "rgba_simple" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6cd655523701785087f69900df39892fb7b9b0721aa67682f571c38c32ac58a" + [[package]] name = "ring" version = "0.17.8" @@ -2783,6 +3011,12 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc-hash" version = "2.0.0" @@ -2797,7 +3031,7 @@ checksum = "f1adc9dfed5cc999077978cc7163b9282c5751c8d39827c4ea8c8c220ca5a440" dependencies = [ "serde", "tempfile", - "thiserror", + "thiserror 1.0.68", "toml", "toolchain_find", ] @@ -2817,9 +3051,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.13" +version = "0.23.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" +checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" dependencies = [ "once_cell", "ring", @@ -2853,9 +3087,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e696e35370c65c9c541198af4543ccd580cf17fc25d8e05c5a242b202488c55" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" [[package]] name = "rustls-webpki" @@ -2909,6 +3143,7 @@ dependencies = [ "chrono", "dyn-clone", "indexmap 1.9.3", + "indexmap 2.7.0", "schemars_derive", "serde", "serde_json", @@ -2925,7 +3160,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -2965,9 +3200,9 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.213" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] @@ -2983,13 +3218,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.213" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -3000,16 +3235,16 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.135" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "2b0d7ba2887406110130a978386c4e1befb98c674b4fba677954e4db976630d9" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "itoa", "memchr", "ryu", @@ -3024,7 +3259,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -3045,7 +3280,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -3145,6 +3380,12 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +[[package]] +name = "smawk" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" + [[package]] name = "socket2" version = "0.5.7" @@ -3161,6 +3402,12 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "str_indices" version = "0.4.3" @@ -3182,7 +3429,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -3193,7 +3440,7 @@ checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -3215,7 +3462,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -3224,6 +3471,27 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "supports-color" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9829b314621dfc575df4e409e79f9d6a66a3bd707ab73f23cb4aa3a854ac854f" +dependencies = [ + "is_ci", +] + +[[package]] +name = "supports-hyperlinks" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c0a1e5168041f5f3ff68ff7d95dcb9c8749df29f6e7e89ada40dd4c9de404ee" + +[[package]] +name = "supports-unicode" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7401a30af6cb5818bb64852270bb722533397edcfc7344954a38f420819ece2" + [[package]] name = "syn" version = "1.0.109" @@ -3237,9 +3505,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.85" +version = "2.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" +checksum = "46f71c0377baf4ef1cc3e3402ded576dccc315800fbc62dfc7fe04b009773b4a" dependencies = [ "proc-macro2", "quote", @@ -3263,7 +3531,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -3325,25 +3593,72 @@ dependencies = [ ] [[package]] -name = "thiserror" -version = "1.0.65" +name = "terminal_size" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" +checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7" dependencies = [ - "thiserror-impl", + "rustix", + "windows-sys 0.48.0", +] + +[[package]] +name = "textwrap" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" +dependencies = [ + "smawk", + "unicode-linebreak", + "unicode-width 0.1.14", +] + +[[package]] +name = "thiserror" +version = "1.0.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" +dependencies = [ + "thiserror-impl 1.0.68", +] + +[[package]] +name = "thiserror" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15291287e9bff1bc6f9ff3409ed9af665bec7a5fc8ac079ea96be07bca0e2668" +dependencies = [ + "thiserror-impl 2.0.0", ] [[package]] name = "thiserror-impl" -version = "1.0.65" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" +checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", ] +[[package]] +name = "thiserror-impl" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22efd00f33f93fa62848a7cab956c3d38c8d43095efda1decfc2b3a5dc0b8972" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "thousands" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820" + [[package]] name = "thread_local" version = "1.1.8" @@ -3385,6 +3700,16 @@ dependencies = [ "time-core", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinytemplate" version = "1.2.1" @@ -3412,9 +3737,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.40.0" +version = "1.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" dependencies = [ "backtrace", "bytes", @@ -3437,7 +3762,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -3507,7 +3832,7 @@ version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_spanned", "toml_datetime", @@ -3579,7 +3904,7 @@ checksum = "84fd902d4e0b9a4b27f2f440108dc034e1758628a9b702f8ec61ad66355422fa" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -3607,7 +3932,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -3668,14 +3993,15 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "ts-rs" -version = "10.0.0" +version = "10.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a2f31991cee3dce1ca4f929a8a04fdd11fd8801aac0f2030b0fa8a0a3fef6b9" +checksum = "e640d9b0964e9d39df633548591090ab92f7a4567bc31d3891af23471a3365c6" dependencies = [ "chrono", + "indexmap 2.7.0", "lazy_static", "serde_json", - "thiserror", + "thiserror 2.0.0", "ts-rs-macros", "url", "uuid", @@ -3683,13 +4009,13 @@ dependencies = [ [[package]] name = "ts-rs-macros" -version = "10.0.0" +version = "10.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea0b99e8ec44abd6f94a18f28f7934437809dd062820797c52401298116f70e" +checksum = "0e9d8656589772eeec2cf7a8264d9cda40fb28b9bc53118ceb9e8c07f8f38730" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", "termcolor", ] @@ -3702,14 +4028,14 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http 1.1.0", + "http 1.2.0", "httparse", "log", "rand 0.8.5", "rustls", "rustls-pki-types", "sha1", - "thiserror", + "thiserror 1.0.68", "utf-8", ] @@ -3746,12 +4072,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - [[package]] name = "unicode-ident" version = "1.0.13" @@ -3759,13 +4079,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] -name = "unicode-normalization" -version = "0.1.24" +name = "unicode-linebreak" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" [[package]] name = "unicode-segmentation" @@ -3799,9 +4116,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", @@ -3821,6 +4138,18 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -3840,9 +4169,9 @@ dependencies = [ [[package]] name = "validator" -version = "0.18.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db79c75af171630a3148bd3e6d7c4f42b6a9a014c2945bc5ed0020cbb8d9478e" +checksum = "d0b4a29d8709210980a09379f27ee31549b73292c87ab9899beee1c0d3be6303" dependencies = [ "idna", "once_cell", @@ -3856,16 +4185,16 @@ dependencies = [ [[package]] name = "validator_derive" -version = "0.18.2" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0bcf92720c40105ac4b2dda2a4ea3aa717d4d6a862cc217da653a4bd5c6b10" +checksum = "bac855a2ce6f843beb229757e6e570a42e837bcb15e5f449dd48d5747d41bf77" dependencies = [ "darling", "once_cell", - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", ] [[package]] @@ -3907,9 +4236,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if", "once_cell", @@ -3918,37 +4247,37 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.44" +version = "0.4.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65471f79c1022ffa5291d33520cbbb53b7687b01c2f8e83b57d102eed7ed479d" +checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" dependencies = [ "cfg-if", "futures-core", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3956,22 +4285,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "wasm-lib" @@ -3988,6 +4317,7 @@ dependencies = [ "kcl-lib", "kittycad", "kittycad-modeling-cmds", + "lazy_static", "pretty_assertions", "reqwest", "serde_json", @@ -4004,9 +4334,9 @@ dependencies = [ [[package]] name = "wasm-streams" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" dependencies = [ "futures-util", "js-sys", @@ -4032,9 +4362,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" dependencies = [ "js-sys", "wasm-bindgen", @@ -4279,13 +4609,25 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.20" +version = "0.6.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +checksum = "39281189af81c07ec09db316b302a3e67bf9bd7cbf6c820b50e35fee9c2fa980" dependencies = [ "memchr", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "wyz" version = "0.5.1" @@ -4310,6 +4652,30 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" +[[package]] +name = "yoke" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -4328,7 +4694,28 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.95", +] + +[[package]] +name = "zerofrom" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", + "synstructure", ] [[package]] @@ -4338,16 +4725,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" [[package]] -name = "zip" -version = "2.2.0" +name = "zerovec" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc5e4288ea4057ae23afc69a4472434a87a2495cafce6632fd1c4ec9f5cf3494" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "zip" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae9c1ea7b3a5e1f4b922ff856a129881167511563dc219869afe3787fc0c1a45" dependencies = [ "arbitrary", "crc32fast", "crossbeam-utils", "displaydoc", - "indexmap 2.6.0", + "indexmap 2.7.0", "memchr", - "thiserror", + "thiserror 2.0.0", ] diff --git a/src/wasm-lib/Cargo.toml b/src/wasm-lib/Cargo.toml index dff8ef70e..a0079a65e 100644 --- a/src/wasm-lib/Cargo.toml +++ b/src/wasm-lib/Cargo.toml @@ -15,21 +15,22 @@ data-encoding = "2.6.0" gloo-utils = "0.2.0" kcl-lib = { path = "kcl" } kittycad.workspace = true -serde_json = "1.0.128" -tokio = { version = "1.40.0", features = ["sync"] } +lazy_static = "1.5.0" +serde_json = "1.0.135" +tokio = { version = "1.41.1", features = ["sync"] } toml = "0.8.19" uuid = { version = "1.11.0", features = ["v4", "js", "serde"] } -wasm-bindgen = "0.2.91" -wasm-bindgen-futures = "0.4.44" +wasm-bindgen = "0.2.99" +wasm-bindgen-futures = "0.4.49" [dev-dependencies] anyhow = "1" -image = { version = "0.25.3", default-features = false, features = ["png"] } +image = { version = "0.25.5", default-features = false, features = ["png"] } kittycad = { workspace = true, default-features = true } kittycad-modeling-cmds = { workspace = true } pretty_assertions = "1.4.1" reqwest = { version = "0.12", default-features = false } -tokio = { version = "1.40.0", features = ["rt-multi-thread", "macros", "time"] } +tokio = { version = "1.41.1", features = ["rt-multi-thread", "macros", "time"] } twenty-twenty = "0.8" uuid = { version = "1.11.0", features = ["v4", "js", "serde"] } @@ -39,10 +40,10 @@ futures = "0.3.31" js-sys = "0.3.72" tower-lsp = { version = "0.20.0", default-features = false, features = ["runtime-agnostic"] } wasm-bindgen-futures = { version = "0.4.44", features = ["futures-core-03-stream"] } -wasm-streams = "0.4.1" +wasm-streams = "0.4.2" [target.'cfg(target_arch = "wasm32")'.dependencies.web-sys] -version = "0.3.72" +version = "0.3.76" features = [ "console", "HtmlTextAreaElement", @@ -57,6 +58,10 @@ debug = true [profile.dev] debug = 0 +[profile.dev.package] +insta.opt-level = 3 +similar.opt-level = 3 + [profile.test] debug = "line-tables-only" @@ -64,15 +69,20 @@ debug = "line-tables-only" members = [ "derive-docs", "kcl", - "kcl-macros", "kcl-test-server", "kcl-to-core", ] [workspace.dependencies] http = "1" -kittycad = { version = "0.3.25", default-features = false, features = ["js", "requests"] } -kittycad-modeling-cmds = { version = "0.2.71", features = ["websocket"] } +kittycad = { version = "0.3.28", default-features = false, features = ["js", "requests"] } +kittycad-modeling-cmds = { version = "0.2.79", features = ["websocket"] } + +[workspace.lints.clippy] +assertions_on_result_states = "warn" +dbg_macro = "warn" +iter_over_hash_type = "warn" +lossy_float_literal = "warn" [[test]] name = "executor" diff --git a/src/wasm-lib/derive-docs/Cargo.toml b/src/wasm-lib/derive-docs/Cargo.toml index c84f4bf37..95bae51e0 100644 --- a/src/wasm-lib/derive-docs/Cargo.toml +++ b/src/wasm-lib/derive-docs/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "derive-docs" description = "A tool for generating documentation from Rust derive macros" -version = "0.1.29" +version = "0.1.33" edition = "2021" license = "MIT" repository = "https://github.com/KittyCAD/modeling-app" @@ -18,12 +18,15 @@ once_cell = "1.20.2" proc-macro2 = "1" quote = "1" regex = "1.11" -serde = { version = "1.0.213", features = ["derive"] } +serde = { version = "1.0.217", features = ["derive"] } serde_tokenstream = "0.2" -syn = { version = "2.0.85", features = ["full"] } +syn = { version = "2.0.95", features = ["full"] } [dev-dependencies] -anyhow = "1.0.91" +anyhow = "1.0.95" expectorate = "1.1.0" pretty_assertions = "1.4.1" rustfmt-wrapper = "0.2.1" + +[lints] +workspace = true diff --git a/src/wasm-lib/derive-docs/src/lib.rs b/src/wasm-lib/derive-docs/src/lib.rs index 8281ed24b..84f28badb 100644 --- a/src/wasm-lib/derive-docs/src/lib.rs +++ b/src/wasm-lib/derive-docs/src/lib.rs @@ -6,6 +6,8 @@ mod tests; mod unbox; +use std::collections::HashMap; + use convert_case::Casing; use inflector::Inflector; use once_cell::sync::Lazy; @@ -23,17 +25,40 @@ use unbox::unbox; struct StdlibMetadata { /// The name of the function in the API. name: String, + /// Tags for the function. #[serde(default)] tags: Vec, + /// Whether the function is unpublished. /// Then docs will not be generated. #[serde(default)] unpublished: bool, + /// Whether the function is deprecated. /// Then specific docs detailing that this is deprecated will be generated. #[serde(default)] deprecated: bool, + + /// Whether the function is displayed in the feature tree. + /// If true, calls to the function will be available for display. + /// If false, calls to the function will never be displayed. + #[serde(default)] + feature_tree_operation: bool, + + /// If true, expects keyword arguments. + /// If false, expects positional arguments. + #[serde(default)] + keywords: bool, + + /// If true, the first argument is unlabeled. + /// If false, all arguments require labels. + #[serde(default)] + unlabeled_first: bool, + + /// Key = argument name, value = argument doc. + #[serde(default)] + arg_docs: HashMap, } #[proc_macro_attribute] @@ -115,14 +140,10 @@ fn do_stdlib_inner( let name = metadata.name; // Fail if the name is not camel case. - let whitelist = [ - "mirror2d", - "patternLinear3d", - "patternLinear2d", - "patternCircular3d", - "patternCircular2d", - ]; - if !name.is_camel_case() && !whitelist.contains(&name.as_str()) { + // Remove some known suffix exceptions first. + let name_cleaned = name.strip_suffix("2d").unwrap_or(name.as_str()); + let name_cleaned = name.strip_suffix("3d").unwrap_or(name_cleaned); + if !name_cleaned.is_camel_case() { errors.push(Error::new_spanned( &ast.sig.ident, format!("stdlib function names must be in camel case: `{}`", name), @@ -173,13 +194,11 @@ fn do_stdlib_inner( quote! { let code_blocks = vec![#(#cb),*]; code_blocks.iter().map(|cb| { - let tokens = crate::token::lexer(cb).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::Program::parse_no_errs(cb).unwrap(); - let mut options: crate::ast::types::FormatOptions = Default::default(); + let mut options: crate::parsing::ast::types::FormatOptions = Default::default(); options.insert_final_newline = false; - program.recast(&options, 0) + program.ast.recast(&options, 0) }).collect::>() } } else { @@ -231,6 +250,18 @@ fn do_stdlib_inner( quote! { false } }; + let feature_tree_operation = if metadata.feature_tree_operation { + quote! { true } + } else { + quote! { false } + }; + + let uses_keyword_arguments = if metadata.keywords { + quote! { true } + } else { + quote! { false } + }; + let docs_crate = get_crate(None); // When the user attaches this proc macro to a function with the wrong type @@ -239,7 +270,7 @@ fn do_stdlib_inner( // of the various parameters. We do this by calling dummy functions that // require a type that satisfies SharedExtractor or ExclusiveExtractor. let mut arg_types = Vec::new(); - for arg in ast.sig.inputs.iter() { + for (i, arg) in ast.sig.inputs.iter().enumerate() { // Get the name of the argument. let arg_name = match arg { syn::FnArg::Receiver(pat) => { @@ -269,7 +300,18 @@ fn do_stdlib_inner( let ty_string = rust_type_to_openapi_type(&ty_string); let required = !ty_ident.to_string().starts_with("Option <"); - + let description = if let Some(s) = metadata.arg_docs.get(&arg_name) { + quote! { #s } + } else if metadata.keywords && ty_string != "Args" && ty_string != "ExecState" { + errors.push(Error::new_spanned( + &arg, + "Argument was not documented in the arg_docs block", + )); + continue; + } else { + quote! { String::new() } + }; + let label_required = !(i == 0 && metadata.unlabeled_first); if ty_string != "ExecState" && ty_string != "Args" { let schema = quote! { generator.root_schema_for::<#ty_ident>() @@ -280,6 +322,8 @@ fn do_stdlib_inner( type_: #ty_string.to_string(), schema: #schema, required: #required, + label_required: #label_required, + description: #description.to_string(), } }); } @@ -340,6 +384,8 @@ fn do_stdlib_inner( type_: #ret_ty_string.to_string(), schema, required: true, + label_required: true, + description: String::new(), }) } } else { @@ -380,10 +426,10 @@ fn do_stdlib_inner( #const_struct fn #boxed_fn_name_ident( - exec_state: &mut crate::executor::ExecState, + exec_state: &mut crate::ExecState, args: crate::std::Args, ) -> std::pin::Pin< - Box> + Send + '_>, + Box> + Send + '_>, > { Box::pin(#fn_name_ident(exec_state, args)) } @@ -406,6 +452,10 @@ fn do_stdlib_inner( vec![#(#tags),*] } + fn keyword_arguments(&self) -> bool { + #uses_keyword_arguments + } + fn args(&self, inline_subschemas: bool) -> Vec<#docs_crate::StdLibFnArg> { let mut settings = schemars::gen::SchemaSettings::openapi3(); // We set this to false so we can recurse them later. @@ -432,6 +482,10 @@ fn do_stdlib_inner( #deprecated } + fn feature_tree_operation(&self) -> bool { + #feature_tree_operation + } + fn examples(&self) -> Vec { #code_blocks } @@ -725,6 +779,8 @@ fn rust_type_to_openapi_type(t: &str) -> String { if t == "f64" { return "number".to_string(); + } else if t == "u32" { + return "integer".to_string(); } else if t == "str" { return "string".to_string(); } else { @@ -749,28 +805,43 @@ fn generate_code_block_test(fn_name: &str, code_block: &str, index: usize) -> pr quote! { #[tokio::test(flavor = "multi_thread")] - async fn #test_name_mock() { - let tokens = crate::token::lexer(#code_block).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let id_generator = crate::executor::IdGenerator::default(); - let ctx = crate::executor::ExecutorContext { + async fn #test_name_mock() -> miette::Result<()> { + let program = crate::Program::parse_no_errs(#code_block).unwrap(); + let ctx = crate::ExecutorContext { engine: std::sync::Arc::new(Box::new(crate::engine::conn_mock::EngineConnection::new().await.unwrap())), fs: std::sync::Arc::new(crate::fs::FileManager::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()), settings: Default::default(), - context_type: crate::executor::ContextType::Mock, + context_type: crate::execution::ContextType::Mock, }; - ctx.run(&program, None, id_generator, None).await.unwrap(); + if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", #fn_name, #index), + kcl_source: #code_block.to_string(), + })); + } + Ok(()) } #[tokio::test(flavor = "multi_thread", worker_threads = 5)] - async fn #test_name() { + async fn #test_name() -> miette::Result<()> { let code = #code_block; // Note, `crate` must be kcl_lib - let result = crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm).await.unwrap(); + let result = match crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm, None).await { + Err(crate::errors::ExecError::Kcl(e)) => { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", #fn_name, #index), + kcl_source: #code_block.to_string(), + })); + } + Err(other_err)=> panic!("{}", other_err), + Ok(img) => img, + }; twenty_twenty::assert_image(&format!("tests/outputs/{}.png", #output_test_name_str), &result, 0.99); + Ok(()) } } } diff --git a/src/wasm-lib/derive-docs/src/tests.rs b/src/wasm-lib/derive-docs/src/tests.rs index a0485b2b6..2701b8514 100644 --- a/src/wasm-lib/derive-docs/src/tests.rs +++ b/src/wasm-lib/derive-docs/src/tests.rs @@ -116,6 +116,9 @@ fn test_stdlib_line_to() { let (item, errors) = do_stdlib( quote! { name = "lineTo", + arg_docs = { + sketch = "the sketch you're adding the line to" + } }, quote! { /// This is some function. diff --git a/src/wasm-lib/derive-docs/tests/args_with_lifetime.gen b/src/wasm-lib/derive-docs/tests/args_with_lifetime.gen index a826f845a..0428342cf 100644 --- a/src/wasm-lib/derive-docs/tests/args_with_lifetime.gen +++ b/src/wasm-lib/derive-docs/tests/args_with_lifetime.gen @@ -1,12 +1,9 @@ #[cfg(test)] mod test_examples_someFn { #[tokio::test(flavor = "multi_thread")] - async fn test_mock_example_someFn0() { - let tokens = crate::token::lexer("someFn()").unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let id_generator = crate::executor::IdGenerator::default(); - let ctx = crate::executor::ExecutorContext { + async fn test_mock_example_someFn0() -> miette::Result<()> { + let program = crate::Program::parse_no_errs("someFn()").unwrap(); + let ctx = crate::ExecutorContext { engine: std::sync::Arc::new(Box::new( crate::engine::conn_mock::EngineConnection::new() .await @@ -15,23 +12,45 @@ mod test_examples_someFn { fs: std::sync::Arc::new(crate::fs::FileManager::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()), settings: Default::default(), - context_type: crate::executor::ContextType::Mock, + context_type: crate::execution::ContextType::Mock, }; - ctx.run(&program, None, id_generator, None).await.unwrap(); + if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "someFn", 0usize), + kcl_source: "someFn()".to_string(), + })); + } + + Ok(()) } #[tokio::test(flavor = "multi_thread", worker_threads = 5)] - async fn kcl_test_example_someFn0() { + async fn kcl_test_example_someFn0() -> miette::Result<()> { let code = "someFn()"; - let result = - crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) - .await - .unwrap(); + let result = match crate::test_server::execute_and_snapshot( + code, + crate::settings::types::UnitLength::Mm, + None, + ) + .await + { + Err(crate::errors::ExecError::Kcl(e)) => { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "someFn", 0usize), + kcl_source: "someFn()".to_string(), + })); + } + Err(other_err) => panic!("{}", other_err), + Ok(img) => img, + }; twenty_twenty::assert_image( &format!("tests/outputs/{}.png", "serial_test_example_someFn0"), &result, 0.99, ); + Ok(()) } } @@ -45,12 +64,12 @@ pub(crate) struct SomeFn {} #[doc = "Std lib function: someFn\nDocs"] pub(crate) const SomeFn: SomeFn = SomeFn {}; fn boxed_someFn( - exec_state: &mut crate::executor::ExecState, + exec_state: &mut crate::ExecState, args: crate::std::Args, ) -> std::pin::Pin< Box< dyn std::future::Future< - Output = anyhow::Result, + Output = anyhow::Result, > + Send + '_, >, @@ -75,6 +94,10 @@ impl crate::docs::StdLibFn for SomeFn { vec![] } + fn keyword_arguments(&self) -> bool { + false + } + fn args(&self, inline_subschemas: bool) -> Vec { let mut settings = schemars::gen::SchemaSettings::openapi3(); settings.inline_subschemas = inline_subschemas; @@ -84,6 +107,8 @@ impl crate::docs::StdLibFn for SomeFn { type_: "Foo".to_string(), schema: generator.root_schema_for::(), required: true, + label_required: true, + description: String::new().to_string(), }] } @@ -97,6 +122,8 @@ impl crate::docs::StdLibFn for SomeFn { type_: "i32".to_string(), schema, required: true, + label_required: true, + description: String::new(), }) } @@ -108,17 +135,19 @@ impl crate::docs::StdLibFn for SomeFn { false } + fn feature_tree_operation(&self) -> bool { + false + } + fn examples(&self) -> Vec { let code_blocks = vec!["someFn()"]; code_blocks .iter() .map(|cb| { - let tokens = crate::token::lexer(cb).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let mut options: crate::ast::types::FormatOptions = Default::default(); + let program = crate::Program::parse_no_errs(cb).unwrap(); + let mut options: crate::parsing::ast::types::FormatOptions = Default::default(); options.insert_final_newline = false; - program.recast(&options, 0) + program.ast.recast(&options, 0) }) .collect::>() } diff --git a/src/wasm-lib/derive-docs/tests/args_with_refs.gen b/src/wasm-lib/derive-docs/tests/args_with_refs.gen index f75f6dff1..7e2a50b6f 100644 --- a/src/wasm-lib/derive-docs/tests/args_with_refs.gen +++ b/src/wasm-lib/derive-docs/tests/args_with_refs.gen @@ -1,12 +1,9 @@ #[cfg(test)] mod test_examples_someFn { #[tokio::test(flavor = "multi_thread")] - async fn test_mock_example_someFn0() { - let tokens = crate::token::lexer("someFn()").unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let id_generator = crate::executor::IdGenerator::default(); - let ctx = crate::executor::ExecutorContext { + async fn test_mock_example_someFn0() -> miette::Result<()> { + let program = crate::Program::parse_no_errs("someFn()").unwrap(); + let ctx = crate::ExecutorContext { engine: std::sync::Arc::new(Box::new( crate::engine::conn_mock::EngineConnection::new() .await @@ -15,23 +12,45 @@ mod test_examples_someFn { fs: std::sync::Arc::new(crate::fs::FileManager::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()), settings: Default::default(), - context_type: crate::executor::ContextType::Mock, + context_type: crate::execution::ContextType::Mock, }; - ctx.run(&program, None, id_generator, None).await.unwrap(); + if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "someFn", 0usize), + kcl_source: "someFn()".to_string(), + })); + } + + Ok(()) } #[tokio::test(flavor = "multi_thread", worker_threads = 5)] - async fn kcl_test_example_someFn0() { + async fn kcl_test_example_someFn0() -> miette::Result<()> { let code = "someFn()"; - let result = - crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) - .await - .unwrap(); + let result = match crate::test_server::execute_and_snapshot( + code, + crate::settings::types::UnitLength::Mm, + None, + ) + .await + { + Err(crate::errors::ExecError::Kcl(e)) => { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "someFn", 0usize), + kcl_source: "someFn()".to_string(), + })); + } + Err(other_err) => panic!("{}", other_err), + Ok(img) => img, + }; twenty_twenty::assert_image( &format!("tests/outputs/{}.png", "serial_test_example_someFn0"), &result, 0.99, ); + Ok(()) } } @@ -45,12 +64,12 @@ pub(crate) struct SomeFn {} #[doc = "Std lib function: someFn\nDocs"] pub(crate) const SomeFn: SomeFn = SomeFn {}; fn boxed_someFn( - exec_state: &mut crate::executor::ExecState, + exec_state: &mut crate::ExecState, args: crate::std::Args, ) -> std::pin::Pin< Box< dyn std::future::Future< - Output = anyhow::Result, + Output = anyhow::Result, > + Send + '_, >, @@ -75,6 +94,10 @@ impl crate::docs::StdLibFn for SomeFn { vec![] } + fn keyword_arguments(&self) -> bool { + false + } + fn args(&self, inline_subschemas: bool) -> Vec { let mut settings = schemars::gen::SchemaSettings::openapi3(); settings.inline_subschemas = inline_subschemas; @@ -84,6 +107,8 @@ impl crate::docs::StdLibFn for SomeFn { type_: "string".to_string(), schema: generator.root_schema_for::(), required: true, + label_required: true, + description: String::new().to_string(), }] } @@ -97,6 +122,8 @@ impl crate::docs::StdLibFn for SomeFn { type_: "i32".to_string(), schema, required: true, + label_required: true, + description: String::new(), }) } @@ -108,17 +135,19 @@ impl crate::docs::StdLibFn for SomeFn { false } + fn feature_tree_operation(&self) -> bool { + false + } + fn examples(&self) -> Vec { let code_blocks = vec!["someFn()"]; code_blocks .iter() .map(|cb| { - let tokens = crate::token::lexer(cb).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let mut options: crate::ast::types::FormatOptions = Default::default(); + let program = crate::Program::parse_no_errs(cb).unwrap(); + let mut options: crate::parsing::ast::types::FormatOptions = Default::default(); options.insert_final_newline = false; - program.recast(&options, 0) + program.ast.recast(&options, 0) }) .collect::>() } diff --git a/src/wasm-lib/derive-docs/tests/array.gen b/src/wasm-lib/derive-docs/tests/array.gen index d9dec25e8..7150e6d76 100644 --- a/src/wasm-lib/derive-docs/tests/array.gen +++ b/src/wasm-lib/derive-docs/tests/array.gen @@ -1,12 +1,10 @@ #[cfg(test)] mod test_examples_show { #[tokio::test(flavor = "multi_thread")] - async fn test_mock_example_show0() { - let tokens = crate::token::lexer("This is another code block.\nyes sirrr.\nshow").unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let id_generator = crate::executor::IdGenerator::default(); - let ctx = crate::executor::ExecutorContext { + async fn test_mock_example_show0() -> miette::Result<()> { + let program = + crate::Program::parse_no_errs("This is another code block.\nyes sirrr.\nshow").unwrap(); + let ctx = crate::ExecutorContext { engine: std::sync::Arc::new(Box::new( crate::engine::conn_mock::EngineConnection::new() .await @@ -15,32 +13,52 @@ mod test_examples_show { fs: std::sync::Arc::new(crate::fs::FileManager::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()), settings: Default::default(), - context_type: crate::executor::ContextType::Mock, + context_type: crate::execution::ContextType::Mock, }; - ctx.run(&program, None, id_generator, None).await.unwrap(); + if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "show", 0usize), + kcl_source: "This is another code block.\nyes sirrr.\nshow".to_string(), + })); + } + + Ok(()) } #[tokio::test(flavor = "multi_thread", worker_threads = 5)] - async fn kcl_test_example_show0() { + async fn kcl_test_example_show0() -> miette::Result<()> { let code = "This is another code block.\nyes sirrr.\nshow"; - let result = - crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) - .await - .unwrap(); + let result = match crate::test_server::execute_and_snapshot( + code, + crate::settings::types::UnitLength::Mm, + None, + ) + .await + { + Err(crate::errors::ExecError::Kcl(e)) => { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "show", 0usize), + kcl_source: "This is another code block.\nyes sirrr.\nshow".to_string(), + })); + } + Err(other_err) => panic!("{}", other_err), + Ok(img) => img, + }; twenty_twenty::assert_image( &format!("tests/outputs/{}.png", "serial_test_example_show0"), &result, 0.99, ); + Ok(()) } #[tokio::test(flavor = "multi_thread")] - async fn test_mock_example_show1() { - let tokens = crate::token::lexer("This is code.\nIt does other shit.\nshow").unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let id_generator = crate::executor::IdGenerator::default(); - let ctx = crate::executor::ExecutorContext { + async fn test_mock_example_show1() -> miette::Result<()> { + let program = + crate::Program::parse_no_errs("This is code.\nIt does other shit.\nshow").unwrap(); + let ctx = crate::ExecutorContext { engine: std::sync::Arc::new(Box::new( crate::engine::conn_mock::EngineConnection::new() .await @@ -49,23 +67,45 @@ mod test_examples_show { fs: std::sync::Arc::new(crate::fs::FileManager::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()), settings: Default::default(), - context_type: crate::executor::ContextType::Mock, + context_type: crate::execution::ContextType::Mock, }; - ctx.run(&program, None, id_generator, None).await.unwrap(); + if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "show", 1usize), + kcl_source: "This is code.\nIt does other shit.\nshow".to_string(), + })); + } + + Ok(()) } #[tokio::test(flavor = "multi_thread", worker_threads = 5)] - async fn kcl_test_example_show1() { + async fn kcl_test_example_show1() -> miette::Result<()> { let code = "This is code.\nIt does other shit.\nshow"; - let result = - crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) - .await - .unwrap(); + let result = match crate::test_server::execute_and_snapshot( + code, + crate::settings::types::UnitLength::Mm, + None, + ) + .await + { + Err(crate::errors::ExecError::Kcl(e)) => { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "show", 1usize), + kcl_source: "This is code.\nIt does other shit.\nshow".to_string(), + })); + } + Err(other_err) => panic!("{}", other_err), + Ok(img) => img, + }; twenty_twenty::assert_image( &format!("tests/outputs/{}.png", "serial_test_example_show1"), &result, 0.99, ); + Ok(()) } } @@ -79,12 +119,12 @@ pub(crate) struct Show {} #[doc = "Std lib function: show\nThis is some function.\nIt does shit."] pub(crate) const Show: Show = Show {}; fn boxed_show( - exec_state: &mut crate::executor::ExecState, + exec_state: &mut crate::ExecState, args: crate::std::Args, ) -> std::pin::Pin< Box< dyn std::future::Future< - Output = anyhow::Result, + Output = anyhow::Result, > + Send + '_, >, @@ -109,6 +149,10 @@ impl crate::docs::StdLibFn for Show { vec![] } + fn keyword_arguments(&self) -> bool { + false + } + fn args(&self, inline_subschemas: bool) -> Vec { let mut settings = schemars::gen::SchemaSettings::openapi3(); settings.inline_subschemas = inline_subschemas; @@ -118,6 +162,8 @@ impl crate::docs::StdLibFn for Show { type_: "[number]".to_string(), schema: generator.root_schema_for::<[f64; 2usize]>(), required: true, + label_required: true, + description: String::new().to_string(), }] } @@ -131,6 +177,8 @@ impl crate::docs::StdLibFn for Show { type_: "number".to_string(), schema, required: true, + label_required: true, + description: String::new(), }) } @@ -142,6 +190,10 @@ impl crate::docs::StdLibFn for Show { false } + fn feature_tree_operation(&self) -> bool { + false + } + fn examples(&self) -> Vec { let code_blocks = vec![ "This is another code block.\nyes sirrr.\nshow", @@ -150,12 +202,10 @@ impl crate::docs::StdLibFn for Show { code_blocks .iter() .map(|cb| { - let tokens = crate::token::lexer(cb).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let mut options: crate::ast::types::FormatOptions = Default::default(); + let program = crate::Program::parse_no_errs(cb).unwrap(); + let mut options: crate::parsing::ast::types::FormatOptions = Default::default(); options.insert_final_newline = false; - program.recast(&options, 0) + program.ast.recast(&options, 0) }) .collect::>() } diff --git a/src/wasm-lib/derive-docs/tests/box.gen b/src/wasm-lib/derive-docs/tests/box.gen index 1ec101210..e8f26f506 100644 --- a/src/wasm-lib/derive-docs/tests/box.gen +++ b/src/wasm-lib/derive-docs/tests/box.gen @@ -1,12 +1,10 @@ #[cfg(test)] mod test_examples_show { #[tokio::test(flavor = "multi_thread")] - async fn test_mock_example_show0() { - let tokens = crate::token::lexer("This is code.\nIt does other shit.\nshow").unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let id_generator = crate::executor::IdGenerator::default(); - let ctx = crate::executor::ExecutorContext { + async fn test_mock_example_show0() -> miette::Result<()> { + let program = + crate::Program::parse_no_errs("This is code.\nIt does other shit.\nshow").unwrap(); + let ctx = crate::ExecutorContext { engine: std::sync::Arc::new(Box::new( crate::engine::conn_mock::EngineConnection::new() .await @@ -15,23 +13,45 @@ mod test_examples_show { fs: std::sync::Arc::new(crate::fs::FileManager::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()), settings: Default::default(), - context_type: crate::executor::ContextType::Mock, + context_type: crate::execution::ContextType::Mock, }; - ctx.run(&program, None, id_generator, None).await.unwrap(); + if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "show", 0usize), + kcl_source: "This is code.\nIt does other shit.\nshow".to_string(), + })); + } + + Ok(()) } #[tokio::test(flavor = "multi_thread", worker_threads = 5)] - async fn kcl_test_example_show0() { + async fn kcl_test_example_show0() -> miette::Result<()> { let code = "This is code.\nIt does other shit.\nshow"; - let result = - crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) - .await - .unwrap(); + let result = match crate::test_server::execute_and_snapshot( + code, + crate::settings::types::UnitLength::Mm, + None, + ) + .await + { + Err(crate::errors::ExecError::Kcl(e)) => { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "show", 0usize), + kcl_source: "This is code.\nIt does other shit.\nshow".to_string(), + })); + } + Err(other_err) => panic!("{}", other_err), + Ok(img) => img, + }; twenty_twenty::assert_image( &format!("tests/outputs/{}.png", "serial_test_example_show0"), &result, 0.99, ); + Ok(()) } } @@ -45,12 +65,12 @@ pub(crate) struct Show {} #[doc = "Std lib function: show\nThis is some function.\nIt does shit."] pub(crate) const Show: Show = Show {}; fn boxed_show( - exec_state: &mut crate::executor::ExecState, + exec_state: &mut crate::ExecState, args: crate::std::Args, ) -> std::pin::Pin< Box< dyn std::future::Future< - Output = anyhow::Result, + Output = anyhow::Result, > + Send + '_, >, @@ -75,6 +95,10 @@ impl crate::docs::StdLibFn for Show { vec![] } + fn keyword_arguments(&self) -> bool { + false + } + fn args(&self, inline_subschemas: bool) -> Vec { let mut settings = schemars::gen::SchemaSettings::openapi3(); settings.inline_subschemas = inline_subschemas; @@ -84,6 +108,8 @@ impl crate::docs::StdLibFn for Show { type_: "number".to_string(), schema: generator.root_schema_for::(), required: true, + label_required: true, + description: String::new().to_string(), }] } @@ -97,6 +123,8 @@ impl crate::docs::StdLibFn for Show { type_: "number".to_string(), schema, required: true, + label_required: true, + description: String::new(), }) } @@ -108,17 +136,19 @@ impl crate::docs::StdLibFn for Show { false } + fn feature_tree_operation(&self) -> bool { + false + } + fn examples(&self) -> Vec { let code_blocks = vec!["This is code.\nIt does other shit.\nshow"]; code_blocks .iter() .map(|cb| { - let tokens = crate::token::lexer(cb).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let mut options: crate::ast::types::FormatOptions = Default::default(); + let program = crate::Program::parse_no_errs(cb).unwrap(); + let mut options: crate::parsing::ast::types::FormatOptions = Default::default(); options.insert_final_newline = false; - program.recast(&options, 0) + program.ast.recast(&options, 0) }) .collect::>() } diff --git a/src/wasm-lib/derive-docs/tests/doc_comment_with_code.gen b/src/wasm-lib/derive-docs/tests/doc_comment_with_code.gen index 03bf0f224..718564458 100644 --- a/src/wasm-lib/derive-docs/tests/doc_comment_with_code.gen +++ b/src/wasm-lib/derive-docs/tests/doc_comment_with_code.gen @@ -1,13 +1,11 @@ #[cfg(test)] mod test_examples_my_func { #[tokio::test(flavor = "multi_thread")] - async fn test_mock_example_my_func0() { - let tokens = - crate::token::lexer("This is another code block.\nyes sirrr.\nmyFunc").unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let id_generator = crate::executor::IdGenerator::default(); - let ctx = crate::executor::ExecutorContext { + async fn test_mock_example_my_func0() -> miette::Result<()> { + let program = + crate::Program::parse_no_errs("This is another code block.\nyes sirrr.\nmyFunc") + .unwrap(); + let ctx = crate::ExecutorContext { engine: std::sync::Arc::new(Box::new( crate::engine::conn_mock::EngineConnection::new() .await @@ -16,32 +14,52 @@ mod test_examples_my_func { fs: std::sync::Arc::new(crate::fs::FileManager::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()), settings: Default::default(), - context_type: crate::executor::ContextType::Mock, + context_type: crate::execution::ContextType::Mock, }; - ctx.run(&program, None, id_generator, None).await.unwrap(); + if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "my_func", 0usize), + kcl_source: "This is another code block.\nyes sirrr.\nmyFunc".to_string(), + })); + } + + Ok(()) } #[tokio::test(flavor = "multi_thread", worker_threads = 5)] - async fn kcl_test_example_my_func0() { + async fn kcl_test_example_my_func0() -> miette::Result<()> { let code = "This is another code block.\nyes sirrr.\nmyFunc"; - let result = - crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) - .await - .unwrap(); + let result = match crate::test_server::execute_and_snapshot( + code, + crate::settings::types::UnitLength::Mm, + None, + ) + .await + { + Err(crate::errors::ExecError::Kcl(e)) => { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "my_func", 0usize), + kcl_source: "This is another code block.\nyes sirrr.\nmyFunc".to_string(), + })); + } + Err(other_err) => panic!("{}", other_err), + Ok(img) => img, + }; twenty_twenty::assert_image( &format!("tests/outputs/{}.png", "serial_test_example_my_func0"), &result, 0.99, ); + Ok(()) } #[tokio::test(flavor = "multi_thread")] - async fn test_mock_example_my_func1() { - let tokens = crate::token::lexer("This is code.\nIt does other shit.\nmyFunc").unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let id_generator = crate::executor::IdGenerator::default(); - let ctx = crate::executor::ExecutorContext { + async fn test_mock_example_my_func1() -> miette::Result<()> { + let program = + crate::Program::parse_no_errs("This is code.\nIt does other shit.\nmyFunc").unwrap(); + let ctx = crate::ExecutorContext { engine: std::sync::Arc::new(Box::new( crate::engine::conn_mock::EngineConnection::new() .await @@ -50,23 +68,45 @@ mod test_examples_my_func { fs: std::sync::Arc::new(crate::fs::FileManager::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()), settings: Default::default(), - context_type: crate::executor::ContextType::Mock, + context_type: crate::execution::ContextType::Mock, }; - ctx.run(&program, None, id_generator, None).await.unwrap(); + if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "my_func", 1usize), + kcl_source: "This is code.\nIt does other shit.\nmyFunc".to_string(), + })); + } + + Ok(()) } #[tokio::test(flavor = "multi_thread", worker_threads = 5)] - async fn kcl_test_example_my_func1() { + async fn kcl_test_example_my_func1() -> miette::Result<()> { let code = "This is code.\nIt does other shit.\nmyFunc"; - let result = - crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) - .await - .unwrap(); + let result = match crate::test_server::execute_and_snapshot( + code, + crate::settings::types::UnitLength::Mm, + None, + ) + .await + { + Err(crate::errors::ExecError::Kcl(e)) => { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "my_func", 1usize), + kcl_source: "This is code.\nIt does other shit.\nmyFunc".to_string(), + })); + } + Err(other_err) => panic!("{}", other_err), + Ok(img) => img, + }; twenty_twenty::assert_image( &format!("tests/outputs/{}.png", "serial_test_example_my_func1"), &result, 0.99, ); + Ok(()) } } @@ -80,12 +120,12 @@ pub(crate) struct MyFunc {} #[doc = "Std lib function: myFunc\nThis is some function.\nIt does shit."] pub(crate) const MyFunc: MyFunc = MyFunc {}; fn boxed_my_func( - exec_state: &mut crate::executor::ExecState, + exec_state: &mut crate::ExecState, args: crate::std::Args, ) -> std::pin::Pin< Box< dyn std::future::Future< - Output = anyhow::Result, + Output = anyhow::Result, > + Send + '_, >, @@ -110,6 +150,10 @@ impl crate::docs::StdLibFn for MyFunc { vec![] } + fn keyword_arguments(&self) -> bool { + false + } + fn args(&self, inline_subschemas: bool) -> Vec { let mut settings = schemars::gen::SchemaSettings::openapi3(); settings.inline_subschemas = inline_subschemas; @@ -119,6 +163,8 @@ impl crate::docs::StdLibFn for MyFunc { type_: "kittycad::types::InputFormat".to_string(), schema: generator.root_schema_for::>(), required: false, + label_required: true, + description: String::new().to_string(), }] } @@ -132,6 +178,8 @@ impl crate::docs::StdLibFn for MyFunc { type_: "[Sketch]".to_string(), schema, required: true, + label_required: true, + description: String::new(), }) } @@ -143,6 +191,10 @@ impl crate::docs::StdLibFn for MyFunc { false } + fn feature_tree_operation(&self) -> bool { + false + } + fn examples(&self) -> Vec { let code_blocks = vec![ "This is another code block.\nyes sirrr.\nmyFunc", @@ -151,12 +203,10 @@ impl crate::docs::StdLibFn for MyFunc { code_blocks .iter() .map(|cb| { - let tokens = crate::token::lexer(cb).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let mut options: crate::ast::types::FormatOptions = Default::default(); + let program = crate::Program::parse_no_errs(cb).unwrap(); + let mut options: crate::parsing::ast::types::FormatOptions = Default::default(); options.insert_final_newline = false; - program.recast(&options, 0) + program.ast.recast(&options, 0) }) .collect::>() } diff --git a/src/wasm-lib/derive-docs/tests/lineTo.gen b/src/wasm-lib/derive-docs/tests/lineTo.gen index c699a8a49..57c0b2201 100644 --- a/src/wasm-lib/derive-docs/tests/lineTo.gen +++ b/src/wasm-lib/derive-docs/tests/lineTo.gen @@ -1,13 +1,11 @@ #[cfg(test)] mod test_examples_line_to { #[tokio::test(flavor = "multi_thread")] - async fn test_mock_example_line_to0() { - let tokens = - crate::token::lexer("This is another code block.\nyes sirrr.\nlineTo").unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let id_generator = crate::executor::IdGenerator::default(); - let ctx = crate::executor::ExecutorContext { + async fn test_mock_example_line_to0() -> miette::Result<()> { + let program = + crate::Program::parse_no_errs("This is another code block.\nyes sirrr.\nlineTo") + .unwrap(); + let ctx = crate::ExecutorContext { engine: std::sync::Arc::new(Box::new( crate::engine::conn_mock::EngineConnection::new() .await @@ -16,32 +14,52 @@ mod test_examples_line_to { fs: std::sync::Arc::new(crate::fs::FileManager::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()), settings: Default::default(), - context_type: crate::executor::ContextType::Mock, + context_type: crate::execution::ContextType::Mock, }; - ctx.run(&program, None, id_generator, None).await.unwrap(); + if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "line_to", 0usize), + kcl_source: "This is another code block.\nyes sirrr.\nlineTo".to_string(), + })); + } + + Ok(()) } #[tokio::test(flavor = "multi_thread", worker_threads = 5)] - async fn kcl_test_example_line_to0() { + async fn kcl_test_example_line_to0() -> miette::Result<()> { let code = "This is another code block.\nyes sirrr.\nlineTo"; - let result = - crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) - .await - .unwrap(); + let result = match crate::test_server::execute_and_snapshot( + code, + crate::settings::types::UnitLength::Mm, + None, + ) + .await + { + Err(crate::errors::ExecError::Kcl(e)) => { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "line_to", 0usize), + kcl_source: "This is another code block.\nyes sirrr.\nlineTo".to_string(), + })); + } + Err(other_err) => panic!("{}", other_err), + Ok(img) => img, + }; twenty_twenty::assert_image( &format!("tests/outputs/{}.png", "serial_test_example_line_to0"), &result, 0.99, ); + Ok(()) } #[tokio::test(flavor = "multi_thread")] - async fn test_mock_example_line_to1() { - let tokens = crate::token::lexer("This is code.\nIt does other shit.\nlineTo").unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let id_generator = crate::executor::IdGenerator::default(); - let ctx = crate::executor::ExecutorContext { + async fn test_mock_example_line_to1() -> miette::Result<()> { + let program = + crate::Program::parse_no_errs("This is code.\nIt does other shit.\nlineTo").unwrap(); + let ctx = crate::ExecutorContext { engine: std::sync::Arc::new(Box::new( crate::engine::conn_mock::EngineConnection::new() .await @@ -50,23 +68,45 @@ mod test_examples_line_to { fs: std::sync::Arc::new(crate::fs::FileManager::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()), settings: Default::default(), - context_type: crate::executor::ContextType::Mock, + context_type: crate::execution::ContextType::Mock, }; - ctx.run(&program, None, id_generator, None).await.unwrap(); + if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "line_to", 1usize), + kcl_source: "This is code.\nIt does other shit.\nlineTo".to_string(), + })); + } + + Ok(()) } #[tokio::test(flavor = "multi_thread", worker_threads = 5)] - async fn kcl_test_example_line_to1() { + async fn kcl_test_example_line_to1() -> miette::Result<()> { let code = "This is code.\nIt does other shit.\nlineTo"; - let result = - crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) - .await - .unwrap(); + let result = match crate::test_server::execute_and_snapshot( + code, + crate::settings::types::UnitLength::Mm, + None, + ) + .await + { + Err(crate::errors::ExecError::Kcl(e)) => { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "line_to", 1usize), + kcl_source: "This is code.\nIt does other shit.\nlineTo".to_string(), + })); + } + Err(other_err) => panic!("{}", other_err), + Ok(img) => img, + }; twenty_twenty::assert_image( &format!("tests/outputs/{}.png", "serial_test_example_line_to1"), &result, 0.99, ); + Ok(()) } } @@ -80,12 +120,12 @@ pub(crate) struct LineTo {} #[doc = "Std lib function: lineTo\nThis is some function.\nIt does shit."] pub(crate) const LineTo: LineTo = LineTo {}; fn boxed_line_to( - exec_state: &mut crate::executor::ExecState, + exec_state: &mut crate::ExecState, args: crate::std::Args, ) -> std::pin::Pin< Box< dyn std::future::Future< - Output = anyhow::Result, + Output = anyhow::Result, > + Send + '_, >, @@ -110,6 +150,10 @@ impl crate::docs::StdLibFn for LineTo { vec![] } + fn keyword_arguments(&self) -> bool { + false + } + fn args(&self, inline_subschemas: bool) -> Vec { let mut settings = schemars::gen::SchemaSettings::openapi3(); settings.inline_subschemas = inline_subschemas; @@ -120,12 +164,16 @@ impl crate::docs::StdLibFn for LineTo { type_: "LineToData".to_string(), schema: generator.root_schema_for::(), required: true, + label_required: true, + description: String::new().to_string(), }, crate::docs::StdLibFnArg { name: "sketch".to_string(), type_: "Sketch".to_string(), schema: generator.root_schema_for::(), required: true, + label_required: true, + description: "the sketch you're adding the line to".to_string(), }, ] } @@ -140,6 +188,8 @@ impl crate::docs::StdLibFn for LineTo { type_: "Sketch".to_string(), schema, required: true, + label_required: true, + description: String::new(), }) } @@ -151,6 +201,10 @@ impl crate::docs::StdLibFn for LineTo { false } + fn feature_tree_operation(&self) -> bool { + false + } + fn examples(&self) -> Vec { let code_blocks = vec![ "This is another code block.\nyes sirrr.\nlineTo", @@ -159,12 +213,10 @@ impl crate::docs::StdLibFn for LineTo { code_blocks .iter() .map(|cb| { - let tokens = crate::token::lexer(cb).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let mut options: crate::ast::types::FormatOptions = Default::default(); + let program = crate::Program::parse_no_errs(cb).unwrap(); + let mut options: crate::parsing::ast::types::FormatOptions = Default::default(); options.insert_final_newline = false; - program.recast(&options, 0) + program.ast.recast(&options, 0) }) .collect::>() } diff --git a/src/wasm-lib/derive-docs/tests/min.gen b/src/wasm-lib/derive-docs/tests/min.gen index 63c776961..ace838d6d 100644 --- a/src/wasm-lib/derive-docs/tests/min.gen +++ b/src/wasm-lib/derive-docs/tests/min.gen @@ -1,12 +1,10 @@ #[cfg(test)] mod test_examples_min { #[tokio::test(flavor = "multi_thread")] - async fn test_mock_example_min0() { - let tokens = crate::token::lexer("This is another code block.\nyes sirrr.\nmin").unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let id_generator = crate::executor::IdGenerator::default(); - let ctx = crate::executor::ExecutorContext { + async fn test_mock_example_min0() -> miette::Result<()> { + let program = + crate::Program::parse_no_errs("This is another code block.\nyes sirrr.\nmin").unwrap(); + let ctx = crate::ExecutorContext { engine: std::sync::Arc::new(Box::new( crate::engine::conn_mock::EngineConnection::new() .await @@ -15,32 +13,52 @@ mod test_examples_min { fs: std::sync::Arc::new(crate::fs::FileManager::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()), settings: Default::default(), - context_type: crate::executor::ContextType::Mock, + context_type: crate::execution::ContextType::Mock, }; - ctx.run(&program, None, id_generator, None).await.unwrap(); + if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "min", 0usize), + kcl_source: "This is another code block.\nyes sirrr.\nmin".to_string(), + })); + } + + Ok(()) } #[tokio::test(flavor = "multi_thread", worker_threads = 5)] - async fn kcl_test_example_min0() { + async fn kcl_test_example_min0() -> miette::Result<()> { let code = "This is another code block.\nyes sirrr.\nmin"; - let result = - crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) - .await - .unwrap(); + let result = match crate::test_server::execute_and_snapshot( + code, + crate::settings::types::UnitLength::Mm, + None, + ) + .await + { + Err(crate::errors::ExecError::Kcl(e)) => { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "min", 0usize), + kcl_source: "This is another code block.\nyes sirrr.\nmin".to_string(), + })); + } + Err(other_err) => panic!("{}", other_err), + Ok(img) => img, + }; twenty_twenty::assert_image( &format!("tests/outputs/{}.png", "serial_test_example_min0"), &result, 0.99, ); + Ok(()) } #[tokio::test(flavor = "multi_thread")] - async fn test_mock_example_min1() { - let tokens = crate::token::lexer("This is code.\nIt does other shit.\nmin").unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let id_generator = crate::executor::IdGenerator::default(); - let ctx = crate::executor::ExecutorContext { + async fn test_mock_example_min1() -> miette::Result<()> { + let program = + crate::Program::parse_no_errs("This is code.\nIt does other shit.\nmin").unwrap(); + let ctx = crate::ExecutorContext { engine: std::sync::Arc::new(Box::new( crate::engine::conn_mock::EngineConnection::new() .await @@ -49,23 +67,45 @@ mod test_examples_min { fs: std::sync::Arc::new(crate::fs::FileManager::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()), settings: Default::default(), - context_type: crate::executor::ContextType::Mock, + context_type: crate::execution::ContextType::Mock, }; - ctx.run(&program, None, id_generator, None).await.unwrap(); + if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "min", 1usize), + kcl_source: "This is code.\nIt does other shit.\nmin".to_string(), + })); + } + + Ok(()) } #[tokio::test(flavor = "multi_thread", worker_threads = 5)] - async fn kcl_test_example_min1() { + async fn kcl_test_example_min1() -> miette::Result<()> { let code = "This is code.\nIt does other shit.\nmin"; - let result = - crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) - .await - .unwrap(); + let result = match crate::test_server::execute_and_snapshot( + code, + crate::settings::types::UnitLength::Mm, + None, + ) + .await + { + Err(crate::errors::ExecError::Kcl(e)) => { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "min", 1usize), + kcl_source: "This is code.\nIt does other shit.\nmin".to_string(), + })); + } + Err(other_err) => panic!("{}", other_err), + Ok(img) => img, + }; twenty_twenty::assert_image( &format!("tests/outputs/{}.png", "serial_test_example_min1"), &result, 0.99, ); + Ok(()) } } @@ -79,12 +119,12 @@ pub(crate) struct Min {} #[doc = "Std lib function: min\nThis is some function.\nIt does shit."] pub(crate) const Min: Min = Min {}; fn boxed_min( - exec_state: &mut crate::executor::ExecState, + exec_state: &mut crate::ExecState, args: crate::std::Args, ) -> std::pin::Pin< Box< dyn std::future::Future< - Output = anyhow::Result, + Output = anyhow::Result, > + Send + '_, >, @@ -109,6 +149,10 @@ impl crate::docs::StdLibFn for Min { vec![] } + fn keyword_arguments(&self) -> bool { + false + } + fn args(&self, inline_subschemas: bool) -> Vec { let mut settings = schemars::gen::SchemaSettings::openapi3(); settings.inline_subschemas = inline_subschemas; @@ -118,6 +162,8 @@ impl crate::docs::StdLibFn for Min { type_: "[number]".to_string(), schema: generator.root_schema_for::>(), required: true, + label_required: true, + description: String::new().to_string(), }] } @@ -131,6 +177,8 @@ impl crate::docs::StdLibFn for Min { type_: "number".to_string(), schema, required: true, + label_required: true, + description: String::new(), }) } @@ -142,6 +190,10 @@ impl crate::docs::StdLibFn for Min { false } + fn feature_tree_operation(&self) -> bool { + false + } + fn examples(&self) -> Vec { let code_blocks = vec![ "This is another code block.\nyes sirrr.\nmin", @@ -150,12 +202,10 @@ impl crate::docs::StdLibFn for Min { code_blocks .iter() .map(|cb| { - let tokens = crate::token::lexer(cb).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let mut options: crate::ast::types::FormatOptions = Default::default(); + let program = crate::Program::parse_no_errs(cb).unwrap(); + let mut options: crate::parsing::ast::types::FormatOptions = Default::default(); options.insert_final_newline = false; - program.recast(&options, 0) + program.ast.recast(&options, 0) }) .collect::>() } diff --git a/src/wasm-lib/derive-docs/tests/option.gen b/src/wasm-lib/derive-docs/tests/option.gen index a3624d9ee..7f0157fe7 100644 --- a/src/wasm-lib/derive-docs/tests/option.gen +++ b/src/wasm-lib/derive-docs/tests/option.gen @@ -1,12 +1,10 @@ #[cfg(test)] mod test_examples_show { #[tokio::test(flavor = "multi_thread")] - async fn test_mock_example_show0() { - let tokens = crate::token::lexer("This is code.\nIt does other shit.\nshow").unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let id_generator = crate::executor::IdGenerator::default(); - let ctx = crate::executor::ExecutorContext { + async fn test_mock_example_show0() -> miette::Result<()> { + let program = + crate::Program::parse_no_errs("This is code.\nIt does other shit.\nshow").unwrap(); + let ctx = crate::ExecutorContext { engine: std::sync::Arc::new(Box::new( crate::engine::conn_mock::EngineConnection::new() .await @@ -15,23 +13,45 @@ mod test_examples_show { fs: std::sync::Arc::new(crate::fs::FileManager::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()), settings: Default::default(), - context_type: crate::executor::ContextType::Mock, + context_type: crate::execution::ContextType::Mock, }; - ctx.run(&program, None, id_generator, None).await.unwrap(); + if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "show", 0usize), + kcl_source: "This is code.\nIt does other shit.\nshow".to_string(), + })); + } + + Ok(()) } #[tokio::test(flavor = "multi_thread", worker_threads = 5)] - async fn kcl_test_example_show0() { + async fn kcl_test_example_show0() -> miette::Result<()> { let code = "This is code.\nIt does other shit.\nshow"; - let result = - crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) - .await - .unwrap(); + let result = match crate::test_server::execute_and_snapshot( + code, + crate::settings::types::UnitLength::Mm, + None, + ) + .await + { + Err(crate::errors::ExecError::Kcl(e)) => { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "show", 0usize), + kcl_source: "This is code.\nIt does other shit.\nshow".to_string(), + })); + } + Err(other_err) => panic!("{}", other_err), + Ok(img) => img, + }; twenty_twenty::assert_image( &format!("tests/outputs/{}.png", "serial_test_example_show0"), &result, 0.99, ); + Ok(()) } } @@ -45,12 +65,12 @@ pub(crate) struct Show {} #[doc = "Std lib function: show\nThis is some function.\nIt does shit."] pub(crate) const Show: Show = Show {}; fn boxed_show( - exec_state: &mut crate::executor::ExecState, + exec_state: &mut crate::ExecState, args: crate::std::Args, ) -> std::pin::Pin< Box< dyn std::future::Future< - Output = anyhow::Result, + Output = anyhow::Result, > + Send + '_, >, @@ -75,6 +95,10 @@ impl crate::docs::StdLibFn for Show { vec![] } + fn keyword_arguments(&self) -> bool { + false + } + fn args(&self, inline_subschemas: bool) -> Vec { let mut settings = schemars::gen::SchemaSettings::openapi3(); settings.inline_subschemas = inline_subschemas; @@ -84,6 +108,8 @@ impl crate::docs::StdLibFn for Show { type_: "number".to_string(), schema: generator.root_schema_for::>(), required: false, + label_required: true, + description: String::new().to_string(), }] } @@ -97,6 +123,8 @@ impl crate::docs::StdLibFn for Show { type_: "number".to_string(), schema, required: true, + label_required: true, + description: String::new(), }) } @@ -108,17 +136,19 @@ impl crate::docs::StdLibFn for Show { false } + fn feature_tree_operation(&self) -> bool { + false + } + fn examples(&self) -> Vec { let code_blocks = vec!["This is code.\nIt does other shit.\nshow"]; code_blocks .iter() .map(|cb| { - let tokens = crate::token::lexer(cb).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let mut options: crate::ast::types::FormatOptions = Default::default(); + let program = crate::Program::parse_no_errs(cb).unwrap(); + let mut options: crate::parsing::ast::types::FormatOptions = Default::default(); options.insert_final_newline = false; - program.recast(&options, 0) + program.ast.recast(&options, 0) }) .collect::>() } diff --git a/src/wasm-lib/derive-docs/tests/option_input_format.gen b/src/wasm-lib/derive-docs/tests/option_input_format.gen index 0473f1ebe..a7b01255c 100644 --- a/src/wasm-lib/derive-docs/tests/option_input_format.gen +++ b/src/wasm-lib/derive-docs/tests/option_input_format.gen @@ -1,12 +1,10 @@ #[cfg(test)] mod test_examples_import { #[tokio::test(flavor = "multi_thread")] - async fn test_mock_example_import0() { - let tokens = crate::token::lexer("This is code.\nIt does other shit.\nimport").unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let id_generator = crate::executor::IdGenerator::default(); - let ctx = crate::executor::ExecutorContext { + async fn test_mock_example_import0() -> miette::Result<()> { + let program = + crate::Program::parse_no_errs("This is code.\nIt does other shit.\nimport").unwrap(); + let ctx = crate::ExecutorContext { engine: std::sync::Arc::new(Box::new( crate::engine::conn_mock::EngineConnection::new() .await @@ -15,23 +13,45 @@ mod test_examples_import { fs: std::sync::Arc::new(crate::fs::FileManager::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()), settings: Default::default(), - context_type: crate::executor::ContextType::Mock, + context_type: crate::execution::ContextType::Mock, }; - ctx.run(&program, None, id_generator, None).await.unwrap(); + if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "import", 0usize), + kcl_source: "This is code.\nIt does other shit.\nimport".to_string(), + })); + } + + Ok(()) } #[tokio::test(flavor = "multi_thread", worker_threads = 5)] - async fn kcl_test_example_import0() { + async fn kcl_test_example_import0() -> miette::Result<()> { let code = "This is code.\nIt does other shit.\nimport"; - let result = - crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) - .await - .unwrap(); + let result = match crate::test_server::execute_and_snapshot( + code, + crate::settings::types::UnitLength::Mm, + None, + ) + .await + { + Err(crate::errors::ExecError::Kcl(e)) => { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "import", 0usize), + kcl_source: "This is code.\nIt does other shit.\nimport".to_string(), + })); + } + Err(other_err) => panic!("{}", other_err), + Ok(img) => img, + }; twenty_twenty::assert_image( &format!("tests/outputs/{}.png", "serial_test_example_import0"), &result, 0.99, ); + Ok(()) } } @@ -45,12 +65,12 @@ pub(crate) struct Import {} #[doc = "Std lib function: import\nThis is some function.\nIt does shit."] pub(crate) const Import: Import = Import {}; fn boxed_import( - exec_state: &mut crate::executor::ExecState, + exec_state: &mut crate::ExecState, args: crate::std::Args, ) -> std::pin::Pin< Box< dyn std::future::Future< - Output = anyhow::Result, + Output = anyhow::Result, > + Send + '_, >, @@ -75,6 +95,10 @@ impl crate::docs::StdLibFn for Import { vec![] } + fn keyword_arguments(&self) -> bool { + false + } + fn args(&self, inline_subschemas: bool) -> Vec { let mut settings = schemars::gen::SchemaSettings::openapi3(); settings.inline_subschemas = inline_subschemas; @@ -84,6 +108,8 @@ impl crate::docs::StdLibFn for Import { type_: "kittycad::types::InputFormat".to_string(), schema: generator.root_schema_for::>(), required: false, + label_required: true, + description: String::new().to_string(), }] } @@ -97,6 +123,8 @@ impl crate::docs::StdLibFn for Import { type_: "number".to_string(), schema, required: true, + label_required: true, + description: String::new(), }) } @@ -108,17 +136,19 @@ impl crate::docs::StdLibFn for Import { false } + fn feature_tree_operation(&self) -> bool { + false + } + fn examples(&self) -> Vec { let code_blocks = vec!["This is code.\nIt does other shit.\nimport"]; code_blocks .iter() .map(|cb| { - let tokens = crate::token::lexer(cb).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let mut options: crate::ast::types::FormatOptions = Default::default(); + let program = crate::Program::parse_no_errs(cb).unwrap(); + let mut options: crate::parsing::ast::types::FormatOptions = Default::default(); options.insert_final_newline = false; - program.recast(&options, 0) + program.ast.recast(&options, 0) }) .collect::>() } diff --git a/src/wasm-lib/derive-docs/tests/return_vec_box_sketch.gen b/src/wasm-lib/derive-docs/tests/return_vec_box_sketch.gen index 83b21aa2a..6112fa879 100644 --- a/src/wasm-lib/derive-docs/tests/return_vec_box_sketch.gen +++ b/src/wasm-lib/derive-docs/tests/return_vec_box_sketch.gen @@ -1,12 +1,10 @@ #[cfg(test)] mod test_examples_import { #[tokio::test(flavor = "multi_thread")] - async fn test_mock_example_import0() { - let tokens = crate::token::lexer("This is code.\nIt does other shit.\nimport").unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let id_generator = crate::executor::IdGenerator::default(); - let ctx = crate::executor::ExecutorContext { + async fn test_mock_example_import0() -> miette::Result<()> { + let program = + crate::Program::parse_no_errs("This is code.\nIt does other shit.\nimport").unwrap(); + let ctx = crate::ExecutorContext { engine: std::sync::Arc::new(Box::new( crate::engine::conn_mock::EngineConnection::new() .await @@ -15,23 +13,45 @@ mod test_examples_import { fs: std::sync::Arc::new(crate::fs::FileManager::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()), settings: Default::default(), - context_type: crate::executor::ContextType::Mock, + context_type: crate::execution::ContextType::Mock, }; - ctx.run(&program, None, id_generator, None).await.unwrap(); + if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "import", 0usize), + kcl_source: "This is code.\nIt does other shit.\nimport".to_string(), + })); + } + + Ok(()) } #[tokio::test(flavor = "multi_thread", worker_threads = 5)] - async fn kcl_test_example_import0() { + async fn kcl_test_example_import0() -> miette::Result<()> { let code = "This is code.\nIt does other shit.\nimport"; - let result = - crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) - .await - .unwrap(); + let result = match crate::test_server::execute_and_snapshot( + code, + crate::settings::types::UnitLength::Mm, + None, + ) + .await + { + Err(crate::errors::ExecError::Kcl(e)) => { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "import", 0usize), + kcl_source: "This is code.\nIt does other shit.\nimport".to_string(), + })); + } + Err(other_err) => panic!("{}", other_err), + Ok(img) => img, + }; twenty_twenty::assert_image( &format!("tests/outputs/{}.png", "serial_test_example_import0"), &result, 0.99, ); + Ok(()) } } @@ -45,12 +65,12 @@ pub(crate) struct Import {} #[doc = "Std lib function: import\nThis is some function.\nIt does shit."] pub(crate) const Import: Import = Import {}; fn boxed_import( - exec_state: &mut crate::executor::ExecState, + exec_state: &mut crate::ExecState, args: crate::std::Args, ) -> std::pin::Pin< Box< dyn std::future::Future< - Output = anyhow::Result, + Output = anyhow::Result, > + Send + '_, >, @@ -75,6 +95,10 @@ impl crate::docs::StdLibFn for Import { vec![] } + fn keyword_arguments(&self) -> bool { + false + } + fn args(&self, inline_subschemas: bool) -> Vec { let mut settings = schemars::gen::SchemaSettings::openapi3(); settings.inline_subschemas = inline_subschemas; @@ -84,6 +108,8 @@ impl crate::docs::StdLibFn for Import { type_: "kittycad::types::InputFormat".to_string(), schema: generator.root_schema_for::>(), required: false, + label_required: true, + description: String::new().to_string(), }] } @@ -97,6 +123,8 @@ impl crate::docs::StdLibFn for Import { type_: "[Sketch]".to_string(), schema, required: true, + label_required: true, + description: String::new(), }) } @@ -108,17 +136,19 @@ impl crate::docs::StdLibFn for Import { false } + fn feature_tree_operation(&self) -> bool { + false + } + fn examples(&self) -> Vec { let code_blocks = vec!["This is code.\nIt does other shit.\nimport"]; code_blocks .iter() .map(|cb| { - let tokens = crate::token::lexer(cb).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let mut options: crate::ast::types::FormatOptions = Default::default(); + let program = crate::Program::parse_no_errs(cb).unwrap(); + let mut options: crate::parsing::ast::types::FormatOptions = Default::default(); options.insert_final_newline = false; - program.recast(&options, 0) + program.ast.recast(&options, 0) }) .collect::>() } diff --git a/src/wasm-lib/derive-docs/tests/return_vec_sketch.gen b/src/wasm-lib/derive-docs/tests/return_vec_sketch.gen index 1f0670cd5..3d8068323 100644 --- a/src/wasm-lib/derive-docs/tests/return_vec_sketch.gen +++ b/src/wasm-lib/derive-docs/tests/return_vec_sketch.gen @@ -1,12 +1,10 @@ #[cfg(test)] mod test_examples_import { #[tokio::test(flavor = "multi_thread")] - async fn test_mock_example_import0() { - let tokens = crate::token::lexer("This is code.\nIt does other shit.\nimport").unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let id_generator = crate::executor::IdGenerator::default(); - let ctx = crate::executor::ExecutorContext { + async fn test_mock_example_import0() -> miette::Result<()> { + let program = + crate::Program::parse_no_errs("This is code.\nIt does other shit.\nimport").unwrap(); + let ctx = crate::ExecutorContext { engine: std::sync::Arc::new(Box::new( crate::engine::conn_mock::EngineConnection::new() .await @@ -15,23 +13,45 @@ mod test_examples_import { fs: std::sync::Arc::new(crate::fs::FileManager::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()), settings: Default::default(), - context_type: crate::executor::ContextType::Mock, + context_type: crate::execution::ContextType::Mock, }; - ctx.run(&program, None, id_generator, None).await.unwrap(); + if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "import", 0usize), + kcl_source: "This is code.\nIt does other shit.\nimport".to_string(), + })); + } + + Ok(()) } #[tokio::test(flavor = "multi_thread", worker_threads = 5)] - async fn kcl_test_example_import0() { + async fn kcl_test_example_import0() -> miette::Result<()> { let code = "This is code.\nIt does other shit.\nimport"; - let result = - crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) - .await - .unwrap(); + let result = match crate::test_server::execute_and_snapshot( + code, + crate::settings::types::UnitLength::Mm, + None, + ) + .await + { + Err(crate::errors::ExecError::Kcl(e)) => { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "import", 0usize), + kcl_source: "This is code.\nIt does other shit.\nimport".to_string(), + })); + } + Err(other_err) => panic!("{}", other_err), + Ok(img) => img, + }; twenty_twenty::assert_image( &format!("tests/outputs/{}.png", "serial_test_example_import0"), &result, 0.99, ); + Ok(()) } } @@ -45,12 +65,12 @@ pub(crate) struct Import {} #[doc = "Std lib function: import\nThis is some function.\nIt does shit."] pub(crate) const Import: Import = Import {}; fn boxed_import( - exec_state: &mut crate::executor::ExecState, + exec_state: &mut crate::ExecState, args: crate::std::Args, ) -> std::pin::Pin< Box< dyn std::future::Future< - Output = anyhow::Result, + Output = anyhow::Result, > + Send + '_, >, @@ -75,6 +95,10 @@ impl crate::docs::StdLibFn for Import { vec![] } + fn keyword_arguments(&self) -> bool { + false + } + fn args(&self, inline_subschemas: bool) -> Vec { let mut settings = schemars::gen::SchemaSettings::openapi3(); settings.inline_subschemas = inline_subschemas; @@ -84,6 +108,8 @@ impl crate::docs::StdLibFn for Import { type_: "kittycad::types::InputFormat".to_string(), schema: generator.root_schema_for::>(), required: false, + label_required: true, + description: String::new().to_string(), }] } @@ -97,6 +123,8 @@ impl crate::docs::StdLibFn for Import { type_: "[Sketch]".to_string(), schema, required: true, + label_required: true, + description: String::new(), }) } @@ -108,17 +136,19 @@ impl crate::docs::StdLibFn for Import { false } + fn feature_tree_operation(&self) -> bool { + false + } + fn examples(&self) -> Vec { let code_blocks = vec!["This is code.\nIt does other shit.\nimport"]; code_blocks .iter() .map(|cb| { - let tokens = crate::token::lexer(cb).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let mut options: crate::ast::types::FormatOptions = Default::default(); + let program = crate::Program::parse_no_errs(cb).unwrap(); + let mut options: crate::parsing::ast::types::FormatOptions = Default::default(); options.insert_final_newline = false; - program.recast(&options, 0) + program.ast.recast(&options, 0) }) .collect::>() } diff --git a/src/wasm-lib/derive-docs/tests/show.gen b/src/wasm-lib/derive-docs/tests/show.gen index 822c93c2a..c5199b395 100644 --- a/src/wasm-lib/derive-docs/tests/show.gen +++ b/src/wasm-lib/derive-docs/tests/show.gen @@ -1,12 +1,10 @@ #[cfg(test)] mod test_examples_show { #[tokio::test(flavor = "multi_thread")] - async fn test_mock_example_show0() { - let tokens = crate::token::lexer("This is code.\nIt does other shit.\nshow").unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let id_generator = crate::executor::IdGenerator::default(); - let ctx = crate::executor::ExecutorContext { + async fn test_mock_example_show0() -> miette::Result<()> { + let program = + crate::Program::parse_no_errs("This is code.\nIt does other shit.\nshow").unwrap(); + let ctx = crate::ExecutorContext { engine: std::sync::Arc::new(Box::new( crate::engine::conn_mock::EngineConnection::new() .await @@ -15,23 +13,45 @@ mod test_examples_show { fs: std::sync::Arc::new(crate::fs::FileManager::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()), settings: Default::default(), - context_type: crate::executor::ContextType::Mock, + context_type: crate::execution::ContextType::Mock, }; - ctx.run(&program, None, id_generator, None).await.unwrap(); + if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "show", 0usize), + kcl_source: "This is code.\nIt does other shit.\nshow".to_string(), + })); + } + + Ok(()) } #[tokio::test(flavor = "multi_thread", worker_threads = 5)] - async fn kcl_test_example_show0() { + async fn kcl_test_example_show0() -> miette::Result<()> { let code = "This is code.\nIt does other shit.\nshow"; - let result = - crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) - .await - .unwrap(); + let result = match crate::test_server::execute_and_snapshot( + code, + crate::settings::types::UnitLength::Mm, + None, + ) + .await + { + Err(crate::errors::ExecError::Kcl(e)) => { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "show", 0usize), + kcl_source: "This is code.\nIt does other shit.\nshow".to_string(), + })); + } + Err(other_err) => panic!("{}", other_err), + Ok(img) => img, + }; twenty_twenty::assert_image( &format!("tests/outputs/{}.png", "serial_test_example_show0"), &result, 0.99, ); + Ok(()) } } @@ -45,12 +65,12 @@ pub(crate) struct Show {} #[doc = "Std lib function: show\nThis is some function.\nIt does shit."] pub(crate) const Show: Show = Show {}; fn boxed_show( - exec_state: &mut crate::executor::ExecState, + exec_state: &mut crate::ExecState, args: crate::std::Args, ) -> std::pin::Pin< Box< dyn std::future::Future< - Output = anyhow::Result, + Output = anyhow::Result, > + Send + '_, >, @@ -75,6 +95,10 @@ impl crate::docs::StdLibFn for Show { vec![] } + fn keyword_arguments(&self) -> bool { + false + } + fn args(&self, inline_subschemas: bool) -> Vec { let mut settings = schemars::gen::SchemaSettings::openapi3(); settings.inline_subschemas = inline_subschemas; @@ -84,6 +108,8 @@ impl crate::docs::StdLibFn for Show { type_: "[number]".to_string(), schema: generator.root_schema_for::>(), required: true, + label_required: true, + description: String::new().to_string(), }] } @@ -97,6 +123,8 @@ impl crate::docs::StdLibFn for Show { type_: "()".to_string(), schema, required: true, + label_required: true, + description: String::new(), }) } @@ -108,17 +136,19 @@ impl crate::docs::StdLibFn for Show { false } + fn feature_tree_operation(&self) -> bool { + false + } + fn examples(&self) -> Vec { let code_blocks = vec!["This is code.\nIt does other shit.\nshow"]; code_blocks .iter() .map(|cb| { - let tokens = crate::token::lexer(cb).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let mut options: crate::ast::types::FormatOptions = Default::default(); + let program = crate::Program::parse_no_errs(cb).unwrap(); + let mut options: crate::parsing::ast::types::FormatOptions = Default::default(); options.insert_final_newline = false; - program.recast(&options, 0) + program.ast.recast(&options, 0) }) .collect::>() } diff --git a/src/wasm-lib/derive-docs/tests/test_args_with_exec_state.gen b/src/wasm-lib/derive-docs/tests/test_args_with_exec_state.gen index 87d2c4b3c..9849c28ca 100644 --- a/src/wasm-lib/derive-docs/tests/test_args_with_exec_state.gen +++ b/src/wasm-lib/derive-docs/tests/test_args_with_exec_state.gen @@ -1,12 +1,9 @@ #[cfg(test)] mod test_examples_some_function { #[tokio::test(flavor = "multi_thread")] - async fn test_mock_example_some_function0() { - let tokens = crate::token::lexer("someFunction()").unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let id_generator = crate::executor::IdGenerator::default(); - let ctx = crate::executor::ExecutorContext { + async fn test_mock_example_some_function0() -> miette::Result<()> { + let program = crate::Program::parse_no_errs("someFunction()").unwrap(); + let ctx = crate::ExecutorContext { engine: std::sync::Arc::new(Box::new( crate::engine::conn_mock::EngineConnection::new() .await @@ -15,23 +12,45 @@ mod test_examples_some_function { fs: std::sync::Arc::new(crate::fs::FileManager::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()), settings: Default::default(), - context_type: crate::executor::ContextType::Mock, + context_type: crate::execution::ContextType::Mock, }; - ctx.run(&program, None, id_generator, None).await.unwrap(); + if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "some_function", 0usize), + kcl_source: "someFunction()".to_string(), + })); + } + + Ok(()) } #[tokio::test(flavor = "multi_thread", worker_threads = 5)] - async fn kcl_test_example_some_function0() { + async fn kcl_test_example_some_function0() -> miette::Result<()> { let code = "someFunction()"; - let result = - crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) - .await - .unwrap(); + let result = match crate::test_server::execute_and_snapshot( + code, + crate::settings::types::UnitLength::Mm, + None, + ) + .await + { + Err(crate::errors::ExecError::Kcl(e)) => { + return Err(miette::Report::new(crate::errors::Report { + error: e, + filename: format!("{}{}", "some_function", 0usize), + kcl_source: "someFunction()".to_string(), + })); + } + Err(other_err) => panic!("{}", other_err), + Ok(img) => img, + }; twenty_twenty::assert_image( &format!("tests/outputs/{}.png", "serial_test_example_some_function0"), &result, 0.99, ); + Ok(()) } } @@ -45,12 +64,12 @@ pub(crate) struct SomeFunction {} #[doc = "Std lib function: someFunction\nDocs"] pub(crate) const SomeFunction: SomeFunction = SomeFunction {}; fn boxed_some_function( - exec_state: &mut crate::executor::ExecState, + exec_state: &mut crate::ExecState, args: crate::std::Args, ) -> std::pin::Pin< Box< dyn std::future::Future< - Output = anyhow::Result, + Output = anyhow::Result, > + Send + '_, >, @@ -75,6 +94,10 @@ impl crate::docs::StdLibFn for SomeFunction { vec![] } + fn keyword_arguments(&self) -> bool { + false + } + fn args(&self, inline_subschemas: bool) -> Vec { let mut settings = schemars::gen::SchemaSettings::openapi3(); settings.inline_subschemas = inline_subschemas; @@ -92,6 +115,8 @@ impl crate::docs::StdLibFn for SomeFunction { type_: "i32".to_string(), schema, required: true, + label_required: true, + description: String::new(), }) } @@ -103,17 +128,19 @@ impl crate::docs::StdLibFn for SomeFunction { false } + fn feature_tree_operation(&self) -> bool { + false + } + fn examples(&self) -> Vec { let code_blocks = vec!["someFunction()"]; code_blocks .iter() .map(|cb| { - let tokens = crate::token::lexer(cb).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let mut options: crate::ast::types::FormatOptions = Default::default(); + let program = crate::Program::parse_no_errs(cb).unwrap(); + let mut options: crate::parsing::ast::types::FormatOptions = Default::default(); options.insert_final_newline = false; - program.recast(&options, 0) + program.ast.recast(&options, 0) }) .collect::>() } diff --git a/src/wasm-lib/justfile b/src/wasm-lib/justfile index 181182515..66990d9ab 100644 --- a/src/wasm-lib/justfile +++ b/src/wasm-lib/justfile @@ -1,7 +1,35 @@ -# Create a new KCL snapshot test from `tests/inputs/my-test.kcl`. -new-test name: - echo "kcl_test!(\"{{name}}\", {{name}});" >> tests/executor/visuals.rs - TWENTY_TWENTY=overwrite cargo nextest run --test executor -E 'test(=visuals::{{name}})' +cnr := "cargo nextest run" +cita := "cargo insta test --accept" +# Run the same lint checks we run in CI. lint: - cargo clippy --all --tests --benches -- -D warnings + cargo clippy --workspace --all-targets -- -D warnings + +# Run the stdlib docs generation +redo-kcl-stdlib-docs-no-imgs: + EXPECTORATE=overwrite {{cnr}} -p kcl-lib docs::gen_std_tests::test_generate_stdlib + +# Generate the stdlib image artifacts +# Then run the stdlib docs generation +redo-kcl-stdlib-docs: + TWENTY_TWENTY=overwrite {{cnr}} -p kcl-lib --no-fail-fast -- kcl_test_example + EXPECTORATE=overwrite {{cnr}} -p kcl-lib --no-fail-fast -- docs::gen_std_tests::test_generate_stdlib + +# Copy a test KCL file from executor tests into a new simulation test. +copy-exec-test-into-sim-test test_name: + mkdir -p kcl/tests/{{test_name}} + cp tests/executor/inputs/{{test_name}}.kcl kcl/tests/{{test_name}}/input.kcl + zoo kcl fmt -w kcl/tests/{{test_name}}/input.kcl + just new-sim-test {{test_name}} + +# Create a new KCL deterministic simulation test case. +new-sim-test test_name render_to_png="true": + # Add the various tests for this new test case. + cat kcl/tests/simtest.tmpl | sed "s/TEST_NAME_HERE/{{test_name}}/" | sed "s/RENDER_TO_PNG/{{render_to_png}}/" >> kcl/src/simulation_tests.rs + # Run all the tests for the first time, in the right order. + {{cita}} -p kcl-lib -- simulation_tests::{{test_name}}::parse + {{cita}} -p kcl-lib -- simulation_tests::{{test_name}}::unparse + TWENTY_TWENTY=overwrite {{cita}} -p kcl-lib -- tests::{{test_name}}::kcl_test_execute + +test: + export RUST_BRACKTRACE="full" && cargo nextest run --workspace --test-threads=1 diff --git a/src/wasm-lib/kcl-macros/Cargo.toml b/src/wasm-lib/kcl-macros/Cargo.toml deleted file mode 100644 index e3a0756c9..000000000 --- a/src/wasm-lib/kcl-macros/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "kcl-macros" -description = "Macro for compiling KCL to its AST during Rust compile-time" -version = "0.1.0" -edition = "2021" -license = "MIT" -repository = "https://github.com/KittyCAD/modeling-app" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[lib] -proc-macro = true - -[dependencies] -databake = "0.1.8" -kcl-lib = { path = "../kcl" } -proc-macro2 = "1" -quote = "1" -syn = { version = "2.0.85", features = ["full"] } - -[dev-dependencies] -pretty_assertions = "1.4.1" diff --git a/src/wasm-lib/kcl-macros/src/lib.rs b/src/wasm-lib/kcl-macros/src/lib.rs deleted file mode 100644 index 611731325..000000000 --- a/src/wasm-lib/kcl-macros/src/lib.rs +++ /dev/null @@ -1,23 +0,0 @@ -//! This crate contains macros for parsing KCL at Rust compile-time. -use databake::*; -use proc_macro::TokenStream; -use quote::quote; -use syn::{parse_macro_input, LitStr}; - -/// Parses KCL into its AST at compile-time. -/// This macro takes exactly one argument: A string literal containing KCL. -/// # Examples -/// ``` -/// extern crate alloc; -/// use kcl_compile_macro::parse_kcl; -/// let ast: kcl_lib::ast::types::Program = parse_kcl!("const y = 4"); -/// ``` -#[proc_macro] -pub fn parse(input: TokenStream) -> TokenStream { - let input = parse_macro_input!(input as LitStr); - let kcl_src = input.value(); - let tokens = kcl_lib::token::lexer(&kcl_src).unwrap(); - let ast = kcl_lib::parser::Parser::new(tokens).ast().unwrap(); - let ast_struct = ast.bake(&Default::default()); - quote!(#ast_struct).into() -} diff --git a/src/wasm-lib/kcl-macros/tests/macro_test.rs b/src/wasm-lib/kcl-macros/tests/macro_test.rs deleted file mode 100644 index d4124bcc3..000000000 --- a/src/wasm-lib/kcl-macros/tests/macro_test.rs +++ /dev/null @@ -1,44 +0,0 @@ -extern crate alloc; -use kcl_lib::ast::types::{ - BodyItem, Expr, Identifier, ItemVisibility, Literal, LiteralValue, NonCodeMeta, Program, VariableDeclaration, - VariableDeclarator, VariableKind, -}; -use kcl_macros::parse; -use pretty_assertions::assert_eq; - -#[test] -fn basic() { - let actual = parse!("const y = 4"); - let expected = Program { - start: 0, - end: 11, - body: vec![BodyItem::VariableDeclaration(Box::new(VariableDeclaration { - start: 0, - end: 11, - declarations: vec![VariableDeclarator { - start: 6, - end: 11, - id: Identifier { - start: 6, - end: 7, - name: "y".to_owned(), - digest: None, - }, - init: Expr::Literal(Box::new(Literal { - start: 10, - end: 11, - value: LiteralValue::IInteger(4), - raw: "4".to_owned(), - digest: None, - })), - digest: None, - }], - visibility: ItemVisibility::Default, - kind: VariableKind::Const, - digest: None, - }))], - non_code_meta: NonCodeMeta::default(), - digest: None, - }; - assert_eq!(expected, actual); -} diff --git a/src/wasm-lib/kcl-test-server/Cargo.toml b/src/wasm-lib/kcl-test-server/Cargo.toml index 8f58ba267..0055a4a3d 100644 --- a/src/wasm-lib/kcl-test-server/Cargo.toml +++ b/src/wasm-lib/kcl-test-server/Cargo.toml @@ -1,15 +1,18 @@ [package] name = "kcl-test-server" description = "A test server for KCL" -version = "0.1.15" +version = "0.1.19" edition = "2021" license = "MIT" [dependencies] -anyhow = "1.0.91" +anyhow = "1.0.95" hyper = { version = "0.14.29", features = ["http1", "server", "tcp"] } kcl-lib = { version = "0.2", path = "../kcl" } pico-args = "0.5.0" -serde = { version = "1.0.213", features = ["derive"] } -serde_json = "1.0.128" -tokio = { version = "1.40.0", features = ["macros", "rt-multi-thread"] } +serde = { version = "1.0.217", features = ["derive"] } +serde_json = "1.0.135" +tokio = { version = "1.41.1", features = ["macros", "rt-multi-thread"] } + +[lints] +workspace = true diff --git a/src/wasm-lib/kcl-test-server/src/lib.rs b/src/wasm-lib/kcl-test-server/src/lib.rs index 45de4eec2..35de21def 100644 --- a/src/wasm-lib/kcl-test-server/src/lib.rs +++ b/src/wasm-lib/kcl-test-server/src/lib.rs @@ -15,7 +15,7 @@ use hyper::{ service::{make_service_fn, service_fn}, Body, Error, Response, Server, }; -use kcl_lib::{executor::ExecutorContext, settings::types::UnitLength, test_server::RequestBody}; +use kcl_lib::{test_server::RequestBody, ExecState, ExecutorContext, Program, UnitLength}; use tokio::{ sync::{mpsc, oneshot}, task::JoinHandle, @@ -157,20 +157,18 @@ async fn snapshot_endpoint(body: Bytes, state: ExecutorContext) -> Response return bad_request(format!("Invalid request JSON: {e}")), }; let RequestBody { kcl_program, test_name } = body; - let parser = match kcl_lib::token::lexer(&kcl_program) { - Ok(ts) => kcl_lib::parser::Parser::new(ts), - Err(e) => return bad_request(format!("tokenization error: {e}")), - }; - let program = match parser.ast() { + + let program = match Program::parse_no_errs(&kcl_program) { Ok(pr) => pr, Err(e) => return bad_request(format!("Parse error: {e}")), }; + eprintln!("Executing {test_name}"); - let mut id_generator = kcl_lib::executor::IdGenerator::default(); + let mut exec_state = ExecState::new(); // This is a shitty source range, I don't know what else to use for it though. // There's no actual KCL associated with this reset_scene call. if let Err(e) = state - .reset_scene(&mut id_generator, kcl_lib::executor::SourceRange::default()) + .reset_scene(&mut exec_state, kcl_lib::SourceRange::default()) .await { return kcl_err(e); @@ -178,7 +176,7 @@ async fn snapshot_endpoint(body: Bytes, state: ExecutorContext) -> Response(); let timer = time_until(done_rx); - let snapshot = match state.execute_and_prepare_snapshot(&program, id_generator, None).await { + let snapshot = match state.execute_and_prepare_snapshot(&program, &mut exec_state).await { Ok(sn) => sn, Err(e) => return kcl_err(e), }; @@ -205,7 +203,7 @@ fn bad_gateway(msg: String) -> Response { resp } -fn kcl_err(err: anyhow::Error) -> Response { +fn kcl_err(err: impl std::fmt::Display) -> Response { eprintln!("\tBad KCL"); bad_gateway(format!("{err}")) } diff --git a/src/wasm-lib/kcl-to-core/Cargo.toml b/src/wasm-lib/kcl-to-core/Cargo.toml index 62eb8faf3..c9a0276da 100644 --- a/src/wasm-lib/kcl-to-core/Cargo.toml +++ b/src/wasm-lib/kcl-to-core/Cargo.toml @@ -15,9 +15,12 @@ path = "src/tool.rs" [dependencies] anyhow = "1" async-trait = "0.1.81" -indexmap = "2.6.0" +indexmap = "2.7.0" kcl-lib = { path = "../kcl" } kittycad = { workspace = true, features = ["clap"] } kittycad-modeling-cmds = { workspace = true } -tokio = { version = "1.38", features = ["full", "time", "rt", "tracing"] } +tokio = { version = "1.41", features = ["full", "time", "rt", "tracing"] } uuid = { version = "1.11.0", features = ["v4", "js", "serde"] } + +[lints] +workspace = true diff --git a/src/wasm-lib/kcl-to-core/src/conn_mock_core.rs b/src/wasm-lib/kcl-to-core/src/conn_mock_core.rs index 4d578dd5f..161c370d2 100644 --- a/src/wasm-lib/kcl-to-core/src/conn_mock_core.rs +++ b/src/wasm-lib/kcl-to-core/src/conn_mock_core.rs @@ -1,9 +1,13 @@ +use std::{ + collections::HashMap, + sync::{Arc, Mutex}, +}; + use anyhow::Result; use indexmap::IndexMap; use kcl_lib::{ - engine::ExecutionKind, - errors::KclError, - executor::{DefaultPlanes, IdGenerator}, + exec::{DefaultPlanes, IdGenerator}, + ExecutionKind, KclError, }; use kittycad_modeling_cmds::{ self as kcmc, @@ -12,10 +16,6 @@ use kittycad_modeling_cmds::{ shared::PathSegment::{self, *}, websocket::{ModelingBatch, ModelingCmdReq, OkWebSocketResponseData, WebSocketRequest, WebSocketResponse}, }; -use std::{ - collections::HashMap, - sync::{Arc, Mutex}, -}; use tokio::sync::RwLock; const CPP_PREFIX: &str = "const double scaleFactor = 100;\n"; @@ -23,8 +23,8 @@ const NEED_PLANES: bool = true; #[derive(Debug, Clone)] pub struct EngineConnection { - batch: Arc>>, - batch_end: Arc>>, + batch: Arc>>, + batch_end: Arc>>, core_test: Arc>, default_planes: Arc>>, execution_kind: Arc>, @@ -189,7 +189,11 @@ impl EngineConnection { uuid_to_cpp(path_id) ) } - kcmc::ModelingCmd::Extrude(kcmc::Extrude { distance, target }) => { + kcmc::ModelingCmd::Extrude(kcmc::Extrude { + distance, + target, + faces: _, // Engine team: start using this once the frontend and engine both use it. + }) => { format!( r#" scene->getSceneObject(Utils::UUID("{target}"))->extrudeToSolid3D({} * scaleFactor, true); @@ -354,12 +358,12 @@ fn codegen_cpp_repl_uuid_setters(reps_id: &str, entity_ids: &[uuid::Uuid]) -> St } #[async_trait::async_trait] -impl kcl_lib::engine::EngineManager for EngineConnection { - fn batch(&self) -> Arc>> { +impl kcl_lib::EngineManager for EngineConnection { + fn batch(&self) -> Arc>> { self.batch.clone() } - fn batch_end(&self) -> Arc>> { + fn batch_end(&self) -> Arc>> { self.batch_end.clone() } @@ -378,7 +382,7 @@ impl kcl_lib::engine::EngineManager for EngineConnection { async fn default_planes( &self, id_generator: &mut IdGenerator, - source_range: kcl_lib::executor::SourceRange, + source_range: kcl_lib::SourceRange, ) -> Result { if NEED_PLANES { { @@ -400,7 +404,7 @@ impl kcl_lib::engine::EngineManager for EngineConnection { async fn clear_scene_post_hook( &self, _id_generator: &mut IdGenerator, - _source_range: kcl_lib::executor::SourceRange, + _source_range: kcl_lib::SourceRange, ) -> Result<(), KclError> { Ok(()) } @@ -408,9 +412,9 @@ impl kcl_lib::engine::EngineManager for EngineConnection { async fn inner_send_modeling_cmd( &self, id: uuid::Uuid, - _source_range: kcl_lib::executor::SourceRange, + _source_range: kcl_lib::SourceRange, cmd: WebSocketRequest, - _id_to_source_range: std::collections::HashMap, + _id_to_source_range: std::collections::HashMap, ) -> Result { match cmd { WebSocketRequest::ModelingCmdBatchReq(ModelingBatch { diff --git a/src/wasm-lib/kcl-to-core/src/lib.rs b/src/wasm-lib/kcl-to-core/src/lib.rs index ce007d177..8fd7df817 100644 --- a/src/wasm-lib/kcl-to-core/src/lib.rs +++ b/src/wasm-lib/kcl-to-core/src/lib.rs @@ -1,29 +1,22 @@ -use anyhow::Result; -use kcl_lib::executor::{ExecutorContext, IdGenerator}; use std::sync::{Arc, Mutex}; +use anyhow::Result; +use kcl_lib::{ExecState, ExecutorContext}; + #[cfg(not(target_arch = "wasm32"))] mod conn_mock_core; ///Converts the given kcl code to an engine test pub async fn kcl_to_engine_core(code: &str) -> Result { - let tokens = kcl_lib::token::lexer(code)?; - let parser = kcl_lib::parser::Parser::new(tokens); - let program = parser.ast()?; + let program = kcl_lib::Program::parse_no_errs(code)?; let result = Arc::new(Mutex::new("".into())); let ref_result = Arc::clone(&result); - let ctx = ExecutorContext { - engine: Arc::new(Box::new( - crate::conn_mock_core::EngineConnection::new(ref_result).await?, - )), - fs: Arc::new(kcl_lib::fs::FileManager::new()), - stdlib: Arc::new(kcl_lib::std::StdLib::new()), - settings: Default::default(), - context_type: kcl_lib::executor::ContextType::MockCustomForwarded, - }; - let _memory = ctx.run(&program, None, IdGenerator::default(), None).await?; + let ctx = ExecutorContext::new_forwarded_mock(Arc::new(Box::new( + crate::conn_mock_core::EngineConnection::new(ref_result).await?, + ))); + ctx.run(program.into(), &mut ExecState::new()).await?; let result = result.lock().expect("mutex lock").clone(); Ok(result) diff --git a/src/wasm-lib/kcl-to-core/src/tool.rs b/src/wasm-lib/kcl-to-core/src/tool.rs index 626b0b880..6706c7cb1 100644 --- a/src/wasm-lib/kcl-to-core/src/tool.rs +++ b/src/wasm-lib/kcl-to-core/src/tool.rs @@ -1,6 +1,7 @@ -use kcl_to_core::*; use std::{env, fs}; +use kcl_to_core::*; + #[tokio::main] async fn main() { let args: Vec = env::args().collect(); diff --git a/src/wasm-lib/kcl-to-core/tests/kcl_to_core_test.rs b/src/wasm-lib/kcl-to-core/tests/kcl_to_core_test.rs index de2be38ae..9c4644335 100644 --- a/src/wasm-lib/kcl-to-core/tests/kcl_to_core_test.rs +++ b/src/wasm-lib/kcl-to-core/tests/kcl_to_core_test.rs @@ -15,5 +15,5 @@ async fn kcl_to_core_test() { ) .await; - assert!(result.is_ok()); + result.unwrap(); } diff --git a/src/wasm-lib/kcl/Cargo.toml b/src/wasm-lib/kcl/Cargo.toml index d8d4b8ede..bd2ccfc53 100644 --- a/src/wasm-lib/kcl/Cargo.toml +++ b/src/wasm-lib/kcl/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "kcl-lib" description = "KittyCAD Language implementation and tools" -version = "0.2.23" +version = "0.2.29" edition = "2021" license = "MIT" repository = "https://github.com/KittyCAD/modeling-app" @@ -11,65 +11,94 @@ keywords = ["kcl", "KittyCAD", "CAD"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -anyhow = { version = "1.0.91", features = ["backtrace"] } +anyhow = { version = "1.0.95", features = ["backtrace"] } async-recursion = "1.1.1" async-trait = "0.1.83" base64 = "0.22.1" chrono = "0.4.38" -clap = { version = "4.5.20", default-features = false, optional = true, features = ["std", "derive"] } +clap = { version = "4.5.23", default-features = false, optional = true, features = [ + "std", + "derive", +] } convert_case = "0.6.0" dashmap = "6.1.0" -databake = { version = "0.1.8", features = ["derive"] } -derive-docs = { version = "0.1.29", path = "../derive-docs" } +derive-docs = { version = "0.1.33", path = "../derive-docs" } +dhat = { version = "0.3", optional = true } +fnv = "1.0.7" form_urlencoded = "1.2.1" futures = { version = "0.3.31" } git_rev = "0.1.0" gltf-json = "1.4.1" http = { workspace = true } -image = { version = "0.25.3", default-features = false, features = ["png"] } -indexmap = { version = "2.6.0", features = ["serde"] } +image = { version = "0.25.5", default-features = false, features = ["png"] } +indexmap = { version = "2.7.0", features = ["serde"] } kittycad = { workspace = true } kittycad-modeling-cmds = { workspace = true } lazy_static = "1.5.0" measurements = "0.11.0" +miette = "7.2.0" mime_guess = "2.0.5" parse-display = "0.9.1" -pyo3 = { version = "0.22.5", optional = true } -reqwest = { version = "0.12", default-features = false, features = ["stream", "rustls-tls"] } +pyo3 = { version = "0.22.6", optional = true } +regex = "1.11.1" +reqwest = { version = "0.12", default-features = false, features = [ + "stream", + "rustls-tls", +] } +rgba_simple = "0.10.0" ropey = "1.6.1" -schemars = { version = "0.8.17", features = ["impl_json_schema", "url", "uuid1", "preserve_order"] } -serde = { version = "1.0.213", features = ["derive"] } -serde_json = "1.0.128" +schemars = { version = "0.8.17", features = [ + "impl_json_schema", + "indexmap2", + "url", + "uuid1", + "preserve_order", +] } +serde = { version = "1.0.217", features = ["derive"] } +serde_json = "1.0.135" sha2 = "0.10.8" tabled = { version = "0.15.0", optional = true } -thiserror = "1.0.65" +thiserror = "2.0.0" toml = "0.8.19" -ts-rs = { version = "10.0.0", features = ["uuid-impl", "url-impl", "chrono-impl", "no-serde-warnings", "serde-json-impl"] } -url = { version = "2.5.2", features = ["serde"] } +ts-rs = { version = "10.1.0", features = [ + "uuid-impl", + "url-impl", + "chrono-impl", + "indexmap-impl", + "no-serde-warnings", + "serde-json-impl", +] } +url = { version = "2.5.4", features = ["serde"] } urlencoding = "2.1.3" uuid = { version = "1.11.0", features = ["v4", "js", "serde"] } -validator = { version = "0.18.1", features = ["derive"] } -winnow = "0.6.18" -zip = { version = "2.0.0", default-features = false } +validator = { version = "0.19.0", features = ["derive"] } +web-time = "1.1" +winnow = "0.6.22" +zip = { version = "2.2.2", default-features = false } [target.'cfg(target_arch = "wasm32")'.dependencies] js-sys = { version = "0.3.72" } -tokio = { version = "1.40.0", features = ["sync", "time"] } -tower-lsp = { version = "0.20.0", default-features = false, features = ["runtime-agnostic"] } -wasm-bindgen = "0.2.91" -wasm-bindgen-futures = "0.4.44" -web-sys = { version = "0.3.72", features = ["console"] } +tokio = { version = "1.41.1", features = ["sync", "time"] } +tower-lsp = { version = "0.20.0", default-features = false, features = [ + "runtime-agnostic", +] } +wasm-bindgen = "0.2.99" +wasm-bindgen-futures = "0.4.49" +web-sys = { version = "0.3.76", features = ["console"] } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] approx = "0.5" bson = { version = "2.13.0", features = ["uuid-1", "chrono"] } -tokio = { version = "1.39.3", features = ["full"] } -tokio-tungstenite = { version = "0.24.0", features = ["rustls-tls-native-roots"] } +tokio = { version = "1.41.1", features = ["full"] } +tokio-tungstenite = { version = "0.24.0", features = [ + "rustls-tls-native-roots", +] } tower-lsp = { version = "0.20.0", features = ["proposed"] } [features] default = ["engine"] cli = ["dep:clap"] +dhat-heap = ["dep:dhat"] # For the lsp server, when run with stdout for rpc we want to disable println. # This is used for editor extensions that use the lsp server. disable-println = [] @@ -77,29 +106,25 @@ engine = [] pyo3 = ["dep:pyo3"] # Helper functions also used in benchmarks. lsp-test-util = [] - tabled = ["dep:tabled"] -[profile.release] -panic = "abort" -debug = true - -[profile.bench] -debug = true # Flamegraphs of benchmarks require accurate debug symbols - [dev-dependencies] base64 = "0.22.1" criterion = { version = "0.5.1", features = ["async_tokio"] } expectorate = "1.1.0" -handlebars = "6.1.0" +handlebars = "6.2.0" iai = "0.1" -image = { version = "0.25.3", default-features = false, features = ["png"] } -insta = { version = "1.40.0", features = ["json"] } +image = { version = "0.25.5", default-features = false, features = ["png"] } +insta = { version = "1.41.1", features = ["json", "filters", "redactions"] } itertools = "0.13.0" +miette = { version = "7.2.0", features = ["fancy"] } pretty_assertions = "1.4.1" -tokio = { version = "1.40.0", features = ["rt-multi-thread", "macros", "time"] } +tokio = { version = "1.41.1", features = ["rt-multi-thread", "macros", "time"] } twenty-twenty = "0.8.0" +[lints] +workspace = true + [[bench]] name = "compiler_benchmark_criterion" harness = false diff --git a/src/wasm-lib/kcl/README.md b/src/wasm-lib/kcl/README.md index cdc455f15..bd60eb985 100644 --- a/src/wasm-lib/kcl/README.md +++ b/src/wasm-lib/kcl/README.md @@ -16,7 +16,7 @@ We've built a lot of tooling to make contributing to KCL easier. If you are inte 8. Add your new standard library function to [the long list of CORE_FNS in mod.rs](https://github.com/KittyCAD/modeling-app/blob/main/src/wasm-lib/kcl/src/std/mod.rs#L42) 9. Get a production Zoo dev token and run `export KITTYCAD_API_TOKEN=your-token-here` in a terminal 10. Run `TWENTY_TWENTY=overwrite cargo nextest run --workspace --no-fail-fast` to take snapshot tests of your example code running in the engine -11. Run `EXPECTORATE=overwrite cargo test --all generate_stdlib -- --nocapture` to generate new Markdown documentation for your function that will be used [to generate docs on our website](https://zoo.dev/docs/kcl). +11. Run `just redo-kcl-stdlib-docs` to generate new Markdown documentation for your function that will be used [to generate docs on our website](https://zoo.dev/docs/kcl). 12. Create a PR in GitHub. ## Bumping the version diff --git a/src/wasm-lib/kcl/benches/compiler_benchmark_criterion.rs b/src/wasm-lib/kcl/benches/compiler_benchmark_criterion.rs index 534bb262d..502fb8bf0 100644 --- a/src/wasm-lib/kcl/benches/compiler_benchmark_criterion.rs +++ b/src/wasm-lib/kcl/benches/compiler_benchmark_criterion.rs @@ -1,11 +1,5 @@ use criterion::{black_box, criterion_group, criterion_main, Criterion}; -pub fn bench_lex(c: &mut Criterion) { - c.bench_function("lex_cube", |b| b.iter(|| lex(CUBE_PROGRAM))); - c.bench_function("lex_big_kitt", |b| b.iter(|| lex(KITT_PROGRAM))); - c.bench_function("lex_pipes_on_pipes", |b| b.iter(|| lex(PIPES_PROGRAM))); -} - pub fn bench_parse(c: &mut Criterion) { for (name, file) in [ ("pipes_on_pipes", PIPES_PROGRAM), @@ -13,27 +7,22 @@ pub fn bench_parse(c: &mut Criterion) { ("cube", CUBE_PROGRAM), ("math", MATH_PROGRAM), ("mike_stress_test", MIKE_STRESS_TEST_PROGRAM), + ("koch snowflake", LSYSTEM_KOCH_SNOWFLAKE_PROGRAM), ] { - let tokens = kcl_lib::token::lexer(file).unwrap(); c.bench_function(&format!("parse_{name}"), move |b| { - let tok = tokens.clone(); b.iter(move || { - let parser = kcl_lib::parser::Parser::new(tok.clone()); - black_box(parser.ast().unwrap()); + black_box(kcl_lib::Program::parse(file).unwrap()); }) }); } } -fn lex(program: &str) { - black_box(kcl_lib::token::lexer(program).unwrap()); -} - -criterion_group!(benches, bench_lex, bench_parse); +criterion_group!(benches, bench_parse); criterion_main!(benches); const KITT_PROGRAM: &str = include_str!("../../tests/executor/inputs/kittycad_svg.kcl"); const PIPES_PROGRAM: &str = include_str!("../../tests/executor/inputs/pipes_on_pipes.kcl"); const CUBE_PROGRAM: &str = include_str!("../../tests/executor/inputs/cube.kcl"); const MATH_PROGRAM: &str = include_str!("../../tests/executor/inputs/math.kcl"); -const MIKE_STRESS_TEST_PROGRAM: &str = include_str!("../../tests/executor/inputs/mike_stress_test.kcl"); +const MIKE_STRESS_TEST_PROGRAM: &str = include_str!("../tests/mike_stress_test/input.kcl"); +const LSYSTEM_KOCH_SNOWFLAKE_PROGRAM: &str = include_str!("../../tests/executor/inputs/lsystem.kcl"); diff --git a/src/wasm-lib/kcl/benches/compiler_benchmark_iai.rs b/src/wasm-lib/kcl/benches/compiler_benchmark_iai.rs index bdaf5d0c3..a57e32137 100644 --- a/src/wasm-lib/kcl/benches/compiler_benchmark_iai.rs +++ b/src/wasm-lib/kcl/benches/compiler_benchmark_iai.rs @@ -1,23 +1,7 @@ use iai::black_box; pub fn parse(program: &str) { - let tokens = kcl_lib::token::lexer(program).unwrap(); - let tok = tokens.clone(); - let parser = kcl_lib::parser::Parser::new(tok.clone()); - black_box(parser.ast().unwrap()); -} - -fn lex_kitt() { - black_box(kcl_lib::token::lexer(KITT_PROGRAM).unwrap()); -} -fn lex_pipes() { - black_box(kcl_lib::token::lexer(PIPES_PROGRAM).unwrap()); -} -fn lex_cube() { - black_box(kcl_lib::token::lexer(CUBE_PROGRAM).unwrap()); -} -fn lex_math() { - black_box(kcl_lib::token::lexer(MATH_PROGRAM).unwrap()); + black_box(kcl_lib::Program::parse(program).unwrap()); } fn parse_kitt() { @@ -32,19 +16,20 @@ fn parse_cube() { fn parse_math() { parse(MATH_PROGRAM) } +fn parse_lsystem() { + parse(LSYSTEM_PROGRAM) +} iai::main! { - lex_kitt, - lex_pipes, - lex_cube, - lex_math, parse_kitt, parse_pipes, parse_cube, parse_math, + parse_lsystem, } const KITT_PROGRAM: &str = include_str!("../../tests/executor/inputs/kittycad_svg.kcl"); const PIPES_PROGRAM: &str = include_str!("../../tests/executor/inputs/pipes_on_pipes.kcl"); const CUBE_PROGRAM: &str = include_str!("../../tests/executor/inputs/cube.kcl"); const MATH_PROGRAM: &str = include_str!("../../tests/executor/inputs/math.kcl"); +const LSYSTEM_PROGRAM: &str = include_str!("../../tests/executor/inputs/lsystem.kcl"); diff --git a/src/wasm-lib/kcl/benches/digest_benchmark.rs b/src/wasm-lib/kcl/benches/digest_benchmark.rs index 65e60de4d..5780cb1d5 100644 --- a/src/wasm-lib/kcl/benches/digest_benchmark.rs +++ b/src/wasm-lib/kcl/benches/digest_benchmark.rs @@ -7,9 +7,9 @@ pub fn bench_digest(c: &mut Criterion) { ("cube", CUBE_PROGRAM), ("math", MATH_PROGRAM), ("mike_stress_test", MIKE_STRESS_TEST_PROGRAM), + ("lsystem", LSYSTEM_PROGRAM), ] { - let tokens = kcl_lib::token::lexer(file).unwrap(); - let prog = kcl_lib::parser::Parser::new(tokens).ast().unwrap(); + let prog = kcl_lib::Program::parse_no_errs(file).unwrap(); c.bench_function(&format!("digest_{name}"), move |b| { let prog = prog.clone(); @@ -28,4 +28,5 @@ const KITT_PROGRAM: &str = include_str!("../../tests/executor/inputs/kittycad_sv const PIPES_PROGRAM: &str = include_str!("../../tests/executor/inputs/pipes_on_pipes.kcl"); const CUBE_PROGRAM: &str = include_str!("../../tests/executor/inputs/cube.kcl"); const MATH_PROGRAM: &str = include_str!("../../tests/executor/inputs/math.kcl"); -const MIKE_STRESS_TEST_PROGRAM: &str = include_str!("../../tests/executor/inputs/mike_stress_test.kcl"); +const MIKE_STRESS_TEST_PROGRAM: &str = include_str!("../tests/mike_stress_test/input.kcl"); +const LSYSTEM_PROGRAM: &str = include_str!("../../tests/executor/inputs/lsystem.kcl"); diff --git a/src/wasm-lib/kcl/benches/executor_benchmark_criterion.rs b/src/wasm-lib/kcl/benches/executor_benchmark_criterion.rs index 613c16436..3bddbb9de 100644 --- a/src/wasm-lib/kcl/benches/executor_benchmark_criterion.rs +++ b/src/wasm-lib/kcl/benches/executor_benchmark_criterion.rs @@ -1,5 +1,5 @@ use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion}; -use kcl_lib::{settings::types::UnitLength::Mm, test_server}; +use kcl_lib::{test_server, UnitLength::Mm}; use tokio::runtime::Runtime; pub fn bench_execute(c: &mut Criterion) { @@ -8,6 +8,7 @@ pub fn bench_execute(c: &mut Criterion) { ("cube", CUBE_PROGRAM), ("server_rack_lite", SERVER_RACK_LITE_PROGRAM), ("server_rack_heavy", SERVER_RACK_HEAVY_PROGRAM), + ("lsystem", LSYSTEM_PROGRAM), ] { let mut group = c.benchmark_group("executor"); // Configure Criterion.rs to detect smaller differences and increase sample size to improve @@ -17,7 +18,7 @@ pub fn bench_execute(c: &mut Criterion) { let rt = Runtime::new().unwrap(); // Spawn a future onto the runtime b.iter(|| { - rt.block_on(test_server::execute_and_snapshot(s, Mm)).unwrap(); + rt.block_on(test_server::execute_and_snapshot(s, Mm, None)).unwrap(); }); }); group.finish(); @@ -37,7 +38,7 @@ pub fn bench_lego(c: &mut Criterion) { let code = LEGO_PROGRAM.replace("{{N}}", &size.to_string()); // Spawn a future onto the runtime b.iter(|| { - rt.block_on(test_server::execute_and_snapshot(&code, Mm)).unwrap(); + rt.block_on(test_server::execute_and_snapshot(&code, Mm, None)).unwrap(); }); }); } @@ -52,3 +53,4 @@ const CUBE_PROGRAM: &str = include_str!("../../tests/executor/inputs/cube.kcl"); const SERVER_RACK_HEAVY_PROGRAM: &str = include_str!("../../tests/executor/inputs/server-rack-heavy.kcl"); const SERVER_RACK_LITE_PROGRAM: &str = include_str!("../../tests/executor/inputs/server-rack-lite.kcl"); const LEGO_PROGRAM: &str = include_str!("../../tests/executor/inputs/slow_lego.kcl.tmpl"); +const LSYSTEM_PROGRAM: &str = include_str!("../../tests/executor/inputs/lsystem.kcl"); diff --git a/src/wasm-lib/kcl/benches/executor_benchmark_iai.rs b/src/wasm-lib/kcl/benches/executor_benchmark_iai.rs index f7448be52..5670dcde0 100644 --- a/src/wasm-lib/kcl/benches/executor_benchmark_iai.rs +++ b/src/wasm-lib/kcl/benches/executor_benchmark_iai.rs @@ -3,7 +3,7 @@ use iai::black_box; async fn execute_server_rack_heavy() { let code = SERVER_RACK_HEAVY_PROGRAM; black_box( - kcl_lib::test_server::execute_and_snapshot(code, kcl_lib::settings::types::UnitLength::Mm) + kcl_lib::test_server::execute_and_snapshot(code, kcl_lib::UnitLength::Mm, None) .await .unwrap(), ); @@ -12,7 +12,7 @@ async fn execute_server_rack_heavy() { async fn execute_server_rack_lite() { let code = SERVER_RACK_LITE_PROGRAM; black_box( - kcl_lib::test_server::execute_and_snapshot(code, kcl_lib::settings::types::UnitLength::Mm) + kcl_lib::test_server::execute_and_snapshot(code, kcl_lib::UnitLength::Mm, None) .await .unwrap(), ); diff --git a/src/wasm-lib/kcl/benches/lsp_semantic_tokens_benchmark_criterion.rs b/src/wasm-lib/kcl/benches/lsp_semantic_tokens_benchmark_criterion.rs index 22dba2d18..84f1b4f51 100644 --- a/src/wasm-lib/kcl/benches/lsp_semantic_tokens_benchmark_criterion.rs +++ b/src/wasm-lib/kcl/benches/lsp_semantic_tokens_benchmark_criterion.rs @@ -1,5 +1,5 @@ use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion}; -use kcl_lib::lsp::test_util::kcl_lsp_server; +use kcl_lib::kcl_lsp_server; use tokio::runtime::Runtime; use tower_lsp::LanguageServer; @@ -42,6 +42,7 @@ fn bench_kcl_lsp_semantic_tokens(c: &mut Criterion) { ("math", MATH_PROGRAM), ("mike_stress_test", MIKE_STRESS_TEST_PROGRAM), ("global_tags", GLOBAL_TAGS_FILE), + ("lsystem", LSYSTEM_PROGRAM), ] { c.bench_with_input(BenchmarkId::new("semantic_tokens_", name), &code, |b, &s| { let rt = Runtime::new().unwrap(); @@ -61,5 +62,6 @@ const KITT_PROGRAM: &str = include_str!("../../tests/executor/inputs/kittycad_sv const PIPES_PROGRAM: &str = include_str!("../../tests/executor/inputs/pipes_on_pipes.kcl"); const CUBE_PROGRAM: &str = include_str!("../../tests/executor/inputs/cube.kcl"); const MATH_PROGRAM: &str = include_str!("../../tests/executor/inputs/math.kcl"); -const MIKE_STRESS_TEST_PROGRAM: &str = include_str!("../../tests/executor/inputs/mike_stress_test.kcl"); +const MIKE_STRESS_TEST_PROGRAM: &str = include_str!("../tests/mike_stress_test/input.kcl"); const GLOBAL_TAGS_FILE: &str = include_str!("../../tests/executor/inputs/global-tags.kcl"); +const LSYSTEM_PROGRAM: &str = include_str!("../../tests/executor/inputs/lsystem.kcl"); diff --git a/src/wasm-lib/kcl/benches/lsp_semantic_tokens_benchmark_iai.rs b/src/wasm-lib/kcl/benches/lsp_semantic_tokens_benchmark_iai.rs index d1621845f..5b71bda94 100644 --- a/src/wasm-lib/kcl/benches/lsp_semantic_tokens_benchmark_iai.rs +++ b/src/wasm-lib/kcl/benches/lsp_semantic_tokens_benchmark_iai.rs @@ -1,5 +1,5 @@ use iai::black_box; -use kcl_lib::lsp::test_util::kcl_lsp_server; +use kcl_lib::kcl_lsp_server; use tower_lsp::LanguageServer; async fn kcl_lsp_semantic_tokens(code: &str) { diff --git a/src/wasm-lib/kcl/common.kcl b/src/wasm-lib/kcl/common.kcl new file mode 100644 index 000000000..31463d55e --- /dev/null +++ b/src/wasm-lib/kcl/common.kcl @@ -0,0 +1,20 @@ +// This file is used by the import docs. + +export fn width = () => { + return 10 +} + +export fn height = () => { + return 10 +} + +export fn buildSketch = (plane, offset) => { + w = width() + h = height() + return startSketchOn(plane) + |> startProfileAt(offset, %) + |> line([w, 0], %) + |> line([0, h], %) + |> line([-w, 0], %) + |> close(%) +} diff --git a/src/wasm-lib/kcl/fuzz/Cargo.lock b/src/wasm-lib/kcl/fuzz/Cargo.lock index f1e57855c..5c0ad7caa 100644 --- a/src/wasm-lib/kcl/fuzz/Cargo.lock +++ b/src/wasm-lib/kcl/fuzz/Cargo.lock @@ -72,20 +72,26 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" dependencies = [ "backtrace", ] +[[package]] +name = "approx" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08abcc3b4e9339e33a3d0a5ed15d84a687350c05689d825e0f6655eef9e76a94" + [[package]] name = "approx" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" dependencies = [ - "num-traits", + "num-traits 0.2.19", ] [[package]] @@ -110,7 +116,7 @@ dependencies = [ "futures-sink", "log", "pin-project-lite", - "thiserror", + "thiserror 1.0.63", ] [[package]] @@ -121,18 +127,18 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.93", ] [[package]] name = "async-trait" -version = "0.1.81" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.93", ] [[package]] @@ -143,7 +149,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.93", ] [[package]] @@ -173,12 +179,6 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[package]] name = "base64" version = "0.22.1" @@ -195,7 +195,7 @@ dependencies = [ "libm", "num-bigint", "num-integer", - "num-traits", + "num-traits 0.2.19", "serde", ] @@ -216,9 +216,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "bitvec" @@ -243,19 +243,19 @@ dependencies = [ [[package]] name = "bson" -version = "2.11.0" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a88e82b9106923b5c4d6edfca9e7db958d4e98a478ec115022e81b9b38e2c8" +checksum = "068208f2b6fcfa27a7f1ee37488d2bb8ba2640f68f5475d08e1d9130696aba59" dependencies = [ "ahash", "base64 0.13.1", "bitvec", "chrono", "hex", - "indexmap 2.2.6", + "indexmap 2.7.0", "js-sys", "once_cell", - "rand", + "rand 0.8.5", "serde", "serde_bytes", "serde_json", @@ -289,9 +289,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.6.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" dependencies = [ "serde", ] @@ -314,15 +314,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "chrono" -version = "0.4.38" +name = "cfg_aliases" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "cgmath" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a4b57c8f4e3a2e9ac07e0f6abc9c24b6fc9e1b54c3478cfb598f3d0023e51c" +dependencies = [ + "approx 0.1.1", + "mint", + "num-traits 0.1.43", + "rand 0.4.6", +] + +[[package]] +name = "chrono" +version = "0.4.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", - "num-traits", + "num-traits 0.2.19", "serde", "wasm-bindgen", "windows-targets 0.52.5", @@ -349,9 +367,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.9.4" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" dependencies = [ "core-foundation-sys", "libc", @@ -359,9 +377,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" @@ -418,7 +436,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.75", + "syn 2.0.93", ] [[package]] @@ -429,7 +447,7 @@ checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ "darling_core", "quote", - "syn 2.0.75", + "syn 2.0.93", ] [[package]] @@ -447,9 +465,9 @@ dependencies = [ [[package]] name = "dashmap" -version = "6.0.1" +version = "6.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "804c8821570c3f8b70230c2ba75ffa5c0f9a4189b9a432b6656c536712acae28" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" dependencies = [ "cfg-if", "crossbeam-utils", @@ -465,29 +483,6 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" -[[package]] -name = "databake" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a04fbfbecca8f0679c8c06fef907594adcc3e2052e11163a6d30535a1a5604d" -dependencies = [ - "databake-derive", - "proc-macro2", - "quote", -] - -[[package]] -name = "databake-derive" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4078275de501a61ceb9e759d37bdd3d7210e654dbc167ac1a3678ef4435ed57b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.75", - "synstructure", -] - [[package]] name = "deranged" version = "0.3.11" @@ -499,7 +494,7 @@ dependencies = [ [[package]] name = "derive-docs" -version = "0.1.25" +version = "0.1.33" dependencies = [ "Inflector", "convert_case", @@ -509,7 +504,7 @@ dependencies = [ "regex", "serde", "serde_tokenstream", - "syn 2.0.75", + "syn 2.0.93", ] [[package]] @@ -520,7 +515,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.93", ] [[package]] @@ -541,7 +536,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.93", ] [[package]] @@ -557,12 +552,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" [[package]] -name = "encoding_rs" -version = "0.8.34" +name = "enum-iterator" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +checksum = "c280b9e6b3ae19e152d8e31cf47f18389781e119d4013a2a2bb0180e5facc635" dependencies = [ - "cfg-if", + "enum-iterator-derive", +] + +[[package]] +name = "enum-iterator-derive" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.93", ] [[package]] @@ -571,6 +577,16 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "euler" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f19d11568a4a46aee488bdab3a2963e5e2c3cfd6091aa0abceaddcea82c0bc1" +dependencies = [ + "approx 0.1.1", + "cgmath", +] + [[package]] name = "fdeflate" version = "0.3.4" @@ -618,6 +634,12 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "fuchsia-cprng" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" + [[package]] name = "funty" version = "2.0.0" @@ -626,9 +648,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -641,9 +663,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -651,15 +673,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -668,38 +690,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.93", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -757,7 +779,7 @@ dependencies = [ "inflections", "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.93", ] [[package]] @@ -772,25 +794,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "h2" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap 2.2.6", - "slab", - "tokio", - "tokio-util", - "tracing", -] - [[package]] name = "hashbrown" version = "0.12.3" @@ -803,6 +806,12 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + [[package]] name = "heck" version = "0.4.1" @@ -823,20 +832,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "http" -version = "0.2.12" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -845,12 +843,24 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.6" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 0.2.12", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http", + "http-body", "pin-project-lite", ] @@ -860,48 +870,60 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - [[package]] name = "hyper" -version = "0.14.28" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" dependencies = [ "bytes", "futures-channel", - "futures-core", "futures-util", - "h2", - "http 0.2.12", + "http", "http-body", "httparse", - "httpdate", "itoa", "pin-project-lite", - "socket2", + "smallvec", "tokio", - "tower-service", - "tracing", "want", ] [[package]] name = "hyper-rustls" -version = "0.24.2" +version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", - "http 0.2.12", + "http", "hyper", - "rustls 0.21.12", + "hyper-util", + "rustls", + "rustls-pki-types", "tokio", - "tokio-rustls 0.24.1", + "tokio-rustls", + "tower-service", + "webpki-roots", +] + +[[package]] +name = "hyper-util" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", ] [[package]] @@ -927,6 +949,124 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.93", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -935,23 +1075,34 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", ] [[package]] name = "image" -version = "0.25.2" +version = "0.25.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99314c8a2152b8ddb211f924cdae532d8c5e4c8bb54728e12fff1b0cd5963a10" +checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" dependencies = [ "bytemuck", "byteorder-lite", - "num-traits", + "num-traits 0.2.19", "png", ] @@ -963,16 +1114,18 @@ checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", + "serde", ] [[package]] name = "indexmap" -version = "2.2.6" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", - "hashbrown 0.14.5", + "hashbrown 0.15.2", + "serde", ] [[package]] @@ -1022,47 +1175,53 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ + "once_cell", "wasm-bindgen", ] [[package]] name = "kcl-lib" -version = "0.2.10" +version = "0.2.29" dependencies = [ "anyhow", - "approx", + "approx 0.5.1", "async-recursion", "async-trait", "base64 0.22.1", "bson", "chrono", "convert_case", - "dashmap 6.0.1", - "databake", + "dashmap 6.1.0", "derive-docs", + "fnv", "form_urlencoded", "futures", "git_rev", "gltf-json", - "http 0.2.12", + "http", "image", + "indexmap 2.7.0", "js-sys", "kittycad", + "kittycad-modeling-cmds", "lazy_static", "measurements", + "miette", "mime_guess", - "parse-display", + "parse-display 0.9.1", + "regex", "reqwest", + "rgba_simple", "ropey", "schemars", "serde", "serde_json", "sha2", - "thiserror", + "thiserror 2.0.9", "tokio", "tokio-tungstenite", "toml", @@ -1075,7 +1234,8 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winnow 0.5.40", + "web-time", + "winnow", "zip", ] @@ -1089,9 +1249,9 @@ dependencies = [ [[package]] name = "kittycad" -version = "0.3.17" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbb7c076d64ad00a29ae900108707d1bbb583944d4b2d005e1eca9914a18c7c2" +checksum = "933cb5f77624386c87d296e3fd493daf50156d1cbfa03b9f333a6d4da2896369" dependencies = [ "anyhow", "async-trait", @@ -1102,26 +1262,86 @@ dependencies = [ "data-encoding", "format_serde_error", "futures", - "http 0.2.12", + "http", "itertools 0.13.0", "log", "mime_guess", - "parse-display", + "parse-display 0.10.0", "phonenumber", - "rand", + "rand 0.8.5", "reqwest", "schemars", "serde", "serde_bytes", "serde_json", "serde_urlencoded", - "thiserror", + "thiserror 2.0.9", "tokio", "tracing", "url", "uuid", ] +[[package]] +name = "kittycad-modeling-cmds" +version = "0.2.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a8086c496d76962266614fea08adb3f1e075f00c2c04954c9d1d00f1da2a11" +dependencies = [ + "anyhow", + "chrono", + "data-encoding", + "enum-iterator", + "enum-iterator-derive", + "euler", + "http", + "kittycad-modeling-cmds-macros", + "kittycad-unit-conversion-derive", + "measurements", + "parse-display 0.9.1", + "parse-display-derive 0.9.1", + "schemars", + "serde", + "serde_bytes", + "serde_json", + "uuid", +] + +[[package]] +name = "kittycad-modeling-cmds-macros" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb9bb1a594541b878adc1c8dcb821328774bf7aa09b65b104a206b1291a5235c" +dependencies = [ + "kittycad-modeling-cmds-macros-impl", + "proc-macro2", + "quote", + "syn 2.0.93", +] + +[[package]] +name = "kittycad-modeling-cmds-macros-impl" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6607507a8a0e4273b943179f0a3ef8e90712308d1d3095246040c29cfdbf985b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.93", +] + +[[package]] +name = "kittycad-unit-conversion-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7001c46a92c1edce6722a3900539b198230980799035f02d92b4e7df3fc08738" +dependencies = [ + "inflections", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -1130,9 +1350,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.155" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libfuzzer-sys" @@ -1157,6 +1377,12 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +[[package]] +name = "litemap" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" + [[package]] name = "lock_api" version = "0.4.12" @@ -1213,6 +1439,29 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "miette" +version = "7.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317f146e2eb7021892722af37cf1b971f0a70c8406f487e24952667616192c64" +dependencies = [ + "cfg-if", + "miette-derive", + "thiserror 1.0.63", + "unicode-width", +] + +[[package]] +name = "miette-derive" +version = "7.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23c9b935fbe1d6cbd1dac857b54a688145e2d93f48db36010514d0f612d0ad67" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.93", +] + [[package]] name = "mime" version = "0.3.17" @@ -1254,6 +1503,12 @@ dependencies = [ "adler2", ] +[[package]] +name = "mint" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e53debba6bda7a793e5f99b8dacf19e626084f525f7829104ba9898f367d85ff" + [[package]] name = "mio" version = "1.0.2" @@ -1283,7 +1538,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" dependencies = [ "num-integer", - "num-traits", + "num-traits 0.2.19", ] [[package]] @@ -1298,7 +1553,16 @@ version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "num-traits", + "num-traits 0.2.19", +] + +[[package]] +name = "num-traits" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" +dependencies = [ + "num-traits 0.2.19", ] [[package]] @@ -1321,9 +1585,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "oncemutex" @@ -1366,9 +1630,20 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "914a1c2265c98e2446911282c6ac86d8524f495792c38c5bd884f80499c7538a" dependencies = [ - "parse-display-derive", + "parse-display-derive 0.9.1", "regex", - "regex-syntax 0.8.3", + "regex-syntax 0.8.5", +] + +[[package]] +name = "parse-display" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287d8d3ebdce117b8539f59411e4ed9ec226e0a4153c7f55495c6070d68e6f72" +dependencies = [ + "parse-display-derive 0.10.0", + "regex", + "regex-syntax 0.8.5", ] [[package]] @@ -1380,9 +1655,23 @@ dependencies = [ "proc-macro2", "quote", "regex", - "regex-syntax 0.8.3", + "regex-syntax 0.8.5", "structmeta", - "syn 2.0.75", + "syn 2.0.93", +] + +[[package]] +name = "parse-display-derive" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fc048687be30d79502dea2f623d052f3a074012c6eac41726b7ab17213616b1" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "regex-syntax 0.8.5", + "structmeta", + "syn 2.0.93", ] [[package]] @@ -1409,7 +1698,7 @@ dependencies = [ "serde", "serde_derive", "strum", - "thiserror", + "thiserror 1.0.63", ] [[package]] @@ -1429,7 +1718,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.93", ] [[package]] @@ -1470,34 +1759,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] -name = "proc-macro-error" -version = "1.0.4" +name = "proc-macro-error-attr2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" dependencies = [ - "proc-macro-error-attr", "proc-macro2", "quote", - "syn 1.0.109", - "version_check", ] [[package]] -name = "proc-macro-error-attr" -version = "1.0.4" +name = "proc-macro-error2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" dependencies = [ + "proc-macro-error-attr2", "proc-macro2", "quote", - "version_check", + "syn 2.0.93", ] [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] @@ -1512,10 +1799,62 @@ dependencies = [ ] [[package]] -name = "quote" -version = "1.0.36" +name = "quinn" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror 2.0.9", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" +dependencies = [ + "bytes", + "getrandom", + "rand 0.8.5", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.9", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "quote" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -1526,6 +1865,19 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +[[package]] +name = "rand" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" +dependencies = [ + "fuchsia-cprng", + "libc", + "rand_core 0.3.1", + "rdrand", + "winapi", +] + [[package]] name = "rand" version = "0.8.5" @@ -1534,7 +1886,7 @@ checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", - "rand_core", + "rand_core 0.6.4", ] [[package]] @@ -1544,9 +1896,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", ] +[[package]] +name = "rand_core" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" +dependencies = [ + "rand_core 0.4.2", +] + +[[package]] +name = "rand_core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" + [[package]] name = "rand_core" version = "0.6.4" @@ -1556,36 +1923,45 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rdrand" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" +dependencies = [ + "rand_core 0.3.1", +] + [[package]] name = "redox_syscall" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", ] [[package]] name = "regex" -version = "1.10.4" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", "regex-automata", - "regex-syntax 0.8.3", + "regex-syntax 0.8.5", ] [[package]] name = "regex-automata" -version = "0.4.6" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.3", + "regex-syntax 0.8.5", ] [[package]] @@ -1608,26 +1984,26 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.11.27" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "bytes", - "encoding_rs", "futures-core", "futures-util", - "h2", - "http 0.2.12", + "http", "http-body", + "http-body-util", "hyper", "hyper-rustls", + "hyper-util", "ipnet", "js-sys", "log", @@ -1636,15 +2012,16 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.21.12", - "rustls-pemfile 1.0.4", + "quinn", + "rustls", + "rustls-pemfile", + "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", - "system-configuration", "tokio", - "tokio-rustls 0.24.1", + "tokio-rustls", "tokio-util", "tower-service", "url", @@ -1656,6 +2033,12 @@ dependencies = [ "winreg", ] +[[package]] +name = "rgba_simple" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6cd655523701785087f69900df39892fb7b9b0721aa67682f571c38c32ac58a" + [[package]] name = "ring" version = "0.17.8" @@ -1688,16 +2071,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] -name = "rustls" -version = "0.21.12" +name = "rustc-hash" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "log", - "ring", - "rustls-webpki 0.101.7", - "sct", -] +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" [[package]] name = "rustls" @@ -1706,34 +2083,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" dependencies = [ "once_cell", + "ring", "rustls-pki-types", - "rustls-webpki 0.102.6", + "rustls-webpki", "subtle", "zeroize", ] [[package]] name = "rustls-native-certs" -version = "0.7.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" dependencies = [ "openssl-probe", - "rustls-pemfile 2.1.2", "rustls-pki-types", "schannel", "security-framework", ] -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - [[package]] name = "rustls-pemfile" version = "2.1.2" @@ -1746,18 +2114,11 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.7.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" - -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" dependencies = [ - "ring", - "untrusted", + "web-time", ] [[package]] @@ -1802,6 +2163,8 @@ dependencies = [ "bytes", "chrono", "dyn-clone", + "indexmap 1.9.3", + "indexmap 2.7.0", "schemars_derive", "serde", "serde_json", @@ -1818,7 +2181,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.75", + "syn 2.0.93", ] [[package]] @@ -1827,23 +2190,13 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "security-framework" -version = "2.11.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +checksum = "81d3f8c9bfcc3cbb6b0179eb57042d75b1582bdc65c3cb95f3fa999509c03cbc" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "core-foundation", "core-foundation-sys", "libc", @@ -1852,9 +2205,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.0" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +checksum = "1863fd3768cd83c56a7f60faa4dc0d403f1b6df0a38c3c25f44b7894e45370d5" dependencies = [ "core-foundation-sys", "libc", @@ -1862,31 +2215,31 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.208" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff085d2cb684faa248efb494c39b68e522822ac0de72ccf08109abde717cfb2" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] [[package]] name = "serde_bytes" -version = "0.11.14" +version = "0.11.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.208" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24008e81ff7613ed8e5ba0cfaf24e2c2f1e5b8a0495711e44fcd4882fca62bcf" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.93", ] [[package]] @@ -1897,16 +2250,16 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.93", ] [[package]] name = "serde_json" -version = "1.0.125" +version = "1.0.134" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c8e735a073ccf5be70aa8066aa984eaf2fa000db6c8d0100ae605b366d31ed" +checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" dependencies = [ - "indexmap 2.2.6", + "indexmap 2.7.0", "itoa", "memchr", "ryu", @@ -1921,7 +2274,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.93", ] [[package]] @@ -1942,7 +2295,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.75", + "syn 2.0.93", ] [[package]] @@ -2037,6 +2390,12 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "str_indices" version = "0.4.3" @@ -2058,7 +2417,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive", - "syn 2.0.75", + "syn 2.0.93", ] [[package]] @@ -2069,7 +2428,7 @@ checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.93", ] [[package]] @@ -2091,7 +2450,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.75", + "syn 2.0.93", ] [[package]] @@ -2107,14 +2466,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", + "quote", "unicode-ident", ] [[package]] name = "syn" -version = "2.0.75" +version = "2.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6af063034fc1935ede7be0122941bafa9bacb949334d090b77ca98b5817c7d9" +checksum = "9c786062daee0d6db1132800e623df74274a0a87322d8e183338e01b3d98d058" dependencies = [ "proc-macro2", "quote", @@ -2123,9 +2483,9 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "0.1.2" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" [[package]] name = "synstructure" @@ -2135,28 +2495,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", -] - -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", + "syn 2.0.93", ] [[package]] @@ -2180,7 +2519,16 @@ version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.63", +] + +[[package]] +name = "thiserror" +version = "2.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" +dependencies = [ + "thiserror-impl 2.0.9", ] [[package]] @@ -2191,7 +2539,18 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.93", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.93", ] [[package]] @@ -2225,6 +2584,16 @@ dependencies = [ "time-core", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" version = "1.6.0" @@ -2242,9 +2611,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.39.3" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" dependencies = [ "backtrace", "bytes", @@ -2266,17 +2635,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", -] - -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls 0.21.12", - "tokio", + "syn 2.0.93", ] [[package]] @@ -2285,24 +2644,24 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.12", + "rustls", "rustls-pki-types", "tokio", ] [[package]] name = "tokio-tungstenite" -version = "0.23.1" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6989540ced10490aaf14e6bad2e3d33728a2813310a0c71d1574304c49631cd" +checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" dependencies = [ "futures-util", "log", - "rustls 0.23.12", + "rustls", "rustls-native-certs", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls", "tungstenite", ] @@ -2346,11 +2705,11 @@ version = "0.22.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" dependencies = [ - "indexmap 2.2.6", + "indexmap 2.7.0", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.18", + "winnow", ] [[package]] @@ -2405,7 +2764,7 @@ checksum = "84fd902d4e0b9a4b27f2f440108dc034e1758628a9b702f8ec61ad66355422fa" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.93", ] [[package]] @@ -2433,7 +2792,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.93", ] [[package]] @@ -2453,13 +2812,15 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "ts-rs" -version = "9.0.1" +version = "10.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b44017f9f875786e543595076374b9ef7d13465a518dd93d6ccdbf5b432dde8c" +checksum = "e640d9b0964e9d39df633548591090ab92f7a4567bc31d3891af23471a3365c6" dependencies = [ "chrono", + "indexmap 2.7.0", + "lazy_static", "serde_json", - "thiserror", + "thiserror 2.0.9", "ts-rs-macros", "url", "uuid", @@ -2467,33 +2828,33 @@ dependencies = [ [[package]] name = "ts-rs-macros" -version = "9.0.1" +version = "10.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c88cc88fd23b5a04528f3a8436024f20010a16ec18eb23c164b1242f65860130" +checksum = "0e9d8656589772eeec2cf7a8264d9cda40fb28b9bc53118ceb9e8c07f8f38730" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.93", "termcolor", ] [[package]] name = "tungstenite" -version = "0.23.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e2ce1e47ed2994fd43b04c8f618008d4cabdd5ee34027cf14f9d918edd9c8" +checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" dependencies = [ "byteorder", "bytes", "data-encoding", - "http 1.1.0", + "http", "httparse", "log", - "rand", - "rustls 0.23.12", + "rand 0.8.5", + "rustls", "rustls-pki-types", "sha1", - "thiserror", + "thiserror 1.0.63", "utf-8", ] @@ -2512,33 +2873,24 @@ dependencies = [ "version_check", ] -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - [[package]] name = "unicode-segmentation" version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + [[package]] name = "untrusted" version = "0.9.0" @@ -2547,9 +2899,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", @@ -2570,10 +2922,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] -name = "uuid" -version = "1.10.0" +name = "utf16_iter" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ "getrandom", "serde", @@ -2582,9 +2946,9 @@ dependencies = [ [[package]] name = "validator" -version = "0.18.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db79c75af171630a3148bd3e6d7c4f42b6a9a014c2945bc5ed0020cbb8d9478e" +checksum = "d0b4a29d8709210980a09379f27ee31549b73292c87ab9899beee1c0d3be6303" dependencies = [ "idna", "once_cell", @@ -2598,16 +2962,16 @@ dependencies = [ [[package]] name = "validator_derive" -version = "0.18.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55591299b7007f551ed1eb79a684af7672c19c3193fb9e0a31936987bb2438ec" +checksum = "bac855a2ce6f843beb229757e6e570a42e837bcb15e5f449dd48d5747d41bf77" dependencies = [ "darling", "once_cell", - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.93", ] [[package]] @@ -2633,46 +2997,47 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.93", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.42" +version = "0.4.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2680,22 +3045,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.93", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "wasm-streams" @@ -2712,9 +3077,19 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ "js-sys", "wasm-bindgen", @@ -2722,9 +3097,28 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.25.4" +version = "0.26.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" @@ -2735,6 +3129,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "windows-core" version = "0.52.0" @@ -2883,15 +3283,6 @@ version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" -[[package]] -name = "winnow" -version = "0.5.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] - [[package]] name = "winnow" version = "0.6.18" @@ -2903,14 +3294,26 @@ dependencies = [ [[package]] name = "winreg" -version = "0.50.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" dependencies = [ "cfg-if", "windows-sys 0.48.0", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "wyz" version = "0.5.1" @@ -2929,6 +3332,30 @@ dependencies = [ "linked-hash-map", ] +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.93", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.7.34" @@ -2946,7 +3373,28 @@ checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.93", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.93", + "synstructure", ] [[package]] @@ -2955,6 +3403,28 @@ version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.93", +] + [[package]] name = "zip" version = "2.2.0" @@ -2965,7 +3435,7 @@ dependencies = [ "crc32fast", "crossbeam-utils", "displaydoc", - "indexmap 2.2.6", + "indexmap 2.7.0", "memchr", - "thiserror", + "thiserror 1.0.63", ] diff --git a/src/wasm-lib/kcl/fuzz/Cargo.toml b/src/wasm-lib/kcl/fuzz/Cargo.toml index f75b8420d..a9960f1a4 100644 --- a/src/wasm-lib/kcl/fuzz/Cargo.toml +++ b/src/wasm-lib/kcl/fuzz/Cargo.toml @@ -19,6 +19,12 @@ path = ".." [workspace] members = ["."] +[workspace.lints.clippy] +assertions_on_result_states = "warn" +dbg_macro = "warn" +iter_over_hash_type = "warn" +lossy_float_literal = "warn" + [profile.release] debug = 1 diff --git a/src/wasm-lib/kcl/fuzz/fuzz_targets/parser.rs b/src/wasm-lib/kcl/fuzz/fuzz_targets/parser.rs index 5b8b8d792..456a08bc5 100644 --- a/src/wasm-lib/kcl/fuzz/fuzz_targets/parser.rs +++ b/src/wasm-lib/kcl/fuzz/fuzz_targets/parser.rs @@ -3,7 +3,5 @@ use libfuzzer_sys::fuzz_target; fuzz_target!(|data: &str| { - if let Ok(v) = kcl_lib::token::lexer(data) { - let _ = kcl_lib::parser::Parser::new(v).ast(); - } + let _ = kcl_lib::Program::parse(data); }); diff --git a/src/wasm-lib/kcl/src/ast/mod.rs b/src/wasm-lib/kcl/src/ast/mod.rs deleted file mode 100644 index ff0075903..000000000 --- a/src/wasm-lib/kcl/src/ast/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod modify; -pub mod types; diff --git a/src/wasm-lib/kcl/src/ast/types/execute.rs b/src/wasm-lib/kcl/src/ast/types/execute.rs deleted file mode 100644 index 8d981c96c..000000000 --- a/src/wasm-lib/kcl/src/ast/types/execute.rs +++ /dev/null @@ -1,803 +0,0 @@ -use super::{ - human_friendly_type, ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryOperator, BinaryPart, - CallExpression, Expr, IfExpression, LiteralIdentifier, LiteralValue, MemberExpression, MemberObject, - ObjectExpression, TagDeclarator, UnaryExpression, UnaryOperator, -}; -use crate::{ - errors::{KclError, KclErrorDetails}, - executor::{ - BodyType, ExecState, ExecutorContext, KclValue, Metadata, Sketch, SourceRange, StatementKind, TagEngineInfo, - TagIdentifier, UserVal, - }, - std::FunctionKind, -}; -use async_recursion::async_recursion; -use serde_json::Value as JValue; - -impl BinaryPart { - #[async_recursion] - pub async fn get_result(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { - match self { - BinaryPart::Literal(literal) => Ok(literal.into()), - BinaryPart::Identifier(identifier) => { - let value = exec_state.memory.get(&identifier.name, identifier.into())?; - Ok(value.clone()) - } - BinaryPart::BinaryExpression(binary_expression) => binary_expression.get_result(exec_state, ctx).await, - BinaryPart::CallExpression(call_expression) => call_expression.execute(exec_state, ctx).await, - BinaryPart::UnaryExpression(unary_expression) => unary_expression.get_result(exec_state, ctx).await, - BinaryPart::MemberExpression(member_expression) => member_expression.get_result(exec_state), - BinaryPart::IfExpression(e) => e.get_result(exec_state, ctx).await, - } - } -} - -impl MemberExpression { - pub fn get_result_array(&self, exec_state: &mut ExecState, index: usize) -> Result { - let array = match &self.object { - MemberObject::MemberExpression(member_expr) => member_expr.get_result(exec_state)?, - MemberObject::Identifier(identifier) => { - let value = exec_state.memory.get(&identifier.name, identifier.into())?; - value.clone() - } - }; - - let array_json = array.get_json_value()?; - - if let serde_json::Value::Array(array) = array_json { - if let Some(value) = array.get(index) { - Ok(KclValue::UserVal(UserVal { - value: value.clone(), - meta: vec![Metadata { - source_range: self.into(), - }], - })) - } else { - Err(KclError::UndefinedValue(KclErrorDetails { - message: format!("index {} not found in array", index), - source_ranges: vec![self.clone().into()], - })) - } - } else { - Err(KclError::Semantic(KclErrorDetails { - message: format!("MemberExpression array is not an array: {:?}", array), - source_ranges: vec![self.clone().into()], - })) - } - } - - pub fn get_result(&self, exec_state: &mut ExecState) -> Result { - let property = Property::try_from(self.computed, self.property.clone(), exec_state, self.into())?; - let object = match &self.object { - // TODO: Don't use recursion here, use a loop. - MemberObject::MemberExpression(member_expr) => member_expr.get_result(exec_state)?, - MemberObject::Identifier(identifier) => { - let value = exec_state.memory.get(&identifier.name, identifier.into())?; - value.clone() - } - }; - - let object_json = object.get_json_value()?; - - // Check the property and object match -- e.g. ints for arrays, strs for objects. - match (object_json, property) { - (JValue::Object(map), Property::String(property)) => { - if let Some(value) = map.get(&property) { - Ok(KclValue::UserVal(UserVal { - value: value.clone(), - meta: vec![Metadata { - source_range: self.into(), - }], - })) - } else { - Err(KclError::UndefinedValue(KclErrorDetails { - message: format!("Property '{property}' not found in object"), - source_ranges: vec![self.clone().into()], - })) - } - } - (JValue::Object(_), p) => Err(KclError::Semantic(KclErrorDetails { - message: format!( - "Only strings can be used as the property of an object, but you're using a {}", - p.type_name() - ), - source_ranges: vec![self.clone().into()], - })), - (JValue::Array(arr), Property::Number(index)) => { - let value_of_arr: Option<&JValue> = arr.get(index); - if let Some(value) = value_of_arr { - Ok(KclValue::UserVal(UserVal { - value: value.clone(), - meta: vec![Metadata { - source_range: self.into(), - }], - })) - } else { - Err(KclError::UndefinedValue(KclErrorDetails { - message: format!("The array doesn't have any item at index {index}"), - source_ranges: vec![self.clone().into()], - })) - } - } - (JValue::Array(_), p) => Err(KclError::Semantic(KclErrorDetails { - message: format!( - "Only integers >= 0 can be used as the index of an array, but you're using a {}", - p.type_name() - ), - source_ranges: vec![self.clone().into()], - })), - (being_indexed, _) => { - let t = human_friendly_type(&being_indexed); - Err(KclError::Semantic(KclErrorDetails { - message: format!("Only arrays and objects can be indexed, but you're trying to index a {t}"), - source_ranges: vec![self.clone().into()], - })) - } - } - } -} - -impl BinaryExpression { - #[async_recursion] - pub async fn get_result(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { - let left_json_value = self.left.get_result(exec_state, ctx).await?.get_json_value()?; - let right_json_value = self.right.get_result(exec_state, ctx).await?.get_json_value()?; - - // First check if we are doing string concatenation. - if self.operator == BinaryOperator::Add { - if let (Some(left), Some(right)) = ( - parse_json_value_as_string(&left_json_value), - parse_json_value_as_string(&right_json_value), - ) { - let value = serde_json::Value::String(format!("{}{}", left, right)); - return Ok(KclValue::UserVal(UserVal { - value, - meta: vec![Metadata { - source_range: self.into(), - }], - })); - } - } - - let left = parse_json_number_as_f64(&left_json_value, self.left.clone().into())?; - let right = parse_json_number_as_f64(&right_json_value, self.right.clone().into())?; - - let value: serde_json::Value = match self.operator { - BinaryOperator::Add => (left + right).into(), - BinaryOperator::Sub => (left - right).into(), - BinaryOperator::Mul => (left * right).into(), - BinaryOperator::Div => (left / right).into(), - BinaryOperator::Mod => (left % right).into(), - BinaryOperator::Pow => (left.powf(right)).into(), - BinaryOperator::Eq => (left == right).into(), - BinaryOperator::Neq => (left != right).into(), - BinaryOperator::Gt => (left > right).into(), - BinaryOperator::Gte => (left >= right).into(), - BinaryOperator::Lt => (left < right).into(), - BinaryOperator::Lte => (left <= right).into(), - }; - - Ok(KclValue::UserVal(UserVal { - value, - meta: vec![Metadata { - source_range: self.into(), - }], - })) - } -} - -impl UnaryExpression { - pub async fn get_result(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { - if self.operator == UnaryOperator::Not { - let value = self.argument.get_result(exec_state, ctx).await?.get_json_value()?; - let Some(bool_value) = json_as_bool(&value) else { - return Err(KclError::Semantic(KclErrorDetails { - message: format!("Cannot apply unary operator ! to non-boolean value: {}", value), - source_ranges: vec![self.into()], - })); - }; - let negated = !bool_value; - return Ok(KclValue::UserVal(UserVal { - value: serde_json::Value::Bool(negated), - meta: vec![Metadata { - source_range: self.into(), - }], - })); - } - - let num = parse_json_number_as_f64( - &self.argument.get_result(exec_state, ctx).await?.get_json_value()?, - self.into(), - )?; - Ok(KclValue::UserVal(UserVal { - value: (-(num)).into(), - meta: vec![Metadata { - source_range: self.into(), - }], - })) - } -} - -pub(crate) async fn execute_pipe_body( - exec_state: &mut ExecState, - body: &[Expr], - source_range: SourceRange, - ctx: &ExecutorContext, -) -> Result { - let Some((first, body)) = body.split_first() else { - return Err(KclError::Semantic(KclErrorDetails { - message: "Pipe expressions cannot be empty".to_owned(), - source_ranges: vec![source_range], - })); - }; - // Evaluate the first element in the pipeline. - // They use the pipe_value from some AST node above this, so that if pipe expression is nested in a larger pipe expression, - // they use the % from the parent. After all, this pipe expression hasn't been executed yet, so it doesn't have any % value - // of its own. - let meta = Metadata { - source_range: SourceRange([first.start(), first.end()]), - }; - let output = ctx - .execute_expr(first, exec_state, &meta, StatementKind::Expression) - .await?; - - // Now that we've evaluated the first child expression in the pipeline, following child expressions - // should use the previous child expression for %. - // This means there's no more need for the previous pipe_value from the parent AST node above this one. - let previous_pipe_value = std::mem::replace(&mut exec_state.pipe_value, Some(output)); - // Evaluate remaining elements. - let result = inner_execute_pipe_body(exec_state, body, ctx).await; - // Restore the previous pipe value. - exec_state.pipe_value = previous_pipe_value; - - result -} - -/// Execute the tail of a pipe expression. exec_state.pipe_value must be set by -/// the caller. -#[async_recursion] -async fn inner_execute_pipe_body( - exec_state: &mut ExecState, - body: &[Expr], - ctx: &ExecutorContext, -) -> Result { - for expression in body { - match expression { - Expr::TagDeclarator(_) => { - return Err(KclError::Semantic(KclErrorDetails { - message: format!("This cannot be in a PipeExpression: {:?}", expression), - source_ranges: vec![expression.into()], - })); - } - Expr::Literal(_) - | Expr::Identifier(_) - | Expr::BinaryExpression(_) - | Expr::FunctionExpression(_) - | Expr::CallExpression(_) - | Expr::PipeExpression(_) - | Expr::PipeSubstitution(_) - | Expr::ArrayExpression(_) - | Expr::ArrayRangeExpression(_) - | Expr::ObjectExpression(_) - | Expr::MemberExpression(_) - | Expr::UnaryExpression(_) - | Expr::IfExpression(_) - | Expr::None(_) => {} - }; - let metadata = Metadata { - source_range: SourceRange([expression.start(), expression.end()]), - }; - let output = ctx - .execute_expr(expression, exec_state, &metadata, StatementKind::Expression) - .await?; - exec_state.pipe_value = Some(output); - } - // Safe to unwrap here, because pipe_value always has something pushed in when the `match first` executes. - let final_output = exec_state.pipe_value.take().unwrap(); - Ok(final_output) -} - -impl CallExpression { - #[async_recursion] - pub async fn execute(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { - let fn_name = &self.callee.name; - - let mut fn_args: Vec = Vec::with_capacity(self.arguments.len()); - - for arg in &self.arguments { - let metadata = Metadata { - source_range: SourceRange::from(arg), - }; - let result = ctx - .execute_expr(arg, exec_state, &metadata, StatementKind::Expression) - .await?; - fn_args.push(result); - } - - match ctx.stdlib.get_either(&self.callee.name) { - FunctionKind::Core(func) => { - // Attempt to call the function. - let args = crate::std::Args::new(fn_args, self.into(), ctx.clone()); - let mut result = func.std_lib_fn()(exec_state, args).await?; - - // If the return result is a sketch or solid, we want to update the - // memory for the tags of the group. - // TODO: This could probably be done in a better way, but as of now this was my only idea - // and it works. - match result { - KclValue::UserVal(ref mut uval) => { - uval.mutate(|sketch: &mut Sketch| { - for (_, tag) in sketch.tags.iter() { - exec_state.memory.update_tag(&tag.value, tag.clone())?; - } - Ok::<_, KclError>(()) - })?; - } - KclValue::Solid(ref mut solid) => { - for value in &solid.value { - if let Some(tag) = value.get_tag() { - // Get the past tag and update it. - let mut t = if let Some(t) = solid.sketch.tags.get(&tag.name) { - t.clone() - } else { - // It's probably a fillet or a chamfer. - // Initialize it. - TagIdentifier { - value: tag.name.clone(), - info: Some(TagEngineInfo { - id: value.get_id(), - surface: Some(value.clone()), - path: None, - sketch: solid.id, - }), - meta: vec![Metadata { - source_range: tag.clone().into(), - }], - } - }; - - let Some(ref info) = t.info else { - return Err(KclError::Semantic(KclErrorDetails { - message: format!("Tag {} does not have path info", tag.name), - source_ranges: vec![tag.into()], - })); - }; - - let mut info = info.clone(); - info.surface = Some(value.clone()); - info.sketch = solid.id; - t.info = Some(info); - - exec_state.memory.update_tag(&tag.name, t.clone())?; - - // update the sketch tags. - solid.sketch.tags.insert(tag.name.clone(), t); - } - } - - // Find the stale sketch in memory and update it. - if let Some(current_env) = exec_state - .memory - .environments - .get_mut(exec_state.memory.current_env.index()) - { - current_env.update_sketch_tags(&solid.sketch); - } - } - _ => {} - } - - Ok(result) - } - FunctionKind::Std(func) => { - let function_expression = func.function(); - let (required_params, optional_params) = - function_expression.required_and_optional_params().map_err(|e| { - KclError::Semantic(KclErrorDetails { - message: format!("Error getting parts of function: {}", e), - source_ranges: vec![self.into()], - }) - })?; - if fn_args.len() < required_params.len() || fn_args.len() > function_expression.params.len() { - return Err(KclError::Semantic(KclErrorDetails { - message: format!( - "this function expected {} arguments, got {}", - required_params.len(), - fn_args.len(), - ), - source_ranges: vec![self.into()], - })); - } - - // Add the arguments to the memory. - let mut fn_memory = exec_state.memory.clone(); - for (index, param) in required_params.iter().enumerate() { - fn_memory.add( - ¶m.identifier.name, - fn_args.get(index).unwrap().clone(), - param.identifier.clone().into(), - )?; - } - // Add the optional arguments to the memory. - for (index, param) in optional_params.iter().enumerate() { - if let Some(arg) = fn_args.get(index + required_params.len()) { - fn_memory.add(¶m.identifier.name, arg.clone(), param.identifier.clone().into())?; - } else { - fn_memory.add( - ¶m.identifier.name, - KclValue::UserVal(UserVal { - value: serde_json::value::Value::Null, - meta: Default::default(), - }), - param.identifier.clone().into(), - )?; - } - } - - let fn_dynamic_state = exec_state.dynamic_state.clone(); - // TODO: Shouldn't we merge program memory into fn_dynamic_state - // here? - - // Call the stdlib function - let p = &func.function().body; - - let (exec_result, fn_memory) = { - let previous_memory = std::mem::replace(&mut exec_state.memory, fn_memory); - let previous_dynamic_state = std::mem::replace(&mut exec_state.dynamic_state, fn_dynamic_state); - let result = ctx.inner_execute(p, exec_state, BodyType::Block).await; - exec_state.dynamic_state = previous_dynamic_state; - let fn_memory = std::mem::replace(&mut exec_state.memory, previous_memory); - (result, fn_memory) - }; - - match exec_result { - Ok(_) => {} - Err(err) => { - // We need to override the source ranges so we don't get the embedded kcl - // function from the stdlib. - return Err(err.override_source_ranges(vec![self.into()])); - } - }; - let out = fn_memory.return_; - let result = out.ok_or_else(|| { - KclError::UndefinedValue(KclErrorDetails { - message: format!("Result of stdlib function {} is undefined", fn_name), - source_ranges: vec![self.into()], - }) - })?; - Ok(result) - } - FunctionKind::UserDefined => { - let source_range = SourceRange::from(self); - // Clone the function so that we can use a mutable reference to - // exec_state. - let func = exec_state.memory.get(fn_name, source_range)?.clone(); - let fn_dynamic_state = exec_state.dynamic_state.merge(&exec_state.memory); - - let return_value = { - let previous_dynamic_state = std::mem::replace(&mut exec_state.dynamic_state, fn_dynamic_state); - let result = func.call_fn(fn_args, exec_state, ctx.clone()).await.map_err(|e| { - // Add the call expression to the source ranges. - e.add_source_ranges(vec![source_range]) - }); - exec_state.dynamic_state = previous_dynamic_state; - result? - }; - - let result = return_value.ok_or_else(move || { - let mut source_ranges: Vec = vec![source_range]; - // We want to send the source range of the original function. - if let KclValue::Function { meta, .. } = func { - source_ranges = meta.iter().map(|m| m.source_range).collect(); - }; - KclError::UndefinedValue(KclErrorDetails { - message: format!("Result of user-defined function {} is undefined", fn_name), - source_ranges, - }) - })?; - - Ok(result) - } - } - } -} - -impl TagDeclarator { - pub async fn execute(&self, exec_state: &mut ExecState) -> Result { - let memory_item = KclValue::TagIdentifier(Box::new(TagIdentifier { - value: self.name.clone(), - info: None, - meta: vec![Metadata { - source_range: self.into(), - }], - })); - - exec_state.memory.add(&self.name, memory_item.clone(), self.into())?; - - Ok(self.into()) - } -} - -impl ArrayExpression { - #[async_recursion] - pub async fn execute(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { - let mut results = Vec::with_capacity(self.elements.len()); - - for element in &self.elements { - let metadata = Metadata::from(element); - // TODO: Carry statement kind here so that we know if we're - // inside a variable declaration. - let value = ctx - .execute_expr(element, exec_state, &metadata, StatementKind::Expression) - .await?; - - results.push(value.get_json_value()?); - } - - Ok(KclValue::UserVal(UserVal { - value: results.into(), - meta: vec![Metadata { - source_range: self.into(), - }], - })) - } -} - -impl ArrayRangeExpression { - #[async_recursion] - pub async fn execute(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { - let metadata = Metadata::from(&*self.start_element); - let start = ctx - .execute_expr(&self.start_element, exec_state, &metadata, StatementKind::Expression) - .await? - .get_json_value()?; - let start = parse_json_number_as_i64(&start, (&*self.start_element).into())?; - let metadata = Metadata::from(&*self.end_element); - let end = ctx - .execute_expr(&self.end_element, exec_state, &metadata, StatementKind::Expression) - .await? - .get_json_value()?; - let end = parse_json_number_as_i64(&end, (&*self.end_element).into())?; - - if end < start { - return Err(KclError::Semantic(KclErrorDetails { - source_ranges: vec![self.into()], - message: format!("Range start is greater than range end: {start} .. {end}"), - })); - } - - let range: Vec<_> = if self.end_inclusive { - (start..=end).map(JValue::from).collect() - } else { - (start..end).map(JValue::from).collect() - }; - - Ok(KclValue::UserVal(UserVal { - value: range.into(), - meta: vec![Metadata { - source_range: self.into(), - }], - })) - } -} - -impl ObjectExpression { - #[async_recursion] - pub async fn execute(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { - let mut object = serde_json::Map::new(); - for property in &self.properties { - let metadata = Metadata::from(&property.value); - let result = ctx - .execute_expr(&property.value, exec_state, &metadata, StatementKind::Expression) - .await?; - - object.insert(property.key.name.clone(), result.get_json_value()?); - } - - Ok(KclValue::UserVal(UserVal { - value: object.into(), - meta: vec![Metadata { - source_range: self.into(), - }], - })) - } -} - -fn parse_json_number_as_i64(j: &serde_json::Value, source_range: SourceRange) -> Result { - if let serde_json::Value::Number(n) = &j { - n.as_i64().ok_or_else(|| { - KclError::Syntax(KclErrorDetails { - source_ranges: vec![source_range], - message: format!("Invalid integer: {}", j), - }) - }) - } else { - Err(KclError::Syntax(KclErrorDetails { - source_ranges: vec![source_range], - message: format!("Invalid integer: {}", j), - })) - } -} - -pub fn parse_json_number_as_f64(j: &serde_json::Value, source_range: SourceRange) -> Result { - if let serde_json::Value::Number(n) = &j { - n.as_f64().ok_or_else(|| { - KclError::Syntax(KclErrorDetails { - source_ranges: vec![source_range], - message: format!("Invalid number: {}", j), - }) - }) - } else { - Err(KclError::Syntax(KclErrorDetails { - source_ranges: vec![source_range], - message: format!("Invalid number: {}", j), - })) - } -} - -pub fn parse_json_value_as_string(j: &serde_json::Value) -> Option { - if let serde_json::Value::String(n) = &j { - Some(n.clone()) - } else { - None - } -} - -/// JSON value as bool. If it isn't a bool, returns None. -pub fn json_as_bool(j: &serde_json::Value) -> Option { - match j { - JValue::Null => None, - JValue::Bool(b) => Some(*b), - JValue::Number(_) => None, - JValue::String(_) => None, - JValue::Array(_) => None, - JValue::Object(_) => None, - } -} - -impl IfExpression { - #[async_recursion] - pub async fn get_result(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { - // Check the `if` branch. - let cond = ctx - .execute_expr(&self.cond, exec_state, &Metadata::from(self), StatementKind::Expression) - .await? - .get_bool()?; - if cond { - let block_result = ctx.inner_execute(&self.then_val, exec_state, BodyType::Block).await?; - // Block must end in an expression, so this has to be Some. - // Enforced by the parser. - // See https://github.com/KittyCAD/modeling-app/issues/4015 - return Ok(block_result.unwrap()); - } - - // Check any `else if` branches. - for else_if in &self.else_ifs { - let cond = ctx - .execute_expr( - &else_if.cond, - exec_state, - &Metadata::from(self), - StatementKind::Expression, - ) - .await? - .get_bool()?; - if cond { - let block_result = ctx - .inner_execute(&else_if.then_val, exec_state, BodyType::Block) - .await?; - // Block must end in an expression, so this has to be Some. - // Enforced by the parser. - // See https://github.com/KittyCAD/modeling-app/issues/4015 - return Ok(block_result.unwrap()); - } - } - - // Run the final `else` branch. - ctx.inner_execute(&self.final_else, exec_state, BodyType::Block) - .await - .map(|expr| expr.unwrap()) - } -} - -#[derive(Debug)] -enum Property { - Number(usize), - String(String), -} - -impl Property { - fn try_from( - computed: bool, - value: LiteralIdentifier, - exec_state: &ExecState, - sr: SourceRange, - ) -> Result { - let property_sr = vec![sr]; - let property_src: SourceRange = value.clone().into(); - match value { - LiteralIdentifier::Identifier(identifier) => { - let name = identifier.name; - if !computed { - // Treat the property as a literal - Ok(Property::String(name.to_string())) - } else { - // Actually evaluate memory to compute the property. - let prop = exec_state.memory.get(&name, property_src)?; - let KclValue::UserVal(prop) = prop else { - return Err(KclError::Semantic(KclErrorDetails { - source_ranges: property_sr, - message: format!( - "{name} is not a valid property/index, you can only use a string or int (>= 0) here", - ), - })); - }; - jvalue_to_prop(&prop.value, property_sr, &name) - } - } - LiteralIdentifier::Literal(literal) => { - let value = literal.value.clone(); - match value { - LiteralValue::IInteger(x) => { - if let Ok(x) = u64::try_from(x) { - Ok(Property::Number(x.try_into().unwrap())) - } else { - Err(KclError::Semantic(KclErrorDetails { - source_ranges: property_sr, - message: format!("{x} is not a valid index, indices must be whole numbers >= 0"), - })) - } - } - LiteralValue::String(s) => Ok(Property::String(s)), - _ => Err(KclError::Semantic(KclErrorDetails { - source_ranges: vec![sr], - message: "Only strings or ints (>= 0) can be properties/indexes".to_owned(), - })), - } - } - } - } -} - -fn jvalue_to_prop(value: &JValue, property_sr: Vec, name: &str) -> Result { - let make_err = |message: String| { - Err::(KclError::Semantic(KclErrorDetails { - source_ranges: property_sr, - message, - })) - }; - const MUST_BE_POSINT: &str = "indices must be whole positive numbers"; - const TRY_INT: &str = "try using the int() function to make this a whole number"; - match value { - JValue::Number(ref num) => { - let maybe_uint = num.as_u64().and_then(|x| usize::try_from(x).ok()); - if let Some(uint) = maybe_uint { - Ok(Property::Number(uint)) - } else if let Some(iint) = num.as_i64() { - make_err(format!("'{iint}' is not a valid index, {MUST_BE_POSINT}")) - } else if let Some(fnum) = num.as_f64() { - if fnum < 0.0 { - make_err(format!("'{fnum}' is not a valid index, {MUST_BE_POSINT}")) - } else if fnum.fract() == 0.0 { - make_err(format!("'{fnum:.1}' is stored as a fractional number but indices must be whole numbers, {TRY_INT}")) - } else { - make_err(format!("'{fnum}' is not a valid index, {MUST_BE_POSINT}, {TRY_INT}")) - } - } else { - make_err(format!("'{num}' is not a valid index, {MUST_BE_POSINT}")) - } - } - JValue::String(ref x) => Ok(Property::String(x.to_owned())), - _ => { - make_err(format!("{name} is not a valid property/index, you can only use a string to get the property of an object, or an int (>= 0) to get an item in an array")) - } - } -} -impl Property { - fn type_name(&self) -> &'static str { - match self { - Property::Number(_) => "number", - Property::String(_) => "string", - } - } -} diff --git a/src/wasm-lib/kcl/src/coredump/mod.rs b/src/wasm-lib/kcl/src/coredump/mod.rs index 9e84afc52..3057e3e40 100644 --- a/src/wasm-lib/kcl/src/coredump/mod.rs +++ b/src/wasm-lib/kcl/src/coredump/mod.rs @@ -1,4 +1,5 @@ //! Core dump related structures and functions. +#![allow(dead_code)] #[cfg(not(target_arch = "wasm32"))] pub mod local; @@ -162,6 +163,9 @@ impl CoreDumpInfo { ![Screenshot]({screenshot_url}) +> _Note: If you are capturing from a browser there is limited support for screenshots, only captures the modeling scene. + If you are on MacOS native screenshots may be disabled by default. To enable native screenshots add Zoo Modeling App to System Settings -> Screen & SystemAudio Recording for native screenshots._ +
    Core Dump diff --git a/src/wasm-lib/kcl/src/docs/gen_std_tests.rs b/src/wasm-lib/kcl/src/docs/gen_std_tests.rs index 34c015076..b110293a2 100644 --- a/src/wasm-lib/kcl/src/docs/gen_std_tests.rs +++ b/src/wasm-lib/kcl/src/docs/gen_std_tests.rs @@ -1,9 +1,10 @@ -use std::collections::{BTreeMap, HashMap}; +use std::collections::BTreeMap; use anyhow::Result; use base64::Engine; use convert_case::Casing; use handlebars::Renderable; +use indexmap::IndexMap; use itertools::Itertools; use serde_json::json; @@ -271,7 +272,7 @@ fn init_handlebars() -> Result> { Ok(hbs) } -fn generate_index(combined: &HashMap>) -> Result<()> { +fn generate_index(combined: &IndexMap>) -> Result<()> { let hbs = init_handlebars()?; let mut functions = Vec::new(); @@ -396,6 +397,9 @@ fn generate_function(internal_fn: Box) -> Result String { let mut cleaned_output = output.to_string(); // Fix the links to the types. + // Gross hack for the stupid alias types. + cleaned_output = cleaned_output.replace("TagNode", "TagDeclarator"); + let link = format!("[`{}`](/docs/kcl/types#tag-declaration)", "TagDeclarator"); cleaned_output = cleaned_output.replace("`TagDeclarator`", &link); let link = format!("[`{}`](/docs/kcl/types#tag-identifier)", "TagIdentifier"); @@ -409,7 +413,7 @@ fn cleanup_type_links(output: &str, types: Vec) -> String { let mut cleaned_output = output.to_string(); // Fix the links to the types. for type_name in types { - if type_name == "TagDeclarator" || type_name == "TagIdentifier" { + if type_name == "TagDeclarator" || type_name == "TagIdentifier" || type_name == "TagNode" { continue; } else { let link = format!("(/docs/kcl/types/{})", type_name); @@ -486,7 +490,7 @@ fn generate_type( } // Skip over TagDeclarator and TagIdentifier since they have custom docs. - if name == "TagDeclarator" || name == "TagIdentifier" { + if name == "TagDeclarator" || name == "TagIdentifier" || name == "TagNode" { return Ok(()); } @@ -593,29 +597,13 @@ fn clean_function_name(name: &str) -> String { fn_name = fn_name.replace("seg_", "segment_"); } else if fn_name.starts_with("log_") { fn_name = fn_name.replace("log_", "log"); + } else if fn_name.ends_with("tan_2") { + fn_name = fn_name.replace("tan_2", "tan2"); } fn_name } -/// Check if a schema is the same as another schema, but don't check the description. -fn is_same_schema(sa: &schemars::schema::Schema, sb: &schemars::schema::Schema) -> bool { - let schemars::schema::Schema::Object(a) = sa else { - return sa == sb; - }; - - let schemars::schema::Schema::Object(b) = sb else { - return sa == sb; - }; - - let mut a = a.clone(); - a.metadata = None; - let mut b = b.clone(); - b.metadata = None; - - a == b -} - /// Recursively create references for types we already know about. fn recurse_and_create_references( name: &str, @@ -649,24 +637,6 @@ fn recurse_and_create_references( return Ok(schemars::schema::Schema::Object(obj)); } - // Check if this is the type we already know about. - for (n, s) in types { - if is_same_schema(schema, s) && name != n && !n.starts_with("[") { - // Return a reference to the type. - let sref = schemars::schema::Schema::new_ref(n.to_string()); - // Add the existing metadata to the reference. - let schemars::schema::Schema::Object(ro) = sref else { - return Err(anyhow::anyhow!( - "Failed to get object schema, should have not been a primitive" - )); - }; - let mut ro = ro.clone(); - ro.metadata = o.metadata.clone(); - - return Ok(schemars::schema::Schema::Object(ro)); - } - } - let mut obj = o.clone(); // If we have an object iterate over the properties and recursively create references. @@ -787,6 +757,7 @@ fn test_generate_stdlib_json_schema() { // If this test fails and you've modified the AST or something else which affects the json repr // of stdlib functions, you should rerun the test with `EXPECTORATE=overwrite` to create new // test data, then check `/docs/kcl/std.json` to ensure the changes are expected. + // Alternatively, run `just redo-kcl-stdlib-docs` (make sure to have just installed). let stdlib = StdLib::new(); let combined = stdlib.combined(); diff --git a/src/wasm-lib/kcl/src/docs/mod.rs b/src/wasm-lib/kcl/src/docs/mod.rs index eb2bc3d6e..bd4492b9c 100644 --- a/src/wasm-lib/kcl/src/docs/mod.rs +++ b/src/wasm-lib/kcl/src/docs/mod.rs @@ -13,6 +13,8 @@ use tower_lsp::lsp_types::{ MarkupKind, ParameterInformation, ParameterLabel, SignatureHelp, SignatureInformation, }; +use crate::execution::Sketch; + use crate::std::Primitive; #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, JsonSchema, ts_rs::TS)] @@ -27,6 +29,8 @@ pub struct StdLibFnData { pub description: String, /// The tags of the function. pub tags: Vec, + /// If this function uses keyword arguments, or positional arguments. + pub keyword_arguments: bool, /// The args of the function. pub args: Vec, /// The return value of the function. @@ -55,6 +59,24 @@ pub struct StdLibFnArg { pub schema: schemars::schema::RootSchema, /// If the argument is required. pub required: bool, + /// Additional information that could be used instead of the type's description. + /// This is helpful if the type is really basic, like "u32" -- that won't tell the user much about + /// how this argument is meant to be used. + /// Empty string means this has no docs. + #[serde(default, skip_serializing_if = "String::is_empty")] + pub description: String, + /// Even in functions that use keyword arguments, not every parameter requires a label (most do though). + /// Some functions allow one unlabeled parameter, which has to be first in the + /// argument list. + /// + /// This field is ignored for functions that still use positional arguments. + /// Defaults to true. + #[serde(default = "its_true")] + pub label_required: bool, +} + +fn its_true() -> bool { + true } impl StdLibFnArg { @@ -76,7 +98,7 @@ impl StdLibFnArg { || self.type_ == "SketchOrSurface" { return Ok(Some((index, format!("${{{}:{}}}", index, "%")))); - } else if self.type_ == "TagDeclarator" && self.required { + } else if (self.type_ == "TagDeclarator" || self.type_ == "TagNode") && self.required { return Ok(Some((index, format!("${{{}:{}}}", index, "$myTag")))); } else if self.type_ == "TagIdentifier" && self.required { // TODO: actually use the ast to populate this. @@ -90,6 +112,11 @@ impl StdLibFnArg { } pub fn description(&self) -> Option { + // Check if we explicitly gave this stdlib arg a description. + if !self.description.is_empty() { + return Some(self.description.clone()); + } + // If not, then try to get something meaningful from the schema. get_description_string_from_schema(&self.schema.clone()) } } @@ -120,6 +147,9 @@ pub trait StdLibFn: std::fmt::Debug + Send + Sync { /// The description of the function. fn description(&self) -> String; + /// Does this use keyword arguments, or positional? + fn keyword_arguments(&self) -> bool; + /// The tags of the function. fn tags(&self) -> Vec; @@ -135,6 +165,9 @@ pub trait StdLibFn: std::fmt::Debug + Send + Sync { /// If the function is deprecated. fn deprecated(&self) -> bool; + /// If the function should appear in the feature tree. + fn feature_tree_operation(&self) -> bool; + /// Any example code blocks. fn examples(&self) -> Vec; @@ -151,6 +184,7 @@ pub trait StdLibFn: std::fmt::Debug + Send + Sync { summary: self.summary(), description: self.description(), tags: self.tags(), + keyword_arguments: self.keyword_arguments(), args: self.args(false), return_value: self.return_value(false), unpublished: self.unpublished(), @@ -214,6 +248,11 @@ pub trait StdLibFn: std::fmt::Debug + Send + Sync { } fn to_autocomplete_snippet(&self) -> Result { + if self.name() == "loft" { + return Ok("loft([${0:sketch000}, ${1:sketch001}])${}".to_string()); + } else if self.name() == "hole" { + return Ok("hole(${0:holeSketch}, ${1:%})${}".to_string()); + } let mut args = Vec::new(); let mut index = 0; for arg in self.args(true).iter() { @@ -433,6 +472,16 @@ fn get_autocomplete_snippet_from_schema( ) -> Result> { match schema { schemars::schema::Schema::Object(o) => { + // Check if the schema is the same as a Sketch. + let mut settings = schemars::gen::SchemaSettings::openapi3(); + // We set this so we can recurse them later. + settings.inline_subschemas = true; + let mut generator = schemars::gen::SchemaGenerator::new(settings); + let sketch_schema = generator.root_schema_for::().schema; + if sketch_schema.object == o.object { + return Ok(Some((index, format!("${{{}:sketch{}}}", index, "000")))); + } + if let Some(serde_json::Value::Bool(nullable)) = o.extensions.get("nullable") { if *nullable { return Ok(None); @@ -471,8 +520,14 @@ fn get_autocomplete_snippet_from_schema( continue; } + if prop_name == "color" { + fn_docs.push_str(&format!("\t{} = ${{{}:\"#ff0000\"}},\n", prop_name, i)); + i += 1; + continue; + } + if let Some((new_index, snippet)) = get_autocomplete_snippet_from_schema(prop, i)? { - fn_docs.push_str(&format!("\t{}: {},\n", prop_name, snippet)); + fn_docs.push_str(&format!("\t{} = {},\n", prop_name, snippet)); i = new_index + 1; } } @@ -797,7 +852,7 @@ mod tests { #[test] fn test_serialize_function() { - let some_function = crate::ast::types::Function::StdLib { + let some_function = crate::parsing::ast::types::Function::StdLib { func: Box::new(crate::std::sketch::Line), }; let serialized = serde_json::to_string(&some_function).unwrap(); @@ -806,12 +861,12 @@ mod tests { #[test] fn test_deserialize_function() { - let some_function_string = r#"{"type":"StdLib","func":{"name":"line","summary":"","description":"","tags":[],"returnValue":{"type":"","required":false,"name":"","schema":{},"schemaDefinitions":{}},"args":[],"unpublished":false,"deprecated":false, "examples": []}}"#; - let some_function: crate::ast::types::Function = serde_json::from_str(some_function_string).unwrap(); + let some_function_string = r#"{"type":"StdLib","func":{"name":"line","keywordArguments":false,"summary":"","description":"","tags":[],"returnValue":{"type":"","required":false,"name":"","schema":{},"schemaDefinitions":{}},"args":[],"unpublished":false,"deprecated":false, "examples": []}}"#; + let some_function: crate::parsing::ast::types::Function = serde_json::from_str(some_function_string).unwrap(); assert_eq!( some_function, - crate::ast::types::Function::StdLib { + crate::parsing::ast::types::Function::StdLib { func: Box::new(crate::std::sketch::Line) } ); @@ -838,8 +893,8 @@ mod tests { assert_eq!( snippet, r#"fillet({ - radius: ${0:3.14}, - tags: [${1:"tag_or_edge_fn"}], + radius = ${0:3.14}, + tags = [${1:"tag_or_edge_fn"}], }, ${2:%})${}"# ); } @@ -859,11 +914,11 @@ mod tests { assert_eq!( snippet, r#"patternCircular3d({ - instances: ${0:10}, - axis: [${1:3.14}, ${2:3.14}, ${3:3.14}], - center: [${4:3.14}, ${5:3.14}, ${6:3.14}], - arcDegrees: ${7:3.14}, - rotateDuplicates: ${8:false}, + instances = ${0:10}, + axis = [${1:3.14}, ${2:3.14}, ${3:3.14}], + center = [${4:3.14}, ${5:3.14}, ${6:3.14}], + arcDegrees = ${7:3.14}, + rotateDuplicates = ${8:false}, }, ${9:%})${}"# ); } @@ -875,7 +930,7 @@ mod tests { assert_eq!( snippet, r#"revolve({ - axis: ${0:"X"}, + axis = ${0:"X"}, }, ${1:%})${}"# ); } @@ -887,8 +942,8 @@ mod tests { assert_eq!( snippet, r#"circle({ - center: [${0:3.14}, ${1:3.14}], - radius: ${2:3.14}, + center = [${0:3.14}, ${1:3.14}], + radius = ${2:3.14}, }, ${3:%})${}"# ); } @@ -900,9 +955,9 @@ mod tests { assert_eq!( snippet, r#"arc({ - angleStart: ${0:3.14}, - angleEnd: ${1:3.14}, - radius: ${2:3.14}, + angleStart = ${0:3.14}, + angleEnd = ${1:3.14}, + radius = ${2:3.14}, }, ${3:%})${}"# ); } @@ -921,13 +976,54 @@ mod tests { assert_eq!( snippet, r#"patternLinear2d({ - instances: ${0:10}, - distance: ${1:3.14}, - axis: [${2:3.14}, ${3:3.14}], + instances = ${0:10}, + distance = ${1:3.14}, + axis = [${2:3.14}, ${3:3.14}], }, ${4:%})${}"# ); } + #[test] + fn get_autocomplete_snippet_appearance() { + let appearance_fn: Box = Box::new(crate::std::appearance::Appearance); + let snippet = appearance_fn.to_autocomplete_snippet().unwrap(); + assert_eq!( + snippet, + r#"appearance({ + color = ${0:"# + .to_owned() + + "\"#" + + r#"ff0000"}, +}, ${1:%})${}"# + ); + } + + #[test] + fn get_autocomplete_snippet_loft() { + let loft_fn: Box = Box::new(crate::std::loft::Loft); + let snippet = loft_fn.to_autocomplete_snippet().unwrap(); + assert_eq!(snippet, r#"loft([${0:sketch000}, ${1:sketch001}])${}"#); + } + + #[test] + fn get_autocomplete_snippet_sweep() { + let sweep_fn: Box = Box::new(crate::std::sweep::Sweep); + let snippet = sweep_fn.to_autocomplete_snippet().unwrap(); + assert_eq!( + snippet, + r#"sweep({ + path = ${0:sketch000}, +}, ${1:%})${}"# + ); + } + + #[test] + fn get_autocomplete_snippet_hole() { + let hole_fn: Box = Box::new(crate::std::sketch::Hole); + let snippet = hole_fn.to_autocomplete_snippet().unwrap(); + assert_eq!(snippet, r#"hole(${0:holeSketch}, ${1:%})${}"#); + } + // We want to test the snippets we compile at lsp start. #[test] fn get_all_stdlib_autocomplete_snippets() { diff --git a/src/wasm-lib/kcl/src/docs/templates/index.hbs b/src/wasm-lib/kcl/src/docs/templates/index.hbs index b7a39a357..6f2dfc318 100644 --- a/src/wasm-lib/kcl/src/docs/templates/index.hbs +++ b/src/wasm-lib/kcl/src/docs/templates/index.hbs @@ -7,6 +7,7 @@ layout: manual ## Table of Contents * [Types](kcl/types) +* [Modules](kcl/modules) * [Known Issues](kcl/KNOWN-ISSUES) {{#each functions}} * [`{{name}}`](kcl/{{name}}) diff --git a/src/wasm-lib/kcl/src/engine/conn.rs b/src/wasm-lib/kcl/src/engine/conn.rs index 3df07bade..210ac91b9 100644 --- a/src/wasm-lib/kcl/src/engine/conn.rs +++ b/src/wasm-lib/kcl/src/engine/conn.rs @@ -18,14 +18,14 @@ use kittycad_modeling_cmds as kcmc; use tokio::sync::{mpsc, oneshot, RwLock}; use tokio_tungstenite::tungstenite::Message as WsMsg; +use super::ExecutionKind; use crate::{ engine::EngineManager, errors::{KclError, KclErrorDetails}, - executor::{DefaultPlanes, IdGenerator}, + execution::{DefaultPlanes, IdGenerator}, + SourceRange, }; -use super::ExecutionKind; - #[derive(Debug, PartialEq)] enum SocketHealth { Active, @@ -41,8 +41,8 @@ pub struct EngineConnection { #[allow(dead_code)] tcp_read_handle: Arc, socket_health: Arc>, - batch: Arc>>, - batch_end: Arc>>, + batch: Arc>>, + batch_end: Arc>>, /// The default planes for the scene. default_planes: Arc>>, @@ -213,7 +213,12 @@ impl EngineConnection { WebSocketResponse::Success(SuccessWebSocketResponse { resp: OkWebSocketResponseData::ModelingBatch { responses }, .. - }) => { + }) => + { + #[expect( + clippy::iter_over_hash_type, + reason = "modeling command uses a HashMap and keys are random, so we don't really have a choice" + )] for (resp_id, batch_response) in responses { let id: uuid::Uuid = (*resp_id).into(); match batch_response { @@ -282,8 +287,8 @@ impl EngineConnection { } Err(e) => { match &e { - WebSocketReadError::Read(e) => eprintln!("could not read from WS: {:?}", e), - WebSocketReadError::Deser(e) => eprintln!("could not deserialize msg from WS: {:?}", e), + WebSocketReadError::Read(e) => crate::logln!("could not read from WS: {:?}", e), + WebSocketReadError::Deser(e) => crate::logln!("could not deserialize msg from WS: {:?}", e), } *socket_health_tcp_read.lock().unwrap() = SocketHealth::Inactive; return Err(e); @@ -311,11 +316,11 @@ impl EngineConnection { #[async_trait::async_trait] impl EngineManager for EngineConnection { - fn batch(&self) -> Arc>> { + fn batch(&self) -> Arc>> { self.batch.clone() } - fn batch_end(&self) -> Arc>> { + fn batch_end(&self) -> Arc>> { self.batch_end.clone() } @@ -334,7 +339,7 @@ impl EngineManager for EngineConnection { async fn default_planes( &self, id_generator: &mut IdGenerator, - source_range: crate::executor::SourceRange, + source_range: SourceRange, ) -> Result { { let opt = self.default_planes.read().await.as_ref().cloned(); @@ -352,7 +357,7 @@ impl EngineManager for EngineConnection { async fn clear_scene_post_hook( &self, id_generator: &mut IdGenerator, - source_range: crate::executor::SourceRange, + source_range: SourceRange, ) -> Result<(), KclError> { // Remake the default planes, since they would have been removed after the scene was cleared. let new_planes = self.new_default_planes(id_generator, source_range).await?; @@ -364,9 +369,9 @@ impl EngineManager for EngineConnection { async fn inner_send_modeling_cmd( &self, id: uuid::Uuid, - source_range: crate::executor::SourceRange, + source_range: SourceRange, cmd: WebSocketRequest, - _id_to_source_range: std::collections::HashMap, + _id_to_source_range: std::collections::HashMap, ) -> Result { let (tx, rx) = oneshot::channel(); diff --git a/src/wasm-lib/kcl/src/engine/conn_mock.rs b/src/wasm-lib/kcl/src/engine/conn_mock.rs index 3f9de21be..4a11c0a2b 100644 --- a/src/wasm-lib/kcl/src/engine/conn_mock.rs +++ b/src/wasm-lib/kcl/src/engine/conn_mock.rs @@ -17,17 +17,17 @@ use kcmc::{ }; use kittycad_modeling_cmds::{self as kcmc}; +use super::ExecutionKind; use crate::{ errors::KclError, - executor::{DefaultPlanes, IdGenerator}, + execution::{DefaultPlanes, IdGenerator}, + SourceRange, }; -use super::ExecutionKind; - #[derive(Debug, Clone)] pub struct EngineConnection { - batch: Arc>>, - batch_end: Arc>>, + batch: Arc>>, + batch_end: Arc>>, execution_kind: Arc>, } @@ -43,11 +43,11 @@ impl EngineConnection { #[async_trait::async_trait] impl crate::engine::EngineManager for EngineConnection { - fn batch(&self) -> Arc>> { + fn batch(&self) -> Arc>> { self.batch.clone() } - fn batch_end(&self) -> Arc>> { + fn batch_end(&self) -> Arc>> { self.batch_end.clone() } @@ -66,7 +66,7 @@ impl crate::engine::EngineManager for EngineConnection { async fn default_planes( &self, _id_generator: &mut IdGenerator, - _source_range: crate::executor::SourceRange, + _source_range: SourceRange, ) -> Result { Ok(DefaultPlanes::default()) } @@ -74,7 +74,7 @@ impl crate::engine::EngineManager for EngineConnection { async fn clear_scene_post_hook( &self, _id_generator: &mut IdGenerator, - _source_range: crate::executor::SourceRange, + _source_range: SourceRange, ) -> Result<(), KclError> { Ok(()) } @@ -82,9 +82,9 @@ impl crate::engine::EngineManager for EngineConnection { async fn inner_send_modeling_cmd( &self, id: uuid::Uuid, - _source_range: crate::executor::SourceRange, + _source_range: SourceRange, cmd: WebSocketRequest, - _id_to_source_range: std::collections::HashMap, + _id_to_source_range: std::collections::HashMap, ) -> Result { match cmd { WebSocketRequest::ModelingCmdBatchReq(ModelingBatch { diff --git a/src/wasm-lib/kcl/src/engine/conn_wasm.rs b/src/wasm-lib/kcl/src/engine/conn_wasm.rs index 3ed5b4931..977a5395c 100644 --- a/src/wasm-lib/kcl/src/engine/conn_wasm.rs +++ b/src/wasm-lib/kcl/src/engine/conn_wasm.rs @@ -11,7 +11,8 @@ use wasm_bindgen::prelude::*; use crate::{ engine::ExecutionKind, errors::{KclError, KclErrorDetails}, - executor::{DefaultPlanes, IdGenerator}, + execution::{DefaultPlanes, IdGenerator}, + SourceRange, }; #[wasm_bindgen(module = "/../../lang/std/engineConnection.ts")] @@ -41,8 +42,8 @@ extern "C" { #[derive(Debug, Clone)] pub struct EngineConnection { manager: Arc, - batch: Arc>>, - batch_end: Arc>>, + batch: Arc>>, + batch_end: Arc>>, execution_kind: Arc>, } @@ -63,11 +64,11 @@ impl EngineConnection { #[async_trait::async_trait] impl crate::engine::EngineManager for EngineConnection { - fn batch(&self) -> Arc>> { + fn batch(&self) -> Arc>> { self.batch.clone() } - fn batch_end(&self) -> Arc>> { + fn batch_end(&self) -> Arc>> { self.batch_end.clone() } @@ -86,7 +87,7 @@ impl crate::engine::EngineManager for EngineConnection { async fn default_planes( &self, _id_generator: &mut IdGenerator, - source_range: crate::executor::SourceRange, + source_range: SourceRange, ) -> Result { // Get the default planes. let promise = self.manager.get_default_planes().map_err(|e| { @@ -128,7 +129,7 @@ impl crate::engine::EngineManager for EngineConnection { async fn clear_scene_post_hook( &self, _id_generator: &mut IdGenerator, - source_range: crate::executor::SourceRange, + source_range: SourceRange, ) -> Result<(), KclError> { self.manager.clear_default_planes().map_err(|e| { KclError::Engine(KclErrorDetails { @@ -158,9 +159,9 @@ impl crate::engine::EngineManager for EngineConnection { async fn inner_send_modeling_cmd( &self, id: uuid::Uuid, - source_range: crate::executor::SourceRange, + source_range: SourceRange, cmd: WebSocketRequest, - id_to_source_range: std::collections::HashMap, + id_to_source_range: std::collections::HashMap, ) -> Result { let source_range_str = serde_json::to_string(&source_range).map_err(|e| { KclError::Engine(KclErrorDetails { diff --git a/src/wasm-lib/kcl/src/engine/mod.rs b/src/wasm-lib/kcl/src/engine/mod.rs index 5bb1876b1..9e1d315f9 100644 --- a/src/wasm-lib/kcl/src/engine/mod.rs +++ b/src/wasm-lib/kcl/src/engine/mod.rs @@ -32,7 +32,8 @@ use uuid::Uuid; use crate::{ errors::{KclError, KclErrorDetails}, - executor::{DefaultPlanes, IdGenerator, Point3d}, + execution::{DefaultPlanes, IdGenerator, Point3d}, + SourceRange, }; lazy_static::lazy_static! { @@ -61,10 +62,10 @@ impl ExecutionKind { #[async_trait::async_trait] pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { /// Get the batch of commands to be sent to the engine. - fn batch(&self) -> Arc>>; + fn batch(&self) -> Arc>>; /// Get the batch of end commands to be sent to the engine. - fn batch_end(&self) -> Arc>>; + fn batch_end(&self) -> Arc>>; /// Get the current execution kind. fn execution_kind(&self) -> ExecutionKind; @@ -77,7 +78,7 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { async fn default_planes( &self, id_generator: &mut IdGenerator, - _source_range: crate::executor::SourceRange, + _source_range: SourceRange, ) -> Result; /// Helpers to be called after clearing a scene. @@ -85,22 +86,22 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { async fn clear_scene_post_hook( &self, id_generator: &mut IdGenerator, - source_range: crate::executor::SourceRange, + source_range: SourceRange, ) -> Result<(), crate::errors::KclError>; /// Send a modeling command and wait for the response message. async fn inner_send_modeling_cmd( &self, id: uuid::Uuid, - source_range: crate::executor::SourceRange, + source_range: SourceRange, cmd: WebSocketRequest, - id_to_source_range: HashMap, + id_to_source_range: HashMap, ) -> Result; async fn clear_scene( &self, id_generator: &mut IdGenerator, - source_range: crate::executor::SourceRange, + source_range: SourceRange, ) -> Result<(), crate::errors::KclError> { self.batch_modeling_cmd( uuid::Uuid::new_v4(), @@ -119,11 +120,66 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { Ok(()) } + /// Set the visibility of edges. + async fn set_edge_visibility( + &self, + visible: bool, + source_range: SourceRange, + ) -> Result<(), crate::errors::KclError> { + self.batch_modeling_cmd( + uuid::Uuid::new_v4(), + source_range, + &ModelingCmd::from(mcmd::EdgeLinesVisible { hidden: !visible }), + ) + .await?; + + Ok(()) + } + + async fn set_units( + &self, + units: crate::UnitLength, + source_range: SourceRange, + ) -> Result<(), crate::errors::KclError> { + // Before we even start executing the program, set the units. + self.batch_modeling_cmd( + uuid::Uuid::new_v4(), + source_range, + &ModelingCmd::from(mcmd::SetSceneUnits { unit: units.into() }), + ) + .await?; + + Ok(()) + } + + /// Re-run the command to apply the settings. + async fn reapply_settings( + &self, + settings: &crate::ExecutorSettings, + source_range: SourceRange, + ) -> Result<(), crate::errors::KclError> { + // Set the edge visibility. + self.set_edge_visibility(settings.highlight_edges, source_range).await?; + + // Change the units. + self.set_units(settings.units, source_range).await?; + + // Send the command to show the grid. + self.modify_grid(!settings.show_grid, source_range).await?; + + // We do not have commands for changing ssao on the fly. + + // Flush the batch queue, so the settings are applied right away. + self.flush_batch(false, source_range).await?; + + Ok(()) + } + // Add a modeling command to the batch but don't fire it right away. async fn batch_modeling_cmd( &self, id: uuid::Uuid, - source_range: crate::executor::SourceRange, + source_range: SourceRange, cmd: &ModelingCmd, ) -> Result<(), crate::errors::KclError> { let execution_kind = self.execution_kind(); @@ -147,7 +203,7 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { async fn batch_end_cmd( &self, id: uuid::Uuid, - source_range: crate::executor::SourceRange, + source_range: SourceRange, cmd: &ModelingCmd, ) -> Result<(), crate::errors::KclError> { let req = WebSocketRequest::ModelingCmdReq(ModelingCmdReq { @@ -166,7 +222,7 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { async fn send_modeling_cmd( &self, id: uuid::Uuid, - source_range: crate::executor::SourceRange, + source_range: SourceRange, cmd: ModelingCmd, ) -> Result { self.batch_modeling_cmd(id, source_range, &cmd).await?; @@ -181,7 +237,7 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { // Whether or not to flush the end commands as well. // We only do this at the very end of the file. batch_end: bool, - source_range: crate::executor::SourceRange, + source_range: SourceRange, ) -> Result { let all_requests = if batch_end { let mut requests = self.batch().lock().unwrap().clone(); @@ -303,7 +359,7 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { x_axis: Point3d, y_axis: Point3d, color: Option, - source_range: crate::executor::SourceRange, + source_range: SourceRange, ) -> Result { // Create new default planes. let default_size = 100.0; @@ -339,94 +395,82 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { async fn new_default_planes( &self, id_generator: &mut IdGenerator, - source_range: crate::executor::SourceRange, + source_range: SourceRange, ) -> Result { - let plane_settings: HashMap)> = HashMap::from([ + let plane_settings: Vec<(PlaneName, Uuid, Point3d, Point3d, Option)> = vec![ ( PlaneName::Xy, - ( - id_generator.next_uuid(), - Point3d { x: 1.0, y: 0.0, z: 0.0 }, - Point3d { x: 0.0, y: 1.0, z: 0.0 }, - Some(Color { - r: 0.7, - g: 0.28, - b: 0.28, - a: 0.4, - }), - ), + id_generator.next_uuid(), + Point3d { x: 1.0, y: 0.0, z: 0.0 }, + Point3d { x: 0.0, y: 1.0, z: 0.0 }, + Some(Color { + r: 0.7, + g: 0.28, + b: 0.28, + a: 0.4, + }), ), ( PlaneName::Yz, - ( - id_generator.next_uuid(), - Point3d { x: 0.0, y: 1.0, z: 0.0 }, - Point3d { x: 0.0, y: 0.0, z: 1.0 }, - Some(Color { - r: 0.28, - g: 0.7, - b: 0.28, - a: 0.4, - }), - ), + id_generator.next_uuid(), + Point3d { x: 0.0, y: 1.0, z: 0.0 }, + Point3d { x: 0.0, y: 0.0, z: 1.0 }, + Some(Color { + r: 0.28, + g: 0.7, + b: 0.28, + a: 0.4, + }), ), ( PlaneName::Xz, - ( - id_generator.next_uuid(), - Point3d { x: 1.0, y: 0.0, z: 0.0 }, - Point3d { x: 0.0, y: 0.0, z: 1.0 }, - Some(Color { - r: 0.28, - g: 0.28, - b: 0.7, - a: 0.4, - }), - ), + id_generator.next_uuid(), + Point3d { x: 1.0, y: 0.0, z: 0.0 }, + Point3d { x: 0.0, y: 0.0, z: 1.0 }, + Some(Color { + r: 0.28, + g: 0.28, + b: 0.7, + a: 0.4, + }), ), ( PlaneName::NegXy, - ( - id_generator.next_uuid(), - Point3d { - x: -1.0, - y: 0.0, - z: 0.0, - }, - Point3d { x: 0.0, y: 1.0, z: 0.0 }, - None, - ), + id_generator.next_uuid(), + Point3d { + x: -1.0, + y: 0.0, + z: 0.0, + }, + Point3d { x: 0.0, y: 1.0, z: 0.0 }, + None, ), ( PlaneName::NegYz, - ( - id_generator.next_uuid(), - Point3d { - x: 0.0, - y: -1.0, - z: 0.0, - }, - Point3d { x: 0.0, y: 0.0, z: 1.0 }, - None, - ), + id_generator.next_uuid(), + Point3d { + x: 0.0, + y: -1.0, + z: 0.0, + }, + Point3d { x: 0.0, y: 0.0, z: 1.0 }, + None, ), ( PlaneName::NegXz, - ( - id_generator.next_uuid(), - Point3d { - x: -1.0, - y: 0.0, - z: 0.0, - }, - Point3d { x: 0.0, y: 0.0, z: 1.0 }, - None, - ), + id_generator.next_uuid(), + Point3d { + x: -1.0, + y: 0.0, + z: 0.0, + }, + Point3d { x: 0.0, y: 0.0, z: 1.0 }, + None, ), - ]); + ]; let mut planes = HashMap::new(); - for (name, (plane_id, x_axis, y_axis, color)) in plane_settings { + for (name, plane_id, x_axis, y_axis, color) in plane_settings { planes.insert( name, self.make_default_plane(plane_id, x_axis, y_axis, color, source_range) @@ -450,7 +494,7 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { fn parse_websocket_response( &self, response: WebSocketResponse, - source_range: crate::executor::SourceRange, + source_range: SourceRange, ) -> Result { match response { WebSocketResponse::Success(success) => Ok(success.resp), @@ -469,11 +513,15 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { // The last response we are looking for. id: uuid::Uuid, // The mapping of source ranges to command IDs. - id_to_source_range: HashMap, + id_to_source_range: HashMap, // The response from the engine. responses: HashMap, ) -> Result { // Iterate over the responses and check for errors. + #[expect( + clippy::iter_over_hash_type, + reason = "modeling command uses a HashMap and keys are random, so we don't really have a choice" + )] for (cmd_id, resp) in responses.iter() { match resp { BatchResponse::Success { response } => { @@ -511,11 +559,11 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { })) } - async fn modify_grid(&self, hidden: bool) -> Result<(), KclError> { + async fn modify_grid(&self, hidden: bool, source_range: SourceRange) -> Result<(), KclError> { // Hide/show the grid. self.batch_modeling_cmd( uuid::Uuid::new_v4(), - Default::default(), + source_range, &ModelingCmd::from(mcmd::ObjectVisible { hidden, object_id: *GRID_OBJECT_ID, @@ -526,7 +574,7 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { // Hide/show the grid scale text. self.batch_modeling_cmd( uuid::Uuid::new_v4(), - Default::default(), + source_range, &ModelingCmd::from(mcmd::ObjectVisible { hidden, object_id: *GRID_SCALE_TEXT_OBJECT_ID, @@ -534,8 +582,6 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { ) .await?; - self.flush_batch(false, Default::default()).await?; - Ok(()) } diff --git a/src/wasm-lib/kcl/src/errors.rs b/src/wasm-lib/kcl/src/errors.rs index 9f8dea691..b21782d5b 100644 --- a/src/wasm-lib/kcl/src/errors.rs +++ b/src/wasm-lib/kcl/src/errors.rs @@ -2,7 +2,73 @@ use serde::{Deserialize, Serialize}; use thiserror::Error; use tower_lsp::lsp_types::{Diagnostic, DiagnosticSeverity}; -use crate::{executor::SourceRange, lsp::IntoDiagnostic}; +use crate::{ + execution::Operation, + lsp::IntoDiagnostic, + source_range::{ModuleId, SourceRange}, +}; + +/// How did the KCL execution fail +#[derive(thiserror::Error, Debug)] +pub enum ExecError { + #[error("{0}")] + Kcl(#[from] crate::KclError), + #[error("Could not connect to engine: {0}")] + Connection(#[from] ConnectionError), + #[error("PNG snapshot could not be decoded: {0}")] + BadPng(String), +} + +/// How did the KCL execution fail, with extra state. +#[cfg_attr(target_arch = "wasm32", expect(dead_code))] +#[derive(Debug)] +pub struct ExecErrorWithState { + pub error: ExecError, + pub exec_state: crate::ExecState, +} + +impl ExecErrorWithState { + #[cfg_attr(target_arch = "wasm32", expect(dead_code))] + pub fn new(error: ExecError, exec_state: crate::ExecState) -> Self { + Self { error, exec_state } + } +} + +impl From for ExecErrorWithState { + fn from(error: ExecError) -> Self { + Self { + error, + exec_state: Default::default(), + } + } +} + +impl From for ExecErrorWithState { + fn from(error: KclError) -> Self { + Self { + error: error.into(), + exec_state: Default::default(), + } + } +} + +impl From for ExecErrorWithState { + fn from(error: ConnectionError) -> Self { + Self { + error: error.into(), + exec_state: Default::default(), + } + } +} + +/// How did KCL client fail to connect to the engine +#[derive(thiserror::Error, Debug)] +pub enum ConnectionError { + #[error("Could not create a Zoo client: {0}")] + CouldNotMakeClient(anyhow::Error), + #[error("Could not establish connection to engine: {0}")] + Establishing(anyhow::Error), +} #[derive(Error, Debug, Serialize, Deserialize, ts_rs::TS, Clone, PartialEq, Eq)] #[ts(export)] @@ -34,16 +100,84 @@ pub enum KclError { Internal(KclErrorDetails), } -#[derive(Debug, Serialize, Deserialize, ts_rs::TS, Clone, PartialEq, Eq)] +#[derive(Error, Debug, Serialize, Deserialize, ts_rs::TS, Clone, PartialEq, Eq)] +#[error("{error}")] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct KclErrorWithOutputs { + pub error: KclError, + pub operations: Vec, +} + +impl KclErrorWithOutputs { + pub fn new(error: KclError, operations: Vec) -> Self { + Self { error, operations } + } +} + +#[derive(thiserror::Error, Debug)] +#[error("{}", self.error.get_message())] +pub struct Report { + pub error: KclError, + pub kcl_source: String, + pub filename: String, +} + +impl miette::Diagnostic for Report { + fn code<'a>(&'a self) -> Option> { + let family = match self.error { + KclError::Lexical(_) => "Lexical", + KclError::Syntax(_) => "Syntax", + KclError::Semantic(_) => "Semantic", + KclError::ImportCycle(_) => "ImportCycle", + KclError::Type(_) => "Type", + KclError::Unimplemented(_) => "Unimplemented", + KclError::Unexpected(_) => "Unexpected", + KclError::ValueAlreadyDefined(_) => "ValueAlreadyDefined", + KclError::UndefinedValue(_) => "UndefinedValue", + KclError::InvalidExpression(_) => "InvalidExpression", + KclError::Engine(_) => "Engine", + KclError::Internal(_) => "Internal", + }; + let error_string = format!("KCL {family} error"); + Some(Box::new(error_string)) + } + + fn source_code(&self) -> Option<&dyn miette::SourceCode> { + Some(&self.kcl_source) + } + + fn labels(&self) -> Option + '_>> { + let iter = self + .error + .source_ranges() + .clone() + .into_iter() + .map(miette::SourceSpan::from) + .map(|span| miette::LabeledSpan::new_with_span(None, span)); + Some(Box::new(iter)) + } +} + +#[derive(Debug, Serialize, Deserialize, ts_rs::TS, Clone, PartialEq, Eq, thiserror::Error, miette::Diagnostic)] +#[error("{message}")] #[ts(export)] pub struct KclErrorDetails { #[serde(rename = "sourceRanges")] + #[label(collection, "Errors")] pub source_ranges: Vec, #[serde(rename = "msg")] pub message: String, } impl KclError { + pub fn internal(message: String) -> KclError { + KclError::Internal(KclErrorDetails { + source_ranges: Default::default(), + message, + }) + } + /// Get the error message. pub fn get_message(&self) -> String { format!("{}: {}", self.error_type(), self.message()) @@ -101,7 +235,7 @@ impl KclError { } } - pub fn override_source_ranges(&self, source_ranges: Vec) -> Self { + pub(crate) fn override_source_ranges(&self, source_ranges: Vec) -> Self { let mut new = self.clone(); match &mut new { KclError::Lexical(e) => e.source_ranges = source_ranges, @@ -121,7 +255,7 @@ impl KclError { new } - pub fn add_source_ranges(&self, source_ranges: Vec) -> Self { + pub(crate) fn add_source_ranges(&self, source_ranges: Vec) -> Self { let mut new = self.clone(); match &mut new { KclError::Lexical(e) => e.source_ranges.extend(source_ranges), @@ -147,6 +281,13 @@ impl IntoDiagnostic for KclError { let message = self.get_message(); let source_ranges = self.source_ranges(); + // Limit to only errors in the top-level file. + let module_id = ModuleId::default(); + let source_ranges = source_ranges + .iter() + .filter(|r| r.module_id() == module_id) + .collect::>(); + Diagnostic { range: source_ranges.first().map(|r| r.to_lsp_range(code)).unwrap_or_default(), severity: Some(self.severity()), @@ -196,3 +337,113 @@ impl From for pyo3::PyErr { pyo3::exceptions::PyException::new_err(error.to_string()) } } + +/// An error which occurred during parsing, etc. +#[derive(Debug, Clone, Serialize, Deserialize, ts_rs::TS)] +#[ts(export)] +pub struct CompilationError { + #[serde(rename = "sourceRange")] + pub source_range: SourceRange, + #[serde(rename = "contextRange")] + pub context_range: Option, + pub message: String, + pub suggestion: Option, + pub severity: Severity, + pub tag: Tag, +} + +impl CompilationError { + pub(crate) fn err(source_range: SourceRange, message: impl ToString) -> CompilationError { + CompilationError { + source_range, + context_range: None, + message: message.to_string(), + suggestion: None, + severity: Severity::Error, + tag: Tag::None, + } + } + + pub(crate) fn fatal(source_range: SourceRange, message: impl ToString) -> CompilationError { + CompilationError { + source_range, + context_range: None, + message: message.to_string(), + suggestion: None, + severity: Severity::Fatal, + tag: Tag::None, + } + } + + pub(crate) fn with_suggestion( + source_range: SourceRange, + context_range: Option, + message: impl ToString, + suggestion: Option<(impl ToString, impl ToString)>, + tag: Tag, + ) -> CompilationError { + CompilationError { + source_range, + context_range, + message: message.to_string(), + suggestion: suggestion.map(|(t, i)| Suggestion { + title: t.to_string(), + insert: i.to_string(), + }), + severity: Severity::Error, + tag, + } + } + + #[cfg(test)] + pub fn apply_suggestion(&self, src: &str) -> Option { + let suggestion = self.suggestion.as_ref()?; + Some(format!( + "{}{}{}", + &src[0..self.source_range.start()], + suggestion.insert, + &src[self.source_range.end()..] + )) + } +} + +impl From for KclErrorDetails { + fn from(err: CompilationError) -> Self { + KclErrorDetails { + source_ranges: vec![err.source_range], + message: err.message, + } + } +} + +#[derive(Debug, Copy, Clone, Eq, PartialEq, Serialize, Deserialize, ts_rs::TS)] +#[ts(export)] +pub enum Severity { + Warning, + Error, + Fatal, +} + +impl Severity { + pub fn is_err(self) -> bool { + match self { + Severity::Warning => false, + Severity::Error | Severity::Fatal => true, + } + } +} + +#[derive(Debug, Copy, Clone, Eq, PartialEq, Serialize, Deserialize, ts_rs::TS)] +#[ts(export)] +pub enum Tag { + Deprecated, + Unnecessary, + None, +} + +#[derive(Debug, Clone, Serialize, Deserialize, ts_rs::TS)] +#[ts(export)] +pub struct Suggestion { + pub title: String, + pub insert: String, +} diff --git a/src/wasm-lib/kcl/src/execution/annotations.rs b/src/wasm-lib/kcl/src/execution/annotations.rs new file mode 100644 index 000000000..c0fbb5575 --- /dev/null +++ b/src/wasm-lib/kcl/src/execution/annotations.rs @@ -0,0 +1,73 @@ +//! Data on available annotations. + +use super::kcl_value::{UnitAngle, UnitLen}; +use crate::{ + errors::KclErrorDetails, + parsing::ast::types::{Expr, Node, NonCodeValue, ObjectProperty}, + KclError, SourceRange, +}; + +pub(super) const SETTINGS: &str = "settings"; +pub(super) const SETTINGS_UNIT_LENGTH: &str = "defaultLengthUnit"; +pub(super) const SETTINGS_UNIT_ANGLE: &str = "defaultAngleUnit"; + +pub(super) fn expect_properties<'a>( + for_key: &'static str, + annotation: &'a NonCodeValue, + source_range: SourceRange, +) -> Result<&'a [Node], KclError> { + match annotation { + NonCodeValue::Annotation { name, properties } => { + assert_eq!(name.name, for_key); + Ok(&**properties.as_ref().ok_or_else(|| { + KclError::Semantic(KclErrorDetails { + message: format!("Empty `{for_key}` annotation"), + source_ranges: vec![source_range], + }) + })?) + } + _ => unreachable!(), + } +} + +pub(super) fn expect_ident(expr: &Expr) -> Result<&str, KclError> { + match expr { + Expr::Identifier(id) => Ok(&id.name), + e => Err(KclError::Semantic(KclErrorDetails { + message: "Unexpected settings value, expected a simple name, e.g., `mm`".to_owned(), + source_ranges: vec![e.into()], + })), + } +} + +impl UnitLen { + pub(super) fn from_str(s: &str, source_range: SourceRange) -> Result { + match s { + "mm" => Ok(UnitLen::Mm), + "cm" => Ok(UnitLen::Cm), + "m" => Ok(UnitLen::M), + "inch" | "in" => Ok(UnitLen::Inches), + "ft" => Ok(UnitLen::Feet), + "yd" => Ok(UnitLen::Yards), + value => Err(KclError::Semantic(KclErrorDetails { + message: format!( + "Unexpected settings value: `{value}`; expected one of `mm`, `cm`, `m`, `inch`, `ft`, `yd`" + ), + source_ranges: vec![source_range], + })), + } + } +} + +impl UnitAngle { + pub(super) fn from_str(s: &str, source_range: SourceRange) -> Result { + match s { + "deg" => Ok(UnitAngle::Degrees), + "rad" => Ok(UnitAngle::Radians), + value => Err(KclError::Semantic(KclErrorDetails { + message: format!("Unexpected settings value: `{value}`; expected one of `deg`, `rad`"), + source_ranges: vec![source_range], + })), + } + } +} diff --git a/src/wasm-lib/kcl/src/execution/cache.rs b/src/wasm-lib/kcl/src/execution/cache.rs new file mode 100644 index 000000000..479778aa0 --- /dev/null +++ b/src/wasm-lib/kcl/src/execution/cache.rs @@ -0,0 +1,46 @@ +//! Functions for helping with caching an ast and finding the parts the changed. + +use serde::{Deserialize, Serialize}; + +use crate::{ + execution::ExecState, + parsing::ast::types::{Node, Program}, +}; + +/// Information for the caching an AST and smartly re-executing it if we can. +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] +pub struct CacheInformation { + /// The old information. + pub old: Option, + /// The new ast to executed. + pub new_ast: Node, +} + +/// The old ast and program memory. +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] +pub struct OldAstState { + /// The ast. + pub ast: Node, + /// The exec state. + pub exec_state: ExecState, + /// The last settings used for execution. + pub settings: crate::execution::ExecutorSettings, +} + +impl From for CacheInformation { + fn from(program: crate::Program) -> Self { + CacheInformation { + old: None, + new_ast: program.ast, + } + } +} + +/// The result of a cache check. +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] +pub struct CacheResult { + /// Should we clear the scene and start over? + pub clear_scene: bool, + /// The program that needs to be executed. + pub program: Node, +} diff --git a/src/wasm-lib/kcl/src/execution/cad_op.rs b/src/wasm-lib/kcl/src/execution/cad_op.rs new file mode 100644 index 000000000..88c3255e6 --- /dev/null +++ b/src/wasm-lib/kcl/src/execution/cad_op.rs @@ -0,0 +1,134 @@ +use indexmap::IndexMap; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +use crate::{docs::StdLibFn, std::get_stdlib_fn, SourceRange}; + +/// A CAD modeling operation for display in the feature tree, AKA operations +/// timeline. +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, ts_rs::TS, JsonSchema)] +#[ts(export)] +#[serde(tag = "type")] +pub enum Operation { + #[serde(rename_all = "camelCase")] + StdLibCall { + /// The standard library function being called. + #[serde(flatten)] + std_lib_fn: StdLibFnRef, + /// The unlabeled argument to the function. + unlabeled_arg: Option, + /// The labeled keyword arguments to the function. + labeled_args: IndexMap, + /// The source range of the operation in the source code. + source_range: SourceRange, + /// True if the operation resulted in an error. + #[serde(default, skip_serializing_if = "is_false")] + is_error: bool, + }, + #[serde(rename_all = "camelCase")] + UserDefinedFunctionCall { + /// The name of the user-defined function being called. Anonymous + /// functions have no name. + name: Option, + /// The location of the function being called so that there's enough + /// info to go to its definition. + function_source_range: SourceRange, + /// The unlabeled argument to the function. + unlabeled_arg: Option, + /// The labeled keyword arguments to the function. + labeled_args: IndexMap, + /// The source range of the operation in the source code. + source_range: SourceRange, + }, + UserDefinedFunctionReturn, +} + +impl Operation { + /// If the variant is `StdLibCall`, set the `is_error` field. + pub(crate) fn set_std_lib_call_is_error(&mut self, is_err: bool) { + match self { + Self::StdLibCall { ref mut is_error, .. } => *is_error = is_err, + Self::UserDefinedFunctionCall { .. } | Self::UserDefinedFunctionReturn => {} + } + } +} + +/// An argument to a CAD modeling operation. +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, ts_rs::TS, JsonSchema)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct OpArg { + /// The KCL code expression for the argument. This is used in the UI so + /// that the user can edit the expression. + source_range: SourceRange, +} + +impl OpArg { + pub(crate) fn new(source_range: SourceRange) -> Self { + Self { source_range } + } +} + +/// A reference to a standard library function. This exists to implement +/// `PartialEq` and `Eq` for `Operation`. +#[derive(Debug, Clone, Deserialize, Serialize, ts_rs::TS, JsonSchema)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct StdLibFnRef { + // The following doc comment gets inlined into Operation, overriding what's + // there, in the generated TS. We serialize to its name. Renaming the + // field to "name" allows it to match the other variant. + /// The standard library function being called. + #[serde( + rename = "name", + serialize_with = "std_lib_fn_name", + deserialize_with = "std_lib_fn_from_name" + )] + #[ts(type = "string", rename = "name")] + pub std_lib_fn: Box, +} + +impl StdLibFnRef { + pub(crate) fn new(std_lib_fn: Box) -> Self { + Self { std_lib_fn } + } +} + +impl From<&Box> for StdLibFnRef { + fn from(std_lib_fn: &Box) -> Self { + Self::new(std_lib_fn.clone()) + } +} + +impl PartialEq for StdLibFnRef { + fn eq(&self, other: &Self) -> bool { + self.std_lib_fn.name() == other.std_lib_fn.name() + } +} + +impl Eq for StdLibFnRef {} + +#[expect(clippy::borrowed_box, reason = "Explicit Box is needed for serde")] +fn std_lib_fn_name(std_lib_fn: &Box, serializer: S) -> Result +where + S: serde::Serializer, +{ + let name = std_lib_fn.name(); + serializer.serialize_str(&name) +} + +fn std_lib_fn_from_name<'de, D>(deserializer: D) -> Result, D::Error> +where + D: serde::Deserializer<'de>, +{ + let s = String::deserialize(deserializer)?; + if let Some(std_lib_fn) = get_stdlib_fn(&s) { + Ok(std_lib_fn) + } else { + Err(serde::de::Error::custom(format!("not a KCL stdlib function: {}", s))) + } +} + +fn is_false(b: &bool) -> bool { + !*b +} diff --git a/src/wasm-lib/kcl/src/execution/exec_ast.rs b/src/wasm-lib/kcl/src/execution/exec_ast.rs new file mode 100644 index 000000000..71fc4dbff --- /dev/null +++ b/src/wasm-lib/kcl/src/execution/exec_ast.rs @@ -0,0 +1,1005 @@ +use std::collections::HashMap; + +use async_recursion::async_recursion; + +use crate::{ + errors::{KclError, KclErrorDetails}, + execution::{ + BodyType, ExecState, ExecutorContext, KclValue, Metadata, StatementKind, TagEngineInfo, TagIdentifier, + }, + parsing::ast::types::{ + ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryOperator, BinaryPart, CallExpression, + CallExpressionKw, Expr, IfExpression, LiteralIdentifier, LiteralValue, MemberExpression, MemberObject, Node, + ObjectExpression, PipeExpression, TagDeclarator, UnaryExpression, UnaryOperator, + }, + source_range::SourceRange, + std::{ + args::{Arg, KwArgs}, + FunctionKind, + }, +}; + +use super::cad_op::{OpArg, Operation}; + +const FLOAT_TO_INT_MAX_DELTA: f64 = 0.01; + +impl BinaryPart { + #[async_recursion] + pub async fn get_result(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { + match self { + BinaryPart::Literal(literal) => Ok(literal.into()), + BinaryPart::Identifier(identifier) => { + let value = exec_state.memory().get(&identifier.name, identifier.into())?; + Ok(value.clone()) + } + BinaryPart::BinaryExpression(binary_expression) => binary_expression.get_result(exec_state, ctx).await, + BinaryPart::CallExpression(call_expression) => call_expression.execute(exec_state, ctx).await, + BinaryPart::CallExpressionKw(call_expression) => call_expression.execute(exec_state, ctx).await, + BinaryPart::UnaryExpression(unary_expression) => unary_expression.get_result(exec_state, ctx).await, + BinaryPart::MemberExpression(member_expression) => member_expression.get_result(exec_state), + BinaryPart::IfExpression(e) => e.get_result(exec_state, ctx).await, + } + } +} + +impl Node { + pub fn get_result_array(&self, exec_state: &mut ExecState, index: usize) -> Result { + let array = match &self.object { + MemberObject::MemberExpression(member_expr) => member_expr.get_result(exec_state)?, + MemberObject::Identifier(identifier) => { + let value = exec_state.memory().get(&identifier.name, identifier.into())?; + value.clone() + } + }; + + let KclValue::Array { value: array, meta: _ } = array else { + return Err(KclError::Semantic(KclErrorDetails { + message: format!("MemberExpression array is not an array: {:?}", array), + source_ranges: vec![self.clone().into()], + })); + }; + + if let Some(value) = array.get(index) { + Ok(value.to_owned()) + } else { + Err(KclError::UndefinedValue(KclErrorDetails { + message: format!("index {} not found in array", index), + source_ranges: vec![self.clone().into()], + })) + } + } + + pub fn get_result(&self, exec_state: &mut ExecState) -> Result { + let property = Property::try_from(self.computed, self.property.clone(), exec_state, self.into())?; + let object = match &self.object { + // TODO: Don't use recursion here, use a loop. + MemberObject::MemberExpression(member_expr) => member_expr.get_result(exec_state)?, + MemberObject::Identifier(identifier) => { + let value = exec_state.memory().get(&identifier.name, identifier.into())?; + value.clone() + } + }; + + // Check the property and object match -- e.g. ints for arrays, strs for objects. + match (object, property) { + (KclValue::Object { value: map, meta: _ }, Property::String(property)) => { + if let Some(value) = map.get(&property) { + Ok(value.to_owned()) + } else { + Err(KclError::UndefinedValue(KclErrorDetails { + message: format!("Property '{property}' not found in object"), + source_ranges: vec![self.clone().into()], + })) + } + } + (KclValue::Object { .. }, p) => { + let t = p.type_name(); + let article = article_for(t); + Err(KclError::Semantic(KclErrorDetails { + message: format!( + "Only strings can be used as the property of an object, but you're using {article} {t}", + ), + source_ranges: vec![self.clone().into()], + })) + } + (KclValue::Array { value: arr, meta: _ }, Property::UInt(index)) => { + let value_of_arr = arr.get(index); + if let Some(value) = value_of_arr { + Ok(value.to_owned()) + } else { + Err(KclError::UndefinedValue(KclErrorDetails { + message: format!("The array doesn't have any item at index {index}"), + source_ranges: vec![self.clone().into()], + })) + } + } + (KclValue::Array { .. }, p) => { + let t = p.type_name(); + let article = article_for(t); + Err(KclError::Semantic(KclErrorDetails { + message: format!( + "Only integers >= 0 can be used as the index of an array, but you're using {article} {t}", + ), + source_ranges: vec![self.clone().into()], + })) + } + (KclValue::Solid(solid), Property::String(prop)) if prop == "sketch" => Ok(KclValue::Sketch { + value: Box::new(solid.sketch), + }), + (KclValue::Sketch { value: sk }, Property::String(prop)) if prop == "tags" => Ok(KclValue::Object { + meta: vec![Metadata { + source_range: SourceRange::from(self.clone()), + }], + value: sk + .tags + .iter() + .map(|(k, tag)| (k.to_owned(), KclValue::TagIdentifier(Box::new(tag.to_owned())))) + .collect(), + }), + (being_indexed, _) => { + let t = being_indexed.human_friendly_type(); + let article = article_for(t); + Err(KclError::Semantic(KclErrorDetails { + message: format!( + "Only arrays and objects can be indexed, but you're trying to index {article} {t}" + ), + source_ranges: vec![self.clone().into()], + })) + } + } + } +} + +impl Node { + #[async_recursion] + pub async fn get_result(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { + let left_value = self.left.get_result(exec_state, ctx).await?; + let right_value = self.right.get_result(exec_state, ctx).await?; + let mut meta = left_value.metadata(); + meta.extend(right_value.metadata()); + + // First check if we are doing string concatenation. + if self.operator == BinaryOperator::Add { + if let (KclValue::String { value: left, meta: _ }, KclValue::String { value: right, meta: _ }) = + (&left_value, &right_value) + { + return Ok(KclValue::String { + value: format!("{}{}", left, right), + meta, + }); + } + } + + // Check if we are doing logical operations on booleans. + if self.operator == BinaryOperator::Or || self.operator == BinaryOperator::And { + let KclValue::Bool { + value: left_value, + meta: _, + } = left_value + else { + return Err(KclError::Semantic(KclErrorDetails { + message: format!( + "Cannot apply logical operator to non-boolean value: {}", + left_value.human_friendly_type() + ), + source_ranges: vec![self.left.clone().into()], + })); + }; + let KclValue::Bool { + value: right_value, + meta: _, + } = right_value + else { + return Err(KclError::Semantic(KclErrorDetails { + message: format!( + "Cannot apply logical operator to non-boolean value: {}", + right_value.human_friendly_type() + ), + source_ranges: vec![self.right.clone().into()], + })); + }; + let raw_value = match self.operator { + BinaryOperator::Or => left_value || right_value, + BinaryOperator::And => left_value && right_value, + _ => unreachable!(), + }; + return Ok(KclValue::Bool { value: raw_value, meta }); + } + + let left = parse_number_as_f64(&left_value, self.left.clone().into())?; + let right = parse_number_as_f64(&right_value, self.right.clone().into())?; + + let value = match self.operator { + BinaryOperator::Add => KclValue::Number { + value: left + right, + meta, + }, + BinaryOperator::Sub => KclValue::Number { + value: left - right, + meta, + }, + BinaryOperator::Mul => KclValue::Number { + value: left * right, + meta, + }, + BinaryOperator::Div => KclValue::Number { + value: left / right, + meta, + }, + BinaryOperator::Mod => KclValue::Number { + value: left % right, + meta, + }, + BinaryOperator::Pow => KclValue::Number { + value: left.powf(right), + meta, + }, + BinaryOperator::Neq => KclValue::Bool { + value: left != right, + meta, + }, + BinaryOperator::Gt => KclValue::Bool { + value: left > right, + meta, + }, + BinaryOperator::Gte => KclValue::Bool { + value: left >= right, + meta, + }, + BinaryOperator::Lt => KclValue::Bool { + value: left < right, + meta, + }, + BinaryOperator::Lte => KclValue::Bool { + value: left <= right, + meta, + }, + BinaryOperator::Eq => KclValue::Bool { + value: left == right, + meta, + }, + BinaryOperator::And | BinaryOperator::Or => unreachable!(), + }; + + Ok(value) + } +} + +impl Node { + pub async fn get_result(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { + if self.operator == UnaryOperator::Not { + let value = self.argument.get_result(exec_state, ctx).await?; + let KclValue::Bool { + value: bool_value, + meta: _, + } = value + else { + return Err(KclError::Semantic(KclErrorDetails { + message: format!( + "Cannot apply unary operator ! to non-boolean value: {}", + value.human_friendly_type() + ), + source_ranges: vec![self.into()], + })); + }; + let meta = vec![Metadata { + source_range: self.into(), + }]; + let negated = KclValue::Bool { + value: !bool_value, + meta, + }; + + return Ok(negated); + } + + let value = &self.argument.get_result(exec_state, ctx).await?; + match value { + KclValue::Number { value, meta: _ } => { + let meta = vec![Metadata { + source_range: self.into(), + }]; + Ok(KclValue::Number { value: -value, meta }) + } + KclValue::Int { value, meta: _ } => { + let meta = vec![Metadata { + source_range: self.into(), + }]; + Ok(KclValue::Number { + value: (-value) as f64, + meta, + }) + } + _ => Err(KclError::Semantic(KclErrorDetails { + message: format!( + "You can only negate numbers, but this is a {}", + value.human_friendly_type() + ), + source_ranges: vec![self.into()], + })), + } + } +} + +pub(crate) async fn execute_pipe_body( + exec_state: &mut ExecState, + body: &[Expr], + source_range: SourceRange, + ctx: &ExecutorContext, +) -> Result { + let Some((first, body)) = body.split_first() else { + return Err(KclError::Semantic(KclErrorDetails { + message: "Pipe expressions cannot be empty".to_owned(), + source_ranges: vec![source_range], + })); + }; + // Evaluate the first element in the pipeline. + // They use the pipe_value from some AST node above this, so that if pipe expression is nested in a larger pipe expression, + // they use the % from the parent. After all, this pipe expression hasn't been executed yet, so it doesn't have any % value + // of its own. + let meta = Metadata { + source_range: SourceRange::from(first), + }; + let output = ctx + .execute_expr(first, exec_state, &meta, StatementKind::Expression) + .await?; + + // Now that we've evaluated the first child expression in the pipeline, following child expressions + // should use the previous child expression for %. + // This means there's no more need for the previous pipe_value from the parent AST node above this one. + let previous_pipe_value = std::mem::replace(&mut exec_state.mod_local.pipe_value, Some(output)); + // Evaluate remaining elements. + let result = inner_execute_pipe_body(exec_state, body, ctx).await; + // Restore the previous pipe value. + exec_state.mod_local.pipe_value = previous_pipe_value; + + result +} + +/// Execute the tail of a pipe expression. exec_state.pipe_value must be set by +/// the caller. +#[async_recursion] +async fn inner_execute_pipe_body( + exec_state: &mut ExecState, + body: &[Expr], + ctx: &ExecutorContext, +) -> Result { + for expression in body { + if let Expr::TagDeclarator(_) = expression { + return Err(KclError::Semantic(KclErrorDetails { + message: format!("This cannot be in a PipeExpression: {:?}", expression), + source_ranges: vec![expression.into()], + })); + } + let metadata = Metadata { + source_range: SourceRange::from(expression), + }; + let output = ctx + .execute_expr(expression, exec_state, &metadata, StatementKind::Expression) + .await?; + exec_state.mod_local.pipe_value = Some(output); + } + // Safe to unwrap here, because pipe_value always has something pushed in when the `match first` executes. + let final_output = exec_state.mod_local.pipe_value.take().unwrap(); + Ok(final_output) +} + +impl Node { + #[async_recursion] + pub async fn execute(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { + let fn_name = &self.callee.name; + let callsite: SourceRange = self.into(); + + // Build a hashmap from argument labels to the final evaluated values. + let mut fn_args = HashMap::with_capacity(self.arguments.len()); + for arg_expr in &self.arguments { + let source_range = SourceRange::from(arg_expr.arg.clone()); + let metadata = Metadata { source_range }; + let value = ctx + .execute_expr(&arg_expr.arg, exec_state, &metadata, StatementKind::Expression) + .await?; + fn_args.insert(arg_expr.label.name.clone(), Arg::new(value, source_range)); + } + let fn_args = fn_args; // remove mutability + + // Evaluate the unlabeled first param, if any exists. + let unlabeled = if let Some(ref arg_expr) = self.unlabeled { + let source_range = SourceRange::from(arg_expr.clone()); + let metadata = Metadata { source_range }; + let value = ctx + .execute_expr(arg_expr, exec_state, &metadata, StatementKind::Expression) + .await?; + Some(Arg::new(value, source_range)) + } else { + None + }; + + let args = crate::std::Args::new_kw( + KwArgs { + unlabeled, + labeled: fn_args, + }, + self.into(), + ctx.clone(), + exec_state.mod_local.pipe_value.clone().map(Arg::synthetic), + ); + match ctx.stdlib.get_either(fn_name) { + FunctionKind::Core(func) => { + let op = if func.feature_tree_operation() { + let op_labeled_args = args + .kw_args + .labeled + .iter() + .map(|(k, v)| (k.clone(), OpArg::new(v.source_range))) + .collect(); + Some(Operation::StdLibCall { + std_lib_fn: (&func).into(), + unlabeled_arg: args.kw_args.unlabeled.as_ref().map(|arg| OpArg::new(arg.source_range)), + labeled_args: op_labeled_args, + source_range: callsite, + is_error: false, + }) + } else { + None + }; + + // Attempt to call the function. + let result = { + // Don't early-return in this block. + let result = func.std_lib_fn()(exec_state, args).await; + + if let Some(mut op) = op { + op.set_std_lib_call_is_error(result.is_err()); + // Track call operation. We do this after the call + // since things like patternTransform may call user code + // before running, and we will likely want to use the + // return value. The call takes ownership of the args, + // so we need to build the op before the call. + exec_state.mod_local.operations.push(op); + } + result + }; + + let mut return_value = result?; + update_memory_for_tags_of_geometry(&mut return_value, exec_state)?; + + Ok(return_value) + } + FunctionKind::UserDefined => { + let source_range = SourceRange::from(self); + // Clone the function so that we can use a mutable reference to + // exec_state. + let func = exec_state.memory().get(fn_name, source_range)?.clone(); + let fn_dynamic_state = exec_state.mod_local.dynamic_state.merge(exec_state.memory()); + + // Track call operation. + let op_labeled_args = args + .kw_args + .labeled + .iter() + .map(|(k, v)| (k.clone(), OpArg::new(v.source_range))) + .collect(); + exec_state + .mod_local + .operations + .push(Operation::UserDefinedFunctionCall { + name: Some(fn_name.clone()), + function_source_range: func.function_def_source_range().unwrap_or_default(), + unlabeled_arg: args.kw_args.unlabeled.as_ref().map(|arg| OpArg::new(arg.source_range)), + labeled_args: op_labeled_args, + source_range: callsite, + }); + + let return_value = { + let previous_dynamic_state = + std::mem::replace(&mut exec_state.mod_local.dynamic_state, fn_dynamic_state); + let result = func + .call_fn_kw(args, exec_state, ctx.clone(), callsite) + .await + .map_err(|e| { + // Add the call expression to the source ranges. + // TODO currently ignored by the frontend + e.add_source_ranges(vec![source_range]) + }); + exec_state.mod_local.dynamic_state = previous_dynamic_state; + result? + }; + + let result = return_value.ok_or_else(move || { + let mut source_ranges: Vec = vec![source_range]; + // We want to send the source range of the original function. + if let KclValue::Function { meta, .. } = func { + source_ranges = meta.iter().map(|m| m.source_range).collect(); + }; + KclError::UndefinedValue(KclErrorDetails { + message: format!("Result of user-defined function {} is undefined", fn_name), + source_ranges, + }) + })?; + + // Track return operation. + exec_state + .mod_local + .operations + .push(Operation::UserDefinedFunctionReturn); + + Ok(result) + } + } + } +} + +impl Node { + #[async_recursion] + pub async fn execute(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { + let fn_name = &self.callee.name; + let callsite = SourceRange::from(self); + + let mut fn_args: Vec = Vec::with_capacity(self.arguments.len()); + + for arg_expr in &self.arguments { + let metadata = Metadata { + source_range: SourceRange::from(arg_expr), + }; + let value = ctx + .execute_expr(arg_expr, exec_state, &metadata, StatementKind::Expression) + .await?; + let arg = Arg::new(value, SourceRange::from(arg_expr)); + fn_args.push(arg); + } + let fn_args = fn_args; // remove mutability + + match ctx.stdlib.get_either(fn_name) { + FunctionKind::Core(func) => { + let op = if func.feature_tree_operation() { + let op_labeled_args = func + .args(false) + .iter() + .zip(&fn_args) + .map(|(k, v)| (k.name.clone(), OpArg::new(v.source_range))) + .collect(); + Some(Operation::StdLibCall { + std_lib_fn: (&func).into(), + unlabeled_arg: None, + labeled_args: op_labeled_args, + source_range: callsite, + is_error: false, + }) + } else { + None + }; + + // Attempt to call the function. + let args = crate::std::Args::new( + fn_args, + self.into(), + ctx.clone(), + exec_state.mod_local.pipe_value.clone().map(Arg::synthetic), + ); + let result = { + // Don't early-return in this block. + let result = func.std_lib_fn()(exec_state, args).await; + + if let Some(mut op) = op { + op.set_std_lib_call_is_error(result.is_err()); + // Track call operation. We do this after the call + // since things like patternTransform may call user code + // before running, and we will likely want to use the + // return value. The call takes ownership of the args, + // so we need to build the op before the call. + exec_state.mod_local.operations.push(op); + } + result + }; + + let mut return_value = result?; + update_memory_for_tags_of_geometry(&mut return_value, exec_state)?; + + Ok(return_value) + } + FunctionKind::UserDefined => { + let source_range = SourceRange::from(self); + // Clone the function so that we can use a mutable reference to + // exec_state. + let func = exec_state.memory().get(fn_name, source_range)?.clone(); + let fn_dynamic_state = exec_state.mod_local.dynamic_state.merge(exec_state.memory()); + + // Track call operation. + exec_state + .mod_local + .operations + .push(Operation::UserDefinedFunctionCall { + name: Some(fn_name.clone()), + function_source_range: func.function_def_source_range().unwrap_or_default(), + unlabeled_arg: None, + // TODO: Add the arguments for legacy positional parameters. + labeled_args: Default::default(), + source_range: callsite, + }); + + let return_value = { + let previous_dynamic_state = + std::mem::replace(&mut exec_state.mod_local.dynamic_state, fn_dynamic_state); + let result = func.call_fn(fn_args, exec_state, ctx.clone()).await.map_err(|e| { + // Add the call expression to the source ranges. + // TODO currently ignored by the frontend + e.add_source_ranges(vec![source_range]) + }); + exec_state.mod_local.dynamic_state = previous_dynamic_state; + result? + }; + + let result = return_value.ok_or_else(move || { + let mut source_ranges: Vec = vec![source_range]; + // We want to send the source range of the original function. + if let KclValue::Function { meta, .. } = func { + source_ranges = meta.iter().map(|m| m.source_range).collect(); + }; + KclError::UndefinedValue(KclErrorDetails { + message: format!("Result of user-defined function {} is undefined", fn_name), + source_ranges, + }) + })?; + + // Track return operation. + exec_state + .mod_local + .operations + .push(Operation::UserDefinedFunctionReturn); + + Ok(result) + } + } + } +} + +fn update_memory_for_tags_of_geometry(result: &mut KclValue, exec_state: &mut ExecState) -> Result<(), KclError> { + // If the return result is a sketch or solid, we want to update the + // memory for the tags of the group. + // TODO: This could probably be done in a better way, but as of now this was my only idea + // and it works. + match result { + KclValue::Sketch { value: ref mut sketch } => { + for (_, tag) in sketch.tags.iter() { + exec_state.mut_memory().update_tag(&tag.value, tag.clone())?; + } + } + KclValue::Solid(ref mut solid) => { + for value in &solid.value { + if let Some(tag) = value.get_tag() { + // Get the past tag and update it. + let mut t = if let Some(t) = solid.sketch.tags.get(&tag.name) { + t.clone() + } else { + // It's probably a fillet or a chamfer. + // Initialize it. + TagIdentifier { + value: tag.name.clone(), + info: Some(TagEngineInfo { + id: value.get_id(), + surface: Some(value.clone()), + path: None, + sketch: solid.id, + }), + meta: vec![Metadata { + source_range: tag.clone().into(), + }], + } + }; + + let Some(ref info) = t.info else { + return Err(KclError::Semantic(KclErrorDetails { + message: format!("Tag {} does not have path info", tag.name), + source_ranges: vec![tag.into()], + })); + }; + + let mut info = info.clone(); + info.surface = Some(value.clone()); + info.sketch = solid.id; + t.info = Some(info); + + exec_state.mut_memory().update_tag(&tag.name, t.clone())?; + + // update the sketch tags. + solid.sketch.tags.insert(tag.name.clone(), t); + } + } + + // Find the stale sketch in memory and update it. + let cur_env_index = exec_state.memory().current_env.index(); + if let Some(current_env) = exec_state.mut_memory().environments.get_mut(cur_env_index) { + current_env.update_sketch_tags(&solid.sketch); + } + } + _ => {} + } + Ok(()) +} + +impl Node { + pub async fn execute(&self, exec_state: &mut ExecState) -> Result { + let memory_item = KclValue::TagIdentifier(Box::new(TagIdentifier { + value: self.name.clone(), + info: None, + meta: vec![Metadata { + source_range: self.into(), + }], + })); + + exec_state + .mut_memory() + .add(&self.name, memory_item.clone(), self.into())?; + + Ok(self.into()) + } +} + +impl Node { + #[async_recursion] + pub async fn execute(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { + let mut results = Vec::with_capacity(self.elements.len()); + + for element in &self.elements { + let metadata = Metadata::from(element); + // TODO: Carry statement kind here so that we know if we're + // inside a variable declaration. + let value = ctx + .execute_expr(element, exec_state, &metadata, StatementKind::Expression) + .await?; + + results.push(value); + } + + Ok(KclValue::Array { + value: results, + meta: vec![self.into()], + }) + } +} + +impl Node { + #[async_recursion] + pub async fn execute(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { + let metadata = Metadata::from(&self.start_element); + let start = ctx + .execute_expr(&self.start_element, exec_state, &metadata, StatementKind::Expression) + .await?; + let start = start.as_int().ok_or(KclError::Semantic(KclErrorDetails { + source_ranges: vec![self.into()], + message: format!("Expected int but found {}", start.human_friendly_type()), + }))?; + let metadata = Metadata::from(&self.end_element); + let end = ctx + .execute_expr(&self.end_element, exec_state, &metadata, StatementKind::Expression) + .await?; + let end = end.as_int().ok_or(KclError::Semantic(KclErrorDetails { + source_ranges: vec![self.into()], + message: format!("Expected int but found {}", end.human_friendly_type()), + }))?; + + if end < start { + return Err(KclError::Semantic(KclErrorDetails { + source_ranges: vec![self.into()], + message: format!("Range start is greater than range end: {start} .. {end}"), + })); + } + + let range: Vec<_> = if self.end_inclusive { + (start..=end).collect() + } else { + (start..end).collect() + }; + + let meta = vec![Metadata { + source_range: self.into(), + }]; + Ok(KclValue::Array { + value: range + .into_iter() + .map(|num| KclValue::Int { + value: num, + meta: meta.clone(), + }) + .collect(), + meta, + }) + } +} + +impl Node { + #[async_recursion] + pub async fn execute(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { + let mut object = HashMap::with_capacity(self.properties.len()); + for property in &self.properties { + let metadata = Metadata::from(&property.value); + let result = ctx + .execute_expr(&property.value, exec_state, &metadata, StatementKind::Expression) + .await?; + + object.insert(property.key.name.clone(), result); + } + + Ok(KclValue::Object { + value: object, + meta: vec![Metadata { + source_range: self.into(), + }], + }) + } +} + +fn article_for(s: &str) -> &'static str { + if s.starts_with(['a', 'e', 'i', 'o', 'u']) { + "an" + } else { + "a" + } +} + +pub fn parse_number_as_f64(v: &KclValue, source_range: SourceRange) -> Result { + if let KclValue::Number { value: n, .. } = &v { + Ok(*n) + } else if let KclValue::Int { value: n, .. } = &v { + Ok(*n as f64) + } else { + let actual_type = v.human_friendly_type(); + let article = if actual_type.starts_with(['a', 'e', 'i', 'o', 'u']) { + "an" + } else { + "a" + }; + Err(KclError::Semantic(KclErrorDetails { + source_ranges: vec![source_range], + message: format!("Expected a number, but found {article} {actual_type}",), + })) + } +} + +impl Node { + #[async_recursion] + pub async fn get_result(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { + // Check the `if` branch. + let cond = ctx + .execute_expr(&self.cond, exec_state, &Metadata::from(self), StatementKind::Expression) + .await? + .get_bool()?; + if cond { + let block_result = ctx.inner_execute(&self.then_val, exec_state, BodyType::Block).await?; + // Block must end in an expression, so this has to be Some. + // Enforced by the parser. + // See https://github.com/KittyCAD/modeling-app/issues/4015 + return Ok(block_result.unwrap()); + } + + // Check any `else if` branches. + for else_if in &self.else_ifs { + let cond = ctx + .execute_expr( + &else_if.cond, + exec_state, + &Metadata::from(self), + StatementKind::Expression, + ) + .await? + .get_bool()?; + if cond { + let block_result = ctx + .inner_execute(&else_if.then_val, exec_state, BodyType::Block) + .await?; + // Block must end in an expression, so this has to be Some. + // Enforced by the parser. + // See https://github.com/KittyCAD/modeling-app/issues/4015 + return Ok(block_result.unwrap()); + } + } + + // Run the final `else` branch. + ctx.inner_execute(&self.final_else, exec_state, BodyType::Block) + .await + .map(|expr| expr.unwrap()) + } +} + +#[derive(Debug)] +enum Property { + UInt(usize), + String(String), +} + +impl Property { + fn try_from( + computed: bool, + value: LiteralIdentifier, + exec_state: &ExecState, + sr: SourceRange, + ) -> Result { + let property_sr = vec![sr]; + let property_src: SourceRange = value.clone().into(); + match value { + LiteralIdentifier::Identifier(identifier) => { + let name = &identifier.name; + if !computed { + // Treat the property as a literal + Ok(Property::String(name.to_string())) + } else { + // Actually evaluate memory to compute the property. + let prop = exec_state.memory().get(name, property_src)?; + jvalue_to_prop(prop, property_sr, name) + } + } + LiteralIdentifier::Literal(literal) => { + let value = literal.value.clone(); + match value { + LiteralValue::Number(x) => { + if let Some(x) = crate::try_f64_to_usize(x) { + Ok(Property::UInt(x)) + } else { + Err(KclError::Semantic(KclErrorDetails { + source_ranges: property_sr, + message: format!("{x} is not a valid index, indices must be whole numbers >= 0"), + })) + } + } + LiteralValue::String(s) => Ok(Property::String(s)), + _ => Err(KclError::Semantic(KclErrorDetails { + source_ranges: vec![sr], + message: "Only strings or numbers (>= 0) can be properties/indexes".to_owned(), + })), + } + } + } + } +} + +fn jvalue_to_prop(value: &KclValue, property_sr: Vec, name: &str) -> Result { + let make_err = |message: String| { + Err::(KclError::Semantic(KclErrorDetails { + source_ranges: property_sr, + message, + })) + }; + match value { + KclValue::Int { value:num, meta: _ } => { + let maybe_int: Result = (*num).try_into(); + if let Ok(uint) = maybe_int { + Ok(Property::UInt(uint)) + } + else { + make_err(format!("'{num}' is negative, so you can't index an array with it")) + } + } + KclValue::Number{value: num, meta:_} => { + let num = *num; + if num < 0.0 { + return make_err(format!("'{num}' is negative, so you can't index an array with it")) + } + let nearest_int = num.round(); + let delta = num-nearest_int; + if delta < FLOAT_TO_INT_MAX_DELTA { + Ok(Property::UInt(nearest_int as usize)) + } else { + make_err(format!("'{num}' is not an integer, so you can't index an array with it")) + } + } + KclValue::String{value: x, meta:_} => Ok(Property::String(x.to_owned())), + _ => { + make_err(format!("{name} is not a valid property/index, you can only use a string to get the property of an object, or an int (>= 0) to get an item in an array")) + } + } +} +impl Property { + fn type_name(&self) -> &'static str { + match self { + Property::UInt(_) => "number", + Property::String(_) => "string", + } + } +} + +impl Node { + #[async_recursion] + pub async fn get_result(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { + execute_pipe_body(exec_state, &self.body, self.into(), ctx).await + } +} diff --git a/src/wasm-lib/kcl/src/function_param.rs b/src/wasm-lib/kcl/src/execution/function_param.rs similarity index 83% rename from src/wasm-lib/kcl/src/function_param.rs rename to src/wasm-lib/kcl/src/execution/function_param.rs index 63437e23b..8f907cfa1 100644 --- a/src/wasm-lib/kcl/src/function_param.rs +++ b/src/wasm-lib/kcl/src/execution/function_param.rs @@ -1,11 +1,12 @@ use schemars::JsonSchema; use crate::{ - ast::types::FunctionExpression, errors::KclError, - executor::{ + execution::{ call_user_defined_function, ExecState, ExecutorContext, KclValue, MemoryFunction, Metadata, ProgramMemory, }, + parsing::ast::types::FunctionExpression, + std::args::Arg, }; /// A function being used as a parameter into a stdlib function. This is a @@ -13,13 +14,13 @@ use crate::{ pub struct FunctionParam<'a> { pub inner: Option<&'a MemoryFunction>, pub memory: ProgramMemory, - pub fn_expr: Box, + pub fn_expr: crate::parsing::ast::types::BoxNode, pub meta: Vec, pub ctx: ExecutorContext, } impl<'a> FunctionParam<'a> { - pub async fn call(&self, exec_state: &mut ExecState, args: Vec) -> Result, KclError> { + pub async fn call(&self, exec_state: &mut ExecState, args: Vec) -> Result, KclError> { if let Some(inner) = self.inner { inner( args, @@ -36,7 +37,7 @@ impl<'a> FunctionParam<'a> { } } -impl<'a> JsonSchema for FunctionParam<'a> { +impl JsonSchema for FunctionParam<'_> { fn schema_name() -> String { "FunctionParam".to_owned() } diff --git a/src/wasm-lib/kcl/src/execution/kcl_value.rs b/src/wasm-lib/kcl/src/execution/kcl_value.rs new file mode 100644 index 000000000..75871a6d3 --- /dev/null +++ b/src/wasm-lib/kcl/src/execution/kcl_value.rs @@ -0,0 +1,615 @@ +use std::collections::HashMap; + +use anyhow::Result; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +use crate::{ + errors::KclErrorDetails, + exec::{ProgramMemory, Sketch}, + execution::{Face, ImportedGeometry, MemoryFunction, Metadata, Plane, SketchSet, Solid, SolidSet, TagIdentifier}, + parsing::{ + ast::types::{FunctionExpression, KclNone, LiteralValue, TagDeclarator, TagNode}, + token::NumericSuffix, + }, + std::{args::Arg, FnAsArg}, + ExecState, ExecutorContext, KclError, ModuleId, SourceRange, +}; + +pub type KclObjectFields = HashMap; + +/// Any KCL value. +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] +#[ts(export)] +#[serde(tag = "type")] +pub enum KclValue { + Uuid { + value: ::uuid::Uuid, + #[serde(rename = "__meta")] + meta: Vec, + }, + Bool { + value: bool, + #[serde(rename = "__meta")] + meta: Vec, + }, + Number { + value: f64, + #[serde(rename = "__meta")] + meta: Vec, + }, + Int { + value: i64, + #[serde(rename = "__meta")] + meta: Vec, + }, + String { + value: String, + #[serde(rename = "__meta")] + meta: Vec, + }, + Array { + value: Vec, + #[serde(rename = "__meta")] + meta: Vec, + }, + Object { + value: KclObjectFields, + #[serde(rename = "__meta")] + meta: Vec, + }, + TagIdentifier(Box), + TagDeclarator(crate::parsing::ast::types::BoxNode), + Plane(Box), + Face(Box), + Sketch { + value: Box, + }, + Sketches { + value: Vec>, + }, + Solid(Box), + Solids { + value: Vec>, + }, + ImportedGeometry(ImportedGeometry), + #[ts(skip)] + Function { + /// Adam Chalmers speculation: + /// Reference to a KCL stdlib function (written in Rust). + /// Some if the KCL value is an alias of a stdlib function, + /// None if it's a KCL function written/declared in KCL. + #[serde(skip)] + func: Option, + #[schemars(skip)] + expression: crate::parsing::ast::types::BoxNode, + memory: Box, + #[serde(rename = "__meta")] + meta: Vec, + }, + Module { + value: ModuleId, + #[serde(rename = "__meta")] + meta: Vec, + }, + KclNone { + value: KclNone, + #[serde(rename = "__meta")] + meta: Vec, + }, +} + +impl From for KclValue { + fn from(sg: SketchSet) -> Self { + match sg { + SketchSet::Sketch(value) => KclValue::Sketch { value }, + SketchSet::Sketches(value) => KclValue::Sketches { value }, + } + } +} + +impl From>> for KclValue { + fn from(sg: Vec>) -> Self { + KclValue::Sketches { value: sg } + } +} + +impl From for KclValue { + fn from(eg: SolidSet) -> Self { + match eg { + SolidSet::Solid(eg) => KclValue::Solid(eg), + SolidSet::Solids(egs) => KclValue::Solids { value: egs }, + } + } +} + +impl From>> for KclValue { + fn from(eg: Vec>) -> Self { + if eg.len() == 1 { + KclValue::Solid(eg[0].clone()) + } else { + KclValue::Solids { value: eg } + } + } +} +impl From for Vec { + fn from(item: KclValue) -> Self { + match item { + KclValue::TagDeclarator(t) => vec![SourceRange::new(t.start, t.end, t.module_id)], + KclValue::TagIdentifier(t) => to_vec_sr(&t.meta), + KclValue::Solid(e) => to_vec_sr(&e.meta), + KclValue::Solids { value } => value.iter().flat_map(|eg| to_vec_sr(&eg.meta)).collect(), + KclValue::Sketch { value } => to_vec_sr(&value.meta), + KclValue::Sketches { value } => value.iter().flat_map(|eg| to_vec_sr(&eg.meta)).collect(), + KclValue::ImportedGeometry(i) => to_vec_sr(&i.meta), + KclValue::Function { meta, .. } => to_vec_sr(&meta), + KclValue::Plane(p) => to_vec_sr(&p.meta), + KclValue::Face(f) => to_vec_sr(&f.meta), + KclValue::Bool { meta, .. } => to_vec_sr(&meta), + KclValue::Number { meta, .. } => to_vec_sr(&meta), + KclValue::Int { meta, .. } => to_vec_sr(&meta), + KclValue::String { meta, .. } => to_vec_sr(&meta), + KclValue::Array { meta, .. } => to_vec_sr(&meta), + KclValue::Object { meta, .. } => to_vec_sr(&meta), + KclValue::Module { meta, .. } => to_vec_sr(&meta), + KclValue::Uuid { meta, .. } => to_vec_sr(&meta), + KclValue::KclNone { meta, .. } => to_vec_sr(&meta), + } + } +} + +fn to_vec_sr(meta: &[Metadata]) -> Vec { + meta.iter().map(|m| m.source_range).collect() +} + +impl From<&KclValue> for Vec { + fn from(item: &KclValue) -> Self { + match item { + KclValue::TagDeclarator(t) => vec![SourceRange::new(t.start, t.end, t.module_id)], + KclValue::TagIdentifier(t) => to_vec_sr(&t.meta), + KclValue::Solid(e) => to_vec_sr(&e.meta), + KclValue::Solids { value } => value.iter().flat_map(|eg| to_vec_sr(&eg.meta)).collect(), + KclValue::Sketch { value } => to_vec_sr(&value.meta), + KclValue::Sketches { value } => value.iter().flat_map(|eg| to_vec_sr(&eg.meta)).collect(), + KclValue::ImportedGeometry(i) => to_vec_sr(&i.meta), + KclValue::Function { meta, .. } => to_vec_sr(meta), + KclValue::Plane(p) => to_vec_sr(&p.meta), + KclValue::Face(f) => to_vec_sr(&f.meta), + KclValue::Bool { meta, .. } => to_vec_sr(meta), + KclValue::Number { meta, .. } => to_vec_sr(meta), + KclValue::Int { meta, .. } => to_vec_sr(meta), + KclValue::String { meta, .. } => to_vec_sr(meta), + KclValue::Uuid { meta, .. } => to_vec_sr(meta), + KclValue::Array { meta, .. } => to_vec_sr(meta), + KclValue::Object { meta, .. } => to_vec_sr(meta), + KclValue::Module { meta, .. } => to_vec_sr(meta), + KclValue::KclNone { meta, .. } => to_vec_sr(meta), + } + } +} + +impl KclValue { + pub(crate) fn metadata(&self) -> Vec { + match self { + KclValue::Uuid { value: _, meta } => meta.clone(), + KclValue::Bool { value: _, meta } => meta.clone(), + KclValue::Number { value: _, meta } => meta.clone(), + KclValue::Int { value: _, meta } => meta.clone(), + KclValue::String { value: _, meta } => meta.clone(), + KclValue::Array { value: _, meta } => meta.clone(), + KclValue::Object { value: _, meta } => meta.clone(), + KclValue::TagIdentifier(x) => x.meta.clone(), + KclValue::TagDeclarator(x) => vec![x.metadata()], + KclValue::Plane(x) => x.meta.clone(), + KclValue::Face(x) => x.meta.clone(), + KclValue::Sketch { value } => value.meta.clone(), + KclValue::Sketches { value } => value.iter().flat_map(|sketch| &sketch.meta).copied().collect(), + KclValue::Solid(x) => x.meta.clone(), + KclValue::Solids { value } => value.iter().flat_map(|sketch| &sketch.meta).copied().collect(), + KclValue::ImportedGeometry(x) => x.meta.clone(), + KclValue::Function { meta, .. } => meta.clone(), + KclValue::Module { meta, .. } => meta.clone(), + KclValue::KclNone { meta, .. } => meta.clone(), + } + } + + pub(crate) fn function_def_source_range(&self) -> Option { + let KclValue::Function { expression, .. } = self else { + return None; + }; + // TODO: It would be nice if we could extract the source range starting + // at the fn, but that's the variable declaration. + Some(expression.as_source_range()) + } + + pub(crate) fn get_solid_set(&self) -> Result { + match self { + KclValue::Solid(e) => Ok(SolidSet::Solid(e.clone())), + KclValue::Solids { value } => Ok(SolidSet::Solids(value.clone())), + KclValue::Array { value, .. } => { + let solids: Vec<_> = value + .iter() + .enumerate() + .map(|(i, v)| { + v.as_solid().map(|v| v.to_owned()).map(Box::new).ok_or_else(|| { + anyhow::anyhow!( + "expected this array to only contain solids, but element {i} was actually {}", + v.human_friendly_type() + ) + }) + }) + .collect::>()?; + Ok(SolidSet::Solids(solids)) + } + _ => anyhow::bail!("Not a solid or solids: {:?}", self), + } + } + + #[allow(unused)] + pub(crate) fn none() -> Self { + Self::KclNone { + value: Default::default(), + meta: Default::default(), + } + } + + /// Human readable type name used in error messages. Should not be relied + /// on for program logic. + pub(crate) fn human_friendly_type(&self) -> &'static str { + match self { + KclValue::Uuid { .. } => "Unique ID (uuid)", + KclValue::TagDeclarator(_) => "TagDeclarator", + KclValue::TagIdentifier(_) => "TagIdentifier", + KclValue::Solid(_) => "Solid", + KclValue::Solids { .. } => "Solids", + KclValue::Sketch { .. } => "Sketch", + KclValue::Sketches { .. } => "Sketches", + KclValue::ImportedGeometry(_) => "ImportedGeometry", + KclValue::Function { .. } => "Function", + KclValue::Plane(_) => "Plane", + KclValue::Face(_) => "Face", + KclValue::Bool { .. } => "boolean (true/false value)", + KclValue::Number { .. } => "number", + KclValue::Int { .. } => "integer", + KclValue::String { .. } => "string (text)", + KclValue::Array { .. } => "array (list)", + KclValue::Object { .. } => "object", + KclValue::Module { .. } => "module", + KclValue::KclNone { .. } => "None", + } + } + + pub(crate) fn from_literal(literal: LiteralValue, meta: Vec) -> Self { + match literal { + LiteralValue::Number(value) => KclValue::Number { value, meta }, + LiteralValue::String(value) => KclValue::String { value, meta }, + LiteralValue::Bool(value) => KclValue::Bool { value, meta }, + } + } + + /// Put the number into a KCL value. + pub const fn from_number(f: f64, meta: Vec) -> Self { + Self::Number { value: f, meta } + } + + /// Put the point into a KCL value. + pub fn from_point2d(p: [f64; 2], meta: Vec) -> Self { + Self::Array { + value: vec![ + Self::Number { + value: p[0], + meta: meta.clone(), + }, + Self::Number { + value: p[1], + meta: meta.clone(), + }, + ], + meta, + } + } + + pub(crate) fn as_usize(&self) -> Option { + match self { + KclValue::Int { value, .. } if *value > 0 => Some(*value as usize), + KclValue::Number { value, .. } => crate::try_f64_to_usize(*value), + _ => None, + } + } + + pub fn as_int(&self) -> Option { + match self { + KclValue::Int { value, .. } => Some(*value), + KclValue::Number { value, .. } => crate::try_f64_to_i64(*value), + _ => None, + } + } + + pub fn as_object(&self) -> Option<&KclObjectFields> { + if let KclValue::Object { value, meta: _ } = &self { + Some(value) + } else { + None + } + } + + pub fn into_object(self) -> Option { + if let KclValue::Object { value, meta: _ } = self { + Some(value) + } else { + None + } + } + + pub fn as_str(&self) -> Option<&str> { + if let KclValue::String { value, meta: _ } = &self { + Some(value) + } else { + None + } + } + + pub fn as_array(&self) -> Option<&[KclValue]> { + if let KclValue::Array { value, meta: _ } = &self { + Some(value) + } else { + None + } + } + + pub fn as_point2d(&self) -> Option<[f64; 2]> { + let arr = self.as_array()?; + if arr.len() != 2 { + return None; + } + let x = arr[0].as_f64()?; + let y = arr[1].as_f64()?; + Some([x, y]) + } + + pub fn as_uuid(&self) -> Option { + if let KclValue::Uuid { value, meta: _ } = &self { + Some(*value) + } else { + None + } + } + + pub fn as_plane(&self) -> Option<&Plane> { + if let KclValue::Plane(value) = &self { + Some(value) + } else { + None + } + } + + pub fn as_solid(&self) -> Option<&Solid> { + if let KclValue::Solid(value) = &self { + Some(value) + } else { + None + } + } + + pub fn as_f64(&self) -> Option { + if let KclValue::Number { value, meta: _ } = &self { + Some(*value) + } else if let KclValue::Int { value, meta: _ } = &self { + Some(*value as f64) + } else { + None + } + } + + pub fn as_bool(&self) -> Option { + if let KclValue::Bool { value, meta: _ } = &self { + Some(*value) + } else { + None + } + } + + /// If this value fits in a u32, return it. + pub fn get_u32(&self, source_ranges: Vec) -> Result { + let u = self.as_int().and_then(|n| u64::try_from(n).ok()).ok_or_else(|| { + KclError::Semantic(KclErrorDetails { + message: "Expected an integer >= 0".to_owned(), + source_ranges: source_ranges.clone(), + }) + })?; + u32::try_from(u).map_err(|_| { + KclError::Semantic(KclErrorDetails { + message: "Number was too big".to_owned(), + source_ranges, + }) + }) + } + + /// If this value is of type function, return it. + pub fn get_function(&self) -> Option> { + let KclValue::Function { + func, + expression, + memory, + meta: _, + } = &self + else { + return None; + }; + Some(FnAsArg { + func: func.as_ref(), + expr: expression.to_owned(), + memory: memory.to_owned(), + }) + } + + /// Get a tag identifier from a memory item. + pub fn get_tag_identifier(&self) -> Result { + match self { + KclValue::TagIdentifier(t) => Ok(*t.clone()), + _ => Err(KclError::Semantic(KclErrorDetails { + message: format!("Not a tag identifier: {:?}", self), + source_ranges: self.clone().into(), + })), + } + } + + /// Get a tag declarator from a memory item. + pub fn get_tag_declarator(&self) -> Result { + match self { + KclValue::TagDeclarator(t) => Ok((**t).clone()), + _ => Err(KclError::Semantic(KclErrorDetails { + message: format!("Not a tag declarator: {:?}", self), + source_ranges: self.clone().into(), + })), + } + } + + /// Get an optional tag from a memory item. + pub fn get_tag_declarator_opt(&self) -> Result, KclError> { + match self { + KclValue::TagDeclarator(t) => Ok(Some((**t).clone())), + _ => Err(KclError::Semantic(KclErrorDetails { + message: format!("Not a tag declarator: {:?}", self), + source_ranges: self.clone().into(), + })), + } + } + + /// If this KCL value is a bool, retrieve it. + pub fn get_bool(&self) -> Result { + let Self::Bool { value: b, .. } = self else { + return Err(KclError::Type(KclErrorDetails { + source_ranges: self.into(), + message: format!("Expected bool, found {}", self.human_friendly_type()), + })); + }; + Ok(*b) + } + + /// If this memory item is a function, call it with the given arguments, return its val as Ok. + /// If it's not a function, return Err. + pub async fn call_fn( + &self, + args: Vec, + exec_state: &mut ExecState, + ctx: ExecutorContext, + ) -> Result, KclError> { + let KclValue::Function { + func, + expression, + memory: closure_memory, + meta, + } = &self + else { + return Err(KclError::Semantic(KclErrorDetails { + message: "not a in memory function".to_string(), + source_ranges: vec![], + })); + }; + if let Some(func) = func { + func( + args, + closure_memory.as_ref().clone(), + expression.clone(), + meta.clone(), + exec_state, + ctx, + ) + .await + } else { + crate::execution::call_user_defined_function( + args, + closure_memory.as_ref(), + expression.as_ref(), + exec_state, + &ctx, + ) + .await + } + } + + /// If this is a function, call it by applying keyword arguments. + /// If it's not a function, returns an error. + pub async fn call_fn_kw( + &self, + args: crate::std::Args, + exec_state: &mut ExecState, + ctx: ExecutorContext, + callsite: SourceRange, + ) -> Result, KclError> { + let KclValue::Function { + func, + expression, + memory: closure_memory, + meta: _, + } = &self + else { + return Err(KclError::Semantic(KclErrorDetails { + message: "cannot call this because it isn't a function".to_string(), + source_ranges: vec![callsite], + })); + }; + if let Some(_func) = func { + todo!("Implement calling KCL stdlib fns that are aliased. Part of https://github.com/KittyCAD/modeling-app/issues/4600"); + } else { + crate::execution::call_user_defined_function_kw( + args.kw_args, + closure_memory.as_ref(), + expression.as_ref(), + exec_state, + &ctx, + ) + .await + } + } +} + +// TODO called UnitLen so as not to clash with UnitLength in settings) +#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Eq)] +#[ts(export)] +#[serde(tag = "type")] +pub enum UnitLen { + Mm, + Cm, + M, + Inches, + Feet, + Yards, +} + +impl TryFrom for UnitLen { + type Error = (); + + fn try_from(suffix: NumericSuffix) -> std::result::Result { + match suffix { + NumericSuffix::Mm => Ok(Self::Mm), + NumericSuffix::Cm => Ok(Self::Cm), + NumericSuffix::M => Ok(Self::M), + NumericSuffix::Inch => Ok(Self::Inches), + NumericSuffix::Ft => Ok(Self::Feet), + NumericSuffix::Yd => Ok(Self::Yards), + _ => Err(()), + } + } +} + +#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Eq)] +#[ts(export)] +#[serde(tag = "type")] +pub enum UnitAngle { + Degrees, + Radians, +} + +impl TryFrom for UnitAngle { + type Error = (); + + fn try_from(suffix: NumericSuffix) -> std::result::Result { + match suffix { + NumericSuffix::Deg => Ok(Self::Degrees), + NumericSuffix::Rad => Ok(Self::Radians), + _ => Err(()), + } + } +} diff --git a/src/wasm-lib/kcl/src/executor.rs b/src/wasm-lib/kcl/src/execution/mod.rs similarity index 60% rename from src/wasm-lib/kcl/src/executor.rs rename to src/wasm-lib/kcl/src/execution/mod.rs index bb7fb7bc0..32f3dffa0 100644 --- a/src/wasm-lib/kcl/src/executor.rs +++ b/src/wasm-lib/kcl/src/execution/mod.rs @@ -1,12 +1,10 @@ //! The executor for the AST. -use std::{ - collections::{HashMap, HashSet}, - sync::Arc, -}; +use std::{path::PathBuf, sync::Arc}; use anyhow::Result; use async_recursion::async_recursion; +use indexmap::IndexMap; use kcmc::{ each_cmd as mcmd, ok_response::{output::TakeSnapshot, OkModelingCmdResponse}, @@ -18,46 +16,249 @@ use kittycad_modeling_cmds::length_unit::LengthUnit; use parse_display::{Display, FromStr}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use serde_json::Value as JValue; -use tower_lsp::lsp_types::{Position as LspPosition, Range as LspRange}; type Point2D = kcmc::shared::Point2d; type Point3D = kcmc::shared::Point3d; +pub use function_param::FunctionParam; +pub use kcl_value::{KclObjectFields, KclValue}; +use uuid::Uuid; + +mod annotations; +pub(crate) mod cache; +mod cad_op; +mod exec_ast; +mod function_param; +mod kcl_value; + use crate::{ - ast::types::{ - human_friendly_type, BodyItem, Expr, ExpressionStatement, FunctionExpression, ImportStatement, ItemVisibility, - KclNone, Program, ReturnStatement, TagDeclarator, - }, engine::{EngineManager, ExecutionKind}, errors::{KclError, KclErrorDetails}, + execution::cache::{CacheInformation, CacheResult}, fs::{FileManager, FileSystem}, + parsing::ast::types::{ + BodyItem, Expr, FunctionExpression, ImportSelector, ItemVisibility, Node, NodeRef, NonCodeValue, + Program as AstProgram, TagDeclarator, TagNode, + }, settings::types::UnitLength, - std::{FnAsArg, StdLib}, + source_range::{ModuleId, SourceRange}, + std::{args::Arg, StdLib}, + walk::Node as WalkNode, + ExecError, Program, }; +// Re-exports. +pub use cad_op::Operation; + /// State for executing a program. -#[derive(Debug, Default, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] -#[ts(export)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] #[serde(rename_all = "camelCase")] pub struct ExecState { - /// Program variable bindings. - pub memory: ProgramMemory, + pub global: GlobalState, + pub mod_local: ModuleState, +} + +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct GlobalState { /// The stable artifact ID generator. pub id_generator: IdGenerator, + /// Map from source file absolute path to module ID. + pub path_to_source_id: IndexMap, + /// Map from module ID to module info. + pub module_infos: IndexMap, +} + +#[derive(Debug, Default, Clone, Deserialize, Serialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct ModuleState { + /// Program variable bindings. + pub memory: ProgramMemory, /// Dynamic state that follows dynamic flow of the program. pub dynamic_state: DynamicState, /// The current value of the pipe operator returned from the previous /// expression. If we're not currently in a pipeline, this will be None. pub pipe_value: Option, /// Identifiers that have been exported from the current module. - pub module_exports: HashSet, + pub module_exports: Vec, /// The stack of import statements for detecting circular module imports. /// If this is empty, we're not currently executing an import statement. pub import_stack: Vec, - /// The directory of the current project. This is used for resolving import - /// paths. If None is given, the current working directory is used. - pub project_directory: Option, + /// Operations that have been performed in execution order, for display in + /// the Feature Tree. + pub operations: Vec, + /// Settings specified from annotations. + pub settings: MetaSettings, +} + +/// Outcome of executing a program. This is used in TS. +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct ExecOutcome { + /// Program variable bindings of the top-level module. + pub memory: ProgramMemory, + /// Operations that have been performed in execution order, for display in + /// the Feature Tree. + pub operations: Vec, +} + +impl Default for ExecState { + fn default() -> Self { + Self::new() + } +} + +impl ExecState { + pub fn new() -> Self { + ExecState { + global: GlobalState::new(), + mod_local: ModuleState::default(), + } + } + + fn reset(&mut self) { + let mut id_generator = self.global.id_generator.clone(); + // We do not pop the ids, since we want to keep the same id generator. + // This is for the front end to keep track of the ids. + id_generator.next_id = 0; + + let mut global = GlobalState::new(); + global.id_generator = id_generator; + + *self = ExecState { + global, + mod_local: ModuleState::default(), + }; + } + + /// Convert to execution outcome when running in WebAssembly. We want to + /// reduce the amount of data that crosses the WASM boundary as much as + /// possible. + pub fn to_wasm_outcome(self) -> ExecOutcome { + // Fields are opt-in so that we don't accidentally leak private internal + // state when we add more to ExecState. + ExecOutcome { + memory: self.mod_local.memory, + operations: self.mod_local.operations, + } + } + + pub fn memory(&self) -> &ProgramMemory { + &self.mod_local.memory + } + + pub fn mut_memory(&mut self) -> &mut ProgramMemory { + &mut self.mod_local.memory + } + + pub fn next_uuid(&mut self) -> Uuid { + self.global.id_generator.next_uuid() + } + + async fn add_module( + &mut self, + path: std::path::PathBuf, + ctxt: &ExecutorContext, + source_range: SourceRange, + ) -> Result { + // Need to avoid borrowing self in the closure. + let new_module_id = ModuleId::from_usize(self.global.path_to_source_id.len()); + let mut is_new = false; + let id = *self.global.path_to_source_id.entry(path.clone()).or_insert_with(|| { + is_new = true; + new_module_id + }); + + if is_new { + let source = ctxt.fs.read_to_string(&path, source_range).await?; + // TODO handle parsing errors properly + let parsed = crate::parsing::parse_str(&source, id).parse_errs_as_err()?; + + let module_info = ModuleInfo { + id, + path, + parsed: Some(parsed), + }; + self.global.module_infos.insert(id, module_info); + } + + Ok(id) + } +} + +impl GlobalState { + fn new() -> Self { + let mut global = GlobalState { + id_generator: Default::default(), + path_to_source_id: Default::default(), + module_infos: Default::default(), + }; + + // TODO(#4434): Use the top-level file's path. + let root_path = PathBuf::new(); + let root_id = ModuleId::default(); + global.module_infos.insert( + root_id, + ModuleInfo { + id: root_id, + path: root_path.clone(), + parsed: None, + }, + ); + global.path_to_source_id.insert(root_path, root_id); + global + } +} + +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct MetaSettings { + pub default_length_units: kcl_value::UnitLen, + pub default_angle_units: kcl_value::UnitAngle, +} + +impl Default for MetaSettings { + fn default() -> Self { + MetaSettings { + default_length_units: kcl_value::UnitLen::Mm, + default_angle_units: kcl_value::UnitAngle::Degrees, + } + } +} + +impl MetaSettings { + fn update_from_annotation(&mut self, annotation: &NonCodeValue, source_range: SourceRange) -> Result<(), KclError> { + let properties = annotations::expect_properties(annotations::SETTINGS, annotation, source_range)?; + + for p in properties { + match &*p.inner.key.name { + annotations::SETTINGS_UNIT_LENGTH => { + let value = annotations::expect_ident(&p.inner.value)?; + let value = kcl_value::UnitLen::from_str(value, source_range)?; + self.default_length_units = value; + } + annotations::SETTINGS_UNIT_ANGLE => { + let value = annotations::expect_ident(&p.inner.value)?; + let value = kcl_value::UnitAngle::from_str(value, source_range)?; + self.default_angle_units = value; + } + name => { + return Err(KclError::Semantic(KclErrorDetails { + message: format!( + "Unexpected settings key: `{name}`; expected one of `{}`, `{}`", + annotations::SETTINGS_UNIT_LENGTH, + annotations::SETTINGS_UNIT_ANGLE + ), + source_ranges: vec![source_range], + })) + } + } + } + + Ok(()) + } } #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] @@ -128,9 +329,17 @@ impl ProgramMemory { })) } + /// Returns all bindings in the current scope. + #[allow(dead_code)] + fn get_all_cur_scope(&self) -> IndexMap { + let env = &self.environments[self.current_env.index()]; + env.bindings.clone() + } + /// Find all solids in the memory that are on a specific sketch id. /// This does not look inside closures. But as long as we do not allow /// mutation of variables in KCL, closure memory should be a subset of this. + #[allow(clippy::vec_box)] pub fn find_solids_on_sketch(&self, sketch_id: uuid::Uuid) -> Vec> { self.environments .iter() @@ -155,6 +364,7 @@ impl Default for ProgramMemory { /// An index pointing to an environment. #[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] +#[schemars(transparent)] pub struct EnvironmentRef(usize); impl EnvironmentRef { @@ -169,43 +379,21 @@ impl EnvironmentRef { #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] pub struct Environment { - bindings: HashMap, + bindings: IndexMap, parent: Option, } +const NO_META: Vec = Vec::new(); + impl Environment { pub fn root() -> Self { Self { // Prelude - bindings: HashMap::from([ - ( - "ZERO".to_string(), - KclValue::UserVal(UserVal { - value: serde_json::Value::Number(serde_json::value::Number::from(0)), - meta: Default::default(), - }), - ), - ( - "QUARTER_TURN".to_string(), - KclValue::UserVal(UserVal { - value: serde_json::Value::Number(serde_json::value::Number::from(90)), - meta: Default::default(), - }), - ), - ( - "HALF_TURN".to_string(), - KclValue::UserVal(UserVal { - value: serde_json::Value::Number(serde_json::value::Number::from(180)), - meta: Default::default(), - }), - ), - ( - "THREE_QUARTER_TURN".to_string(), - KclValue::UserVal(UserVal { - value: serde_json::Value::Number(serde_json::value::Number::from(270)), - meta: Default::default(), - }), - ), + bindings: IndexMap::from([ + ("ZERO".to_string(), KclValue::from_number(0.0, NO_META)), + ("QUARTER_TURN".to_string(), KclValue::from_number(90.0, NO_META)), + ("HALF_TURN".to_string(), KclValue::from_number(180.0, NO_META)), + ("THREE_QUARTER_TURN".to_string(), KclValue::from_number(270.0, NO_META)), ]), parent: None, } @@ -213,7 +401,7 @@ impl Environment { pub fn new(parent: EnvironmentRef) -> Self { Self { - bindings: HashMap::new(), + bindings: IndexMap::new(), parent: Some(parent), } } @@ -241,22 +429,15 @@ impl Environment { } for (_, val) in self.bindings.iter_mut() { - let KclValue::UserVal(v) = val else { continue }; - let meta = v.meta.clone(); - let maybe_sg: Result = serde_json::from_value(v.value.clone()); - let Ok(mut sketch) = maybe_sg else { - continue; - }; + let KclValue::Sketch { value } = val else { continue }; + let mut sketch = value.to_owned(); if sketch.original_id == sg.original_id { for tag in sg.tags.iter() { sketch.tags.insert(tag.0.clone(), tag.1.clone()); } } - *val = KclValue::UserVal(UserVal { - meta, - value: serde_json::to_value(sketch).expect("can always turn Sketch into JSON"), - }); + *val = KclValue::Sketch { value: sketch }; } } } @@ -264,24 +445,20 @@ impl Environment { /// Dynamic state that depends on the dynamic flow of the program, like the call /// stack. If the language had exceptions, for example, you could store the /// stack of exception handlers here. -#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize, ts_rs::TS, JsonSchema)] +#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)] pub struct DynamicState { pub solid_ids: Vec, } impl DynamicState { - pub fn new() -> Self { - Self::default() - } - #[must_use] - pub fn merge(&self, memory: &ProgramMemory) -> Self { + fn merge(&self, memory: &ProgramMemory) -> Self { let mut merged = self.clone(); merged.append(memory); merged } - pub fn append(&mut self, memory: &ProgramMemory) { + fn append(&mut self, memory: &ProgramMemory) { for env in &memory.environments { for item in env.bindings.values() { if let KclValue::Solid(eg) = item { @@ -291,7 +468,7 @@ impl DynamicState { } } - pub fn edge_cut_ids_on_sketch(&self, sketch_id: uuid::Uuid) -> Vec { + pub(crate) fn edge_cut_ids_on_sketch(&self, sketch_id: uuid::Uuid) -> Vec { self.solid_ids .iter() .flat_map(|eg| { @@ -306,8 +483,7 @@ impl DynamicState { } /// A generator for ArtifactIds that can be stable across executions. -#[derive(Debug, Clone, Default, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] -#[ts(export)] +#[derive(Debug, Clone, Default, Deserialize, Serialize, PartialEq)] #[serde(rename_all = "camelCase")] pub struct IdGenerator { next_id: usize, @@ -332,124 +508,6 @@ impl IdGenerator { } } -/// Any KCL value. -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] -#[ts(export)] -#[serde(tag = "type")] -pub enum KclValue { - UserVal(UserVal), - TagIdentifier(Box), - TagDeclarator(Box), - Plane(Box), - Face(Box), - - Solid(Box), - Solids { - value: Vec>, - }, - ImportedGeometry(ImportedGeometry), - #[ts(skip)] - Function { - #[serde(skip)] - func: Option, - expression: Box, - memory: Box, - #[serde(rename = "__meta")] - meta: Vec, - }, -} - -impl KclValue { - pub(crate) fn new_user_val(meta: Vec, val: T) -> Self { - Self::UserVal(UserVal::new(meta, val)) - } - - pub(crate) fn get_solid_set(&self) -> Result { - match self { - KclValue::Solid(e) => Ok(SolidSet::Solid(e.clone())), - KclValue::Solids { value } => Ok(SolidSet::Solids(value.clone())), - KclValue::UserVal(value) => { - let value = value.value.clone(); - match value { - JValue::Null | JValue::Bool(_) | JValue::Number(_) | JValue::String(_) => Err(anyhow::anyhow!( - "Failed to deserialize solid set from JSON {}", - human_friendly_type(&value) - )), - JValue::Array(_) => serde_json::from_value::>>(value) - .map(SolidSet::from) - .map_err(|e| anyhow::anyhow!("Failed to deserialize array of solids from JSON: {}", e)), - JValue::Object(_) => serde_json::from_value::>(value) - .map(SolidSet::from) - .map_err(|e| anyhow::anyhow!("Failed to deserialize solid from JSON: {}", e)), - } - } - _ => anyhow::bail!("Not a solid or solids: {:?}", self), - } - } - - /// Human readable type name used in error messages. Should not be relied - /// on for program logic. - pub(crate) fn human_friendly_type(&self) -> &'static str { - match self { - KclValue::UserVal(u) => human_friendly_type(&u.value), - KclValue::TagDeclarator(_) => "TagDeclarator", - KclValue::TagIdentifier(_) => "TagIdentifier", - KclValue::Solid(_) => "Solid", - KclValue::Solids { .. } => "Solids", - KclValue::ImportedGeometry(_) => "ImportedGeometry", - KclValue::Function { .. } => "Function", - KclValue::Plane(_) => "Plane", - KclValue::Face(_) => "Face", - } - } - - pub(crate) fn is_function(&self) -> bool { - match self { - KclValue::UserVal(..) - | KclValue::TagIdentifier(..) - | KclValue::TagDeclarator(..) - | KclValue::Plane(..) - | KclValue::Face(..) - | KclValue::Solid(..) - | KclValue::Solids { .. } - | KclValue::ImportedGeometry(..) => false, - KclValue::Function { .. } => true, - } - } -} - -impl From for KclValue { - fn from(sg: SketchSet) -> Self { - KclValue::UserVal(UserVal::new(sg.meta(), sg)) - } -} - -impl From>> for KclValue { - fn from(sg: Vec>) -> Self { - let meta = sg.iter().flat_map(|sg| sg.meta.clone()).collect(); - KclValue::UserVal(UserVal::new(meta, sg)) - } -} - -impl From for KclValue { - fn from(eg: SolidSet) -> Self { - match eg { - SolidSet::Solid(eg) => KclValue::Solid(eg), - SolidSet::Solids(egs) => KclValue::Solids { value: egs }, - } - } -} - -impl From>> for KclValue { - fn from(eg: Vec>) -> Self { - if eg.len() == 1 { - KclValue::Solid(eg[0].clone()) - } else { - KclValue::Solids { value: eg } - } - } -} - /// A geometry. #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] @@ -472,6 +530,7 @@ impl Geometry { #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] +#[allow(clippy::vec_box)] pub enum Geometries { Sketches(Vec>), Solids(Vec>), @@ -490,6 +549,7 @@ impl From for Geometries { #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type", rename_all = "camelCase")] +#[allow(clippy::vec_box)] pub enum SketchSet { Sketch(Box), Sketches(Vec>), @@ -570,6 +630,7 @@ impl From> for Vec> { #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type", rename_all = "camelCase")] +#[allow(clippy::vec_box)] pub enum SolidSet { Solid(Box), Solids(Vec>), @@ -664,7 +725,7 @@ pub struct Plane { impl Plane { pub(crate) fn from_plane_data(value: crate::std::sketch::PlaneData, exec_state: &mut ExecState) -> Self { - let id = exec_state.id_generator.next_uuid(); + let id = exec_state.global.id_generator.next_uuid(); match value { crate::std::sketch::PlaneData::XY => Plane { id, @@ -736,6 +797,17 @@ impl Plane { }, } } + + /// The standard planes are XY, YZ and XZ (in both positive and negative) + pub fn is_standard(&self) -> bool { + !self.is_custom() + } + + /// The standard planes are XY, YZ and XZ (in both positive and negative) + /// Custom planes are any other plane that the user might specify. + pub fn is_custom(&self) -> bool { + matches!(self.value, PlaneType::Custom) + } } #[derive(Debug, Default, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] @@ -792,52 +864,6 @@ pub enum PlaneType { Custom, } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] -#[ts(export)] -#[serde(tag = "type", rename_all = "camelCase")] -pub struct UserVal { - #[ts(type = "any")] - pub value: serde_json::Value, - #[serde(rename = "__meta")] - pub meta: Vec, -} - -impl UserVal { - pub fn new(meta: Vec, val: T) -> Self { - Self { - meta, - value: serde_json::to_value(val).expect("all KCL values should be compatible with JSON"), - } - } - - /// If the UserVal matches the type `T`, return it. - pub fn get(&self) -> Option<(T, Vec)> { - let meta = self.meta.clone(); - // TODO: This clone might cause performance problems, it'll happen a lot. - let res: Result = serde_json::from_value(self.value.clone()); - if let Ok(t) = res { - Some((t, meta)) - } else { - None - } - } - - /// If the UserVal matches the type `T`, then mutate it via the given closure. - /// If the closure returns Err, the mutation won't be applied. - pub fn mutate(&mut self, mutate: F) -> Result<(), E> - where - T: serde::de::DeserializeOwned + Serialize, - F: FnOnce(&mut T) -> Result<(), E>, - { - let Some((mut val, meta)) = self.get::() else { - return Ok(()); - }; - mutate(&mut val)?; - *self = Self::new(meta, val); - Ok(()) - } -} - #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type", rename_all = "camelCase")] @@ -888,235 +914,14 @@ impl std::hash::Hash for TagIdentifier { pub type MemoryFunction = fn( - s: Vec, + s: Vec, memory: ProgramMemory, - expression: Box, + expression: crate::parsing::ast::types::BoxNode, metadata: Vec, exec_state: &ExecState, ctx: ExecutorContext, ) -> std::pin::Pin, KclError>> + Send>>; -impl From for Vec { - fn from(item: KclValue) -> Self { - match item { - KclValue::UserVal(u) => u.meta.iter().map(|m| m.source_range).collect(), - KclValue::TagDeclarator(t) => t.into(), - KclValue::TagIdentifier(t) => t.meta.iter().map(|m| m.source_range).collect(), - KclValue::Solid(e) => e.meta.iter().map(|m| m.source_range).collect(), - KclValue::Solids { value } => value - .iter() - .flat_map(|eg| eg.meta.iter().map(|m| m.source_range)) - .collect(), - KclValue::ImportedGeometry(i) => i.meta.iter().map(|m| m.source_range).collect(), - KclValue::Function { meta, .. } => meta.iter().map(|m| m.source_range).collect(), - KclValue::Plane(p) => p.meta.iter().map(|m| m.source_range).collect(), - KclValue::Face(f) => f.meta.iter().map(|m| m.source_range).collect(), - } - } -} - -impl From<&KclValue> for Vec { - fn from(item: &KclValue) -> Self { - match item { - KclValue::UserVal(u) => u.meta.iter().map(|m| m.source_range).collect(), - KclValue::TagDeclarator(ref t) => vec![t.into()], - KclValue::TagIdentifier(t) => t.meta.iter().map(|m| m.source_range).collect(), - KclValue::Solid(e) => e.meta.iter().map(|m| m.source_range).collect(), - KclValue::Solids { value } => value - .iter() - .flat_map(|eg| eg.meta.iter().map(|m| m.source_range)) - .collect(), - KclValue::ImportedGeometry(i) => i.meta.iter().map(|m| m.source_range).collect(), - KclValue::Function { meta, .. } => meta.iter().map(|m| m.source_range).collect(), - KclValue::Plane(p) => p.meta.iter().map(|m| m.source_range).collect(), - KclValue::Face(f) => f.meta.iter().map(|m| m.source_range).collect(), - } - } -} - -impl KclValue { - pub fn get_json_value(&self) -> Result { - if let KclValue::UserVal(user_val) = self { - Ok(user_val.value.clone()) - } else { - serde_json::to_value(self).map_err(|err| { - KclError::Semantic(KclErrorDetails { - message: format!("Cannot convert memory item to json value: {:?}", err), - source_ranges: self.clone().into(), - }) - }) - } - } - - /// Get a JSON value and deserialize it into some concrete type. - pub fn get_json(&self) -> Result { - let json = self.get_json_value()?; - - serde_json::from_value(json).map_err(|e| { - KclError::Type(KclErrorDetails { - message: format!("Failed to deserialize struct from JSON: {}", e), - source_ranges: self.clone().into(), - }) - }) - } - - /// Get a JSON value and deserialize it into some concrete type. - /// If it's a KCL None, return None. Otherwise return Some. - pub fn get_json_opt(&self) -> Result, KclError> { - let json = self.get_json_value()?; - if let JValue::Object(ref o) = json { - if let Some(JValue::String(s)) = o.get("type") { - if s == "KclNone" { - return Ok(None); - } - } - } - - serde_json::from_value(json) - .map_err(|e| { - KclError::Type(KclErrorDetails { - message: format!("Failed to deserialize struct from JSON: {}", e), - source_ranges: self.clone().into(), - }) - }) - .map(Some) - } - - pub fn as_user_val(&self) -> Option<&UserVal> { - if let KclValue::UserVal(x) = self { - Some(x) - } else { - None - } - } - - /// If this value is of type u32, return it. - pub fn get_u32(&self, source_ranges: Vec) -> Result { - let err = KclError::Semantic(KclErrorDetails { - message: "Expected an integer >= 0".to_owned(), - source_ranges, - }); - self.as_user_val() - .and_then(|uv| uv.value.as_number()) - .and_then(|n| n.as_u64()) - .and_then(|n| u32::try_from(n).ok()) - .ok_or(err) - } - - /// If this value is of type function, return it. - pub fn get_function(&self) -> Option> { - let KclValue::Function { - func, - expression, - memory, - meta: _, - } = &self - else { - return None; - }; - Some(FnAsArg { - func: func.as_ref(), - expr: expression.to_owned(), - memory: memory.to_owned(), - }) - } - - /// Get a tag identifier from a memory item. - pub fn get_tag_identifier(&self) -> Result { - match self { - KclValue::TagIdentifier(t) => Ok(*t.clone()), - KclValue::UserVal(_) => { - if let Some(identifier) = self.get_json_opt::()? { - Ok(identifier) - } else { - Err(KclError::Semantic(KclErrorDetails { - message: format!("Not a tag identifier: {:?}", self), - source_ranges: self.clone().into(), - })) - } - } - _ => Err(KclError::Semantic(KclErrorDetails { - message: format!("Not a tag identifier: {:?}", self), - source_ranges: self.clone().into(), - })), - } - } - - /// Get a tag declarator from a memory item. - pub fn get_tag_declarator(&self) -> Result { - match self { - KclValue::TagDeclarator(t) => Ok(*t.clone()), - _ => Err(KclError::Semantic(KclErrorDetails { - message: format!("Not a tag declarator: {:?}", self), - source_ranges: self.clone().into(), - })), - } - } - - /// Get an optional tag from a memory item. - pub fn get_tag_declarator_opt(&self) -> Result, KclError> { - match self { - KclValue::TagDeclarator(t) => Ok(Some(*t.clone())), - _ => Err(KclError::Semantic(KclErrorDetails { - message: format!("Not a tag declarator: {:?}", self), - source_ranges: self.clone().into(), - })), - } - } - - /// If this KCL value is a bool, retrieve it. - pub fn get_bool(&self) -> Result { - let Self::UserVal(uv) = self else { - return Err(KclError::Type(KclErrorDetails { - source_ranges: self.into(), - message: format!("Expected bool, found {}", self.human_friendly_type()), - })); - }; - let JValue::Bool(b) = uv.value else { - return Err(KclError::Type(KclErrorDetails { - source_ranges: self.into(), - message: format!("Expected bool, found {}", human_friendly_type(&uv.value)), - })); - }; - Ok(b) - } - - /// If this memory item is a function, call it with the given arguments, return its val as Ok. - /// If it's not a function, return Err. - pub async fn call_fn( - &self, - args: Vec, - exec_state: &mut ExecState, - ctx: ExecutorContext, - ) -> Result, KclError> { - let KclValue::Function { - func, - expression, - memory: closure_memory, - meta, - } = &self - else { - return Err(KclError::Semantic(KclErrorDetails { - message: "not a in memory function".to_string(), - source_ranges: vec![], - })); - }; - if let Some(func) = func { - func( - args, - closure_memory.as_ref().clone(), - expression.clone(), - meta.clone(), - exec_state, - ctx, - ) - .await - } else { - call_user_defined_function(args, closure_memory.as_ref(), expression.as_ref(), exec_state, &ctx).await - } - } -} - /// Engine information for a tag. #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] @@ -1146,8 +951,8 @@ pub struct Sketch { /// The starting path. pub start: BasePath, /// Tag identifiers that have been declared in this sketch. - #[serde(default, skip_serializing_if = "HashMap::is_empty")] - pub tags: HashMap, + #[serde(default, skip_serializing_if = "IndexMap::is_empty")] + pub tags: IndexMap, /// The original id of the sketch. This stays the same even if the sketch is /// is sketched on face etc. #[serde(skip)] @@ -1193,14 +998,31 @@ impl SketchSurface { } } -pub struct GetTangentialInfoFromPathsResult { - pub center_or_tangent_point: [f64; 2], - pub is_center: bool, - pub ccw: bool, +#[derive(Debug, Clone)] +pub(crate) enum GetTangentialInfoFromPathsResult { + PreviousPoint([f64; 2]), + Arc { center: [f64; 2], ccw: bool }, + Circle { center: [f64; 2], ccw: bool, radius: f64 }, +} + +impl GetTangentialInfoFromPathsResult { + pub(crate) fn tan_previous_point(&self, last_arc_end: crate::std::utils::Coords2d) -> [f64; 2] { + match self { + GetTangentialInfoFromPathsResult::PreviousPoint(p) => *p, + GetTangentialInfoFromPathsResult::Arc { center, ccw, .. } => { + crate::std::utils::get_tangent_point_from_previous_arc(*center, *ccw, last_arc_end) + } + // The circle always starts at 0 degrees, so a suitable tangent + // point is either directly above or below. + GetTangentialInfoFromPathsResult::Circle { + center, radius, ccw, .. + } => [center[0] + radius, center[1] + if *ccw { -1.0 } else { 1.0 }], + } + } } impl Sketch { - pub(crate) fn add_tag(&mut self, tag: &TagDeclarator, current_path: &Path) { + pub(crate) fn add_tag(&mut self, tag: NodeRef<'_, TagDeclarator>, current_path: &Path) { let mut tag_identifier: TagIdentifier = tag.into(); let base = current_path.get_base(); tag_identifier.info = Some(TagEngineInfo { @@ -1232,32 +1054,9 @@ impl Sketch { pub(crate) fn get_tangential_info_from_paths(&self) -> GetTangentialInfoFromPathsResult { let Some(path) = self.latest_path() else { - return GetTangentialInfoFromPathsResult { - center_or_tangent_point: self.start.to, - is_center: false, - ccw: false, - }; + return GetTangentialInfoFromPathsResult::PreviousPoint(self.start.to); }; - match path { - Path::TangentialArc { center, ccw, .. } => GetTangentialInfoFromPathsResult { - center_or_tangent_point: *center, - is_center: true, - ccw: *ccw, - }, - Path::TangentialArcTo { center, ccw, .. } => GetTangentialInfoFromPathsResult { - center_or_tangent_point: *center, - is_center: true, - ccw: *ccw, - }, - _ => { - let base = path.get_base(); - GetTangentialInfoFromPathsResult { - center_or_tangent_point: base.from, - is_center: false, - ccw: false, - } - } - } + path.get_tangential_info() } } @@ -1294,7 +1093,7 @@ impl Solid { /// An solid ID and its fillet and chamfer IDs. This is needed for lazy /// fillet evaluation. -#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize, ts_rs::TS, JsonSchema)] +#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)] pub struct SolidLazyIds { pub solid_id: uuid::Uuid, pub sketch_id: uuid::Uuid, @@ -1326,7 +1125,7 @@ pub enum EdgeCut { /// The engine id of the edge to fillet. #[serde(rename = "edgeId")] edge_id: uuid::Uuid, - tag: Box>, + tag: Box>, }, /// A chamfer. Chamfer { @@ -1336,7 +1135,7 @@ pub enum EdgeCut { /// The engine id of the edge to chamfer. #[serde(rename = "edgeId")] edge_id: uuid::Uuid, - tag: Box>, + tag: Box>, }, } @@ -1355,7 +1154,7 @@ impl EdgeCut { } } - pub fn tag(&self) -> Option { + pub fn tag(&self) -> Option { match self { EdgeCut::Fillet { tag, .. } => *tag.clone(), EdgeCut::Chamfer { tag, .. } => *tag.clone(), @@ -1372,75 +1171,15 @@ pub enum BodyType { Block, } -#[derive(Debug, Default, Deserialize, Serialize, PartialEq, Copy, Clone, ts_rs::TS, JsonSchema, Hash, Eq)] -#[cfg_attr(feature = "pyo3", pyo3::pyclass)] -#[ts(export)] -pub struct SourceRange(#[ts(type = "[number, number]")] pub [usize; 2]); - -impl From<[usize; 2]> for SourceRange { - fn from(value: [usize; 2]) -> Self { - Self(value) - } -} - -impl SourceRange { - /// Create a new source range. - pub fn new(start: usize, end: usize) -> Self { - Self([start, end]) - } - - /// Get the start of the range. - pub fn start(&self) -> usize { - self.0[0] - } - - /// Get the end of the range. - pub fn end(&self) -> usize { - self.0[1] - } - - /// Check if the range contains a position. - pub fn contains(&self, pos: usize) -> bool { - pos >= self.start() && pos <= self.end() - } - - pub fn start_to_lsp_position(&self, code: &str) -> LspPosition { - // Calculate the line and column of the error from the source range. - // Lines are zero indexed in vscode so we need to subtract 1. - let mut line = code.get(..self.start()).unwrap_or_default().lines().count(); - if line > 0 { - line = line.saturating_sub(1); - } - let column = code[..self.start()].lines().last().map(|l| l.len()).unwrap_or_default(); - - LspPosition { - line: line as u32, - character: column as u32, - } - } - - pub fn end_to_lsp_position(&self, code: &str) -> LspPosition { - let lines = code.get(..self.end()).unwrap_or_default().lines(); - if lines.clone().count() == 0 { - return LspPosition { line: 0, character: 0 }; - } - - // Calculate the line and column of the error from the source range. - // Lines are zero indexed in vscode so we need to subtract 1. - let line = lines.clone().count() - 1; - let column = lines.last().map(|l| l.len()).unwrap_or_default(); - - LspPosition { - line: line as u32, - character: column as u32, - } - } - - pub fn to_lsp_range(&self, code: &str) -> LspRange { - let start = self.start_to_lsp_position(code); - let end = self.end_to_lsp_position(code); - LspRange { start, end } - } +/// Info about a module. Right now, this is pretty minimal. We hope to cache +/// modules here in the future. +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] +pub struct ModuleInfo { + /// The ID of the module. + id: ModuleId, + /// Absolute path of the module's source file. + path: std::path::PathBuf, + parsed: Option>, } #[derive(Debug, Deserialize, Serialize, PartialEq, Clone, Copy, ts_rs::TS, JsonSchema)] @@ -1515,7 +1254,7 @@ impl From for kittycad_modeling_cmds::shared::Point3d { } /// Metadata. -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Eq)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Eq, Copy)] #[ts(export)] #[serde(rename_all = "camelCase")] pub struct Metadata { @@ -1523,32 +1262,22 @@ pub struct Metadata { pub source_range: SourceRange, } +impl From for Vec { + fn from(meta: Metadata) -> Self { + vec![meta.source_range] + } +} + impl From for Metadata { fn from(source_range: SourceRange) -> Self { Self { source_range } } } -impl From<&ImportStatement> for Metadata { - fn from(stmt: &ImportStatement) -> Self { +impl From> for Metadata { + fn from(node: NodeRef<'_, T>) -> Self { Self { - source_range: SourceRange::new(stmt.start, stmt.end), - } - } -} - -impl From<&ExpressionStatement> for Metadata { - fn from(exp_statement: &ExpressionStatement) -> Self { - Self { - source_range: SourceRange::new(exp_statement.start, exp_statement.end), - } - } -} - -impl From<&ReturnStatement> for Metadata { - fn from(return_statement: &ReturnStatement) -> Self { - Self { - source_range: SourceRange::new(return_statement.start, return_statement.end), + source_range: SourceRange::new(node.start, node.end, node.module_id), } } } @@ -1573,7 +1302,7 @@ pub struct BasePath { #[ts(type = "[number, number]")] pub to: [f64; 2], /// The tag of the path. - pub tag: Option, + pub tag: Option, /// Metadata. #[serde(rename = "__geoMeta")] pub geo_meta: GeoMeta, @@ -1632,7 +1361,7 @@ pub enum Path { /// the arc's radius radius: f64, /// arc's direction - // Maybe this one's not needed since it's a full revolution? + /// This is used to compute the tangential angle. ccw: bool, }, /// A path that is horizontal. @@ -1664,6 +1393,8 @@ pub enum Path { center: [f64; 2], /// Radius of the circle that this arc is drawn on. radius: f64, + /// True if the arc is counterclockwise. + ccw: bool, }, } @@ -1709,7 +1440,7 @@ impl Path { } } - pub fn get_tag(&self) -> Option { + pub fn get_tag(&self) -> Option { match self { Path::ToPoint { base } => base.tag.clone(), Path::Horizontal { base, .. } => base.tag.clone(), @@ -1787,6 +1518,28 @@ impl Path { Path::Arc { base, .. } => Some(base), } } + + pub(crate) fn get_tangential_info(&self) -> GetTangentialInfoFromPathsResult { + match self { + Path::TangentialArc { center, ccw, .. } + | Path::TangentialArcTo { center, ccw, .. } + | Path::Arc { center, ccw, .. } => GetTangentialInfoFromPathsResult::Arc { + center: *center, + ccw: *ccw, + }, + Path::Circle { + center, ccw, radius, .. + } => GetTangentialInfoFromPathsResult::Circle { + center: *center, + ccw: *ccw, + radius: *radius, + }, + Path::ToPoint { .. } | Path::Horizontal { .. } | Path::AngledLineTo { .. } | Path::Base { .. } => { + let base = self.get_base(); + GetTangentialInfoFromPathsResult::PreviousPoint(base.from) + } + } + } } /// Compute the straight-line distance between a pair of (2D) points. @@ -1820,7 +1573,7 @@ pub struct ChamferSurface { /// The id for the chamfer surface. pub face_id: uuid::Uuid, /// The tag. - pub tag: Option, + pub tag: Option>, /// Metadata. #[serde(flatten)] pub geo_meta: GeoMeta, @@ -1834,7 +1587,7 @@ pub struct FilletSurface { /// The id for the fillet surface. pub face_id: uuid::Uuid, /// The tag. - pub tag: Option, + pub tag: Option>, /// Metadata. #[serde(flatten)] pub geo_meta: GeoMeta, @@ -1848,7 +1601,7 @@ pub struct ExtrudePlane { /// The face id for the extrude plane. pub face_id: uuid::Uuid, /// The tag. - pub tag: Option, + pub tag: Option>, /// Metadata. #[serde(flatten)] pub geo_meta: GeoMeta, @@ -1862,7 +1615,7 @@ pub struct ExtrudeArc { /// The face id for the extrude plane. pub face_id: uuid::Uuid, /// The tag. - pub tag: Option, + pub tag: Option>, /// Metadata. #[serde(flatten)] pub geo_meta: GeoMeta, @@ -1878,7 +1631,7 @@ impl ExtrudeSurface { } } - pub fn get_tag(&self) -> Option { + pub fn get_tag(&self) -> Option> { match self { ExtrudeSurface::ExtrudePlane(ep) => ep.tag.clone(), ExtrudeSurface::ExtrudeArc(ea) => ea.tag.clone(), @@ -1917,7 +1670,8 @@ pub struct ExecutorContext { } /// The executor settings. -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] +#[ts(export)] pub struct ExecutorSettings { /// The unit to use in modeling dimensions. pub units: UnitLength, @@ -1930,6 +1684,9 @@ pub struct ExecutorSettings { /// Should engine store this for replay? /// If so, under what name? pub replay: Option, + /// The directory of the current project. This is used for resolving import + /// paths. If None is given, the current working directory is used. + pub project_directory: Option, } impl Default for ExecutorSettings { @@ -1940,6 +1697,7 @@ impl Default for ExecutorSettings { enable_ssao: false, show_grid: false, replay: None, + project_directory: None, } } } @@ -1952,6 +1710,7 @@ impl From for ExecutorSettings { enable_ssao: config.settings.modeling.enable_ssao.into(), show_grid: config.settings.modeling.show_scale_grid, replay: None, + project_directory: None, } } } @@ -1964,6 +1723,7 @@ impl From for ExecutorSet enable_ssao: config.settings.modeling.enable_ssao.into(), show_grid: config.settings.modeling.show_scale_grid, replay: None, + project_directory: None, } } } @@ -1976,6 +1736,7 @@ impl From for ExecutorSettings { enable_ssao: modeling.enable_ssao.into(), show_grid: modeling.show_scale_grid, replay: None, + project_directory: None, } } } @@ -2071,17 +1832,6 @@ impl ExecutorContext { let engine: Arc> = Arc::new(Box::new(crate::engine::conn::EngineConnection::new(ws).await?)); - // Set the edge visibility. - engine - .batch_modeling_cmd( - uuid::Uuid::new_v4(), - SourceRange::default(), - &ModelingCmd::from(mcmd::EdgeLinesVisible { - hidden: !settings.highlight_edges, - }), - ) - .await?; - Ok(Self { engine, fs: Arc::new(FileManager::new()), @@ -2091,6 +1841,67 @@ impl ExecutorContext { }) } + #[cfg(not(target_arch = "wasm32"))] + pub async fn new_mock() -> Self { + ExecutorContext { + engine: Arc::new(Box::new( + crate::engine::conn_mock::EngineConnection::new().await.unwrap(), + )), + fs: Arc::new(FileManager::new()), + stdlib: Arc::new(StdLib::new()), + settings: Default::default(), + context_type: ContextType::Mock, + } + } + + #[cfg(target_arch = "wasm32")] + pub async fn new( + engine_manager: crate::engine::conn_wasm::EngineCommandManager, + fs_manager: crate::fs::wasm::FileSystemManager, + settings: ExecutorSettings, + ) -> Result { + Ok(ExecutorContext { + engine: Arc::new(Box::new( + crate::engine::conn_wasm::EngineConnection::new(engine_manager) + .await + .map_err(|e| format!("{:?}", e))?, + )), + fs: Arc::new(FileManager::new(fs_manager)), + stdlib: Arc::new(StdLib::new()), + settings, + context_type: ContextType::Live, + }) + } + + #[cfg(target_arch = "wasm32")] + pub async fn new_mock( + fs_manager: crate::fs::wasm::FileSystemManager, + settings: ExecutorSettings, + ) -> Result { + Ok(ExecutorContext { + engine: Arc::new(Box::new( + crate::engine::conn_mock::EngineConnection::new() + .await + .map_err(|e| format!("{:?}", e))?, + )), + fs: Arc::new(FileManager::new(fs_manager)), + stdlib: Arc::new(StdLib::new()), + settings, + context_type: ContextType::Mock, + }) + } + + #[cfg(not(target_arch = "wasm32"))] + pub fn new_forwarded_mock(engine: Arc>) -> Self { + ExecutorContext { + engine, + fs: Arc::new(FileManager::new()), + stdlib: Arc::new(StdLib::new()), + settings: Default::default(), + context_type: ContextType::MockCustomForwarded, + } + } + /// Create a new default executor context. /// With a kittycad client. /// This allows for passing in `ZOO_API_TOKEN` and `ZOO_HOST` as environment @@ -2114,9 +1925,17 @@ impl ExecutorContext { /// This allows for passing in `ZOO_API_TOKEN` and `ZOO_HOST` as environment /// variables. #[cfg(not(target_arch = "wasm32"))] - pub async fn new_with_default_client(settings: ExecutorSettings) -> Result { + pub async fn new_with_default_client(units: UnitLength) -> Result { // Create the client. - let ctx = Self::new_with_client(settings, None, None).await?; + let ctx = Self::new_with_client( + ExecutorSettings { + units, + ..Default::default() + }, + None, + None, + ) + .await?; Ok(ctx) } @@ -2134,6 +1953,7 @@ impl ExecutorContext { enable_ssao: false, show_grid: false, replay: None, + project_directory: None, }, None, engine_addr, @@ -2144,166 +1964,302 @@ impl ExecutorContext { pub async fn reset_scene( &self, - id_generator: &mut IdGenerator, - source_range: crate::executor::SourceRange, - ) -> Result<()> { - self.engine.clear_scene(id_generator, source_range).await?; + exec_state: &mut ExecState, + source_range: crate::execution::SourceRange, + ) -> Result<(), KclError> { + self.engine + .clear_scene(&mut exec_state.global.id_generator, source_range) + .await?; + + // We do not create the planes here as the post hook in wasm will do that + // AND if we aren't in wasm it doesn't really matter. + Ok(()) + } + // Given an old ast, old program memory and new ast, find the parts of the code that need to be + // re-executed. + // This function should never error, because in the case of any internal error, we should just pop + // the cache. + pub async fn get_changed_program(&self, info: CacheInformation) -> Option { + let Some(old) = info.old else { + // We have no old info, we need to re-execute the whole thing. + return Some(CacheResult { + clear_scene: true, + program: info.new_ast, + }); + }; + + // If the settings are different we might need to bust the cache. + // We specifically do this before checking if they are the exact same. + if old.settings != self.settings { + // If the units are different we need to re-execute the whole thing. + if old.settings.units != self.settings.units { + return Some(CacheResult { + clear_scene: true, + program: info.new_ast, + }); + } + + // If anything else is different we do not need to re-execute, but rather just + // run the settings again. + + if self + .engine + .reapply_settings(&self.settings, Default::default()) + .await + .is_err() + { + // Bust the cache, we errored. + return Some(CacheResult { + clear_scene: true, + program: info.new_ast, + }); + } + } + + // If the ASTs are the EXACT same we return None. + // We don't even need to waste time computing the digests. + if old.ast == info.new_ast { + return None; + } + + let mut old_ast = old.ast; + let mut new_ast = info.new_ast; + + // The digests should already be computed, but just in case we don't + // want to compare against none. + old_ast.compute_digest(); + new_ast.compute_digest(); + + // Check if the digest is the same. + if old_ast.digest == new_ast.digest { + return None; + } + + // Check if the changes were only to Non-code areas, like comments or whitespace. + Some(self.generate_changed_program(old_ast, new_ast)) + } + + /// Force-generate a new CacheResult, even if one shouldn't be made. The + /// way in which this gets invoked should always be through + /// [Self::get_changed_program]. This is purely to contain the logic on + /// how we construct a new [CacheResult]. + pub fn generate_changed_program(&self, old_ast: Node, new_ast: Node) -> CacheResult { + let mut generated_program = new_ast.clone(); + generated_program.body = vec![]; + + if !old_ast.body.iter().zip(new_ast.body.iter()).all(|(old, new)| { + let old_node: WalkNode = old.into(); + let new_node: WalkNode = new.into(); + old_node.digest() == new_node.digest() + }) { + // If any of the nodes are different in the stretch of body that + // overlaps, we have to bust cache and rebuild the scene. This + // means a single insertion or deletion will result in a cache + // bust. + + return CacheResult { + clear_scene: true, + program: new_ast, + }; + } + + // otherwise the overlapping section of the ast bodies matches. + // Let's see what the rest of the slice looks like. + + match new_ast.body.len().cmp(&old_ast.body.len()) { + std::cmp::Ordering::Less => { + // the new AST is shorter than the old AST -- statements + // were removed from the "current" code in the "new" code. + // + // Statements up until now match which means this is a + // "pure delete" of the remaining slice, when we get to + // supporting that. + + // Cache bust time. + CacheResult { + clear_scene: true, + program: new_ast, + } + } + std::cmp::Ordering::Greater => { + // the new AST is longer than the old AST, which means + // statements were added to the new code we haven't previously + // seen. + // + // Statements up until now are the same, which means this + // is a "pure addition" of the remaining slice. + + generated_program + .body + .extend_from_slice(&new_ast.body[old_ast.body.len()..]); + + CacheResult { + clear_scene: false, + program: generated_program, + } + } + std::cmp::Ordering::Equal => { + // currently unreachable, but lets pretend like the code + // above can do something meaningful here for when we get + // to diffing and yanking chunks of the program apart. + + // We don't actually want to do anything here; so we're going + // to not clear and do nothing. Is this wrong? I don't think + // so but i think many things. This def needs to change + // when the code above changes. + + CacheResult { + clear_scene: false, + program: generated_program, + } + } + } + } + + /// Perform the execution of a program. + /// You can optionally pass in some initialization memory. + /// Kurt uses this for partial execution. + pub async fn run(&self, cache_info: CacheInformation, exec_state: &mut ExecState) -> Result<(), KclError> { + self.run_with_session_data(cache_info, exec_state).await?; Ok(()) } - /// Perform the execution of a program. - /// You can optionally pass in some initialization memory. - /// Kurt uses this for partial execution. - pub async fn run( - &self, - program: &crate::ast::types::Program, - memory: Option, - id_generator: IdGenerator, - project_directory: Option, - ) -> Result { - self.run_with_session_data(program, memory, id_generator, project_directory) - .await - .map(|x| x.0) - } /// Perform the execution of a program. /// You can optionally pass in some initialization memory. /// Kurt uses this for partial execution. pub async fn run_with_session_data( &self, - program: &crate::ast::types::Program, - memory: Option, - id_generator: IdGenerator, - project_directory: Option, - ) -> Result<(ExecState, Option), KclError> { - let memory = if let Some(memory) = memory { - memory.clone() - } else { - Default::default() - }; - let mut exec_state = ExecState { - memory, - id_generator, - project_directory, - ..Default::default() - }; - // Before we even start executing the program, set the units. - self.engine - .batch_modeling_cmd( - exec_state.id_generator.next_uuid(), - SourceRange::default(), - &ModelingCmd::from(mcmd::SetSceneUnits { - unit: match self.settings.units { - UnitLength::Cm => kcmc::units::UnitLength::Centimeters, - UnitLength::Ft => kcmc::units::UnitLength::Feet, - UnitLength::In => kcmc::units::UnitLength::Inches, - UnitLength::M => kcmc::units::UnitLength::Meters, - UnitLength::Mm => kcmc::units::UnitLength::Millimeters, - UnitLength::Yd => kcmc::units::UnitLength::Yards, - }, - }), - ) - .await?; + cache_info: CacheInformation, + exec_state: &mut ExecState, + ) -> Result, KclError> { + let _stats = crate::log::LogPerfStats::new("Interpretation"); - self.inner_execute(program, &mut exec_state, crate::executor::BodyType::Root) + // Get the program that actually changed from the old and new information. + let cache_result = self.get_changed_program(cache_info.clone()).await; + + // Check if we don't need to re-execute. + let Some(cache_result) = cache_result else { + return Ok(None); + }; + + if cache_result.clear_scene && !self.is_mock() { + // Pop the execution state, since we are starting fresh. + exec_state.reset(); + + // We don't do this in mock mode since there is no engine connection + // anyways and from the TS side we override memory and don't want to clear it. + self.reset_scene(exec_state, Default::default()).await?; + } + + // Re-apply the settings, in case the cache was busted. + self.engine.reapply_settings(&self.settings, Default::default()).await?; + + self.inner_execute(&cache_result.program, exec_state, crate::execution::BodyType::Root) .await?; let session_data = self.engine.get_session_data(); - Ok((exec_state, session_data)) + Ok(session_data) } /// Execute an AST's program. #[async_recursion] - pub(crate) async fn inner_execute( - &self, - program: &crate::ast::types::Program, + pub(crate) async fn inner_execute<'a>( + &'a self, + program: NodeRef<'a, crate::parsing::ast::types::Program>, exec_state: &mut ExecState, body_type: BodyType, ) -> Result, KclError> { + if let Some((annotation, source_range)) = program + .non_code_meta + .start_nodes + .iter() + .filter_map(|n| { + n.annotation(annotations::SETTINGS) + .map(|result| (result, n.as_source_range())) + }) + .next() + { + exec_state + .mod_local + .settings + .update_from_annotation(annotation, source_range)?; + } + let mut last_expr = None; // Iterate over the body of the program. for statement in &program.body { match statement { BodyItem::ImportStatement(import_stmt) => { let source_range = SourceRange::from(import_stmt); - let path = import_stmt.path.clone(); - let resolved_path = if let Some(project_dir) = &exec_state.project_directory { - std::path::PathBuf::from(project_dir).join(&path) - } else { - std::path::PathBuf::from(&path) - }; - if exec_state.import_stack.contains(&resolved_path) { - return Err(KclError::ImportCycle(KclErrorDetails { - message: format!( - "circular import of modules is not allowed: {} -> {}", - exec_state - .import_stack - .iter() - .map(|p| p.as_path().to_string_lossy()) - .collect::>() - .join(" -> "), - resolved_path.to_string_lossy() - ), - source_ranges: vec![import_stmt.into()], - })); - } - let source = self.fs.read_to_string(&resolved_path, source_range).await?; - let program = crate::parser::parse(&source)?; - let (module_memory, module_exports) = { - exec_state.import_stack.push(resolved_path.clone()); - let original_execution = self.engine.replace_execution_kind(ExecutionKind::Isolated); - let original_memory = std::mem::take(&mut exec_state.memory); - let original_exports = std::mem::take(&mut exec_state.module_exports); - let result = self - .inner_execute(&program, exec_state, crate::executor::BodyType::Root) - .await; - let module_exports = std::mem::replace(&mut exec_state.module_exports, original_exports); - let module_memory = std::mem::replace(&mut exec_state.memory, original_memory); - self.engine.replace_execution_kind(original_execution); - exec_state.import_stack.pop(); + let module_id = self.open_module(&import_stmt.path, exec_state, source_range).await?; - result.map_err(|err| { - if let KclError::ImportCycle(_) = err { - // It was an import cycle. Keep the original message. - err.override_source_ranges(vec![source_range]) - } else { - KclError::Semantic(KclErrorDetails { - message: format!( - "Error loading imported file. Open it to view more details. {path}: {}", - err.message() - ), - source_ranges: vec![source_range], - }) + match &import_stmt.selector { + ImportSelector::List { items } => { + let (_, module_memory, module_exports) = self + .exec_module(module_id, exec_state, ExecutionKind::Isolated, source_range) + .await?; + for import_item in items { + // Extract the item from the module. + let item = + module_memory + .get(&import_item.name.name, import_item.into()) + .map_err(|_err| { + KclError::UndefinedValue(KclErrorDetails { + message: format!("{} is not defined in module", import_item.name.name), + source_ranges: vec![SourceRange::from(&import_item.name)], + }) + })?; + // Check that the item is allowed to be imported. + if !module_exports.contains(&import_item.name.name) { + return Err(KclError::Semantic(KclErrorDetails { + message: format!( + "Cannot import \"{}\" from module because it is not exported. Add \"export\" before the definition to export it.", + import_item.name.name + ), + source_ranges: vec![SourceRange::from(&import_item.name)], + })); + } + + // Add the item to the current module. + exec_state.mut_memory().add( + import_item.identifier(), + item.clone(), + SourceRange::from(&import_item.name), + )?; + + if let ItemVisibility::Export = import_stmt.visibility { + exec_state + .mod_local + .module_exports + .push(import_item.identifier().to_owned()); + } } - })?; - - (module_memory, module_exports) - }; - for import_item in &import_stmt.items { - // Extract the item from the module. - let item = module_memory - .get(&import_item.name.name, import_item.into()) - .map_err(|_err| { - KclError::UndefinedValue(KclErrorDetails { - message: format!("{} is not defined in module", import_item.name.name), - source_ranges: vec![SourceRange::from(&import_item.name)], - }) - })?; - // Check that the item is allowed to be imported. - if !module_exports.contains(&import_item.name.name) { - return Err(KclError::Semantic(KclErrorDetails { - message: format!( - "Cannot import \"{}\" from module because it is not exported. Add \"export\" before the definition to export it.", - import_item.name.name - ), - source_ranges: vec![SourceRange::from(&import_item.name)], - })); } + ImportSelector::Glob(_) => { + let (_, module_memory, module_exports) = self + .exec_module(module_id, exec_state, ExecutionKind::Isolated, source_range) + .await?; + for name in module_exports.iter() { + let item = module_memory.get(name, source_range).map_err(|_err| { + KclError::Internal(KclErrorDetails { + message: format!("{} is not defined in module (but was exported?)", name), + source_ranges: vec![source_range], + }) + })?; + exec_state.mut_memory().add(name, item.clone(), source_range)?; - // Add the item to the current module. - exec_state.memory.add( - import_item.identifier(), - item.clone(), - SourceRange::from(&import_item.name), - )?; + if let ItemVisibility::Export = import_stmt.visibility { + exec_state.mod_local.module_exports.push(name.clone()); + } + } + } + ImportSelector::None { .. } => { + let name = import_stmt.module_name().unwrap(); + let item = KclValue::Module { + value: module_id, + meta: vec![source_range.into()], + }; + exec_state.mut_memory().add(&name, item, source_range)?; + } } last_expr = None; } @@ -2320,34 +2276,23 @@ impl ExecutorContext { ); } BodyItem::VariableDeclaration(variable_declaration) => { - for declaration in &variable_declaration.declarations { - let var_name = declaration.id.name.to_string(); - let source_range = SourceRange::from(&declaration.init); - let metadata = Metadata { source_range }; + let var_name = variable_declaration.declaration.id.name.to_string(); + let source_range = SourceRange::from(&variable_declaration.declaration.init); + let metadata = Metadata { source_range }; - let memory_item = self - .execute_expr( - &declaration.init, - exec_state, - &metadata, - StatementKind::Declaration { name: &var_name }, - ) - .await?; - let is_function = memory_item.is_function(); - exec_state.memory.add(&var_name, memory_item, source_range)?; - // Track exports. - match variable_declaration.visibility { - ItemVisibility::Export => { - if !is_function { - return Err(KclError::Semantic(KclErrorDetails { - message: "Only functions can be exported".to_owned(), - source_ranges: vec![source_range], - })); - } - exec_state.module_exports.insert(var_name); - } - ItemVisibility::Default => {} - } + let memory_item = self + .execute_expr( + &variable_declaration.declaration.init, + exec_state, + &metadata, + StatementKind::Declaration { name: &var_name }, + ) + .await?; + exec_state.mut_memory().add(&var_name, memory_item, source_range)?; + + // Track exports. + if let ItemVisibility::Export = variable_declaration.visibility { + exec_state.mod_local.module_exports.push(var_name); } last_expr = None; } @@ -2361,7 +2306,7 @@ impl ExecutorContext { StatementKind::Expression, ) .await?; - exec_state.memory.return_ = Some(value); + exec_state.mut_memory().return_ = Some(value); last_expr = None; } } @@ -2374,7 +2319,7 @@ impl ExecutorContext { // True here tells the engine to flush all the end commands as well like fillets // and chamfers where the engine would otherwise eat the ID of the segments. true, - SourceRange([program.end, program.end]), + SourceRange::new(program.end, program.end, program.module_id), ) .await?; } @@ -2382,7 +2327,84 @@ impl ExecutorContext { Ok(last_expr) } - pub async fn execute_expr<'a>( + async fn open_module( + &self, + path: &str, + exec_state: &mut ExecState, + source_range: SourceRange, + ) -> Result { + let resolved_path = if let Some(project_dir) = &self.settings.project_directory { + project_dir.join(path) + } else { + std::path::PathBuf::from(&path) + }; + + if exec_state.mod_local.import_stack.contains(&resolved_path) { + return Err(KclError::ImportCycle(KclErrorDetails { + message: format!( + "circular import of modules is not allowed: {} -> {}", + exec_state + .mod_local + .import_stack + .iter() + .map(|p| p.as_path().to_string_lossy()) + .collect::>() + .join(" -> "), + resolved_path.to_string_lossy() + ), + source_ranges: vec![source_range], + })); + } + exec_state.add_module(resolved_path.clone(), self, source_range).await + } + + async fn exec_module( + &self, + module_id: ModuleId, + exec_state: &mut ExecState, + exec_kind: ExecutionKind, + source_range: SourceRange, + ) -> Result<(Option, ProgramMemory, Vec), KclError> { + // TODO It sucks that we have to clone the whole module AST here + let info = exec_state.global.module_infos[&module_id].clone(); + + let mut local_state = ModuleState { + import_stack: exec_state.mod_local.import_stack.clone(), + ..Default::default() + }; + local_state.import_stack.push(info.path.clone()); + std::mem::swap(&mut exec_state.mod_local, &mut local_state); + let original_execution = self.engine.replace_execution_kind(exec_kind); + + // The unwrap here is safe since we only elide the AST for the top module. + let result = self + .inner_execute(&info.parsed.unwrap(), exec_state, crate::execution::BodyType::Root) + .await; + + std::mem::swap(&mut exec_state.mod_local, &mut local_state); + self.engine.replace_execution_kind(original_execution); + + let result = result.map_err(|err| { + if let KclError::ImportCycle(_) = err { + // It was an import cycle. Keep the original message. + err.override_source_ranges(vec![source_range]) + } else { + KclError::Semantic(KclErrorDetails { + message: format!( + "Error loading imported file. Open it to view more details. {}: {}", + info.path.display(), + err.message() + ), + source_ranges: vec![source_range], + }) + } + })?; + + Ok((result, local_state.memory, local_state.module_exports)) + } + + #[async_recursion] + pub async fn execute_expr<'a: 'async_recursion>( &self, init: &Expr, exec_state: &mut ExecState, @@ -2394,8 +2416,23 @@ impl ExecutorContext { Expr::Literal(literal) => KclValue::from(literal), Expr::TagDeclarator(tag) => tag.execute(exec_state).await?, Expr::Identifier(identifier) => { - let value = exec_state.memory.get(&identifier.name, identifier.into())?; - value.clone() + let value = exec_state.memory().get(&identifier.name, identifier.into())?.clone(); + if let KclValue::Module { value: module_id, meta } = value { + let (result, _, _) = self + .exec_module(module_id, exec_state, ExecutionKind::Normal, metadata.source_range) + .await?; + result.ok_or_else(|| { + KclError::Semantic(KclErrorDetails { + message: format!( + "Evaluating module `{}` as part of an assembly did not produce a result", + identifier.name + ), + source_ranges: vec![metadata.source_range, meta[0].source_range], + }) + })? + } else { + value + } } Expr::BinaryExpression(binary_expression) => binary_expression.get_result(exec_state, self).await?, Expr::FunctionExpression(function_expression) => { @@ -2406,10 +2443,11 @@ impl ExecutorContext { expression: function_expression.clone(), meta: vec![metadata.to_owned()], func: None, - memory: Box::new(exec_state.memory.clone()), + memory: Box::new(exec_state.memory().clone()), } } Expr::CallExpression(call_expression) => call_expression.execute(exec_state, self).await?, + Expr::CallExpressionKw(call_expression) => call_expression.execute(exec_state, self).await?, Expr::PipeExpression(pipe_expression) => pipe_expression.get_result(exec_state, self).await?, Expr::PipeSubstitution(pipe_substitution) => match statement_kind { StatementKind::Declaration { name } => { @@ -2422,7 +2460,7 @@ impl ExecutorContext { source_ranges: vec![pipe_substitution.into()], })); } - StatementKind::Expression => match exec_state.pipe_value.clone() { + StatementKind::Expression => match exec_state.mod_local.pipe_value.clone() { Some(x) => x, None => { return Err(KclError::Semantic(KclErrorDetails { @@ -2438,6 +2476,16 @@ impl ExecutorContext { Expr::MemberExpression(member_expression) => member_expression.get_result(exec_state)?, Expr::UnaryExpression(unary_expression) => unary_expression.get_result(exec_state, self).await?, Expr::IfExpression(expr) => expr.get_result(exec_state, self).await?, + Expr::LabelledExpression(expr) => { + let result = self + .execute_expr(&expr.expr, exec_state, metadata, statement_kind) + .await?; + exec_state + .mut_memory() + .add(&expr.label.name, result.clone(), init.into())?; + // TODO this lets us use the label as a variable name, but not as a tag in most cases + result + } }; Ok(item) } @@ -2447,20 +2495,13 @@ impl ExecutorContext { self.settings.units = units; } - /// Execute the program, then get a PNG screenshot. - pub async fn execute_and_prepare_snapshot( - &self, - program: &Program, - id_generator: IdGenerator, - project_directory: Option, - ) -> Result { - let _ = self.run(program, None, id_generator, project_directory).await?; - + /// Get a snapshot of the current scene. + pub async fn prepare_snapshot(&self) -> std::result::Result { // Zoom to fit. self.engine .send_modeling_cmd( uuid::Uuid::new_v4(), - crate::executor::SourceRange::default(), + crate::execution::SourceRange::default(), ModelingCmd::from(mcmd::ZoomToFit { object_ids: Default::default(), animated: false, @@ -2474,7 +2515,7 @@ impl ExecutorContext { .engine .send_modeling_cmd( uuid::Uuid::new_v4(), - crate::executor::SourceRange::default(), + crate::execution::SourceRange::default(), ModelingCmd::from(mcmd::TakeSnapshot { format: ImageFormat::Png, }), @@ -2485,18 +2526,31 @@ impl ExecutorContext { modeling_response: OkModelingCmdResponse::TakeSnapshot(contents), } = resp else { - anyhow::bail!("Unexpected response from engine: {:?}", resp); + return Err(ExecError::BadPng(format!( + "Instead of a TakeSnapshot response, the engine returned {resp:?}" + ))); }; Ok(contents) } + + /// Execute the program, then get a PNG screenshot. + pub async fn execute_and_prepare_snapshot( + &self, + program: &Program, + exec_state: &mut ExecState, + ) -> std::result::Result { + self.run(program.clone().into(), exec_state).await?; + + self.prepare_snapshot().await + } } /// For each argument given, /// assign it to a parameter of the function, in the given block of function memory. /// Returns Err if too few/too many arguments were given for the function. fn assign_args_to_params( - function_expression: &FunctionExpression, - args: Vec, + function_expression: NodeRef<'_, FunctionExpression>, + args: Vec, mut fn_memory: ProgramMemory, ) -> Result { let num_args = function_expression.number_of_args(); @@ -2522,16 +2576,15 @@ fn assign_args_to_params( for (index, param) in function_expression.params.iter().enumerate() { if let Some(arg) = args.get(index) { // Argument was provided. - fn_memory.add(¶m.identifier.name, arg.clone(), (¶m.identifier).into())?; + fn_memory.add(¶m.identifier.name, arg.value.clone(), (¶m.identifier).into())?; } else { // Argument was not provided. - if param.optional { + if let Some(ref default_val) = param.default_value { // If the corresponding parameter is optional, // then it's fine, the user doesn't need to supply it. - let none = KclNone::new(param.identifier.start, param.identifier.end); fn_memory.add( ¶m.identifier.name, - KclValue::from(&none), + default_val.clone().into(), (¶m.identifier).into(), )?; } else { @@ -2544,10 +2597,63 @@ fn assign_args_to_params( Ok(fn_memory) } +fn assign_args_to_params_kw( + function_expression: NodeRef<'_, FunctionExpression>, + mut args: crate::std::args::KwArgs, + mut fn_memory: ProgramMemory, +) -> Result { + // Add the arguments to the memory. A new call frame should have already + // been created. + let source_ranges = vec![function_expression.into()]; + for param in function_expression.params.iter() { + if param.labeled { + let arg = args.labeled.get(¶m.identifier.name); + let arg_val = match arg { + Some(arg) => arg.value.clone(), + None => match param.default_value { + Some(ref default_val) => KclValue::from(default_val.clone()), + None => { + return Err(KclError::Semantic(KclErrorDetails { + source_ranges, + message: format!( + "This function requires a parameter {}, but you haven't passed it one.", + param.identifier.name + ), + })); + } + }, + }; + fn_memory.add(¶m.identifier.name, arg_val, (¶m.identifier).into())?; + } else { + let Some(unlabeled) = args.unlabeled.take() else { + let param_name = ¶m.identifier.name; + return Err(if args.labeled.contains_key(param_name) { + KclError::Semantic(KclErrorDetails { + source_ranges, + message: format!("The function does declare a parameter named '{param_name}', but this parameter doesn't use a label. Try removing the `{param_name}:`"), + }) + } else { + KclError::Semantic(KclErrorDetails { + source_ranges, + message: "This function expects an unlabeled first parameter, but you haven't passed it one." + .to_owned(), + }) + }); + }; + fn_memory.add( + ¶m.identifier.name, + unlabeled.value.clone(), + (¶m.identifier).into(), + )?; + } + } + Ok(fn_memory) +} + pub(crate) async fn call_user_defined_function( - args: Vec, + args: Vec, memory: &ProgramMemory, - function_expression: &FunctionExpression, + function_expression: NodeRef<'_, FunctionExpression>, exec_state: &mut ExecState, ctx: &ExecutorContext, ) -> Result, KclError> { @@ -2561,12 +2667,42 @@ pub(crate) async fn call_user_defined_function( // Execute the function body using the memory we just created. let (result, fn_memory) = { - let previous_memory = std::mem::replace(&mut exec_state.memory, fn_memory); + let previous_memory = std::mem::replace(&mut exec_state.mod_local.memory, fn_memory); let result = ctx .inner_execute(&function_expression.body, exec_state, BodyType::Block) .await; // Restore the previous memory. - let fn_memory = std::mem::replace(&mut exec_state.memory, previous_memory); + let fn_memory = std::mem::replace(&mut exec_state.mod_local.memory, previous_memory); + + (result, fn_memory) + }; + + result.map(|_| fn_memory.return_) +} + +pub(crate) async fn call_user_defined_function_kw( + args: crate::std::args::KwArgs, + memory: &ProgramMemory, + function_expression: NodeRef<'_, FunctionExpression>, + exec_state: &mut ExecState, + ctx: &ExecutorContext, +) -> Result, KclError> { + // Create a new environment to execute the function body in so that local + // variables shadow variables in the parent scope. The new environment's + // parent should be the environment of the closure. + let mut body_memory = memory.clone(); + let body_env = body_memory.new_env_for_call(memory.current_env); + body_memory.current_env = body_env; + let fn_memory = assign_args_to_params_kw(function_expression, args, body_memory)?; + + // Execute the function body using the memory we just created. + let (result, fn_memory) = { + let previous_memory = std::mem::replace(&mut exec_state.mod_local.memory, fn_memory); + let result = ctx + .inner_execute(&function_expression.body, exec_state, BodyType::Block) + .await; + // Restore the previous memory. + let fn_memory = std::mem::replace(&mut exec_state.mod_local.memory, previous_memory); (result, fn_memory) }; @@ -2586,12 +2722,14 @@ mod tests { use pretty_assertions::assert_eq; use super::*; - use crate::ast::types::{Identifier, Parameter}; + use crate::{ + parsing::ast::types::{DefaultParamVal, Identifier, Node, Parameter}, + OldAstState, + }; + + async fn parse_execute(code: &str) -> Result<(Program, ExecutorContext, ExecState)> { + let program = Program::parse_no_errs(code)?; - pub async fn parse_execute(code: &str) -> Result { - let tokens = crate::token::lexer(code)?; - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast()?; let ctx = ExecutorContext { engine: Arc::new(Box::new(crate::engine::conn_mock::EngineConnection::new().await?)), fs: Arc::new(crate::fs::FileManager::new()), @@ -2599,80 +2737,16 @@ mod tests { settings: Default::default(), context_type: ContextType::Mock, }; - let exec_state = ctx.run(&program, None, IdGenerator::default(), None).await?; + let mut exec_state = ExecState::default(); + ctx.run(program.clone().into(), &mut exec_state).await?; - Ok(exec_state.memory) + Ok((program, ctx, exec_state)) } /// Convenience function to get a JSON value from memory and unwrap. - fn mem_get_json(memory: &ProgramMemory, name: &str) -> serde_json::Value { - memory - .get(name, SourceRange::default()) - .unwrap() - .get_json_value() - .unwrap() - } - - #[tokio::test(flavor = "multi_thread")] - async fn test_execute_assign_two_variables() { - let ast = r#"const myVar = 5 -const newVar = myVar + 1"#; - let memory = parse_execute(ast).await.unwrap(); - assert_eq!( - serde_json::json!(5), - memory - .get("myVar", SourceRange::default()) - .unwrap() - .get_json_value() - .unwrap() - ); - assert_eq!( - serde_json::json!(6.0), - memory - .get("newVar", SourceRange::default()) - .unwrap() - .get_json_value() - .unwrap() - ); - } - - #[tokio::test(flavor = "multi_thread")] - async fn test_execute_angled_line_that_intersects() { - let ast_fn = |offset: &str| -> String { - format!( - r#"const part001 = startSketchOn('XY') - |> startProfileAt([0, 0], %) - |> lineTo([2, 2], %, $yo) - |> lineTo([3, 1], %) - |> angledLineThatIntersects({{ - angle: 180, - intersectTag: yo, - offset: {}, -}}, %, $yo2) -const intersect = segEndX(yo2)"#, - offset - ) - }; - - let memory = parse_execute(&ast_fn("-1")).await.unwrap(); - assert_eq!( - serde_json::json!(1.0 + 2.0f64.sqrt()), - memory - .get("intersect", SourceRange::default()) - .unwrap() - .get_json_value() - .unwrap() - ); - - let memory = parse_execute(&ast_fn("0")).await.unwrap(); - assert_eq!( - serde_json::json!(1.0000000000000002), - memory - .get("intersect", SourceRange::default()) - .unwrap() - .get_json_value() - .unwrap() - ); + #[track_caller] + fn mem_get_json(memory: &ProgramMemory, name: &str) -> KclValue { + memory.get(name, SourceRange::default()).unwrap().to_owned() } #[tokio::test(flavor = "multi_thread")] @@ -2994,14 +3068,14 @@ for var in [[3, 6, 10, [0,0]], [1.5, 3, 5, [-10,-10]]] { #[tokio::test(flavor = "multi_thread")] async fn test_get_member_of_array_with_function() { - let ast = r#"fn box = (array) => { + let ast = r#"fn box = (arr) => { let myBox =startSketchOn('XY') - |> startProfileAt(array[0], %) - |> line([0, array[1]], %) - |> line([array[2], 0], %) - |> line([0, -array[1]], %) + |> startProfileAt(arr[0], %) + |> line([0, arr[1]], %) + |> line([arr[2], 0], %) + |> line([0, -arr[1]], %) |> close(%) - |> extrude(array[3], %) + |> extrude(arr[3], %) return myBox } @@ -3030,7 +3104,32 @@ const answer = returnX()"#; err, KclError::UndefinedValue(KclErrorDetails { message: "memory item key `x` is not defined".to_owned(), - source_ranges: vec![SourceRange([64, 65]), SourceRange([97, 106])], + source_ranges: vec![ + SourceRange::new(64, 65, ModuleId::default()), + SourceRange::new(97, 106, ModuleId::default()) + ], + }), + ); + } + + #[tokio::test(flavor = "multi_thread")] + async fn test_cannot_shebang_in_fn() { + let ast = r#" +fn foo () { + #!hello + return true +} + +foo +"#; + + let result = parse_execute(ast).await; + let err = result.unwrap_err().downcast::().unwrap(); + assert_eq!( + err, + KclError::Syntax(KclErrorDetails { + message: "Unexpected token: #".to_owned(), + source_ranges: vec![SourceRange::new(15, 16, ModuleId::default())], }), ); } @@ -3065,205 +3164,49 @@ let shape = layer() |> patternTransform(10, transform, %) err, KclError::UndefinedValue(KclErrorDetails { message: "memory item key `x` is not defined".to_owned(), - source_ranges: vec![SourceRange([80, 81])], + source_ranges: vec![SourceRange::new(80, 81, ModuleId::default())], }), ); } - #[tokio::test(flavor = "multi_thread")] - async fn test_execute_function_with_parameter_redefined_outside() { - let ast = r#" -fn myIdentity = (x) => { - return x -} - -const x = 33 - -const two = myIdentity(2)"#; - - let memory = parse_execute(ast).await.unwrap(); - assert_eq!( - serde_json::json!(2), - memory - .get("two", SourceRange::default()) - .unwrap() - .get_json_value() - .unwrap() - ); - assert_eq!( - serde_json::json!(33), - memory - .get("x", SourceRange::default()) - .unwrap() - .get_json_value() - .unwrap() - ); - } - - #[tokio::test(flavor = "multi_thread")] - async fn test_execute_function_referencing_variable_in_parent_scope() { - let ast = r#" -const x = 22 -const y = 3 - -fn add = (x) => { - return x + y -} - -const answer = add(2)"#; - - let memory = parse_execute(ast).await.unwrap(); - assert_eq!( - serde_json::json!(5.0), - memory - .get("answer", SourceRange::default()) - .unwrap() - .get_json_value() - .unwrap() - ); - assert_eq!( - serde_json::json!(22), - memory - .get("x", SourceRange::default()) - .unwrap() - .get_json_value() - .unwrap() - ); - } - - #[tokio::test(flavor = "multi_thread")] - async fn test_execute_function_redefining_variable_in_parent_scope() { - let ast = r#" -const x = 1 - -fn foo = () => { - const x = 2 - return x -} - -const answer = foo()"#; - - let memory = parse_execute(ast).await.unwrap(); - assert_eq!( - serde_json::json!(2), - memory - .get("answer", SourceRange::default()) - .unwrap() - .get_json_value() - .unwrap() - ); - assert_eq!( - serde_json::json!(1), - memory - .get("x", SourceRange::default()) - .unwrap() - .get_json_value() - .unwrap() - ); - } - - #[tokio::test(flavor = "multi_thread")] - async fn test_execute_pattern_transform_function_redefining_variable_in_parent_scope() { - let ast = r#" -const scale = 100 -fn transform = (replicaId) => { - // Redefine same variable as in parent scope. - const scale = 2 - return { - translate: [0, 0, replicaId * 10], - scale: [scale, 1, 0], - } -} - -fn layer = () => { - return startSketchOn("XY") - |> circle({ center: [0, 0], radius: 1 }, %, $tag1) - |> extrude(10, %) -} - -// The 10 layers are replicas of each other, with a transform applied to each. -let shape = layer() |> patternTransform(10, transform, %)"#; - - let memory = parse_execute(ast).await.unwrap(); - // TODO: Assert that scale 2 was used. - assert_eq!( - serde_json::json!(100), - memory - .get("scale", SourceRange::default()) - .unwrap() - .get_json_value() - .unwrap() - ); - } + // ADAM: Move some of these into simulation tests. #[tokio::test(flavor = "multi_thread")] async fn test_math_execute_with_functions() { let ast = r#"const myVar = 2 + min(100, -1 + legLen(5, 3))"#; - let memory = parse_execute(ast).await.unwrap(); - assert_eq!( - serde_json::json!(5.0), - memory - .get("myVar", SourceRange::default()) - .unwrap() - .get_json_value() - .unwrap() - ); + let (_, _, exec_state) = parse_execute(ast).await.unwrap(); + assert_eq!(5.0, mem_get_json(exec_state.memory(), "myVar").as_f64().unwrap()); } #[tokio::test(flavor = "multi_thread")] async fn test_math_execute() { let ast = r#"const myVar = 1 + 2 * (3 - 4) / -5 + 6"#; - let memory = parse_execute(ast).await.unwrap(); - assert_eq!( - serde_json::json!(7.4), - memory - .get("myVar", SourceRange::default()) - .unwrap() - .get_json_value() - .unwrap() - ); + let (_, _, exec_state) = parse_execute(ast).await.unwrap(); + assert_eq!(7.4, mem_get_json(exec_state.memory(), "myVar").as_f64().unwrap()); } #[tokio::test(flavor = "multi_thread")] async fn test_math_execute_start_negative() { let ast = r#"const myVar = -5 + 6"#; - let memory = parse_execute(ast).await.unwrap(); - assert_eq!( - serde_json::json!(1.0), - memory - .get("myVar", SourceRange::default()) - .unwrap() - .get_json_value() - .unwrap() - ); + let (_, _, exec_state) = parse_execute(ast).await.unwrap(); + assert_eq!(1.0, mem_get_json(exec_state.memory(), "myVar").as_f64().unwrap()); } #[tokio::test(flavor = "multi_thread")] async fn test_math_execute_with_pi() { let ast = r#"const myVar = pi() * 2"#; - let memory = parse_execute(ast).await.unwrap(); + let (_, _, exec_state) = parse_execute(ast).await.unwrap(); assert_eq!( - serde_json::json!(std::f64::consts::TAU), - memory - .get("myVar", SourceRange::default()) - .unwrap() - .get_json_value() - .unwrap() + std::f64::consts::TAU, + mem_get_json(exec_state.memory(), "myVar").as_f64().unwrap() ); } #[tokio::test(flavor = "multi_thread")] async fn test_math_define_decimal_without_leading_zero() { let ast = r#"let thing = .4 + 7"#; - let memory = parse_execute(ast).await.unwrap(); - assert_eq!( - serde_json::json!(7.4), - memory - .get("thing", SourceRange::default()) - .unwrap() - .get_json_value() - .unwrap() - ); + let (_, _, exec_state) = parse_execute(ast).await.unwrap(); + assert_eq!(7.4, mem_get_json(exec_state.memory(), "thing").as_f64().unwrap()); } #[tokio::test(flavor = "multi_thread")] @@ -3302,11 +3245,11 @@ fn check = (x) => { } check(false) "#; - let mem = parse_execute(ast).await.unwrap(); - assert_eq!(serde_json::json!(false), mem_get_json(&mem, "notTrue")); - assert_eq!(serde_json::json!(true), mem_get_json(&mem, "notFalse")); - assert_eq!(serde_json::json!(true), mem_get_json(&mem, "c")); - assert_eq!(serde_json::json!(false), mem_get_json(&mem, "d")); + let (_, _, exec_state) = parse_execute(ast).await.unwrap(); + assert_eq!(false, mem_get_json(exec_state.memory(), "notTrue").as_bool().unwrap()); + assert_eq!(true, mem_get_json(exec_state.memory(), "notFalse").as_bool().unwrap()); + assert_eq!(true, mem_get_json(exec_state.memory(), "c").as_bool().unwrap()); + assert_eq!(false, mem_get_json(exec_state.memory(), "d").as_bool().unwrap()); } #[tokio::test(flavor = "multi_thread")] @@ -3319,8 +3262,8 @@ let notNull = !myNull assert_eq!( parse_execute(code1).await.unwrap_err().downcast::().unwrap(), KclError::Semantic(KclErrorDetails { - message: "Cannot apply unary operator ! to non-boolean value: null".to_owned(), - source_ranges: vec![SourceRange([56, 63])], + message: "Cannot apply unary operator ! to non-boolean value: number".to_owned(), + source_ranges: vec![SourceRange::new(56, 63, ModuleId::default())], }) ); @@ -3328,8 +3271,8 @@ let notNull = !myNull assert_eq!( parse_execute(code2).await.unwrap_err().downcast::().unwrap(), KclError::Semantic(KclErrorDetails { - message: "Cannot apply unary operator ! to non-boolean value: 0".to_owned(), - source_ranges: vec![SourceRange([14, 16])], + message: "Cannot apply unary operator ! to non-boolean value: number".to_owned(), + source_ranges: vec![SourceRange::new(14, 16, ModuleId::default())], }) ); @@ -3339,8 +3282,8 @@ let notEmptyString = !"" assert_eq!( parse_execute(code3).await.unwrap_err().downcast::().unwrap(), KclError::Semantic(KclErrorDetails { - message: "Cannot apply unary operator ! to non-boolean value: \"\"".to_owned(), - source_ranges: vec![SourceRange([22, 25])], + message: "Cannot apply unary operator ! to non-boolean value: string (text)".to_owned(), + source_ranges: vec![SourceRange::new(22, 25, ModuleId::default())], }) ); @@ -3351,8 +3294,8 @@ let notMember = !obj.a assert_eq!( parse_execute(code4).await.unwrap_err().downcast::().unwrap(), KclError::Semantic(KclErrorDetails { - message: "Cannot apply unary operator ! to non-boolean value: 1".to_owned(), - source_ranges: vec![SourceRange([36, 42])], + message: "Cannot apply unary operator ! to non-boolean value: number".to_owned(), + source_ranges: vec![SourceRange::new(36, 42, ModuleId::default())], }) ); @@ -3362,8 +3305,8 @@ let notArray = !a"; assert_eq!( parse_execute(code5).await.unwrap_err().downcast::().unwrap(), KclError::Semantic(KclErrorDetails { - message: "Cannot apply unary operator ! to non-boolean value: []".to_owned(), - source_ranges: vec![SourceRange([27, 29])], + message: "Cannot apply unary operator ! to non-boolean value: array (list)".to_owned(), + source_ranges: vec![SourceRange::new(27, 29, ModuleId::default())], }) ); @@ -3373,8 +3316,8 @@ let notObject = !x"; assert_eq!( parse_execute(code6).await.unwrap_err().downcast::().unwrap(), KclError::Semantic(KclErrorDetails { - message: "Cannot apply unary operator ! to non-boolean value: {}".to_owned(), - source_ranges: vec![SourceRange([28, 30])], + message: "Cannot apply unary operator ! to non-boolean value: object".to_owned(), + source_ranges: vec![SourceRange::new(28, 30, ModuleId::default())], }) ); @@ -3401,7 +3344,7 @@ let notTagDeclarator = !myTagDeclarator"; assert!( tag_declarator_err .message() - .starts_with("Cannot apply unary operator ! to non-boolean value: {\"type\":\"TagDeclarator\","), + .starts_with("Cannot apply unary operator ! to non-boolean value: TagDeclarator"), "Actual error: {:?}", tag_declarator_err ); @@ -3415,7 +3358,7 @@ let notTagIdentifier = !myTag"; assert!( tag_identifier_err .message() - .starts_with("Cannot apply unary operator ! to non-boolean value: {\"type\":\"TagIdentifier\","), + .starts_with("Cannot apply unary operator ! to non-boolean value: TagIdentifier"), "Actual error: {:?}", tag_identifier_err ); @@ -3427,7 +3370,7 @@ let notTagIdentifier = !myTag"; parse_execute(code10).await.unwrap_err().downcast::().unwrap(), KclError::Syntax(KclErrorDetails { message: "Unexpected token: !".to_owned(), - source_ranges: vec![SourceRange([14, 15])], + source_ranges: vec![SourceRange::new(14, 15, ModuleId::default())], }) ); @@ -3440,7 +3383,7 @@ let notPipeSub = 1 |> identity(!%))"; parse_execute(code11).await.unwrap_err().downcast::().unwrap(), KclError::Syntax(KclErrorDetails { message: "Unexpected token: |>".to_owned(), - source_ranges: vec![SourceRange([54, 56])], + source_ranges: vec![SourceRange::new(54, 56, ModuleId::default())], }) ); @@ -3484,10 +3427,10 @@ test([0, 0]) "#; let result = parse_execute(ast).await; assert!(result.is_err()); - assert_eq!( - result.unwrap_err().to_string(), - r#"undefined value: KclErrorDetails { source_ranges: [SourceRange([10, 34])], message: "Result of user-defined function test is undefined" }"#.to_owned() - ); + assert!(result + .unwrap_err() + .to_string() + .contains("Result of user-defined function test is undefined"),); } #[tokio::test(flavor = "multi_thread")] @@ -3553,24 +3496,23 @@ let w = f() + f() fn test_assign_args_to_params() { // Set up a little framework for this test. fn mem(number: usize) -> KclValue { - KclValue::UserVal(UserVal { - value: number.into(), + KclValue::Int { + value: number as i64, meta: Default::default(), - }) + } } - fn ident(s: &'static str) -> Identifier { - Identifier { - start: 0, - end: 0, + fn ident(s: &'static str) -> Node { + Node::no_src(Identifier { name: s.to_owned(), digest: None, - } + }) } fn opt_param(s: &'static str) -> Parameter { Parameter { identifier: ident(s), type_: None, - optional: true, + default_value: Some(DefaultParamVal::none()), + labeled: true, digest: None, } } @@ -3578,7 +3520,8 @@ let w = f() + f() Parameter { identifier: ident(s), type_: None, - optional: false, + default_value: None, + labeled: true, digest: None, } } @@ -3605,7 +3548,7 @@ let w = f() + f() vec![req_param("x")], vec![], Err(KclError::Semantic(KclErrorDetails { - source_ranges: vec![SourceRange([0, 0])], + source_ranges: vec![SourceRange::default()], message: "Expected 1 arguments, got 0".to_owned(), })), ), @@ -3613,17 +3556,14 @@ let w = f() + f() "all params optional, none given, should be OK", vec![opt_param("x")], vec![], - Ok(additional_program_memory(&[( - "x".to_owned(), - KclValue::from(&KclNone::default()), - )])), + Ok(additional_program_memory(&[("x".to_owned(), KclValue::none())])), ), ( "mixed params, too few given", vec![req_param("x"), opt_param("y")], vec![], Err(KclError::Semantic(KclErrorDetails { - source_ranges: vec![SourceRange([0, 0])], + source_ranges: vec![SourceRange::default()], message: "Expected 1-2 arguments, got 0".to_owned(), })), ), @@ -3633,7 +3573,7 @@ let w = f() + f() vec![mem(1)], Ok(additional_program_memory(&[ ("x".to_owned(), mem(1)), - ("y".to_owned(), KclValue::from(&KclNone::default())), + ("y".to_owned(), KclValue::none()), ])), ), ( @@ -3650,26 +3590,29 @@ let w = f() + f() vec![req_param("x"), opt_param("y")], vec![mem(1), mem(2), mem(3)], Err(KclError::Semantic(KclErrorDetails { - source_ranges: vec![SourceRange([0, 0])], + source_ranges: vec![SourceRange::default()], message: "Expected 1-2 arguments, got 3".to_owned(), })), ), ] { // Run each test. - let func_expr = &FunctionExpression { - start: 0, - end: 0, + let func_expr = &Node::no_src(FunctionExpression { params, - body: crate::ast::types::Program { + body: Node { + inner: crate::parsing::ast::types::Program { + body: Vec::new(), + non_code_meta: Default::default(), + shebang: None, + digest: None, + }, start: 0, end: 0, - body: Vec::new(), - non_code_meta: Default::default(), - digest: None, + module_id: ModuleId::default(), }, return_type: None, digest: None, - }; + }); + let args = args.into_iter().map(Arg::synthetic).collect(); let actual = assign_args_to_params(func_expr, args, ProgramMemory::new()); assert_eq!( actual, expected, @@ -3686,4 +3629,366 @@ let w = f() + f() let json = serde_json::to_string(&mem).unwrap(); assert_eq!(json, r#"{"type":"Solids","value":[]}"#); } + + // Easy case where we have no old ast and memory. + // We need to re-execute everything. + #[tokio::test(flavor = "multi_thread")] + async fn test_get_changed_program_no_old_information() { + let new = r#"// Remove the end face for the extrusion. +firstSketch = startSketchOn('XY') + |> startProfileAt([-12, 12], %) + |> line([24, 0], %) + |> line([0, -24], %) + |> line([-24, 0], %) + |> close(%) + |> extrude(6, %) + +// Remove the end face for the extrusion. +shell({ faces = ['end'], thickness = 0.25 }, firstSketch)"#; + let (program, ctx, _) = parse_execute(new).await.unwrap(); + + let result = ctx + .get_changed_program(CacheInformation { + old: None, + new_ast: program.ast.clone(), + }) + .await; + + assert!(result.is_some()); + + let result = result.unwrap(); + + assert_eq!(result.program, program.ast); + assert!(result.clear_scene); + } + + #[tokio::test(flavor = "multi_thread")] + async fn test_get_changed_program_same_code() { + let new = r#"// Remove the end face for the extrusion. +firstSketch = startSketchOn('XY') + |> startProfileAt([-12, 12], %) + |> line([24, 0], %) + |> line([0, -24], %) + |> line([-24, 0], %) + |> close(%) + |> extrude(6, %) + +// Remove the end face for the extrusion. +shell({ faces = ['end'], thickness = 0.25 }, firstSketch)"#; + + let (program, ctx, exec_state) = parse_execute(new).await.unwrap(); + + let result = ctx + .get_changed_program(CacheInformation { + old: Some(OldAstState { + ast: program.ast.clone(), + exec_state, + settings: Default::default(), + }), + new_ast: program.ast.clone(), + }) + .await; + + assert_eq!(result, None); + } + + #[tokio::test(flavor = "multi_thread")] + async fn test_get_changed_program_same_code_changed_whitespace() { + let old = r#" // Remove the end face for the extrusion. +firstSketch = startSketchOn('XY') + |> startProfileAt([-12, 12], %) + |> line([24, 0], %) + |> line([0, -24], %) + |> line([-24, 0], %) + |> close(%) + |> extrude(6, %) + +// Remove the end face for the extrusion. +shell({ faces = ['end'], thickness = 0.25 }, firstSketch) "#; + + let new = r#"// Remove the end face for the extrusion. +firstSketch = startSketchOn('XY') + |> startProfileAt([-12, 12], %) + |> line([24, 0], %) + |> line([0, -24], %) + |> line([-24, 0], %) + |> close(%) + |> extrude(6, %) + +// Remove the end face for the extrusion. +shell({ faces = ['end'], thickness = 0.25 }, firstSketch)"#; + + let (program_old, ctx, exec_state) = parse_execute(old).await.unwrap(); + + let program_new = crate::Program::parse_no_errs(new).unwrap(); + + let result = ctx + .get_changed_program(CacheInformation { + old: Some(OldAstState { + ast: program_old.ast.clone(), + exec_state, + settings: Default::default(), + }), + new_ast: program_new.ast.clone(), + }) + .await; + + assert_eq!(result, None); + } + + #[tokio::test(flavor = "multi_thread")] + async fn test_get_changed_program_same_code_changed_code_comment_start_of_program() { + let old = r#" // Removed the end face for the extrusion. +firstSketch = startSketchOn('XY') + |> startProfileAt([-12, 12], %) + |> line([24, 0], %) + |> line([0, -24], %) + |> line([-24, 0], %) + |> close(%) + |> extrude(6, %) + +// Remove the end face for the extrusion. +shell({ faces = ['end'], thickness = 0.25 }, firstSketch) "#; + + let new = r#"// Remove the end face for the extrusion. +firstSketch = startSketchOn('XY') + |> startProfileAt([-12, 12], %) + |> line([24, 0], %) + |> line([0, -24], %) + |> line([-24, 0], %) + |> close(%) + |> extrude(6, %) + +// Remove the end face for the extrusion. +shell({ faces = ['end'], thickness = 0.25 }, firstSketch)"#; + + let (program, ctx, exec_state) = parse_execute(old).await.unwrap(); + + let program_new = crate::Program::parse_no_errs(new).unwrap(); + + let result = ctx + .get_changed_program(CacheInformation { + old: Some(OldAstState { + ast: program.ast.clone(), + exec_state, + settings: Default::default(), + }), + new_ast: program_new.ast.clone(), + }) + .await; + + assert_eq!(result, None); + } + + #[tokio::test(flavor = "multi_thread")] + async fn test_get_changed_program_same_code_changed_code_comments() { + let old = r#" // Removed the end face for the extrusion. +firstSketch = startSketchOn('XY') + |> startProfileAt([-12, 12], %) + |> line([24, 0], %) + |> line([0, -24], %) + |> line([-24, 0], %) // my thing + |> close(%) + |> extrude(6, %) + +// Remove the end face for the extrusion. +shell({ faces = ['end'], thickness = 0.25 }, firstSketch) "#; + + let new = r#"// Remove the end face for the extrusion. +firstSketch = startSketchOn('XY') + |> startProfileAt([-12, 12], %) + |> line([24, 0], %) + |> line([0, -24], %) + |> line([-24, 0], %) + |> close(%) + |> extrude(6, %) + +// Remove the end face for the extrusion. +shell({ faces = ['end'], thickness = 0.25 }, firstSketch)"#; + + let (program, ctx, exec_state) = parse_execute(old).await.unwrap(); + + let program_new = crate::Program::parse_no_errs(new).unwrap(); + + let result = ctx + .get_changed_program(CacheInformation { + old: Some(OldAstState { + ast: program.ast.clone(), + exec_state, + settings: Default::default(), + }), + new_ast: program_new.ast.clone(), + }) + .await; + + assert!(result.is_none()); + } + + // Changing the units with the exact same file should bust the cache. + #[tokio::test(flavor = "multi_thread")] + async fn test_get_changed_program_same_code_but_different_units() { + let new = r#"// Remove the end face for the extrusion. +firstSketch = startSketchOn('XY') + |> startProfileAt([-12, 12], %) + |> line([24, 0], %) + |> line([0, -24], %) + |> line([-24, 0], %) + |> close(%) + |> extrude(6, %) + +// Remove the end face for the extrusion. +shell({ faces = ['end'], thickness = 0.25 }, firstSketch)"#; + + let (program, mut ctx, exec_state) = parse_execute(new).await.unwrap(); + + // Change the settings to cm. + ctx.settings.units = crate::UnitLength::Cm; + + let result = ctx + .get_changed_program(CacheInformation { + old: Some(OldAstState { + ast: program.ast.clone(), + exec_state, + settings: Default::default(), + }), + new_ast: program.ast.clone(), + }) + .await; + + assert!(result.is_some()); + + let result = result.unwrap(); + + assert_eq!(result.program, program.ast); + assert!(result.clear_scene); + } + + // Changing the grid settings with the exact same file should NOT bust the cache. + #[tokio::test(flavor = "multi_thread")] + async fn test_get_changed_program_same_code_but_different_grid_setting() { + let new = r#"// Remove the end face for the extrusion. +firstSketch = startSketchOn('XY') + |> startProfileAt([-12, 12], %) + |> line([24, 0], %) + |> line([0, -24], %) + |> line([-24, 0], %) + |> close(%) + |> extrude(6, %) + +// Remove the end face for the extrusion. +shell({ faces = ['end'], thickness = 0.25 }, firstSketch)"#; + + let (program, mut ctx, exec_state) = parse_execute(new).await.unwrap(); + + // Change the settings. + ctx.settings.show_grid = !ctx.settings.show_grid; + + let result = ctx + .get_changed_program(CacheInformation { + old: Some(OldAstState { + ast: program.ast.clone(), + exec_state, + settings: Default::default(), + }), + new_ast: program.ast.clone(), + }) + .await; + + assert_eq!(result, None); + } + + // Changing the edge visibility settings with the exact same file should NOT bust the cache. + #[tokio::test(flavor = "multi_thread")] + async fn test_get_changed_program_same_code_but_different_edge_visiblity_setting() { + let new = r#"// Remove the end face for the extrusion. +firstSketch = startSketchOn('XY') + |> startProfileAt([-12, 12], %) + |> line([24, 0], %) + |> line([0, -24], %) + |> line([-24, 0], %) + |> close(%) + |> extrude(6, %) + +// Remove the end face for the extrusion. +shell({ faces = ['end'], thickness = 0.25 }, firstSketch)"#; + + let (program, mut ctx, exec_state) = parse_execute(new).await.unwrap(); + + // Change the settings. + ctx.settings.highlight_edges = !ctx.settings.highlight_edges; + + let result = ctx + .get_changed_program(CacheInformation { + old: Some(OldAstState { + ast: program.ast.clone(), + exec_state, + settings: Default::default(), + }), + new_ast: program.ast.clone(), + }) + .await; + + assert_eq!(result, None); + } + + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_ids_stable_between_executions() { + let code = r#"sketch001 = startSketchOn('XZ') +|> startProfileAt([61.74, 206.13], %) +|> xLine(305.11, %, $seg01) +|> yLine(-291.85, %) +|> xLine(-segLen(seg01), %) +|> lineTo([profileStartX(%), profileStartY(%)], %) +|> close(%) +|> extrude(40.14, %) +|> shell({ + faces: [seg01], + thickness: 3.14, +}, %) +"#; + + let ctx = crate::test_server::new_context(UnitLength::Mm, true, None) + .await + .unwrap(); + let old_program = crate::Program::parse_no_errs(code).unwrap(); + // Execute the program. + let mut exec_state = Default::default(); + let cache_info = crate::CacheInformation { + old: None, + new_ast: old_program.ast.clone(), + }; + ctx.run(cache_info, &mut exec_state).await.unwrap(); + + // Get the id_generator from the first execution. + let id_generator = exec_state.global.id_generator.clone(); + + let code = r#"sketch001 = startSketchOn('XZ') +|> startProfileAt([62.74, 206.13], %) +|> xLine(305.11, %, $seg01) +|> yLine(-291.85, %) +|> xLine(-segLen(seg01), %) +|> lineTo([profileStartX(%), profileStartY(%)], %) +|> close(%) +|> extrude(40.14, %) +|> shell({ + faces: [seg01], + thickness: 3.14, +}, %) +"#; + + // Execute a slightly different program again. + let program: Program = crate::Program::parse_no_errs(code).unwrap(); + let cache_info = crate::CacheInformation { + old: Some(crate::OldAstState { + ast: old_program.ast.clone(), + exec_state: exec_state.clone(), + settings: ctx.settings.clone(), + }), + new_ast: program.ast.clone(), + }; + // Execute the program. + ctx.run(cache_info, &mut exec_state).await.unwrap(); + + assert_eq!(id_generator, exec_state.global.id_generator); + } } diff --git a/src/wasm-lib/kcl/src/fs/local.rs b/src/wasm-lib/kcl/src/fs/local.rs index 573c16c05..562cecac0 100644 --- a/src/wasm-lib/kcl/src/fs/local.rs +++ b/src/wasm-lib/kcl/src/fs/local.rs @@ -5,6 +5,7 @@ use anyhow::Result; use crate::{ errors::{KclError, KclErrorDetails}, fs::FileSystem, + SourceRange, }; #[derive(Debug, Clone)] @@ -27,7 +28,7 @@ impl FileSystem for FileManager { async fn read + std::marker::Send + std::marker::Sync>( &self, path: P, - source_range: crate::executor::SourceRange, + source_range: SourceRange, ) -> Result, KclError> { tokio::fs::read(&path).await.map_err(|e| { KclError::Engine(KclErrorDetails { @@ -40,7 +41,7 @@ impl FileSystem for FileManager { async fn read_to_string + std::marker::Send + std::marker::Sync>( &self, path: P, - source_range: crate::executor::SourceRange, + source_range: SourceRange, ) -> Result { tokio::fs::read_to_string(&path).await.map_err(|e| { KclError::Engine(KclErrorDetails { @@ -53,7 +54,7 @@ impl FileSystem for FileManager { async fn exists + std::marker::Send + std::marker::Sync>( &self, path: P, - source_range: crate::executor::SourceRange, + source_range: SourceRange, ) -> Result { tokio::fs::metadata(&path).await.map(|_| true).or_else(|e| { if e.kind() == std::io::ErrorKind::NotFound { @@ -70,7 +71,7 @@ impl FileSystem for FileManager { async fn get_all_files + std::marker::Send + std::marker::Sync>( &self, path: P, - source_range: crate::executor::SourceRange, + source_range: SourceRange, ) -> Result, crate::errors::KclError> { let mut files = vec![]; let mut stack = vec![path.as_ref().to_path_buf()]; diff --git a/src/wasm-lib/kcl/src/fs/mod.rs b/src/wasm-lib/kcl/src/fs/mod.rs index 9c9cf3d0b..d784bc8a1 100644 --- a/src/wasm-lib/kcl/src/fs/mod.rs +++ b/src/wasm-lib/kcl/src/fs/mod.rs @@ -1,5 +1,9 @@ //! Functions for interacting with files on a machine. +use anyhow::Result; + +use crate::SourceRange; + #[cfg(not(target_arch = "wasm32"))] pub mod local; #[cfg(not(target_arch = "wasm32"))] @@ -9,7 +13,6 @@ pub use local::FileManager; #[cfg(not(test))] pub mod wasm; -use anyhow::Result; #[cfg(target_arch = "wasm32")] #[cfg(not(test))] pub use wasm::FileManager; @@ -20,27 +23,27 @@ pub trait FileSystem: Clone { async fn read + std::marker::Send + std::marker::Sync>( &self, path: P, - source_range: crate::executor::SourceRange, + source_range: SourceRange, ) -> Result, crate::errors::KclError>; /// Read a file from the local file system. async fn read_to_string + std::marker::Send + std::marker::Sync>( &self, path: P, - source_range: crate::executor::SourceRange, + source_range: SourceRange, ) -> Result; /// Check if a file exists on the local file system. async fn exists + std::marker::Send + std::marker::Sync>( &self, path: P, - source_range: crate::executor::SourceRange, + source_range: SourceRange, ) -> Result; /// Get all the files in a directory recursively. async fn get_all_files + std::marker::Send + std::marker::Sync>( &self, path: P, - source_range: crate::executor::SourceRange, + source_range: SourceRange, ) -> Result, crate::errors::KclError>; } diff --git a/src/wasm-lib/kcl/src/fs/wasm.rs b/src/wasm-lib/kcl/src/fs/wasm.rs index 408f29433..4530b9852 100644 --- a/src/wasm-lib/kcl/src/fs/wasm.rs +++ b/src/wasm-lib/kcl/src/fs/wasm.rs @@ -7,6 +7,7 @@ use crate::{ errors::{KclError, KclErrorDetails}, fs::FileSystem, wasm::JsFuture, + SourceRange, }; #[wasm_bindgen(module = "/../../lang/std/fileSystemManager.ts")] @@ -43,7 +44,7 @@ impl FileSystem for FileManager { async fn read + std::marker::Send + std::marker::Sync>( &self, path: P, - source_range: crate::executor::SourceRange, + source_range: SourceRange, ) -> Result, KclError> { let promise = self .manager @@ -81,7 +82,7 @@ impl FileSystem for FileManager { async fn read_to_string + std::marker::Send + std::marker::Sync>( &self, path: P, - source_range: crate::executor::SourceRange, + source_range: SourceRange, ) -> Result { let bytes = self.read(path, source_range).await?; let string = String::from_utf8(bytes).map_err(|e| { @@ -97,7 +98,7 @@ impl FileSystem for FileManager { async fn exists + std::marker::Send + std::marker::Sync>( &self, path: P, - source_range: crate::executor::SourceRange, + source_range: SourceRange, ) -> Result { let promise = self .manager @@ -139,7 +140,7 @@ impl FileSystem for FileManager { async fn get_all_files + std::marker::Send + std::marker::Sync>( &self, path: P, - source_range: crate::executor::SourceRange, + source_range: SourceRange, ) -> Result, crate::errors::KclError> { let promise = self .manager diff --git a/src/wasm-lib/kcl/src/lib.rs b/src/wasm-lib/kcl/src/lib.rs index f0ef19f43..e3c199582 100644 --- a/src/wasm-lib/kcl/src/lib.rs +++ b/src/wasm-lib/kcl/src/lib.rs @@ -8,29 +8,253 @@ #[allow(unused_macros)] macro_rules! println { ($($rest:tt)*) => { + #[cfg(feature = "disable-println")] + { + let _ = format!($($rest)*); + } #[cfg(not(feature = "disable-println"))] std::println!($($rest)*) } } -pub mod ast; -pub mod coredump; -pub mod docs; -pub mod engine; -pub mod errors; -pub mod executor; -pub mod fs; -mod function_param; +#[allow(unused_macros)] +macro_rules! eprintln { + ($($rest:tt)*) => { + #[cfg(feature = "disable-println")] + { + let _ = format!($($rest)*); + } + #[cfg(not(feature = "disable-println"))] + std::eprintln!($($rest)*) + } +} + +#[allow(unused_macros)] +macro_rules! print { + ($($rest:tt)*) => { + #[cfg(feature = "disable-println")] + { + let _ = format!($($rest)*); + } + #[cfg(not(feature = "disable-println"))] + std::print!($($rest)*) + } +} + +#[allow(unused_macros)] +macro_rules! eprint { + ($($rest:tt)*) => { + #[cfg(feature = "disable-println")] + { + let _ = format!($($rest)*); + } + #[cfg(not(feature = "disable-println"))] + std::eprint!($($rest)*) + } +} +#[cfg(feature = "dhat-heap")] +#[global_allocator] +static ALLOC: dhat::Alloc = dhat::Alloc; + +mod coredump; +mod docs; +mod engine; +mod errors; +mod execution; +mod fs; pub mod lint; -pub mod lsp; -pub mod parser; -pub mod settings; -pub mod std; +mod log; +mod lsp; +mod parsing; +mod settings; +#[cfg(test)] +mod simulation_tests; +mod source_range; +mod std; #[cfg(not(target_arch = "wasm32"))] pub mod test_server; -pub mod thread; -pub mod token; +mod thread; mod unparser; -pub mod walk; +mod walk; #[cfg(target_arch = "wasm32")] -pub mod wasm; +mod wasm; + +pub use coredump::CoreDump; +pub use engine::{EngineManager, ExecutionKind}; +pub use errors::{CompilationError, ConnectionError, ExecError, KclError, KclErrorWithOutputs}; +pub use execution::{ + cache::{CacheInformation, OldAstState}, + ExecState, ExecutorContext, ExecutorSettings, +}; +pub use lsp::{ + copilot::Backend as CopilotLspBackend, + kcl::{Backend as KclLspBackend, Server as KclLspServerSubCommand}, +}; +pub use parsing::ast::{modify::modify_ast_for_sketch, types::FormatOptions}; +pub use settings::types::{project::ProjectConfiguration, Configuration, UnitLength}; +pub use source_range::{ModuleId, SourceRange}; + +// Rather than make executor public and make lots of it pub(crate), just re-export into a new module. +// Ideally we wouldn't export these things at all, they should only be used for testing. +pub mod exec { + pub use crate::execution::{DefaultPlanes, IdGenerator, KclValue, PlaneType, ProgramMemory, Sketch}; +} + +#[cfg(target_arch = "wasm32")] +pub mod wasm_engine { + pub use crate::{ + coredump::wasm::{CoreDumpManager, CoreDumper}, + engine::conn_wasm::{EngineCommandManager, EngineConnection}, + fs::wasm::FileSystemManager, + }; +} + +#[cfg(not(target_arch = "wasm32"))] +pub mod native_engine { + pub use crate::engine::conn::EngineConnection; +} + +pub mod std_utils { + pub use crate::std::utils::{get_tangential_arc_to_info, is_points_ccw_wasm, TangentialArcInfoInput}; +} + +use serde::{Deserialize, Serialize}; + +#[allow(unused_imports)] +use crate::log::{log, logln}; + +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct Program { + #[serde(flatten)] + pub ast: parsing::ast::types::Node, +} + +#[cfg(any(test, feature = "lsp-test-util"))] +pub use lsp::test_util::copilot_lsp_server; +#[cfg(any(test, feature = "lsp-test-util"))] +pub use lsp::test_util::kcl_lsp_server; + +impl Program { + pub fn parse(input: &str) -> Result<(Option, Vec), KclError> { + let module_id = ModuleId::default(); + let tokens = parsing::token::lex(input, module_id)?; + let (ast, errs) = parsing::parse_tokens(tokens).0?; + + Ok((ast.map(|ast| Program { ast }), errs)) + } + + pub fn parse_no_errs(input: &str) -> Result { + let module_id = ModuleId::default(); + let tokens = parsing::token::lex(input, module_id)?; + let ast = parsing::parse_tokens(tokens).parse_errs_as_err()?; + + Ok(Program { ast }) + } + + pub fn compute_digest(&mut self) -> parsing::ast::digest::Digest { + self.ast.compute_digest() + } + + pub fn lint_all(&self) -> Result, anyhow::Error> { + self.ast.lint_all() + } + + pub fn lint<'a>(&'a self, rule: impl lint::Rule<'a>) -> Result, anyhow::Error> { + self.ast.lint(rule) + } + + pub fn recast(&self) -> String { + // Use the default options until we integrate into the UI the ability to change them. + self.ast.recast(&Default::default(), 0) + } + + pub fn recast_with_options(&self, options: &FormatOptions) -> String { + self.ast.recast(options, 0) + } +} + +impl From> for Program { + fn from(ast: parsing::ast::types::Node) -> Program { + Self { ast } + } +} + +#[inline] +fn try_f64_to_usize(f: f64) -> Option { + let i = f as usize; + if i as f64 == f { + Some(i) + } else { + None + } +} + +#[inline] +fn try_f64_to_u32(f: f64) -> Option { + let i = f as u32; + if i as f64 == f { + Some(i) + } else { + None + } +} + +#[inline] +fn try_f64_to_u64(f: f64) -> Option { + let i = f as u64; + if i as f64 == f { + Some(i) + } else { + None + } +} + +#[inline] +fn try_f64_to_i64(f: f64) -> Option { + let i = f as i64; + if i as f64 == f { + Some(i) + } else { + None + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn convert_int() { + assert_eq!(try_f64_to_usize(0.0), Some(0)); + assert_eq!(try_f64_to_usize(42.0), Some(42)); + assert_eq!(try_f64_to_usize(0.00000000001), None); + assert_eq!(try_f64_to_usize(-1.0), None); + assert_eq!(try_f64_to_usize(f64::NAN), None); + assert_eq!(try_f64_to_usize(f64::INFINITY), None); + assert_eq!(try_f64_to_usize((0.1 + 0.2) * 10.0), None); + + assert_eq!(try_f64_to_u32(0.0), Some(0)); + assert_eq!(try_f64_to_u32(42.0), Some(42)); + assert_eq!(try_f64_to_u32(0.00000000001), None); + assert_eq!(try_f64_to_u32(-1.0), None); + assert_eq!(try_f64_to_u32(f64::NAN), None); + assert_eq!(try_f64_to_u32(f64::INFINITY), None); + assert_eq!(try_f64_to_u32((0.1 + 0.2) * 10.0), None); + + assert_eq!(try_f64_to_u64(0.0), Some(0)); + assert_eq!(try_f64_to_u64(42.0), Some(42)); + assert_eq!(try_f64_to_u64(0.00000000001), None); + assert_eq!(try_f64_to_u64(-1.0), None); + assert_eq!(try_f64_to_u64(f64::NAN), None); + assert_eq!(try_f64_to_u64(f64::INFINITY), None); + assert_eq!(try_f64_to_u64((0.1 + 0.2) * 10.0), None); + + assert_eq!(try_f64_to_i64(0.0), Some(0)); + assert_eq!(try_f64_to_i64(42.0), Some(42)); + assert_eq!(try_f64_to_i64(0.00000000001), None); + assert_eq!(try_f64_to_i64(-1.0), Some(-1)); + assert_eq!(try_f64_to_i64(f64::NAN), None); + assert_eq!(try_f64_to_i64(f64::INFINITY), None); + assert_eq!(try_f64_to_i64((0.1 + 0.2) * 10.0), None); + } +} diff --git a/src/wasm-lib/kcl/src/lint/checks/camel_case.rs b/src/wasm-lib/kcl/src/lint/checks/camel_case.rs index 872a39539..7094ac501 100644 --- a/src/wasm-lib/kcl/src/lint/checks/camel_case.rs +++ b/src/wasm-lib/kcl/src/lint/checks/camel_case.rs @@ -2,10 +2,10 @@ use anyhow::Result; use convert_case::Casing; use crate::{ - ast::types::{ObjectProperty, VariableDeclarator}, - executor::SourceRange, lint::rule::{def_finding, Discovered, Finding}, + parsing::ast::types::{ObjectProperty, VariableDeclarator}, walk::Node, + SourceRange, }; def_finding!( @@ -29,7 +29,10 @@ fn lint_lower_camel_case_var(decl: &VariableDeclarator) -> Result Result Result> { return Ok(vec![]); }; - Ok(decl - .declarations - .iter() - .flat_map(|v| lint_lower_camel_case_var(v).unwrap_or_default()) - .collect()) + lint_lower_camel_case_var(&decl.declaration) } pub fn lint_object_properties(decl: Node) -> Result> { diff --git a/src/wasm-lib/kcl/src/lint/checks/mod.rs b/src/wasm-lib/kcl/src/lint/checks/mod.rs index 27d94e08b..f3cc11135 100644 --- a/src/wasm-lib/kcl/src/lint/checks/mod.rs +++ b/src/wasm-lib/kcl/src/lint/checks/mod.rs @@ -1,6 +1,7 @@ mod camel_case; +mod offset_plane; mod std_lib_args; -#[allow(unused_imports)] pub use camel_case::{lint_object_properties, lint_variables, Z0001}; +pub use offset_plane::{lint_should_be_offset_plane, Z0003}; pub use std_lib_args::{lint_call_expressions, Z0002}; diff --git a/src/wasm-lib/kcl/src/lint/checks/offset_plane.rs b/src/wasm-lib/kcl/src/lint/checks/offset_plane.rs new file mode 100644 index 000000000..62231769d --- /dev/null +++ b/src/wasm-lib/kcl/src/lint/checks/offset_plane.rs @@ -0,0 +1,239 @@ +use std::collections::HashMap; + +use anyhow::Result; + +use crate::{ + lint::rule::{def_finding, Discovered, Finding}, + parsing::ast::types::{BinaryPart, Expr, LiteralValue, ObjectExpression, UnaryOperator}, + walk::Node, + SourceRange, +}; + +def_finding!( + Z0003, + "offsetPlane should be used to define a new plane offset from the origin", + "\ +startSketchOn should be an offsetPlane call in this case ✏️ + +The startSketchOn stdlib function has the ability to define a custom Plane +to begin the sketch on (outside of the built in XY, -YZ planes). There also +exists the offsetPlane stdlib function to create a new Plane offset by some +fixed amount from an existing plane. + +This lint rule triggers when a startSketchOn's provided plane is recognized as +being merely offset from a built-in plane. It's much more readable to +use offsetPlane where possible. +" +); + +pub fn lint_should_be_offset_plane(node: Node) -> Result> { + let Node::CallExpression(call) = node else { + return Ok(vec![]); + }; + + if call.inner.callee.inner.name != "startSketchOn" { + return Ok(vec![]); + } + + if call.arguments.len() != 1 { + // we only look for single-argument object patterns, if there's more + // than that we don't have a plane decl + return Ok(vec![]); + } + + let Expr::ObjectExpression(arg) = &call.arguments[0] else { + return Ok(vec![]); + }; + + let Some(plane) = arg.inner.properties.iter().find(|v| v.key.inner.name == "plane") else { + return Ok(vec![]); + }; + + let Expr::ObjectExpression(ref plane) = plane.inner.value else { + return Ok(vec![]); + }; + + let mut origin: Option<(f64, f64, f64)> = None; + let mut x_vec: Option<(f64, f64, f64)> = None; + let mut y_vec: Option<(f64, f64, f64)> = None; + + for property in &plane.inner.properties { + let Expr::ObjectExpression(ref point) = property.inner.value else { + return Ok(vec![]); + }; + + let Some((x, y, z)) = get_xyz(&point.inner) else { + return Ok(vec![]); + }; + + let property_name = &property.inner.key.inner.name; + + match property_name.as_str() { + "origin" => origin = Some((x, y, z)), + "xAxis" => x_vec = Some((x, y, z)), + "yAxis" => y_vec = Some((x, y, z)), + _ => { + continue; + } + }; + } + + let Some(origin) = origin else { return Ok(vec![]) }; + let Some(x_vec) = x_vec else { return Ok(vec![]) }; + let Some(y_vec) = y_vec else { return Ok(vec![]) }; + + if [origin.0, origin.1, origin.2].iter().filter(|v| **v == 0.0).count() < 2 { + return Ok(vec![]); + } + // two of the origin values are 0, 0; let's work it out and check + // what's **up** + + /// This will attempt to very poorly translate orientation to a letter + /// if it's possible to do so. The engine will norm these vectors, so + /// we'll just use logic off 0 for now, but this sucks, generally speaking. + fn vector_to_letter<'a>(x: f64, y: f64, z: f64) -> Option<&'a str> { + if x > 0.0 && y == 0.0 && z == 0.0 { + return Some("X"); + } + if x < 0.0 && y == 0.0 && z == 0.0 { + return Some("-X"); + } + + if x == 0.0 && y > 0.0 && z == 0.0 { + return Some("Y"); + } + if x == 0.0 && y < 0.0 && z == 0.0 { + return Some("-Y"); + } + + if x == 0.0 && y == 0.0 && z > 0.0 { + return Some("Z"); + } + if x == 0.0 && y == 0.0 && z < 0.0 { + return Some("-Z"); + } + + None + } + + let allowed_planes = HashMap::from([ + // allowed built-in planes + ("XY".to_owned(), true), + ("-XY".to_owned(), true), + ("XZ".to_owned(), true), + ("-XZ".to_owned(), true), + ("YZ".to_owned(), true), + ("-YZ".to_owned(), true), + ]); + // Currently, the engine **ONLY** accepts[1] the following: + // + // XY + // -XY + // XZ + // -XZ + // YZ + // -YZ + // + // [1]: https://zoo.dev/docs/kcl/types/PlaneData + + let plane_name = format!( + "{}{}", + vector_to_letter(x_vec.0, x_vec.1, x_vec.2).unwrap_or(""), + vector_to_letter(y_vec.0, y_vec.1, y_vec.2).unwrap_or(""), + ); + + if !allowed_planes.contains_key(&plane_name) { + return Ok(vec![]); + }; + + let call_source_range = SourceRange::new(call.start, call.end, call.module_id); + Ok(vec![Z0003.at( + format!( + "custom plane in startSketchOn; offsetPlane from {} would work here", + plane_name + ), + call_source_range, + )]) +} + +fn get_xyz(point: &ObjectExpression) -> Option<(f64, f64, f64)> { + let mut x: Option = None; + let mut y: Option = None; + let mut z: Option = None; + + fn unlitafy(lit: &LiteralValue) -> Option { + Some(match lit { + LiteralValue::Number(value) => *value, + _ => { + return None; + } + }) + } + + for property in &point.properties { + let Some(value) = (match &property.value { + Expr::UnaryExpression(ref value) => { + if value.operator != UnaryOperator::Neg { + continue; + } + let BinaryPart::Literal(ref value) = &value.inner.argument else { + continue; + }; + unlitafy(&value.inner.value).map(|v| -v) + } + Expr::Literal(ref value) => unlitafy(&value.value), + _ => { + continue; + } + }) else { + continue; + }; + + match property.key.inner.name.as_str() { + "x" => x = Some(value), + "y" => y = Some(value), + "z" => z = Some(value), + _ => {} + } + } + + Some((x?, y?, z?)) +} + +#[cfg(test)] +mod tests { + use super::{lint_should_be_offset_plane, Z0003}; + use crate::lint::rule::{test_finding, test_no_finding}; + + test_finding!( + z0003_bad_sketch_on, + lint_should_be_offset_plane, + Z0003, + "\ +startSketchOn({ + plane: { + origin: { x: 0, y: -14.3, z: 0 }, + xAxis: { x: 1, y: 0, z: 0 }, + yAxis: { x: 0, y: 0, z: 1 }, + zAxis: { x: 0, y: -1, z: 0 } + } +}) +" + ); + + test_no_finding!( + z0003_good_sketch_on, + lint_should_be_offset_plane, + Z0003, + "\ +startSketchOn({ + plane: { + origin: { x: 10, y: -14.3, z: 0 }, + xAxis: { x: 1, y: 0, z: 0 }, + yAxis: { x: 0, y: 0, z: 1 }, + zAxis: { x: 0, y: -1, z: 0 } + } +}) +" + ); +} diff --git a/src/wasm-lib/kcl/src/lint/checks/std_lib_args.rs b/src/wasm-lib/kcl/src/lint/checks/std_lib_args.rs index 649959fca..48d15a744 100644 --- a/src/wasm-lib/kcl/src/lint/checks/std_lib_args.rs +++ b/src/wasm-lib/kcl/src/lint/checks/std_lib_args.rs @@ -3,12 +3,12 @@ use std::sync::Arc; use anyhow::Result; use crate::{ - ast::types::CallExpression, docs::StdLibFn, - executor::SourceRange, lint::rule::{def_finding, Discovered, Finding}, + parsing::ast::types::{CallExpression, NodeRef}, std::{FunctionKind, StdLib}, walk::Node, + SourceRange, }; def_finding!( @@ -18,14 +18,17 @@ def_finding!( Previously, we have not been failing when too many arguments are passed to a stdlib function. This is a problem because it can lead to unexpected behavior. We will in the future fail when too many arguments are passed to a function. So fix your code now." ); -fn lint_too_many_args_std_lib_function(f: Box, exp: &CallExpression) -> Result> { +fn lint_too_many_args_std_lib_function( + f: Box, + exp: NodeRef<'_, CallExpression>, +) -> Result> { let mut findings = vec![]; if f.name() == "pow" { if exp.arguments.len() != 2 { findings.push(Z0002.at( format!("expected 2 arguments, found {}", exp.arguments.len()), - SourceRange::new(exp.start, exp.end), + SourceRange::new(exp.start, exp.end, exp.module_id), )); } return Ok(findings); @@ -35,7 +38,7 @@ fn lint_too_many_args_std_lib_function(f: Box, exp: &CallExpressio if exp.arguments.len() < 2 { findings.push(Z0002.at( format!("expected at least 2 arguments, found {}", exp.arguments.len()), - SourceRange::new(exp.start, exp.end), + SourceRange::new(exp.start, exp.end, exp.module_id), )); } return Ok(findings); @@ -45,7 +48,7 @@ fn lint_too_many_args_std_lib_function(f: Box, exp: &CallExpressio if exp.arguments.len() > fn_args_len { findings.push(Z0002.at( format!("expected {} arguments, found {}", fn_args_len, exp.arguments.len()), - SourceRange::new(exp.start, exp.end), + SourceRange::new(exp.start, exp.end, exp.module_id), )); } diff --git a/src/wasm-lib/kcl/src/lint/mod.rs b/src/wasm-lib/kcl/src/lint/mod.rs index 21e84f8bb..de95d9e6c 100644 --- a/src/wasm-lib/kcl/src/lint/mod.rs +++ b/src/wasm-lib/kcl/src/lint/mod.rs @@ -1,4 +1,4 @@ pub mod checks; -pub mod rule; +mod rule; -pub use rule::{Discovered, Finding}; +pub use rule::{Discovered, Finding, Rule}; diff --git a/src/wasm-lib/kcl/src/lint/rule.rs b/src/wasm-lib/kcl/src/lint/rule.rs index 1b11e605f..bdd5c67da 100644 --- a/src/wasm-lib/kcl/src/lint/rule.rs +++ b/src/wasm-lib/kcl/src/lint/rule.rs @@ -3,7 +3,7 @@ use schemars::JsonSchema; use serde::Serialize; use tower_lsp::lsp_types::{Diagnostic, DiagnosticSeverity}; -use crate::{executor::SourceRange, lsp::IntoDiagnostic, walk::Node}; +use crate::{lsp::IntoDiagnostic, walk::Node, SourceRange}; /// Check the provided AST for any found rule violations. /// @@ -56,8 +56,8 @@ impl Discovered { } #[getter] - pub fn pos(&self) -> SourceRange { - self.pos + pub fn pos(&self) -> (usize, usize) { + (self.pos.start(), self.pos.end()) } #[getter] @@ -182,9 +182,7 @@ mod test { macro_rules! assert_no_finding { ( $check:expr, $finding:expr, $kcl:expr ) => { - let tokens = $crate::token::lexer($kcl).unwrap(); - let parser = $crate::parser::Parser::new(tokens); - let prog = parser.ast().unwrap(); + let prog = $crate::parsing::top_level_parse($kcl).unwrap(); for discovered_finding in prog.lint($check).unwrap() { if discovered_finding.finding == $finding { assert!(false, "Finding {:?} was emitted", $finding.code); @@ -195,9 +193,7 @@ mod test { macro_rules! assert_finding { ( $check:expr, $finding:expr, $kcl:expr ) => { - let tokens = $crate::token::lexer($kcl).unwrap(); - let parser = $crate::parser::Parser::new(tokens); - let prog = parser.ast().unwrap(); + let prog = $crate::parsing::top_level_parse($kcl).unwrap(); for discovered_finding in prog.lint($check).unwrap() { if discovered_finding.finding == $finding { diff --git a/src/wasm-lib/kcl/src/log.rs b/src/wasm-lib/kcl/src/log.rs new file mode 100644 index 000000000..40d15b2c1 --- /dev/null +++ b/src/wasm-lib/kcl/src/log.rs @@ -0,0 +1,117 @@ +#![allow(dead_code)] +use std::env; + +#[cfg(feature = "dhat-heap")] +use dhat::{HeapStats, Profiler}; +use web_time::Instant; + +const LOG_ENV_VAR: &str = "ZOO_LOG"; +lazy_static::lazy_static! { + static ref ENABLED: bool = { + let env_var = env::var(LOG_ENV_VAR); + let Ok(env_var) = env_var else { + return false; + }; + !env_var.is_empty() + }; +} + +#[cfg(feature = "dhat-heap")] +lazy_static::lazy_static! { + static ref PROFILER: Profiler = Profiler::builder().testing().build(); +} + +/// Log a message +pub(crate) fn log(msg: impl Into) { + if *ENABLED { + log_inner(msg.into()); + } +} + +#[allow(unused_macros)] +macro_rules! logln { + ($($rest:tt)*) => { + crate::log::log(format!($($rest)*)) + } +} +pub(crate) use logln; + +#[cfg(not(feature = "disable-println"))] +#[inline] +fn log_inner(msg: String) { + eprintln!("{msg}"); +} + +#[cfg(all(feature = "disable-println", target_arch = "wasm32"))] +#[inline] +fn log_inner(msg: String) { + web_sys::console::log_1(&msg.into()); +} + +#[cfg(all(feature = "disable-println", not(target_arch = "wasm32")))] +#[inline] +fn log_inner(_msg: String) {} + +/// A helper struct for recording and logging basic performance metrics. +/// +/// It will log the metrics when dropped or if `log_now` is called. +pub(crate) struct LogPerfStats<'a> { + msg: &'a str, + start_time: Instant, + #[cfg(feature = "dhat-heap")] + start_stats: HeapStats, + cancelled: bool, +} + +impl<'a> LogPerfStats<'a> { + #[cfg(not(feature = "dhat-heap"))] + pub fn new(msg: &'a str) -> Self { + LogPerfStats { + msg, + start_time: Instant::now(), + cancelled: false, + } + } + + #[cfg(feature = "dhat-heap")] + pub fn new(msg: &'a str) -> Self { + lazy_static::initialize(&PROFILER); + LogPerfStats { + msg, + start_time: Instant::now(), + start_stats: HeapStats::get(), + cancelled: false, + } + } + + pub fn log_now(&self) { + let time = Instant::now().duration_since(self.start_time).as_secs_f64() * 1000.0; + logln!("{}\n time: {time:.3}ms", self.msg); + #[cfg(feature = "dhat-heap")] + { + let stats = HeapStats::get(); + let blocks = stats.total_blocks - self.start_stats.total_blocks; + let bytes = (stats.total_bytes - self.start_stats.total_bytes) as f64 / 1_000_000.0; + let cur = stats.curr_bytes as f64 / 1000.0; + let max = stats.curr_bytes as f64 / 1000.0; + + logln!(" memory:"); + logln!(" allocations: {bytes:.5} MB ({blocks} blocks)"); + logln!(" currently allocated: {cur:.3} KB"); + logln!(" max allocated: {max:.3} KB"); + } + } + + /// After `cancel`ing, this object will not log its stats on drop (you can still can `log_now`). + pub fn cancel(&mut self) { + self.cancelled = true; + } +} + +impl Drop for LogPerfStats<'_> { + fn drop(&mut self) { + if !self.cancelled { + self.log_now(); + } + } +} diff --git a/src/wasm-lib/kcl/src/lsp/copilot/mod.rs b/src/wasm-lib/kcl/src/lsp/copilot/mod.rs index 3f5a06d35..fff8e7a7b 100644 --- a/src/wasm-lib/kcl/src/lsp/copilot/mod.rs +++ b/src/wasm-lib/kcl/src/lsp/copilot/mod.rs @@ -1,4 +1,5 @@ //! The copilot lsp server for ghost text. +#![allow(dead_code)] pub mod cache; pub mod types; @@ -26,9 +27,12 @@ use tower_lsp::{ use crate::lsp::{ backend::Backend as _, - copilot::types::{ - CopilotAcceptCompletionParams, CopilotCompletionResponse, CopilotCompletionTelemetry, CopilotEditorInfo, - CopilotLspCompletionParams, CopilotRejectCompletionParams, DocParams, + copilot::{ + cache::CopilotCache, + types::{ + CopilotAcceptCompletionParams, CopilotCompletionResponse, CopilotCompletionTelemetry, CopilotEditorInfo, + CopilotLspCompletionParams, CopilotRejectCompletionParams, DocParams, + }, }, }; @@ -131,6 +135,38 @@ impl crate::lsp::backend::Backend for Backend { } impl Backend { + #[cfg(target_arch = "wasm32")] + pub fn new_wasm( + client: tower_lsp::Client, + fs: crate::fs::wasm::FileSystemManager, + zoo_client: kittycad::Client, + dev_mode: bool, + ) -> Self { + Self::new(client, crate::fs::FileManager::new(fs), zoo_client, dev_mode) + } + + pub fn new( + client: tower_lsp::Client, + fs: crate::fs::FileManager, + zoo_client: kittycad::Client, + dev_mode: bool, + ) -> Self { + Self { + client, + fs: Arc::new(fs), + workspace_folders: Default::default(), + code_map: Default::default(), + editor_info: Arc::new(RwLock::new(CopilotEditorInfo::default())), + cache: Arc::new(CopilotCache::new()), + telemetry: Default::default(), + zoo_client, + + is_initialized: Default::default(), + diagnostics_map: Default::default(), + dev_mode, + } + } + /// Get completions from the kittycad api. pub async fn get_completions(&self, language: String, prompt: String, suffix: String) -> Result> { let body = kittycad::types::KclCodeCompletionRequest { diff --git a/src/wasm-lib/kcl/src/lsp/kcl/custom_notifications.rs b/src/wasm-lib/kcl/src/lsp/kcl/custom_notifications.rs index 4d57b561f..12a90fac4 100644 --- a/src/wasm-lib/kcl/src/lsp/kcl/custom_notifications.rs +++ b/src/wasm-lib/kcl/src/lsp/kcl/custom_notifications.rs @@ -3,14 +3,14 @@ use serde::{Deserialize, Serialize}; use tower_lsp::lsp_types::notification::Notification; -use crate::settings::types::UnitLength; +use crate::{parsing::ast::types::Node, settings::types::UnitLength}; /// A notification that the AST has changed. #[derive(Debug)] pub enum AstUpdated {} impl Notification for AstUpdated { - type Params = crate::ast::types::Program; + type Params = Node; const METHOD: &'static str = "kcl/astUpdated"; } @@ -19,7 +19,7 @@ impl Notification for AstUpdated { pub enum MemoryUpdated {} impl Notification for MemoryUpdated { - type Params = crate::executor::ProgramMemory; + type Params = crate::execution::ProgramMemory; const METHOD: &'static str = "kcl/memoryUpdated"; } diff --git a/src/wasm-lib/kcl/src/lsp/kcl/mod.rs b/src/wasm-lib/kcl/src/lsp/kcl/mod.rs index 061766bfa..3fce0efff 100644 --- a/src/wasm-lib/kcl/src/lsp/kcl/mod.rs +++ b/src/wasm-lib/kcl/src/lsp/kcl/mod.rs @@ -1,4 +1,5 @@ //! Functions for the `kcl` lsp server. +#![allow(dead_code)] use std::{ collections::HashMap, @@ -19,7 +20,8 @@ use sha2::Digest; use tower_lsp::{ jsonrpc::Result as RpcResult, lsp_types::{ - CompletionItem, CompletionItemKind, CompletionOptions, CompletionParams, CompletionResponse, CreateFilesParams, + CodeAction, CodeActionKind, CodeActionOrCommand, CodeActionParams, CodeActionResponse, CompletionItem, + CompletionItemKind, CompletionOptions, CompletionParams, CompletionResponse, CreateFilesParams, DeleteFilesParams, Diagnostic, DiagnosticOptions, DiagnosticServerCapabilities, DiagnosticSeverity, DidChangeConfigurationParams, DidChangeTextDocumentParams, DidChangeWatchedFilesParams, DidChangeWorkspaceFoldersParams, DidCloseTextDocumentParams, DidOpenTextDocumentParams, @@ -40,35 +42,35 @@ use tower_lsp::{ }; use crate::{ - ast::types::{Expr, VariableKind}, - executor::{IdGenerator, SourceRange}, + errors::Suggestion, lsp::{backend::Backend as _, util::IntoDiagnostic}, - parser::PIPE_OPERATOR, - token::TokenType, + parsing::{ + ast::types::{Expr, Node, VariableKind}, + token::TokenStream, + PIPE_OPERATOR, + }, + CacheInformation, ModuleId, OldAstState, Program, SourceRange, }; +const SEMANTIC_TOKEN_TYPES: [SemanticTokenType; 10] = [ + SemanticTokenType::NUMBER, + SemanticTokenType::VARIABLE, + SemanticTokenType::KEYWORD, + SemanticTokenType::TYPE, + SemanticTokenType::STRING, + SemanticTokenType::OPERATOR, + SemanticTokenType::COMMENT, + SemanticTokenType::FUNCTION, + SemanticTokenType::PARAMETER, + SemanticTokenType::PROPERTY, +]; -lazy_static::lazy_static! { - pub static ref SEMANTIC_TOKEN_TYPES: Vec = { - // This is safe to unwrap because we know all the token types are valid. - // And the test would fail if they were not. - let mut gen = TokenType::all_semantic_token_types().unwrap(); - gen.extend(vec![ - SemanticTokenType::PARAMETER, - SemanticTokenType::PROPERTY, - ]); - gen - }; - - pub static ref SEMANTIC_TOKEN_MODIFIERS: Vec = { - vec![ - SemanticTokenModifier::DECLARATION, - SemanticTokenModifier::DEFINITION, - SemanticTokenModifier::DEFAULT_LIBRARY, - SemanticTokenModifier::READONLY, - SemanticTokenModifier::STATIC, - ] - }; -} +const SEMANTIC_TOKEN_MODIFIERS: [SemanticTokenModifier; 5] = [ + SemanticTokenModifier::DECLARATION, + SemanticTokenModifier::DEFINITION, + SemanticTokenModifier::DEFAULT_LIBRARY, + SemanticTokenModifier::READONLY, + SemanticTokenModifier::STATIC, +]; /// A subcommand for running the server. #[derive(Clone, Debug)] @@ -97,11 +99,17 @@ pub struct Backend { /// The stdlib signatures for the language. pub stdlib_signatures: HashMap, /// Token maps. - pub token_map: DashMap>, + pub(super) token_map: DashMap, /// AST maps. - pub ast_map: DashMap, + pub ast_map: DashMap>, + /// Last successful execution. + /// This gets set to None when execution errors, or we want to bust the cache on purpose to + /// force a re-execution. + /// We do not need to manually bust the cache for changed units, that's handled by the cache + /// information. + pub last_successful_ast_state: Arc>>, /// Memory maps. - pub memory_map: DashMap, + pub memory_map: DashMap, /// Current code. pub code_map: DashMap>, /// Diagnostics. @@ -115,13 +123,87 @@ pub struct Backend { /// If we can send telemetry for this user. pub can_send_telemetry: bool, /// Optional executor context to use if we want to execute the code. - pub executor_ctx: Arc>>, + pub executor_ctx: Arc>>, /// If we are currently allowed to execute the ast. pub can_execute: Arc>, pub is_initialized: Arc>, } +impl Backend { + #[cfg(target_arch = "wasm32")] + pub fn new_wasm( + client: Client, + executor_ctx: Option, + fs: crate::fs::wasm::FileSystemManager, + zoo_client: kittycad::Client, + can_send_telemetry: bool, + ) -> Result { + Self::with_file_manager( + client, + executor_ctx, + crate::fs::FileManager::new(fs), + zoo_client, + can_send_telemetry, + ) + } + + #[cfg(not(target_arch = "wasm32"))] + pub fn new( + client: Client, + executor_ctx: Option, + zoo_client: kittycad::Client, + can_send_telemetry: bool, + ) -> Result { + Self::with_file_manager( + client, + executor_ctx, + crate::fs::FileManager::new(), + zoo_client, + can_send_telemetry, + ) + } + + fn with_file_manager( + client: Client, + executor_ctx: Option, + fs: crate::fs::FileManager, + zoo_client: kittycad::Client, + can_send_telemetry: bool, + ) -> Result { + let stdlib = crate::std::StdLib::new(); + let stdlib_completions = get_completions_from_stdlib(&stdlib).map_err(|e| e.to_string())?; + let stdlib_signatures = get_signatures_from_stdlib(&stdlib).map_err(|e| e.to_string())?; + + Ok(Self { + client, + fs: Arc::new(fs), + stdlib_completions, + stdlib_signatures, + zoo_client, + can_send_telemetry, + can_execute: Arc::new(RwLock::new(executor_ctx.is_some())), + executor_ctx: Arc::new(RwLock::new(executor_ctx)), + workspace_folders: Default::default(), + token_map: Default::default(), + ast_map: Default::default(), + memory_map: Default::default(), + code_map: Default::default(), + diagnostics_map: Default::default(), + symbols_map: Default::default(), + semantic_tokens_map: Default::default(), + last_successful_ast_state: Default::default(), + is_initialized: Default::default(), + }) + } + + fn remove_from_ast_maps(&self, filename: &str) { + self.ast_map.remove(filename); + self.symbols_map.remove(filename); + self.memory_map.remove(filename); + } +} + // Implement the shared backend trait for the language server. #[async_trait::async_trait] impl crate::lsp::backend::Backend for Backend { @@ -184,26 +266,32 @@ impl crate::lsp::backend::Backend for Backend { } async fn inner_on_change(&self, params: TextDocumentItem, force: bool) { + if force { + // Bust the execution cache. + let mut old_ast_state = self.last_successful_ast_state.write().await; + *old_ast_state = None; + drop(old_ast_state); + } + let filename = params.uri.to_string(); // We already updated the code map in the shared backend. // Lets update the tokens. - let tokens = match crate::token::lexer(¶ms.text) { + let module_id = ModuleId::default(); + let tokens = match crate::parsing::token::lex(¶ms.text, module_id) { Ok(tokens) => tokens, Err(err) => { self.add_to_diagnostics(¶ms, &[err], true).await; self.token_map.remove(&filename); - self.ast_map.remove(&filename); - self.symbols_map.remove(&filename); + self.remove_from_ast_maps(&filename); self.semantic_tokens_map.remove(&filename); - self.memory_map.remove(&filename); return; } }; // Try to get the memory for the current code. let has_memory = if let Some(memory) = self.memory_map.get(&filename) { - *memory != crate::executor::ProgramMemory::default() + *memory != crate::execution::ProgramMemory::default() } else { false }; @@ -229,19 +317,28 @@ impl crate::lsp::backend::Backend for Backend { } // Lets update the ast. - let parser = crate::parser::Parser::new(tokens.clone()); - let result = parser.ast(); - let mut ast = match result { - Ok(ast) => ast, + + let (ast, errs) = match crate::parsing::parse_tokens(tokens.clone()).0 { + Ok(result) => result, Err(err) => { self.add_to_diagnostics(¶ms, &[err], true).await; - self.ast_map.remove(&filename); - self.symbols_map.remove(&filename); - self.memory_map.remove(&filename); + self.remove_from_ast_maps(&filename); return; } }; + self.add_to_diagnostics(¶ms, &errs, true).await; + + if errs.iter().any(|e| e.severity == crate::errors::Severity::Fatal) { + self.remove_from_ast_maps(&filename); + return; + } + + let Some(mut ast) = ast else { + self.remove_from_ast_maps(&filename); + return; + }; + // Here we will want to store the digest and compare, but for now // we're doing this in a non-load-bearing capacity so we can remove // this if it backfires and only hork the LSP. @@ -256,7 +353,7 @@ impl crate::lsp::backend::Backend for Backend { None => true, }; - if !ast_changed && !force && has_memory && !self.has_diagnostics(params.uri.as_ref()).await { + if !ast_changed && !force && has_memory { // Return early if the ast did not change and we don't need to force. return; } @@ -288,7 +385,7 @@ impl crate::lsp::backend::Backend for Backend { // Execute the code if we have an executor context. // This function automatically executes if we should & updates the diagnostics if we got // errors. - if self.execute(¶ms, &ast).await.is_err() { + if self.execute(¶ms, &ast.into()).await.is_err() { return; } @@ -303,15 +400,15 @@ impl Backend { *self.can_execute.read().await } - pub async fn executor_ctx(&self) -> tokio::sync::RwLockReadGuard<'_, Option> { + pub async fn executor_ctx(&self) -> tokio::sync::RwLockReadGuard<'_, Option> { self.executor_ctx.read().await } - async fn update_semantic_tokens(&self, tokens: &[crate::token::Token], params: &TextDocumentItem) { + async fn update_semantic_tokens(&self, tokens: &TokenStream, params: &TextDocumentItem) { // Update the semantic tokens map. let mut semantic_tokens = vec![]; let mut last_position = Position::new(0, 0); - for token in tokens { + for token in tokens.as_slice() { let Ok(token_type) = SemanticTokenType::try_from(token.token_type) else { // We continue here because not all tokens can be converted this way, we will get // the rest from the ast. @@ -341,8 +438,11 @@ impl Backend { let token_modifiers_bitset = if let Some(ast) = self.ast_map.get(params.uri.as_str()) { let token_index = Arc::new(Mutex::new(token_type_index)); let modifier_index: Arc> = Arc::new(Mutex::new(0)); - crate::walk::walk(&ast, &|node: crate::walk::Node| { - let node_range: SourceRange = (&node).into(); + crate::walk::walk(&ast, |node: crate::walk::Node| { + let Ok(node_range): Result = (&node).try_into() else { + return Ok(true); + }; + if !node_range.contains(source_range.start()) { return Ok(true); } @@ -460,7 +560,7 @@ impl Backend { let semantic_token = SemanticToken { delta_line: position.line - last_position.line + 1, delta_start: 0, - length: token.value.len() as u32, + length: (token.end - token.start) as u32, token_type: token_type_index, token_modifiers_bitset, }; @@ -479,7 +579,7 @@ impl Backend { } else { position.character - last_position.character }, - length: token.value.len() as u32, + length: (token.end - token.start) as u32, token_type: token_type_index, token_modifiers_bitset, }; @@ -571,7 +671,7 @@ impl Backend { self.client.publish_diagnostics(params.uri.clone(), items, None).await; } - async fn execute(&self, params: &TextDocumentItem, ast: &crate::ast::types::Program) -> Result<()> { + async fn execute(&self, params: &TextDocumentItem, ast: &Program) -> Result<()> { // Check if we can execute. if !self.can_execute().await { return Ok(()); @@ -588,32 +688,49 @@ impl Backend { return Ok(()); } - let mut id_generator = IdGenerator::default(); + let mut last_successful_ast_state = self.last_successful_ast_state.write().await; - // Clear the scene, before we execute so it's not fugly as shit. - executor_ctx - .engine - .clear_scene(&mut id_generator, SourceRange::default()) - .await?; - - let exec_state = match executor_ctx.run(ast, None, id_generator, None).await { - Ok(exec_state) => exec_state, - Err(err) => { - self.memory_map.remove(params.uri.as_str()); - self.add_to_diagnostics(params, &[err], false).await; - - // Since we already published the diagnostics we don't really care about the error - // string. - return Err(anyhow::anyhow!("failed to execute code")); - } + let mut exec_state = if let Some(last_successful_ast_state) = last_successful_ast_state.clone() { + last_successful_ast_state.exec_state + } else { + Default::default() }; + if let Err(err) = executor_ctx + .run( + CacheInformation { + old: last_successful_ast_state.clone(), + new_ast: ast.ast.clone(), + }, + &mut exec_state, + ) + .await + { + self.memory_map.remove(params.uri.as_str()); + self.add_to_diagnostics(params, &[err], false).await; + + // Update the last successful ast state to be None. + *last_successful_ast_state = None; + + // Since we already published the diagnostics we don't really care about the error + // string. + return Err(anyhow::anyhow!("failed to execute code")); + } + + // Update the last successful ast state. + *last_successful_ast_state = Some(OldAstState { + ast: ast.ast.clone(), + exec_state: exec_state.clone(), + settings: executor_ctx.settings.clone(), + }); + drop(last_successful_ast_state); + self.memory_map - .insert(params.uri.to_string(), exec_state.memory.clone()); + .insert(params.uri.to_string(), exec_state.memory().clone()); // Send the notification to the client that the memory was updated. self.client - .send_notification::(exec_state.memory) + .send_notification::(exec_state.mod_local.memory) .await; Ok(()) @@ -751,7 +868,7 @@ impl Backend { // Try to get the memory for the current code. let has_memory = if let Some(memory) = self.memory_map.get(&filename) { - *memory != crate::executor::ProgramMemory::default() + *memory != crate::execution::ProgramMemory::default() } else { false }; @@ -843,8 +960,8 @@ impl LanguageServer for Backend { semantic_tokens_options: SemanticTokensOptions { work_done_progress_options: WorkDoneProgressOptions::default(), legend: SemanticTokensLegend { - token_types: SEMANTIC_TOKEN_TYPES.clone(), - token_modifiers: SEMANTIC_TOKEN_MODIFIERS.clone(), + token_types: SEMANTIC_TOKEN_TYPES.to_vec(), + token_modifiers: SEMANTIC_TOKEN_MODIFIERS.to_vec(), }, range: Some(false), full: Some(SemanticTokensFullOptions::Bool(true)), @@ -970,7 +1087,7 @@ impl LanguageServer for Backend { }; match hover { - crate::ast::types::Hover::Function { name, range } => { + crate::parsing::ast::types::Hover::Function { name, range } => { // Get the docs for this function. let Some(completion) = self.stdlib_completions.get(&name) else { return Ok(None); @@ -1005,8 +1122,8 @@ impl LanguageServer for Backend { range: Some(range), })) } - crate::ast::types::Hover::Signature { .. } => Ok(None), - crate::ast::types::Hover::Comment { value, range } => Ok(Some(Hover { + crate::parsing::ast::types::Hover::Signature { .. } => Ok(None), + crate::parsing::ast::types::Hover::Comment { value, range } => Ok(Some(Hover { contents: HoverContents::Markup(MarkupContent { kind: MarkupKind::Markdown, value, @@ -1041,6 +1158,38 @@ impl LanguageServer for Backend { tags: None, }]; + // Get the current line up to cursor + let Some(current_code) = self + .code_map + .get(params.text_document_position.text_document.uri.as_ref()) + else { + return Ok(Some(CompletionResponse::Array(completions))); + }; + let Ok(current_code) = std::str::from_utf8(¤t_code) else { + return Ok(Some(CompletionResponse::Array(completions))); + }; + + // Get the current line up to cursor, with bounds checking + if let Some(line) = current_code + .lines() + .nth(params.text_document_position.position.line as usize) + { + let char_pos = params.text_document_position.position.character as usize; + if char_pos <= line.len() { + let line_prefix = &line[..char_pos]; + // Get last word + let last_word = line_prefix + .split(|c: char| c.is_whitespace() || c.is_ascii_punctuation()) + .last() + .unwrap_or(""); + + // If the last word starts with a digit, return no completions + if !last_word.is_empty() && last_word.chars().next().unwrap().is_ascii_digit() { + return Ok(None); + } + } + } + completions.extend(self.stdlib_completions.values().cloned()); // Add more to the completions if we have more. @@ -1067,7 +1216,7 @@ impl LanguageServer for Backend { return Ok(None); } - // Get the completion items forem the ast. + // Get the completion items for the ast. let Ok(variables) = ast.completion_items() else { return Ok(Some(CompletionResponse::Array(completions))); }; @@ -1132,7 +1281,7 @@ impl LanguageServer for Backend { }; match hover { - crate::ast::types::Hover::Function { name, range: _ } => { + crate::parsing::ast::types::Hover::Function { name, range: _ } => { // Get the docs for this function. let Some(signature) = self.stdlib_signatures.get(&name) else { return Ok(None); @@ -1140,7 +1289,7 @@ impl LanguageServer for Backend { Ok(Some(signature.clone())) } - crate::ast::types::Hover::Signature { + crate::parsing::ast::types::Hover::Signature { name, parameter_index, range: _, @@ -1155,7 +1304,7 @@ impl LanguageServer for Backend { Ok(Some(signature)) } - crate::ast::types::Hover::Comment { value: _, range: _ } => { + crate::parsing::ast::types::Hover::Comment { value: _, range: _ } => { return Ok(None); } } @@ -1203,23 +1352,20 @@ impl LanguageServer for Backend { // Parse the ast. // I don't know if we need to do this again since it should be updated in the context. // But I figure better safe than sorry since this will write back out to the file. - let Ok(tokens) = crate::token::lexer(current_code) else { - return Ok(None); - }; - let parser = crate::parser::Parser::new(tokens); - let Ok(ast) = parser.ast() else { + let module_id = ModuleId::default(); + let Ok(ast) = crate::parsing::parse_str(current_code, module_id).parse_errs_as_err() else { return Ok(None); }; // Now recast it. let recast = ast.recast( - &crate::ast::types::FormatOptions { + &crate::parsing::ast::types::FormatOptions { tab_size: params.options.tab_size as usize, insert_final_newline: params.options.insert_final_newline.unwrap_or(false), use_tabs: !params.options.insert_spaces, }, 0, ); - let source_range = SourceRange([0, current_code.len()]); + let source_range = SourceRange::new(0, current_code.len(), module_id); let range = source_range.to_lsp_range(current_code); Ok(Some(vec![TextEdit { new_text: recast, @@ -1240,11 +1386,8 @@ impl LanguageServer for Backend { // Parse the ast. // I don't know if we need to do this again since it should be updated in the context. // But I figure better safe than sorry since this will write back out to the file. - let Ok(tokens) = crate::token::lexer(current_code) else { - return Ok(None); - }; - let parser = crate::parser::Parser::new(tokens); - let Ok(mut ast) = parser.ast() else { + let module_id = ModuleId::default(); + let Ok(mut ast) = crate::parsing::parse_str(current_code, module_id).parse_errs_as_err() else { return Ok(None); }; @@ -1254,7 +1397,7 @@ impl LanguageServer for Backend { ast.rename_symbol(¶ms.new_name, pos); // Now recast it. let recast = ast.recast(&Default::default(), 0); - let source_range = SourceRange([0, current_code.len() - 1]); + let source_range = SourceRange::new(0, current_code.len() - 1, module_id); let range = source_range.to_lsp_range(current_code); Ok(Some(WorkspaceEdit { changes: Some(HashMap::from([( @@ -1286,6 +1429,41 @@ impl LanguageServer for Backend { Ok(Some(folding_ranges)) } + + async fn code_action(&self, params: CodeActionParams) -> RpcResult> { + let actions = params + .context + .diagnostics + .into_iter() + .filter_map(|diagnostic| { + let suggestion = diagnostic + .data + .as_ref() + .and_then(|data| serde_json::from_value::(data.clone()).ok())?; + let edit = TextEdit { + range: diagnostic.range, + new_text: suggestion.insert, + }; + let changes = HashMap::from([(params.text_document.uri.clone(), vec![edit])]); + Some(CodeActionOrCommand::CodeAction(CodeAction { + title: suggestion.title, + kind: Some(CodeActionKind::QUICKFIX), + diagnostics: Some(vec![diagnostic]), + edit: Some(WorkspaceEdit { + changes: Some(changes), + document_changes: None, + change_annotations: None, + }), + command: None, + is_preferred: Some(true), + disabled: None, + data: None, + })) + }) + .collect(); + + Ok(Some(actions)) + } } /// Get completions from our stdlib. diff --git a/src/wasm-lib/kcl/src/lsp/mod.rs b/src/wasm-lib/kcl/src/lsp/mod.rs index 7d03e818a..0107c4ac4 100644 --- a/src/wasm-lib/kcl/src/lsp/mod.rs +++ b/src/wasm-lib/kcl/src/lsp/mod.rs @@ -9,4 +9,45 @@ pub mod test_util; mod tests; pub mod util; +use tower_lsp::lsp_types::{Diagnostic, DiagnosticSeverity, DiagnosticTag}; pub use util::IntoDiagnostic; + +use crate::{ + errors::{Severity, Tag}, + CompilationError, +}; + +impl IntoDiagnostic for CompilationError { + fn to_lsp_diagnostic(&self, code: &str) -> Diagnostic { + let edit = self.suggestion.as_ref().map(|s| serde_json::to_value(s).unwrap()); + + Diagnostic { + range: self.source_range.to_lsp_range(code), + severity: Some(self.severity()), + code: None, + code_description: None, + source: Some("kcl".to_string()), + message: self.message.clone(), + related_information: None, + tags: self.tag.to_lsp_tags(), + data: edit, + } + } + + fn severity(&self) -> DiagnosticSeverity { + match self.severity { + Severity::Warning => DiagnosticSeverity::WARNING, + _ => DiagnosticSeverity::ERROR, + } + } +} + +impl Tag { + fn to_lsp_tags(self) -> Option> { + match self { + Tag::Deprecated => Some(vec![DiagnosticTag::DEPRECATED]), + Tag::Unnecessary => Some(vec![DiagnosticTag::UNNECESSARY]), + Tag::None => None, + } + } +} diff --git a/src/wasm-lib/kcl/src/lsp/test_util.rs b/src/wasm-lib/kcl/src/lsp/test_util.rs index a97cdce20..914177599 100644 --- a/src/wasm-lib/kcl/src/lsp/test_util.rs +++ b/src/wasm-lib/kcl/src/lsp/test_util.rs @@ -9,10 +9,10 @@ pub async fn kcl_lsp_server(execute: bool) -> Result { let stdlib_completions = crate::lsp::kcl::get_completions_from_stdlib(&stdlib)?; let stdlib_signatures = crate::lsp::kcl::get_signatures_from_stdlib(&stdlib)?; - let zoo_client = crate::executor::new_zoo_client(None, None)?; + let zoo_client = crate::execution::new_zoo_client(None, None)?; let executor_ctx = if execute { - Some(crate::executor::ExecutorContext::new(&zoo_client, Default::default()).await?) + Some(crate::execution::ExecutorContext::new(&zoo_client, Default::default()).await?) } else { None }; @@ -37,6 +37,7 @@ pub async fn kcl_lsp_server(execute: bool) -> Result { can_send_telemetry: true, executor_ctx: Arc::new(tokio::sync::RwLock::new(executor_ctx)), can_execute: Arc::new(tokio::sync::RwLock::new(can_execute)), + last_successful_ast_state: Default::default(), is_initialized: Default::default(), }) .custom_method("kcl/updateUnits", crate::lsp::kcl::Backend::update_units) diff --git a/src/wasm-lib/kcl/src/lsp/tests.rs b/src/wasm-lib/kcl/src/lsp/tests.rs index c56418dd9..9e8a6b16a 100644 --- a/src/wasm-lib/kcl/src/lsp/tests.rs +++ b/src/wasm-lib/kcl/src/lsp/tests.rs @@ -2,15 +2,32 @@ use std::collections::BTreeMap; use pretty_assertions::assert_eq; use tower_lsp::{ - lsp_types::{SemanticTokenModifier, SemanticTokenType}, + lsp_types::{Diagnostic, SemanticTokenModifier, SemanticTokenType}, LanguageServer, }; use crate::{ - executor::ProgramMemory, + execution::ProgramMemory, lsp::test_util::{copilot_lsp_server, kcl_lsp_server}, + parsing::ast::types::{Node, Program}, }; +#[track_caller] +fn assert_diagnostic_count(diagnostics: Option<&Vec>, n: usize) { + let Some(diagnostics) = diagnostics else { + assert_eq!(n, 0, "No diagnostics"); + return; + }; + assert_eq!( + diagnostics + .iter() + .filter(|d| d.severity.as_ref().unwrap() != &tower_lsp::lsp_types::DiagnosticSeverity::WARNING) + .count(), + n, + "expected {n} errors, found {diagnostics:#?}" + ); +} + #[tokio::test(flavor = "multi_thread", worker_threads = 12)] async fn test_updating_kcl_lsp_files() { let server = kcl_lsp_server(false).await.unwrap(); @@ -628,7 +645,7 @@ async fn test_kcl_lsp_completions() { uri: "file:///test.kcl".try_into().unwrap(), language_id: "kcl".to_string(), version: 1, - text: r#"const thing= 1 + text: r#"thing= 1 st"# .to_string(), }, @@ -671,7 +688,7 @@ async fn test_kcl_lsp_completions_empty_in_comment() { uri: "file:///test.kcl".try_into().unwrap(), language_id: "kcl".to_string(), version: 1, - text: r#"const thing= 1 // st"#.to_string(), + text: r#"thing= 1 // st"#.to_string(), }, }) .await; @@ -683,7 +700,7 @@ async fn test_kcl_lsp_completions_empty_in_comment() { text_document: tower_lsp::lsp_types::TextDocumentIdentifier { uri: "file:///test.kcl".try_into().unwrap(), }, - position: tower_lsp::lsp_types::Position { line: 0, character: 19 }, + position: tower_lsp::lsp_types::Position { line: 0, character: 13 }, }, context: None, partial_result_params: Default::default(), @@ -706,7 +723,7 @@ async fn test_kcl_lsp_completions_tags() { uri: "file:///test.kcl".try_into().unwrap(), language_id: "kcl".to_string(), version: 1, - text: r#"const part001 = startSketchOn('XY') + text: r#"part001 = startSketchOn('XY') |> startProfileAt([11.19, 28.35], %) |> line([28.67, -13.25], %, $here) |> line([-4.12, -22.81], %) @@ -805,6 +822,59 @@ async fn test_kcl_lsp_completions_const_raw() { } } +#[tokio::test(flavor = "multi_thread")] +async fn test_kcl_lsp_completions_import() { + let server = kcl_lsp_server(false).await.unwrap(); + + // Send open file. + server + .did_open(tower_lsp::lsp_types::DidOpenTextDocumentParams { + text_document: tower_lsp::lsp_types::TextDocumentItem { + uri: "file:///test.kcl".try_into().unwrap(), + language_id: "kcl".to_string(), + version: 1, + text: r#"import boo, baz as bux from 'bar.kcl' +//import 'bar.kcl' +x = b"# + .to_string(), + }, + }) + .await; + + // Send completion request. + let completions = server + .completion(tower_lsp::lsp_types::CompletionParams { + text_document_position: tower_lsp::lsp_types::TextDocumentPositionParams { + text_document: tower_lsp::lsp_types::TextDocumentIdentifier { + uri: "file:///test.kcl".try_into().unwrap(), + }, + position: tower_lsp::lsp_types::Position { line: 2, character: 5 }, + }, + context: None, + partial_result_params: Default::default(), + work_done_progress_params: Default::default(), + }) + .await + .unwrap() + .unwrap(); + + // Check the completions. + if let tower_lsp::lsp_types::CompletionResponse::Array(completions) = completions { + assert!(completions.len() > 10); + // Find the one with label "foo". + completions.iter().find(|completion| completion.label == "boo").unwrap(); + // completions + // .iter() + // .find(|completion| completion.label == "bar") + // .unwrap(); + completions.iter().find(|completion| completion.label == "bux").unwrap(); + assert!(!completions.iter().any(|completion| completion.label == "baz")); + // Find the one with label "bar". + } else { + panic!("Expected array of completions"); + } +} + #[tokio::test(flavor = "multi_thread")] async fn test_kcl_lsp_on_hover() { let server = kcl_lsp_server(false).await.unwrap(); @@ -1041,7 +1111,7 @@ async fn test_kcl_lsp_semantic_tokens_with_modifiers() { uri: "file:///test.kcl".try_into().unwrap(), language_id: "kcl".to_string(), version: 1, - text: r#"const part001 = startSketchOn('XY') + text: r#"part001 = startSketchOn('XY') |> startProfileAt([-10, -10], %) |> line([20, 0], %) |> line([0, 20], %, $seg01) @@ -1049,8 +1119,8 @@ async fn test_kcl_lsp_semantic_tokens_with_modifiers() { |> close(%) |> extrude(3.14, %) -const thing = {blah: "foo"} -const bar = thing.blah +thing = {blah: "foo"} +bar = thing.blah fn myFn = (param1) => { return param1 @@ -1060,17 +1130,16 @@ fn myFn = (param1) => { }) .await; - // Assure we have no diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl"); - assert!(diagnostics.is_none()); + // Assure we have no errors. + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0); // Get the token map. let token_map = server.token_map.get("file:///test.kcl").unwrap().clone(); - assert!(token_map != vec![]); + assert!(!token_map.is_empty()); // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Send semantic tokens request. let semantic_tokens = server @@ -1214,7 +1283,7 @@ async fn test_kcl_lsp_semantic_tokens_multiple_comments() { // A ball bearing is a type of rolling-element bearing that uses balls to maintain the separation between the bearing races. The primary purpose of a ball bearing is to reduce rotational friction and support radial and axial loads. // Define constants like ball diameter, inside diameter, overhange length, and thickness -const sphereDia = 0.5"# +sphereDia = 0.5"# .to_string(), }, }) @@ -1235,7 +1304,7 @@ const sphereDia = 0.5"# // Check the semantic tokens. if let tower_lsp::lsp_types::SemanticTokensResult::Tokens(semantic_tokens) = semantic_tokens { - assert_eq!(semantic_tokens.data.len(), 7); + assert_eq!(semantic_tokens.data.len(), 6); assert_eq!(semantic_tokens.data[0].length, 15); assert_eq!(semantic_tokens.data[0].delta_start, 0); assert_eq!(semantic_tokens.data[0].delta_line, 0); @@ -1263,36 +1332,27 @@ const sphereDia = 0.5"# .get_semantic_token_type_index(&SemanticTokenType::COMMENT) .unwrap() ); - assert_eq!(semantic_tokens.data[3].length, 5); + assert_eq!(semantic_tokens.data[3].length, 9); assert_eq!(semantic_tokens.data[3].delta_start, 0); assert_eq!(semantic_tokens.data[3].delta_line, 1); assert_eq!( semantic_tokens.data[3].token_type, - server - .get_semantic_token_type_index(&SemanticTokenType::KEYWORD) - .unwrap() - ); - assert_eq!(semantic_tokens.data[4].length, 9); - assert_eq!(semantic_tokens.data[4].delta_start, 6); - assert_eq!(semantic_tokens.data[4].delta_line, 0); - assert_eq!( - semantic_tokens.data[4].token_type, server .get_semantic_token_type_index(&SemanticTokenType::VARIABLE) .unwrap() ); - assert_eq!(semantic_tokens.data[5].length, 1); - assert_eq!(semantic_tokens.data[5].delta_start, 10); + assert_eq!(semantic_tokens.data[4].length, 1); + assert_eq!(semantic_tokens.data[4].delta_start, 10); assert_eq!( - semantic_tokens.data[5].token_type, + semantic_tokens.data[4].token_type, server .get_semantic_token_type_index(&SemanticTokenType::OPERATOR) .unwrap() ); - assert_eq!(semantic_tokens.data[6].length, 3); - assert_eq!(semantic_tokens.data[6].delta_start, 2); + assert_eq!(semantic_tokens.data[5].length, 3); + assert_eq!(semantic_tokens.data[5].delta_start, 2); assert_eq!( - semantic_tokens.data[6].token_type, + semantic_tokens.data[5].token_type, server .get_semantic_token_type_index(&SemanticTokenType::NUMBER) .unwrap() @@ -1313,7 +1373,7 @@ async fn test_kcl_lsp_document_symbol() { uri: "file:///test.kcl".try_into().unwrap(), language_id: "kcl".to_string(), version: 1, - text: r#"const myVar = 1 + text: r#"myVar = 1 startSketchOn('XY')"# .to_string(), }, @@ -1353,7 +1413,7 @@ async fn test_kcl_lsp_document_symbol_tag() { uri: "file:///test.kcl".try_into().unwrap(), language_id: "kcl".to_string(), version: 1, - text: r#"const part001 = startSketchOn('XY') + text: r#"part001 = startSketchOn('XY') |> startProfileAt([11.19, 28.35], %) |> line([28.67, -13.25], %, $here) |> line([-4.12, -22.81], %) @@ -1450,13 +1510,13 @@ async fn test_kcl_lsp_formatting_extra_parens() { // A ball bearing is a type of rolling-element bearing that uses balls to maintain the separation between the bearing races. The primary purpose of a ball bearing is to reduce rotational friction and support radial and axial loads. // Define constants like ball diameter, inside diameter, overhange length, and thickness -const sphereDia = 0.5 -const insideDia = 1 -const thickness = 0.25 -const overHangLength = .4 +sphereDia = 0.5 +insideDia = 1 +thickness = 0.25 +overHangLength = .4 // Sketch and revolve the inside bearing piece -const insideRevolve = startSketchOn('XZ') +insideRevolve = startSketchOn('XZ') |> startProfileAt([insideDia / 2, 0], %) |> line([0, thickness + sphereDia / 2], %) |> line([overHangLength, 0], %) @@ -1470,7 +1530,7 @@ const insideRevolve = startSketchOn('XZ') |> revolve({ axis: 'y' }, %) // Sketch and revolve one of the balls and duplicate it using a circular pattern. (This is currently a workaround, we have a bug with rotating on a sketch that touches the rotation axis) -const sphere = startSketchOn('XZ') +sphere = startSketchOn('XZ') |> startProfileAt([ 0.05 + insideDia / 2 + thickness, 0 - 0.05 @@ -1492,7 +1552,7 @@ const sphere = startSketchOn('XZ') }, %) // Sketch and revolve the outside bearing -const outsideRevolve = startSketchOn('XZ') +outsideRevolve = startSketchOn('XZ') |> startProfileAt([ insideDia / 2 + thickness + sphereDia, 0 @@ -1568,7 +1628,7 @@ insideRevolve = startSketchOn('XZ') |> line([0, -thickness], %) |> line([-overHangLength, 0], %) |> close(%) - |> revolve({ axis: 'y' }, %) + |> revolve({ axis = 'y' }, %) // Sketch and revolve one of the balls and duplicate it using a circular pattern. (This is currently a workaround, we have a bug with rotating on a sketch that touches the rotation axis) sphere = startSketchOn('XZ') @@ -1578,18 +1638,18 @@ sphere = startSketchOn('XZ') ], %) |> line([sphereDia - 0.1, 0], %) |> arc({ - angle_start: 0, - angle_end: -180, - radius: sphereDia / 2 - 0.05 + angle_start = 0, + angle_end = -180, + radius = sphereDia / 2 - 0.05 }, %) |> close(%) - |> revolve({ axis: 'x' }, %) + |> revolve({ axis = 'x' }, %) |> patternCircular3d({ - axis: [0, 0, 1], - center: [0, 0, 0], - repetitions: 10, - arcDegrees: 360, - rotateDuplicates: true + axis = [0, 0, 1], + center = [0, 0, 0], + repetitions = 10, + arcDegrees = 360, + rotateDuplicates = true }, %) // Sketch and revolve the outside bearing @@ -1607,7 +1667,7 @@ outsideRevolve = startSketchOn('XZ') |> line([0, thickness], %) |> line([overHangLength - thickness, 0], %) |> close(%) - |> revolve({ axis: 'y' }, %)"# + |> revolve({ axis = 'y' }, %)"# ); } @@ -1622,7 +1682,7 @@ async fn test_kcl_lsp_rename() { uri: "file:///test.kcl".try_into().unwrap(), language_id: "kcl".to_string(), version: 1, - text: r#"const thing= 1"#.to_string(), + text: r#"thing= 1"#.to_string(), }, }) .await; @@ -1634,7 +1694,7 @@ async fn test_kcl_lsp_rename() { text_document: tower_lsp::lsp_types::TextDocumentIdentifier { uri: "file:///test.kcl".try_into().unwrap(), }, - position: tower_lsp::lsp_types::Position { line: 0, character: 8 }, + position: tower_lsp::lsp_types::Position { line: 0, character: 2 }, }, new_name: "newName".to_string(), work_done_progress_params: Default::default(), @@ -1651,7 +1711,7 @@ async fn test_kcl_lsp_rename() { vec![tower_lsp::lsp_types::TextEdit { range: tower_lsp::lsp_types::Range { start: tower_lsp::lsp_types::Position { line: 0, character: 0 }, - end: tower_lsp::lsp_types::Position { line: 0, character: 13 } + end: tower_lsp::lsp_types::Position { line: 0, character: 7 } }, new_text: "newName = 1\n".to_string() }] @@ -1757,7 +1817,7 @@ async fn test_kcl_lsp_diagnostic_has_lints() { uri: "file:///testlint.kcl".try_into().unwrap(), language_id: "kcl".to_string(), version: 1, - text: r#"let THING = 10"#.to_string(), + text: r#"THING = 10"#.to_string(), }, }) .await; @@ -1843,7 +1903,7 @@ async fn test_copilot_lsp_completions_raw() { let completions = server .get_completions( "kcl".to_string(), - r#"const bracket = startSketchOn('XY') + r#"bracket = startSketchOn('XY') |> startProfileAt([0, 0], %) "# .to_string(), @@ -1862,7 +1922,7 @@ async fn test_copilot_lsp_completions_raw() { let completions_hit_cache = server .get_completions( "kcl".to_string(), - r#"const bracket = startSketchOn('XY') + r#"bracket = startSketchOn('XY') |> startProfileAt([0, 0], %) "# .to_string(), @@ -1902,7 +1962,7 @@ async fn test_copilot_lsp_completions() { path: "file:///test.copilot".to_string(), position: crate::lsp::copilot::types::CopilotPosition { line: 3, character: 3 }, relative_path: "test.copilot".to_string(), - source: r#"const bracket = startSketchOn('XY') + source: r#"bracket = startSketchOn('XY') |> startProfileAt([0, 0], %) |> close(%) @@ -2050,7 +2110,7 @@ async fn test_lsp_initialized() { async fn test_kcl_lsp_on_change_update_ast() { let server = kcl_lsp_server(false).await.unwrap(); - let same_text = r#"const thing = 1"#.to_string(); + let same_text = r#"thing = 1"#.to_string(); // Send open file. server @@ -2086,7 +2146,7 @@ async fn test_kcl_lsp_on_change_update_ast() { assert_eq!(ast, server.ast_map.get("file:///test.kcl").unwrap().clone()); // Update the text. - let new_text = r#"const thing = 2"#.to_string(); + let new_text = r#"thing = 2"#.to_string(); // Send change file. server .did_change(tower_lsp::lsp_types::DidChangeTextDocumentParams { @@ -2112,7 +2172,7 @@ async fn test_kcl_lsp_on_change_update_ast() { async fn kcl_test_kcl_lsp_on_change_update_memory() { let server = kcl_lsp_server(true).await.unwrap(); - let same_text = r#"const thing = 1"#.to_string(); + let same_text = r#"thing = 1"#.to_string(); // Send open file. server @@ -2148,7 +2208,7 @@ async fn kcl_test_kcl_lsp_on_change_update_memory() { assert_eq!(memory, server.memory_map.get("file:///test.kcl").unwrap().clone()); // Update the text. - let new_text = r#"const thing = 2"#.to_string(); + let new_text = r#"thing = 2"#.to_string(); // Send change file. server .did_change(tower_lsp::lsp_types::DidChangeTextDocumentParams { @@ -2172,7 +2232,7 @@ async fn kcl_test_kcl_lsp_update_units() { let server = kcl_lsp_server(true).await.unwrap(); let same_text = r#"fn cube = (pos, scale) => { - const sg = startSketchOn('XY') + sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) |> line([scale, 0], %) @@ -2180,7 +2240,7 @@ async fn kcl_test_kcl_lsp_update_units() { return sg } -const part001 = cube([0,0], 20) +part001 = cube([0,0], 20) |> close(%) |> extrude(20, %)"# .to_string(); @@ -2199,7 +2259,7 @@ const part001 = cube([0,0], 20) // Get the tokens. let tokens = server.token_map.get("file:///test.kcl").unwrap().clone(); - assert_eq!(tokens.len(), 124); + assert_eq!(tokens.as_slice().len(), 120); // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); @@ -2286,11 +2346,10 @@ async fn test_kcl_lsp_diagnostics_on_parse_error() { .await; // Get the diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl").unwrap().clone(); - assert_eq!(diagnostics.len(), 1); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 1); // Update the text. - let new_text = r#"const thing = 2"#.to_string(); + let new_text = r#"thing = 2"#.to_string(); // Send change file. server .did_change(tower_lsp::lsp_types::DidChangeTextDocumentParams { @@ -2307,8 +2366,7 @@ async fn test_kcl_lsp_diagnostics_on_parse_error() { .await; // Get the diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl"); - assert!(diagnostics.is_none()); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0); } #[tokio::test(flavor = "multi_thread")] @@ -2322,7 +2380,7 @@ async fn kcl_test_kcl_lsp_diagnostics_on_execution_error() { uri: "file:///test.kcl".try_into().unwrap(), language_id: "kcl".to_string(), version: 1, - text: r#"const part001 = startSketchOn('XY') + text: r#"part001 = startSketchOn('XY') |> startProfileAt([-10, -10], %) |> line([20, 0], %) |> line([0, 20], %) @@ -2339,11 +2397,11 @@ async fn kcl_test_kcl_lsp_diagnostics_on_execution_error() { .await; // Get the diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl").unwrap().clone(); - assert_eq!(diagnostics.len(), 1); + // TODO warnings being stomped by execution errors? + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 1); // Update the text. - let new_text = r#"const part001 = startSketchOn('XY') + let new_text = r#"part001 = startSketchOn('XY') |> startProfileAt([-10, -10], %) |> line([20, 0], %) |> line([0, 20], %) @@ -2367,8 +2425,7 @@ async fn kcl_test_kcl_lsp_diagnostics_on_execution_error() { .await; // Get the diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl"); - assert!(diagnostics.is_none()); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0); } #[tokio::test(flavor = "multi_thread")] @@ -2382,7 +2439,7 @@ async fn kcl_test_kcl_lsp_full_to_empty_file_updates_ast_and_memory() { uri: "file:///test.kcl".try_into().unwrap(), language_id: "kcl".to_string(), version: 1, - text: r#"const part001 = startSketchOn('XY') + text: r#"part001 = startSketchOn('XY') |> startProfileAt([-10, -10], %) |> line([20, 0], %) |> line([0, 20], %) @@ -2396,7 +2453,7 @@ async fn kcl_test_kcl_lsp_full_to_empty_file_updates_ast_and_memory() { // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl").unwrap().clone(); assert!(memory != ProgramMemory::default()); @@ -2416,7 +2473,7 @@ async fn kcl_test_kcl_lsp_full_to_empty_file_updates_ast_and_memory() { }) .await; - let mut default_hashed = crate::ast::types::Program::default(); + let mut default_hashed = Node::::default(); default_hashed.compute_digest(); // Get the ast. @@ -2431,7 +2488,7 @@ async fn kcl_test_kcl_lsp_full_to_empty_file_updates_ast_and_memory() { async fn kcl_test_kcl_lsp_code_unchanged_but_has_diagnostics_reexecute() { let server = kcl_lsp_server(true).await.unwrap(); - let code = r#"const part001 = startSketchOn('XY') + let code = r#"part001 = startSketchOn('XY') |> startProfileAt([-10, -10], %) |> line([20, 0], %) |> line([0, 20], %) @@ -2453,14 +2510,13 @@ async fn kcl_test_kcl_lsp_code_unchanged_but_has_diagnostics_reexecute() { // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl").unwrap().clone(); assert!(memory != ProgramMemory::default()); // Assure we have no diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl"); - assert!(diagnostics.is_none()); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0); // Add some fake diagnostics. server.diagnostics_map.insert( @@ -2481,15 +2537,14 @@ async fn kcl_test_kcl_lsp_code_unchanged_but_has_diagnostics_reexecute() { }], ); // Assure we have one diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl").unwrap().clone(); - assert_eq!(diagnostics.len(), 1); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 1); // Clear the ast and memory. server .ast_map - .insert("file:///test.kcl".to_string(), crate::ast::types::Program::default()); + .insert("file:///test.kcl".to_string(), Node::::default()); let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert_eq!(ast, crate::ast::types::Program::default()); + assert_eq!(ast, Node::::default()); server .memory_map .insert("file:///test.kcl".to_string(), ProgramMemory::default()); @@ -2513,21 +2568,20 @@ async fn kcl_test_kcl_lsp_code_unchanged_but_has_diagnostics_reexecute() { // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl").unwrap().clone(); assert!(memory != ProgramMemory::default()); // Assure we have no diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl"); - assert!(diagnostics.is_none()); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0); } #[tokio::test(flavor = "multi_thread")] async fn kcl_test_kcl_lsp_code_and_ast_unchanged_but_has_diagnostics_reexecute() { let server = kcl_lsp_server(true).await.unwrap(); - let code = r#"const part001 = startSketchOn('XY') + let code = r#"part001 = startSketchOn('XY') |> startProfileAt([-10, -10], %) |> line([20, 0], %) |> line([0, 20], %) @@ -2549,14 +2603,13 @@ async fn kcl_test_kcl_lsp_code_and_ast_unchanged_but_has_diagnostics_reexecute() // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl").unwrap().clone(); assert!(memory != ProgramMemory::default()); // Assure we have no diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl"); - assert!(diagnostics.is_none()); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0); // Add some fake diagnostics. server.diagnostics_map.insert( @@ -2577,8 +2630,7 @@ async fn kcl_test_kcl_lsp_code_and_ast_unchanged_but_has_diagnostics_reexecute() }], ); // Assure we have one diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl").unwrap().clone(); - assert_eq!(diagnostics.len(), 1); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 1); // Clear ONLY the memory. server @@ -2604,21 +2656,20 @@ async fn kcl_test_kcl_lsp_code_and_ast_unchanged_but_has_diagnostics_reexecute() // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl").unwrap().clone(); assert!(memory != ProgramMemory::default()); // Assure we have no diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl"); - assert!(diagnostics.is_none()); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0); } #[tokio::test(flavor = "multi_thread")] async fn kcl_test_kcl_lsp_code_and_ast_units_unchanged_but_has_diagnostics_reexecute_on_unit_change() { let server = kcl_lsp_server(true).await.unwrap(); - let code = r#"const part001 = startSketchOn('XY') + let code = r#"part001 = startSketchOn('XY') |> startProfileAt([-10, -10], %) |> line([20, 0], %) |> line([0, 20], %) @@ -2640,14 +2691,13 @@ async fn kcl_test_kcl_lsp_code_and_ast_units_unchanged_but_has_diagnostics_reexe // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl").unwrap().clone(); assert!(memory != ProgramMemory::default()); // Assure we have no diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl"); - assert!(diagnostics.is_none()); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0); // Add some fake diagnostics. server.diagnostics_map.insert( @@ -2668,8 +2718,7 @@ async fn kcl_test_kcl_lsp_code_and_ast_units_unchanged_but_has_diagnostics_reexe }], ); // Assure we have one diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl").unwrap().clone(); - assert_eq!(diagnostics.len(), 1); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 1); // Clear ONLY the memory. server @@ -2698,21 +2747,20 @@ async fn kcl_test_kcl_lsp_code_and_ast_units_unchanged_but_has_diagnostics_reexe // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl").unwrap().clone(); assert!(memory != ProgramMemory::default()); // Assure we have no diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl"); - assert!(diagnostics.is_none()); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0); } #[tokio::test(flavor = "multi_thread")] async fn kcl_test_kcl_lsp_code_and_ast_units_unchanged_but_has_memory_reexecute_on_unit_change() { let server = kcl_lsp_server(true).await.unwrap(); - let code = r#"const part001 = startSketchOn('XY') + let code = r#"part001 = startSketchOn('XY') |> startProfileAt([-10, -10], %) |> line([20, 0], %) |> line([0, 20], %) @@ -2734,14 +2782,13 @@ async fn kcl_test_kcl_lsp_code_and_ast_units_unchanged_but_has_memory_reexecute_ // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl").unwrap().clone(); assert!(memory != ProgramMemory::default()); // Assure we have no diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl"); - assert!(diagnostics.is_none()); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0); // Clear ONLY the memory. server @@ -2770,21 +2817,20 @@ async fn kcl_test_kcl_lsp_code_and_ast_units_unchanged_but_has_memory_reexecute_ // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl").unwrap().clone(); assert!(memory != ProgramMemory::default()); // Assure we have no diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl"); - assert!(diagnostics.is_none()); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0); } #[tokio::test(flavor = "multi_thread")] async fn kcl_test_kcl_lsp_cant_execute_set() { let server = kcl_lsp_server(true).await.unwrap(); - let code = r#"const part001 = startSketchOn('XY') + let code = r#"part001 = startSketchOn('XY') |> startProfileAt([-10, -10], %) |> line([20, 0], %) |> line([0, 20], %) @@ -2806,14 +2852,13 @@ async fn kcl_test_kcl_lsp_cant_execute_set() { // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl").unwrap().clone(); assert!(memory != ProgramMemory::default()); // Assure we have no diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl"); - assert!(diagnostics.is_none()); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0); // Clear ONLY the memory. server @@ -2841,14 +2886,13 @@ async fn kcl_test_kcl_lsp_cant_execute_set() { // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl").unwrap().clone(); assert!(memory != ProgramMemory::default()); // Assure we have no diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl"); - assert!(diagnostics.is_none()); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0); // Clear ONLY the memory. server @@ -2883,7 +2927,7 @@ async fn kcl_test_kcl_lsp_cant_execute_set() { let units = server.executor_ctx().await.clone().unwrap().settings.units; assert_eq!(units, crate::settings::types::UnitLength::Mm); - let mut default_hashed = crate::ast::types::Program::default(); + let mut default_hashed = Node::::default(); default_hashed.compute_digest(); // Get the ast. @@ -2895,8 +2939,7 @@ async fn kcl_test_kcl_lsp_cant_execute_set() { assert!(memory == ProgramMemory::default()); // Assure we have no diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl"); - assert!(diagnostics.is_none()); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0); // Set that we CAN execute. server @@ -2924,15 +2967,14 @@ async fn kcl_test_kcl_lsp_cant_execute_set() { // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl").unwrap().clone(); // Now it should NOT be the default memory. assert!(memory != ProgramMemory::default()); // Assure we have no diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl"); - assert!(diagnostics.is_none()); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0); } #[tokio::test(flavor = "multi_thread")] @@ -2985,7 +3027,7 @@ async fn test_kcl_lsp_folding() { async fn kcl_test_kcl_lsp_code_with_parse_error_and_ast_unchanged_but_has_diagnostics_reparse() { let server = kcl_lsp_server(false).await.unwrap(); - let code = r#"const part001 = startSketchOn('XY') + let code = r#"part001 = startSketchOn('XY') |> startProfileAt([-10, -10], %) |> line([20, 0], %) |> line([0, 20], %) @@ -3010,8 +3052,7 @@ async fn kcl_test_kcl_lsp_code_with_parse_error_and_ast_unchanged_but_has_diagno assert!(ast.is_none()); // Assure we have one diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl").unwrap().clone(); - assert_eq!(diagnostics.len(), 1); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 1); // Send change file, but the code is the same. server @@ -3033,16 +3074,15 @@ async fn kcl_test_kcl_lsp_code_with_parse_error_and_ast_unchanged_but_has_diagno assert!(ast.is_none()); // Assure we have one diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl").unwrap().clone(); - assert_eq!(diagnostics.len(), 1); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 1); } #[tokio::test(flavor = "multi_thread")] async fn kcl_test_kcl_lsp_code_with_lint_and_ast_unchanged_but_has_diagnostics_reparse() { let server = kcl_lsp_server(false).await.unwrap(); - let code = r#"const LINT = 1 -const part001 = startSketchOn('XY') + let code = r#"LINT = 1 +part001 = startSketchOn('XY') |> startProfileAt([-10, -10], %) |> line([20, 0], %) |> line([0, 20], %) @@ -3064,12 +3104,10 @@ const part001 = startSketchOn('XY') // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Assure we have one diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl").unwrap().clone(); - assert_eq!(diagnostics.len(), 1); - + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 1); // Send change file, but the code is the same. server .did_change(tower_lsp::lsp_types::DidChangeTextDocumentParams { @@ -3087,19 +3125,18 @@ const part001 = startSketchOn('XY') // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Assure we have one diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl").unwrap().clone(); - assert_eq!(diagnostics.len(), 1); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 1); } #[tokio::test(flavor = "multi_thread")] async fn kcl_test_kcl_lsp_code_with_lint_and_parse_error_and_ast_unchanged_but_has_diagnostics_reparse() { let server = kcl_lsp_server(false).await.unwrap(); - let code = r#"const LINT = 1 -const part001 = startSketchOn('XY') + let code = r#"LINT = 1 +part001 = startSketchOn('XY') |> startProfileAt([-10, -10], %) |> line([20, 0], %) |> line([0, 20], %) @@ -3124,8 +3161,7 @@ const part001 = startSketchOn('XY') assert!(ast.is_none()); // Assure we have diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl").unwrap().clone(); - assert_eq!(diagnostics.len(), 1); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 1); // Send change file, but the code is the same. server @@ -3147,16 +3183,15 @@ const part001 = startSketchOn('XY') assert!(ast.is_none()); // Assure we have one diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl").unwrap().clone(); - assert_eq!(diagnostics.len(), 1); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 1); } #[tokio::test(flavor = "multi_thread")] async fn kcl_test_kcl_lsp_code_lint_and_ast_unchanged_but_has_diagnostics_reexecute() { let server = kcl_lsp_server(true).await.unwrap(); - let code = r#"const LINT = 1 -const part001 = startSketchOn('XY') + let code = r#"LINT = 1 +part001 = startSketchOn('XY') |> startProfileAt([-10, -10], %) |> line([20, 0], %) |> line([0, 20], %, $seg01) @@ -3177,13 +3212,13 @@ const part001 = startSketchOn('XY') .await; // Assure we have diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl").unwrap().clone(); + // Check the diagnostics. - assert_eq!(diagnostics.len(), 2); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 2); // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl"); assert!(memory.is_none()); @@ -3205,23 +3240,23 @@ const part001 = startSketchOn('XY') // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl"); assert!(memory.is_none()); // Assure we have diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl").unwrap().clone(); + // Check the diagnostics. - assert_eq!(diagnostics.len(), 2); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 2); } #[tokio::test(flavor = "multi_thread")] async fn kcl_test_kcl_lsp_code_lint_reexecute_new_lint() { let server = kcl_lsp_server(true).await.unwrap(); - let code = r#"const LINT = 1 -const part001 = startSketchOn('XY') + let code = r#"LINT = 1 +part001 = startSketchOn('XY') |> startProfileAt([-10, -10], %) |> line([20, 0], %) |> line([0, 20], %, $seg01) @@ -3242,13 +3277,13 @@ const part001 = startSketchOn('XY') .await; // Assure we have diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl").unwrap().clone(); + // Check the diagnostics. - assert_eq!(diagnostics.len(), 2); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 2); // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl"); assert!(memory.is_none()); @@ -3263,14 +3298,14 @@ const part001 = startSketchOn('XY') content_changes: vec![tower_lsp::lsp_types::TextDocumentContentChangeEvent { range: None, range_length: None, - text: r#"const part001 = startSketchOn('XY') + text: r#"part001 = startSketchOn('XY') |> startProfileAt([-10, -10], %) |> line([20, 0], %) |> line([0, 20], %, $seg01) |> line([-20, 0], %, $seg01) |> close(%) |> extrude(3.14, %) -const NEW_LINT = 1"# +NEW_LINT = 1"# .to_string(), }], }) @@ -3278,23 +3313,23 @@ const NEW_LINT = 1"# // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl"); assert!(memory.is_none()); // Assure we have diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl").unwrap().clone(); + // Check the diagnostics. - assert_eq!(diagnostics.len(), 2); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 2); } #[tokio::test(flavor = "multi_thread")] async fn kcl_test_kcl_lsp_code_lint_reexecute_new_ast_error() { let server = kcl_lsp_server(true).await.unwrap(); - let code = r#"const LINT = 1 -const part001 = startSketchOn('XY') + let code = r#"LINT = 1 +part001 = startSketchOn('XY') |> startProfileAt([-10, -10], %) |> line([20, 0], %) |> line([0, 20], %, $seg01) @@ -3315,9 +3350,9 @@ const part001 = startSketchOn('XY') .await; // Assure we have diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl").unwrap().clone(); + // Check the diagnostics. - assert_eq!(diagnostics.len(), 1); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 1); // Get the ast. let ast = server.ast_map.get("file:///test.kcl"); @@ -3336,14 +3371,14 @@ const part001 = startSketchOn('XY') content_changes: vec![tower_lsp::lsp_types::TextDocumentContentChangeEvent { range: None, range_length: None, - text: r#"const part001 = startSketchOn('XY') + text: r#"part001 = startSketchOn('XY') |> ^^^^startProfileAt([-10, -10], %) |> line([20, 0], %) |> line([0, 20], %, $seg01) |> line([-20, 0], %, $seg01) |> close(%) |> extrude(3.14, %) -const NEW_LINT = 1"# +NEW_LINT = 1"# .to_string(), }], }) @@ -3357,17 +3392,17 @@ const NEW_LINT = 1"# assert!(memory.is_none()); // Assure we have diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl").unwrap().clone(); + // Check the diagnostics. - assert_eq!(diagnostics.len(), 1); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 1); } #[tokio::test(flavor = "multi_thread")] async fn kcl_test_kcl_lsp_code_lint_reexecute_had_lint_new_parse_error() { let server = kcl_lsp_server(true).await.unwrap(); - let code = r#"const LINT = 1 -const part001 = startSketchOn('XY') + let code = r#"LINT = 1 +part001 = startSketchOn('XY') |> startProfileAt([-10, -10], %) |> line([20, 0], %) |> line([0, 20], %) @@ -3388,21 +3423,21 @@ const part001 = startSketchOn('XY') .await; // Assure we have diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl").unwrap().clone(); + // Check the diagnostics. - assert_eq!(diagnostics.len(), 1); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 1); // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the symbols map. let symbols_map = server.symbols_map.get("file:///test.kcl").unwrap().clone(); - assert!(symbols_map != vec![]); + assert!(!symbols_map.is_empty()); // Get the semantic tokens map. let semantic_tokens_map = server.semantic_tokens_map.get("file:///test.kcl").unwrap().clone(); - assert!(semantic_tokens_map != vec![]); + assert!(!semantic_tokens_map.is_empty()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl").unwrap().clone(); @@ -3418,14 +3453,14 @@ const part001 = startSketchOn('XY') content_changes: vec![tower_lsp::lsp_types::TextDocumentContentChangeEvent { range: None, range_length: None, - text: r#"const part001 = startSketchOn('XY') + text: r#"part001 = startSketchOn('XY') |> ^^^^startProfileAt([-10, -10], %) |> line([20, 0], %) |> line([0, 20], %) |> line([-20, 0], %) |> close(%) |> extrude(3.14, %) -const NEW_LINT = 1"# +NEW_LINT = 1"# .to_string(), }], }) @@ -3441,24 +3476,24 @@ const NEW_LINT = 1"# // Get the semantic tokens map. let semantic_tokens_map = server.semantic_tokens_map.get("file:///test.kcl").unwrap().clone(); - assert!(semantic_tokens_map != vec![]); + assert!(!semantic_tokens_map.is_empty()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl"); assert!(memory.is_none()); // Assure we have diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl").unwrap().clone(); + // Check the diagnostics. - assert_eq!(diagnostics.len(), 1); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 1); } #[tokio::test(flavor = "multi_thread")] async fn kcl_test_kcl_lsp_code_lint_reexecute_had_lint_new_execution_error() { let server = kcl_lsp_server(true).await.unwrap(); - let code = r#"const LINT = 1 -const part001 = startSketchOn('XY') + let code = r#"LINT = 1 +part001 = startSketchOn('XY') |> startProfileAt([-10, -10], %) |> line([20, 0], %) |> line([0, 20], %) @@ -3479,25 +3514,25 @@ const part001 = startSketchOn('XY') .await; // Assure we have diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl").unwrap().clone(); + // Check the diagnostics. - assert_eq!(diagnostics.len(), 1); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 1); // Get the token map. let token_map = server.token_map.get("file:///test.kcl").unwrap().clone(); - assert!(token_map != vec![]); + assert!(!token_map.is_empty()); // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the symbols map. let symbols_map = server.symbols_map.get("file:///test.kcl").unwrap().clone(); - assert!(symbols_map != vec![]); + assert!(!symbols_map.is_empty()); // Get the semantic tokens map. let semantic_tokens_map = server.semantic_tokens_map.get("file:///test.kcl").unwrap().clone(); - assert!(semantic_tokens_map != vec![]); + assert!(!semantic_tokens_map.is_empty()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl").unwrap().clone(); @@ -3513,8 +3548,8 @@ const part001 = startSketchOn('XY') content_changes: vec![tower_lsp::lsp_types::TextDocumentContentChangeEvent { range: None, range_length: None, - text: r#"const LINT = 1 -const part001 = startSketchOn('XY') + text: r#"LINT = 1 +part001 = startSketchOn('XY') |> startProfileAt([-10, -10], %) |> line([20, 0], %, $seg01) |> line([0, 20], %, $seg01) @@ -3528,26 +3563,59 @@ const part001 = startSketchOn('XY') // Get the token map. let token_map = server.token_map.get("file:///test.kcl").unwrap().clone(); - assert!(token_map != vec![]); + assert!(!token_map.is_empty()); // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the symbols map. let symbols_map = server.symbols_map.get("file:///test.kcl").unwrap().clone(); - assert!(symbols_map != vec![]); + assert!(!symbols_map.is_empty()); // Get the semantic tokens map. let semantic_tokens_map = server.semantic_tokens_map.get("file:///test.kcl").unwrap().clone(); - assert!(semantic_tokens_map != vec![]); + assert!(!semantic_tokens_map.is_empty()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl"); assert!(memory.is_none()); // Assure we have diagnostics. - let diagnostics = server.diagnostics_map.get("file:///test.kcl").unwrap().clone(); + // Check the diagnostics. - assert_eq!(diagnostics.len(), 2); + assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 2); +} + +#[tokio::test(flavor = "multi_thread")] +async fn kcl_test_kcl_lsp_completions_number_literal() { + let server = kcl_lsp_server(false).await.unwrap(); + + server + .did_open(tower_lsp::lsp_types::DidOpenTextDocumentParams { + text_document: tower_lsp::lsp_types::TextDocumentItem { + uri: "file:///test.kcl".try_into().unwrap(), + language_id: "kcl".to_string(), + version: 1, + text: "thing = 10".to_string(), + }, + }) + .await; + + let completions = server + .completion(tower_lsp::lsp_types::CompletionParams { + text_document_position: tower_lsp::lsp_types::TextDocumentPositionParams { + text_document: tower_lsp::lsp_types::TextDocumentIdentifier { + uri: "file:///test.kcl".try_into().unwrap(), + }, + position: tower_lsp::lsp_types::Position { line: 0, character: 10 }, + }, + context: None, + partial_result_params: Default::default(), + work_done_progress_params: Default::default(), + }) + .await + .unwrap(); + + assert_eq!(completions.is_none(), true); } diff --git a/src/wasm-lib/kcl/src/parser.rs b/src/wasm-lib/kcl/src/parser.rs deleted file mode 100644 index a871ace48..000000000 --- a/src/wasm-lib/kcl/src/parser.rs +++ /dev/null @@ -1,65 +0,0 @@ -use crate::{ - ast::types::Program, - errors::{KclError, KclErrorDetails}, - executor::SourceRange, - token::{Token, TokenType}, -}; - -mod bad_inputs; -mod math; -pub(crate) mod parser_impl; - -pub const PIPE_SUBSTITUTION_OPERATOR: &str = "%"; -pub const PIPE_OPERATOR: &str = "|>"; - -/// Parse the given KCL code into an AST. -pub fn parse(code: &str) -> Result { - let tokens = crate::token::lexer(code)?; - let parser = Parser::new(tokens); - parser.ast() -} - -pub struct Parser { - pub tokens: Vec, - pub unknown_tokens: Vec, -} - -impl Parser { - pub fn new(tokens: Vec) -> Self { - let (tokens, unknown_tokens): (Vec, Vec) = tokens - .into_iter() - .partition(|token| token.token_type != TokenType::Unknown); - Self { tokens, unknown_tokens } - } - - /// Run the parser - pub fn ast(&self) -> Result { - if !self.unknown_tokens.is_empty() { - let source_ranges = self.unknown_tokens.iter().map(SourceRange::from).collect(); - let token_list = self.unknown_tokens.iter().map(|t| t.value.as_str()).collect::>(); - let message = if token_list.len() == 1 { - format!("found unknown token '{}'", token_list[0]) - } else { - format!("found unknown tokens [{}]", token_list.join(", ")) - }; - return Err(KclError::Lexical(KclErrorDetails { source_ranges, message })); - } - - // Important, to not call this before the unknown tokens check. - if self.tokens.is_empty() { - // Empty file should just do nothing. - return Ok(Program::default()); - } - - // Check all the tokens are whitespace or comments. - if self - .tokens - .iter() - .all(|t| t.token_type.is_whitespace() || t.token_type.is_comment()) - { - return Ok(Program::default()); - } - - parser_impl::run_parser(&mut self.tokens.as_slice()) - } -} diff --git a/src/wasm-lib/kcl/src/parser/bad_inputs.rs b/src/wasm-lib/kcl/src/parser/bad_inputs.rs deleted file mode 100644 index 8fa31fb4f..000000000 --- a/src/wasm-lib/kcl/src/parser/bad_inputs.rs +++ /dev/null @@ -1,17 +0,0 @@ -#[cfg(test)] -mod tests { - - macro_rules! parse_and_lex { - ($func_name:ident, $test_kcl_program:expr) => { - #[test] - fn $func_name() { - if let Ok(v) = $crate::token::lexer($test_kcl_program) { - let _ = $crate::parser::Parser::new(v).ast(); - } - } - }; - } - - parse_and_lex!(crash_eof_1, "{\"ގގ\0\0\0\"\"."); - parse_and_lex!(crash_eof_2, "(/=e\"\u{616}ݝ\"\""); -} diff --git a/src/wasm-lib/kcl/src/parser/parser_impl.rs b/src/wasm-lib/kcl/src/parser/parser_impl.rs deleted file mode 100644 index f7f15dc7b..000000000 --- a/src/wasm-lib/kcl/src/parser/parser_impl.rs +++ /dev/null @@ -1,3708 +0,0 @@ -use std::{collections::HashMap, str::FromStr}; - -use winnow::{ - combinator::{alt, delimited, opt, peek, preceded, repeat, separated, terminated}, - dispatch, - error::{ErrMode, StrContext, StrContextValue}, - prelude::*, - token::{any, one_of, take_till}, -}; - -use crate::{ - ast::types::{ - ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryOperator, BinaryPart, BodyItem, CallExpression, - CommentStyle, ElseIf, Expr, ExpressionStatement, FnArgPrimitive, FnArgType, FunctionExpression, Identifier, - IfExpression, ImportItem, ImportStatement, ItemVisibility, Literal, LiteralIdentifier, LiteralValue, - MemberExpression, MemberObject, NonCodeMeta, NonCodeNode, NonCodeValue, ObjectExpression, ObjectProperty, - Parameter, PipeExpression, PipeSubstitution, Program, ReturnStatement, TagDeclarator, UnaryExpression, - UnaryOperator, ValueMeta, VariableDeclaration, VariableDeclarator, VariableKind, - }, - errors::{KclError, KclErrorDetails}, - executor::SourceRange, - parser::{ - math::BinaryExpressionToken, parser_impl::error::ContextError, PIPE_OPERATOR, PIPE_SUBSTITUTION_OPERATOR, - }, - token::{Token, TokenType}, -}; - -mod error; - -type PResult = winnow::prelude::PResult; - -type TokenSlice<'slice, 'input> = &'slice mut &'input [Token]; - -pub fn run_parser(i: TokenSlice) -> Result { - program.parse(i).map_err(KclError::from) -} - -fn expected(what: &'static str) -> StrContext { - StrContext::Expected(StrContextValue::Description(what)) -} - -fn program(i: TokenSlice) -> PResult { - let shebang = opt(shebang).parse_next(i)?; - let mut out = function_body.parse_next(i)?; - - // Add the shebang to the non-code meta. - if let Some(shebang) = shebang { - out.non_code_meta.start.insert(0, shebang); - } - // Match original parser behaviour, for now. - // Once this is merged and stable, consider changing this as I think it's more accurate - // without the -1. - out.end -= 1; - Ok(out) -} - -fn pipe_surrounded_by_whitespace(i: TokenSlice) -> PResult<()> { - ( - repeat(0.., whitespace).map(|_: Vec<_>| ()), - pipe_operator, - repeat(0.., whitespace).map(|_: Vec<_>| ()), - ) - .parse_next(i)?; - Ok(()) -} - -/// Note this is O(n). -fn count_in(target: char, s: &str) -> usize { - s.chars().filter(|&c| c == target).count() -} - -/// Matches all four cases of NonCodeValue -fn non_code_node(i: TokenSlice) -> PResult { - /// Matches one case of NonCodeValue - /// See docstring on [NonCodeValue::NewLineBlockComment] for why that case is different to the others. - fn non_code_node_leading_whitespace(i: TokenSlice) -> PResult { - let leading_whitespace = one_of(TokenType::Whitespace) - .context(expected("whitespace, with a newline")) - .parse_next(i)?; - let has_empty_line = count_in('\n', &leading_whitespace.value) >= 2; - non_code_node_no_leading_whitespace - .verify_map(|node: NonCodeNode| match node.value { - NonCodeValue::BlockComment { value, style } => Some(NonCodeNode { - start: leading_whitespace.start, - end: node.end + 1, - value: if has_empty_line { - NonCodeValue::NewLineBlockComment { value, style } - } else { - NonCodeValue::BlockComment { value, style } - }, - digest: None, - }), - _ => None, - }) - .context(expected("a comment or whitespace")) - .parse_next(i) - } - - alt((non_code_node_leading_whitespace, non_code_node_no_leading_whitespace)).parse_next(i) -} - -// Matches remaining three cases of NonCodeValue -fn non_code_node_no_leading_whitespace(i: TokenSlice) -> PResult { - any.verify_map(|token: Token| { - if token.is_code_token() { - None - } else { - let value = match token.token_type { - TokenType::Whitespace if token.value.contains("\n\n") => NonCodeValue::NewLine, - TokenType::LineComment => NonCodeValue::BlockComment { - value: token.value.trim_start_matches("//").trim().to_owned(), - style: CommentStyle::Line, - }, - TokenType::BlockComment => NonCodeValue::BlockComment { - style: CommentStyle::Block, - value: token - .value - .trim_start_matches("/*") - .trim_end_matches("*/") - .trim() - .to_owned(), - }, - _ => return None, - }; - Some(NonCodeNode { - start: token.start, - end: token.end, - value, - digest: None, - }) - } - }) - .context(expected("Non-code token (comments or whitespace)")) - .parse_next(i) -} - -fn pipe_expression(i: TokenSlice) -> PResult { - let mut non_code_meta = NonCodeMeta::default(); - let (head, noncode): (_, Vec<_>) = terminated( - ( - expression_but_not_pipe, - repeat(0.., preceded(whitespace, non_code_node)), - ), - peek(pipe_surrounded_by_whitespace), - ) - .context(expected("an expression, followed by the |> (pipe) operator")) - .parse_next(i)?; - for nc in noncode { - non_code_meta.insert(0, nc); - } - let mut values = vec![head]; - let value_surrounded_by_comments = ( - repeat(0.., preceded(opt(whitespace), non_code_node)), // Before the expression. - preceded(opt(whitespace), fn_call), // The expression. - repeat(0.., noncode_just_after_code), // After the expression. - ); - let tail: Vec<(Vec<_>, _, Vec<_>)> = repeat( - 1.., - preceded(pipe_surrounded_by_whitespace, value_surrounded_by_comments), - ) - .context(expected( - "a sequence of at least one |> (pipe) operator, followed by an expression", - )) - .parse_next(i)?; - - // All child parsers have been run. - // First, ensure they all have a % in their args. - let calls_without_substitution = tail.iter().find_map(|(_nc, call_expr, _nc2)| { - if !call_expr.has_substitution_arg() { - Some(call_expr.as_source_ranges()) - } else { - None - } - }); - if let Some(source_ranges) = calls_without_substitution { - let err = KclError::Syntax(KclErrorDetails { - source_ranges, - message: "All expressions in a pipeline must use the % (substitution operator)".to_owned(), - }); - return Err(ErrMode::Cut(err.into())); - } - // Time to structure the return value. - let mut code_count = 0; - let mut max_noncode_end = 0; - for (noncode_before, code, noncode_after) in tail { - for nc in noncode_before { - max_noncode_end = nc.end.max(max_noncode_end); - non_code_meta.insert(code_count, nc); - } - values.push(Expr::CallExpression(Box::new(code))); - code_count += 1; - for nc in noncode_after { - max_noncode_end = nc.end.max(max_noncode_end); - non_code_meta.insert(code_count, nc); - } - } - Ok(PipeExpression { - start: values.first().unwrap().start(), - end: values.last().unwrap().end().max(max_noncode_end), - body: values, - non_code_meta, - digest: None, - }) -} - -fn bool_value(i: TokenSlice) -> PResult { - let (value, token) = any - .try_map(|token: Token| match token.token_type { - TokenType::Keyword if token.value == "true" => Ok((true, token)), - TokenType::Keyword if token.value == "false" => Ok((false, token)), - _ => Err(KclError::Syntax(KclErrorDetails { - source_ranges: token.as_source_ranges(), - message: "invalid boolean literal".to_owned(), - })), - }) - .context(expected("a boolean literal (either true or false)")) - .parse_next(i)?; - Ok(Literal { - start: token.start, - end: token.end, - value: LiteralValue::Bool(value), - raw: value.to_string(), - digest: None, - }) -} - -pub fn literal(i: TokenSlice) -> PResult { - alt((string_literal, unsigned_number_literal)) - .context(expected("a KCL literal, like 'myPart' or 3")) - .parse_next(i) -} - -/// Parse a KCL string literal -pub fn string_literal(i: TokenSlice) -> PResult { - let (value, token) = any - .try_map(|token: Token| match token.token_type { - TokenType::String => { - let s = token.value[1..token.value.len() - 1].to_string(); - Ok((LiteralValue::from(s), token)) - } - _ => Err(KclError::Syntax(KclErrorDetails { - source_ranges: token.as_source_ranges(), - message: "invalid string literal".to_owned(), - })), - }) - .context(expected("string literal (like \"myPart\"")) - .parse_next(i)?; - Ok(Literal { - start: token.start, - end: token.end, - value, - raw: token.value.clone(), - digest: None, - }) -} - -/// Parse a KCL literal number, with no - sign. -pub(crate) fn unsigned_number_literal(i: TokenSlice) -> PResult { - let (value, token) = any - .try_map(|token: Token| match token.token_type { - TokenType::Number => { - if let Ok(x) = token.value.parse::() { - return Ok((LiteralValue::IInteger(x as i64), token)); - } - let x: f64 = token.value.parse().map_err(|_| { - KclError::Syntax(KclErrorDetails { - source_ranges: token.as_source_ranges(), - message: format!("Invalid float: {}", token.value), - }) - })?; - - Ok((LiteralValue::Fractional(x), token)) - } - _ => Err(KclError::Syntax(KclErrorDetails { - source_ranges: token.as_source_ranges(), - message: "invalid literal".to_owned(), - })), - }) - .context(expected("an unsigned number literal (e.g. 3 or 12.5)")) - .parse_next(i)?; - Ok(Literal { - start: token.start, - end: token.end, - value, - raw: token.value.clone(), - digest: None, - }) -} - -/// Parse a KCL operator that takes a left- and right-hand side argument. -fn binary_operator(i: TokenSlice) -> PResult { - any.try_map(|token: Token| { - if !matches!(token.token_type, TokenType::Operator) { - return Err(KclError::Syntax(KclErrorDetails { - source_ranges: token.as_source_ranges(), - message: format!("unexpected token, should be an operator but was {}", token.token_type), - })); - } - let op = match token.value.as_str() { - "+" => BinaryOperator::Add, - "-" => BinaryOperator::Sub, - "/" => BinaryOperator::Div, - "*" => BinaryOperator::Mul, - "%" => BinaryOperator::Mod, - "^" => BinaryOperator::Pow, - "==" => BinaryOperator::Eq, - "!=" => BinaryOperator::Neq, - ">" => BinaryOperator::Gt, - ">=" => BinaryOperator::Gte, - "<" => BinaryOperator::Lt, - "<=" => BinaryOperator::Lte, - _ => { - return Err(KclError::Syntax(KclErrorDetails { - source_ranges: token.as_source_ranges(), - message: format!("{} is not a binary operator", token.value.as_str()), - })) - } - }; - Ok(op) - }) - .context(expected("a binary operator (like + or *)")) - .parse_next(i) -} - -/// Parse a KCL operand that can be used with an operator. -fn operand(i: TokenSlice) -> PResult { - const TODO_783: &str = "found a value, but this kind of value cannot be used as the operand to an operator yet (see https://github.com/KittyCAD/modeling-app/issues/783)"; - let op = possible_operands - .try_map(|part| { - let source_ranges = vec![SourceRange([part.start(), part.end()])]; - let expr = match part { - // TODO: these should be valid operands eventually, - // users should be able to run "let x = f() + g()" - // see https://github.com/KittyCAD/modeling-app/issues/783 - Expr::FunctionExpression(_) - | Expr::PipeExpression(_) - | Expr::PipeSubstitution(_) - | Expr::ArrayExpression(_) - | Expr::ArrayRangeExpression(_) - | Expr::ObjectExpression(_) => { - return Err(KclError::Syntax(KclErrorDetails { - source_ranges, - message: TODO_783.to_owned(), - })) - } - Expr::None(_) => { - return Err(KclError::Semantic(KclErrorDetails { - source_ranges, - // TODO: Better error message here. - // Once we have ways to use None values (e.g. by replacing with a default value) - // we should suggest one of them here. - message: "cannot use a KCL None value as an operand".to_owned(), - })); - } - Expr::TagDeclarator(_) => { - return Err(KclError::Semantic(KclErrorDetails { - source_ranges, - // TODO: Better error message here. - // Once we have ways to use None values (e.g. by replacing with a default value) - // we should suggest one of them here. - message: "cannot use a KCL tag declaration as an operand".to_owned(), - })); - } - Expr::UnaryExpression(x) => BinaryPart::UnaryExpression(x), - Expr::Literal(x) => BinaryPart::Literal(x), - Expr::Identifier(x) => BinaryPart::Identifier(x), - Expr::BinaryExpression(x) => BinaryPart::BinaryExpression(x), - Expr::CallExpression(x) => BinaryPart::CallExpression(x), - Expr::MemberExpression(x) => BinaryPart::MemberExpression(x), - Expr::IfExpression(x) => BinaryPart::IfExpression(x), - }; - Ok(expr) - }) - .context(expected("an operand (a value which can be used with an operator)")) - .parse_next(i)?; - Ok(op) -} - -impl TokenType { - fn parse_from(self, i: TokenSlice) -> PResult { - any.try_map(|token: Token| { - if token.token_type == self { - Ok(token) - } else { - Err(KclError::Syntax(KclErrorDetails { - source_ranges: token.as_source_ranges(), - message: format!( - "expected {self} but found {} which is a {}", - token.value.as_str(), - token.token_type - ), - })) - } - }) - .parse_next(i) - } -} - -/// Parse some whitespace (i.e. at least one whitespace token) -fn whitespace(i: TokenSlice) -> PResult> { - repeat( - 1.., - any.try_map(|token: Token| { - if token.token_type == TokenType::Whitespace { - Ok(token) - } else { - Err(KclError::Syntax(KclErrorDetails { - source_ranges: token.as_source_ranges(), - message: format!( - "expected whitespace, found '{}' which is {}", - token.value.as_str(), - token.token_type - ), - })) - } - }), - ) - .context(expected("some whitespace (e.g. spaces, tabs, new lines)")) - .parse_next(i) -} - -/// A shebang is a line at the start of a file that starts with `#!`. -/// If the shebang is present it takes up the whole line. -fn shebang(i: TokenSlice) -> PResult { - // Parse the hash and the bang. - hash.parse_next(i)?; - bang.parse_next(i)?; - // Get the rest of the line. - // Parse everything until the next newline. - let tokens = take_till(0.., |token: Token| token.value.contains('\n')).parse_next(i)?; - let value = tokens.iter().map(|t| t.value.as_str()).collect::(); - - if tokens.is_empty() { - return Err(ErrMode::Cut( - KclError::Syntax(KclErrorDetails { - source_ranges: vec![], - message: "expected a shebang value after #!".to_owned(), - }) - .into(), - )); - } - - // Strip all the whitespace after the shebang. - opt(whitespace).parse_next(i)?; - - Ok(NonCodeNode { - start: 0, - end: tokens.last().unwrap().end, - value: NonCodeValue::Shebang { - value: format!("#!{}", value), - }, - digest: None, - }) -} - -/// Parse the = operator. -fn equals(i: TokenSlice) -> PResult { - one_of((TokenType::Operator, "=")) - .context(expected("the equals operator, =")) - .parse_next(i) -} - -#[allow(clippy::large_enum_variant)] -pub enum NonCodeOr { - NonCode(NonCodeNode), - Code(T), -} - -/// Parse a KCL array of elements. -fn array(i: TokenSlice) -> PResult { - alt(( - array_empty.map(Box::new).map(Expr::ArrayExpression), - array_elem_by_elem.map(Box::new).map(Expr::ArrayExpression), - array_end_start.map(Box::new).map(Expr::ArrayRangeExpression), - )) - .parse_next(i) -} - -/// Match an empty array. -fn array_empty(i: TokenSlice) -> PResult { - let start = open_bracket(i)?.start; - ignore_whitespace(i); - let end = close_bracket(i)?.end; - Ok(ArrayExpression { - start, - end, - elements: Default::default(), - non_code_meta: Default::default(), - digest: None, - }) -} - -/// Match something that separates elements of an array. -fn array_separator(i: TokenSlice) -> PResult<()> { - alt(( - // Normally you need a comma. - comma_sep, - // But, if the array is ending, no need for a comma. - peek(preceded(opt(whitespace), close_bracket)).void(), - )) - .parse_next(i) -} - -pub(crate) fn array_elem_by_elem(i: TokenSlice) -> PResult { - let start = open_bracket(i)?.start; - ignore_whitespace(i); - let elements: Vec<_> = repeat( - 0.., - alt(( - terminated(expression.map(NonCodeOr::Code), array_separator), - terminated(non_code_node.map(NonCodeOr::NonCode), whitespace), - )), - ) - .context(expected("array contents, a list of elements (like [1, 2, 3])")) - .parse_next(i)?; - ignore_whitespace(i); - let end = close_bracket(i)?.end; - - // Sort the array's elements (i.e. expression nodes) from the noncode nodes. - let (elements, non_code_nodes): (Vec<_>, HashMap) = elements.into_iter().enumerate().fold( - (Vec::new(), HashMap::new()), - |(mut elements, mut non_code_nodes), (i, e)| { - match e { - NonCodeOr::NonCode(x) => { - non_code_nodes.insert(i, vec![x]); - } - NonCodeOr::Code(x) => { - elements.push(x); - } - } - (elements, non_code_nodes) - }, - ); - let non_code_meta = NonCodeMeta { - non_code_nodes, - start: Vec::new(), - digest: None, - }; - Ok(ArrayExpression { - start, - end, - elements, - non_code_meta, - digest: None, - }) -} - -fn array_end_start(i: TokenSlice) -> PResult { - let start = open_bracket(i)?.start; - ignore_whitespace(i); - let start_element = Box::new(expression.parse_next(i)?); - ignore_whitespace(i); - double_period.parse_next(i)?; - ignore_whitespace(i); - let end_element = Box::new(expression.parse_next(i)?); - ignore_whitespace(i); - let end = close_bracket(i)?.end; - Ok(ArrayRangeExpression { - start, - end, - start_element, - end_element, - end_inclusive: true, - digest: None, - }) -} - -fn object_property(i: TokenSlice) -> PResult { - let key = identifier.context(expected("the property's key (the name or identifier of the property), e.g. in 'height: 4', 'height' is the property key")).parse_next(i)?; - ignore_whitespace(i); - colon - .context(expected( - "a colon, which separates the property's key from the value you're setting it to, e.g. 'height: 4'", - )) - .parse_next(i)?; - ignore_whitespace(i); - let expr = expression - .context(expected( - "the value which you're setting the property to, e.g. in 'height: 4', the value is 4", - )) - .parse_next(i)?; - Ok(ObjectProperty { - start: key.start, - end: expr.end(), - key, - value: expr, - digest: None, - }) -} - -/// Match something that separates properties of an object. -fn property_separator(i: TokenSlice) -> PResult<()> { - alt(( - // Normally you need a comma. - comma_sep, - // But, if the array is ending, no need for a comma. - peek(preceded(opt(whitespace), close_brace)).void(), - )) - .parse_next(i) -} - -/// Parse a KCL object value. -pub(crate) fn object(i: TokenSlice) -> PResult { - let start = open_brace(i)?.start; - ignore_whitespace(i); - let properties: Vec<_> = repeat( - 0.., - alt(( - terminated(non_code_node.map(NonCodeOr::NonCode), whitespace), - terminated(object_property, property_separator).map(NonCodeOr::Code), - )), - ) - .context(expected( - "a comma-separated list of key-value pairs, e.g. 'height: 4, width: 3'", - )) - .parse_next(i)?; - - // Sort the object's properties from the noncode nodes. - let (properties, non_code_nodes): (Vec<_>, HashMap) = properties.into_iter().enumerate().fold( - (Vec::new(), HashMap::new()), - |(mut properties, mut non_code_nodes), (i, e)| { - match e { - NonCodeOr::NonCode(x) => { - non_code_nodes.insert(i, vec![x]); - } - NonCodeOr::Code(x) => { - properties.push(x); - } - } - (properties, non_code_nodes) - }, - ); - ignore_trailing_comma(i); - ignore_whitespace(i); - let end = close_brace(i)?.end; - let non_code_meta = NonCodeMeta { - non_code_nodes, - ..Default::default() - }; - Ok(ObjectExpression { - start, - end, - properties, - non_code_meta, - digest: None, - }) -} - -/// Parse the % symbol, used to substitute a curried argument from a |> (pipe). -fn pipe_sub(i: TokenSlice) -> PResult { - any.try_map(|token: Token| { - if matches!(token.token_type, TokenType::Operator) && token.value == PIPE_SUBSTITUTION_OPERATOR { - Ok(PipeSubstitution { - start: token.start, - end: token.end, - digest: None, - }) - } else { - Err(KclError::Syntax(KclErrorDetails { - source_ranges: token.as_source_ranges(), - message: format!( - "expected a pipe substitution symbol (%) but found {}", - token.value.as_str() - ), - })) - } - }) - .context(expected("the substitution symbol, %")) - .parse_next(i) -} - -fn else_if(i: TokenSlice) -> PResult { - let start = any - .try_map(|token: Token| { - if matches!(token.token_type, TokenType::Keyword) && token.value == "else" { - Ok(token.start) - } else { - Err(KclError::Syntax(KclErrorDetails { - source_ranges: token.as_source_ranges(), - message: format!("{} is not 'else'", token.value.as_str()), - })) - } - }) - .context(expected("the 'else' keyword")) - .parse_next(i)?; - ignore_whitespace(i); - let _if = any - .try_map(|token: Token| { - if matches!(token.token_type, TokenType::Keyword) && token.value == "if" { - Ok(token.start) - } else { - Err(KclError::Syntax(KclErrorDetails { - source_ranges: token.as_source_ranges(), - message: format!("{} is not 'if'", token.value.as_str()), - })) - } - }) - .context(expected("the 'if' keyword")) - .parse_next(i)?; - ignore_whitespace(i); - let cond = expression(i)?; - ignore_whitespace(i); - let _ = open_brace(i)?; - let then_val = program - .verify(|block| block.ends_with_expr()) - .parse_next(i) - .map(Box::new)?; - ignore_whitespace(i); - let end = close_brace(i)?.end; - ignore_whitespace(i); - Ok(ElseIf { - start, - end, - cond, - then_val, - digest: Default::default(), - }) -} - -fn if_expr(i: TokenSlice) -> PResult { - let start = any - .try_map(|token: Token| { - if matches!(token.token_type, TokenType::Keyword) && token.value == "if" { - Ok(token.start) - } else { - Err(KclError::Syntax(KclErrorDetails { - source_ranges: token.as_source_ranges(), - message: format!("{} is not 'if'", token.value.as_str()), - })) - } - }) - .context(expected("the 'if' keyword")) - .parse_next(i)?; - let _ = whitespace(i)?; - let cond = expression(i).map(Box::new)?; - let _ = whitespace(i)?; - let _ = open_brace(i)?; - ignore_whitespace(i); - let then_val = program - .verify(|block| block.ends_with_expr()) - .parse_next(i) - .map_err(|e| e.cut()) - .map(Box::new)?; - ignore_whitespace(i); - let _ = close_brace(i)?; - ignore_whitespace(i); - let else_ifs = repeat(0.., else_if).parse_next(i)?; - - ignore_whitespace(i); - let _ = any - .try_map(|token: Token| { - if matches!(token.token_type, TokenType::Keyword) && token.value == "else" { - Ok(token.start) - } else { - Err(KclError::Syntax(KclErrorDetails { - source_ranges: token.as_source_ranges(), - message: format!("{} is not 'else'", token.value.as_str()), - })) - } - }) - .context(expected("the 'else' keyword")) - .parse_next(i)?; - ignore_whitespace(i); - let _ = open_brace(i)?; - ignore_whitespace(i); - - let final_else = program - .verify(|block| block.ends_with_expr()) - .parse_next(i) - .map_err(|e| e.cut()) - .map(Box::new)?; - ignore_whitespace(i); - let end = close_brace(i)?.end; - Ok(IfExpression { - start, - end, - cond, - then_val, - else_ifs, - final_else, - digest: Default::default(), - }) -} - -// Looks like -// (arg0, arg1) => { -// const x = arg0 + arg1; -// return x -// } -fn function_expression(i: TokenSlice) -> PResult { - let start = open_paren(i)?.start; - let params = parameters(i)?; - close_paren(i)?; - ignore_whitespace(i); - big_arrow(i)?; - ignore_whitespace(i); - // Optional type arguments. - let return_type = opt(argument_type).parse_next(i)?; - ignore_whitespace(i); - open_brace(i)?; - let body = function_body(i)?; - let end = close_brace(i)?.end; - Ok(FunctionExpression { - start, - end, - params, - body, - return_type, - digest: None, - }) -} - -/// E.g. `person.name` -fn member_expression_dot(i: TokenSlice) -> PResult<(LiteralIdentifier, usize, bool)> { - period.parse_next(i)?; - let property = alt(( - sketch_keyword.map(Box::new).map(LiteralIdentifier::Identifier), - identifier.map(Box::new).map(LiteralIdentifier::Identifier), - )) - .parse_next(i)?; - let end = property.end(); - Ok((property, end, false)) -} - -/// E.g. `people[0]` or `people[i]` or `people['adam']` -fn member_expression_subscript(i: TokenSlice) -> PResult<(LiteralIdentifier, usize, bool)> { - let _ = open_bracket.parse_next(i)?; - let property = alt(( - sketch_keyword.map(Box::new).map(LiteralIdentifier::Identifier), - literal.map(Box::new).map(LiteralIdentifier::Literal), - identifier.map(Box::new).map(LiteralIdentifier::Identifier), - )) - .parse_next(i)?; - - let end = close_bracket.parse_next(i)?.end; - let computed = matches!(property, LiteralIdentifier::Identifier(_)); - Ok((property, end, computed)) -} - -/// Get a property of an object, or an index of an array, or a member of a collection. -/// Can be arbitrarily nested, e.g. `people[i]['adam'].age`. -fn member_expression(i: TokenSlice) -> PResult { - // This is an identifier, followed by a sequence of members (aka properties) - // First, the identifier. - let id = identifier.context(expected("the identifier of the object whose property you're trying to access, e.g. in 'shape.size.width', 'shape' is the identifier")).parse_next(i)?; - // Now a sequence of members. - let member = alt((member_expression_dot, member_expression_subscript)).context(expected("a member/property, e.g. size.x and size['height'] and size[0] are all different ways to access a member/property of 'size'")); - let mut members: Vec<_> = repeat(1.., member) - .context(expected("a sequence of at least one members/properties")) - .parse_next(i)?; - - // Process the first member. - // It's safe to call remove(0), because the vec is created from repeat(1..), - // which is guaranteed to have >=1 elements. - let (property, end, computed) = members.remove(0); - let start = id.start; - let initial_member_expression = MemberExpression { - start, - end, - object: MemberObject::Identifier(Box::new(id)), - computed, - property, - digest: None, - }; - - // Each remaining member wraps the current member expression inside another member expression. - Ok(members - .into_iter() - // Take the accumulated member expression from the previous iteration, - // and use it as the `object` of a new, bigger member expression. - .fold(initial_member_expression, |accumulated, (property, end, computed)| { - MemberExpression { - start, - end, - object: MemberObject::MemberExpression(Box::new(accumulated)), - computed, - property, - digest: None, - } - })) -} - -/// Find a noncode node which occurs just after a body item, -/// such that if the noncode item is a comment, it might be an inline comment. -fn noncode_just_after_code(i: TokenSlice) -> PResult { - let ws = opt(whitespace).parse_next(i)?; - - // What is the preceding whitespace like? - let (has_newline, has_empty_line) = if let Some(ref ws) = ws { - ( - ws.iter().any(|token| token.value.contains('\n')), - ws.iter().any(|token| count_in('\n', &token.value) >= 2), - ) - } else { - (false, false) - }; - - // Look for a non-code node (e.g. comment) - let nc = non_code_node_no_leading_whitespace - .map(|nc| { - if has_empty_line { - // There's an empty line between the body item and the comment, - // This means the comment is a NewLineBlockComment! - let value = match nc.value { - NonCodeValue::Shebang { value } => NonCodeValue::Shebang { value }, - // Change block comments to inline, as discussed above - NonCodeValue::BlockComment { value, style } => NonCodeValue::NewLineBlockComment { value, style }, - // Other variants don't need to change. - x @ NonCodeValue::InlineComment { .. } => x, - x @ NonCodeValue::NewLineBlockComment { .. } => x, - x @ NonCodeValue::NewLine => x, - }; - NonCodeNode { - value, - start: nc.start.saturating_sub(1), - ..nc - } - } else if has_newline { - // Nothing has to change, a single newline does not need preserving. - nc - } else { - // There's no newline between the body item and comment, - // so if this is a comment, it must be inline with code. - let value = match nc.value { - NonCodeValue::Shebang { value } => NonCodeValue::Shebang { value }, - // Change block comments to inline, as discussed above - NonCodeValue::BlockComment { value, style } => NonCodeValue::InlineComment { value, style }, - // Other variants don't need to change. - x @ NonCodeValue::InlineComment { .. } => x, - x @ NonCodeValue::NewLineBlockComment { .. } => x, - x @ NonCodeValue::NewLine => x, - }; - NonCodeNode { value, ..nc } - } - }) - .map(|nc| NonCodeNode { - start: nc.start.saturating_sub(1), - ..nc - }) - .parse_next(i)?; - Ok(nc) -} - -// the large_enum_variant lint below introduces a LOT of code complexity in a -// match!() that's super clean that isn't worth it for the marginal space -// savings. revisit if that's a lie. - -#[derive(Debug)] -#[allow(clippy::large_enum_variant)] -enum WithinFunction { - BodyItem((BodyItem, Option)), - NonCode(NonCodeNode), -} - -fn body_items_within_function(i: TokenSlice) -> PResult { - // Any of the body item variants, each of which can optionally be followed by a comment. - // If there is a comment, it may be preceded by whitespace. - let item = dispatch! {peek(any); - token if token.declaration_keyword().is_some() || token.visibility_keyword().is_some() => - (declaration.map(BodyItem::VariableDeclaration), opt(noncode_just_after_code)).map(WithinFunction::BodyItem), - token if token.value == "import" && matches!(token.token_type, TokenType::Keyword) => - (import_stmt.map(BodyItem::ImportStatement), opt(noncode_just_after_code)).map(WithinFunction::BodyItem), - Token { ref value, .. } if value == "return" => - (return_stmt.map(BodyItem::ReturnStatement), opt(noncode_just_after_code)).map(WithinFunction::BodyItem), - token if !token.is_code_token() => { - non_code_node.map(WithinFunction::NonCode) - }, - _ => - alt(( - ( - declaration.map(BodyItem::VariableDeclaration), - opt(noncode_just_after_code) - ).map(WithinFunction::BodyItem), - ( - expression_stmt.map(BodyItem::ExpressionStatement), - opt(noncode_just_after_code) - ).map(WithinFunction::BodyItem), - )) - } - .context(expected("a function body items (functions are made up of variable declarations, expressions, and return statements, each of those is a possible body item")) - .parse_next(i)?; - Ok(item) -} - -/// Parse the body of a user-defined function. -pub fn function_body(i: TokenSlice) -> PResult { - let leading_whitespace_start = alt(( - peek(non_code_node).map(|_| None), - // Subtract 1 from `t.start` to match behaviour of the old parser. - // Consider removing the -1 in the future because I think it's inaccurate, but for now, - // I prefer to match the old parser exactly when I can. - opt(whitespace).map(|tok| tok.and_then(|t| t.first().map(|t| t.start.saturating_sub(1)))), - )) - .parse_next(i)?; - - let mut things_within_body = Vec::new(); - // Parse the first item - things_within_body.push(body_items_within_function.parse_next(i)?); - - // This loop is complicated! I'm sorry! - // It's almost identical to the loop in `winnow::combinator::separated1`, - // see , - // where the "main" parser is body_items_within_function and the `sep` (separator) parser is - // ws_with_newline. - // - // Except for one thing. - // - // In this case, one of the body items being matched could be a whitespace with a newline, - // and that could _also_ be the separator. - // - // So, if both the main parser and the `sep` parser within `separated1` try to match the same - // token, the main parser will consume it and then the `sep` parser will fail. - // - // The solution is that this parser should check if the last matched body item was an empty line, - // and if so, then ignore the separator parser for the current iteration. - loop { - let last_match_was_empty_line = matches!( - things_within_body.last(), - Some(WithinFunction::NonCode(NonCodeNode { - value: NonCodeValue::NewLine, - .. - })) - ); - - use winnow::stream::Stream; - - let start = i.checkpoint(); - let len = i.eof_offset(); - - let found_ws = ws_with_newline.parse_next(i); - - // The separator whitespace might be important: - // if it has an empty line, it should be considered a noncode token, because the user - // deliberately put an empty line there. We should track this and preserve it. - if let Ok(ref ws_token) = found_ws { - if ws_token.value.contains("\n\n") { - things_within_body.push(WithinFunction::NonCode(NonCodeNode { - start: ws_token.start, - end: ws_token.end, - value: NonCodeValue::NewLine, - digest: None, - })); - } - } - - match (found_ws, last_match_was_empty_line) { - (Ok(_), _) | (_, true) => { - // Infinite loop check: this loop must always consume tokens from the input. - // That can either happen through the `sep` parser (i.e. ws_with_newline) or through - // the main parser (body_items_within_function). - // LHS of this checks fht - if i.eof_offset() == len && !last_match_was_empty_line { - use winnow::error::ParserError; - return Err(ErrMode::assert(i, "sep parsers must always consume")); - } - - match body_items_within_function.parse_next(i) { - Err(ErrMode::Backtrack(_)) => { - i.reset(&start); - break; - } - Err(e) => return Err(e), - Ok(o) => { - things_within_body.push(o); - } - } - } - (Err(ErrMode::Backtrack(_)), _) => { - i.reset(&start); - break; - } - (Err(e), _) => return Err(e), - } - } - - let mut body = Vec::new(); - let mut non_code_meta = NonCodeMeta::default(); - let mut end = 0; - let mut start = leading_whitespace_start; - for thing_in_body in things_within_body { - match thing_in_body { - WithinFunction::BodyItem((b, maybe_noncode)) => { - if start.is_none() { - start = Some(b.start()); - } - end = b.end(); - body.push(b); - if let Some(nc) = maybe_noncode { - end = nc.end; - non_code_meta.insert(body.len() - 1, nc); - } - } - WithinFunction::NonCode(nc) => { - if start.is_none() { - start = Some(nc.start); - } - end = nc.end; - if body.is_empty() { - non_code_meta.start.push(nc); - } else { - non_code_meta.insert(body.len() - 1, nc); - } - } - } - } - let start = start.expect( - "the `things_within_body` vec should have looped at least once, and each loop overwrites `start` if it is None", - ); - // Safe to unwrap `body.first()` because `body` is `separated1` therefore guaranteed - // to have len >= 1. - let end_ws = opt(whitespace) - .parse_next(i)? - .and_then(|ws| ws.first().map(|tok| tok.end)); - if let Some(end_ws) = end_ws { - end = end.max(end_ws); - } - end += 1; - Ok(Program { - start, - end, - body, - non_code_meta, - digest: None, - }) -} - -fn import_stmt(i: TokenSlice) -> PResult> { - let import_token = any - .try_map(|token: Token| { - if matches!(token.token_type, TokenType::Keyword) && token.value == "import" { - Ok(token) - } else { - Err(KclError::Syntax(KclErrorDetails { - source_ranges: token.as_source_ranges(), - message: format!("{} is not the 'import' keyword", token.value.as_str()), - })) - } - }) - .context(expected("the 'import' keyword")) - .parse_next(i)?; - let start = import_token.start; - - require_whitespace(i)?; - - let items = separated(1.., import_item, comma_sep) - .parse_next(i) - .map_err(|e| e.cut())?; - - require_whitespace(i)?; - - any.try_map(|token: Token| { - if matches!(token.token_type, TokenType::Keyword | TokenType::Word) && token.value == "from" { - Ok(()) - } else { - Err(KclError::Syntax(KclErrorDetails { - source_ranges: token.as_source_ranges(), - message: format!("{} is not the 'from' keyword", token.value.as_str()), - })) - } - }) - .context(expected("the 'from' keyword")) - .parse_next(i) - .map_err(|e| e.cut())?; - - require_whitespace(i)?; - - let path = string_literal(i)?; - let end = path.end(); - let path_string = match path.value { - LiteralValue::String(s) => s, - _ => unreachable!(), - }; - if path_string - .chars() - .any(|c| !c.is_ascii_alphanumeric() && c != '_' && c != '-' && c != '.') - { - return Err(ErrMode::Cut( - KclError::Syntax(KclErrorDetails { - source_ranges: vec![SourceRange::new(path.start, path.end)], - message: "import path may only contain alphanumeric characters, underscore, hyphen, and period. Files in other directories are not yet supported.".to_owned(), - }) - .into(), - )); - } - Ok(Box::new(ImportStatement { - items, - path: path_string, - raw_path: path.raw, - start, - end, - digest: None, - })) -} - -fn import_item(i: TokenSlice) -> PResult { - let name = identifier.context(expected("an identifier to import")).parse_next(i)?; - let start = name.start; - let alias = opt(preceded( - (whitespace, import_as_keyword, whitespace), - identifier.context(expected("an identifier to alias the import")), - )) - .parse_next(i)?; - let end = if let Some(ref alias) = alias { - alias.end() - } else { - name.end() - }; - Ok(ImportItem { - name, - alias, - start, - end, - digest: None, - }) -} - -fn import_as_keyword(i: TokenSlice) -> PResult { - any.try_map(|token: Token| { - if matches!(token.token_type, TokenType::Keyword | TokenType::Word) && token.value == "as" { - Ok(token) - } else { - Err(KclError::Syntax(KclErrorDetails { - source_ranges: token.as_source_ranges(), - message: format!("{} is not the 'as' keyword", token.value.as_str()), - })) - } - }) - .context(expected("the 'as' keyword")) - .parse_next(i) -} - -/// Parse a return statement of a user-defined function, e.g. `return x`. -pub fn return_stmt(i: TokenSlice) -> PResult { - let start = any - .try_map(|token: Token| { - if matches!(token.token_type, TokenType::Keyword) && token.value == "return" { - Ok(token.start) - } else { - Err(KclError::Syntax(KclErrorDetails { - source_ranges: token.as_source_ranges(), - message: format!("{} is not a return keyword", token.value.as_str()), - })) - } - }) - .context(expected( - "the 'return' keyword, which ends your function (and becomes this function's value when it's called)", - )) - .parse_next(i)?; - require_whitespace(i)?; - let argument = expression(i)?; - Ok(ReturnStatement { - start, - end: argument.end(), - argument, - digest: None, - }) -} - -/// Parse a KCL expression. -fn expression(i: TokenSlice) -> PResult { - alt(( - pipe_expression.map(Box::new).map(Expr::PipeExpression), - expression_but_not_pipe, - )) - .context(expected("a KCL value")) - .parse_next(i) -} - -fn expression_but_not_pipe(i: TokenSlice) -> PResult { - alt(( - binary_expression.map(Box::new).map(Expr::BinaryExpression), - unary_expression.map(Box::new).map(Expr::UnaryExpression), - expr_allowed_in_pipe_expr, - )) - .context(expected("a KCL value")) - .parse_next(i) -} - -fn unnecessarily_bracketed(i: TokenSlice) -> PResult { - delimited( - terminated(open_paren, opt(whitespace)), - expression, - preceded(opt(whitespace), close_paren), - ) - .parse_next(i) -} - -fn expr_allowed_in_pipe_expr(i: TokenSlice) -> PResult { - alt(( - member_expression.map(Box::new).map(Expr::MemberExpression), - bool_value.map(Box::new).map(Expr::Literal), - tag.map(Box::new).map(Expr::TagDeclarator), - literal.map(Box::new).map(Expr::Literal), - fn_call.map(Box::new).map(Expr::CallExpression), - identifier.map(Box::new).map(Expr::Identifier), - array, - object.map(Box::new).map(Expr::ObjectExpression), - pipe_sub.map(Box::new).map(Expr::PipeSubstitution), - function_expression.map(Box::new).map(Expr::FunctionExpression), - if_expr.map(Box::new).map(Expr::IfExpression), - unnecessarily_bracketed, - )) - .context(expected("a KCL expression (but not a pipe expression)")) - .parse_next(i) -} - -fn possible_operands(i: TokenSlice) -> PResult { - alt(( - unary_expression.map(Box::new).map(Expr::UnaryExpression), - bool_value.map(Box::new).map(Expr::Literal), - member_expression.map(Box::new).map(Expr::MemberExpression), - literal.map(Box::new).map(Expr::Literal), - fn_call.map(Box::new).map(Expr::CallExpression), - identifier.map(Box::new).map(Expr::Identifier), - binary_expr_in_parens.map(Box::new).map(Expr::BinaryExpression), - unnecessarily_bracketed, - )) - .context(expected( - "a KCL value which can be used as an argument/operand to an operator", - )) - .parse_next(i) -} - -/// Parse an item visibility specifier, e.g. export. -fn item_visibility(i: TokenSlice) -> PResult<(ItemVisibility, Token)> { - any.verify_map(|token: Token| { - if token.token_type == TokenType::Keyword && token.value == "export" { - Some((ItemVisibility::Export, token)) - } else { - None - } - }) - .context(expected("item visibility, e.g. 'export'")) - .parse_next(i) -} - -fn declaration_keyword(i: TokenSlice) -> PResult<(VariableKind, Token)> { - let res = any - .verify_map(|token: Token| token.declaration_keyword().map(|kw| (kw, token))) - .parse_next(i)?; - Ok(res) -} - -/// Parse a variable/constant declaration. -fn declaration(i: TokenSlice) -> PResult> { - let (visibility, visibility_token) = opt(terminated(item_visibility, whitespace)) - .parse_next(i)? - .map_or((ItemVisibility::Default, None), |pair| (pair.0, Some(pair.1))); - let decl_token = opt(declaration_keyword).parse_next(i)?; - if decl_token.is_some() { - // If there was a declaration keyword like `fn`, then it must be followed by some spaces. - // `fnx = ...` is not valid! - require_whitespace(i)?; - } - - let id = binding_name - .context(expected( - "an identifier, which becomes name you're binding the value to", - )) - .parse_next(i)?; - let (kind, mut start, dec_end) = if let Some((kind, token)) = &decl_token { - (*kind, token.start, token.end) - } else { - (VariableKind::Const, id.start(), id.end()) - }; - if let Some(token) = visibility_token { - start = token.start; - } - - ignore_whitespace(i); - equals(i)?; - // After this point, the parser is DEFINITELY parsing a variable declaration, because - // `fn`, `let`, `const` etc are all unambiguous. If you've parsed one of those tokens -- - // and we certainly have because `kind` was parsed above -- then the following tokens - // MUST continue the variable declaration, otherwise the program is invalid. - // - // This means, from here until this function returns, any errors should be ErrMode::Cut, - // not ErrMode::Backtrack. Because the parser is definitely parsing a variable declaration. - // If there's an error, there's no point backtracking -- instead the parser should fail. - ignore_whitespace(i); - - let val = if kind == VariableKind::Fn { - function_expression - .map(Box::new) - .map(Expr::FunctionExpression) - .context(expected("a KCL function expression, like () => { return 1 }")) - .parse_next(i) - } else { - expression - .try_map(|val| { - // Function bodies can be used if and only if declaring a function. - // Check the 'if' direction: - if matches!(val, Expr::FunctionExpression(_)) { - return Err(KclError::Syntax(KclErrorDetails { - source_ranges: vec![SourceRange([start, dec_end])], - message: format!("Expected a `fn` variable kind, found: `{}`", kind), - })); - } - Ok(val) - }) - .context(expected("a KCL value, which is being bound to a variable")) - .parse_next(i) - } - .map_err(|e| e.cut())?; - - let end = val.end(); - Ok(Box::new(VariableDeclaration { - start, - end, - declarations: vec![VariableDeclarator { - start: id.start, - end, - id, - init: val, - digest: None, - }], - visibility, - kind, - digest: None, - })) -} - -impl TryFrom for Identifier { - type Error = KclError; - - fn try_from(token: Token) -> Result { - if token.token_type == TokenType::Word { - Ok(Identifier { - start: token.start, - end: token.end, - name: token.value, - digest: None, - }) - } else { - Err(KclError::Syntax(KclErrorDetails { - source_ranges: token.as_source_ranges(), - message: format!( - "Cannot assign a variable to a reserved keyword: {}", - token.value.as_str() - ), - })) - } - } -} - -/// Parse a KCL identifier (name of a constant/variable/function) -fn identifier(i: TokenSlice) -> PResult { - any.try_map(Identifier::try_from) - .context(expected("an identifier, e.g. 'width' or 'myPart'")) - .parse_next(i) -} - -fn sketch_keyword(i: TokenSlice) -> PResult { - any.try_map(|token: Token| { - if token.token_type == TokenType::Type && token.value == "sketch" { - Ok(Identifier { - start: token.start, - end: token.end, - name: token.value, - digest: None, - }) - } else { - Err(KclError::Syntax(KclErrorDetails { - source_ranges: token.as_source_ranges(), - message: format!("Expected 'sketch' keyword, but found {}", token.value.as_str()), - })) - } - }) - .context(expected("the 'sketch' keyword")) - .parse_next(i) -} - -impl TryFrom for TagDeclarator { - type Error = KclError; - - fn try_from(token: Token) -> Result { - if token.token_type == TokenType::Word { - Ok(TagDeclarator { - // We subtract 1 from the start because the tag starts with a `$`. - start: token.start - 1, - end: token.end, - name: token.value, - digest: None, - }) - } else { - Err(KclError::Syntax(KclErrorDetails { - source_ranges: token.as_source_ranges(), - message: format!("Cannot assign a tag to a reserved keyword: {}", token.value.as_str()), - })) - } - } -} - -impl TagDeclarator { - fn into_valid_binding_name(self) -> Result { - // Make sure they are not assigning a variable to a stdlib function. - if crate::std::name_in_stdlib(&self.name) { - return Err(KclError::Syntax(KclErrorDetails { - source_ranges: vec![SourceRange([self.start, self.end])], - message: format!("Cannot assign a tag to a reserved keyword: {}", self.name), - })); - } - Ok(self) - } -} - -/// Parse a Kcl tag that starts with a `$`. -fn tag(i: TokenSlice) -> PResult { - dollar.parse_next(i)?; - any.try_map(TagDeclarator::try_from) - .context(expected("a tag, e.g. '$seg01' or '$line01'")) - .parse_next(i) -} - -/// Helper function. Matches any number of whitespace tokens and ignores them. -fn ignore_whitespace(i: TokenSlice) { - let _: PResult<()> = repeat(0.., whitespace).parse_next(i); -} - -// A helper function to ignore a trailing comma. -fn ignore_trailing_comma(i: TokenSlice) { - let _ = opt(comma).parse_next(i); -} - -/// Matches at least 1 whitespace. -fn require_whitespace(i: TokenSlice) -> PResult<()> { - repeat(1.., whitespace).parse_next(i) -} - -fn unary_expression(i: TokenSlice) -> PResult { - const EXPECTED: &str = "expected a unary operator (like '-', the negative-numeric operator),"; - let (operator, op_token) = any - .try_map(|token: Token| match token.token_type { - TokenType::Operator if token.value == "-" => Ok((UnaryOperator::Neg, token)), - TokenType::Operator => Err(KclError::Syntax(KclErrorDetails { - source_ranges: token.as_source_ranges(), - message: format!("{EXPECTED} but found {} which is an operator, but not a unary one (unary operators apply to just a single operand, your operator applies to two or more operands)", token.value.as_str(),), - })), - TokenType::Bang => Ok((UnaryOperator::Not, token)), - other => Err(KclError::Syntax(KclErrorDetails { source_ranges: token.as_source_ranges(), message: format!("{EXPECTED} but found {} which is {}", token.value.as_str(), other,) })), - }) - .context(expected("a unary expression, e.g. -x or -3")) - .parse_next(i)?; - let argument = operand.parse_next(i)?; - Ok(UnaryExpression { - start: op_token.start, - end: argument.end(), - operator, - argument, - digest: None, - }) -} - -/// Consume tokens that make up a binary expression, but don't actually return them. -/// Why not? -/// Because this is designed to be used with .take() within the `binary_expression` parser. -fn binary_expression_tokens(i: TokenSlice) -> PResult> { - let first = operand.parse_next(i).map(BinaryExpressionToken::from)?; - let remaining: Vec<_> = repeat( - 1.., - ( - preceded(opt(whitespace), binary_operator).map(BinaryExpressionToken::from), - preceded(opt(whitespace), operand).map(BinaryExpressionToken::from), - ), - ) - .context(expected( - "one or more binary operators (like + or -) and operands for them, e.g. 1 + 2 - 3", - )) - .parse_next(i)?; - let mut out = Vec::with_capacity(1 + 2 * remaining.len()); - out.push(first); - out.extend(remaining.into_iter().flat_map(|(a, b)| [a, b])); - Ok(out) -} - -/// Parse an infix binary expression. -fn binary_expression(i: TokenSlice) -> PResult { - // Find the slice of tokens which makes up the binary expression - let tokens = binary_expression_tokens.parse_next(i)?; - - // Pass the token slice into the specialized math parser, for things like - // precedence and converting infix operations to an AST. - let expr = super::math::parse(tokens).map_err(|e| ErrMode::Backtrack(e.into()))?; - Ok(expr) -} - -fn binary_expr_in_parens(i: TokenSlice) -> PResult { - let span_with_brackets = bracketed_section.take().parse_next(i)?; - let n = span_with_brackets.len(); - let mut span_no_brackets = &span_with_brackets[1..n - 1]; - let expr = binary_expression.parse_next(&mut span_no_brackets)?; - Ok(expr) -} - -/// Match a starting bracket, then match to the corresponding end bracket. -/// Return the count of how many tokens are in that span -/// (not including the bracket tokens). -fn bracketed_section(i: TokenSlice) -> PResult { - // Find the start of this bracketed expression. - let _ = open_paren.parse_next(i)?; - let mut opened_braces = 1usize; - let mut tokens_examined = 0; - while opened_braces > 0 { - let tok = any.parse_next(i)?; - tokens_examined += 1; - if matches!(tok.token_type, TokenType::Brace) { - if tok.value == "(" { - opened_braces += 1; - } else if tok.value == ")" { - opened_braces -= 1; - } - } - } - Ok(tokens_examined) -} - -/// Parse a KCL expression statement. -fn expression_stmt(i: TokenSlice) -> PResult { - let val = expression - .context(expected( - "an expression (i.e. a value, or an algorithm for calculating one), e.g. 'x + y' or '3' or 'width * 2'", - )) - .parse_next(i)?; - Ok(ExpressionStatement { - start: val.start(), - end: val.end(), - expression: val, - digest: None, - }) -} - -/// Parse the given brace symbol. -fn some_brace(symbol: &'static str, i: TokenSlice) -> PResult { - one_of((TokenType::Brace, symbol)) - .context(expected(symbol)) - .parse_next(i) -} - -/// Parse a => operator. -fn big_arrow(i: TokenSlice) -> PResult { - one_of((TokenType::Operator, "=>")) - .context(expected("the => symbol, used for declaring functions")) - .parse_next(i) -} -/// Parse a |> operator. -fn pipe_operator(i: TokenSlice) -> PResult { - one_of((TokenType::Operator, PIPE_OPERATOR)) - .context(expected( - "the |> operator, used for 'piping' one function's output into another function's input", - )) - .parse_next(i) -} - -fn ws_with_newline(i: TokenSlice) -> PResult { - one_of(TokenType::Whitespace) - .verify(|token: &Token| token.value.contains('\n')) - .context(expected("a newline, possibly with whitespace")) - .parse_next(i) -} - -/// ( -fn open_paren(i: TokenSlice) -> PResult { - some_brace("(", i) -} - -/// ) -fn close_paren(i: TokenSlice) -> PResult { - some_brace(")", i) -} - -/// [ -fn open_bracket(i: TokenSlice) -> PResult { - some_brace("[", i) -} - -/// ] -fn close_bracket(i: TokenSlice) -> PResult { - some_brace("]", i) -} - -/// { -fn open_brace(i: TokenSlice) -> PResult { - some_brace("{", i) -} - -/// } -fn close_brace(i: TokenSlice) -> PResult { - some_brace("}", i) -} - -fn comma(i: TokenSlice) -> PResult<()> { - TokenType::Comma.parse_from(i)?; - Ok(()) -} - -fn hash(i: TokenSlice) -> PResult<()> { - TokenType::Hash.parse_from(i)?; - Ok(()) -} - -fn bang(i: TokenSlice) -> PResult<()> { - TokenType::Bang.parse_from(i)?; - Ok(()) -} - -fn dollar(i: TokenSlice) -> PResult<()> { - TokenType::Dollar.parse_from(i)?; - Ok(()) -} - -fn period(i: TokenSlice) -> PResult<()> { - TokenType::Period.parse_from(i)?; - Ok(()) -} - -fn double_period(i: TokenSlice) -> PResult { - any.try_map(|token: Token| { - if matches!(token.token_type, TokenType::DoublePeriod) { - Ok(token) - } else { - Err(KclError::Syntax(KclErrorDetails { - source_ranges: token.as_source_ranges(), - message: format!( - "expected a '..' (double period) found {} which is {}", - token.value.as_str(), - token.token_type - ), - })) - } - }) - .context(expected("the .. operator, used for array ranges like [0..10]")) - .parse_next(i) -} - -fn colon(i: TokenSlice) -> PResult<()> { - TokenType::Colon.parse_from(i)?; - Ok(()) -} - -fn question_mark(i: TokenSlice) -> PResult<()> { - TokenType::QuestionMark.parse_from(i)?; - Ok(()) -} - -/// Parse a comma, optionally followed by some whitespace. -fn comma_sep(i: TokenSlice) -> PResult<()> { - (opt(whitespace), comma, opt(whitespace)) - .context(expected("a comma, optionally followed by whitespace")) - .parse_next(i)?; - Ok(()) -} - -/// Arguments are passed into a function. -fn arguments(i: TokenSlice) -> PResult> { - separated(0.., expression, comma_sep) - .context(expected("function arguments")) - .parse_next(i) -} - -/// A type of a function argument. -/// This can be: -/// - a primitive type, e.g. 'number' or 'string' or 'bool' -/// - an array type, e.g. 'number[]' or 'string[]' or 'bool[]' -/// - an object type, e.g. '{x: number, y: number}' or '{name: string, age: number}' -fn argument_type(i: TokenSlice) -> PResult { - let type_ = alt(( - // Object types - (open_brace, parameters, close_brace).map(|(_, params, _)| Ok(FnArgType::Object { properties: params })), - // Array types - (one_of(TokenType::Type), open_bracket, close_bracket).map(|(token, _, _)| { - FnArgPrimitive::from_str(&token.value) - .map(FnArgType::Array) - .map_err(|err| { - KclError::Syntax(KclErrorDetails { - source_ranges: token.as_source_ranges(), - message: format!("Invalid type: {}", err), - }) - }) - }), - // Primitive types - one_of(TokenType::Type).map(|token: Token| { - FnArgPrimitive::from_str(&token.value) - .map(FnArgType::Primitive) - .map_err(|err| { - KclError::Syntax(KclErrorDetails { - source_ranges: token.as_source_ranges(), - message: format!("Invalid type: {}", err), - }) - }) - }), - )) - .parse_next(i)? - .map_err(|e: KclError| ErrMode::Backtrack(ContextError::from(e)))?; - Ok(type_) -} - -fn parameter(i: TokenSlice) -> PResult<(Token, std::option::Option, bool)> { - let (arg_name, optional, _, _, _, type_) = ( - any.verify(|token: &Token| !matches!(token.token_type, TokenType::Brace) || token.value != ")"), - opt(question_mark), - opt(whitespace), - opt(colon), - opt(whitespace), - opt(argument_type), - ) - .parse_next(i)?; - Ok((arg_name, type_, optional.is_some())) -} - -/// Parameters are declared in a function signature, and used within a function. -fn parameters(i: TokenSlice) -> PResult> { - // Get all tokens until the next ), because that ends the parameter list. - let candidates: Vec<_> = separated(0.., parameter, comma_sep) - .context(expected("function parameters")) - .parse_next(i)?; - - // Make sure all those tokens are valid parameters. - let params: Vec = candidates - .into_iter() - .map(|(arg_name, type_, optional)| { - let identifier = Identifier::try_from(arg_name).and_then(Identifier::into_valid_binding_name)?; - - Ok(Parameter { - identifier, - type_, - optional, - digest: None, - }) - }) - .collect::>() - .map_err(|e: KclError| ErrMode::Backtrack(ContextError::from(e)))?; - - // Make sure optional parameters are last. - if let Err(e) = optional_after_required(¶ms) { - return Err(ErrMode::Cut(ContextError::from(e))); - } - Ok(params) -} - -fn optional_after_required(params: &[Parameter]) -> Result<(), KclError> { - let mut found_optional = false; - for p in params { - if p.optional { - found_optional = true; - } - if !p.optional && found_optional { - let e = KclError::Syntax(KclErrorDetails { - source_ranges: vec![(&p.identifier).into()], - message: "mandatory parameters must be declared before optional parameters".to_owned(), - }); - return Err(e); - } - } - Ok(()) -} - -impl Identifier { - fn into_valid_binding_name(self) -> Result { - // Make sure they are not assigning a variable to a stdlib function. - if crate::std::name_in_stdlib(&self.name) { - return Err(KclError::Syntax(KclErrorDetails { - source_ranges: vec![SourceRange([self.start, self.end])], - message: format!("Cannot assign a variable to a reserved keyword: {}", self.name), - })); - } - Ok(self) - } -} - -/// Introduce a new name, which binds some value. -fn binding_name(i: TokenSlice) -> PResult { - identifier - .context(expected("an identifier, which will be the name of some value")) - .try_map(Identifier::into_valid_binding_name) - .context(expected("an identifier, which will be the name of some value")) - .parse_next(i) -} - -fn fn_call(i: TokenSlice) -> PResult { - let fn_name = identifier(i)?; - opt(whitespace).parse_next(i)?; - let _ = terminated(open_paren, opt(whitespace)).parse_next(i)?; - let args = arguments(i)?; - if let Some(std_fn) = crate::std::get_stdlib_fn(&fn_name.name) { - // Type check the arguments. - for (i, spec_arg) in std_fn.args(false).iter().enumerate() { - let Some(arg) = &args.get(i) else { - // The executor checks the number of arguments, so we don't need to check it here. - continue; - }; - match spec_arg.type_.as_ref() { - "TagDeclarator" => match &arg { - Expr::Identifier(_) => { - // These are fine since we want someone to be able to map a variable to a tag declarator. - } - Expr::TagDeclarator(tag) => { - tag.clone() - .into_valid_binding_name() - .map_err(|e| ErrMode::Cut(ContextError::from(e)))?; - } - e => { - return Err(ErrMode::Cut( - KclError::Syntax(KclErrorDetails { - source_ranges: vec![SourceRange([arg.start(), arg.end()])], - message: format!("Expected a tag declarator like `$name`, found {:?}", e), - }) - .into(), - )); - } - }, - "TagIdentifier" => match &arg { - Expr::Identifier(_) => {} - Expr::MemberExpression(_) => {} - e => { - return Err(ErrMode::Cut( - KclError::Syntax(KclErrorDetails { - source_ranges: vec![SourceRange([arg.start(), arg.end()])], - message: format!("Expected a tag identifier like `tagName`, found {:?}", e), - }) - .into(), - )); - } - }, - _ => {} - } - } - } - let end = preceded(opt(whitespace), close_paren).parse_next(i)?.end; - Ok(CallExpression { - start: fn_name.start, - end, - callee: fn_name, - arguments: args, - optional: false, - digest: None, - }) -} - -#[cfg(test)] -mod tests { - use pretty_assertions::assert_eq; - - use super::*; - use crate::ast::types::{BodyItem, Expr, VariableKind}; - - #[test] - fn parse_args() { - for (i, (test, expected_len)) in [("someVar", 1), ("5, 3", 2), (r#""a""#, 1)].into_iter().enumerate() { - let tokens = crate::token::lexer(test).unwrap(); - let actual = match arguments.parse(&tokens) { - Ok(x) => x, - Err(e) => panic!("Failed test {i}, could not parse function arguments from \"{test}\": {e:?}"), - }; - assert_eq!(actual.len(), expected_len, "failed test {i}"); - } - } - - #[test] - fn weird_program_unclosed_paren() { - let tokens = crate::token::lexer("fn firstPrime=(").unwrap(); - let last = tokens.last().unwrap(); - let err: KclError = program.parse(&tokens).unwrap_err().into(); - assert_eq!(err.source_ranges(), last.as_source_ranges()); - // TODO: Better comment. This should explain the compiler expected ) because the user had started declaring the function's parameters. - // Part of https://github.com/KittyCAD/modeling-app/issues/784 - assert_eq!(err.message(), "Unexpected end of file. The compiler expected )"); - } - - #[test] - fn weird_program_just_a_pipe() { - let tokens = crate::token::lexer("|").unwrap(); - let err: KclError = program.parse(&tokens).unwrap_err().into(); - assert_eq!(err.source_ranges(), vec![SourceRange([0, 1])]); - assert_eq!(err.message(), "Unexpected token: |"); - } - - #[test] - fn parse_binary_expressions() { - for (i, test_program) in ["1 + 2 + 3"].into_iter().enumerate() { - let tokens = crate::token::lexer(test_program).unwrap(); - let mut slice = tokens.as_slice(); - let _actual = match binary_expression.parse_next(&mut slice) { - Ok(x) => x, - Err(e) => panic!("Failed test {i}, could not parse binary expressions from \"{test_program}\": {e:?}"), - }; - } - } - - #[test] - fn test_vardec_no_keyword() { - let tokens = crate::token::lexer("x = 4").unwrap(); - let vardec = declaration(&mut tokens.as_slice()).unwrap(); - assert_eq!(vardec.kind, VariableKind::Const); - let vardec = vardec.declarations.first().unwrap(); - assert_eq!(vardec.id.name, "x"); - let Expr::Literal(init_val) = &vardec.init else { - panic!("weird init value") - }; - assert_eq!(init_val.raw, "4"); - } - - #[test] - fn test_negative_operands() { - let tokens = crate::token::lexer("-leg2").unwrap(); - let _s = operand.parse_next(&mut tokens.as_slice()).unwrap(); - } - - #[test] - fn test_comments_in_function1() { - let test_program = r#"() => { - // comment 0 - const a = 1 - // comment 1 - const b = 2 - // comment 2 - return 1 - }"#; - let tokens = crate::token::lexer(test_program).unwrap(); - let mut slice = tokens.as_slice(); - let expr = function_expression.parse_next(&mut slice).unwrap(); - assert_eq!(expr.params, vec![]); - let comment_start = expr.body.non_code_meta.start.first().unwrap(); - let comment0 = &expr.body.non_code_meta.non_code_nodes.get(&0).unwrap()[0]; - let comment1 = &expr.body.non_code_meta.non_code_nodes.get(&1).unwrap()[0]; - assert_eq!(comment_start.value(), "comment 0"); - assert_eq!(comment0.value(), "comment 1"); - assert_eq!(comment1.value(), "comment 2"); - } - - #[test] - fn test_comments_in_function2() { - let test_program = r#"() => { - const yo = { a: { b: { c: '123' } } } /* block -comment */ -}"#; - let tokens = crate::token::lexer(test_program).unwrap(); - let mut slice = tokens.as_slice(); - let expr = function_expression.parse_next(&mut slice).unwrap(); - let comment0 = &expr.body.non_code_meta.non_code_nodes.get(&0).unwrap()[0]; - assert_eq!(comment0.value(), "block\ncomment"); - } - - #[test] - fn test_comment_at_start_of_program() { - let test_program = r#" -/* comment at start */ - -const mySk1 = startSketchAt([0, 0])"#; - let tokens = crate::token::lexer(test_program).unwrap(); - let program = program.parse(&tokens).unwrap(); - let mut starting_comments = program.non_code_meta.start; - assert_eq!(starting_comments.len(), 2); - let start0 = starting_comments.remove(0); - let start1 = starting_comments.remove(0); - assert_eq!( - start0.value, - NonCodeValue::BlockComment { - value: "comment at start".to_owned(), - style: CommentStyle::Block - } - ); - assert_eq!(start1.value, NonCodeValue::NewLine); - } - - #[test] - fn test_comment_in_pipe() { - let tokens = crate::token::lexer(r#"const x = y() |> /*hi*/ z(%)"#).unwrap(); - let mut body = program.parse(&tokens).unwrap().body; - let BodyItem::VariableDeclaration(mut item) = body.remove(0) else { - panic!("expected vardec"); - }; - let val = item.declarations.remove(0).init; - let Expr::PipeExpression(pipe) = val else { - panic!("expected pipe"); - }; - let mut noncode = pipe.non_code_meta; - assert_eq!(noncode.non_code_nodes.len(), 1); - let comment = noncode.non_code_nodes.remove(&0).unwrap().pop().unwrap(); - assert_eq!( - comment.value, - NonCodeValue::BlockComment { - value: "hi".to_owned(), - style: CommentStyle::Block - } - ); - } - - #[test] - fn test_whitespace_in_function() { - let test_program = r#"() => { - return sg - return sg - }"#; - let tokens = crate::token::lexer(test_program).unwrap(); - let mut slice = tokens.as_slice(); - let _expr = function_expression.parse_next(&mut slice).unwrap(); - } - - #[test] - fn test_empty_lines_in_function() { - let test_program = "() => { - - return 2 - }"; - let tokens = crate::token::lexer(test_program).unwrap(); - let mut slice = tokens.as_slice(); - let expr = function_expression.parse_next(&mut slice).unwrap(); - assert_eq!( - expr, - FunctionExpression { - start: 0, - end: 47, - params: Default::default(), - body: Program { - start: 7, - end: 47, - body: vec![BodyItem::ReturnStatement(ReturnStatement { - start: 25, - end: 33, - argument: Expr::Literal(Box::new(Literal { - start: 32, - end: 33, - value: 2u32.into(), - raw: "2".to_owned(), - digest: None, - })), - digest: None, - })], - non_code_meta: NonCodeMeta { - non_code_nodes: Default::default(), - start: vec![NonCodeNode { - start: 7, - end: 25, - value: NonCodeValue::NewLine, - digest: None - }], - digest: None, - }, - digest: None, - }, - return_type: None, - digest: None, - } - ); - } - - #[test] - fn inline_comment_pipe_expression() { - let test_input = r#"a('XY') - |> b(%) - |> c(%) // inline-comment - |> d(%)"#; - - let tokens = crate::token::lexer(test_input).unwrap(); - let mut slice = tokens.as_slice(); - let PipeExpression { - body, non_code_meta, .. - } = pipe_expression.parse_next(&mut slice).unwrap(); - assert_eq!(non_code_meta.non_code_nodes.len(), 1); - assert_eq!( - non_code_meta.non_code_nodes.get(&2).unwrap()[0].value, - NonCodeValue::InlineComment { - value: "inline-comment".to_owned(), - style: CommentStyle::Line - } - ); - assert_eq!(body.len(), 4); - } - - #[test] - fn many_comments() { - let test_program = r#"// this is a comment - const yo = { a: { b: { c: '123' } } } /* block - comment */ - - const key = 'c' - // this is also a comment - return things -"#; - - let tokens = crate::token::lexer(test_program).unwrap(); - let Program { non_code_meta, .. } = function_body.parse(&tokens).unwrap(); - assert_eq!( - vec![NonCodeNode { - start: 0, - end: 20, - value: NonCodeValue::BlockComment { - value: "this is a comment".to_owned(), - style: CommentStyle::Line - }, - digest: None, - }], - non_code_meta.start, - ); - assert_eq!( - Some(&vec![ - NonCodeNode { - start: 60, - end: 82, - value: NonCodeValue::InlineComment { - value: "block\n comment".to_owned(), - style: CommentStyle::Block - }, - digest: None, - }, - NonCodeNode { - start: 82, - end: 86, - value: NonCodeValue::NewLine, - digest: None, - }, - ]), - non_code_meta.non_code_nodes.get(&0), - ); - assert_eq!( - Some(&vec![NonCodeNode { - start: 103, - end: 129, - value: NonCodeValue::BlockComment { - value: "this is also a comment".to_owned(), - style: CommentStyle::Line - }, - digest: None, - }]), - non_code_meta.non_code_nodes.get(&1), - ); - } - - #[test] - fn inline_block_comments() { - let test_program = r#"const yo = 3 /* block - comment */ - return 1"#; - - let tokens = crate::token::lexer(test_program).unwrap(); - let actual = program.parse(&tokens).unwrap(); - assert_eq!(actual.non_code_meta.non_code_nodes.len(), 1); - assert_eq!( - actual.non_code_meta.non_code_nodes.get(&0).unwrap()[0].value, - NonCodeValue::InlineComment { - value: "block\n comment".to_owned(), - style: CommentStyle::Block - } - ); - } - - #[test] - fn test_bracketed_binary_expression() { - let input = "(2 - 3)"; - let tokens = crate::token::lexer(input).unwrap(); - let actual = match binary_expr_in_parens.parse(&tokens) { - Ok(x) => x, - Err(e) => panic!("{e:?}"), - }; - assert_eq!(actual.operator, BinaryOperator::Sub); - } - - #[test] - fn test_arg() { - for input in [ - "( sigmaAllow * width )", - "6 / ( sigmaAllow * width )", - "sqrt(distance * p * FOS * 6 / ( sigmaAllow * width ))", - ] { - let tokens = crate::token::lexer(input).unwrap(); - let _actual = match expression.parse(&tokens) { - Ok(x) => x, - Err(e) => panic!("{e:?}"), - }; - } - } - - #[test] - fn test_arithmetic() { - let input = "1 * (2 - 3)"; - let tokens = crate::token::lexer(input).unwrap(); - // The RHS should be a binary expression. - let actual = binary_expression.parse(&tokens).unwrap(); - assert_eq!(actual.operator, BinaryOperator::Mul); - let BinaryPart::BinaryExpression(rhs) = actual.right else { - panic!("Expected RHS to be another binary expression"); - }; - assert_eq!(rhs.operator, BinaryOperator::Sub); - assert_eq!( - rhs.right, - BinaryPart::Literal(Box::new(Literal { - start: 9, - end: 10, - value: 3u32.into(), - raw: "3".to_owned(), - digest: None, - })) - ); - } - - #[test] - fn assign_brackets() { - for (i, test_input) in [ - "const thickness_squared = (1 + 1)", - "const thickness_squared = ( 1 + 1)", - "const thickness_squared = (1 + 1 )", - "const thickness_squared = ( 1 + 1 )", - ] - .into_iter() - .enumerate() - { - let tokens = crate::token::lexer(test_input).unwrap(); - let mut actual = match declaration.parse(&tokens) { - Err(e) => panic!("Could not parse test {i}: {e:#?}"), - Ok(a) => a, - }; - let Expr::BinaryExpression(_expr) = actual.declarations.remove(0).init else { - panic!( - "Expected test {i} to be a binary expression but it wasn't, it was {:?}", - actual.declarations[0] - ); - }; - // TODO: check both sides are 1... probably not necessary but should do. - } - } - - #[test] - fn test_function_call() { - for (i, test_input) in ["const x = f(1)", "const x = f( 1 )"].into_iter().enumerate() { - let tokens = crate::token::lexer(test_input).unwrap(); - let _actual = match declaration.parse(&tokens) { - Err(e) => panic!("Could not parse test {i}: {e:#?}"), - Ok(a) => a, - }; - } - } - - #[test] - fn test_nested_arithmetic() { - let input = "1 * ((2 - 3) / 4)"; - let tokens = crate::token::lexer(input).unwrap(); - // The RHS should be a binary expression. - let outer = binary_expression.parse(&tokens).unwrap(); - assert_eq!(outer.operator, BinaryOperator::Mul); - let BinaryPart::BinaryExpression(middle) = outer.right else { - panic!("Expected RHS to be another binary expression"); - }; - - assert_eq!(middle.operator, BinaryOperator::Div); - let BinaryPart::BinaryExpression(inner) = middle.left else { - panic!("expected nested binary expression"); - }; - assert_eq!(inner.operator, BinaryOperator::Sub); - } - - #[test] - fn binary_expression_ignores_whitespace() { - let tests = ["1 - 2", "1- 2", "1 -2", "1-2"]; - for test in tests { - let tokens = crate::token::lexer(test).unwrap(); - let actual = binary_expression.parse(&tokens).unwrap(); - assert_eq!(actual.operator, BinaryOperator::Sub); - let BinaryPart::Literal(left) = actual.left else { - panic!("should be expression"); - }; - assert_eq!(left.value, 1u32.into()); - let BinaryPart::Literal(right) = actual.right else { - panic!("should be expression"); - }; - assert_eq!(right.value, 2u32.into()); - } - } - - #[test] - fn some_pipe_expr() { - let test_program = r#"x() - |> y(%) /* this is - a comment - spanning a few lines */ - |> z(%)"#; - let tokens = crate::token::lexer(test_program).unwrap(); - let actual = pipe_expression.parse(&tokens).unwrap(); - let n = actual.non_code_meta.non_code_nodes.len(); - assert_eq!(n, 1, "expected one comment in pipe expression but found {n}"); - let nc = &actual.non_code_meta.non_code_nodes.get(&1).unwrap()[0]; - assert!(nc.value().starts_with("this")); - assert!(nc.value().ends_with("lines")); - } - - #[test] - fn comments_in_pipe_expr() { - for (i, test_program) in [ - r#"y() |> /*hi*/ z(%)"#, - "1 |>/*hi*/ f(%)", - r#"y() |> /*hi*/ z(%)"#, - "1 /*hi*/ |> f(%)", - "1 - // Hi - |> f(%)", - "1 - /* Hi - there - */ - |> f(%)", - ] - .into_iter() - .enumerate() - { - let tokens = crate::token::lexer(test_program).unwrap(); - let actual = pipe_expression.parse(&tokens); - assert!(actual.is_ok(), "could not parse test {i}, '{test_program}'"); - let actual = actual.unwrap(); - let n = actual.non_code_meta.non_code_nodes.len(); - assert_eq!(n, 1, "expected one comment in pipe expression but found {n}",) - } - } - - #[test] - fn comments() { - for (i, (test_program, expected)) in [ - ( - "//hi", - NonCodeNode { - start: 0, - end: 4, - value: NonCodeValue::BlockComment { - value: "hi".to_owned(), - style: CommentStyle::Line, - }, - digest: None, - }, - ), - ( - "/*hello*/", - NonCodeNode { - start: 0, - end: 9, - value: NonCodeValue::BlockComment { - value: "hello".to_owned(), - style: CommentStyle::Block, - }, - digest: None, - }, - ), - ( - "/* hello */", - NonCodeNode { - start: 0, - end: 11, - value: NonCodeValue::BlockComment { - value: "hello".to_owned(), - style: CommentStyle::Block, - }, - digest: None, - }, - ), - ( - "/* \nhello */", - NonCodeNode { - start: 0, - end: 12, - value: NonCodeValue::BlockComment { - value: "hello".to_owned(), - style: CommentStyle::Block, - }, - digest: None, - }, - ), - ( - " - /* hello */", - NonCodeNode { - start: 0, - end: 29, - value: NonCodeValue::BlockComment { - value: "hello".to_owned(), - style: CommentStyle::Block, - }, - digest: None, - }, - ), - ( - // Empty line with trailing whitespace - " - - /* hello */", - NonCodeNode { - start: 0, - end: 32, - value: NonCodeValue::NewLineBlockComment { - value: "hello".to_owned(), - style: CommentStyle::Block, - }, - digest: None, - }, - ), - ( - // Empty line, no trailing whitespace - " - - /* hello */", - NonCodeNode { - start: 0, - end: 30, - value: NonCodeValue::NewLineBlockComment { - value: "hello".to_owned(), - style: CommentStyle::Block, - }, - digest: None, - }, - ), - ( - r#"/* block - comment */"#, - NonCodeNode { - start: 0, - end: 39, - value: NonCodeValue::BlockComment { - value: "block\n comment".to_owned(), - style: CommentStyle::Block, - }, - digest: None, - }, - ), - ] - .into_iter() - .enumerate() - { - let tokens = crate::token::lexer(test_program).unwrap(); - let actual = non_code_node.parse(&tokens); - assert!(actual.is_ok(), "could not parse test {i}: {actual:#?}"); - let actual = actual.unwrap(); - assert_eq!(actual, expected, "failed test {i}"); - } - } - - #[test] - fn recognize_invalid_params() { - let test_fn = "(let) => { return 1 }"; - let tokens = crate::token::lexer(test_fn).unwrap(); - let err = function_expression.parse(&tokens).unwrap_err().into_inner(); - let cause = err.cause.unwrap(); - // This is the token `let` - assert_eq!(cause.source_ranges(), vec![SourceRange([1, 4])]); - assert_eq!(cause.message(), "Cannot assign a variable to a reserved keyword: let"); - } - - #[test] - fn comment_in_string() { - let string_literal = r#"" - // a comment - ""#; - let tokens = crate::token::lexer(string_literal).unwrap(); - let parsed_literal = literal.parse(&tokens).unwrap(); - assert_eq!( - parsed_literal.value, - " - // a comment - " - .into() - ); - } - - #[test] - fn pipes_on_pipes_minimal() { - let test_program = r#"startSketchAt([0, 0]) - |> lineTo([0, -0], %) // MoveRelative - - "#; - let tokens = crate::token::lexer(test_program).unwrap(); - let mut slice = &tokens[..]; - let _actual = pipe_expression.parse_next(&mut slice).unwrap(); - assert_eq!(slice[0].token_type, TokenType::Whitespace); - } - - #[test] - fn test_pipes_on_pipes() { - let test_program = include_str!("../../../tests/executor/inputs/pipes_on_pipes.kcl"); - let tokens = crate::token::lexer(test_program).unwrap(); - let _actual = program.parse(&tokens).unwrap(); - } - - #[test] - fn test_cube() { - let test_program = include_str!("../../../tests/executor/inputs/cube.kcl"); - let tokens = crate::token::lexer(test_program).unwrap(); - match program.parse(&tokens) { - Ok(_) => {} - Err(e) => { - panic!("{e:#?}"); - } - } - } - - #[test] - fn test_parameter_list() { - let tests = [ - ("", vec![]), - ("a", vec!["a"]), - ("a, b", vec!["a", "b"]), - ("a,b", vec!["a", "b"]), - ]; - for (i, (input, expected)) in tests.into_iter().enumerate() { - let tokens = crate::token::lexer(input).unwrap(); - let actual = parameters.parse(&tokens); - assert!(actual.is_ok(), "could not parse test {i}"); - let actual_ids: Vec<_> = actual.unwrap().into_iter().map(|p| p.identifier.name).collect(); - assert_eq!(actual_ids, expected); - } - } - - #[test] - fn test_user_function() { - let input = "() => { - return 2 - }"; - - let tokens = crate::token::lexer(input).unwrap(); - let actual = function_expression.parse(&tokens); - assert!(actual.is_ok(), "could not parse test function"); - } - - #[test] - fn test_declaration() { - let tests = ["const myVar = 5", "const myVar=5", "const myVar =5", "const myVar= 5"]; - for test in tests { - // Run the original parser - let tokens = crate::token::lexer(test).unwrap(); - let mut expected_body = crate::parser::Parser::new(tokens.clone()).ast().unwrap().body; - assert_eq!(expected_body.len(), 1); - let BodyItem::VariableDeclaration(expected) = expected_body.pop().unwrap() else { - panic!("Expected variable declaration"); - }; - - // Run the second parser, check it matches the first parser. - let mut actual = declaration.parse(&tokens).unwrap(); - assert_eq!(expected, actual); - - // Inspect its output in more detail. - assert_eq!(actual.kind, VariableKind::Const); - assert_eq!(actual.start, 0); - assert_eq!(actual.declarations.len(), 1); - let decl = actual.declarations.pop().unwrap(); - assert_eq!(decl.id.name, "myVar"); - let Expr::Literal(value) = decl.init else { - panic!("value should be a literal") - }; - assert_eq!(value.end, test.len()); - assert_eq!(value.raw, "5"); - } - } - - #[test] - fn test_math_parse() { - let tokens = crate::token::lexer(r#"5 + "a""#).unwrap(); - let actual = crate::parser::Parser::new(tokens).ast().unwrap().body; - let expr = BinaryExpression { - start: 0, - end: 7, - operator: BinaryOperator::Add, - left: BinaryPart::Literal(Box::new(Literal { - start: 0, - end: 1, - value: 5u32.into(), - raw: "5".to_owned(), - digest: None, - })), - right: BinaryPart::Literal(Box::new(Literal { - start: 4, - end: 7, - value: "a".into(), - raw: r#""a""#.to_owned(), - digest: None, - })), - digest: None, - }; - let expected = vec![BodyItem::ExpressionStatement(ExpressionStatement { - start: 0, - end: 7, - expression: Expr::BinaryExpression(Box::new(expr)), - digest: None, - })]; - assert_eq!(expected, actual); - } - - #[test] - fn test_is_code_token() { - let tokens = [ - Token { - token_type: TokenType::Word, - start: 0, - end: 3, - value: "log".to_string(), - }, - Token { - token_type: TokenType::Brace, - start: 3, - end: 4, - value: "(".to_string(), - }, - Token { - token_type: TokenType::Number, - start: 4, - end: 5, - value: "5".to_string(), - }, - Token { - token_type: TokenType::Comma, - start: 5, - end: 6, - value: ",".to_string(), - }, - Token { - token_type: TokenType::String, - start: 7, - end: 14, - value: "\"hello\"".to_string(), - }, - Token { - token_type: TokenType::Word, - start: 16, - end: 27, - value: "aIdentifier".to_string(), - }, - Token { - token_type: TokenType::Brace, - start: 27, - end: 28, - value: ")".to_string(), - }, - ]; - for (i, token) in tokens.iter().enumerate() { - assert!(token.is_code_token(), "failed test {i}: {token:?}") - } - } - - #[test] - fn test_is_not_code_token() { - let tokens = [ - Token { - token_type: TokenType::Whitespace, - start: 6, - end: 7, - value: " ".to_string(), - }, - Token { - token_type: TokenType::BlockComment, - start: 28, - end: 30, - value: "/* abte */".to_string(), - }, - Token { - token_type: TokenType::LineComment, - start: 30, - end: 33, - value: "// yoyo a line".to_string(), - }, - ]; - for (i, token) in tokens.iter().enumerate() { - assert!(!token.is_code_token(), "failed test {i}: {token:?}") - } - } - - #[test] - fn test_abstract_syntax_tree() { - let code = "5 +6"; - let parser = crate::parser::Parser::new(crate::token::lexer(code).unwrap()); - let result = parser.ast().unwrap(); - let expected_result = Program { - start: 0, - end: 4, - body: vec![BodyItem::ExpressionStatement(ExpressionStatement { - start: 0, - end: 4, - expression: Expr::BinaryExpression(Box::new(BinaryExpression { - start: 0, - end: 4, - left: BinaryPart::Literal(Box::new(Literal { - start: 0, - end: 1, - value: 5u32.into(), - raw: "5".to_string(), - digest: None, - })), - operator: BinaryOperator::Add, - right: BinaryPart::Literal(Box::new(Literal { - start: 3, - end: 4, - value: 6u32.into(), - raw: "6".to_string(), - digest: None, - })), - digest: None, - })), - digest: None, - })], - non_code_meta: NonCodeMeta::default(), - digest: None, - }; - - assert_eq!(result, expected_result); - } - - #[test] - fn test_empty_file() { - let some_program_string = r#""#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let result = parser.ast(); - assert!(result.is_ok()); - } - - #[test] - fn test_parse_half_pipe_small() { - let tokens = crate::token::lexer( - "const secondExtrude = startSketchOn('XY') - |> startProfileAt([0,0], %) - |", - ) - .unwrap(); - let parser = crate::parser::Parser::new(tokens); - let result = parser.ast(); - assert!(result.is_err()); - let actual = result.err().unwrap().to_string(); - assert!(actual.contains("Unexpected token: |"), "actual={actual:?}"); - } - - #[test] - fn test_parse_member_expression_double_nested_braces() { - let tokens = crate::token::lexer(r#"const prop = yo["one"][two]"#).unwrap(); - let parser = crate::parser::Parser::new(tokens); - parser.ast().unwrap(); - } - - #[test] - fn test_parse_member_expression_binary_expression_period_number_first() { - let tokens = crate::token::lexer( - r#"const obj = { a: 1, b: 2 } -const height = 1 - obj.a"#, - ) - .unwrap(); - let parser = crate::parser::Parser::new(tokens); - parser.ast().unwrap(); - } - - #[test] - fn test_parse_member_expression_allowed_type_in_expression() { - let tokens = crate::token::lexer( - r#"const obj = { thing: 1 } -startSketchOn(obj.sketch)"#, - ) - .unwrap(); - - let parser = crate::parser::Parser::new(tokens); - parser.ast().unwrap(); - } - - #[test] - fn test_parse_member_expression_binary_expression_brace_number_first() { - let tokens = crate::token::lexer( - r#"const obj = { a: 1, b: 2 } -const height = 1 - obj["a"]"#, - ) - .unwrap(); - let parser = crate::parser::Parser::new(tokens); - parser.ast().unwrap(); - } - - #[test] - fn test_parse_member_expression_binary_expression_brace_number_second() { - let tokens = crate::token::lexer( - r#"const obj = { a: 1, b: 2 } -const height = obj["a"] - 1"#, - ) - .unwrap(); - let parser = crate::parser::Parser::new(tokens); - parser.ast().unwrap(); - } - - #[test] - fn test_parse_member_expression_binary_expression_in_array_number_first() { - let tokens = crate::token::lexer( - r#"const obj = { a: 1, b: 2 } -const height = [1 - obj["a"], 0]"#, - ) - .unwrap(); - let parser = crate::parser::Parser::new(tokens); - parser.ast().unwrap(); - } - - #[test] - fn test_parse_member_expression_binary_expression_in_array_number_second() { - let tokens = crate::token::lexer( - r#"const obj = { a: 1, b: 2 } -const height = [obj["a"] - 1, 0]"#, - ) - .unwrap(); - let parser = crate::parser::Parser::new(tokens); - parser.ast().unwrap(); - } - - #[test] - fn test_parse_member_expression_binary_expression_in_array_number_second_missing_space() { - let tokens = crate::token::lexer( - r#"const obj = { a: 1, b: 2 } -const height = [obj["a"] -1, 0]"#, - ) - .unwrap(); - let parser = crate::parser::Parser::new(tokens); - parser.ast().unwrap(); - } - - #[test] - fn test_parse_half_pipe() { - let tokens = crate::token::lexer( - "const height = 10 - -const firstExtrude = startSketchOn('XY') - |> startProfileAt([0,0], %) - |> line([0, 8], %) - |> line([20, 0], %) - |> line([0, -8], %) - |> close(%) - |> extrude(2, %) - -const secondExtrude = startSketchOn('XY') - |> startProfileAt([0,0], %) - |", - ) - .unwrap(); - let parser = crate::parser::Parser::new(tokens); - let result = parser.ast(); - assert!(result.is_err()); - assert!(result.err().unwrap().to_string().contains("Unexpected token: |")); - } - - #[test] - fn test_parse_greater_bang() { - let tokens = crate::token::lexer(">!").unwrap(); - let parser = crate::parser::Parser::new(tokens); - let err = parser.ast().unwrap_err(); - assert_eq!( - err.to_string(), - r#"syntax: KclErrorDetails { source_ranges: [SourceRange([0, 1])], message: "Unexpected token: >" }"# - ); - } - - #[test] - fn test_parse_z_percent_parens() { - let tokens = crate::token::lexer("z%)").unwrap(); - let parser = crate::parser::Parser::new(tokens); - let result = parser.ast(); - assert!(result.is_err()); - assert_eq!( - result.err().unwrap().to_string(), - r#"syntax: KclErrorDetails { source_ranges: [SourceRange([1, 2])], message: "Unexpected token: %" }"# - ); - } - - #[test] - fn test_parse_parens_unicode() { - let result = crate::token::lexer("(ޜ"); - // TODO: Better errors when program cannot tokenize. - // https://github.com/KittyCAD/modeling-app/issues/696 - assert!(result.is_err()); - assert_eq!( - result.err().unwrap().to_string(), - r#"lexical: KclErrorDetails { source_ranges: [SourceRange([1, 2])], message: "found unknown token 'ޜ'" }"# - ); - } - - #[test] - fn test_parse_negative_in_array_binary_expression() { - let tokens = crate::token::lexer( - r#"const leg1 = 5 -const thickness = 0.56 - -const bracket = [-leg2 + thickness, 0] -"#, - ) - .unwrap(); - let parser = crate::parser::Parser::new(tokens); - let result = parser.ast(); - assert!(result.is_ok()); - } - - #[test] - fn test_parse_nested_open_brackets() { - let tokens = crate::token::lexer( - r#" -z(-[["#, - ) - .unwrap(); - let parser = crate::parser::Parser::new(tokens); - let result = parser.ast(); - assert!(result.is_err()); - } - - #[test] - fn test_parse_weird_new_line_function() { - let tokens = crate::token::lexer( - r#"z - (--#"#, - ) - .unwrap(); - let parser = crate::parser::Parser::new(tokens); - let result = parser.ast(); - assert!(result.is_err()); - assert_eq!( - result.err().unwrap().to_string(), - r#"syntax: KclErrorDetails { source_ranges: [SourceRange([3, 4])], message: "Unexpected token: (" }"# - ); - } - - #[test] - fn test_parse_weird_lots_of_fancy_brackets() { - let tokens = crate::token::lexer(r#"zz({{{{{{{{)iegAng{{{{{{{##"#).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let result = parser.ast(); - assert!(result.is_err()); - assert_eq!( - result.err().unwrap().to_string(), - r#"syntax: KclErrorDetails { source_ranges: [SourceRange([2, 3])], message: "Unexpected token: (" }"# - ); - } - - #[test] - fn test_parse_weird_close_before_open() { - let tokens = crate::token::lexer( - r#"fn)n -e -["#, - ) - .unwrap(); - let parser = crate::parser::Parser::new(tokens); - let result = parser.ast(); - assert!(result.is_err()); - assert!(result - .err() - .unwrap() - .to_string() - .contains("expected whitespace, found ')' which is brace")); - } - - #[test] - fn test_parse_weird_close_before_nada() { - let tokens = crate::token::lexer(r#"fn)n-"#).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let result = parser.ast(); - assert!(result.is_err()); - dbg!(&result); - assert!(result - .err() - .unwrap() - .to_string() - .contains("expected whitespace, found ')' which is brace")); - } - - #[test] - fn test_parse_weird_lots_of_slashes() { - let tokens = crate::token::lexer( - r#"J///////////o//+///////////P++++*++++++P///////˟ -++4"#, - ) - .unwrap(); - let parser = crate::parser::Parser::new(tokens); - let result = parser.ast(); - assert!(result.is_err()); - let actual = result.err().unwrap().to_string(); - assert!(actual.contains("Unexpected token: +"), "actual={actual:?}"); - } - - #[test] - fn test_optional_param_order() { - for (i, (params, expect_ok)) in [ - ( - vec![Parameter { - identifier: Identifier { - start: 0, - end: 0, - name: "a".to_owned(), - digest: None, - }, - type_: None, - optional: true, - digest: None, - }], - true, - ), - ( - vec![Parameter { - identifier: Identifier { - start: 0, - end: 0, - name: "a".to_owned(), - digest: None, - }, - type_: None, - optional: false, - digest: None, - }], - true, - ), - ( - vec![ - Parameter { - identifier: Identifier { - start: 0, - end: 0, - name: "a".to_owned(), - digest: None, - }, - type_: None, - optional: false, - digest: None, - }, - Parameter { - identifier: Identifier { - start: 0, - end: 0, - name: "b".to_owned(), - digest: None, - }, - type_: None, - optional: true, - digest: None, - }, - ], - true, - ), - ( - vec![ - Parameter { - identifier: Identifier { - start: 0, - end: 0, - name: "a".to_owned(), - digest: None, - }, - type_: None, - optional: true, - digest: None, - }, - Parameter { - identifier: Identifier { - start: 0, - end: 0, - name: "b".to_owned(), - digest: None, - }, - type_: None, - optional: false, - digest: None, - }, - ], - false, - ), - ] - .into_iter() - .enumerate() - { - let actual = optional_after_required(¶ms); - assert_eq!(actual.is_ok(), expect_ok, "failed test {i}"); - } - } - - #[test] - fn test_error_keyword_in_variable() { - let some_program_string = r#"const let = "thing""#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let result = parser.ast(); - assert!(result.is_err()); - assert_eq!( - result.err().unwrap().to_string(), - r#"syntax: KclErrorDetails { source_ranges: [SourceRange([6, 9])], message: "Cannot assign a variable to a reserved keyword: let" }"# - ); - } - - #[test] - fn test_error_keyword_in_fn_name() { - let some_program_string = r#"fn let = () {}"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let result = parser.ast(); - assert!(result.is_err()); - assert_eq!( - result.err().unwrap().to_string(), - r#"syntax: KclErrorDetails { source_ranges: [SourceRange([3, 6])], message: "Cannot assign a variable to a reserved keyword: let" }"# - ); - } - - #[test] - fn test_error_stdlib_in_fn_name() { - let some_program_string = r#"fn cos = () => { - return 1 - }"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let result = parser.ast(); - assert!(result.is_err()); - assert_eq!( - result.err().unwrap().to_string(), - r#"syntax: KclErrorDetails { source_ranges: [SourceRange([3, 6])], message: "Cannot assign a variable to a reserved keyword: cos" }"# - ); - } - - #[test] - fn test_error_keyword_in_fn_args() { - let some_program_string = r#"fn thing = (let) => { - return 1 -}"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let result = parser.ast(); - assert!(result.is_err()); - assert_eq!( - result.err().unwrap().to_string(), - r#"syntax: KclErrorDetails { source_ranges: [SourceRange([12, 15])], message: "Cannot assign a variable to a reserved keyword: let" }"# - ); - } - - #[test] - fn test_error_stdlib_in_fn_args() { - let some_program_string = r#"fn thing = (cos) => { - return 1 -}"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let result = parser.ast(); - assert!(result.is_err()); - assert_eq!( - result.err().unwrap().to_string(), - r#"syntax: KclErrorDetails { source_ranges: [SourceRange([12, 15])], message: "Cannot assign a variable to a reserved keyword: cos" }"# - ); - } - - #[test] - fn zero_param_function() { - let program = r#" - fn firstPrimeNumber = () => { - return 2 - } - firstPrimeNumber() - "#; - let tokens = crate::token::lexer(program).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let _ast = parser.ast().unwrap(); - } - - #[test] - fn array() { - let program = r#"[1, 2, 3]"#; - let tokens = crate::token::lexer(program).unwrap(); - let mut sl: &[Token] = &tokens; - let _arr = array_elem_by_elem(&mut sl).unwrap(); - } - - #[test] - fn array_linesep_trailing_comma() { - let program = r#"[ - 1, - 2, - 3, - ]"#; - let tokens = crate::token::lexer(program).unwrap(); - let mut sl: &[Token] = &tokens; - let _arr = array_elem_by_elem(&mut sl).unwrap(); - } - - #[allow(unused)] - #[test] - fn array_linesep_no_trailing_comma() { - let program = r#"[ - 1, - 2, - 3 - ]"#; - let tokens = crate::token::lexer(program).unwrap(); - let mut sl: &[Token] = &tokens; - let _arr = array_elem_by_elem(&mut sl).unwrap(); - } - - #[test] - fn basic_if_else() { - let some_program_string = "if true { - 3 - } else { - 4 - }"; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let mut sl: &[Token] = &tokens; - let _res = if_expr(&mut sl).unwrap(); - } - - #[test] - fn basic_else_if() { - let some_program_string = "else if true { - 4 - }"; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let mut sl: &[Token] = &tokens; - let _res = else_if(&mut sl).unwrap(); - } - - #[test] - fn basic_if_else_if() { - let some_program_string = "if true { - 3 - } else if true { - 4 - } else { - 5 - }"; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let mut sl: &[Token] = &tokens; - let _res = if_expr(&mut sl).unwrap(); - } - - #[test] - fn test_keyword_ok_in_fn_args_return() { - let some_program_string = r#"fn thing = (param) => { - return true -} - -thing(false) -"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - parser.ast().unwrap(); - } - - #[test] - fn test_error_define_function_as_var() { - for name in ["var", "let", "const"] { - let some_program_string = format!( - r#"{} thing = (param) => {{ - return true -}} - -thing(false) -"#, - name - ); - let tokens = crate::token::lexer(&some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let result = parser.ast(); - assert!(result.is_err()); - assert_eq!( - result.err().unwrap().to_string(), - format!( - r#"syntax: KclErrorDetails {{ source_ranges: [SourceRange([0, {}])], message: "Expected a `fn` variable kind, found: `const`" }}"#, - name.len(), - ) - ); - } - } - - #[test] - fn test_error_define_var_as_function() { - let some_program_string = r#"fn thing = "thing""#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let result = parser.ast(); - assert!(result.is_err()); - // TODO: https://github.com/KittyCAD/modeling-app/issues/784 - // Improve this error message. - // It should say that the compiler is expecting a function expression on the RHS. - assert_eq!( - result.err().unwrap().to_string(), - r#"syntax: KclErrorDetails { source_ranges: [SourceRange([11, 18])], message: "Unexpected token: \"thing\"" }"# - ); - } - - #[test] - fn random_words_fail() { - let test_program = r#"const part001 = startSketchOn('-XZ') - |> startProfileAt([8.53, 11.8], %) - asdasd asdasd - |> line([11.12, -14.82], %) - |> line([-13.27, -6.98], %) - |> line([-5.09, 12.33], %) - asdasd -"#; - let tokens = crate::token::lexer(test_program).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let result = parser.ast(); - let _e = result.unwrap_err(); - } - - #[test] - fn test_member_expression_sketch() { - let some_program_string = r#"fn cube = (pos, scale) => { - const sg = startSketchOn('XY') - |> startProfileAt(pos, %) - |> line([0, scale], %) - |> line([scale, 0], %) - |> line([0, -scale], %) - - return sg -} - -const b1 = cube([0,0], 10) -const b2 = cube([3,3], 4) - -const pt1 = b1[0] -const pt2 = b2[0] -"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - parser.ast().unwrap(); - } - - #[test] - fn test_math_with_stdlib() { - let some_program_string = r#"const d2r = pi() / 2 -let other_thing = 2 * cos(3)"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - parser.ast().unwrap(); - } - - #[test] - fn test_negative_arguments() { - let some_program_string = r#"fn box = (p, h, l, w) => { - const myBox = startSketchOn('XY') - |> startProfileAt(p, %) - |> line([0, l], %) - |> line([w, 0], %) - |> line([0, -l], %) - |> close(%) - |> extrude(h, %) - - return myBox -} -let myBox = box([0,0], -3, -16, -10) -"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - parser.ast().unwrap(); - } - #[test] - fn must_use_percent_in_pipeline_fn() { - let some_program_string = r#" - foo() - |> bar(2) - "#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let err = parser.ast().unwrap_err(); - assert_eq!( - err.to_string(), - r#"syntax: KclErrorDetails { source_ranges: [SourceRange([30, 36])], message: "All expressions in a pipeline must use the % (substitution operator)" }"# - ); - } -} - -#[cfg(test)] -mod snapshot_math_tests { - use super::*; - - // This macro generates a test function with the given function name. - // The macro takes a KCL program, ensures it tokenizes and parses, then compares - // its parsed AST to a snapshot (kept in this repo in a file under snapshots/ dir) - macro_rules! snapshot_test { - ($func_name:ident, $test_kcl_program:expr) => { - #[test] - fn $func_name() { - let tokens = crate::token::lexer($test_kcl_program).unwrap(); - let actual = match binary_expression.parse(&tokens) { - Ok(x) => x, - Err(_e) => panic!("could not parse test"), - }; - insta::assert_json_snapshot!(actual); - } - }; - } - - snapshot_test!(a, "1 + 2"); - snapshot_test!(b, "1+2"); - snapshot_test!(c, "1 -2"); - snapshot_test!(d, "1 + 2 * 3"); - snapshot_test!(e, "1 * ( 2 + 3 )"); - snapshot_test!(f, "1 * ( 2 + 3 ) / 4"); - snapshot_test!(g, "1 + ( 2 + 3 ) / 4"); - snapshot_test!(h, "1 * (( 2 + 3 ) / 4 + 5 )"); - snapshot_test!(i, "1 * ((( 2 + 3 )))"); - snapshot_test!(j, "distance * p * FOS * 6 / (sigmaAllow * width)"); - snapshot_test!(k, "2 + (((3)))"); -} - -#[cfg(test)] -mod snapshot_tests { - use super::*; - - // This macro generates a test function with the given function name. - // The macro takes a KCL program, ensures it tokenizes and parses, then compares - // its parsed AST to a snapshot (kept in this repo in a file under snapshots/ dir) - macro_rules! snapshot_test { - ($func_name:ident, $test_kcl_program:expr) => { - #[test] - fn $func_name() { - let tokens = crate::token::lexer($test_kcl_program).unwrap(); - print_tokens(&tokens); - let actual = match program.parse(&tokens) { - Ok(x) => x, - Err(e) => panic!("could not parse test: {e:?}"), - }; - let mut settings = insta::Settings::clone_current(); - settings.set_sort_maps(true); - settings.bind(|| { - insta::assert_json_snapshot!(actual); - }); - } - }; - } - - snapshot_test!( - a, - r#"const boxSketch = startSketchAt([0, 0]) - |> line([0, 10], %) - |> tangentialArc([-5, 5], %) - |> line([5, -15], %) - |> extrude(10, %) -"# - ); - snapshot_test!(b, "const myVar = min(5 , -legLen(5, 4))"); // Space before comma - - snapshot_test!(c, "const myVar = min(-legLen(5, 4), 5)"); - snapshot_test!(d, "const myVar = 5 + 6 |> myFunc(45, %)"); - snapshot_test!(e, "let x = 1 * (3 - 4)"); - snapshot_test!(f, r#"const x = 1 // this is an inline comment"#); - snapshot_test!( - g, - r#"fn x = () => { - return sg - return sg - }"# - ); - snapshot_test!(d2, r#"const x = -leg2 + thickness"#); - snapshot_test!( - h, - r#"const obj = { a: 1, b: 2 } - const height = 1 - obj.a"# - ); - snapshot_test!( - i, - r#"const obj = { a: 1, b: 2 } - const height = 1 - obj["a"]"# - ); - snapshot_test!( - j, - r#"const obj = { a: 1, b: 2 } - const height = obj["a"] - 1"# - ); - snapshot_test!( - k, - r#"const obj = { a: 1, b: 2 } - const height = [1 - obj["a"], 0]"# - ); - snapshot_test!( - l, - r#"const obj = { a: 1, b: 2 } - const height = [obj["a"] - 1, 0]"# - ); - snapshot_test!( - m, - r#"const obj = { a: 1, b: 2 } - const height = [obj["a"] -1, 0]"# - ); - snapshot_test!(n, "const height = 1 - obj.a"); - snapshot_test!(o, "const six = 1 + 2 + 3"); - snapshot_test!(p, "const five = 3 * 1 + 2"); - snapshot_test!(q, r#"const height = [ obj["a"], 0 ]"#); - snapshot_test!( - r, - r#"const obj = { a: 1, b: 2 } - const height = obj["a"]"# - ); - snapshot_test!(s, r#"const prop = yo["one"][two]"#); - snapshot_test!(t, r#"const pt1 = b1[x]"#); - snapshot_test!(u, "const prop = yo.one.two.three.four"); - snapshot_test!(v, r#"const pt1 = b1[0]"#); - snapshot_test!(w, r#"const pt1 = b1['zero']"#); - snapshot_test!(x, r#"const pt1 = b1.zero"#); - snapshot_test!(y, "const sg = startSketchAt(pos)"); - snapshot_test!(z, "const sg = startSketchAt(pos) |> line([0, -scale], %)"); - snapshot_test!(aa, r#"const sg = -scale"#); - snapshot_test!(ab, "lineTo({ to: [0, -1] })"); - snapshot_test!(ac, "const myArray = [0..10]"); - snapshot_test!( - ad, - r#" - fn firstPrimeNumber = () => { - return 2 - } - firstPrimeNumber()"# - ); - snapshot_test!( - ae, - r#"fn thing = (param) => { - return true - } - thing(false)"# - ); - snapshot_test!( - af, - r#"const mySketch = startSketchAt([0,0]) - |> lineTo([0, 1], %, $myPath) - |> lineTo([1, 1], %) - |> lineTo([1, 0], %, $rightPath) - |> close(%)"# - ); - snapshot_test!( - ag, - "const mySketch = startSketchAt([0,0]) |> lineTo([1, 1], %) |> close(%)" - ); - snapshot_test!(ah, "const myBox = startSketchAt(p)"); - snapshot_test!(ai, r#"const myBox = f(1) |> g(2, %)"#); - snapshot_test!(aj, r#"const myBox = startSketchAt(p) |> line([0, l], %)"#); - snapshot_test!(ak, "lineTo({ to: [0, 1] })"); - snapshot_test!(al, "lineTo({ to: [0, 1], from: [3, 3] })"); - snapshot_test!(am, "lineTo({to:[0, 1]})"); - snapshot_test!(an, "lineTo({ to: [0, 1], from: [3, 3]})"); - snapshot_test!(ao, "lineTo({ to: [0, 1],from: [3, 3] })"); - snapshot_test!(ap, "const mySketch = startSketchAt([0,0])"); - snapshot_test!(aq, "log(5, \"hello\", aIdentifier)"); - snapshot_test!(ar, r#"5 + "a""#); - snapshot_test!(at, "line([0, l], %)"); - snapshot_test!(au, include_str!("../../../tests/executor/inputs/cylinder.kcl")); - snapshot_test!(av, "fn f = (angle?) => { return default(angle, 360) }"); - snapshot_test!( - aw, - "let numbers = [ - 1, - // A, - // B, - 3, - ]" - ); - snapshot_test!( - ax, - "let numbers = [ - 1, - 2, - // A, - // B, - ]" - ); - snapshot_test!( - ay, - "let props = { - a: 1, - // b: 2, - c: 3, - }" - ); - snapshot_test!( - az, - "let props = { - a: 1, - // b: 2, - c: 3 - }" - ); - snapshot_test!( - ba, - r#" -const sketch001 = startSketchOn('XY') - // |> arc({ - // angleEnd: 270, - // angleStart: 450, - // }, %) - |> startProfileAt(%) -"# - ); - snapshot_test!( - bb, - r#" -const my14 = 4 ^ 2 - 3 ^ 2 * 2 -"# - ); - snapshot_test!( - bc, - r#"const x = if true { - 3 - } else { - 4 - }"# - ); - snapshot_test!( - bd, - r#"const x = if true { - 3 - } else if func(radius) { - 4 - } else { - 5 - }"# - ); - snapshot_test!(be, "let x = 3 == 3"); - snapshot_test!(bf, "let x = 3 != 3"); - snapshot_test!(bg, r#"x = 4"#); - snapshot_test!(bh, "const obj = {center : [10, 10], radius: 5}"); -} - -#[allow(unused)] -#[cfg(test)] -pub(crate) fn print_tokens(tokens: &[Token]) { - for (i, tok) in tokens.iter().enumerate() { - println!("{i:.2}: ({:?}):) '{}'", tok.token_type, tok.value.replace("\n", "\\n")); - } -} diff --git a/src/wasm-lib/kcl/src/parser/parser_impl/error.rs b/src/wasm-lib/kcl/src/parser/parser_impl/error.rs deleted file mode 100644 index 11dea7c3f..000000000 --- a/src/wasm-lib/kcl/src/parser/parser_impl/error.rs +++ /dev/null @@ -1,146 +0,0 @@ -use winnow::{ - error::{ErrorKind, ParseError, StrContext}, - stream::Stream, - Located, -}; - -use crate::{ - errors::{KclError, KclErrorDetails}, - executor::SourceRange, - token::Token, -}; - -/// Accumulate context while backtracking errors -/// Very similar to [`winnow::error::ContextError`] type, -/// but the 'cause' field is always a [`KclError`], -/// instead of a dynamic [`std::error::Error`] trait object. -#[derive(Debug, Clone)] -pub struct ContextError { - pub context: Vec, - pub cause: Option, -} - -impl From, winnow::error::ContextError>> for KclError { - fn from(err: ParseError, winnow::error::ContextError>) -> Self { - let (input, offset): (Vec, usize) = (err.input().chars().collect(), err.offset()); - - if offset >= input.len() { - // From the winnow docs: - // - // This is an offset, not an index, and may point to - // the end of input (input.len()) on eof errors. - - return KclError::Lexical(KclErrorDetails { - source_ranges: vec![SourceRange([offset, offset])], - message: "unexpected EOF while parsing".to_string(), - }); - } - - // TODO: Add the Winnow tokenizer context to the error. - // See https://github.com/KittyCAD/modeling-app/issues/784 - let bad_token = &input[offset]; - // TODO: Add the Winnow parser context to the error. - // See https://github.com/KittyCAD/modeling-app/issues/784 - KclError::Lexical(KclErrorDetails { - source_ranges: vec![SourceRange([offset, offset + 1])], - message: format!("found unknown token '{}'", bad_token), - }) - } -} - -impl From> for KclError { - fn from(err: ParseError<&[Token], ContextError>) -> Self { - let Some(last_token) = err.input().last() else { - return KclError::Syntax(KclErrorDetails { - source_ranges: Default::default(), - message: "file is empty".to_owned(), - }); - }; - - let (input, offset, err) = (err.input().to_vec(), err.offset(), err.into_inner()); - - if let Some(e) = err.cause { - return e; - } - - // See docs on `offset`. - if offset >= input.len() { - let context = err.context.first(); - return KclError::Syntax(KclErrorDetails { - source_ranges: last_token.as_source_ranges(), - message: match context { - Some(what) => format!("Unexpected end of file. The compiler {what}"), - None => "Unexpected end of file while still parsing".to_owned(), - }, - }); - } - - let bad_token = &input[offset]; - // TODO: Add the Winnow parser context to the error. - // See https://github.com/KittyCAD/modeling-app/issues/784 - KclError::Syntax(KclErrorDetails { - source_ranges: bad_token.as_source_ranges(), - message: format!("Unexpected token: {}", bad_token.value), - }) - } -} - -impl From for ContextError { - fn from(e: KclError) -> Self { - Self { - context: Default::default(), - cause: Some(e), - } - } -} - -impl std::default::Default for ContextError { - fn default() -> Self { - Self { - context: Default::default(), - cause: None, - } - } -} - -impl winnow::error::ParserError for ContextError -where - I: Stream, -{ - #[inline] - fn from_error_kind(_input: &I, _kind: ErrorKind) -> Self { - Self::default() - } - - #[inline] - fn append(self, _input: &I, _input_checkpoint: &::Checkpoint, _kind: ErrorKind) -> Self { - self - } - - #[inline] - fn or(self, other: Self) -> Self { - other - } -} - -impl winnow::error::AddContext for ContextError -where - I: Stream, -{ - #[inline] - fn add_context(mut self, _input: &I, _input_checkpoint: &::Checkpoint, ctx: C) -> Self { - self.context.push(ctx); - self - } -} - -impl winnow::error::FromExternalError for ContextError { - #[inline] - fn from_external_error(_input: &I, _kind: ErrorKind, e: KclError) -> Self { - let mut err = Self::default(); - { - err.cause = Some(e); - } - err - } -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__a.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__a.snap deleted file mode 100644 index b911bab7a..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__a.snap +++ /dev/null @@ -1,255 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 144, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 143, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 143, - "id": { - "type": "Identifier", - "start": 6, - "end": 15, - "name": "boxSketch" - }, - "init": { - "type": "PipeExpression", - "type": "PipeExpression", - "start": 18, - "end": 143, - "body": [ - { - "type": "CallExpression", - "type": "CallExpression", - "start": 18, - "end": 39, - "callee": { - "type": "Identifier", - "start": 18, - "end": 31, - "name": "startSketchAt" - }, - "arguments": [ - { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 32, - "end": 38, - "elements": [ - { - "type": "Literal", - "type": "Literal", - "start": 33, - "end": 34, - "value": 0, - "raw": "0" - }, - { - "type": "Literal", - "type": "Literal", - "start": 36, - "end": 37, - "value": 0, - "raw": "0" - } - ] - } - ], - "optional": false - }, - { - "type": "CallExpression", - "type": "CallExpression", - "start": 47, - "end": 63, - "callee": { - "type": "Identifier", - "start": 47, - "end": 51, - "name": "line" - }, - "arguments": [ - { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 52, - "end": 59, - "elements": [ - { - "type": "Literal", - "type": "Literal", - "start": 53, - "end": 54, - "value": 0, - "raw": "0" - }, - { - "type": "Literal", - "type": "Literal", - "start": 56, - "end": 58, - "value": 10, - "raw": "10" - } - ] - }, - { - "type": "PipeSubstitution", - "type": "PipeSubstitution", - "start": 61, - "end": 62 - } - ], - "optional": false - }, - { - "type": "CallExpression", - "type": "CallExpression", - "start": 71, - "end": 96, - "callee": { - "type": "Identifier", - "start": 71, - "end": 84, - "name": "tangentialArc" - }, - "arguments": [ - { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 85, - "end": 92, - "elements": [ - { - "type": "UnaryExpression", - "type": "UnaryExpression", - "start": 86, - "end": 88, - "operator": "-", - "argument": { - "type": "Literal", - "type": "Literal", - "start": 87, - "end": 88, - "value": 5, - "raw": "5" - } - }, - { - "type": "Literal", - "type": "Literal", - "start": 90, - "end": 91, - "value": 5, - "raw": "5" - } - ] - }, - { - "type": "PipeSubstitution", - "type": "PipeSubstitution", - "start": 94, - "end": 95 - } - ], - "optional": false - }, - { - "type": "CallExpression", - "type": "CallExpression", - "start": 104, - "end": 121, - "callee": { - "type": "Identifier", - "start": 104, - "end": 108, - "name": "line" - }, - "arguments": [ - { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 109, - "end": 117, - "elements": [ - { - "type": "Literal", - "type": "Literal", - "start": 110, - "end": 111, - "value": 5, - "raw": "5" - }, - { - "type": "UnaryExpression", - "type": "UnaryExpression", - "start": 113, - "end": 116, - "operator": "-", - "argument": { - "type": "Literal", - "type": "Literal", - "start": 114, - "end": 116, - "value": 15, - "raw": "15" - } - } - ] - }, - { - "type": "PipeSubstitution", - "type": "PipeSubstitution", - "start": 119, - "end": 120 - } - ], - "optional": false - }, - { - "type": "CallExpression", - "type": "CallExpression", - "start": 129, - "end": 143, - "callee": { - "type": "Identifier", - "start": 129, - "end": 136, - "name": "extrude" - }, - "arguments": [ - { - "type": "Literal", - "type": "Literal", - "start": 137, - "end": 139, - "value": 10, - "raw": "10" - }, - { - "type": "PipeSubstitution", - "type": "PipeSubstitution", - "start": 141, - "end": 142 - } - ], - "optional": false - } - ] - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aa.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aa.snap deleted file mode 100644 index c3a940d8c..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aa.snap +++ /dev/null @@ -1,44 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 17, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 17, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 17, - "id": { - "type": "Identifier", - "start": 6, - "end": 8, - "name": "sg" - }, - "init": { - "type": "UnaryExpression", - "type": "UnaryExpression", - "start": 11, - "end": 17, - "operator": "-", - "argument": { - "type": "Identifier", - "type": "Identifier", - "start": 12, - "end": 17, - "name": "scale" - } - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ac.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ac.snap deleted file mode 100644 index c10a50947..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ac.snap +++ /dev/null @@ -1,53 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 23, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 23, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 23, - "id": { - "type": "Identifier", - "start": 6, - "end": 13, - "name": "myArray" - }, - "init": { - "type": "ArrayRangeExpression", - "type": "ArrayRangeExpression", - "start": 16, - "end": 23, - "startElement": { - "type": "Literal", - "type": "Literal", - "start": 17, - "end": 18, - "value": 0, - "raw": "0" - }, - "endElement": { - "type": "Literal", - "type": "Literal", - "start": 20, - "end": 22, - "value": 10, - "raw": "10" - }, - "endInclusive": true - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ad.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ad.snap deleted file mode 100644 index 00aa97086..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ad.snap +++ /dev/null @@ -1,77 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 80, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 5, - "end": 57, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 8, - "end": 57, - "id": { - "type": "Identifier", - "start": 8, - "end": 24, - "name": "firstPrimeNumber" - }, - "init": { - "type": "FunctionExpression", - "type": "FunctionExpression", - "start": 27, - "end": 57, - "params": [], - "body": { - "start": 33, - "end": 57, - "body": [ - { - "type": "ReturnStatement", - "type": "ReturnStatement", - "start": 43, - "end": 51, - "argument": { - "type": "Literal", - "type": "Literal", - "start": 50, - "end": 51, - "value": 2, - "raw": "2" - } - } - ] - } - } - } - ], - "kind": "fn" - }, - { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 62, - "end": 80, - "expression": { - "type": "CallExpression", - "type": "CallExpression", - "start": 62, - "end": 80, - "callee": { - "type": "Identifier", - "start": 62, - "end": 78, - "name": "firstPrimeNumber" - }, - "arguments": [], - "optional": false - } - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ae.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ae.snap deleted file mode 100644 index 9f4006f35..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ae.snap +++ /dev/null @@ -1,97 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 66, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 49, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 3, - "end": 49, - "id": { - "type": "Identifier", - "start": 3, - "end": 8, - "name": "thing" - }, - "init": { - "type": "FunctionExpression", - "type": "FunctionExpression", - "start": 11, - "end": 49, - "params": [ - { - "type": "Parameter", - "identifier": { - "type": "Identifier", - "start": 12, - "end": 17, - "name": "param" - }, - "optional": false - } - ], - "body": { - "start": 22, - "end": 49, - "body": [ - { - "type": "ReturnStatement", - "type": "ReturnStatement", - "start": 32, - "end": 43, - "argument": { - "type": "Literal", - "type": "Literal", - "start": 39, - "end": 43, - "value": true, - "raw": "true" - } - } - ] - } - } - } - ], - "kind": "fn" - }, - { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 54, - "end": 66, - "expression": { - "type": "CallExpression", - "type": "CallExpression", - "start": 54, - "end": 66, - "callee": { - "type": "Identifier", - "start": 54, - "end": 59, - "name": "thing" - }, - "arguments": [ - { - "type": "Literal", - "type": "Literal", - "start": 60, - "end": 65, - "value": false, - "raw": "false" - } - ], - "optional": false - } - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__af.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__af.snap deleted file mode 100644 index 7d28c8c5d..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__af.snap +++ /dev/null @@ -1,247 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 165, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 165, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 165, - "id": { - "type": "Identifier", - "start": 6, - "end": 14, - "name": "mySketch" - }, - "init": { - "type": "PipeExpression", - "type": "PipeExpression", - "start": 17, - "end": 165, - "body": [ - { - "type": "CallExpression", - "type": "CallExpression", - "start": 17, - "end": 37, - "callee": { - "type": "Identifier", - "start": 17, - "end": 30, - "name": "startSketchAt" - }, - "arguments": [ - { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 31, - "end": 36, - "elements": [ - { - "type": "Literal", - "type": "Literal", - "start": 32, - "end": 33, - "value": 0, - "raw": "0" - }, - { - "type": "Literal", - "type": "Literal", - "start": 34, - "end": 35, - "value": 0, - "raw": "0" - } - ] - } - ], - "optional": false - }, - { - "type": "CallExpression", - "type": "CallExpression", - "start": 49, - "end": 75, - "callee": { - "type": "Identifier", - "start": 49, - "end": 55, - "name": "lineTo" - }, - "arguments": [ - { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 56, - "end": 62, - "elements": [ - { - "type": "Literal", - "type": "Literal", - "start": 57, - "end": 58, - "value": 0, - "raw": "0" - }, - { - "type": "Literal", - "type": "Literal", - "start": 60, - "end": 61, - "value": 1, - "raw": "1" - } - ] - }, - { - "type": "PipeSubstitution", - "type": "PipeSubstitution", - "start": 64, - "end": 65 - }, - { - "type": "TagDeclarator", - "type": "TagDeclarator", - "start": 67, - "end": 74, - "value": "myPath" - } - ], - "optional": false - }, - { - "type": "CallExpression", - "type": "CallExpression", - "start": 87, - "end": 104, - "callee": { - "type": "Identifier", - "start": 87, - "end": 93, - "name": "lineTo" - }, - "arguments": [ - { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 94, - "end": 100, - "elements": [ - { - "type": "Literal", - "type": "Literal", - "start": 95, - "end": 96, - "value": 1, - "raw": "1" - }, - { - "type": "Literal", - "type": "Literal", - "start": 98, - "end": 99, - "value": 1, - "raw": "1" - } - ] - }, - { - "type": "PipeSubstitution", - "type": "PipeSubstitution", - "start": 102, - "end": 103 - } - ], - "optional": false - }, - { - "type": "CallExpression", - "type": "CallExpression", - "start": 116, - "end": 145, - "callee": { - "type": "Identifier", - "start": 116, - "end": 122, - "name": "lineTo" - }, - "arguments": [ - { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 123, - "end": 129, - "elements": [ - { - "type": "Literal", - "type": "Literal", - "start": 124, - "end": 125, - "value": 1, - "raw": "1" - }, - { - "type": "Literal", - "type": "Literal", - "start": 127, - "end": 128, - "value": 0, - "raw": "0" - } - ] - }, - { - "type": "PipeSubstitution", - "type": "PipeSubstitution", - "start": 131, - "end": 132 - }, - { - "type": "TagDeclarator", - "type": "TagDeclarator", - "start": 134, - "end": 144, - "value": "rightPath" - } - ], - "optional": false - }, - { - "type": "CallExpression", - "type": "CallExpression", - "start": 157, - "end": 165, - "callee": { - "type": "Identifier", - "start": 157, - "end": 162, - "name": "close" - }, - "arguments": [ - { - "type": "PipeSubstitution", - "type": "PipeSubstitution", - "start": 163, - "end": 164 - } - ], - "optional": false - } - ] - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ag.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ag.snap deleted file mode 100644 index 88393ea4a..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ag.snap +++ /dev/null @@ -1,143 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 70, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 70, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 70, - "id": { - "type": "Identifier", - "start": 6, - "end": 14, - "name": "mySketch" - }, - "init": { - "type": "PipeExpression", - "type": "PipeExpression", - "start": 17, - "end": 70, - "body": [ - { - "type": "CallExpression", - "type": "CallExpression", - "start": 17, - "end": 37, - "callee": { - "type": "Identifier", - "start": 17, - "end": 30, - "name": "startSketchAt" - }, - "arguments": [ - { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 31, - "end": 36, - "elements": [ - { - "type": "Literal", - "type": "Literal", - "start": 32, - "end": 33, - "value": 0, - "raw": "0" - }, - { - "type": "Literal", - "type": "Literal", - "start": 34, - "end": 35, - "value": 0, - "raw": "0" - } - ] - } - ], - "optional": false - }, - { - "type": "CallExpression", - "type": "CallExpression", - "start": 41, - "end": 58, - "callee": { - "type": "Identifier", - "start": 41, - "end": 47, - "name": "lineTo" - }, - "arguments": [ - { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 48, - "end": 54, - "elements": [ - { - "type": "Literal", - "type": "Literal", - "start": 49, - "end": 50, - "value": 1, - "raw": "1" - }, - { - "type": "Literal", - "type": "Literal", - "start": 52, - "end": 53, - "value": 1, - "raw": "1" - } - ] - }, - { - "type": "PipeSubstitution", - "type": "PipeSubstitution", - "start": 56, - "end": 57 - } - ], - "optional": false - }, - { - "type": "CallExpression", - "type": "CallExpression", - "start": 62, - "end": 70, - "callee": { - "type": "Identifier", - "start": 62, - "end": 67, - "name": "close" - }, - "arguments": [ - { - "type": "PipeSubstitution", - "type": "PipeSubstitution", - "start": 68, - "end": 69 - } - ], - "optional": false - } - ] - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ah.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ah.snap deleted file mode 100644 index 75bc946c5..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ah.snap +++ /dev/null @@ -1,52 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 30, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 30, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 30, - "id": { - "type": "Identifier", - "start": 6, - "end": 11, - "name": "myBox" - }, - "init": { - "type": "CallExpression", - "type": "CallExpression", - "start": 14, - "end": 30, - "callee": { - "type": "Identifier", - "start": 14, - "end": 27, - "name": "startSketchAt" - }, - "arguments": [ - { - "type": "Identifier", - "type": "Identifier", - "start": 28, - "end": 29, - "name": "p" - } - ], - "optional": false - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ai.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ai.snap deleted file mode 100644 index 1378bd032..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ai.snap +++ /dev/null @@ -1,90 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 29, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 29, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 29, - "id": { - "type": "Identifier", - "start": 6, - "end": 11, - "name": "myBox" - }, - "init": { - "type": "PipeExpression", - "type": "PipeExpression", - "start": 14, - "end": 29, - "body": [ - { - "type": "CallExpression", - "type": "CallExpression", - "start": 14, - "end": 18, - "callee": { - "type": "Identifier", - "start": 14, - "end": 15, - "name": "f" - }, - "arguments": [ - { - "type": "Literal", - "type": "Literal", - "start": 16, - "end": 17, - "value": 1, - "raw": "1" - } - ], - "optional": false - }, - { - "type": "CallExpression", - "type": "CallExpression", - "start": 22, - "end": 29, - "callee": { - "type": "Identifier", - "start": 22, - "end": 23, - "name": "g" - }, - "arguments": [ - { - "type": "Literal", - "type": "Literal", - "start": 24, - "end": 25, - "value": 2, - "raw": "2" - }, - { - "type": "PipeSubstitution", - "type": "PipeSubstitution", - "start": 27, - "end": 28 - } - ], - "optional": false - } - ] - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aj.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aj.snap deleted file mode 100644 index 5e38805db..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aj.snap +++ /dev/null @@ -1,104 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 49, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 49, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 49, - "id": { - "type": "Identifier", - "start": 6, - "end": 11, - "name": "myBox" - }, - "init": { - "type": "PipeExpression", - "type": "PipeExpression", - "start": 14, - "end": 49, - "body": [ - { - "type": "CallExpression", - "type": "CallExpression", - "start": 14, - "end": 30, - "callee": { - "type": "Identifier", - "start": 14, - "end": 27, - "name": "startSketchAt" - }, - "arguments": [ - { - "type": "Identifier", - "type": "Identifier", - "start": 28, - "end": 29, - "name": "p" - } - ], - "optional": false - }, - { - "type": "CallExpression", - "type": "CallExpression", - "start": 34, - "end": 49, - "callee": { - "type": "Identifier", - "start": 34, - "end": 38, - "name": "line" - }, - "arguments": [ - { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 39, - "end": 45, - "elements": [ - { - "type": "Literal", - "type": "Literal", - "start": 40, - "end": 41, - "value": 0, - "raw": "0" - }, - { - "type": "Identifier", - "type": "Identifier", - "start": 43, - "end": 44, - "name": "l" - } - ] - }, - { - "type": "PipeSubstitution", - "type": "PipeSubstitution", - "start": 47, - "end": 48 - } - ], - "optional": false - } - ] - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ap.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ap.snap deleted file mode 100644 index 5f41b2f23..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ap.snap +++ /dev/null @@ -1,69 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 37, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 37, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 37, - "id": { - "type": "Identifier", - "start": 6, - "end": 14, - "name": "mySketch" - }, - "init": { - "type": "CallExpression", - "type": "CallExpression", - "start": 17, - "end": 37, - "callee": { - "type": "Identifier", - "start": 17, - "end": 30, - "name": "startSketchAt" - }, - "arguments": [ - { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 31, - "end": 36, - "elements": [ - { - "type": "Literal", - "type": "Literal", - "start": 32, - "end": 33, - "value": 0, - "raw": "0" - }, - { - "type": "Literal", - "type": "Literal", - "start": 34, - "end": 35, - "value": 0, - "raw": "0" - } - ] - } - ], - "optional": false - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__au.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__au.snap deleted file mode 100644 index 5e5e05a1f..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__au.snap +++ /dev/null @@ -1,173 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 108, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 107, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 107, - "id": { - "type": "Identifier", - "start": 6, - "end": 14, - "name": "cylinder" - }, - "init": { - "type": "PipeExpression", - "type": "PipeExpression", - "start": 17, - "end": 107, - "body": [ - { - "type": "CallExpression", - "type": "CallExpression", - "start": 17, - "end": 36, - "callee": { - "type": "Identifier", - "start": 17, - "end": 30, - "name": "startSketchOn" - }, - "arguments": [ - { - "type": "Literal", - "type": "Literal", - "start": 31, - "end": 35, - "value": "XY", - "raw": "'XY'" - } - ], - "optional": false - }, - { - "type": "CallExpression", - "type": "CallExpression", - "start": 44, - "end": 85, - "callee": { - "type": "Identifier", - "start": 44, - "end": 50, - "name": "circle" - }, - "arguments": [ - { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 51, - "end": 81, - "properties": [ - { - "type": "ObjectProperty", - "start": 53, - "end": 67, - "key": { - "type": "Identifier", - "start": 53, - "end": 59, - "name": "center" - }, - "value": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 61, - "end": 67, - "elements": [ - { - "type": "Literal", - "type": "Literal", - "start": 62, - "end": 63, - "value": 0, - "raw": "0" - }, - { - "type": "Literal", - "type": "Literal", - "start": 65, - "end": 66, - "value": 0, - "raw": "0" - } - ] - } - }, - { - "type": "ObjectProperty", - "start": 69, - "end": 79, - "key": { - "type": "Identifier", - "start": 69, - "end": 75, - "name": "radius" - }, - "value": { - "type": "Literal", - "type": "Literal", - "start": 77, - "end": 79, - "value": 22, - "raw": "22" - } - } - ] - }, - { - "type": "PipeSubstitution", - "type": "PipeSubstitution", - "start": 83, - "end": 84 - } - ], - "optional": false - }, - { - "type": "CallExpression", - "type": "CallExpression", - "start": 93, - "end": 107, - "callee": { - "type": "Identifier", - "start": 93, - "end": 100, - "name": "extrude" - }, - "arguments": [ - { - "type": "Literal", - "type": "Literal", - "start": 101, - "end": 103, - "value": 14, - "raw": "14" - }, - { - "type": "PipeSubstitution", - "type": "PipeSubstitution", - "start": 105, - "end": 106 - } - ], - "optional": false - } - ] - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__av.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__av.snap deleted file mode 100644 index a2b0b3ace..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__av.snap +++ /dev/null @@ -1,90 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 49, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 49, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 3, - "end": 49, - "id": { - "type": "Identifier", - "start": 3, - "end": 4, - "name": "f" - }, - "init": { - "type": "FunctionExpression", - "type": "FunctionExpression", - "start": 7, - "end": 49, - "params": [ - { - "type": "Parameter", - "identifier": { - "type": "Identifier", - "start": 8, - "end": 13, - "name": "angle" - }, - "optional": true - } - ], - "body": { - "start": 19, - "end": 49, - "body": [ - { - "type": "ReturnStatement", - "type": "ReturnStatement", - "start": 21, - "end": 47, - "argument": { - "type": "CallExpression", - "type": "CallExpression", - "start": 28, - "end": 47, - "callee": { - "type": "Identifier", - "start": 28, - "end": 35, - "name": "default" - }, - "arguments": [ - { - "type": "Identifier", - "type": "Identifier", - "start": 36, - "end": 41, - "name": "angle" - }, - { - "type": "Literal", - "type": "Literal", - "start": 43, - "end": 46, - "value": 360, - "raw": "360" - } - ], - "optional": false - } - } - ] - } - } - } - ], - "kind": "fn" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aw.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aw.snap deleted file mode 100644 index b0136cfce..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aw.snap +++ /dev/null @@ -1,83 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 91, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 91, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 4, - "end": 91, - "id": { - "type": "Identifier", - "start": 4, - "end": 11, - "name": "numbers" - }, - "init": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 14, - "end": 91, - "elements": [ - { - "type": "Literal", - "type": "Literal", - "start": 28, - "end": 29, - "value": 1, - "raw": "1" - }, - { - "type": "Literal", - "type": "Literal", - "start": 79, - "end": 80, - "value": 3, - "raw": "3" - } - ], - "nonCodeMeta": { - "nonCodeNodes": { - "1": [ - { - "type": "NonCodeNode", - "start": 43, - "end": 48, - "value": { - "type": "blockComment", - "value": "A,", - "style": "line" - } - } - ], - "2": [ - { - "type": "NonCodeNode", - "start": 61, - "end": 66, - "value": { - "type": "blockComment", - "value": "B,", - "style": "line" - } - } - ] - }, - "start": [] - } - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ax.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ax.snap deleted file mode 100644 index f3e1a73c7..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ax.snap +++ /dev/null @@ -1,83 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 91, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 91, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 4, - "end": 91, - "id": { - "type": "Identifier", - "start": 4, - "end": 11, - "name": "numbers" - }, - "init": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 14, - "end": 91, - "elements": [ - { - "type": "Literal", - "type": "Literal", - "start": 28, - "end": 29, - "value": 1, - "raw": "1" - }, - { - "type": "Literal", - "type": "Literal", - "start": 43, - "end": 44, - "value": 2, - "raw": "2" - } - ], - "nonCodeMeta": { - "nonCodeNodes": { - "2": [ - { - "type": "NonCodeNode", - "start": 58, - "end": 63, - "value": { - "type": "blockComment", - "value": "A,", - "style": "line" - } - } - ], - "3": [ - { - "type": "NonCodeNode", - "start": 76, - "end": 81, - "value": { - "type": "blockComment", - "value": "B,", - "style": "line" - } - } - ] - }, - "start": [] - } - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ay.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ay.snap deleted file mode 100644 index 5aa896ef5..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ay.snap +++ /dev/null @@ -1,93 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 80, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 80, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 4, - "end": 80, - "id": { - "type": "Identifier", - "start": 4, - "end": 9, - "name": "props" - }, - "init": { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 12, - "end": 80, - "properties": [ - { - "type": "ObjectProperty", - "start": 26, - "end": 30, - "key": { - "type": "Identifier", - "start": 26, - "end": 27, - "name": "a" - }, - "value": { - "type": "Literal", - "type": "Literal", - "start": 29, - "end": 30, - "value": 1, - "raw": "1" - } - }, - { - "type": "ObjectProperty", - "start": 65, - "end": 69, - "key": { - "type": "Identifier", - "start": 65, - "end": 66, - "name": "c" - }, - "value": { - "type": "Literal", - "type": "Literal", - "start": 68, - "end": 69, - "value": 3, - "raw": "3" - } - } - ], - "nonCodeMeta": { - "nonCodeNodes": { - "1": [ - { - "type": "NonCodeNode", - "start": 44, - "end": 52, - "value": { - "type": "blockComment", - "value": "b: 2,", - "style": "line" - } - } - ] - }, - "start": [] - } - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__az.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__az.snap deleted file mode 100644 index 28b28fc24..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__az.snap +++ /dev/null @@ -1,93 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 79, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 79, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 4, - "end": 79, - "id": { - "type": "Identifier", - "start": 4, - "end": 9, - "name": "props" - }, - "init": { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 12, - "end": 79, - "properties": [ - { - "type": "ObjectProperty", - "start": 26, - "end": 30, - "key": { - "type": "Identifier", - "start": 26, - "end": 27, - "name": "a" - }, - "value": { - "type": "Literal", - "type": "Literal", - "start": 29, - "end": 30, - "value": 1, - "raw": "1" - } - }, - { - "type": "ObjectProperty", - "start": 65, - "end": 69, - "key": { - "type": "Identifier", - "start": 65, - "end": 66, - "name": "c" - }, - "value": { - "type": "Literal", - "type": "Literal", - "start": 68, - "end": 69, - "value": 3, - "raw": "3" - } - } - ], - "nonCodeMeta": { - "nonCodeNodes": { - "1": [ - { - "type": "NonCodeNode", - "start": 44, - "end": 52, - "value": { - "type": "blockComment", - "value": "b: 2,", - "style": "line" - } - } - ] - }, - "start": [] - } - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__b.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__b.snap deleted file mode 100644 index 8360a7369..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__b.snap +++ /dev/null @@ -1,91 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 36, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 36, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 36, - "id": { - "type": "Identifier", - "start": 6, - "end": 11, - "name": "myVar" - }, - "init": { - "type": "CallExpression", - "type": "CallExpression", - "start": 14, - "end": 36, - "callee": { - "type": "Identifier", - "start": 14, - "end": 17, - "name": "min" - }, - "arguments": [ - { - "type": "Literal", - "type": "Literal", - "start": 18, - "end": 19, - "value": 5, - "raw": "5" - }, - { - "type": "UnaryExpression", - "type": "UnaryExpression", - "start": 22, - "end": 35, - "operator": "-", - "argument": { - "type": "CallExpression", - "type": "CallExpression", - "start": 23, - "end": 35, - "callee": { - "type": "Identifier", - "start": 23, - "end": 29, - "name": "legLen" - }, - "arguments": [ - { - "type": "Literal", - "type": "Literal", - "start": 30, - "end": 31, - "value": 5, - "raw": "5" - }, - { - "type": "Literal", - "type": "Literal", - "start": 33, - "end": 34, - "value": 4, - "raw": "4" - } - ], - "optional": false - } - } - ], - "optional": false - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ba.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ba.snap deleted file mode 100644 index 9b5d26a1b..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ba.snap +++ /dev/null @@ -1,129 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 133, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 1, - "end": 132, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 7, - "end": 132, - "id": { - "type": "Identifier", - "start": 7, - "end": 16, - "name": "sketch001" - }, - "init": { - "type": "PipeExpression", - "type": "PipeExpression", - "start": 19, - "end": 132, - "body": [ - { - "type": "CallExpression", - "type": "CallExpression", - "start": 19, - "end": 38, - "callee": { - "type": "Identifier", - "start": 19, - "end": 32, - "name": "startSketchOn" - }, - "arguments": [ - { - "type": "Literal", - "type": "Literal", - "start": 33, - "end": 37, - "value": "XY", - "raw": "'XY'" - } - ], - "optional": false - }, - { - "type": "CallExpression", - "type": "CallExpression", - "start": 115, - "end": 132, - "callee": { - "type": "Identifier", - "start": 115, - "end": 129, - "name": "startProfileAt" - }, - "arguments": [ - { - "type": "PipeSubstitution", - "type": "PipeSubstitution", - "start": 130, - "end": 131 - } - ], - "optional": false - } - ], - "nonCodeMeta": { - "nonCodeNodes": { - "0": [ - { - "type": "NonCodeNode", - "start": 41, - "end": 52, - "value": { - "type": "blockComment", - "value": "|> arc({", - "style": "line" - } - }, - { - "type": "NonCodeNode", - "start": 55, - "end": 74, - "value": { - "type": "blockComment", - "value": "angleEnd: 270,", - "style": "line" - } - }, - { - "type": "NonCodeNode", - "start": 77, - "end": 98, - "value": { - "type": "blockComment", - "value": "angleStart: 450,", - "style": "line" - } - }, - { - "type": "NonCodeNode", - "start": 101, - "end": 109, - "value": { - "type": "blockComment", - "value": "}, %)", - "style": "line" - } - } - ] - }, - "start": [] - } - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bb.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bb.snap deleted file mode 100644 index 1bec34927..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bb.snap +++ /dev/null @@ -1,98 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 32, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 1, - "end": 31, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 7, - "end": 31, - "id": { - "type": "Identifier", - "start": 7, - "end": 11, - "name": "my14" - }, - "init": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 14, - "end": 31, - "operator": "-", - "left": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 14, - "end": 19, - "operator": "^", - "left": { - "type": "Literal", - "type": "Literal", - "start": 14, - "end": 15, - "value": 4, - "raw": "4" - }, - "right": { - "type": "Literal", - "type": "Literal", - "start": 18, - "end": 19, - "value": 2, - "raw": "2" - } - }, - "right": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 22, - "end": 31, - "operator": "*", - "left": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 22, - "end": 27, - "operator": "^", - "left": { - "type": "Literal", - "type": "Literal", - "start": 22, - "end": 23, - "value": 3, - "raw": "3" - }, - "right": { - "type": "Literal", - "type": "Literal", - "start": 26, - "end": 27, - "value": 2, - "raw": "2" - } - }, - "right": { - "type": "Literal", - "type": "Literal", - "start": 30, - "end": 31, - "value": 2, - "raw": "2" - } - } - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bc.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bc.snap deleted file mode 100644 index 25bea0567..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bc.snap +++ /dev/null @@ -1,86 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 74, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 74, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 74, - "id": { - "type": "Identifier", - "start": 6, - "end": 7, - "name": "x" - }, - "init": { - "type": "IfExpression", - "type": "IfExpression", - "start": 10, - "end": 74, - "cond": { - "type": "Literal", - "type": "Literal", - "start": 13, - "end": 17, - "value": true, - "raw": "true" - }, - "then_val": { - "start": 32, - "end": 42, - "body": [ - { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 32, - "end": 33, - "expression": { - "type": "Literal", - "type": "Literal", - "start": 32, - "end": 33, - "value": 3, - "raw": "3" - } - } - ] - }, - "else_ifs": [], - "final_else": { - "start": 63, - "end": 73, - "body": [ - { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 63, - "end": 64, - "expression": { - "type": "Literal", - "type": "Literal", - "start": 63, - "end": 64, - "value": 4, - "raw": "4" - } - } - ] - }, - "digest": null - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bd.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bd.snap deleted file mode 100644 index 42254d3fd..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bd.snap +++ /dev/null @@ -1,135 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 121, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 121, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 121, - "id": { - "type": "Identifier", - "start": 6, - "end": 7, - "name": "x" - }, - "init": { - "type": "IfExpression", - "type": "IfExpression", - "start": 10, - "end": 121, - "cond": { - "type": "Literal", - "type": "Literal", - "start": 13, - "end": 17, - "value": true, - "raw": "true" - }, - "then_val": { - "start": 32, - "end": 42, - "body": [ - { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 32, - "end": 33, - "expression": { - "type": "Literal", - "type": "Literal", - "start": 32, - "end": 33, - "value": 3, - "raw": "3" - } - } - ] - }, - "else_ifs": [ - { - "type": "ElseIf", - "start": 44, - "end": 90, - "cond": { - "type": "CallExpression", - "type": "CallExpression", - "start": 52, - "end": 64, - "callee": { - "type": "Identifier", - "start": 52, - "end": 56, - "name": "func" - }, - "arguments": [ - { - "type": "Identifier", - "type": "Identifier", - "start": 57, - "end": 63, - "name": "radius" - } - ], - "optional": false - }, - "then_val": { - "start": 65, - "end": 89, - "body": [ - { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 79, - "end": 80, - "expression": { - "type": "Literal", - "type": "Literal", - "start": 79, - "end": 80, - "value": 4, - "raw": "4" - } - } - ] - }, - "digest": null - } - ], - "final_else": { - "start": 110, - "end": 120, - "body": [ - { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 110, - "end": 111, - "expression": { - "type": "Literal", - "type": "Literal", - "start": 110, - "end": 111, - "value": 5, - "raw": "5" - } - } - ] - }, - "digest": null - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__be.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__be.snap deleted file mode 100644 index 6753e459d..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__be.snap +++ /dev/null @@ -1,53 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 14, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 14, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 4, - "end": 14, - "id": { - "type": "Identifier", - "start": 4, - "end": 5, - "name": "x" - }, - "init": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 8, - "end": 14, - "operator": "==", - "left": { - "type": "Literal", - "type": "Literal", - "start": 8, - "end": 9, - "value": 3, - "raw": "3" - }, - "right": { - "type": "Literal", - "type": "Literal", - "start": 13, - "end": 14, - "value": 3, - "raw": "3" - } - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bf.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bf.snap deleted file mode 100644 index 3cd6916f6..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bf.snap +++ /dev/null @@ -1,53 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 14, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 14, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 4, - "end": 14, - "id": { - "type": "Identifier", - "start": 4, - "end": 5, - "name": "x" - }, - "init": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 8, - "end": 14, - "operator": "!=", - "left": { - "type": "Literal", - "type": "Literal", - "start": 8, - "end": 9, - "value": 3, - "raw": "3" - }, - "right": { - "type": "Literal", - "type": "Literal", - "start": 13, - "end": 14, - "value": 3, - "raw": "3" - } - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bg.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bg.snap deleted file mode 100644 index 86e134846..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bg.snap +++ /dev/null @@ -1,38 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 5, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 5, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 0, - "end": 5, - "id": { - "type": "Identifier", - "start": 0, - "end": 1, - "name": "x" - }, - "init": { - "type": "Literal", - "type": "Literal", - "start": 4, - "end": 5, - "value": 4, - "raw": "4" - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bh.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bh.snap deleted file mode 100644 index 3a2670ced..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bh.snap +++ /dev/null @@ -1,92 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 42, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 42, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 42, - "id": { - "type": "Identifier", - "start": 6, - "end": 9, - "name": "obj" - }, - "init": { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 12, - "end": 42, - "properties": [ - { - "type": "ObjectProperty", - "start": 13, - "end": 30, - "key": { - "type": "Identifier", - "start": 13, - "end": 19, - "name": "center" - }, - "value": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 22, - "end": 30, - "elements": [ - { - "type": "Literal", - "type": "Literal", - "start": 23, - "end": 25, - "value": 10, - "raw": "10" - }, - { - "type": "Literal", - "type": "Literal", - "start": 27, - "end": 29, - "value": 10, - "raw": "10" - } - ] - } - }, - { - "type": "ObjectProperty", - "start": 32, - "end": 41, - "key": { - "type": "Identifier", - "start": 32, - "end": 38, - "name": "radius" - }, - "value": { - "type": "Literal", - "type": "Literal", - "start": 40, - "end": 41, - "value": 5, - "raw": "5" - } - } - ] - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__c.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__c.snap deleted file mode 100644 index 919a7cae5..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__c.snap +++ /dev/null @@ -1,91 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 35, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 35, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 35, - "id": { - "type": "Identifier", - "start": 6, - "end": 11, - "name": "myVar" - }, - "init": { - "type": "CallExpression", - "type": "CallExpression", - "start": 14, - "end": 35, - "callee": { - "type": "Identifier", - "start": 14, - "end": 17, - "name": "min" - }, - "arguments": [ - { - "type": "UnaryExpression", - "type": "UnaryExpression", - "start": 18, - "end": 31, - "operator": "-", - "argument": { - "type": "CallExpression", - "type": "CallExpression", - "start": 19, - "end": 31, - "callee": { - "type": "Identifier", - "start": 19, - "end": 25, - "name": "legLen" - }, - "arguments": [ - { - "type": "Literal", - "type": "Literal", - "start": 26, - "end": 27, - "value": 5, - "raw": "5" - }, - { - "type": "Literal", - "type": "Literal", - "start": 29, - "end": 30, - "value": 4, - "raw": "4" - } - ], - "optional": false - } - }, - { - "type": "Literal", - "type": "Literal", - "start": 33, - "end": 34, - "value": 5, - "raw": "5" - } - ], - "optional": false - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__d.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__d.snap deleted file mode 100644 index bf9c494f1..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__d.snap +++ /dev/null @@ -1,90 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 36, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 36, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 36, - "id": { - "type": "Identifier", - "start": 6, - "end": 11, - "name": "myVar" - }, - "init": { - "type": "PipeExpression", - "type": "PipeExpression", - "start": 14, - "end": 36, - "body": [ - { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 14, - "end": 19, - "operator": "+", - "left": { - "type": "Literal", - "type": "Literal", - "start": 14, - "end": 15, - "value": 5, - "raw": "5" - }, - "right": { - "type": "Literal", - "type": "Literal", - "start": 18, - "end": 19, - "value": 6, - "raw": "6" - } - }, - { - "type": "CallExpression", - "type": "CallExpression", - "start": 23, - "end": 36, - "callee": { - "type": "Identifier", - "start": 23, - "end": 29, - "name": "myFunc" - }, - "arguments": [ - { - "type": "Literal", - "type": "Literal", - "start": 30, - "end": 32, - "value": 45, - "raw": "45" - }, - { - "type": "PipeSubstitution", - "type": "PipeSubstitution", - "start": 34, - "end": 35 - } - ], - "optional": false - } - ] - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__d2.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__d2.snap deleted file mode 100644 index 6491695a4..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__d2.snap +++ /dev/null @@ -1,58 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 27, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 27, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 27, - "id": { - "type": "Identifier", - "start": 6, - "end": 7, - "name": "x" - }, - "init": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 10, - "end": 27, - "operator": "+", - "left": { - "type": "UnaryExpression", - "type": "UnaryExpression", - "start": 10, - "end": 15, - "operator": "-", - "argument": { - "type": "Identifier", - "type": "Identifier", - "start": 11, - "end": 15, - "name": "leg2" - } - }, - "right": { - "type": "Identifier", - "type": "Identifier", - "start": 18, - "end": 27, - "name": "thickness" - } - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__e.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__e.snap deleted file mode 100644 index 112a03ee6..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__e.snap +++ /dev/null @@ -1,68 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 18, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 18, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 4, - "end": 18, - "id": { - "type": "Identifier", - "start": 4, - "end": 5, - "name": "x" - }, - "init": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 8, - "end": 18, - "operator": "*", - "left": { - "type": "Literal", - "type": "Literal", - "start": 8, - "end": 9, - "value": 1, - "raw": "1" - }, - "right": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 13, - "end": 18, - "operator": "-", - "left": { - "type": "Literal", - "type": "Literal", - "start": 13, - "end": 14, - "value": 3, - "raw": "3" - }, - "right": { - "type": "Literal", - "type": "Literal", - "start": 17, - "end": 18, - "value": 4, - "raw": "4" - } - } - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__f.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__f.snap deleted file mode 100644 index 89ef278bb..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__f.snap +++ /dev/null @@ -1,55 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 40, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 11, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 11, - "id": { - "type": "Identifier", - "start": 6, - "end": 7, - "name": "x" - }, - "init": { - "type": "Literal", - "type": "Literal", - "start": 10, - "end": 11, - "value": 1, - "raw": "1" - } - } - ], - "kind": "const" - } - ], - "nonCodeMeta": { - "nonCodeNodes": { - "0": [ - { - "type": "NonCodeNode", - "start": 11, - "end": 40, - "value": { - "type": "inlineComment", - "value": "this is an inline comment", - "style": "line" - } - } - ] - }, - "start": [] - } -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__g.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__g.snap deleted file mode 100644 index 6cd8f1424..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__g.snap +++ /dev/null @@ -1,69 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 58, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 58, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 3, - "end": 58, - "id": { - "type": "Identifier", - "start": 3, - "end": 4, - "name": "x" - }, - "init": { - "type": "FunctionExpression", - "type": "FunctionExpression", - "start": 7, - "end": 58, - "params": [], - "body": { - "start": 13, - "end": 58, - "body": [ - { - "type": "ReturnStatement", - "type": "ReturnStatement", - "start": 23, - "end": 32, - "argument": { - "type": "Identifier", - "type": "Identifier", - "start": 30, - "end": 32, - "name": "sg" - } - }, - { - "type": "ReturnStatement", - "type": "ReturnStatement", - "start": 41, - "end": 50, - "argument": { - "type": "Identifier", - "type": "Identifier", - "start": 48, - "end": 50, - "name": "sg" - } - } - ] - } - } - } - ], - "kind": "fn" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__h.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__h.snap deleted file mode 100644 index 53266e6f6..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__h.snap +++ /dev/null @@ -1,132 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 55, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 26, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 26, - "id": { - "type": "Identifier", - "start": 6, - "end": 9, - "name": "obj" - }, - "init": { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 12, - "end": 26, - "properties": [ - { - "type": "ObjectProperty", - "start": 14, - "end": 18, - "key": { - "type": "Identifier", - "start": 14, - "end": 15, - "name": "a" - }, - "value": { - "type": "Literal", - "type": "Literal", - "start": 17, - "end": 18, - "value": 1, - "raw": "1" - } - }, - { - "type": "ObjectProperty", - "start": 20, - "end": 24, - "key": { - "type": "Identifier", - "start": 20, - "end": 21, - "name": "b" - }, - "value": { - "type": "Literal", - "type": "Literal", - "start": 23, - "end": 24, - "value": 2, - "raw": "2" - } - } - ] - } - } - ], - "kind": "const" - }, - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 31, - "end": 55, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 37, - "end": 55, - "id": { - "type": "Identifier", - "start": 37, - "end": 43, - "name": "height" - }, - "init": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 46, - "end": 55, - "operator": "-", - "left": { - "type": "Literal", - "type": "Literal", - "start": 46, - "end": 47, - "value": 1, - "raw": "1" - }, - "right": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 50, - "end": 55, - "object": { - "type": "Identifier", - "type": "Identifier", - "start": 50, - "end": 53, - "name": "obj" - }, - "property": { - "type": "Identifier", - "type": "Identifier", - "start": 54, - "end": 55, - "name": "a" - }, - "computed": false - } - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__i.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__i.snap deleted file mode 100644 index 1941a0f05..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__i.snap +++ /dev/null @@ -1,133 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 59, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 26, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 26, - "id": { - "type": "Identifier", - "start": 6, - "end": 9, - "name": "obj" - }, - "init": { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 12, - "end": 26, - "properties": [ - { - "type": "ObjectProperty", - "start": 14, - "end": 18, - "key": { - "type": "Identifier", - "start": 14, - "end": 15, - "name": "a" - }, - "value": { - "type": "Literal", - "type": "Literal", - "start": 17, - "end": 18, - "value": 1, - "raw": "1" - } - }, - { - "type": "ObjectProperty", - "start": 20, - "end": 24, - "key": { - "type": "Identifier", - "start": 20, - "end": 21, - "name": "b" - }, - "value": { - "type": "Literal", - "type": "Literal", - "start": 23, - "end": 24, - "value": 2, - "raw": "2" - } - } - ] - } - } - ], - "kind": "const" - }, - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 32, - "end": 59, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 38, - "end": 59, - "id": { - "type": "Identifier", - "start": 38, - "end": 44, - "name": "height" - }, - "init": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 47, - "end": 59, - "operator": "-", - "left": { - "type": "Literal", - "type": "Literal", - "start": 47, - "end": 48, - "value": 1, - "raw": "1" - }, - "right": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 51, - "end": 59, - "object": { - "type": "Identifier", - "type": "Identifier", - "start": 51, - "end": 54, - "name": "obj" - }, - "property": { - "type": "Literal", - "type": "Literal", - "start": 55, - "end": 58, - "value": "a", - "raw": "\"a\"" - }, - "computed": false - } - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__j.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__j.snap deleted file mode 100644 index 33f2471c5..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__j.snap +++ /dev/null @@ -1,133 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 58, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 26, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 26, - "id": { - "type": "Identifier", - "start": 6, - "end": 9, - "name": "obj" - }, - "init": { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 12, - "end": 26, - "properties": [ - { - "type": "ObjectProperty", - "start": 14, - "end": 18, - "key": { - "type": "Identifier", - "start": 14, - "end": 15, - "name": "a" - }, - "value": { - "type": "Literal", - "type": "Literal", - "start": 17, - "end": 18, - "value": 1, - "raw": "1" - } - }, - { - "type": "ObjectProperty", - "start": 20, - "end": 24, - "key": { - "type": "Identifier", - "start": 20, - "end": 21, - "name": "b" - }, - "value": { - "type": "Literal", - "type": "Literal", - "start": 23, - "end": 24, - "value": 2, - "raw": "2" - } - } - ] - } - } - ], - "kind": "const" - }, - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 31, - "end": 58, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 37, - "end": 58, - "id": { - "type": "Identifier", - "start": 37, - "end": 43, - "name": "height" - }, - "init": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 46, - "end": 58, - "operator": "-", - "left": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 46, - "end": 54, - "object": { - "type": "Identifier", - "type": "Identifier", - "start": 46, - "end": 49, - "name": "obj" - }, - "property": { - "type": "Literal", - "type": "Literal", - "start": 50, - "end": 53, - "value": "a", - "raw": "\"a\"" - }, - "computed": false - }, - "right": { - "type": "Literal", - "type": "Literal", - "start": 57, - "end": 58, - "value": 1, - "raw": "1" - } - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__k.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__k.snap deleted file mode 100644 index 8b121009b..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__k.snap +++ /dev/null @@ -1,149 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 63, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 26, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 26, - "id": { - "type": "Identifier", - "start": 6, - "end": 9, - "name": "obj" - }, - "init": { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 12, - "end": 26, - "properties": [ - { - "type": "ObjectProperty", - "start": 14, - "end": 18, - "key": { - "type": "Identifier", - "start": 14, - "end": 15, - "name": "a" - }, - "value": { - "type": "Literal", - "type": "Literal", - "start": 17, - "end": 18, - "value": 1, - "raw": "1" - } - }, - { - "type": "ObjectProperty", - "start": 20, - "end": 24, - "key": { - "type": "Identifier", - "start": 20, - "end": 21, - "name": "b" - }, - "value": { - "type": "Literal", - "type": "Literal", - "start": 23, - "end": 24, - "value": 2, - "raw": "2" - } - } - ] - } - } - ], - "kind": "const" - }, - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 31, - "end": 63, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 37, - "end": 63, - "id": { - "type": "Identifier", - "start": 37, - "end": 43, - "name": "height" - }, - "init": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 46, - "end": 63, - "elements": [ - { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 47, - "end": 59, - "operator": "-", - "left": { - "type": "Literal", - "type": "Literal", - "start": 47, - "end": 48, - "value": 1, - "raw": "1" - }, - "right": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 51, - "end": 59, - "object": { - "type": "Identifier", - "type": "Identifier", - "start": 51, - "end": 54, - "name": "obj" - }, - "property": { - "type": "Literal", - "type": "Literal", - "start": 55, - "end": 58, - "value": "a", - "raw": "\"a\"" - }, - "computed": false - } - }, - { - "type": "Literal", - "type": "Literal", - "start": 61, - "end": 62, - "value": 0, - "raw": "0" - } - ] - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__l.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__l.snap deleted file mode 100644 index 025500972..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__l.snap +++ /dev/null @@ -1,149 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 63, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 26, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 26, - "id": { - "type": "Identifier", - "start": 6, - "end": 9, - "name": "obj" - }, - "init": { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 12, - "end": 26, - "properties": [ - { - "type": "ObjectProperty", - "start": 14, - "end": 18, - "key": { - "type": "Identifier", - "start": 14, - "end": 15, - "name": "a" - }, - "value": { - "type": "Literal", - "type": "Literal", - "start": 17, - "end": 18, - "value": 1, - "raw": "1" - } - }, - { - "type": "ObjectProperty", - "start": 20, - "end": 24, - "key": { - "type": "Identifier", - "start": 20, - "end": 21, - "name": "b" - }, - "value": { - "type": "Literal", - "type": "Literal", - "start": 23, - "end": 24, - "value": 2, - "raw": "2" - } - } - ] - } - } - ], - "kind": "const" - }, - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 31, - "end": 63, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 37, - "end": 63, - "id": { - "type": "Identifier", - "start": 37, - "end": 43, - "name": "height" - }, - "init": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 46, - "end": 63, - "elements": [ - { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 47, - "end": 59, - "operator": "-", - "left": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 47, - "end": 55, - "object": { - "type": "Identifier", - "type": "Identifier", - "start": 47, - "end": 50, - "name": "obj" - }, - "property": { - "type": "Literal", - "type": "Literal", - "start": 51, - "end": 54, - "value": "a", - "raw": "\"a\"" - }, - "computed": false - }, - "right": { - "type": "Literal", - "type": "Literal", - "start": 58, - "end": 59, - "value": 1, - "raw": "1" - } - }, - { - "type": "Literal", - "type": "Literal", - "start": 61, - "end": 62, - "value": 0, - "raw": "0" - } - ] - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__m.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__m.snap deleted file mode 100644 index ae0c54f37..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__m.snap +++ /dev/null @@ -1,149 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 62, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 26, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 26, - "id": { - "type": "Identifier", - "start": 6, - "end": 9, - "name": "obj" - }, - "init": { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 12, - "end": 26, - "properties": [ - { - "type": "ObjectProperty", - "start": 14, - "end": 18, - "key": { - "type": "Identifier", - "start": 14, - "end": 15, - "name": "a" - }, - "value": { - "type": "Literal", - "type": "Literal", - "start": 17, - "end": 18, - "value": 1, - "raw": "1" - } - }, - { - "type": "ObjectProperty", - "start": 20, - "end": 24, - "key": { - "type": "Identifier", - "start": 20, - "end": 21, - "name": "b" - }, - "value": { - "type": "Literal", - "type": "Literal", - "start": 23, - "end": 24, - "value": 2, - "raw": "2" - } - } - ] - } - } - ], - "kind": "const" - }, - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 31, - "end": 62, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 37, - "end": 62, - "id": { - "type": "Identifier", - "start": 37, - "end": 43, - "name": "height" - }, - "init": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 46, - "end": 62, - "elements": [ - { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 47, - "end": 58, - "operator": "-", - "left": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 47, - "end": 55, - "object": { - "type": "Identifier", - "type": "Identifier", - "start": 47, - "end": 50, - "name": "obj" - }, - "property": { - "type": "Literal", - "type": "Literal", - "start": 51, - "end": 54, - "value": "a", - "raw": "\"a\"" - }, - "computed": false - }, - "right": { - "type": "Literal", - "type": "Literal", - "start": 57, - "end": 58, - "value": 1, - "raw": "1" - } - }, - { - "type": "Literal", - "type": "Literal", - "start": 60, - "end": 61, - "value": 0, - "raw": "0" - } - ] - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__n.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__n.snap deleted file mode 100644 index 950ea3821..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__n.snap +++ /dev/null @@ -1,66 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 24, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 24, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 24, - "id": { - "type": "Identifier", - "start": 6, - "end": 12, - "name": "height" - }, - "init": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 15, - "end": 24, - "operator": "-", - "left": { - "type": "Literal", - "type": "Literal", - "start": 15, - "end": 16, - "value": 1, - "raw": "1" - }, - "right": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 19, - "end": 24, - "object": { - "type": "Identifier", - "type": "Identifier", - "start": 19, - "end": 22, - "name": "obj" - }, - "property": { - "type": "Identifier", - "type": "Identifier", - "start": 23, - "end": 24, - "name": "a" - }, - "computed": false - } - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__o.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__o.snap deleted file mode 100644 index 6f8d4ecd2..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__o.snap +++ /dev/null @@ -1,68 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 21, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 21, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 21, - "id": { - "type": "Identifier", - "start": 6, - "end": 9, - "name": "six" - }, - "init": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 12, - "end": 21, - "operator": "+", - "left": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 12, - "end": 17, - "operator": "+", - "left": { - "type": "Literal", - "type": "Literal", - "start": 12, - "end": 13, - "value": 1, - "raw": "1" - }, - "right": { - "type": "Literal", - "type": "Literal", - "start": 16, - "end": 17, - "value": 2, - "raw": "2" - } - }, - "right": { - "type": "Literal", - "type": "Literal", - "start": 20, - "end": 21, - "value": 3, - "raw": "3" - } - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__p.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__p.snap deleted file mode 100644 index fe39368e2..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__p.snap +++ /dev/null @@ -1,68 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 22, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 22, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 22, - "id": { - "type": "Identifier", - "start": 6, - "end": 10, - "name": "five" - }, - "init": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 13, - "end": 22, - "operator": "+", - "left": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 13, - "end": 18, - "operator": "*", - "left": { - "type": "Literal", - "type": "Literal", - "start": 13, - "end": 14, - "value": 3, - "raw": "3" - }, - "right": { - "type": "Literal", - "type": "Literal", - "start": 17, - "end": 18, - "value": 1, - "raw": "1" - } - }, - "right": { - "type": "Literal", - "type": "Literal", - "start": 21, - "end": 22, - "value": 2, - "raw": "2" - } - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__q.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__q.snap deleted file mode 100644 index 988bd42e8..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__q.snap +++ /dev/null @@ -1,68 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 30, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 30, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 30, - "id": { - "type": "Identifier", - "start": 6, - "end": 12, - "name": "height" - }, - "init": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 15, - "end": 30, - "elements": [ - { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 17, - "end": 25, - "object": { - "type": "Identifier", - "type": "Identifier", - "start": 17, - "end": 20, - "name": "obj" - }, - "property": { - "type": "Literal", - "type": "Literal", - "start": 21, - "end": 24, - "value": "a", - "raw": "\"a\"" - }, - "computed": false - }, - { - "type": "Literal", - "type": "Literal", - "start": 27, - "end": 28, - "value": 0, - "raw": "0" - } - ] - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__r.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__r.snap deleted file mode 100644 index dcd81fc02..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__r.snap +++ /dev/null @@ -1,118 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 54, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 26, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 26, - "id": { - "type": "Identifier", - "start": 6, - "end": 9, - "name": "obj" - }, - "init": { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 12, - "end": 26, - "properties": [ - { - "type": "ObjectProperty", - "start": 14, - "end": 18, - "key": { - "type": "Identifier", - "start": 14, - "end": 15, - "name": "a" - }, - "value": { - "type": "Literal", - "type": "Literal", - "start": 17, - "end": 18, - "value": 1, - "raw": "1" - } - }, - { - "type": "ObjectProperty", - "start": 20, - "end": 24, - "key": { - "type": "Identifier", - "start": 20, - "end": 21, - "name": "b" - }, - "value": { - "type": "Literal", - "type": "Literal", - "start": 23, - "end": 24, - "value": 2, - "raw": "2" - } - } - ] - } - } - ], - "kind": "const" - }, - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 31, - "end": 54, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 37, - "end": 54, - "id": { - "type": "Identifier", - "start": 37, - "end": 43, - "name": "height" - }, - "init": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 46, - "end": 54, - "object": { - "type": "Identifier", - "type": "Identifier", - "start": 46, - "end": 49, - "name": "obj" - }, - "property": { - "type": "Literal", - "type": "Literal", - "start": 50, - "end": 53, - "value": "a", - "raw": "\"a\"" - }, - "computed": false - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__s.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__s.snap deleted file mode 100644 index b1fcf4172..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__s.snap +++ /dev/null @@ -1,66 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 27, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 27, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 27, - "id": { - "type": "Identifier", - "start": 6, - "end": 10, - "name": "prop" - }, - "init": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 13, - "end": 27, - "object": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 13, - "end": 22, - "object": { - "type": "Identifier", - "type": "Identifier", - "start": 13, - "end": 15, - "name": "yo" - }, - "property": { - "type": "Literal", - "type": "Literal", - "start": 16, - "end": 21, - "value": "one", - "raw": "\"one\"" - }, - "computed": false - }, - "property": { - "type": "Identifier", - "type": "Identifier", - "start": 23, - "end": 26, - "name": "two" - }, - "computed": true - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__t.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__t.snap deleted file mode 100644 index 5ca0946c4..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__t.snap +++ /dev/null @@ -1,51 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 17, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 17, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 17, - "id": { - "type": "Identifier", - "start": 6, - "end": 9, - "name": "pt1" - }, - "init": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 12, - "end": 17, - "object": { - "type": "Identifier", - "type": "Identifier", - "start": 12, - "end": 14, - "name": "b1" - }, - "property": { - "type": "Identifier", - "type": "Identifier", - "start": 15, - "end": 16, - "name": "x" - }, - "computed": true - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__u.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__u.snap deleted file mode 100644 index 298647b2c..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__u.snap +++ /dev/null @@ -1,93 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 34, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 34, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 34, - "id": { - "type": "Identifier", - "start": 6, - "end": 10, - "name": "prop" - }, - "init": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 13, - "end": 34, - "object": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 13, - "end": 29, - "object": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 13, - "end": 23, - "object": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 13, - "end": 19, - "object": { - "type": "Identifier", - "type": "Identifier", - "start": 13, - "end": 15, - "name": "yo" - }, - "property": { - "type": "Identifier", - "type": "Identifier", - "start": 16, - "end": 19, - "name": "one" - }, - "computed": false - }, - "property": { - "type": "Identifier", - "type": "Identifier", - "start": 20, - "end": 23, - "name": "two" - }, - "computed": false - }, - "property": { - "type": "Identifier", - "type": "Identifier", - "start": 24, - "end": 29, - "name": "three" - }, - "computed": false - }, - "property": { - "type": "Identifier", - "type": "Identifier", - "start": 30, - "end": 34, - "name": "four" - }, - "computed": false - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__v.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__v.snap deleted file mode 100644 index 8fe980817..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__v.snap +++ /dev/null @@ -1,52 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 17, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 17, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 17, - "id": { - "type": "Identifier", - "start": 6, - "end": 9, - "name": "pt1" - }, - "init": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 12, - "end": 17, - "object": { - "type": "Identifier", - "type": "Identifier", - "start": 12, - "end": 14, - "name": "b1" - }, - "property": { - "type": "Literal", - "type": "Literal", - "start": 15, - "end": 16, - "value": 0, - "raw": "0" - }, - "computed": false - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__w.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__w.snap deleted file mode 100644 index 4a14cc34a..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__w.snap +++ /dev/null @@ -1,52 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 22, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 22, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 22, - "id": { - "type": "Identifier", - "start": 6, - "end": 9, - "name": "pt1" - }, - "init": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 12, - "end": 22, - "object": { - "type": "Identifier", - "type": "Identifier", - "start": 12, - "end": 14, - "name": "b1" - }, - "property": { - "type": "Literal", - "type": "Literal", - "start": 15, - "end": 21, - "value": "zero", - "raw": "'zero'" - }, - "computed": false - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__x.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__x.snap deleted file mode 100644 index dfa0afcc5..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__x.snap +++ /dev/null @@ -1,51 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 19, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 19, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 19, - "id": { - "type": "Identifier", - "start": 6, - "end": 9, - "name": "pt1" - }, - "init": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 12, - "end": 19, - "object": { - "type": "Identifier", - "type": "Identifier", - "start": 12, - "end": 14, - "name": "b1" - }, - "property": { - "type": "Identifier", - "type": "Identifier", - "start": 15, - "end": 19, - "name": "zero" - }, - "computed": false - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__y.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__y.snap deleted file mode 100644 index 8d7b37232..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__y.snap +++ /dev/null @@ -1,52 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 29, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 29, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 29, - "id": { - "type": "Identifier", - "start": 6, - "end": 8, - "name": "sg" - }, - "init": { - "type": "CallExpression", - "type": "CallExpression", - "start": 11, - "end": 29, - "callee": { - "type": "Identifier", - "start": 11, - "end": 24, - "name": "startSketchAt" - }, - "arguments": [ - { - "type": "Identifier", - "type": "Identifier", - "start": 25, - "end": 28, - "name": "pos" - } - ], - "optional": false - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__z.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__z.snap deleted file mode 100644 index 1e0f9e490..000000000 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__z.snap +++ /dev/null @@ -1,111 +0,0 @@ ---- -source: kcl/src/parser/parser_impl.rs -expression: actual ---- -{ - "start": 0, - "end": 53, - "body": [ - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 53, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 6, - "end": 53, - "id": { - "type": "Identifier", - "start": 6, - "end": 8, - "name": "sg" - }, - "init": { - "type": "PipeExpression", - "type": "PipeExpression", - "start": 11, - "end": 53, - "body": [ - { - "type": "CallExpression", - "type": "CallExpression", - "start": 11, - "end": 29, - "callee": { - "type": "Identifier", - "start": 11, - "end": 24, - "name": "startSketchAt" - }, - "arguments": [ - { - "type": "Identifier", - "type": "Identifier", - "start": 25, - "end": 28, - "name": "pos" - } - ], - "optional": false - }, - { - "type": "CallExpression", - "type": "CallExpression", - "start": 33, - "end": 53, - "callee": { - "type": "Identifier", - "start": 33, - "end": 37, - "name": "line" - }, - "arguments": [ - { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 38, - "end": 49, - "elements": [ - { - "type": "Literal", - "type": "Literal", - "start": 39, - "end": 40, - "value": 0, - "raw": "0" - }, - { - "type": "UnaryExpression", - "type": "UnaryExpression", - "start": 42, - "end": 48, - "operator": "-", - "argument": { - "type": "Identifier", - "type": "Identifier", - "start": 43, - "end": 48, - "name": "scale" - } - } - ] - }, - { - "type": "PipeSubstitution", - "type": "PipeSubstitution", - "start": 51, - "end": 52 - } - ], - "optional": false - } - ] - } - } - ], - "kind": "const" - } - ] -} diff --git a/src/wasm-lib/kcl/src/ast/types/digest.rs b/src/wasm-lib/kcl/src/parsing/ast/digest.rs similarity index 72% rename from src/wasm-lib/kcl/src/ast/types/digest.rs rename to src/wasm-lib/kcl/src/parsing/ast/digest.rs index f7442ee0b..2943c9818 100644 --- a/src/wasm-lib/kcl/src/ast/types/digest.rs +++ b/src/wasm-lib/kcl/src/parsing/ast/digest.rs @@ -1,11 +1,12 @@ use sha2::{Digest as DigestTrait, Sha256}; -use super::{ - ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryPart, BodyItem, CallExpression, ElseIf, Expr, - ExpressionStatement, FnArgType, FunctionExpression, Identifier, IfExpression, ImportItem, ImportStatement, Literal, - LiteralIdentifier, MemberExpression, MemberObject, NonCodeMeta, NonCodeNode, NonCodeValue, ObjectExpression, - ObjectProperty, Parameter, PipeExpression, PipeSubstitution, Program, ReturnStatement, TagDeclarator, - UnaryExpression, VariableDeclaration, VariableDeclarator, +use super::types::{DefaultParamVal, ItemVisibility, LabelledExpression, VariableKind}; +use crate::parsing::ast::types::{ + ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryPart, BodyItem, CallExpression, CallExpressionKw, + ElseIf, Expr, ExpressionStatement, FnArgType, FunctionExpression, Identifier, IfExpression, ImportItem, + ImportSelector, ImportStatement, KclNone, Literal, LiteralIdentifier, MemberExpression, MemberObject, + ObjectExpression, ObjectProperty, Parameter, PipeExpression, PipeSubstitution, Program, ReturnStatement, + TagDeclarator, UnaryExpression, VariableDeclaration, VariableDeclarator, }; /// Position-independent digest of the AST node. @@ -51,9 +52,20 @@ impl ImportItem { impl ImportStatement { compute_digest!(|slf, hasher| { - for item in &mut slf.items { - hasher.update(item.compute_digest()); + match &mut slf.selector { + ImportSelector::List { items } => { + for item in items { + hasher.update(item.compute_digest()); + } + } + ImportSelector::Glob(_) => hasher.update(b"ImportSelector::Glob"), + ImportSelector::None { alias: None } => hasher.update(b"ImportSelector::None"), + ImportSelector::None { alias: Some(alias) } => { + hasher.update(b"ImportSelector::None"); + hasher.update(alias.compute_digest()); + } } + hasher.update(slf.visibility.digestable_id()); let path = slf.path.as_bytes(); hasher.update(path.len().to_ne_bytes()); hasher.update(path); @@ -66,7 +78,9 @@ impl Program { for body_item in slf.body.iter_mut() { hasher.update(body_item.compute_digest()); } - hasher.update(slf.non_code_meta.compute_digest()); + if let Some(shebang) = &slf.shebang { + hasher.update(&shebang.inner.content); + } }); } @@ -90,6 +104,7 @@ impl Expr { Expr::BinaryExpression(be) => be.compute_digest(), Expr::FunctionExpression(fe) => fe.compute_digest(), Expr::CallExpression(ce) => ce.compute_digest(), + Expr::CallExpressionKw(ce) => ce.compute_digest(), Expr::PipeExpression(pe) => pe.compute_digest(), Expr::PipeSubstitution(ps) => ps.compute_digest(), Expr::ArrayExpression(ae) => ae.compute_digest(), @@ -98,6 +113,7 @@ impl Expr { Expr::MemberExpression(me) => me.compute_digest(), Expr::UnaryExpression(ue) => ue.compute_digest(), Expr::IfExpression(e) => e.compute_digest(), + Expr::LabelledExpression(e) => e.compute_digest(), Expr::None(_) => { let mut hasher = Sha256::new(); hasher.update(b"Value::None"); @@ -114,6 +130,7 @@ impl BinaryPart { BinaryPart::Identifier(id) => id.compute_digest(), BinaryPart::BinaryExpression(be) => be.compute_digest(), BinaryPart::CallExpression(ce) => ce.compute_digest(), + BinaryPart::CallExpressionKw(ce) => ce.compute_digest(), BinaryPart::UnaryExpression(ue) => ue.compute_digest(), BinaryPart::MemberExpression(me) => me.compute_digest(), BinaryPart::IfExpression(e) => e.compute_digest(), @@ -163,6 +180,7 @@ impl FnArgType { hasher.finalize().into() } } + impl Parameter { compute_digest!(|slf, hasher| { hasher.update(slf.identifier.compute_digest()); @@ -175,7 +193,17 @@ impl Parameter { hasher.update(b"Parameter::type_::None"); } } - hasher.update(if slf.optional { [1] } else { [0] }) + match slf.default_value { + None => hasher.update(vec![0]), + Some(DefaultParamVal::KclNone(ref _kcl_none)) => hasher.update(vec![1]), + Some(DefaultParamVal::Literal(ref mut literal)) => hasher.update(literal.compute_digest()), + } + }); +} + +impl KclNone { + compute_digest!(|slf, hasher| { + hasher.update(b"KclNone"); }); } @@ -204,47 +232,6 @@ impl ReturnStatement { }); } -impl NonCodeNode { - compute_digest!(|slf, hasher| { - match &slf.value { - NonCodeValue::Shebang { value } => { - hasher.update(value); - } - NonCodeValue::InlineComment { value, style } => { - hasher.update(value); - hasher.update(style.digestable_id()); - } - NonCodeValue::BlockComment { value, style } => { - hasher.update(value); - hasher.update(style.digestable_id()); - } - NonCodeValue::NewLineBlockComment { value, style } => { - hasher.update(value); - hasher.update(style.digestable_id()); - } - NonCodeValue::NewLine => { - hasher.update(b"\r\n"); - } - } - }); -} - -impl NonCodeMeta { - compute_digest!(|slf, hasher| { - let mut keys = slf.non_code_nodes.keys().copied().collect::>(); - keys.sort(); - - for key in keys.into_iter() { - hasher.update(key.to_ne_bytes()); - let nodes = slf.non_code_nodes.get_mut(&key).unwrap(); - hasher.update(nodes.len().to_ne_bytes()); - for node in nodes.iter_mut() { - hasher.update(node.compute_digest()); - } - } - }); -} - impl ExpressionStatement { compute_digest!(|slf, hasher| { hasher.update(slf.expression.compute_digest()); @@ -253,15 +240,30 @@ impl ExpressionStatement { impl VariableDeclaration { compute_digest!(|slf, hasher| { - hasher.update(slf.declarations.len().to_ne_bytes()); - for declarator in &mut slf.declarations { - hasher.update(declarator.compute_digest()); - } + hasher.update(slf.declaration.compute_digest()); hasher.update(slf.visibility.digestable_id()); hasher.update(slf.kind.digestable_id()); }); } +impl VariableKind { + fn digestable_id(&self) -> [u8; 1] { + match self { + VariableKind::Const => [2], + VariableKind::Fn => [3], + } + } +} + +impl ItemVisibility { + fn digestable_id(&self) -> [u8; 1] { + match self { + ItemVisibility::Default => [0], + ItemVisibility::Export => [1], + } + } +} + impl VariableDeclarator { compute_digest!(|slf, hasher| { hasher.update(slf.id.compute_digest()); @@ -352,13 +354,19 @@ impl UnaryExpression { }); } +impl LabelledExpression { + compute_digest!(|slf, hasher| { + hasher.update(slf.expr.compute_digest()); + hasher.update(slf.label.compute_digest()); + }); +} + impl PipeExpression { compute_digest!(|slf, hasher| { hasher.update(slf.body.len().to_ne_bytes()); for value in slf.body.iter_mut() { hasher.update(value.compute_digest()); } - hasher.update(slf.non_code_meta.compute_digest()); }); } @@ -369,7 +377,22 @@ impl CallExpression { for argument in slf.arguments.iter_mut() { hasher.update(argument.compute_digest()); } - hasher.update(if slf.optional { [1] } else { [0] }); + }); +} + +impl CallExpressionKw { + compute_digest!(|slf, hasher| { + hasher.update(slf.callee.compute_digest()); + if let Some(ref mut unlabeled) = slf.unlabeled { + hasher.update(unlabeled.compute_digest()); + } else { + hasher.update("no_unlabeled"); + } + hasher.update(slf.arguments.len().to_ne_bytes()); + for argument in slf.arguments.iter_mut() { + hasher.update(argument.label.compute_digest()); + hasher.update(argument.arg.compute_digest()); + } }); } @@ -389,3 +412,31 @@ impl ElseIf { hasher.update(slf.then_val.compute_digest()); }); } + +#[cfg(test)] +mod test { + #[tokio::test(flavor = "multi_thread")] + async fn test_parse_digest() { + let prog1_string = r#"startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line([5, 5], %) +"#; + let prog1_digest = crate::parsing::top_level_parse(prog1_string).unwrap().compute_digest(); + + let prog2_string = r#"startSketchOn('XY') + |> startProfileAt([0, 2], %) + |> line([5, 5], %) +"#; + let prog2_digest = crate::parsing::top_level_parse(prog2_string).unwrap().compute_digest(); + + assert!(prog1_digest != prog2_digest); + + let prog3_string = r#"startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line([5, 5], %) +"#; + let prog3_digest = crate::parsing::top_level_parse(prog3_string).unwrap().compute_digest(); + + assert_eq!(prog1_digest, prog3_digest); + } +} diff --git a/src/wasm-lib/kcl/src/parsing/ast/mod.rs b/src/wasm-lib/kcl/src/parsing/ast/mod.rs new file mode 100644 index 000000000..0d4248d5d --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/ast/mod.rs @@ -0,0 +1,76 @@ +pub(crate) mod digest; +pub mod modify; +pub mod types; + +use crate::{ + parsing::ast::types::{BinaryPart, BodyItem, Expr, LiteralIdentifier, MemberObject}, + source_range::ModuleId, +}; + +impl BodyItem { + pub fn module_id(&self) -> ModuleId { + match self { + BodyItem::ImportStatement(stmt) => stmt.module_id, + BodyItem::ExpressionStatement(expression_statement) => expression_statement.module_id, + BodyItem::VariableDeclaration(variable_declaration) => variable_declaration.module_id, + BodyItem::ReturnStatement(return_statement) => return_statement.module_id, + } + } +} + +impl Expr { + pub fn module_id(&self) -> ModuleId { + match self { + Expr::Literal(literal) => literal.module_id, + Expr::Identifier(identifier) => identifier.module_id, + Expr::TagDeclarator(tag) => tag.module_id, + Expr::BinaryExpression(binary_expression) => binary_expression.module_id, + Expr::FunctionExpression(function_expression) => function_expression.module_id, + Expr::CallExpression(call_expression) => call_expression.module_id, + Expr::CallExpressionKw(call_expression) => call_expression.module_id, + Expr::PipeExpression(pipe_expression) => pipe_expression.module_id, + Expr::PipeSubstitution(pipe_substitution) => pipe_substitution.module_id, + Expr::ArrayExpression(array_expression) => array_expression.module_id, + Expr::ArrayRangeExpression(array_range) => array_range.module_id, + Expr::ObjectExpression(object_expression) => object_expression.module_id, + Expr::MemberExpression(member_expression) => member_expression.module_id, + Expr::UnaryExpression(unary_expression) => unary_expression.module_id, + Expr::IfExpression(expr) => expr.module_id, + Expr::LabelledExpression(expr) => expr.expr.module_id(), + Expr::None(none) => none.module_id, + } + } +} + +impl BinaryPart { + pub fn module_id(&self) -> ModuleId { + match self { + BinaryPart::Literal(literal) => literal.module_id, + BinaryPart::Identifier(identifier) => identifier.module_id, + BinaryPart::BinaryExpression(binary_expression) => binary_expression.module_id, + BinaryPart::CallExpression(call_expression) => call_expression.module_id, + BinaryPart::CallExpressionKw(call_expression) => call_expression.module_id, + BinaryPart::UnaryExpression(unary_expression) => unary_expression.module_id, + BinaryPart::MemberExpression(member_expression) => member_expression.module_id, + BinaryPart::IfExpression(e) => e.module_id, + } + } +} + +impl MemberObject { + pub fn module_id(&self) -> ModuleId { + match self { + MemberObject::MemberExpression(member_expression) => member_expression.module_id, + MemberObject::Identifier(identifier) => identifier.module_id, + } + } +} + +impl LiteralIdentifier { + pub fn module_id(&self) -> ModuleId { + match self { + LiteralIdentifier::Identifier(identifier) => identifier.module_id, + LiteralIdentifier::Literal(literal) => literal.module_id, + } + } +} diff --git a/src/wasm-lib/kcl/src/ast/modify.rs b/src/wasm-lib/kcl/src/parsing/ast/modify.rs similarity index 91% rename from src/wasm-lib/kcl/src/ast/modify.rs rename to src/wasm-lib/kcl/src/parsing/ast/modify.rs index 195296639..87b126397 100644 --- a/src/wasm-lib/kcl/src/ast/modify.rs +++ b/src/wasm-lib/kcl/src/parsing/ast/modify.rs @@ -7,26 +7,28 @@ use kcmc::{ use kittycad_modeling_cmds as kcmc; use crate::{ - ast::types::{ - ArrayExpression, CallExpression, ConstraintLevel, FormatOptions, Literal, PipeExpression, PipeSubstitution, - Program, VariableDeclarator, - }, engine::EngineManager, errors::{KclError, KclErrorDetails}, - executor::{Point2d, SourceRange}, + execution::Point2d, + parsing::ast::types::{ + ArrayExpression, CallExpression, ConstraintLevel, FormatOptions, Literal, Node, PipeExpression, + PipeSubstitution, VariableDeclarator, + }, + source_range::{ModuleId, SourceRange}, + Program, }; type Point3d = kcmc::shared::Point3d; #[derive(Debug)] /// The control point data for a curve or line. -pub struct ControlPointData { +struct ControlPointData { /// The control points for the curve or line. - pub points: Vec, + points: Vec, /// The command that created this curve or line. - pub command: PathCommand, + _command: PathCommand, /// The id of the curve or line. - pub id: uuid::Uuid, + _id: uuid::Uuid, } const EPSILON: f64 = 0.015625; // or 2^-6 @@ -36,10 +38,11 @@ const EPSILON: f64 = 0.015625; // or 2^-6 pub async fn modify_ast_for_sketch( engine: &Arc>, program: &mut Program, + module_id: ModuleId, // The name of the sketch. sketch_name: &str, // The type of plane the sketch is on. `XY` or `XZ`, etc - plane: crate::executor::PlaneType, + plane: crate::execution::PlaneType, // The ID of the parent sketch. sketch_id: uuid::Uuid, ) -> Result { @@ -47,7 +50,7 @@ pub async fn modify_ast_for_sketch( // If it is, we cannot modify it. // Get the information about the sketch. - if let Some(ast_sketch) = program.get_variable(sketch_name) { + if let Some(ast_sketch) = program.ast.get_variable(sketch_name) { let constraint_level = match ast_sketch { super::types::Definition::Variable(var) => var.get_constraint_level(), super::types::Definition::Import(import) => import.get_constraint_level(), @@ -127,8 +130,8 @@ pub async fn modify_ast_for_sketch( control_points.push(ControlPointData { points: data.control_points.clone(), - command: segment.command, - id: (*command_id).into(), + _command: segment.command, + _id: (*command_id).into(), }); } } @@ -176,14 +179,14 @@ pub async fn modify_ast_for_sketch( )?; // Add the sketch back to the program. - program.replace_variable(sketch_name, sketch); + program.ast.replace_variable(sketch_name, sketch); - let recasted = program.recast(&FormatOptions::default(), 0); + let recasted = program.ast.recast(&FormatOptions::default(), 0); // Re-parse the ast so we get the correct source ranges. - let tokens = crate::token::lexer(&recasted)?; - let parser = crate::parser::Parser::new(tokens); - *program = parser.ast()?; + *program = crate::parsing::parse_str(&recasted, module_id) + .parse_errs_as_err()? + .into(); Ok(recasted) } @@ -193,9 +196,9 @@ fn create_start_sketch_on( name: &str, start: [f64; 2], end: [f64; 2], - plane: crate::executor::PlaneType, + plane: crate::execution::PlaneType, additional_lines: Vec<[f64; 2]>, -) -> Result { +) -> Result, KclError> { let start_sketch_on = CallExpression::new("startSketchOn", vec![Literal::new(plane.to_string().into()).into()])?; let start_profile_at = CallExpression::new( "startProfileAt", diff --git a/src/wasm-lib/kcl/src/ast/types/condition.rs b/src/wasm-lib/kcl/src/parsing/ast/types/condition.rs similarity index 68% rename from src/wasm-lib/kcl/src/ast/types/condition.rs rename to src/wasm-lib/kcl/src/parsing/ast/types/condition.rs index 341d217a4..30133fe32 100644 --- a/src/wasm-lib/kcl/src/ast/types/condition.rs +++ b/src/wasm-lib/kcl/src/parsing/ast/types/condition.rs @@ -1,98 +1,62 @@ -use crate::executor::Metadata; -use crate::executor::SourceRange; - -use super::impl_value_meta; -use super::ConstraintLevel; -use super::Hover; -use super::{Digest, Expr}; -use databake::*; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +use super::{BoxNode, ConstraintLevel, Digest, Expr, Hover, Node, NodeList}; +use crate::SourceRange; + // TODO: This should be its own type, similar to Program, // but guaranteed to have an Expression as its final item. // https://github.com/KittyCAD/modeling-app/issues/4015 -type IfBlock = crate::ast::types::Program; +type IfBlock = crate::parsing::ast::types::Program; -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] pub struct IfExpression { - pub start: usize, - pub end: usize, pub cond: Box, - pub then_val: Box, - pub else_ifs: Vec, - pub final_else: Box, + pub then_val: BoxNode, + pub else_ifs: NodeList, + pub final_else: BoxNode, pub digest: Option, } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] pub struct ElseIf { - pub start: usize, - pub end: usize, pub cond: Expr, - pub then_val: Box, + pub then_val: BoxNode, pub digest: Option, } // Source code metadata -impl_value_meta!(IfExpression); -impl_value_meta!(ElseIf); - -impl IfExpression { +impl Node { fn source_ranges(&self) -> Vec { vec![SourceRange::from(self)] } } -impl From for Metadata { - fn from(value: IfExpression) -> Self { - Self { - source_range: value.into(), - } - } -} - -impl From for Metadata { - fn from(value: ElseIf) -> Self { - Self { - source_range: value.into(), - } - } -} -impl From<&IfExpression> for Metadata { - fn from(value: &IfExpression) -> Self { - Self { - source_range: value.into(), - } - } -} - -impl From<&ElseIf> for Metadata { - fn from(value: &ElseIf) -> Self { - Self { - source_range: value.into(), - } - } -} - -impl ElseIf { +impl Node { #[allow(dead_code)] fn source_ranges(&self) -> Vec { - vec![SourceRange([self.start, self.end])] + vec![SourceRange::new(self.start, self.end, self.module_id)] } } // IDE support and refactors +impl Node { + /// Get the constraint level. + pub fn get_constraint_level(&self) -> ConstraintLevel { + ConstraintLevel::Full { + source_ranges: self.source_ranges(), + } + } +} + impl IfExpression { pub fn get_hover_value_for_position(&self, pos: usize, code: &str) -> Option { self.cond @@ -115,12 +79,7 @@ impl IfExpression { } self.final_else.rename_identifiers(old_name, new_name); } - /// Get the constraint level. - pub fn get_constraint_level(&self) -> ConstraintLevel { - ConstraintLevel::Full { - source_ranges: self.source_ranges(), - } - } + pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { self.cond.replace_value(source_range, new_value.clone()); for else_if in &mut self.else_ifs { diff --git a/src/wasm-lib/kcl/src/ast/types/literal_value.rs b/src/wasm-lib/kcl/src/parsing/ast/types/literal_value.rs similarity index 71% rename from src/wasm-lib/kcl/src/ast/types/literal_value.rs rename to src/wasm-lib/kcl/src/parsing/ast/types/literal_value.rs index dc6fb1296..3c9fb0db2 100644 --- a/src/wasm-lib/kcl/src/ast/types/literal_value.rs +++ b/src/wasm-lib/kcl/src/parsing/ast/types/literal_value.rs @@ -1,17 +1,15 @@ -use databake::*; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use serde_json::Value as JValue; -use crate::ast::types::{Expr, Literal}; +use super::Node; +use crate::parsing::ast::types::{Expr, Literal}; -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(untagged, rename_all = "snake_case")] pub enum LiteralValue { - IInteger(i64), - Fractional(f64), + Number(f64), String(String), Bool(bool), } @@ -19,8 +17,7 @@ pub enum LiteralValue { impl LiteralValue { pub fn digestable_id(&self) -> Vec { match self { - LiteralValue::IInteger(i) => i.to_ne_bytes().into(), - LiteralValue::Fractional(frac) => frac.to_ne_bytes().into(), + LiteralValue::Number(frac) => frac.to_ne_bytes().into(), LiteralValue::String(st) => st.as_bytes().into(), LiteralValue::Bool(b) => { if *b { @@ -33,8 +30,8 @@ impl LiteralValue { } } -impl From for Expr { - fn from(literal: Literal) -> Self { +impl From> for Expr { + fn from(literal: Node) -> Self { Expr::Literal(Box::new(literal)) } } @@ -42,8 +39,7 @@ impl From for Expr { impl From for JValue { fn from(value: LiteralValue) -> Self { match value { - LiteralValue::IInteger(x) => x.into(), - LiteralValue::Fractional(x) => x.into(), + LiteralValue::Number(x) => x.into(), LiteralValue::String(x) => x.into(), LiteralValue::Bool(b) => b.into(), } @@ -52,13 +48,13 @@ impl From for JValue { impl From for LiteralValue { fn from(value: f64) -> Self { - Self::Fractional(value) + Self::Number(value) } } impl From for LiteralValue { fn from(value: i64) -> Self { - Self::IInteger(value) + Self::Number(value as f64) } } @@ -70,17 +66,17 @@ impl From for LiteralValue { impl From for LiteralValue { fn from(value: u32) -> Self { - Self::IInteger(value as i64) + Self::Number(value as f64) } } impl From for LiteralValue { fn from(value: u16) -> Self { - Self::IInteger(value as i64) + Self::Number(value as f64) } } impl From for LiteralValue { fn from(value: u8) -> Self { - Self::IInteger(value as i64) + Self::Number(value as f64) } } impl From<&'static str> for LiteralValue { diff --git a/src/wasm-lib/kcl/src/ast/types.rs b/src/wasm-lib/kcl/src/parsing/ast/types/mod.rs similarity index 70% rename from src/wasm-lib/kcl/src/ast/types.rs rename to src/wasm-lib/kcl/src/parsing/ast/types/mod.rs index 0f30dfca0..0e641cd14 100644 --- a/src/wasm-lib/kcl/src/ast/types.rs +++ b/src/wasm-lib/kcl/src/parsing/ast/types/mod.rs @@ -1,14 +1,15 @@ //! Data types for the AST. use std::{ + cell::RefCell, collections::HashMap, - ops::RangeInclusive, + fmt, + ops::{Deref, DerefMut, RangeInclusive}, + rc::Rc, sync::{Arc, Mutex}, }; use anyhow::Result; -use async_recursion::async_recursion; -use databake::*; use parse_display::{Display, FromStr}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; @@ -17,8 +18,8 @@ use tower_lsp::lsp_types::{ CompletionItem, CompletionItemKind, DocumentSymbol, FoldingRange, FoldingRangeKind, Range as LspRange, SymbolKind, }; -use self::execute::execute_pipe_body; -pub use crate::ast::types::{ +use super::digest::Digest; +pub use crate::parsing::ast::types::{ condition::{ElseIf, IfExpression}, literal_value::LiteralValue, none::KclNone, @@ -26,41 +27,236 @@ pub use crate::ast::types::{ use crate::{ docs::StdLibFn, errors::KclError, - executor::{ExecState, ExecutorContext, KclValue, Metadata, SourceRange, TagIdentifier, UserVal}, - parser::PIPE_OPERATOR, - std::kcl_stdlib::KclStdLibFn, + execution::{KclValue, Metadata, TagIdentifier}, + parsing::PIPE_OPERATOR, + source_range::{ModuleId, SourceRange}, }; mod condition; -pub(crate) mod digest; -pub(crate) mod execute; mod literal_value; mod none; -use digest::Digest; - pub enum Definition<'a> { Variable(&'a VariableDeclarator), - Import(&'a ImportStatement), + Import(NodeRef<'a, ImportStatement>), } +#[derive(Debug, Default, Clone, Deserialize, Serialize, PartialEq, Eq, ts_rs::TS)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct Node { + #[serde(flatten)] + pub inner: T, + pub start: usize, + pub end: usize, + #[serde(default, skip_serializing_if = "ModuleId::is_top_level")] + pub module_id: ModuleId, +} + +impl Node { + pub fn metadata(&self) -> Metadata { + Metadata { + source_range: SourceRange::new(self.start, self.end, self.module_id), + } + } + + pub fn contains(&self, pos: usize) -> bool { + self.start <= pos && pos <= self.end + } +} + +impl schemars::JsonSchema for Node { + fn schema_name() -> String { + T::schema_name() + } + + fn json_schema(gen: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema { + let mut child = T::json_schema(gen).into_object(); + // We want to add the start and end fields to the schema. + // Ideally we would add _any_ extra fields from the Node type automatically + // but this is a bit hard since this isn't a macro. + let Some(ref mut object) = &mut child.object else { + // This should never happen. But it will panic at compile time of docs if it does. + // Which is better than runtime. + panic!("Expected object schema for {}", T::schema_name()); + }; + object.properties.insert("start".to_string(), usize::json_schema(gen)); + object.properties.insert("end".to_string(), usize::json_schema(gen)); + + schemars::schema::Schema::Object(child.clone()) + } +} + +impl Node { + pub fn new(inner: T, start: usize, end: usize, module_id: ModuleId) -> Self { + Self { + inner, + start, + end, + module_id, + } + } + + pub fn no_src(inner: T) -> Self { + Self { + inner, + start: 0, + end: 0, + module_id: ModuleId::default(), + } + } + + pub fn boxed(inner: T, start: usize, end: usize, module_id: ModuleId) -> BoxNode { + Box::new(Node { + inner, + start, + end, + module_id, + }) + } + + pub fn as_source_range(&self) -> SourceRange { + SourceRange::new(self.start, self.end, self.module_id) + } + + pub fn as_source_ranges(&self) -> Vec { + vec![self.as_source_range()] + } +} + +impl Deref for Node { + type Target = T; + + fn deref(&self) -> &Self::Target { + &self.inner + } +} + +impl DerefMut for Node { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.inner + } +} + +impl fmt::Display for Node { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.inner.fmt(f) + } +} + +impl From> for SourceRange { + fn from(v: Node) -> Self { + Self::new(v.start, v.end, v.module_id) + } +} + +impl From<&Node> for SourceRange { + fn from(v: &Node) -> Self { + Self::new(v.start, v.end, v.module_id) + } +} + +impl From<&BoxNode> for SourceRange { + fn from(v: &BoxNode) -> Self { + Self::new(v.start, v.end, v.module_id) + } +} + +pub type BoxNode = Box>; +pub type NodeList = Vec>; +pub type NodeRef<'a, T> = &'a Node; + /// A KCL program top level, or function body. -#[derive(Debug, Default, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Default, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(rename_all = "camelCase")] pub struct Program { - pub start: usize, - pub end: usize, pub body: Vec, #[serde(default, skip_serializing_if = "NonCodeMeta::is_empty")] pub non_code_meta: NonCodeMeta, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub shebang: Option>, #[serde(default, skip_serializing_if = "Option::is_none")] #[ts(optional)] pub digest: Option, } +impl Node { + /// Walk the ast and get all the variables and tags as completion items. + pub fn completion_items<'a>(&'a self) -> Result> { + let completions = Rc::new(RefCell::new(vec![])); + crate::walk::walk(self, |node: crate::walk::Node<'a>| { + let mut findings = completions.borrow_mut(); + match node { + crate::walk::Node::TagDeclarator(tag) => { + findings.push(tag.into()); + } + crate::walk::Node::VariableDeclaration(variable) => { + findings.extend::>((&variable.inner).into()); + } + crate::walk::Node::ImportStatement(i) => { + findings.extend::>((&i.inner).into()); + } + _ => {} + } + Ok::(true) + })?; + let x = completions.take(); + Ok(x.clone()) + } + + /// Returns all the lsp symbols in the program. + pub fn get_lsp_symbols<'a>(&'a self, code: &str) -> Result> { + let symbols = Arc::new(Mutex::new(vec![])); + crate::walk::walk(self, |node: crate::walk::Node<'a>| { + let mut findings = symbols.lock().map_err(|_| anyhow::anyhow!("mutex"))?; + match node { + crate::walk::Node::TagDeclarator(tag) => { + findings.extend::>(tag.get_lsp_symbols(code)); + } + crate::walk::Node::VariableDeclaration(variable) => { + findings.extend::>(variable.get_lsp_symbols(code)); + } + _ => {} + } + Ok::(true) + })?; + let x = symbols.lock().unwrap(); + Ok(x.clone()) + } + + /// Check the provided Program for any lint findings. + pub fn lint<'a, RuleT>(&'a self, rule: RuleT) -> Result> + where + RuleT: crate::lint::Rule<'a>, + { + let v = Arc::new(Mutex::new(vec![])); + crate::walk::walk(self, |node: crate::walk::Node<'a>| { + let mut findings = v.lock().map_err(|_| anyhow::anyhow!("mutex"))?; + findings.append(&mut rule.check(node)?); + Ok::(true) + })?; + let x = v.lock().unwrap(); + Ok(x.clone()) + } + + pub fn lint_all(&self) -> Result> { + let rules = vec![ + crate::lint::checks::lint_variables, + crate::lint::checks::lint_object_properties, + crate::lint::checks::lint_call_expressions, + crate::lint::checks::lint_should_be_offset_plane, + ]; + + let mut findings = vec![]; + for rule in rules { + findings.append(&mut self.lint(rule)?); + } + Ok(findings) + } +} + impl Program { /// Is the last body item an expression? pub fn ends_with_expr(&self) -> bool { @@ -71,19 +267,14 @@ impl Program { } pub fn get_hover_value_for_position(&self, pos: usize, code: &str) -> Option { - // Check if we are in the non code meta. - if let Some(meta) = self.get_non_code_meta_for_position(pos) { - for node in &meta.start { - if node.contains(pos) { - // We only care about the shebang. - if let NonCodeValue::Shebang { value: _ } = &node.value { - let source_range: SourceRange = node.into(); - return Some(Hover::Comment { - value: r#"The `#!` at the start of a script, known as a shebang, specifies the path to the interpreter that should execute the script. This line is not necessary for your `kcl` to run in the modeling-app. You can safely delete it. If you wish to learn more about what you _can_ do with a shebang, read this doc: [zoo.dev/docs/faq/shebang](https://zoo.dev/docs/faq/shebang)."#.to_string(), - range: source_range.to_lsp_range(code), - }); - } - } + // Check if we are in shebang. + if let Some(node) = &self.shebang { + if node.contains(pos) { + let source_range: SourceRange = node.into(); + return Some(Hover::Comment { + value: r#"The `#!` at the start of a script, known as a shebang, specifies the path to the interpreter that should execute the script. This line is not necessary for your `kcl` to run in the modeling-app. You can safely delete it. If you wish to learn more about what you _can_ do with a shebang, read this doc: [zoo.dev/docs/faq/shebang](https://zoo.dev/docs/faq/shebang)."#.to_string(), + range: source_range.to_lsp_range(code), + }); } } @@ -92,55 +283,6 @@ impl Program { value.get_hover_value_for_position(pos, code) } - /// Check the provided Program for any lint findings. - pub fn lint<'a, RuleT>(&'a self, rule: RuleT) -> Result> - where - RuleT: crate::lint::rule::Rule<'a>, - { - let v = Arc::new(Mutex::new(vec![])); - crate::walk::walk(self, &|node: crate::walk::Node<'a>| { - let mut findings = v.lock().map_err(|_| anyhow::anyhow!("mutex"))?; - findings.append(&mut rule.check(node)?); - Ok(true) - })?; - let x = v.lock().unwrap(); - Ok(x.clone()) - } - - pub fn lint_all(&self) -> Result> { - let rules = vec![ - crate::lint::checks::lint_variables, - crate::lint::checks::lint_object_properties, - crate::lint::checks::lint_call_expressions, - ]; - - let mut findings = vec![]; - for rule in rules { - findings.append(&mut self.lint(rule)?); - } - Ok(findings) - } - - /// Walk the ast and get all the variables and tags as completion items. - pub fn completion_items<'a>(&'a self) -> Result> { - let completions = Arc::new(Mutex::new(vec![])); - crate::walk::walk(self, &|node: crate::walk::Node<'a>| { - let mut findings = completions.lock().map_err(|_| anyhow::anyhow!("mutex"))?; - match node { - crate::walk::Node::TagDeclarator(tag) => { - findings.push(tag.into()); - } - crate::walk::Node::VariableDeclaration(variable) => { - findings.extend::>(variable.into()); - } - _ => {} - } - Ok(true) - })?; - let x = completions.lock().unwrap(); - Ok(x.clone()) - } - /// Returns the body item that includes the given character position. pub fn get_body_item_for_position(&self, pos: usize) -> Option<&BodyItem> { for item in &self.body { @@ -207,26 +349,6 @@ impl Program { None } - /// Returns all the lsp symbols in the program. - pub fn get_lsp_symbols<'a>(&'a self, code: &str) -> Result> { - let symbols = Arc::new(Mutex::new(vec![])); - crate::walk::walk(self, &|node: crate::walk::Node<'a>| { - let mut findings = symbols.lock().map_err(|_| anyhow::anyhow!("mutex"))?; - match node { - crate::walk::Node::TagDeclarator(tag) => { - findings.extend::>(tag.get_lsp_symbols(code)); - } - crate::walk::Node::VariableDeclaration(variable) => { - findings.extend::>(variable.get_lsp_symbols(code)); - } - _ => {} - } - Ok(true) - })?; - let x = symbols.lock().unwrap(); - Ok(x.clone()) - } - // Return all the lsp folding ranges in the program. pub fn get_lsp_folding_ranges(&self) -> Vec { let mut ranges = vec![]; @@ -338,7 +460,7 @@ impl Program { } /// Replace a variable declaration with the given name with a new one. - pub fn replace_variable(&mut self, name: &str, declarator: VariableDeclarator) { + pub fn replace_variable(&mut self, name: &str, declarator: Node) { for item in &mut self.body { match item { BodyItem::ImportStatement(_) => { @@ -348,11 +470,9 @@ impl Program { continue; } BodyItem::VariableDeclaration(ref mut variable_declaration) => { - for declaration in &mut variable_declaration.declarations { - if declaration.id.name == name { - *declaration = declarator; - return; - } + if variable_declaration.declaration.id.name == name { + variable_declaration.declaration = declarator; + return; } } BodyItem::ReturnStatement(_return_statement) => continue, @@ -383,20 +503,16 @@ impl Program { for item in &self.body { match item { BodyItem::ImportStatement(stmt) => { - for import_item in &stmt.items { - if import_item.identifier() == name { - return Some(Definition::Import(stmt.as_ref())); - } + if stmt.get_variable(name) { + return Some(Definition::Import(stmt)); } } BodyItem::ExpressionStatement(_expression_statement) => { continue; } BodyItem::VariableDeclaration(variable_declaration) => { - for declaration in &variable_declaration.declarations { - if declaration.id.name == name { - return Some(Definition::Variable(declaration)); - } + if variable_declaration.declaration.id.name == name { + return Some(Definition::Variable(&variable_declaration.declaration)); } } BodyItem::ReturnStatement(_return_statement) => continue, @@ -407,115 +523,93 @@ impl Program { } } -pub trait ValueMeta { - fn start(&self) -> usize; - - fn end(&self) -> usize; +/// A shebang. +/// This is a special type of comment that is at the top of the file. +/// It looks like this: +/// ```python,no_run +/// #!/usr/bin/env python +/// ``` +#[derive(Debug, Default, Clone, PartialEq, Eq, Hash, Deserialize, Serialize, ts_rs::TS, JsonSchema)] +#[ts(export)] +pub struct Shebang { + pub content: String, } -macro_rules! impl_value_meta { - {$name:ident} => { - impl crate::ast::types::ValueMeta for $name { - fn start(&self) -> usize { - self.start - } - - fn end(&self) -> usize { - self.end - } - } - - impl From<$name> for crate::executor::SourceRange { - fn from(v: $name) -> Self { - Self([v.start, v.end]) - } - } - - impl From<&$name> for crate::executor::SourceRange { - fn from(v: &$name) -> Self { - Self([v.start, v.end]) - } - } - - impl From<&Box<$name>> for crate::executor::SourceRange { - fn from(v: &Box<$name>) -> Self { - Self([v.start, v.end]) - } - } - }; +impl Shebang { + pub fn new(content: String) -> Self { + Shebang { content } + } } -pub(crate) use impl_value_meta; - -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] pub enum BodyItem { - ImportStatement(Box), - ExpressionStatement(ExpressionStatement), - VariableDeclaration(Box), - ReturnStatement(ReturnStatement), + ImportStatement(BoxNode), + ExpressionStatement(Node), + VariableDeclaration(BoxNode), + ReturnStatement(Node), } impl BodyItem { pub fn start(&self) -> usize { match self { - BodyItem::ImportStatement(stmt) => stmt.start(), - BodyItem::ExpressionStatement(expression_statement) => expression_statement.start(), - BodyItem::VariableDeclaration(variable_declaration) => variable_declaration.start(), - BodyItem::ReturnStatement(return_statement) => return_statement.start(), + BodyItem::ImportStatement(stmt) => stmt.start, + BodyItem::ExpressionStatement(expression_statement) => expression_statement.start, + BodyItem::VariableDeclaration(variable_declaration) => variable_declaration.start, + BodyItem::ReturnStatement(return_statement) => return_statement.start, } } pub fn end(&self) -> usize { match self { - BodyItem::ImportStatement(stmt) => stmt.end(), - BodyItem::ExpressionStatement(expression_statement) => expression_statement.end(), - BodyItem::VariableDeclaration(variable_declaration) => variable_declaration.end(), - BodyItem::ReturnStatement(return_statement) => return_statement.end(), + BodyItem::ImportStatement(stmt) => stmt.end, + BodyItem::ExpressionStatement(expression_statement) => expression_statement.end, + BodyItem::VariableDeclaration(variable_declaration) => variable_declaration.end, + BodyItem::ReturnStatement(return_statement) => return_statement.end, } } } impl From for SourceRange { fn from(item: BodyItem) -> Self { - Self([item.start(), item.end()]) + Self::new(item.start(), item.end(), item.module_id()) } } impl From<&BodyItem> for SourceRange { fn from(item: &BodyItem) -> Self { - Self([item.start(), item.end()]) + Self::new(item.start(), item.end(), item.module_id()) } } /// An expression can be evaluated to yield a single KCL value. -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] pub enum Expr { - Literal(Box), - Identifier(Box), - TagDeclarator(Box), - BinaryExpression(Box), - FunctionExpression(Box), - CallExpression(Box), - PipeExpression(Box), - PipeSubstitution(Box), - ArrayExpression(Box), - ArrayRangeExpression(Box), - ObjectExpression(Box), - MemberExpression(Box), - UnaryExpression(Box), - IfExpression(Box), - None(KclNone), + Literal(BoxNode), + Identifier(BoxNode), + TagDeclarator(BoxNode), + BinaryExpression(BoxNode), + FunctionExpression(BoxNode), + CallExpression(BoxNode), + CallExpressionKw(BoxNode), + PipeExpression(BoxNode), + PipeSubstitution(BoxNode), + ArrayExpression(BoxNode), + ArrayRangeExpression(BoxNode), + ObjectExpression(BoxNode), + MemberExpression(BoxNode), + UnaryExpression(BoxNode), + IfExpression(BoxNode), + LabelledExpression(BoxNode), + None(Node), } impl Expr { pub fn get_lsp_folding_range(&self) -> Option { - let recasted = self.recast(&FormatOptions::default(), 0, false); + let recasted = self.recast(&FormatOptions::default(), 0, crate::unparser::ExprContext::Other); // If the code only has one line then we don't need to fold it. if recasted.lines().count() <= 1 { return None; @@ -545,12 +639,14 @@ impl Expr { Expr::Literal(_literal) => None, Expr::FunctionExpression(_func_exp) => None, Expr::CallExpression(_call_exp) => None, + Expr::CallExpressionKw(_call_exp) => None, Expr::Identifier(_ident) => None, Expr::TagDeclarator(_tag) => None, Expr::PipeExpression(pipe_exp) => Some(&pipe_exp.non_code_meta), Expr::UnaryExpression(_unary_exp) => None, Expr::PipeSubstitution(_pipe_substitution) => None, Expr::IfExpression(_) => None, + Expr::LabelledExpression(expr) => expr.expr.get_non_code_meta(), Expr::None(_none) => None, } } @@ -570,52 +666,58 @@ impl Expr { Expr::Literal(_) => {} Expr::FunctionExpression(ref mut func_exp) => func_exp.replace_value(source_range, new_value), Expr::CallExpression(ref mut call_exp) => call_exp.replace_value(source_range, new_value), + Expr::CallExpressionKw(ref mut call_exp) => call_exp.replace_value(source_range, new_value), Expr::Identifier(_) => {} Expr::TagDeclarator(_) => {} Expr::PipeExpression(ref mut pipe_exp) => pipe_exp.replace_value(source_range, new_value), Expr::UnaryExpression(ref mut unary_exp) => unary_exp.replace_value(source_range, new_value), Expr::IfExpression(_) => {} Expr::PipeSubstitution(_) => {} + Expr::LabelledExpression(expr) => expr.expr.replace_value(source_range, new_value), Expr::None(_) => {} } } pub fn start(&self) -> usize { match self { - Expr::Literal(literal) => literal.start(), - Expr::Identifier(identifier) => identifier.start(), - Expr::TagDeclarator(tag) => tag.start(), - Expr::BinaryExpression(binary_expression) => binary_expression.start(), - Expr::FunctionExpression(function_expression) => function_expression.start(), - Expr::CallExpression(call_expression) => call_expression.start(), - Expr::PipeExpression(pipe_expression) => pipe_expression.start(), - Expr::PipeSubstitution(pipe_substitution) => pipe_substitution.start(), - Expr::ArrayExpression(array_expression) => array_expression.start(), - Expr::ArrayRangeExpression(array_range) => array_range.start(), - Expr::ObjectExpression(object_expression) => object_expression.start(), - Expr::MemberExpression(member_expression) => member_expression.start(), - Expr::UnaryExpression(unary_expression) => unary_expression.start(), - Expr::IfExpression(expr) => expr.start(), + Expr::Literal(literal) => literal.start, + Expr::Identifier(identifier) => identifier.start, + Expr::TagDeclarator(tag) => tag.start, + Expr::BinaryExpression(binary_expression) => binary_expression.start, + Expr::FunctionExpression(function_expression) => function_expression.start, + Expr::CallExpression(call_expression) => call_expression.start, + Expr::CallExpressionKw(call_expression) => call_expression.start, + Expr::PipeExpression(pipe_expression) => pipe_expression.start, + Expr::PipeSubstitution(pipe_substitution) => pipe_substitution.start, + Expr::ArrayExpression(array_expression) => array_expression.start, + Expr::ArrayRangeExpression(array_range) => array_range.start, + Expr::ObjectExpression(object_expression) => object_expression.start, + Expr::MemberExpression(member_expression) => member_expression.start, + Expr::UnaryExpression(unary_expression) => unary_expression.start, + Expr::IfExpression(expr) => expr.start, + Expr::LabelledExpression(expr) => expr.start, Expr::None(none) => none.start, } } pub fn end(&self) -> usize { match self { - Expr::Literal(literal) => literal.end(), - Expr::Identifier(identifier) => identifier.end(), - Expr::TagDeclarator(tag) => tag.end(), - Expr::BinaryExpression(binary_expression) => binary_expression.end(), - Expr::FunctionExpression(function_expression) => function_expression.end(), - Expr::CallExpression(call_expression) => call_expression.end(), - Expr::PipeExpression(pipe_expression) => pipe_expression.end(), - Expr::PipeSubstitution(pipe_substitution) => pipe_substitution.end(), - Expr::ArrayExpression(array_expression) => array_expression.end(), - Expr::ArrayRangeExpression(array_range) => array_range.end(), - Expr::ObjectExpression(object_expression) => object_expression.end(), - Expr::MemberExpression(member_expression) => member_expression.end(), - Expr::UnaryExpression(unary_expression) => unary_expression.end(), - Expr::IfExpression(expr) => expr.end(), + Expr::Literal(literal) => literal.end, + Expr::Identifier(identifier) => identifier.end, + Expr::TagDeclarator(tag) => tag.end, + Expr::BinaryExpression(binary_expression) => binary_expression.end, + Expr::FunctionExpression(function_expression) => function_expression.end, + Expr::CallExpression(call_expression) => call_expression.end, + Expr::CallExpressionKw(call_expression) => call_expression.end, + Expr::PipeExpression(pipe_expression) => pipe_expression.end, + Expr::PipeSubstitution(pipe_substitution) => pipe_substitution.end, + Expr::ArrayExpression(array_expression) => array_expression.end, + Expr::ArrayRangeExpression(array_range) => array_range.end, + Expr::ObjectExpression(object_expression) => object_expression.end, + Expr::MemberExpression(member_expression) => member_expression.end, + Expr::UnaryExpression(unary_expression) => unary_expression.end, + Expr::IfExpression(expr) => expr.end, + Expr::LabelledExpression(expr) => expr.end, Expr::None(none) => none.end, } } @@ -629,6 +731,7 @@ impl Expr { function_expression.get_hover_value_for_position(pos, code) } Expr::CallExpression(call_expression) => call_expression.get_hover_value_for_position(pos, code), + Expr::CallExpressionKw(call_expression) => call_expression.get_hover_value_for_position(pos, code), Expr::PipeExpression(pipe_expression) => pipe_expression.get_hover_value_for_position(pos, code), Expr::ArrayExpression(array_expression) => array_expression.get_hover_value_for_position(pos, code), Expr::ArrayRangeExpression(array_range) => array_range.get_hover_value_for_position(pos, code), @@ -641,6 +744,8 @@ impl Expr { Expr::Literal(_) => None, Expr::Identifier(_) => None, Expr::TagDeclarator(_) => None, + // TODO LSP hover info for tag + Expr::LabelledExpression(expr) => expr.expr.get_hover_value_for_position(pos, code), // TODO: LSP hover information for symbols. https://github.com/KittyCAD/modeling-app/issues/1127 Expr::PipeSubstitution(_) => None, } @@ -657,6 +762,7 @@ impl Expr { } Expr::FunctionExpression(_function_identifier) => {} Expr::CallExpression(ref mut call_expression) => call_expression.rename_identifiers(old_name, new_name), + Expr::CallExpressionKw(ref mut call_expression) => call_expression.rename_identifiers(old_name, new_name), Expr::PipeExpression(ref mut pipe_expression) => pipe_expression.rename_identifiers(old_name, new_name), Expr::PipeSubstitution(_) => {} Expr::ArrayExpression(ref mut array_expression) => array_expression.rename_identifiers(old_name, new_name), @@ -669,6 +775,7 @@ impl Expr { } Expr::UnaryExpression(ref mut unary_expression) => unary_expression.rename_identifiers(old_name, new_name), Expr::IfExpression(ref mut expr) => expr.rename_identifiers(old_name, new_name), + Expr::LabelledExpression(expr) => expr.expr.rename_identifiers(old_name, new_name), Expr::None(_) => {} } } @@ -683,6 +790,7 @@ impl Expr { Expr::FunctionExpression(function_identifier) => function_identifier.get_constraint_level(), Expr::CallExpression(call_expression) => call_expression.get_constraint_level(), + Expr::CallExpressionKw(call_expression) => call_expression.get_constraint_level(), Expr::PipeExpression(pipe_expression) => pipe_expression.get_constraint_level(), Expr::PipeSubstitution(pipe_substitution) => ConstraintLevel::Ignore { source_ranges: vec![pipe_substitution.into()], @@ -693,46 +801,86 @@ impl Expr { Expr::MemberExpression(member_expression) => member_expression.get_constraint_level(), Expr::UnaryExpression(unary_expression) => unary_expression.get_constraint_level(), Expr::IfExpression(expr) => expr.get_constraint_level(), + Expr::LabelledExpression(expr) => expr.expr.get_constraint_level(), Expr::None(none) => none.get_constraint_level(), } } + + pub fn has_substitution_arg(&self) -> bool { + match self { + Expr::CallExpression(call_expression) => call_expression.has_substitution_arg(), + Expr::CallExpressionKw(call_expression) => call_expression.has_substitution_arg(), + Expr::LabelledExpression(expr) => expr.expr.has_substitution_arg(), + _ => false, + } + } } impl From for SourceRange { fn from(value: Expr) -> Self { - Self([value.start(), value.end()]) + Self::new(value.start(), value.end(), value.module_id()) } } impl From<&Expr> for SourceRange { fn from(value: &Expr) -> Self { - Self([value.start(), value.end()]) + Self::new(value.start(), value.end(), value.module_id()) } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] +#[ts(export)] +#[serde(tag = "type")] +pub struct LabelledExpression { + pub expr: Expr, + pub label: Node, + + #[serde(default, skip_serializing_if = "Option::is_none")] + #[ts(optional)] + pub digest: Option, +} + +impl LabelledExpression { + pub(crate) fn new(expr: Expr, label: Node) -> Node { + let start = expr.start(); + let end = label.end; + let module_id = expr.module_id(); + Node::new( + LabelledExpression { + expr, + label, + digest: None, + }, + start, + end, + module_id, + ) + } +} + +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] pub enum BinaryPart { - Literal(Box), - Identifier(Box), - BinaryExpression(Box), - CallExpression(Box), - UnaryExpression(Box), - MemberExpression(Box), - IfExpression(Box), + Literal(BoxNode), + Identifier(BoxNode), + BinaryExpression(BoxNode), + CallExpression(BoxNode), + CallExpressionKw(BoxNode), + UnaryExpression(BoxNode), + MemberExpression(BoxNode), + IfExpression(BoxNode), } impl From for SourceRange { fn from(value: BinaryPart) -> Self { - Self([value.start(), value.end()]) + Self::new(value.start(), value.end(), value.module_id()) } } impl From<&BinaryPart> for SourceRange { fn from(value: &BinaryPart) -> Self { - Self([value.start(), value.end()]) + Self::new(value.start(), value.end(), value.module_id()) } } @@ -744,6 +892,7 @@ impl BinaryPart { BinaryPart::Identifier(identifier) => identifier.get_constraint_level(), BinaryPart::BinaryExpression(binary_expression) => binary_expression.get_constraint_level(), BinaryPart::CallExpression(call_expression) => call_expression.get_constraint_level(), + BinaryPart::CallExpressionKw(call_expression) => call_expression.get_constraint_level(), BinaryPart::UnaryExpression(unary_expression) => unary_expression.get_constraint_level(), BinaryPart::MemberExpression(member_expression) => member_expression.get_constraint_level(), BinaryPart::IfExpression(e) => e.get_constraint_level(), @@ -760,6 +909,9 @@ impl BinaryPart { BinaryPart::CallExpression(ref mut call_expression) => { call_expression.replace_value(source_range, new_value) } + BinaryPart::CallExpressionKw(ref mut call_expression) => { + call_expression.replace_value(source_range, new_value) + } BinaryPart::UnaryExpression(ref mut unary_expression) => { unary_expression.replace_value(source_range, new_value) } @@ -770,25 +922,27 @@ impl BinaryPart { pub fn start(&self) -> usize { match self { - BinaryPart::Literal(literal) => literal.start(), - BinaryPart::Identifier(identifier) => identifier.start(), - BinaryPart::BinaryExpression(binary_expression) => binary_expression.start(), - BinaryPart::CallExpression(call_expression) => call_expression.start(), - BinaryPart::UnaryExpression(unary_expression) => unary_expression.start(), - BinaryPart::MemberExpression(member_expression) => member_expression.start(), - BinaryPart::IfExpression(e) => e.start(), + BinaryPart::Literal(literal) => literal.start, + BinaryPart::Identifier(identifier) => identifier.start, + BinaryPart::BinaryExpression(binary_expression) => binary_expression.start, + BinaryPart::CallExpression(call_expression) => call_expression.start, + BinaryPart::CallExpressionKw(call_expression) => call_expression.start, + BinaryPart::UnaryExpression(unary_expression) => unary_expression.start, + BinaryPart::MemberExpression(member_expression) => member_expression.start, + BinaryPart::IfExpression(e) => e.start, } } pub fn end(&self) -> usize { match self { - BinaryPart::Literal(literal) => literal.end(), - BinaryPart::Identifier(identifier) => identifier.end(), - BinaryPart::BinaryExpression(binary_expression) => binary_expression.end(), - BinaryPart::CallExpression(call_expression) => call_expression.end(), - BinaryPart::UnaryExpression(unary_expression) => unary_expression.end(), - BinaryPart::MemberExpression(member_expression) => member_expression.end(), - BinaryPart::IfExpression(e) => e.end(), + BinaryPart::Literal(literal) => literal.end, + BinaryPart::Identifier(identifier) => identifier.end, + BinaryPart::BinaryExpression(binary_expression) => binary_expression.end, + BinaryPart::CallExpression(call_expression) => call_expression.end, + BinaryPart::CallExpressionKw(call_expression) => call_expression.end, + BinaryPart::UnaryExpression(unary_expression) => unary_expression.end, + BinaryPart::MemberExpression(member_expression) => member_expression.end, + BinaryPart::IfExpression(e) => e.end, } } @@ -801,6 +955,7 @@ impl BinaryPart { binary_expression.get_hover_value_for_position(pos, code) } BinaryPart::CallExpression(call_expression) => call_expression.get_hover_value_for_position(pos, code), + BinaryPart::CallExpressionKw(call_expression) => call_expression.get_hover_value_for_position(pos, code), BinaryPart::UnaryExpression(unary_expression) => unary_expression.get_hover_value_for_position(pos, code), BinaryPart::IfExpression(e) => e.get_hover_value_for_position(pos, code), BinaryPart::MemberExpression(member_expression) => { @@ -820,6 +975,9 @@ impl BinaryPart { BinaryPart::CallExpression(ref mut call_expression) => { call_expression.rename_identifiers(old_name, new_name) } + BinaryPart::CallExpressionKw(ref mut call_expression) => { + call_expression.rename_identifiers(old_name, new_name) + } BinaryPart::UnaryExpression(ref mut unary_expression) => { unary_expression.rename_identifiers(old_name, new_name) } @@ -831,13 +989,10 @@ impl BinaryPart { } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] pub struct NonCodeNode { - pub start: usize, - pub end: usize, pub value: NonCodeValue, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -845,74 +1000,27 @@ pub struct NonCodeNode { pub digest: Option, } -impl From for SourceRange { - fn from(value: NonCodeNode) -> Self { - Self([value.start, value.end]) - } -} - -impl From<&NonCodeNode> for SourceRange { - fn from(value: &NonCodeNode) -> Self { - Self([value.start, value.end]) - } -} - impl NonCodeNode { - pub fn contains(&self, pos: usize) -> bool { - self.start <= pos && pos <= self.end - } - + #[cfg(test)] pub fn value(&self) -> String { match &self.value { - NonCodeValue::Shebang { value } => value.clone(), NonCodeValue::InlineComment { value, style: _ } => value.clone(), NonCodeValue::BlockComment { value, style: _ } => value.clone(), NonCodeValue::NewLineBlockComment { value, style: _ } => value.clone(), NonCodeValue::NewLine => "\n\n".to_string(), + NonCodeValue::Annotation { name, .. } => name.name.clone(), } } - pub fn format(&self, indentation: &str) -> String { + pub fn annotation(&self, expected_name: &str) -> Option<&NonCodeValue> { match &self.value { - NonCodeValue::Shebang { value } => format!("{}\n\n", value), - NonCodeValue::InlineComment { - value, - style: CommentStyle::Line, - } => format!(" // {}\n", value), - NonCodeValue::InlineComment { - value, - style: CommentStyle::Block, - } => format!(" /* {} */", value), - NonCodeValue::BlockComment { value, style } => match style { - CommentStyle::Block => format!("{}/* {} */", indentation, value), - CommentStyle::Line => { - if value.trim().is_empty() { - format!("{}//\n", indentation) - } else { - format!("{}// {}\n", indentation, value.trim()) - } - } - }, - NonCodeValue::NewLineBlockComment { value, style } => { - let add_start_new_line = if self.start == 0 { "" } else { "\n\n" }; - match style { - CommentStyle::Block => format!("{}{}/* {} */\n", add_start_new_line, indentation, value), - CommentStyle::Line => { - if value.trim().is_empty() { - format!("{}{}//\n", add_start_new_line, indentation) - } else { - format!("{}{}// {}\n", add_start_new_line, indentation, value.trim()) - } - } - } - } - NonCodeValue::NewLine => "\n\n".to_string(), + a @ NonCodeValue::Annotation { name, .. } if name.name == expected_name => Some(a), + _ => None, } } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(rename_all = "camelCase")] pub enum CommentStyle { @@ -922,29 +1030,11 @@ pub enum CommentStyle { Block, } -impl CommentStyle { - fn digestable_id(&self) -> [u8; 2] { - match &self { - CommentStyle::Line => *b"//", - CommentStyle::Block => *b"/*", - } - } -} - -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type", rename_all = "camelCase")] +#[allow(clippy::large_enum_variant)] pub enum NonCodeValue { - /// A shebang. - /// This is a special type of comment that is at the top of the file. - /// It looks like this: - /// ```python,no_run - /// #!/usr/bin/env python - /// ``` - Shebang { - value: String, - }, /// An inline comment. /// Here are examples: /// `1 + 1 // This is an inline comment`. @@ -976,15 +1066,18 @@ pub enum NonCodeValue { // A new line like `\n\n` NOT a new line like `\n`. // This is also not a comment. NewLine, + Annotation { + name: Node, + properties: Option>>, + }, } -#[derive(Debug, Default, Clone, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Default, Clone, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(rename_all = "camelCase")] pub struct NonCodeMeta { - pub non_code_nodes: HashMap>, - pub start: Vec, + pub non_code_nodes: HashMap>, + pub start_nodes: NodeList, #[serde(default, skip_serializing_if = "Option::is_none")] #[ts(optional)] @@ -994,7 +1087,7 @@ pub struct NonCodeMeta { impl NonCodeMeta { /// Does this contain anything? pub fn is_empty(&self) -> bool { - self.non_code_nodes.is_empty() && self.start.is_empty() + self.non_code_nodes.is_empty() && self.start_nodes.is_empty() } /// How many non-code values does this have? @@ -1013,8 +1106,8 @@ impl<'de> Deserialize<'de> for NonCodeMeta { #[derive(Deserialize)] #[serde(rename_all = "camelCase")] struct NonCodeMetaHelper { - non_code_nodes: HashMap>, - start: Vec, + non_code_nodes: HashMap>, + start_nodes: NodeList, } let helper = NonCodeMetaHelper::deserialize(deserializer)?; @@ -1025,19 +1118,19 @@ impl<'de> Deserialize<'de> for NonCodeMeta { .collect::, _>>()?; Ok(NonCodeMeta { non_code_nodes, - start: helper.start, + start_nodes: helper.start_nodes, digest: None, }) } } impl NonCodeMeta { - pub fn insert(&mut self, i: usize, new: NonCodeNode) { + pub fn insert(&mut self, i: usize, new: Node) { self.non_code_nodes.entry(i).or_default().push(new); } pub fn contains(&self, pos: usize) -> bool { - if self.start.iter().any(|node| node.contains(pos)) { + if self.start_nodes.iter().any(|node| node.contains(pos)) { return true; } @@ -1047,34 +1140,21 @@ impl NonCodeMeta { } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] pub struct ImportItem { /// Name of the item to import. - pub name: Identifier, - /// Rename the item using an identifier after "as". - pub alias: Option, - - pub start: usize, - pub end: usize, + pub name: Node, + /// Rename the item using an identifier after `as`. + pub alias: Option>, #[serde(default, skip_serializing_if = "Option::is_none")] #[ts(optional)] pub digest: Option, } -impl_value_meta!(ImportItem); - -impl ImportItem { - pub fn identifier(&self) -> &str { - match &self.alias { - Some(alias) => &alias.name, - None => &self.name.name, - } - } - +impl Node { pub fn rename_symbol(&mut self, new_name: &str, pos: usize) -> Option { match &mut self.alias { Some(alias) => { @@ -1091,10 +1171,19 @@ impl ImportItem { self.alias = Some(Identifier::new(new_name)); } // Return implicit name. - return Some(self.identifier().to_owned()); + Some(self.identifier().to_owned()) } } } +} + +impl ImportItem { + pub fn identifier(&self) -> &str { + match &self.alias { + Some(alias) => &alias.name, + None => &self.name.name, + } + } pub fn rename_identifiers(&mut self, old_name: &str, new_name: &str) { if let Some(alias) = &mut self.alias { @@ -1103,25 +1192,94 @@ impl ImportItem { } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] +#[ts(export)] +#[serde(tag = "type")] +#[allow(clippy::large_enum_variant)] +pub enum ImportSelector { + /// A comma-separated list of names and possible aliases to import (may be a single item, but never zero). + /// E.g., `import bar as baz from "foo.kcl"` + List { items: NodeList }, + /// Import all public items from a module. + /// E.g., `import * from "foo.kcl"` + Glob(Node<()>), + /// Import the module itself (the param is an optional alias). + /// E.g., `import "foo.kcl" as bar` + None { alias: Option> }, +} + +impl ImportSelector { + pub fn rename_symbol(&mut self, new_name: &str, pos: usize) -> Option { + match self { + ImportSelector::List { items } => { + for item in items { + let source_range = SourceRange::from(&*item); + if source_range.contains(pos) { + let old_name = item.rename_symbol(new_name, pos); + if old_name.is_some() { + return old_name; + } + } + } + None + } + ImportSelector::Glob(_) => None, + ImportSelector::None { alias: None } => None, + ImportSelector::None { alias: Some(alias) } => { + let alias_source_range = SourceRange::from(&*alias); + if !alias_source_range.contains(pos) { + return None; + } + let old_name = std::mem::replace(&mut alias.name, new_name.to_owned()); + Some(old_name) + } + } + } + + pub fn rename_identifiers(&mut self, old_name: &str, new_name: &str) { + match self { + ImportSelector::List { items } => { + for item in items { + item.rename_identifiers(old_name, new_name); + } + } + ImportSelector::Glob(_) => {} + ImportSelector::None { alias: None } => {} + ImportSelector::None { alias: Some(alias) } => alias.rename(old_name, new_name), + } + } +} + +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] pub struct ImportStatement { - pub start: usize, - pub end: usize, - pub items: Vec, + pub selector: ImportSelector, pub path: String, - pub raw_path: String, + #[serde(default, skip_serializing_if = "ItemVisibility::is_default")] + pub visibility: ItemVisibility, #[serde(default, skip_serializing_if = "Option::is_none")] #[ts(optional)] pub digest: Option, } -impl_value_meta!(ImportStatement); +impl Node { + pub fn get_variable(&self, name: &str) -> bool { + match &self.selector { + ImportSelector::List { items } => { + for import_item in items { + if import_item.identifier() == name { + return true; + } + } + false + } + ImportSelector::Glob(_) => false, + ImportSelector::None { .. } => name == self.module_name().unwrap(), + } + } -impl ImportStatement { pub fn get_constraint_level(&self) -> ConstraintLevel { ConstraintLevel::Full { source_ranges: vec![self.into()], @@ -1129,32 +1287,73 @@ impl ImportStatement { } pub fn rename_symbol(&mut self, new_name: &str, pos: usize) -> Option { - for item in &mut self.items { - let source_range = SourceRange::from(&*item); - if source_range.contains(pos) { - let old_name = item.rename_symbol(new_name, pos); - if old_name.is_some() { - return old_name; - } - } - } - None + self.selector.rename_symbol(new_name, pos) + } +} + +impl ImportStatement { + pub fn rename_identifiers(&mut self, old_name: &str, new_name: &str) { + self.selector.rename_identifiers(old_name, new_name); } - pub fn rename_identifiers(&mut self, old_name: &str, new_name: &str) { - for item in &mut self.items { - item.rename_identifiers(old_name, new_name); + /// Get the name of the module object for this import. + /// Validated during parsing and guaranteed to return `Some` if the statement imports + /// the module itself (i.e., self.selector is ImportSelector::None). + pub fn module_name(&self) -> Option { + if let ImportSelector::None { alias: Some(alias) } = &self.selector { + return Some(alias.name.clone()); + } + + let mut parts = self.path.split('.'); + let name = parts.next()?; + let ext = parts.next()?; + let rest = parts.next(); + + if rest.is_some() || ext != "kcl" { + return None; + } + + Some(name.to_owned()) + } +} + +impl From<&ImportStatement> for Vec { + fn from(import: &ImportStatement) -> Self { + match &import.selector { + ImportSelector::List { items } => { + items + .iter() + .map(|i| { + let as_str = match &i.alias { + Some(s) => format!(" as {}", s.name), + None => String::new(), + }; + CompletionItem { + label: i.identifier().to_owned(), + // TODO we can only find this after opening the module + kind: None, + detail: Some(format!("{}{as_str} from '{}'", i.name.name, import.path)), + ..CompletionItem::default() + } + }) + .collect() + } + // TODO can't do completion for glob imports without static name resolution + ImportSelector::Glob(_) => vec![], + ImportSelector::None { .. } => vec![CompletionItem { + label: import.module_name().unwrap(), + kind: Some(CompletionItemKind::MODULE), + detail: Some(format!("from '{}'", import.path)), + ..CompletionItem::default() + }], } } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] pub struct ExpressionStatement { - pub start: usize, - pub end: usize, pub expression: Expr, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -1162,42 +1361,97 @@ pub struct ExpressionStatement { pub digest: Option, } -impl_value_meta!(ExpressionStatement); - -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] pub struct CallExpression { - pub start: usize, - pub end: usize, - pub callee: Identifier, + pub callee: Node, pub arguments: Vec, - pub optional: bool, #[serde(default, skip_serializing_if = "Option::is_none")] #[ts(optional)] pub digest: Option, } -impl_value_meta!(CallExpression); +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] +#[ts(export)] +#[serde(tag = "type")] +pub struct CallExpressionKw { + pub callee: Node, + pub unlabeled: Option, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub arguments: Vec, -impl From for Expr { - fn from(call_expression: CallExpression) -> Self { + #[serde(default, skip_serializing_if = "Option::is_none")] + #[ts(optional)] + pub digest: Option, +} + +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] +#[ts(export)] +#[serde(tag = "type")] +pub struct LabeledArg { + pub label: Identifier, + pub arg: Expr, +} + +impl From> for Expr { + fn from(call_expression: Node) -> Self { Expr::CallExpression(Box::new(call_expression)) } } +impl From> for Expr { + fn from(call_expression: Node) -> Self { + Expr::CallExpressionKw(Box::new(call_expression)) + } +} + +impl Node { + /// Return the constraint level for this call expression. + pub fn get_constraint_level(&self) -> ConstraintLevel { + if self.arguments.is_empty() { + return ConstraintLevel::Ignore { + source_ranges: vec![self.into()], + }; + } + + // Iterate over the arguments and get the constraint level for each one. + let mut constraint_levels = ConstraintLevels::new(); + for arg in &self.arguments { + constraint_levels.push(arg.get_constraint_level()); + } + + constraint_levels.get_constraint_level(self.into()) + } +} + +impl Node { + /// Return the constraint level for this call expression. + pub fn get_constraint_level(&self) -> ConstraintLevel { + if self.arguments.is_empty() { + return ConstraintLevel::Ignore { + source_ranges: vec![self.into()], + }; + } + + // Iterate over the arguments and get the constraint level for each one. + let mut constraint_levels = ConstraintLevels::new(); + for arg in &self.arguments { + constraint_levels.push(arg.arg.get_constraint_level()); + } + + constraint_levels.get_constraint_level(self.into()) + } +} + impl CallExpression { - pub fn new(name: &str, arguments: Vec) -> Result { - Ok(Self { - start: 0, - end: 0, + pub fn new(name: &str, arguments: Vec) -> Result, KclError> { + Ok(Node::no_src(Self { callee: Identifier::new(name), arguments, - optional: false, digest: None, - }) + })) } /// Is at least one argument the '%' i.e. the substitution operator? @@ -1207,10 +1461,6 @@ impl CallExpression { .any(|arg| matches!(arg, Expr::PipeSubstitution(_))) } - pub fn as_source_ranges(&self) -> Vec { - vec![SourceRange([self.start, self.end])] - } - pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { for arg in &mut self.arguments { arg.replace_value(source_range, new_value.clone()); @@ -1249,22 +1499,67 @@ impl CallExpression { arg.rename_identifiers(old_name, new_name); } } +} - /// Return the constraint level for this call expression. - pub fn get_constraint_level(&self) -> ConstraintLevel { - if self.arguments.is_empty() { - return ConstraintLevel::Ignore { - source_ranges: vec![self.into()], - }; +impl CallExpressionKw { + pub fn new(name: &str, unlabeled: Option, arguments: Vec) -> Result, KclError> { + Ok(Node::no_src(Self { + callee: Identifier::new(name), + unlabeled, + arguments, + digest: None, + })) + } + + /// Iterate over all arguments (labeled or not) + pub fn iter_arguments(&self) -> impl Iterator { + self.unlabeled.iter().chain(self.arguments.iter().map(|arg| &arg.arg)) + } + + /// Is at least one argument the '%' i.e. the substitution operator? + pub fn has_substitution_arg(&self) -> bool { + self.arguments + .iter() + .any(|arg| matches!(arg.arg, Expr::PipeSubstitution(_))) + } + + pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { + for arg in &mut self.arguments { + arg.arg.replace_value(source_range, new_value.clone()); + } + } + + /// Returns a hover value that includes the given character position. + pub fn get_hover_value_for_position(&self, pos: usize, code: &str) -> Option { + let callee_source_range: SourceRange = self.callee.clone().into(); + if callee_source_range.contains(pos) { + return Some(Hover::Function { + name: self.callee.name.clone(), + range: callee_source_range.to_lsp_range(code), + }); } - // Iterate over the arguments and get the constraint level for each one. - let mut constraint_levels = ConstraintLevels::new(); - for arg in &self.arguments { - constraint_levels.push(arg.get_constraint_level()); + for (index, arg) in self.iter_arguments().enumerate() { + let source_range: SourceRange = arg.into(); + if source_range.contains(pos) { + return Some(Hover::Signature { + name: self.callee.name.clone(), + parameter_index: index as u32, + range: source_range.to_lsp_range(code), + }); + } } - constraint_levels.get_constraint_level(self.into()) + None + } + + /// Rename all identifiers that have the old name to the new given name. + fn rename_identifiers(&mut self, old_name: &str, new_name: &str) { + self.callee.rename(old_name, new_name); + + for arg in &mut self.arguments { + arg.arg.rename_identifiers(old_name, new_name); + } } } @@ -1278,11 +1573,6 @@ pub enum Function { /// The function. func: Box, }, - /// A stdlib function written in KCL. - StdLibKcl { - /// The function. - func: Box, - }, /// A function that is defined in memory. #[default] InMemory, @@ -1298,10 +1588,7 @@ impl PartialEq for Function { } } -#[derive( - Debug, Default, Clone, Copy, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, FromStr, Display, Bake, -)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Default, Clone, Copy, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, FromStr, Display)] #[ts(export)] #[serde(rename_all = "snake_case")] #[display(style = "snake_case")] @@ -1312,26 +1599,16 @@ pub enum ItemVisibility { } impl ItemVisibility { - fn digestable_id(&self) -> [u8; 1] { - match self { - ItemVisibility::Default => [0], - ItemVisibility::Export => [1], - } - } - fn is_default(&self) -> bool { matches!(self, Self::Default) } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] pub struct VariableDeclaration { - pub start: usize, - pub end: usize, - pub declarations: Vec, + pub declaration: Node, #[serde(default, skip_serializing_if = "ItemVisibility::is_default")] pub visibility: ItemVisibility, pub kind: VariableKind, // Change to enum if there are specific values @@ -1343,49 +1620,19 @@ pub struct VariableDeclaration { impl From<&VariableDeclaration> for Vec { fn from(declaration: &VariableDeclaration) -> Self { - let mut completions = vec![]; - for variable in &declaration.declarations { - completions.push(CompletionItem { - label: variable.id.name.to_string(), - label_details: None, - kind: Some(match declaration.kind { - VariableKind::Const => CompletionItemKind::CONSTANT, - VariableKind::Fn => CompletionItemKind::FUNCTION, - }), - detail: Some(declaration.kind.to_string()), - documentation: None, - deprecated: None, - preselect: None, - sort_text: None, - filter_text: None, - insert_text: None, - insert_text_format: None, - insert_text_mode: None, - text_edit: None, - additional_text_edits: None, - command: None, - commit_characters: None, - data: None, - tags: None, - }) - } - completions + vec![CompletionItem { + label: declaration.declaration.id.name.to_string(), + kind: Some(match declaration.kind { + VariableKind::Const => CompletionItemKind::CONSTANT, + VariableKind::Fn => CompletionItemKind::FUNCTION, + }), + detail: Some(declaration.kind.to_string()), + ..CompletionItem::default() + }] } } -impl_value_meta!(VariableDeclaration); - -impl VariableDeclaration { - pub fn new(declarations: Vec, visibility: ItemVisibility, kind: VariableKind) -> Self { - Self { - start: 0, - end: 0, - declarations, - visibility, - kind, - digest: None, - } - } +impl Node { pub fn get_lsp_folding_range(&self) -> Option { let recasted = self.recast(&FormatOptions::default(), 0); // If the recasted value only has one line, don't fold it. @@ -1397,45 +1644,15 @@ impl VariableDeclaration { let first_line = recasted.lines().next().unwrap().to_string(); Some(FoldingRange { - start_line: (self.start() + first_line.len()) as u32, + start_line: (self.start + first_line.len()) as u32, start_character: None, - end_line: self.end() as u32, + end_line: self.end as u32, end_character: None, kind: Some(FoldingRangeKind::Region), collapsed_text: Some(first_line), }) } - pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { - for declaration in &mut self.declarations { - declaration.init.replace_value(source_range, new_value.clone()); - } - } - - /// Returns an Expr that includes the given character position. - pub fn get_expr_for_position(&self, pos: usize) -> Option<&Expr> { - for declaration in &self.declarations { - let source_range: SourceRange = declaration.into(); - if source_range.contains(pos) { - return Some(&declaration.init); - } - } - - None - } - - /// Returns an Expr that includes the given character position. - pub fn get_mut_expr_for_position(&mut self, pos: usize) -> Option<&mut Expr> { - for declaration in &mut self.declarations { - let source_range: SourceRange = declaration.clone().into(); - if source_range.contains(pos) { - return Some(&mut declaration.init); - } - } - - None - } - /// Rename the variable declaration at the given position. /// This returns the old name of the variable, if it found one. pub fn rename_symbol(&mut self, new_name: &str, pos: usize) -> Option { @@ -1445,79 +1662,106 @@ impl VariableDeclaration { return None; } - for declaration in &mut self.declarations { - let declaration_source_range: SourceRange = declaration.id.clone().into(); - if declaration_source_range.contains(pos) { - let old_name = declaration.id.name.clone(); - declaration.id.name = new_name.to_string(); - return Some(old_name); - } + let declaration_source_range: SourceRange = self.declaration.id.clone().into(); + if declaration_source_range.contains(pos) { + let old_name = self.declaration.id.name.clone(); + self.declaration.id.name = new_name.to_string(); + return Some(old_name); + } + + None + } +} + +impl VariableDeclaration { + pub fn new(declaration: Node, visibility: ItemVisibility, kind: VariableKind) -> Self { + Self { + declaration, + visibility, + kind, + digest: None, + } + } + + pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { + self.declaration.init.replace_value(source_range, new_value.clone()); + } + + /// Returns an Expr that includes the given character position. + pub fn get_expr_for_position(&self, pos: usize) -> Option<&Expr> { + let source_range: SourceRange = self.declaration.clone().into(); + if source_range.contains(pos) { + return Some(&self.declaration.init); + } + + None + } + + /// Returns an Expr that includes the given character position. + pub fn get_mut_expr_for_position(&mut self, pos: usize) -> Option<&mut Expr> { + let source_range: SourceRange = self.declaration.clone().into(); + if source_range.contains(pos) { + return Some(&mut self.declaration.init); } None } pub fn rename_identifiers(&mut self, old_name: &str, new_name: &str) { - for declaration in &mut self.declarations { - // Skip the init for the variable with the new name since it is the one we are renaming. - if declaration.id.name == new_name { - continue; - } - - declaration.init.rename_identifiers(old_name, new_name); + // Skip the init for the variable with the new name since it is the one we are renaming. + if self.declaration.id.name != new_name { + self.declaration.init.rename_identifiers(old_name, new_name); } } pub fn get_lsp_symbols(&self, code: &str) -> Vec { - let mut symbols = vec![]; + let source_range: SourceRange = self.declaration.clone().into(); + let inner_source_range: SourceRange = self.declaration.id.clone().into(); - for declaration in &self.declarations { - let source_range: SourceRange = declaration.into(); - let inner_source_range: SourceRange = declaration.id.clone().into(); + let mut symbol_kind = match self.kind { + VariableKind::Fn => SymbolKind::FUNCTION, + VariableKind::Const => SymbolKind::CONSTANT, + }; - let mut symbol_kind = match self.kind { - VariableKind::Fn => SymbolKind::FUNCTION, - VariableKind::Const => SymbolKind::CONSTANT, - }; - - let children = match &declaration.init { - Expr::FunctionExpression(function_expression) => { - symbol_kind = SymbolKind::FUNCTION; - let mut children = vec![]; - for param in &function_expression.params { - let param_source_range: SourceRange = (¶m.identifier).into(); - #[allow(deprecated)] - children.push(DocumentSymbol { - name: param.identifier.name.clone(), - detail: None, - kind: SymbolKind::CONSTANT, - range: param_source_range.to_lsp_range(code), - selection_range: param_source_range.to_lsp_range(code), - children: None, - tags: None, - deprecated: None, - }); - } - children + let children = match &self.declaration.init { + Expr::FunctionExpression(function_expression) => { + symbol_kind = SymbolKind::FUNCTION; + let mut children = vec![]; + for param in &function_expression.params { + let param_source_range: SourceRange = (¶m.identifier).into(); + #[allow(deprecated)] + children.push(DocumentSymbol { + name: param.identifier.name.clone(), + detail: None, + kind: SymbolKind::CONSTANT, + range: param_source_range.to_lsp_range(code), + selection_range: param_source_range.to_lsp_range(code), + children: None, + tags: None, + deprecated: None, + }); } - Expr::ObjectExpression(object_expression) => { - symbol_kind = SymbolKind::OBJECT; - let mut children = vec![]; - for property in &object_expression.properties { - children.extend(property.get_lsp_symbols(code)); - } - children + children + } + Expr::ObjectExpression(object_expression) => { + symbol_kind = SymbolKind::OBJECT; + let mut children = vec![]; + for property in &object_expression.properties { + children.extend(property.get_lsp_symbols(code)); } - Expr::ArrayExpression(_) => { - symbol_kind = SymbolKind::ARRAY; - vec![] - } - _ => vec![], - }; + children + } + Expr::ArrayExpression(_) => { + symbol_kind = SymbolKind::ARRAY; + vec![] + } + _ => vec![], + }; + vec![ #[allow(deprecated)] - symbols.push(DocumentSymbol { - name: declaration.id.name.clone(), + DocumentSymbol { + name: self.declaration.id.name.clone(), detail: Some(self.kind.to_string()), kind: symbol_kind, range: source_range.to_lsp_range(code), @@ -1525,15 +1769,12 @@ impl VariableDeclaration { children: Some(children), tags: None, deprecated: None, - }); - } - - symbols + }, + ] } } -#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, FromStr, Display, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, FromStr, Display)] #[ts(export)] #[serde(rename_all = "snake_case")] #[display(style = "snake_case")] @@ -1545,13 +1786,6 @@ pub enum VariableKind { } impl VariableKind { - fn digestable_id(&self) -> [u8; 1] { - match self { - VariableKind::Const => [2], - VariableKind::Fn => [3], - } - } - pub fn to_completion_items() -> Result> { let mut settings = schemars::gen::SchemaSettings::openapi3(); settings.inline_subschemas = true; @@ -1580,15 +1814,12 @@ impl VariableKind { } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] pub struct VariableDeclarator { - pub start: usize, - pub end: usize, /// The identifier of the variable. - pub id: Identifier, + pub id: Node, /// The value of the variable. pub init: Expr, @@ -1597,17 +1828,13 @@ pub struct VariableDeclarator { pub digest: Option, } -impl_value_meta!(VariableDeclarator); - impl VariableDeclarator { - pub fn new(name: &str, init: Expr) -> Self { - Self { - start: 0, - end: 0, + pub fn new(name: &str, init: Expr) -> Node { + Node::no_src(Self { id: Identifier::new(name), init, digest: None, - } + }) } pub fn get_constraint_level(&self) -> ConstraintLevel { @@ -1615,13 +1842,10 @@ impl VariableDeclarator { } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] pub struct Literal { - pub start: usize, - pub end: usize, pub value: LiteralValue, pub raw: String, @@ -1630,19 +1854,7 @@ pub struct Literal { pub digest: Option, } -impl_value_meta!(Literal); - -impl Literal { - pub fn new(value: LiteralValue) -> Self { - Self { - start: 0, - end: 0, - raw: JValue::from(value.clone()).to_string(), - value, - digest: None, - } - } - +impl Node { /// Get the constraint level for this literal. /// Literals are always not constrained. pub fn get_constraint_level(&self) -> ConstraintLevel { @@ -1652,35 +1864,44 @@ impl Literal { } } -impl From for KclValue { - fn from(literal: Literal) -> Self { - KclValue::UserVal(UserVal { - value: JValue::from(literal.value.clone()), - meta: vec![Metadata { - source_range: literal.into(), - }], +impl Literal { + pub fn new(value: LiteralValue) -> Node { + Node::no_src(Self { + raw: JValue::from(value.clone()).to_string(), + value, + digest: None, }) } } -impl From<&Box> for KclValue { - fn from(literal: &Box) -> Self { - KclValue::UserVal(UserVal { - value: JValue::from(literal.value.clone()), - meta: vec![Metadata { - source_range: literal.into(), - }], - }) +impl From> for KclValue { + fn from(literal: Node) -> Self { + let meta = vec![literal.metadata()]; + match literal.inner.value { + LiteralValue::Number(value) => KclValue::Number { value, meta }, + LiteralValue::String(value) => KclValue::String { value, meta }, + LiteralValue::Bool(value) => KclValue::Bool { value, meta }, + } } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake, Eq)] -#[databake(path = kcl_lib::ast::types)] +impl From<&Node> for KclValue { + fn from(literal: &Node) -> Self { + Self::from(literal.to_owned()) + } +} + +impl From<&BoxNode> for KclValue { + fn from(literal: &BoxNode) -> Self { + let b: &Node = literal; + Self::from(b) + } +} + +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Eq)] #[ts(export)] #[serde(tag = "type")] pub struct Identifier { - pub start: usize, - pub end: usize, pub name: String, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -1688,18 +1909,7 @@ pub struct Identifier { pub digest: Option, } -impl_value_meta!(Identifier); - -impl Identifier { - pub fn new(name: &str) -> Self { - Self { - start: 0, - end: 0, - name: name.to_string(), - digest: None, - } - } - +impl Node { /// Get the constraint level for this identifier. /// Identifier are always fully constrained. pub fn get_constraint_level(&self) -> ConstraintLevel { @@ -1707,6 +1917,19 @@ impl Identifier { source_ranges: vec![self.into()], } } +} + +impl Identifier { + pub fn new(name: &str) -> Node { + Node::no_src(Self { + name: name.to_string(), + digest: None, + }) + } + + pub fn is_nameable(&self) -> bool { + !self.name.starts_with('_') + } /// Rename all identifiers that have the old name to the new given name. fn rename(&mut self, old_name: &str, new_name: &str) { @@ -1716,13 +1939,10 @@ impl Identifier { } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake, Eq)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Eq)] #[ts(export)] #[serde(tag = "type")] pub struct TagDeclarator { - pub start: usize, - pub end: usize, #[serde(rename = "value")] pub name: String, @@ -1731,34 +1951,22 @@ pub struct TagDeclarator { pub digest: Option, } -impl_value_meta!(TagDeclarator); +pub type TagNode = Node; -impl From> for SourceRange { - fn from(tag: Box) -> Self { - Self([tag.start, tag.end]) - } -} - -impl From> for Vec { - fn from(tag: Box) -> Self { - vec![tag.into()] - } -} - -impl From<&Box> for KclValue { - fn from(tag: &Box) -> Self { +impl From<&BoxNode> for KclValue { + fn from(tag: &BoxNode) -> Self { KclValue::TagDeclarator(tag.clone()) } } -impl From<&TagDeclarator> for KclValue { - fn from(tag: &TagDeclarator) -> Self { +impl From<&Node> for KclValue { + fn from(tag: &Node) -> Self { KclValue::TagDeclarator(Box::new(tag.clone())) } } -impl From<&TagDeclarator> for TagIdentifier { - fn from(tag: &TagDeclarator) -> Self { +impl From<&Node> for TagIdentifier { + fn from(tag: &Node) -> Self { TagIdentifier { value: tag.name.clone(), info: None, @@ -1769,8 +1977,8 @@ impl From<&TagDeclarator> for TagIdentifier { } } -impl From<&TagDeclarator> for CompletionItem { - fn from(tag: &TagDeclarator) -> Self { +impl From<&Node> for CompletionItem { + fn from(tag: &Node) -> Self { CompletionItem { label: tag.name.to_string(), label_details: None, @@ -1794,16 +2002,7 @@ impl From<&TagDeclarator> for CompletionItem { } } -impl TagDeclarator { - pub fn new(name: &str) -> Self { - Self { - start: 0, - end: 0, - name: name.to_string(), - digest: None, - } - } - +impl Node { /// Get the constraint level for this identifier. /// TagDeclarator are always fully constrained. pub fn get_constraint_level(&self) -> ConstraintLevel { @@ -1812,13 +2011,6 @@ impl TagDeclarator { } } - /// Rename all identifiers that have the old name to the new given name. - fn rename(&mut self, old_name: &str, new_name: &str) { - if self.name == old_name { - self.name = new_name.to_string(); - } - } - pub fn get_lsp_symbols(&self, code: &str) -> Vec { let source_range: SourceRange = self.into(); @@ -1838,50 +2030,47 @@ impl TagDeclarator { } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +impl TagDeclarator { + pub fn new(name: &str) -> Node { + Node::no_src(Self { + name: name.to_string(), + digest: None, + }) + } + + /// Rename all identifiers that have the old name to the new given name. + fn rename(&mut self, old_name: &str, new_name: &str) { + if self.name == old_name { + self.name = new_name.to_string(); + } + } +} + +#[derive(Debug, Default, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] pub struct PipeSubstitution { - pub start: usize, - pub end: usize, - #[serde(default, skip_serializing_if = "Option::is_none")] #[ts(optional)] pub digest: Option, } -impl_value_meta!(PipeSubstitution); - impl PipeSubstitution { - pub fn new() -> Self { - Self { - start: 0, - end: 0, - digest: None, - } + pub fn new() -> Node { + Node::no_src(Self { digest: None }) } } -impl Default for PipeSubstitution { - fn default() -> Self { - Self::new() - } -} - -impl From for Expr { - fn from(pipe_substitution: PipeSubstitution) -> Self { +impl From> for Expr { + fn from(pipe_substitution: Node) -> Self { Expr::PipeSubstitution(Box::new(pipe_substitution)) } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(rename_all = "camelCase", tag = "type")] pub struct ArrayExpression { - pub start: usize, - pub end: usize, pub elements: Vec, #[serde(default, skip_serializing_if = "NonCodeMeta::is_empty")] pub non_code_meta: NonCodeMeta, @@ -1891,31 +2080,13 @@ pub struct ArrayExpression { pub digest: Option, } -impl_value_meta!(ArrayExpression); - -impl From for Expr { - fn from(array_expression: ArrayExpression) -> Self { +impl From> for Expr { + fn from(array_expression: Node) -> Self { Expr::ArrayExpression(Box::new(array_expression)) } } -impl ArrayExpression { - pub fn new(elements: Vec) -> Self { - Self { - start: 0, - end: 0, - elements, - non_code_meta: Default::default(), - digest: None, - } - } - - pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { - for element in &mut self.elements { - element.replace_value(source_range, new_value.clone()); - } - } - +impl Node { pub fn get_constraint_level(&self) -> ConstraintLevel { if self.elements.is_empty() { return ConstraintLevel::Ignore { @@ -1930,6 +2101,22 @@ impl ArrayExpression { constraint_levels.get_constraint_level(self.into()) } +} + +impl ArrayExpression { + pub fn new(elements: Vec) -> Node { + Node::no_src(Self { + elements, + non_code_meta: Default::default(), + digest: None, + }) + } + + pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { + for element in &mut self.elements { + element.replace_value(source_range, new_value.clone()); + } + } /// Returns a hover value that includes the given character position. pub fn get_hover_value_for_position(&self, pos: usize, code: &str) -> Option { @@ -1951,15 +2138,12 @@ impl ArrayExpression { } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(rename_all = "camelCase", tag = "type")] pub struct ArrayRangeExpression { - pub start: usize, - pub end: usize, - pub start_element: Box, - pub end_element: Box, + pub start_element: Expr, + pub end_element: Expr, /// Is the `end_element` included in the range? pub end_inclusive: bool, // TODO (maybe) comments on range components? @@ -1968,31 +2152,13 @@ pub struct ArrayRangeExpression { pub digest: Option, } -impl_value_meta!(ArrayRangeExpression); - -impl From for Expr { - fn from(array_expression: ArrayRangeExpression) -> Self { +impl From> for Expr { + fn from(array_expression: Node) -> Self { Expr::ArrayRangeExpression(Box::new(array_expression)) } } -impl ArrayRangeExpression { - pub fn new(start_element: Box, end_element: Box) -> Self { - Self { - start: 0, - end: 0, - start_element, - end_element, - end_inclusive: true, - digest: None, - } - } - - pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { - self.start_element.replace_value(source_range, new_value.clone()); - self.end_element.replace_value(source_range, new_value.clone()); - } - +impl Node { pub fn get_constraint_level(&self) -> ConstraintLevel { let mut constraint_levels = ConstraintLevels::new(); constraint_levels.push(self.start_element.get_constraint_level()); @@ -2000,10 +2166,26 @@ impl ArrayRangeExpression { constraint_levels.get_constraint_level(self.into()) } +} + +impl ArrayRangeExpression { + pub fn new(start_element: Expr, end_element: Expr) -> Node { + Node::no_src(Self { + start_element, + end_element, + end_inclusive: true, + digest: None, + }) + } + + pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { + self.start_element.replace_value(source_range, new_value.clone()); + self.end_element.replace_value(source_range, new_value.clone()); + } /// Returns a hover value that includes the given character position. pub fn get_hover_value_for_position(&self, pos: usize, code: &str) -> Option { - for element in [&*self.start_element, &*self.end_element] { + for element in [&self.start_element, &self.end_element] { let element_source_range: SourceRange = element.into(); if element_source_range.contains(pos) { return element.get_hover_value_for_position(pos, code); @@ -2020,14 +2202,11 @@ impl ArrayRangeExpression { } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(rename_all = "camelCase", tag = "type")] pub struct ObjectExpression { - pub start: usize, - pub end: usize, - pub properties: Vec, + pub properties: NodeList, #[serde(default, skip_serializing_if = "NonCodeMeta::is_empty")] pub non_code_meta: NonCodeMeta, @@ -2036,23 +2215,7 @@ pub struct ObjectExpression { pub digest: Option, } -impl ObjectExpression { - pub fn new(properties: Vec) -> Self { - Self { - start: 0, - end: 0, - properties, - non_code_meta: Default::default(), - digest: None, - } - } - - pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { - for property in &mut self.properties { - property.value.replace_value(source_range, new_value.clone()); - } - } - +impl Node { pub fn get_constraint_level(&self) -> ConstraintLevel { if self.properties.is_empty() { return ConstraintLevel::Ignore { @@ -2067,6 +2230,22 @@ impl ObjectExpression { constraint_levels.get_constraint_level(self.into()) } +} + +impl ObjectExpression { + pub fn new(properties: NodeList) -> Node { + Node::no_src(Self { + properties, + non_code_meta: Default::default(), + digest: None, + }) + } + + pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { + for property in &mut self.properties { + property.value.replace_value(source_range, new_value.clone()); + } + } /// Returns a hover value that includes the given character position. pub fn get_hover_value_for_position(&self, pos: usize, code: &str) -> Option { @@ -2088,16 +2267,11 @@ impl ObjectExpression { } } -impl_value_meta!(ObjectExpression); - -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] pub struct ObjectProperty { - pub start: usize, - pub end: usize, - pub key: Identifier, + pub key: Node, pub value: Expr, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -2105,9 +2279,7 @@ pub struct ObjectProperty { pub digest: Option, } -impl_value_meta!(ObjectProperty); - -impl ObjectProperty { +impl Node { pub fn get_lsp_symbols(&self, code: &str) -> Vec { let source_range: SourceRange = self.clone().into(); let inner_source_range: SourceRange = self.key.clone().into(); @@ -2125,7 +2297,9 @@ impl ObjectProperty { }, ] } +} +impl ObjectProperty { /// Returns a hover value that includes the given character position. pub fn get_hover_value_for_position(&self, pos: usize, code: &str) -> Option { let value_source_range: SourceRange = self.value.clone().into(); @@ -2137,13 +2311,12 @@ impl ObjectProperty { } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] pub enum MemberObject { - MemberExpression(Box), - Identifier(Box), + MemberExpression(BoxNode), + Identifier(BoxNode), } impl MemberObject { @@ -2174,23 +2347,22 @@ impl MemberObject { impl From for SourceRange { fn from(obj: MemberObject) -> Self { - Self([obj.start(), obj.end()]) + Self::new(obj.start(), obj.end(), obj.module_id()) } } impl From<&MemberObject> for SourceRange { fn from(obj: &MemberObject) -> Self { - Self([obj.start(), obj.end()]) + Self::new(obj.start(), obj.end(), obj.module_id()) } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] pub enum LiteralIdentifier { - Identifier(Box), - Literal(Box), + Identifier(BoxNode), + Literal(BoxNode), } impl LiteralIdentifier { @@ -2211,23 +2383,20 @@ impl LiteralIdentifier { impl From for SourceRange { fn from(id: LiteralIdentifier) -> Self { - Self([id.start(), id.end()]) + Self::new(id.start(), id.end(), id.module_id()) } } impl From<&LiteralIdentifier> for SourceRange { fn from(id: &LiteralIdentifier) -> Self { - Self([id.start(), id.end()]) + Self::new(id.start(), id.end(), id.module_id()) } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] pub struct MemberExpression { - pub start: usize, - pub end: usize, pub object: MemberObject, pub property: LiteralIdentifier, pub computed: bool, @@ -2237,9 +2406,7 @@ pub struct MemberExpression { pub digest: Option, } -impl_value_meta!(MemberExpression); - -impl MemberExpression { +impl Node { /// Get the constraint level for a member expression. /// This is always fully constrained. pub fn get_constraint_level(&self) -> ConstraintLevel { @@ -2247,7 +2414,9 @@ impl MemberExpression { source_ranges: vec![self.into()], } } +} +impl MemberExpression { /// Returns a hover value that includes the given character position. pub fn get_hover_value_for_position(&self, pos: usize, code: &str) -> Option { let object_source_range: SourceRange = self.object.clone().into(); @@ -2282,13 +2451,10 @@ pub struct ObjectKeyInfo { pub computed: bool, } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] pub struct BinaryExpression { - pub start: usize, - pub end: usize, pub operator: BinaryOperator, pub left: BinaryPart, pub right: BinaryPart, @@ -2298,25 +2464,7 @@ pub struct BinaryExpression { pub digest: Option, } -impl_value_meta!(BinaryExpression); - -impl BinaryExpression { - pub fn new(operator: BinaryOperator, left: BinaryPart, right: BinaryPart) -> Self { - Self { - start: left.start(), - end: right.end(), - operator, - left, - right, - digest: None, - } - } - - pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { - self.left.replace_value(source_range, new_value.clone()); - self.right.replace_value(source_range, new_value); - } - +impl Node { pub fn get_constraint_level(&self) -> ConstraintLevel { let left_constraint_level = self.left.get_constraint_level(); let right_constraint_level = self.right.get_constraint_level(); @@ -2326,6 +2474,22 @@ impl BinaryExpression { constraint_levels.push(right_constraint_level); constraint_levels.get_constraint_level(self.into()) } +} + +impl BinaryExpression { + pub fn new(operator: BinaryOperator, left: BinaryPart, right: BinaryPart) -> Node { + Node::no_src(Self { + operator, + left, + right, + digest: None, + }) + } + + pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { + self.left.replace_value(source_range, new_value.clone()); + self.right.replace_value(source_range, new_value); + } pub fn precedence(&self) -> u8 { self.operator.precedence() @@ -2354,8 +2518,7 @@ impl BinaryExpression { } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, FromStr, Display, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, FromStr, Display)] #[ts(export)] #[serde(rename_all = "snake_case")] #[display(style = "snake_case")] @@ -2408,6 +2571,14 @@ pub enum BinaryOperator { #[serde(rename = "<=")] #[display("<=")] Lte, + /// Are both left and right true? + #[serde(rename = "&")] + #[display("&")] + And, + /// Is either left or right true? + #[serde(rename = "|")] + #[display("|")] + Or, } /// Mathematical associativity. @@ -2442,6 +2613,8 @@ impl BinaryOperator { BinaryOperator::Gte => *b"gte", BinaryOperator::Lt => *b"ltr", BinaryOperator::Lte => *b"lte", + BinaryOperator::And => *b"and", + BinaryOperator::Or => *b"lor", } } @@ -2454,6 +2627,8 @@ impl BinaryOperator { BinaryOperator::Pow => 13, Self::Gt | Self::Gte | Self::Lt | Self::Lte => 9, Self::Eq | Self::Neq => 8, + Self::And => 7, + Self::Or => 6, } } @@ -2464,16 +2639,14 @@ impl BinaryOperator { Self::Add | Self::Sub | Self::Mul | Self::Div | Self::Mod => Associativity::Left, Self::Pow => Associativity::Right, Self::Gt | Self::Gte | Self::Lt | Self::Lte | Self::Eq | Self::Neq => Associativity::Left, // I don't know if this is correct + Self::And | Self::Or => Associativity::Left, } } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] pub struct UnaryExpression { - pub start: usize, - pub end: usize, pub operator: UnaryOperator, pub argument: BinaryPart, @@ -2482,17 +2655,13 @@ pub struct UnaryExpression { pub digest: Option, } -impl_value_meta!(UnaryExpression); - impl UnaryExpression { - pub fn new(operator: UnaryOperator, argument: BinaryPart) -> Self { - Self { - start: 0, - end: argument.end(), + pub fn new(operator: UnaryOperator, argument: BinaryPart) -> Node { + Node::no_src(Self { operator, argument, digest: None, - } + }) } pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { @@ -2519,8 +2688,7 @@ impl UnaryExpression { } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, FromStr, Display, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, FromStr, Display)] #[ts(export)] #[serde(rename_all = "snake_case")] #[display(style = "snake_case")] @@ -2544,13 +2712,10 @@ impl UnaryOperator { } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(rename_all = "camelCase", tag = "type")] pub struct PipeExpression { - pub start: usize, - pub end: usize, // TODO: Only the first body expression can be any Value. // The rest will be CallExpression, and the AST type should reflect this. pub body: Vec, @@ -2562,31 +2727,13 @@ pub struct PipeExpression { pub digest: Option, } -impl_value_meta!(PipeExpression); - -impl From for Expr { - fn from(pipe_expression: PipeExpression) -> Self { +impl From> for Expr { + fn from(pipe_expression: Node) -> Self { Expr::PipeExpression(Box::new(pipe_expression)) } } -impl PipeExpression { - pub fn new(body: Vec) -> Self { - Self { - start: 0, - end: 0, - body, - non_code_meta: Default::default(), - digest: None, - } - } - - pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { - for value in &mut self.body { - value.replace_value(source_range, new_value.clone()); - } - } - +impl Node { pub fn get_constraint_level(&self) -> ConstraintLevel { if self.body.is_empty() { return ConstraintLevel::Ignore { @@ -2602,6 +2749,22 @@ impl PipeExpression { constraint_levels.get_constraint_level(self.into()) } +} + +impl PipeExpression { + pub fn new(body: Vec) -> Node { + Node::no_src(Self { + body, + non_code_meta: Default::default(), + digest: None, + }) + } + + pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { + for value in &mut self.body { + value.replace_value(source_range, new_value.clone()); + } + } /// Returns a hover value that includes the given character position. pub fn get_hover_value_for_position(&self, pos: usize, code: &str) -> Option { @@ -2615,11 +2778,6 @@ impl PipeExpression { None } - #[async_recursion] - pub async fn get_result(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { - execute_pipe_body(exec_state, &self.body, self.into(), ctx).await - } - /// Rename all identifiers that have the old name to the new given name. fn rename_identifiers(&mut self, old_name: &str, new_name: &str) { for statement in &mut self.body { @@ -2628,8 +2786,7 @@ impl PipeExpression { } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, JsonSchema, Bake, FromStr, Display)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, JsonSchema, FromStr, Display)] #[serde(tag = "type")] #[display(style = "snake_case")] pub enum FnArgPrimitive { @@ -2665,8 +2822,7 @@ impl FnArgPrimitive { } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, JsonSchema)] #[serde(tag = "type")] pub enum FnArgType { /// A primitive type. @@ -2679,35 +2835,96 @@ pub enum FnArgType { }, } +/// Default value for a parameter of a KCL function. +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] +#[ts(export)] +#[serde(tag = "type")] +#[allow(clippy::large_enum_variant)] +pub enum DefaultParamVal { + KclNone(KclNone), + Literal(Literal), +} + +// TODO: This should actually take metadata. +impl From for KclValue { + fn from(v: DefaultParamVal) -> Self { + match v { + DefaultParamVal::KclNone(kcl_none) => Self::KclNone { + value: kcl_none, + meta: Default::default(), + }, + DefaultParamVal::Literal(literal) => Self::from_literal(literal.value, Vec::new()), + } + } +} + +impl DefaultParamVal { + /// KCL none. + pub(crate) fn none() -> Self { + Self::KclNone(KclNone::default()) + } +} + /// Parameter of a KCL function. -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] pub struct Parameter { /// The parameter's label or name. - pub identifier: Identifier, + pub identifier: Node, /// The type of the parameter. /// This is optional if the user defines a type. - #[serde(skip)] + #[serde(default, skip_serializing_if = "Option::is_none")] + #[ts(skip)] pub type_: Option, /// Is the parameter optional? - pub optional: bool, + /// If so, what is its default value? + /// If this is None, then the parameter is required. + /// Defaults to None. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub default_value: Option, + /// Functions may declare at most one parameter without label, prefixed by '@', and it must be the first parameter. + #[serde(default = "return_true", skip_serializing_if = "is_true")] + pub labeled: bool, #[serde(default, skip_serializing_if = "Option::is_none")] #[ts(optional)] pub digest: Option, } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +impl Parameter { + /// Is the parameter optional? + pub fn optional(&self) -> bool { + self.default_value.is_some() + } +} + +impl From<&Parameter> for SourceRange { + fn from(p: &Parameter) -> Self { + let sr = Self::from(&p.identifier); + // If it's unlabelled, the span should start 1 char earlier than the identifier, + // to include the '@' symbol. + if !p.labeled { + return Self::new(sr.start() - 1, sr.end(), sr.module_id()); + } + sr + } +} + +fn is_true(b: &bool) -> bool { + *b +} + +fn return_true() -> bool { + true +} + +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] pub struct FunctionExpression { - pub start: usize, - pub end: usize, pub params: Vec, - pub body: Program, + pub body: Node, #[serde(skip)] pub return_type: Option, @@ -2716,8 +2933,6 @@ pub struct FunctionExpression { pub digest: Option, } -impl_value_meta!(FunctionExpression); - #[derive(Debug, PartialEq, Clone)] pub struct RequiredParamAfterOptionalParam(pub Box); @@ -2727,20 +2942,20 @@ impl std::fmt::Display for RequiredParamAfterOptionalParam { } } -impl FunctionExpression { +impl Node { /// Function expressions don't really apply. pub fn get_constraint_level(&self) -> ConstraintLevel { ConstraintLevel::Ignore { source_ranges: vec![self.into()], } } +} +impl FunctionExpression { pub fn required_and_optional_params( &self, ) -> Result<(&[Parameter], &[Parameter]), RequiredParamAfterOptionalParam> { let Self { - start: _, - end: _, params, body: _, digest: _, @@ -2748,13 +2963,13 @@ impl FunctionExpression { } = self; let mut found_optional = false; for param in params { - if param.optional { + if param.optional() { found_optional = true; } else if found_optional { return Err(RequiredParamAfterOptionalParam(Box::new(param.clone()))); } } - let boundary = self.params.partition_point(|param| !param.optional); + let boundary = self.params.partition_point(|param| !param.optional()); // SAFETY: split_at panics if the boundary is greater than the length. Ok(self.params.split_at(boundary)) } @@ -2765,7 +2980,7 @@ impl FunctionExpression { let end_of_required_params = self .params .iter() - .position(|param| param.optional) + .position(|param| param.optional()) // If there's no optional params, then all the params are required params. .unwrap_or(self.params.len()); &self.params[..end_of_required_params] @@ -2790,13 +3005,10 @@ impl FunctionExpression { } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] pub struct ReturnStatement { - pub start: usize, - pub end: usize, pub argument: Expr, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -2804,8 +3016,6 @@ pub struct ReturnStatement { pub digest: Option, } -impl_value_meta!(ReturnStatement); - /// Describes information about a hover. #[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] #[serde(rename_all = "camelCase")] @@ -2827,7 +3037,6 @@ pub enum Hover { /// Format options. #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] -#[cfg_attr(feature = "pyo3", pyo3::pyclass)] #[ts(export)] #[serde(rename_all = "camelCase")] pub struct FormatOptions { @@ -3016,17 +3225,6 @@ impl ConstraintLevels { } } -pub(crate) fn human_friendly_type(j: &JValue) -> &'static str { - match j { - JValue::Null => "null", - JValue::Bool(_) => "boolean (true/false value)", - JValue::Number(_) => "number", - JValue::String(_) => "string (text)", - JValue::Array(_) => "array (list)", - JValue::Object(_) => "object", - } -} - #[cfg(test)] mod tests { use pretty_assertions::assert_eq; @@ -3062,9 +3260,7 @@ fn ghi = (x) => { ghi("things") "#; - let tokens = crate::token::lexer(code).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(code).unwrap(); let folding_ranges = program.get_lsp_folding_ranges(); assert_eq!(folding_ranges.len(), 3); assert_eq!(folding_ranges[0].start_line, 29); @@ -3079,9 +3275,9 @@ ghi("things") folding_ranges[1].collapsed_text, Some("startSketchOn('XY')".to_string()) ); - assert_eq!(folding_ranges[2].start_line, 390); + assert_eq!(folding_ranges[2].start_line, 384); assert_eq!(folding_ranges[2].end_line, 403); - assert_eq!(folding_ranges[2].collapsed_text, Some("fn ghi = (x) => {".to_string())); + assert_eq!(folding_ranges[2].collapsed_text, Some("fn ghi(x) {".to_string())); } #[test] @@ -3100,9 +3296,7 @@ fn ghi = (x) => { return x } "#; - let tokens = crate::token::lexer(code).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(code).unwrap(); let symbols = program.get_lsp_symbols(code).unwrap(); assert_eq!(symbols.len(), 7); } @@ -3122,9 +3316,7 @@ const cylinder = startSketchOn('-XZ') }, %) |> extrude(h, %) "#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let value = program.get_non_code_meta_for_position(50); @@ -3147,9 +3339,7 @@ const cylinder = startSketchOn('-XZ') }, %) |> extrude(h, %) "#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let value = program.get_non_code_meta_for_position(124); @@ -3162,9 +3352,7 @@ const cylinder = startSketchOn('-XZ') |> startProfileAt([0,0], %) |> xLine(5, %) // lin "#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let value = program.get_non_code_meta_for_position(86); @@ -3176,16 +3364,14 @@ const cylinder = startSketchOn('-XZ') let some_program_string = r#"fn thing = (arg0: number, arg1: string, tag?: string) => { return arg0 }"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); // Check the program output for the types of the parameters. let function = program.body.first().unwrap(); let BodyItem::VariableDeclaration(var_decl) = function else { panic!("expected a variable declaration") }; - let Expr::FunctionExpression(ref func_expr) = var_decl.declarations.first().unwrap().init else { + let Expr::FunctionExpression(ref func_expr) = var_decl.declaration.init else { panic!("expected a function expression") }; let params = &func_expr.params; @@ -3200,16 +3386,14 @@ const cylinder = startSketchOn('-XZ') let some_program_string = r#"fn thing = (arg0: number[], arg1: string[], tag?: string) => { return arg0 }"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); // Check the program output for the types of the parameters. let function = program.body.first().unwrap(); let BodyItem::VariableDeclaration(var_decl) = function else { panic!("expected a variable declaration") }; - let Expr::FunctionExpression(ref func_expr) = var_decl.declarations.first().unwrap().init else { + let Expr::FunctionExpression(ref func_expr) = var_decl.declaration.init else { panic!("expected a function expression") }; let params = &func_expr.params; @@ -3224,16 +3408,15 @@ const cylinder = startSketchOn('-XZ') let some_program_string = r#"fn thing = (arg0: number[], arg1: {thing: number, things: string[], more?: string}, tag?: string) => { return arg0 }"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let module_id = ModuleId::default(); + let program = crate::parsing::parse_str(some_program_string, module_id).unwrap(); // Check the program output for the types of the parameters. let function = program.body.first().unwrap(); let BodyItem::VariableDeclaration(var_decl) = function else { panic!("expected a variable declaration") }; - let Expr::FunctionExpression(ref func_expr) = var_decl.declarations.first().unwrap().init else { + let Expr::FunctionExpression(ref func_expr) = var_decl.declaration.init else { panic!("expected a function expression") }; let params = &func_expr.params; @@ -3244,36 +3427,48 @@ const cylinder = startSketchOn('-XZ') Some(FnArgType::Object { properties: vec![ Parameter { - identifier: Identifier { - start: 35, - end: 40, - name: "thing".to_owned(), - digest: None, - }, + identifier: Node::new( + Identifier { + name: "thing".to_owned(), + digest: None, + }, + 35, + 40, + module_id, + ), type_: Some(FnArgType::Primitive(FnArgPrimitive::Number)), - optional: false, - digest: None + default_value: None, + labeled: true, + digest: None, }, Parameter { - identifier: Identifier { - start: 50, - end: 56, - name: "things".to_owned(), - digest: None, - }, + identifier: Node::new( + Identifier { + name: "things".to_owned(), + digest: None, + }, + 50, + 56, + module_id, + ), type_: Some(FnArgType::Array(FnArgPrimitive::String)), - optional: false, + default_value: None, + labeled: true, digest: None }, Parameter { - identifier: Identifier { - start: 68, - end: 72, - name: "more".to_owned(), - digest: None - }, + identifier: Node::new( + Identifier { + name: "more".to_owned(), + digest: None + }, + 68, + 72, + module_id, + ), type_: Some(FnArgType::Primitive(FnArgPrimitive::String)), - optional: true, + labeled: true, + default_value: Some(DefaultParamVal::none()), digest: None } ] @@ -3284,19 +3479,18 @@ const cylinder = startSketchOn('-XZ') #[tokio::test(flavor = "multi_thread")] async fn test_parse_return_type_on_functions() { - let some_program_string = r#"fn thing = () => {thing: number, things: string[], more?: string} { + let some_program_string = r#"fn thing(): {thing: number, things: string[], more?: string} { return 1 }"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let module_id = ModuleId::default(); + let program = crate::parsing::parse_str(some_program_string, module_id).unwrap(); // Check the program output for the types of the parameters. let function = program.body.first().unwrap(); let BodyItem::VariableDeclaration(var_decl) = function else { panic!("expected a variable declaration") }; - let Expr::FunctionExpression(ref func_expr) = var_decl.declarations.first().unwrap().init else { + let Expr::FunctionExpression(ref func_expr) = var_decl.declaration.init else { panic!("expected a function expression") }; let params = &func_expr.params; @@ -3306,36 +3500,48 @@ const cylinder = startSketchOn('-XZ') Some(FnArgType::Object { properties: vec![ Parameter { - identifier: Identifier { - start: 18, - end: 23, - name: "thing".to_owned(), - digest: None - }, + identifier: Node::new( + Identifier { + name: "thing".to_owned(), + digest: None + }, + 13, + 18, + module_id, + ), type_: Some(FnArgType::Primitive(FnArgPrimitive::Number)), - optional: false, + default_value: None, + labeled: true, digest: None }, Parameter { - identifier: Identifier { - start: 33, - end: 39, - name: "things".to_owned(), - digest: None - }, + identifier: Node::new( + Identifier { + name: "things".to_owned(), + digest: None + }, + 28, + 34, + module_id, + ), type_: Some(FnArgType::Array(FnArgPrimitive::String)), - optional: false, + default_value: None, + labeled: true, digest: None }, Parameter { - identifier: Identifier { - start: 51, - end: 55, - name: "more".to_owned(), - digest: None - }, + identifier: Node::new( + Identifier { + name: "more".to_owned(), + digest: None + }, + 46, + 50, + module_id, + ), type_: Some(FnArgType::Primitive(FnArgPrimitive::String)), - optional: true, + labeled: true, + default_value: Some(DefaultParamVal::none()), digest: None } ] @@ -3349,117 +3555,116 @@ const cylinder = startSketchOn('-XZ') ( "no params", (0..=0), - FunctionExpression { - start: 0, - end: 0, + Node::no_src(FunctionExpression { params: vec![], - body: Program { - start: 0, - end: 0, + body: Node::no_src(Program { body: Vec::new(), non_code_meta: Default::default(), + shebang: None, digest: None, - }, + }), return_type: None, digest: None, - }, + }), ), ( "all required params", (1..=1), - FunctionExpression { - start: 0, - end: 0, + Node::no_src(FunctionExpression { params: vec![Parameter { - identifier: Identifier { - start: 0, - end: 0, + identifier: Node::no_src(Identifier { name: "foo".to_owned(), digest: None, - }, + }), type_: None, - optional: false, + default_value: None, + labeled: true, digest: None, }], - body: Program { + body: Node { + inner: Program { + body: Vec::new(), + non_code_meta: Default::default(), + shebang: None, + digest: None, + }, start: 0, end: 0, - body: Vec::new(), - non_code_meta: Default::default(), - digest: None, + module_id: ModuleId::default(), }, return_type: None, digest: None, - }, + }), ), ( "all optional params", (0..=1), - FunctionExpression { - start: 0, - end: 0, + Node::no_src(FunctionExpression { params: vec![Parameter { - identifier: Identifier { - start: 0, - end: 0, + identifier: Node::no_src(Identifier { name: "foo".to_owned(), digest: None, - }, + }), type_: None, - optional: true, + default_value: Some(DefaultParamVal::none()), + labeled: true, digest: None, }], - body: Program { + body: Node { + inner: Program { + body: Vec::new(), + non_code_meta: Default::default(), + shebang: None, + digest: None, + }, start: 0, end: 0, - body: Vec::new(), - non_code_meta: Default::default(), - digest: None, + module_id: ModuleId::default(), }, return_type: None, digest: None, - }, + }), ), ( "mixed params", (1..=2), - FunctionExpression { - start: 0, - end: 0, + Node::no_src(FunctionExpression { params: vec![ Parameter { - identifier: Identifier { - start: 0, - end: 0, + identifier: Node::no_src(Identifier { name: "foo".to_owned(), digest: None, - }, + }), type_: None, - optional: false, + default_value: None, + labeled: true, digest: None, }, Parameter { - identifier: Identifier { - start: 0, - end: 0, + identifier: Node::no_src(Identifier { name: "bar".to_owned(), digest: None, - }, + }), type_: None, - optional: true, + default_value: Some(DefaultParamVal::none()), + labeled: true, digest: None, }, ], - body: Program { + body: Node { + inner: Program { + body: Vec::new(), + non_code_meta: Default::default(), + shebang: None, + digest: None, + }, start: 0, end: 0, - body: Vec::new(), - non_code_meta: Default::default(), - digest: None, + module_id: ModuleId::default(), }, return_type: None, digest: None, - }, + }), ), ] .into_iter() @@ -3473,17 +3678,18 @@ const cylinder = startSketchOn('-XZ') #[tokio::test(flavor = "multi_thread")] async fn test_parse_object_bool() { let some_program_string = r#"some_func({thing: true, other_thing: false})"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); // We want to get the bool and verify it is a bool. - let BodyItem::ExpressionStatement(ExpressionStatement { - expression, - start: _, - end: _, - digest: None, + let BodyItem::ExpressionStatement(Node { + inner: + ExpressionStatement { + expression, + digest: None, + .. + }, + .. }) = program.body.first().unwrap() else { panic!("expected a function!"); @@ -3513,69 +3719,4 @@ const cylinder = startSketchOn('-XZ') assert_eq!(l.raw, "false"); } - - #[tokio::test(flavor = "multi_thread")] - async fn test_parse_tag_named_std_lib() { - let some_program_string = r#"startSketchOn('XY') - |> startProfileAt([0, 0], %) - |> line([5, 5], %, $xLine) -"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let result = parser.ast(); - - assert!(result.is_err()); - assert_eq!( - result.unwrap_err().to_string(), - r#"syntax: KclErrorDetails { source_ranges: [SourceRange([76, 82])], message: "Cannot assign a tag to a reserved keyword: xLine" }"# - ); - } - - #[tokio::test(flavor = "multi_thread")] - async fn test_parse_empty_tag() { - let some_program_string = r#"startSketchOn('XY') - |> startProfileAt([0, 0], %) - |> line([5, 5], %, $) -"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let result = parser.ast(); - - assert!(result.is_err()); - assert_eq!( - result.unwrap_err().to_string(), - r#"syntax: KclErrorDetails { source_ranges: [SourceRange([57, 59])], message: "Unexpected token: |>" }"# - ); - } - - #[tokio::test(flavor = "multi_thread")] - async fn test_parse_digest() { - let prog1_string = r#"startSketchOn('XY') - |> startProfileAt([0, 0], %) - |> line([5, 5], %) -"#; - let prog1_tokens = crate::token::lexer(prog1_string).unwrap(); - let prog1_parser = crate::parser::Parser::new(prog1_tokens); - let prog1_digest = prog1_parser.ast().unwrap().compute_digest(); - - let prog2_string = r#"startSketchOn('XY') - |> startProfileAt([0, 2], %) - |> line([5, 5], %) -"#; - let prog2_tokens = crate::token::lexer(prog2_string).unwrap(); - let prog2_parser = crate::parser::Parser::new(prog2_tokens); - let prog2_digest = prog2_parser.ast().unwrap().compute_digest(); - - assert!(prog1_digest != prog2_digest); - - let prog3_string = r#"startSketchOn('XY') - |> startProfileAt([0, 0], %) - |> line([5, 5], %) -"#; - let prog3_tokens = crate::token::lexer(prog3_string).unwrap(); - let prog3_parser = crate::parser::Parser::new(prog3_tokens); - let prog3_digest = prog3_parser.ast().unwrap().compute_digest(); - - assert_eq!(prog1_digest, prog3_digest); - } } diff --git a/src/wasm-lib/kcl/src/ast/types/none.rs b/src/wasm-lib/kcl/src/parsing/ast/types/none.rs similarity index 69% rename from src/wasm-lib/kcl/src/ast/types/none.rs rename to src/wasm-lib/kcl/src/parsing/ast/types/none.rs index ea4bd7fc8..e52361f31 100644 --- a/src/wasm-lib/kcl/src/ast/types/none.rs +++ b/src/wasm-lib/kcl/src/parsing/ast/types/none.rs @@ -1,45 +1,40 @@ //! KCL has optional parameters. Their type is [`KclOption`]. //! If an optional parameter is not given, it will have a value of type [`KclNone`]. -use databake::*; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use crate::{ - ast::types::ConstraintLevel, - executor::{KclValue, SourceRange, UserVal}, -}; +use super::{super::digest::Digest, Node}; +use crate::{execution::KclValue, parsing::ast::types::ConstraintLevel}; const KCL_NONE_ID: &str = "KCL_NONE_ID"; /// KCL value for an optional parameter which was not given an argument. /// (remember, parameters are in the function declaration, /// arguments are in the function call/application). -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake, Default)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Default, Copy)] #[ts(export)] #[serde(tag = "type")] pub struct KclNone { - // TODO: Convert this to be an Option. - pub start: usize, - pub end: usize, #[serde(deserialize_with = "deser_private")] #[ts(skip)] #[schemars(skip)] __private: Private, + + #[serde(default, skip_serializing_if = "Option::is_none")] + #[ts(optional)] + pub digest: Option, } impl KclNone { - pub fn new(start: usize, end: usize) -> Self { + pub fn new() -> Self { Self { - start, - end, __private: Private {}, + digest: None, } } } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Bake, Default)] -#[databake(path = kcl_lib::ast::types)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] struct Private; impl Serialize for Private { @@ -63,38 +58,27 @@ where } } -impl From<&KclNone> for SourceRange { - fn from(v: &KclNone) -> Self { - Self([v.start, v.end]) - } -} - -impl From<&KclNone> for UserVal { +impl From<&KclNone> for KclValue { fn from(none: &KclNone) -> Self { - UserVal { - value: serde_json::to_value(none).expect("can always serialize a None"), + KclValue::KclNone { + value: *none, meta: Default::default(), } } } -impl From<&KclNone> for KclValue { - fn from(none: &KclNone) -> Self { - let val = UserVal::from(none); - KclValue::UserVal(val) +impl From<&Node> for KclValue { + fn from(none: &Node) -> Self { + Self::from(&none.inner) } } -impl KclNone { - pub fn source_range(&self) -> SourceRange { - SourceRange([self.start, self.end]) - } - +impl Node { /// Get the constraint level. /// KCL None is never constrained. pub fn get_constraint_level(&self) -> ConstraintLevel { ConstraintLevel::None { - source_ranges: vec![self.source_range()], + source_ranges: self.as_source_ranges(), } } } diff --git a/src/wasm-lib/kcl/src/parser/math.rs b/src/wasm-lib/kcl/src/parsing/math.rs similarity index 69% rename from src/wasm-lib/kcl/src/parser/math.rs rename to src/wasm-lib/kcl/src/parsing/math.rs index 4684bc395..9cf718b86 100644 --- a/src/wasm-lib/kcl/src/parser/math.rs +++ b/src/wasm-lib/kcl/src/parsing/math.rs @@ -1,24 +1,24 @@ +// TODO optimise size of CompilationError +#![allow(clippy::result_large_err)] + +use super::CompilationError; use crate::{ - ast::types::{BinaryExpression, BinaryOperator, BinaryPart}, - errors::{KclError, KclErrorDetails}, - executor::SourceRange, + parsing::ast::types::{BinaryExpression, BinaryOperator, BinaryPart, Node}, + SourceRange, }; /// Parses a list of tokens (in infix order, i.e. as the user typed them) /// into a binary expression tree. -pub fn parse(infix_tokens: Vec) -> Result { +pub fn parse(infix_tokens: Vec) -> Result, CompilationError> { let rpn = postfix(infix_tokens); evaluate(rpn) } /// Parses a list of tokens (in postfix order) into a binary expression tree. -fn evaluate(rpn: Vec) -> Result { - let source_ranges = source_range(&rpn); +fn evaluate(rpn: Vec) -> Result, CompilationError> { + let source_range = source_range(&rpn); let mut operand_stack: Vec = Vec::new(); - let e = KclError::Internal(KclErrorDetails { - source_ranges, - message: "error parsing binary math expressions".to_owned(), - }); + let e = CompilationError::fatal(source_range, "error parsing binary math expressions"); for item in rpn { let expr = match item { BinaryExpressionToken::Operator(operator) => { @@ -28,14 +28,21 @@ fn evaluate(rpn: Vec) -> Result o, }; @@ -50,17 +57,17 @@ fn evaluate(rpn: Vec) -> Result Vec { +fn source_range(tokens: &[BinaryExpressionToken]) -> SourceRange { let sources: Vec<_> = tokens .iter() .filter_map(|op| match op { BinaryExpressionToken::Operator(_) => None, - BinaryExpressionToken::Operand(o) => Some((o.start(), o.end())), + BinaryExpressionToken::Operand(o) => Some((o.start(), o.end(), o.module_id())), }) .collect(); match (sources.first(), sources.last()) { - (Some((start, _)), Some((_, end))) => vec![SourceRange([*start, *end])], - _ => Vec::new(), + (Some((start, _, module_id)), Some((_, end, _))) => SourceRange::new(*start, *end, *module_id), + _ => panic!(), } } @@ -119,19 +126,22 @@ impl From for BinaryExpressionToken { #[cfg(test)] mod tests { use super::*; - use crate::ast::types::Literal; + use crate::{parsing::ast::types::Literal, source_range::ModuleId}; #[test] fn parse_and_evaluate() { /// Make a literal fn lit(n: u8) -> BinaryPart { - BinaryPart::Literal(Box::new(Literal { - start: 0, - end: 0, - value: n.into(), - raw: n.to_string(), - digest: None, - })) + BinaryPart::Literal(Box::new(Node::new( + Literal { + value: n.into(), + raw: n.to_string(), + digest: None, + }, + 0, + 0, + ModuleId::default(), + ))) } let tests: Vec> = vec![ // 3 + 4 × 2 ÷ ( 1 − 5 ) ^ 2 ^ 3 @@ -142,14 +152,17 @@ mod tests { BinaryOperator::Mul.into(), lit(2).into(), BinaryOperator::Div.into(), - BinaryPart::BinaryExpression(Box::new(BinaryExpression { - start: 0, - end: 0, - operator: BinaryOperator::Sub, - left: lit(1), - right: lit(5), - digest: None, - })) + BinaryPart::BinaryExpression(Node::boxed( + BinaryExpression { + operator: BinaryOperator::Sub, + left: lit(1), + right: lit(5), + digest: None, + }, + 0, + 0, + ModuleId::default(), + )) .into(), BinaryOperator::Pow.into(), lit(2).into(), diff --git a/src/wasm-lib/kcl/src/parsing/mod.rs b/src/wasm-lib/kcl/src/parsing/mod.rs new file mode 100644 index 000000000..93ba33aac --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/mod.rs @@ -0,0 +1,161 @@ +use crate::{ + errors::{CompilationError, KclError, KclErrorDetails}, + parsing::{ + ast::types::{Node, Program}, + token::TokenStream, + }, + source_range::{ModuleId, SourceRange}, +}; + +pub(crate) mod ast; +mod math; +pub(crate) mod parser; +pub(crate) mod token; + +pub const PIPE_SUBSTITUTION_OPERATOR: &str = "%"; +pub const PIPE_OPERATOR: &str = "|>"; + +// `?` like behavior for `Result`s to return a ParseResult if there is an error. +macro_rules! pr_try { + ($e: expr) => { + match $e { + Ok(a) => a, + Err(e) => return e.into(), + } + }; +} + +#[cfg(test)] +/// Parse the given KCL code into an AST. This is the top-level. +pub fn top_level_parse(code: &str) -> ParseResult { + let module_id = ModuleId::default(); + parse_str(code, module_id) +} + +/// Parse the given KCL code into an AST. +pub fn parse_str(code: &str, module_id: ModuleId) -> ParseResult { + let tokens = pr_try!(crate::parsing::token::lex(code, module_id)); + parse_tokens(tokens) +} + +/// Parse the supplied tokens into an AST. +pub fn parse_tokens(mut tokens: TokenStream) -> ParseResult { + let unknown_tokens = tokens.remove_unknown(); + + if !unknown_tokens.is_empty() { + let source_ranges = unknown_tokens.iter().map(SourceRange::from).collect(); + let token_list = unknown_tokens.iter().map(|t| t.value.as_str()).collect::>(); + let message = if token_list.len() == 1 { + format!("found unknown token '{}'", token_list[0]) + } else { + format!("found unknown tokens [{}]", token_list.join(", ")) + }; + return KclError::Lexical(KclErrorDetails { source_ranges, message }).into(); + } + + // Important, to not call this before the unknown tokens check. + if tokens.is_empty() { + // Empty file should just do nothing. + return Node::::default().into(); + } + + // Check all the tokens are whitespace or comments. + if tokens + .iter() + .all(|t| t.token_type.is_whitespace() || t.token_type.is_comment()) + { + return Node::::default().into(); + } + + parser::run_parser(tokens.as_slice()) +} + +/// Result of parsing. +/// +/// Will be a KclError if there was a lexing error or some unexpected error during parsing. +/// TODO - lexing errors should be included with the parse errors. +/// Will be Ok otherwise, including if there were parsing errors. Any errors or warnings will +/// be in the ParseContext. If an AST was produced, then that will be in the Option. +/// +/// Invariants: +/// - if there are no errors, then the Option will be Some +/// - if the Option is None, then there will be at least one error in the ParseContext. +#[derive(Debug, Clone)] +pub(crate) struct ParseResult(pub Result<(Option>, Vec), KclError>); + +impl ParseResult { + #[cfg(test)] + #[track_caller] + pub fn unwrap(self) -> Node { + if self.0.is_err() || self.0.as_ref().unwrap().0.is_none() { + eprint!("{self:#?}"); + } + self.0.unwrap().0.unwrap() + } + + #[cfg(test)] + pub fn is_ok(&self) -> bool { + match &self.0 { + Ok((p, errs)) => p.is_some() && !errs.iter().any(|e| e.severity.is_err()), + Err(_) => false, + } + } + + #[cfg(test)] + #[track_caller] + pub fn unwrap_errs(&self) -> impl Iterator { + self.0.as_ref().unwrap().1.iter().filter(|e| e.severity.is_err()) + } + + /// Treat parsing errors as an Error. + pub fn parse_errs_as_err(self) -> Result, KclError> { + let (p, errs) = self.0?; + + if let Some(err) = errs.iter().find(|e| e.severity.is_err()) { + return Err(KclError::Syntax(err.clone().into())); + } + match p { + Some(p) => Ok(p), + None => Err(KclError::internal("Unknown parsing error".to_owned())), + } + } +} + +impl From>, Vec), KclError>> for ParseResult { + fn from(r: Result<(Option>, Vec), KclError>) -> ParseResult { + ParseResult(r) + } +} + +impl From<(Option>, Vec)> for ParseResult { + fn from(p: (Option>, Vec)) -> ParseResult { + ParseResult(Ok(p)) + } +} + +impl From> for ParseResult { + fn from(p: Node) -> ParseResult { + ParseResult(Ok((Some(p), vec![]))) + } +} + +impl From for ParseResult { + fn from(e: KclError) -> ParseResult { + ParseResult(Err(e)) + } +} + +#[cfg(test)] +mod tests { + macro_rules! parse_and_lex { + ($func_name:ident, $test_kcl_program:expr) => { + #[test] + fn $func_name() { + let _ = crate::parsing::top_level_parse($test_kcl_program); + } + }; + } + + parse_and_lex!(crash_eof_1, "{\"ގގ\0\0\0\"\"."); + parse_and_lex!(crash_eof_2, "(/=e\"\u{616}ݝ\"\""); +} diff --git a/src/wasm-lib/kcl/src/parsing/parser.rs b/src/wasm-lib/kcl/src/parsing/parser.rs new file mode 100644 index 000000000..2383916eb --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/parser.rs @@ -0,0 +1,4674 @@ +// TODO optimise size of CompilationError +#![allow(clippy::result_large_err)] + +use std::{cell::RefCell, collections::HashMap, str::FromStr}; + +use winnow::{ + combinator::{alt, delimited, opt, peek, preceded, repeat, separated, separated_pair, terminated}, + dispatch, + error::{ErrMode, StrContext, StrContextValue}, + prelude::*, + stream::Stream, + token::{any, one_of, take_till}, +}; + +use crate::{ + docs::StdLibFn, + errors::{CompilationError, Severity, Tag}, + parsing::{ + ast::types::{ + ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryOperator, BinaryPart, BodyItem, BoxNode, + CallExpression, CallExpressionKw, CommentStyle, DefaultParamVal, ElseIf, Expr, ExpressionStatement, + FnArgPrimitive, FnArgType, FunctionExpression, Identifier, IfExpression, ImportItem, ImportSelector, + ImportStatement, ItemVisibility, LabeledArg, Literal, LiteralIdentifier, LiteralValue, MemberExpression, + MemberObject, Node, NodeList, NonCodeMeta, NonCodeNode, NonCodeValue, ObjectExpression, ObjectProperty, + Parameter, PipeExpression, PipeSubstitution, Program, ReturnStatement, Shebang, TagDeclarator, + UnaryExpression, UnaryOperator, VariableDeclaration, VariableDeclarator, VariableKind, + }, + math::BinaryExpressionToken, + token::{Token, TokenSlice, TokenType}, + PIPE_OPERATOR, PIPE_SUBSTITUTION_OPERATOR, + }, + unparser::ExprContext, + SourceRange, +}; + +use super::{ast::types::LabelledExpression, token::NumericSuffix}; + +thread_local! { + /// The current `ParseContext`. `None` if parsing is not currently happening on this thread. + static CTXT: RefCell> = const { RefCell::new(None) }; +} + +pub fn run_parser(i: TokenSlice) -> super::ParseResult { + let _stats = crate::log::LogPerfStats::new("Parsing"); + ParseContext::init(); + + let result = match program.parse(i) { + Ok(result) => Some(result), + Err(e) => { + ParseContext::err(e.into()); + None + } + }; + let ctxt = ParseContext::take(); + (result, ctxt.errors).into() +} + +/// Context built up while parsing a program. +/// +/// When returned from parsing contains the errors and warnings from the current parse. +#[derive(Debug, Clone, Default)] +struct ParseContext { + pub errors: Vec, +} + +impl ParseContext { + fn new() -> Self { + ParseContext { errors: Vec::new() } + } + + /// Set a new `ParseContext` in thread-local storage. Panics if one already exists. + fn init() { + assert!(CTXT.with_borrow(|ctxt| ctxt.is_none())); + CTXT.with_borrow_mut(|ctxt| *ctxt = Some(ParseContext::new())); + } + + /// Take the current `ParseContext` from thread-local storage, leaving `None`. Panics if a `ParseContext` + /// is not present. + fn take() -> ParseContext { + CTXT.with_borrow_mut(|ctxt| ctxt.take()).unwrap() + } + + /// Add an error to the current `ParseContext`, panics if there is none. + fn err(err: CompilationError) { + CTXT.with_borrow_mut(|ctxt| { + // Avoid duplicating errors. This is possible since the parser can try one path, find + // a warning, then backtrack and decide not to take that path and try another. This can + // happen 'high up the stack', so it's impossible to fix where the errors are generated. + // Ideally we would pass errors up the call stack rather than use a context object or + // have some way to mark errors as speculative or committed, but I don't think Winnow + // is flexible enough for that (or at least, not without significant changes to the + // parser). + let errors = &mut ctxt.as_mut().unwrap().errors; + for e in errors.iter_mut().rev() { + if e.source_range == err.source_range { + *e = err; + return; + } + } + errors.push(err); + }); + } + + /// Add a warning to the current `ParseContext`, panics if there is none. + fn warn(mut e: CompilationError) { + e.severity = Severity::Warning; + Self::err(e); + } +} + +/// Accumulate context while backtracking errors +/// Very similar to [`winnow::error::ContextError`] type, +/// but the 'cause' field is always a [`CompilationError`], +/// instead of a dynamic [`std::error::Error`] trait object. +#[derive(Debug, Clone)] +pub(crate) struct ContextError { + pub context: Vec, + pub cause: Option, +} + +impl From, ContextError>> for CompilationError { + fn from(err: winnow::error::ParseError, ContextError>) -> Self { + let Some(last_token) = err.input().last() else { + return CompilationError::fatal(Default::default(), "file is empty"); + }; + + let (input, offset, err) = (err.input(), err.offset(), err.clone().into_inner()); + + if let Some(e) = err.cause { + return e; + } + + // See docs on `offset`. + if offset >= input.len() { + let context = err.context.first(); + return CompilationError::fatal( + last_token.as_source_range(), + match context { + Some(what) => format!("Unexpected end of file. The compiler {what}"), + None => "Unexpected end of file while still parsing".to_owned(), + }, + ); + } + + let bad_token = input.token(offset); + // TODO: Add the Winnow parser context to the error. + // See https://github.com/KittyCAD/modeling-app/issues/784 + CompilationError::fatal( + bad_token.as_source_range(), + format!("Unexpected token: {}", bad_token.value), + ) + } +} + +impl From for ContextError { + fn from(e: CompilationError) -> Self { + Self { + context: Default::default(), + cause: Some(e), + } + } +} + +impl std::default::Default for ContextError { + fn default() -> Self { + Self { + context: Default::default(), + cause: None, + } + } +} + +impl winnow::error::ParserError for ContextError +where + I: Stream, +{ + #[inline] + fn from_error_kind(_input: &I, _kind: winnow::error::ErrorKind) -> Self { + Self::default() + } + + #[inline] + fn append( + self, + _input: &I, + _input_checkpoint: &::Checkpoint, + _kind: winnow::error::ErrorKind, + ) -> Self { + self + } + + #[inline] + fn or(self, other: Self) -> Self { + other + } +} + +impl winnow::error::AddContext for ContextError +where + I: Stream, +{ + #[inline] + fn add_context(mut self, _input: &I, _input_checkpoint: &::Checkpoint, ctx: C) -> Self { + self.context.push(ctx); + self + } +} + +impl winnow::error::FromExternalError for ContextError { + #[inline] + fn from_external_error(_input: &I, _kind: winnow::error::ErrorKind, e: CompilationError) -> Self { + let mut err = Self::default(); + { + err.cause = Some(e); + } + err + } +} + +type PResult = winnow::prelude::PResult; + +fn expected(what: &'static str) -> StrContext { + StrContext::Expected(StrContextValue::Description(what)) +} + +fn program(i: &mut TokenSlice) -> PResult> { + let shebang = opt(shebang).parse_next(i)?; + let mut out: Node = function_body.parse_next(i)?; + out.shebang = shebang; + + // Match original parser behaviour, for now. + // Once this is merged and stable, consider changing this as I think it's more accurate + // without the -1. + out.end -= 1; + Ok(out) +} + +fn pipe_surrounded_by_whitespace(i: &mut TokenSlice) -> PResult<()> { + ( + repeat(0.., whitespace).map(|_: Vec<_>| ()), + pipe_operator, + repeat(0.., whitespace).map(|_: Vec<_>| ()), + ) + .parse_next(i)?; + Ok(()) +} + +/// Note this is O(n). +fn count_in(target: char, s: &str) -> usize { + s.chars().filter(|&c| c == target).count() +} + +/// Matches all four cases of NonCodeValue +fn non_code_node(i: &mut TokenSlice) -> PResult> { + /// Matches one case of NonCodeValue + /// See docstring on [NonCodeValue::NewLineBlockComment] for why that case is different to the others. + fn non_code_node_leading_whitespace(i: &mut TokenSlice) -> PResult> { + let leading_whitespace = one_of(TokenType::Whitespace) + .context(expected("whitespace, with a newline")) + .parse_next(i)?; + let has_empty_line = count_in('\n', &leading_whitespace.value) >= 2; + non_code_node_no_leading_whitespace + .verify_map(|node: Node| match node.inner.value { + NonCodeValue::BlockComment { value, style } => Some(Node::new( + NonCodeNode { + value: if has_empty_line { + NonCodeValue::NewLineBlockComment { value, style } + } else { + NonCodeValue::BlockComment { value, style } + }, + digest: None, + }, + leading_whitespace.start, + node.end + 1, + node.module_id, + )), + _ => None, + }) + .context(expected("a comment or whitespace")) + .parse_next(i) + } + + alt((non_code_node_leading_whitespace, non_code_node_no_leading_whitespace)).parse_next(i) +} + +fn annotation(i: &mut TokenSlice) -> PResult> { + let at = at_sign.parse_next(i)?; + let name = binding_name.parse_next(i)?; + let mut end = name.end; + + let properties = if peek(open_paren).parse_next(i).is_ok() { + open_paren(i)?; + ignore_whitespace(i); + let properties: Vec<_> = separated( + 0.., + separated_pair( + terminated(identifier, opt(whitespace)), + terminated(one_of((TokenType::Operator, "=")), opt(whitespace)), + expression, + ) + .map(|(key, value)| Node { + start: key.start, + end: value.end(), + module_id: key.module_id, + inner: ObjectProperty { + key, + value, + digest: None, + }, + }), + comma_sep, + ) + .parse_next(i)?; + ignore_trailing_comma(i); + ignore_whitespace(i); + end = close_paren(i)?.end; + Some(properties) + } else { + None + }; + + let value = NonCodeValue::Annotation { name, properties }; + Ok(Node::new( + NonCodeNode { value, digest: None }, + at.start, + end, + at.module_id, + )) +} + +// Matches remaining three cases of NonCodeValue +fn non_code_node_no_leading_whitespace(i: &mut TokenSlice) -> PResult> { + alt(( + annotation, + any.verify_map(|token: Token| { + if token.is_code_token() { + None + } else { + let value = match token.token_type { + TokenType::Whitespace if token.value.contains("\n\n") => NonCodeValue::NewLine, + TokenType::LineComment => NonCodeValue::BlockComment { + value: token.value.trim_start_matches("//").trim().to_owned(), + style: CommentStyle::Line, + }, + TokenType::BlockComment => NonCodeValue::BlockComment { + style: CommentStyle::Block, + value: token + .value + .trim_start_matches("/*") + .trim_end_matches("*/") + .trim() + .to_owned(), + }, + _ => return None, + }; + Some(Node::new( + NonCodeNode { value, digest: None }, + token.start, + token.end, + token.module_id, + )) + } + }) + .context(expected("Non-code token (comments or whitespace)")), + )) + .parse_next(i) +} + +fn pipe_expression(i: &mut TokenSlice) -> PResult> { + let mut non_code_meta = NonCodeMeta::default(); + let (head, noncode): (_, Vec<_>) = terminated( + ( + expression_but_not_pipe, + repeat(0.., preceded(whitespace, non_code_node)), + ), + peek(pipe_surrounded_by_whitespace), + ) + .context(expected("an expression, followed by the |> (pipe) operator")) + .parse_next(i)?; + for nc in noncode { + non_code_meta.insert(0, nc); + } + let mut values = vec![head]; + let value_surrounded_by_comments = ( + repeat(0.., preceded(opt(whitespace), non_code_node)), // Before the expression. + preceded(opt(whitespace), labelled_fn_call), // The expression. + repeat(0.., noncode_just_after_code), // After the expression. + ); + let tail: Vec<(Vec<_>, _, Vec<_>)> = repeat( + 1.., + preceded(pipe_surrounded_by_whitespace, value_surrounded_by_comments), + ) + .context(expected( + "a sequence of at least one |> (pipe) operator, followed by an expression", + )) + .parse_next(i)?; + + // Time to structure the return value. + let mut code_count = 0; + let mut max_noncode_end = 0; + for (noncode_before, code, noncode_after) in tail { + for nc in noncode_before { + max_noncode_end = nc.end.max(max_noncode_end); + non_code_meta.insert(code_count, nc); + } + values.push(code); + code_count += 1; + for nc in noncode_after { + max_noncode_end = nc.end.max(max_noncode_end); + non_code_meta.insert(code_count, nc); + } + } + Ok(Node { + start: values.first().unwrap().start(), + end: values.last().unwrap().end().max(max_noncode_end), + module_id: values.first().unwrap().module_id(), + inner: PipeExpression { + body: values, + non_code_meta, + digest: None, + }, + }) +} + +fn bool_value(i: &mut TokenSlice) -> PResult> { + let (value, token) = any + .try_map(|token: Token| match token.token_type { + TokenType::Keyword if token.value == "true" => Ok((true, token)), + TokenType::Keyword if token.value == "false" => Ok((false, token)), + _ => Err(CompilationError::fatal( + token.as_source_range(), + "invalid boolean literal", + )), + }) + .context(expected("a boolean literal (either true or false)")) + .parse_next(i)?; + Ok(Box::new(Node::new( + Literal { + value: LiteralValue::Bool(value), + raw: value.to_string(), + digest: None, + }, + token.start, + token.end, + token.module_id, + ))) +} + +fn literal(i: &mut TokenSlice) -> PResult> { + alt((string_literal, unsigned_number_literal)) + .map(Box::new) + .context(expected("a KCL literal, like 'myPart' or 3")) + .parse_next(i) +} + +/// Parse a KCL string literal +fn string_literal(i: &mut TokenSlice) -> PResult> { + let (value, token) = any + .try_map(|token: Token| match token.token_type { + TokenType::String => { + let s = token.value[1..token.value.len() - 1].to_string(); + Ok((LiteralValue::from(s), token)) + } + _ => Err(CompilationError::fatal( + token.as_source_range(), + "invalid string literal", + )), + }) + .context(expected("string literal (like \"myPart\"")) + .parse_next(i)?; + Ok(Node::new( + Literal { + value, + raw: token.value.clone(), + digest: None, + }, + token.start, + token.end, + token.module_id, + )) +} + +/// Parse a KCL literal number, with no - sign. +pub(crate) fn unsigned_number_literal(i: &mut TokenSlice) -> PResult> { + let (value, token) = any + .try_map(|token: Token| match token.token_type { + TokenType::Number => { + let x: f64 = token.numeric_value().ok_or_else(|| { + CompilationError::fatal(token.as_source_range(), format!("Invalid float: {}", token.value)) + })?; + + if token.numeric_suffix().is_some() { + ParseContext::err(CompilationError::err( + (&token).into(), + "Unit of Measure suffixes are experimental and currently do nothing.", + )); + } + + Ok((LiteralValue::Number(x), token)) + } + _ => Err(CompilationError::fatal(token.as_source_range(), "invalid literal")), + }) + .context(expected("an unsigned number literal (e.g. 3 or 12.5)")) + .parse_next(i)?; + Ok(Node::new( + Literal { + value, + raw: token.value.clone(), + digest: None, + }, + token.start, + token.end, + token.module_id, + )) +} + +/// Parse a KCL operator that takes a left- and right-hand side argument. +fn binary_operator(i: &mut TokenSlice) -> PResult { + any.try_map(|token: Token| { + if !matches!(token.token_type, TokenType::Operator) { + return Err(CompilationError::fatal( + token.as_source_range(), + format!("unexpected token, should be an operator but was {}", token.token_type), + )); + } + let op = match token.value.as_str() { + "+" => BinaryOperator::Add, + "-" => BinaryOperator::Sub, + "/" => BinaryOperator::Div, + "*" => BinaryOperator::Mul, + "%" => BinaryOperator::Mod, + "^" => BinaryOperator::Pow, + "==" => BinaryOperator::Eq, + "!=" => BinaryOperator::Neq, + ">" => BinaryOperator::Gt, + ">=" => BinaryOperator::Gte, + "<" => BinaryOperator::Lt, + "<=" => BinaryOperator::Lte, + "|" => BinaryOperator::Or, + "&" => BinaryOperator::And, + _ => { + return Err(CompilationError::fatal( + token.as_source_range(), + format!("{} is not a binary operator", token.value.as_str()), + )) + } + }; + Ok(op) + }) + .context(expected("a binary operator (like + or *)")) + .parse_next(i) +} + +/// Parse a KCL operand that can be used with an operator. +fn operand(i: &mut TokenSlice) -> PResult { + const TODO_783: &str = "found a value, but this kind of value cannot be used as the operand to an operator yet (see https://github.com/KittyCAD/modeling-app/issues/783)"; + let op = possible_operands + .try_map(|part| { + let source_range = SourceRange::from(&part); + let expr = match part { + // TODO: these should be valid operands eventually, + // users should be able to run "let x = f() + g()" + // see https://github.com/KittyCAD/modeling-app/issues/783 + Expr::FunctionExpression(_) + | Expr::PipeExpression(_) + | Expr::PipeSubstitution(_) + | Expr::ArrayExpression(_) + | Expr::ArrayRangeExpression(_) + | Expr::ObjectExpression(_) + | Expr::LabelledExpression(..) => return Err(CompilationError::fatal(source_range, TODO_783)), + Expr::None(_) => { + return Err(CompilationError::fatal( + source_range, + // TODO: Better error message here. + // Once we have ways to use None values (e.g. by replacing with a default value) + // we should suggest one of them here. + "cannot use a KCL None value as an operand", + )); + } + Expr::TagDeclarator(_) => { + return Err(CompilationError::fatal( + source_range, + // TODO: Better error message here. + // Once we have ways to use None values (e.g. by replacing with a default value) + // we should suggest one of them here. + "cannot use a KCL tag declaration as an operand", + )); + } + Expr::UnaryExpression(x) => BinaryPart::UnaryExpression(x), + Expr::Literal(x) => BinaryPart::Literal(x), + Expr::Identifier(x) => BinaryPart::Identifier(x), + Expr::BinaryExpression(x) => BinaryPart::BinaryExpression(x), + Expr::CallExpression(x) => BinaryPart::CallExpression(x), + Expr::CallExpressionKw(x) => BinaryPart::CallExpressionKw(x), + Expr::MemberExpression(x) => BinaryPart::MemberExpression(x), + Expr::IfExpression(x) => BinaryPart::IfExpression(x), + }; + Ok(expr) + }) + .context(expected("an operand (a value which can be used with an operator)")) + .parse_next(i)?; + Ok(op) +} + +impl TokenType { + fn parse_from(self, i: &mut TokenSlice) -> PResult { + any.try_map(|token: Token| { + if token.token_type == self { + Ok(token) + } else { + Err(CompilationError::fatal( + token.as_source_range(), + format!( + "expected {self} but found {} which is a {}", + token.value.as_str(), + token.token_type + ), + )) + } + }) + .parse_next(i) + } +} + +/// Parse some whitespace (i.e. at least one whitespace token) +fn whitespace(i: &mut TokenSlice) -> PResult> { + repeat( + 1.., + any.try_map(|token: Token| { + if token.token_type == TokenType::Whitespace { + Ok(token) + } else { + Err(CompilationError::fatal( + token.as_source_range(), + format!( + "expected whitespace, found '{}' which is {}", + token.value.as_str(), + token.token_type + ), + )) + } + }), + ) + .context(expected("some whitespace (e.g. spaces, tabs, new lines)")) + .parse_next(i) +} + +/// A shebang is a line at the start of a file that starts with `#!`. +/// If the shebang is present it takes up the whole line. +fn shebang(i: &mut TokenSlice) -> PResult> { + // Parse the hash and the bang. + hash.parse_next(i)?; + let tok = bang.parse_next(i)?; + // Get the rest of the line. + // Parse everything until the next newline. + let tokens = take_till(0.., |token: Token| token.value.contains('\n')).parse_next(i)?; + let value = tokens.iter().map(|t| t.value.as_str()).collect::(); + + if tokens.is_empty() { + return Err(ErrMode::Cut( + CompilationError::fatal(tok.as_source_range(), "expected a shebang value after #!").into(), + )); + } + + // Strip all the whitespace after the shebang. + opt(whitespace).parse_next(i)?; + + Ok(Node::new( + Shebang::new(format!("#!{}", value)), + 0, + tokens.last().unwrap().end, + tokens.first().unwrap().module_id, + )) +} + +#[allow(clippy::large_enum_variant)] +pub enum NonCodeOr { + NonCode(Node), + Code(T), +} + +/// Parse a KCL array of elements. +fn array(i: &mut TokenSlice) -> PResult { + alt(( + array_empty.map(Box::new).map(Expr::ArrayExpression), + array_elem_by_elem.map(Box::new).map(Expr::ArrayExpression), + array_end_start.map(Box::new).map(Expr::ArrayRangeExpression), + )) + .parse_next(i) +} + +/// Match an empty array. +fn array_empty(i: &mut TokenSlice) -> PResult> { + let open = open_bracket(i)?; + let start = open.start; + ignore_whitespace(i); + let end = close_bracket(i)?.end; + Ok(Node::new( + ArrayExpression { + elements: Default::default(), + non_code_meta: Default::default(), + digest: None, + }, + start, + end, + open.module_id, + )) +} + +/// Match something that separates elements of an array. +fn array_separator(i: &mut TokenSlice) -> PResult<()> { + alt(( + // Normally you need a comma. + comma_sep, + // But, if the array is ending, no need for a comma. + peek(preceded(opt(whitespace), close_bracket)).void(), + )) + .parse_next(i) +} + +pub(crate) fn array_elem_by_elem(i: &mut TokenSlice) -> PResult> { + let open = open_bracket(i)?; + let start = open.start; + ignore_whitespace(i); + let elements: Vec<_> = repeat( + 0.., + alt(( + terminated(expression.map(NonCodeOr::Code), array_separator), + terminated(non_code_node.map(NonCodeOr::NonCode), whitespace), + )), + ) + .context(expected("array contents, a list of elements (like [1, 2, 3])")) + .parse_next(i)?; + ignore_whitespace(i); + let end = close_bracket(i)?.end; + + // Sort the array's elements (i.e. expression nodes) from the noncode nodes. + let (elements, non_code_nodes): (Vec<_>, HashMap) = elements.into_iter().enumerate().fold( + (Vec::new(), HashMap::new()), + |(mut elements, mut non_code_nodes), (i, e)| { + match e { + NonCodeOr::NonCode(x) => { + non_code_nodes.insert(i, vec![x]); + } + NonCodeOr::Code(x) => { + elements.push(x); + } + } + (elements, non_code_nodes) + }, + ); + let non_code_meta = NonCodeMeta { + non_code_nodes, + start_nodes: Vec::new(), + digest: None, + }; + Ok(Node::new( + ArrayExpression { + elements, + non_code_meta, + digest: None, + }, + start, + end, + open.module_id, + )) +} + +fn array_end_start(i: &mut TokenSlice) -> PResult> { + let open = open_bracket(i)?; + let start = open.start; + ignore_whitespace(i); + let start_element = expression.parse_next(i)?; + ignore_whitespace(i); + double_period.parse_next(i)?; + ignore_whitespace(i); + let end_element = expression.parse_next(i)?; + ignore_whitespace(i); + let end = close_bracket(i)?.end; + Ok(Node::new( + ArrayRangeExpression { + start_element, + end_element, + end_inclusive: true, + digest: None, + }, + start, + end, + open.module_id, + )) +} + +fn object_property_same_key_and_val(i: &mut TokenSlice) -> PResult> { + let key = nameable_identifier.context(expected("the property's key (the name or identifier of the property), e.g. in 'height: 4', 'height' is the property key")).parse_next(i)?; + ignore_whitespace(i); + Ok(Node { + start: key.start, + end: key.end, + module_id: key.module_id, + inner: ObjectProperty { + value: Expr::Identifier(Box::new(key.clone())), + key, + digest: None, + }, + }) +} + +fn object_property(i: &mut TokenSlice) -> PResult> { + let key = identifier.context(expected("the property's key (the name or identifier of the property), e.g. in 'height = 4', 'height' is the property key")).parse_next(i)?; + ignore_whitespace(i); + // Temporarily accept both `:` and `=` for compatibility. + let sep = alt((colon, equals)) + .context(expected( + "`=`, which separates the property's key from the value you're setting it to, e.g. 'height = 4'", + )) + .parse_next(i)?; + ignore_whitespace(i); + let expr = expression_but_not_ascription + .context(expected( + "the value which you're setting the property to, e.g. in 'height: 4', the value is 4", + )) + .parse_next(i)?; + + let result = Node { + start: key.start, + end: expr.end(), + module_id: key.module_id, + inner: ObjectProperty { + key, + value: expr, + digest: None, + }, + }; + + if sep.token_type == TokenType::Colon { + ParseContext::warn(CompilationError::with_suggestion( + sep.into(), + Some(result.as_source_range()), + "Using `:` to initialize objects is deprecated, prefer using `=`.", + Some(("Replace `:` with `=`", " =")), + Tag::Deprecated, + )); + } + + Ok(result) +} + +/// Match something that separates properties of an object. +fn property_separator(i: &mut TokenSlice) -> PResult<()> { + alt(( + // Normally you need a comma. + comma_sep, + // But, if the array is ending, no need for a comma. + peek(preceded(opt(whitespace), close_brace)).void(), + )) + .parse_next(i) +} + +/// Parse a KCL object value. +pub(crate) fn object(i: &mut TokenSlice) -> PResult> { + let open = open_brace(i)?; + let start = open.start; + ignore_whitespace(i); + let properties: Vec<_> = repeat( + 0.., + alt(( + terminated(non_code_node.map(NonCodeOr::NonCode), whitespace), + terminated( + alt((object_property, object_property_same_key_and_val)), + property_separator, + ) + .map(NonCodeOr::Code), + )), + ) + .context(expected( + "a comma-separated list of key-value pairs, e.g. 'height: 4, width: 3'", + )) + .parse_next(i)?; + + // Sort the object's properties from the noncode nodes. + let (properties, non_code_nodes): (Vec<_>, HashMap) = properties.into_iter().enumerate().fold( + (Vec::new(), HashMap::new()), + |(mut properties, mut non_code_nodes), (i, e)| { + match e { + NonCodeOr::NonCode(x) => { + non_code_nodes.insert(i, vec![x]); + } + NonCodeOr::Code(x) => { + properties.push(x); + } + } + (properties, non_code_nodes) + }, + ); + ignore_trailing_comma(i); + ignore_whitespace(i); + let end = close_brace(i)?.end; + let non_code_meta = NonCodeMeta { + non_code_nodes, + ..Default::default() + }; + Ok(Node::new( + ObjectExpression { + properties, + non_code_meta, + digest: None, + }, + start, + end, + open.module_id, + )) +} + +/// Parse the % symbol, used to substitute a curried argument from a |> (pipe). +fn pipe_sub(i: &mut TokenSlice) -> PResult> { + any.try_map(|token: Token| { + if matches!(token.token_type, TokenType::Operator) && token.value == PIPE_SUBSTITUTION_OPERATOR { + Ok(Node::new( + PipeSubstitution { digest: None }, + token.start, + token.end, + token.module_id, + )) + } else { + Err(CompilationError::fatal( + token.as_source_range(), + format!( + "expected a pipe substitution symbol (%) but found {}", + token.value.as_str() + ), + )) + } + }) + .context(expected("the substitution symbol, %")) + .parse_next(i) +} + +fn else_if(i: &mut TokenSlice) -> PResult> { + let else_ = any + .try_map(|token: Token| { + if matches!(token.token_type, TokenType::Keyword) && token.value == "else" { + Ok(token) + } else { + Err(CompilationError::fatal( + token.as_source_range(), + format!("{} is not 'else'", token.value.as_str()), + )) + } + }) + .context(expected("the 'else' keyword")) + .parse_next(i)?; + ignore_whitespace(i); + let _if = any + .try_map(|token: Token| { + if matches!(token.token_type, TokenType::Keyword) && token.value == "if" { + Ok(token.start) + } else { + Err(CompilationError::fatal( + token.as_source_range(), + format!("{} is not 'if'", token.value.as_str()), + )) + } + }) + .context(expected("the 'if' keyword")) + .parse_next(i)?; + ignore_whitespace(i); + let cond = expression(i)?; + ignore_whitespace(i); + let _ = open_brace(i)?; + let then_val = program + .verify(|block| block.ends_with_expr()) + .parse_next(i) + .map(Box::new)?; + ignore_whitespace(i); + let end = close_brace(i)?.end; + ignore_whitespace(i); + Ok(Node::new( + ElseIf { + cond, + then_val, + digest: Default::default(), + }, + else_.start, + end, + else_.module_id, + )) +} + +fn if_expr(i: &mut TokenSlice) -> PResult> { + let if_ = any + .try_map(|token: Token| { + if matches!(token.token_type, TokenType::Keyword) && token.value == "if" { + Ok(token) + } else { + Err(CompilationError::fatal( + token.as_source_range(), + format!("{} is not 'if'", token.value.as_str()), + )) + } + }) + .context(expected("the 'if' keyword")) + .parse_next(i)?; + let _ = whitespace(i)?; + let cond = expression(i).map(Box::new)?; + let _ = whitespace(i)?; + let _ = open_brace(i)?; + ignore_whitespace(i); + let then_val = program + .verify(|block| block.ends_with_expr()) + .parse_next(i) + .map_err(|e| e.cut()) + .map(Box::new)?; + ignore_whitespace(i); + let _ = close_brace(i)?; + ignore_whitespace(i); + let else_ifs = repeat(0.., else_if).parse_next(i)?; + + ignore_whitespace(i); + let _ = any + .try_map(|token: Token| { + if matches!(token.token_type, TokenType::Keyword) && token.value == "else" { + Ok(token.start) + } else { + Err(CompilationError::fatal( + token.as_source_range(), + format!("{} is not 'else'", token.value.as_str()), + )) + } + }) + .context(expected("the 'else' keyword")) + .parse_next(i)?; + ignore_whitespace(i); + let _ = open_brace(i)?; + ignore_whitespace(i); + + let final_else = program + .verify(|block| block.ends_with_expr()) + .parse_next(i) + .map_err(|e| e.cut()) + .map(Box::new)?; + ignore_whitespace(i); + let end = close_brace(i)?.end; + Ok(Node::boxed( + IfExpression { + cond, + then_val, + else_ifs, + final_else, + digest: Default::default(), + }, + if_.start, + end, + if_.module_id, + )) +} + +fn function_expr(i: &mut TokenSlice) -> PResult { + let fn_tok = opt(fun).parse_next(i)?; + ignore_whitespace(i); + let (result, has_arrow) = function_decl.parse_next(i)?; + if fn_tok.is_none() && !has_arrow { + let err = CompilationError::fatal(result.as_source_range(), "Anonymous function requires `fn` before `(`"); + return Err(ErrMode::Cut(err.into())); + } + Ok(Expr::FunctionExpression(Box::new(result))) +} + +// Looks like +// (arg0, arg1) { +// const x = arg0 + arg1; +// return x +// } +fn function_decl(i: &mut TokenSlice) -> PResult<(Node, bool)> { + fn return_type(i: &mut TokenSlice) -> PResult { + colon(i)?; + ignore_whitespace(i); + argument_type(i) + } + + let open = open_paren(i)?; + let start = open.start; + let params = parameters(i)?; + close_paren(i)?; + ignore_whitespace(i); + let arrow = opt(big_arrow).parse_next(i)?; + ignore_whitespace(i); + // Optional return type. + let return_type = opt(return_type).parse_next(i)?; + ignore_whitespace(i); + open_brace(i)?; + let body = function_body(i)?; + let end = close_brace(i)?.end; + let result = Node::new( + FunctionExpression { + params, + body, + return_type, + digest: None, + }, + start, + end, + open.module_id, + ); + + let has_arrow = if let Some(arrow) = arrow { + ParseContext::warn(CompilationError::with_suggestion( + arrow.as_source_range(), + Some(result.as_source_range()), + "Unnecessary `=>` in function declaration", + Some(("Remove `=>`", "")), + Tag::Unnecessary, + )); + true + } else { + false + }; + + Ok((result, has_arrow)) +} + +/// E.g. `person.name` +fn member_expression_dot(i: &mut TokenSlice) -> PResult<(LiteralIdentifier, usize, bool)> { + period.parse_next(i)?; + let property = alt(( + sketch_keyword.map(Box::new).map(LiteralIdentifier::Identifier), + nameable_identifier.map(Box::new).map(LiteralIdentifier::Identifier), + )) + .parse_next(i)?; + let end = property.end(); + Ok((property, end, false)) +} + +/// E.g. `people[0]` or `people[i]` or `people['adam']` +fn member_expression_subscript(i: &mut TokenSlice) -> PResult<(LiteralIdentifier, usize, bool)> { + let _ = open_bracket.parse_next(i)?; + let property = alt(( + sketch_keyword.map(Box::new).map(LiteralIdentifier::Identifier), + literal.map(LiteralIdentifier::Literal), + nameable_identifier.map(Box::new).map(LiteralIdentifier::Identifier), + )) + .parse_next(i)?; + + let end = close_bracket.parse_next(i)?.end; + let computed = matches!(property, LiteralIdentifier::Identifier(_)); + Ok((property, end, computed)) +} + +/// Get a property of an object, or an index of an array, or a member of a collection. +/// Can be arbitrarily nested, e.g. `people[i]['adam'].age`. +fn member_expression(i: &mut TokenSlice) -> PResult> { + // This is an identifier, followed by a sequence of members (aka properties) + // First, the identifier. + let id = nameable_identifier.context(expected("the identifier of the object whose property you're trying to access, e.g. in 'shape.size.width', 'shape' is the identifier")).parse_next(i)?; + // Now a sequence of members. + let member = alt((member_expression_dot, member_expression_subscript)).context(expected("a member/property, e.g. size.x and size['height'] and size[0] are all different ways to access a member/property of 'size'")); + let mut members: Vec<_> = repeat(1.., member) + .context(expected("a sequence of at least one members/properties")) + .parse_next(i)?; + + // Process the first member. + // It's safe to call remove(0), because the vec is created from repeat(1..), + // which is guaranteed to have >=1 elements. + let (property, end, computed) = members.remove(0); + let start = id.start; + let module_id = id.module_id; + let initial_member_expression = Node::new( + MemberExpression { + object: MemberObject::Identifier(Box::new(id)), + computed, + property, + digest: None, + }, + start, + end, + module_id, + ); + + // Each remaining member wraps the current member expression inside another member expression. + Ok(members + .into_iter() + // Take the accumulated member expression from the previous iteration, + // and use it as the `object` of a new, bigger member expression. + .fold(initial_member_expression, |accumulated, (property, end, computed)| { + Node::new( + MemberExpression { + object: MemberObject::MemberExpression(Box::new(accumulated)), + computed, + property, + digest: None, + }, + start, + end, + module_id, + ) + })) +} + +/// Find a noncode node which occurs just after a body item, +/// such that if the noncode item is a comment, it might be an inline comment. +fn noncode_just_after_code(i: &mut TokenSlice) -> PResult> { + let ws = opt(whitespace).parse_next(i)?; + + // What is the preceding whitespace like? + let (has_newline, has_empty_line) = if let Some(ref ws) = ws { + ( + ws.iter().any(|token| token.value.contains('\n')), + ws.iter().any(|token| count_in('\n', &token.value) >= 2), + ) + } else { + (false, false) + }; + + // Look for a non-code node (e.g. comment) + let nc = non_code_node_no_leading_whitespace + .map(|nc| { + if has_empty_line { + // There's an empty line between the body item and the comment, + // This means the comment is a NewLineBlockComment! + let value = match nc.inner.value { + // Change block comments to inline, as discussed above + NonCodeValue::BlockComment { value, style } => NonCodeValue::NewLineBlockComment { value, style }, + // Other variants don't need to change. + x @ NonCodeValue::InlineComment { .. } => x, + x @ NonCodeValue::NewLineBlockComment { .. } => x, + x @ NonCodeValue::NewLine => x, + x @ NonCodeValue::Annotation { .. } => x, + }; + Node::new( + NonCodeNode { value, ..nc.inner }, + nc.start.saturating_sub(1), + nc.end, + nc.module_id, + ) + } else if has_newline { + // Nothing has to change, a single newline does not need preserving. + nc + } else { + // There's no newline between the body item and comment, + // so if this is a comment, it must be inline with code. + let value = match nc.inner.value { + // Change block comments to inline, as discussed above + NonCodeValue::BlockComment { value, style } => NonCodeValue::InlineComment { value, style }, + // Other variants don't need to change. + x @ NonCodeValue::InlineComment { .. } => x, + x @ NonCodeValue::NewLineBlockComment { .. } => x, + x @ NonCodeValue::NewLine => x, + x @ NonCodeValue::Annotation { .. } => x, + }; + Node::new(NonCodeNode { value, ..nc.inner }, nc.start, nc.end, nc.module_id) + } + }) + .map(|nc| Node::new(nc.inner, nc.start.saturating_sub(1), nc.end, nc.module_id)) + .parse_next(i)?; + Ok(nc) +} + +// the large_enum_variant lint below introduces a LOT of code complexity in a +// match!() that's super clean that isn't worth it for the marginal space +// savings. revisit if that's a lie. +#[derive(Debug)] +#[allow(clippy::large_enum_variant)] +enum WithinFunction { + BodyItem((BodyItem, Option>)), + NonCode(Node), +} + +impl WithinFunction { + fn is_newline(&self) -> bool { + match self { + WithinFunction::NonCode(nc) => nc.value == NonCodeValue::NewLine, + _ => false, + } + } +} + +fn body_items_within_function(i: &mut TokenSlice) -> PResult { + // Any of the body item variants, each of which can optionally be followed by a comment. + // If there is a comment, it may be preceded by whitespace. + let item = dispatch! {peek(any); + token if token.visibility_keyword().is_some() => (alt((declaration.map(BodyItem::VariableDeclaration), import_stmt.map(BodyItem::ImportStatement))), opt(noncode_just_after_code)).map(WithinFunction::BodyItem), + token if token.declaration_keyword().is_some() => + (declaration.map(BodyItem::VariableDeclaration), opt(noncode_just_after_code)).map(WithinFunction::BodyItem), + token if token.value == "import" && matches!(token.token_type, TokenType::Keyword) => + (import_stmt.map(BodyItem::ImportStatement), opt(noncode_just_after_code)).map(WithinFunction::BodyItem), + Token { ref value, .. } if value == "return" => + (return_stmt.map(BodyItem::ReturnStatement), opt(noncode_just_after_code)).map(WithinFunction::BodyItem), + token if !token.is_code_token() || token.token_type == TokenType::At => { + non_code_node.map(WithinFunction::NonCode) + }, + _ => + alt(( + ( + declaration.map(BodyItem::VariableDeclaration), + opt(noncode_just_after_code) + ).map(WithinFunction::BodyItem), + ( + expression_stmt.map(BodyItem::ExpressionStatement), + opt(noncode_just_after_code) + ).map(WithinFunction::BodyItem), + )) + } + .context(expected("a function body items (functions are made up of variable declarations, expressions, and return statements, each of those is a possible body item")) + .parse_next(i)?; + Ok(item) +} + +/// Parse the body of a user-defined function. +fn function_body(i: &mut TokenSlice) -> PResult> { + let leading_whitespace_start = alt(( + peek(non_code_node).map(|_| None), + // Subtract 1 from `t.start` to match behaviour of the old parser. + // Consider removing the -1 in the future because I think it's inaccurate, but for now, + // I prefer to match the old parser exactly when I can. + opt(whitespace).map(|tok| tok.and_then(|t| t.first().map(|t| (t.start.saturating_sub(1), t.module_id)))), + )) + .parse_next(i)?; + + let mut things_within_body = Vec::new(); + // Parse the first item + things_within_body.push(body_items_within_function.parse_next(i)?); + + // This loop is complicated! I'm sorry! + // It's almost identical to the loop in `winnow::combinator::separated1`, + // see , + // where the "main" parser is body_items_within_function and the `sep` (separator) parser is + // ws_with_newline. + // + // Except for one thing. + // + // In this case, one of the body items being matched could be a whitespace with a newline, + // and that could _also_ be the separator. + // + // So, if both the main parser and the `sep` parser within `separated1` try to match the same + // token, the main parser will consume it and then the `sep` parser will fail. + // + // The solution is that this parser should check if the last matched body item was an empty line, + // and if so, then ignore the separator parser for the current iteration. + loop { + let last_match_was_empty_line = things_within_body.last().map(|wf| wf.is_newline()).unwrap_or(false); + + use winnow::stream::Stream; + + let start = i.checkpoint(); + let len = i.eof_offset(); + + let found_ws = ws_with_newline.parse_next(i); + + // The separator whitespace might be important: + // if it has an empty line, it should be considered a noncode token, because the user + // deliberately put an empty line there. We should track this and preserve it. + if let Ok(ref ws_token) = found_ws { + if ws_token.value.contains("\n\n") { + things_within_body.push(WithinFunction::NonCode(Node::new( + NonCodeNode { + value: NonCodeValue::NewLine, + digest: None, + }, + ws_token.start, + ws_token.end, + ws_token.module_id, + ))); + } + } + + match (found_ws, last_match_was_empty_line) { + (Ok(_), _) | (_, true) => { + // Infinite loop check: this loop must always consume tokens from the input. + // That can either happen through the `sep` parser (i.e. ws_with_newline) or through + // the main parser (body_items_within_function). + // LHS of this checks fht + if i.eof_offset() == len && !last_match_was_empty_line { + use winnow::error::ParserError; + return Err(ErrMode::assert(i, "sep parsers must always consume")); + } + + match body_items_within_function.parse_next(i) { + Err(ErrMode::Backtrack(_)) => { + i.reset(&start); + break; + } + Err(e) => return Err(e), + Ok(o) => { + things_within_body.push(o); + } + } + } + (Err(ErrMode::Backtrack(_)), _) => { + i.reset(&start); + break; + } + (Err(e), _) => return Err(e), + } + } + + let mut body = Vec::new(); + let mut non_code_meta = NonCodeMeta::default(); + let mut end = 0; + let mut start = leading_whitespace_start; + for thing_in_body in things_within_body { + match thing_in_body { + WithinFunction::BodyItem((b, maybe_noncode)) => { + if start.is_none() { + start = Some((b.start(), b.module_id())); + } + end = b.end(); + body.push(b); + if let Some(nc) = maybe_noncode { + end = nc.end; + non_code_meta.insert(body.len() - 1, nc); + } + } + WithinFunction::NonCode(nc) => { + if start.is_none() { + start = Some((nc.start, nc.module_id)); + } + end = nc.end; + if body.is_empty() { + non_code_meta.start_nodes.push(nc); + } else { + non_code_meta.insert(body.len() - 1, nc); + } + } + } + } + let start = start.expect( + "the `things_within_body` vec should have looped at least once, and each loop overwrites `start` if it is None", + ); + // Safe to unwrap `body.first()` because `body` is `separated1` therefore guaranteed + // to have len >= 1. + let end_ws = opt(whitespace) + .parse_next(i)? + .and_then(|ws| ws.first().map(|tok| tok.end)); + if let Some(end_ws) = end_ws { + end = end.max(end_ws); + } + end += 1; + Ok(Node::new( + Program { + body, + non_code_meta, + shebang: None, + digest: None, + }, + start.0, + end, + start.1, + )) +} + +fn import_items(i: &mut TokenSlice) -> PResult> { + separated(1.., import_item, comma_sep) + .parse_next(i) + .map_err(|e| e.cut()) +} + +fn glob(i: &mut TokenSlice) -> PResult { + one_of((TokenType::Operator, "*")) + .context(expected("the multiple import operator, *")) + .parse_next(i) +} + +fn import_stmt(i: &mut TokenSlice) -> PResult> { + let (visibility, visibility_token) = opt(terminated(item_visibility, whitespace)) + .parse_next(i)? + .map_or((ItemVisibility::Default, None), |pair| (pair.0, Some(pair.1))); + let import_token = any + .try_map(|token: Token| { + if matches!(token.token_type, TokenType::Keyword) && token.value == "import" { + Ok(token) + } else { + Err(CompilationError::fatal( + token.as_source_range(), + format!("{} is not the 'import' keyword", token.value.as_str()), + )) + } + }) + .context(expected("the 'import' keyword")) + .parse_next(i)?; + + let module_id = import_token.module_id; + let start = visibility_token.unwrap_or(import_token).start; + + require_whitespace(i)?; + + let (mut selector, path) = alt(( + string_literal.map(|s| (ImportSelector::None { alias: None }, Some(s))), + glob.map(|t| { + let s = t.as_source_range(); + ( + ImportSelector::Glob(Node::new((), s.start(), s.end(), s.module_id())), + None, + ) + }), + import_items.map(|items| (ImportSelector::List { items }, None)), + )) + .parse_next(i)?; + + let path = match path { + Some(path) => path, + None => { + require_whitespace(i)?; + any.try_map(|token: Token| { + if matches!(token.token_type, TokenType::Keyword | TokenType::Word) && token.value == "from" { + Ok(()) + } else { + Err(CompilationError::fatal( + token.as_source_range(), + format!("{} is not the 'from' keyword", token.value.as_str()), + )) + } + }) + .context(expected("the 'from' keyword")) + .parse_next(i) + .map_err(|e| e.cut())?; + + require_whitespace(i)?; + + string_literal(i)? + } + }; + + let mut end: usize = path.end; + let path_string = match path.inner.value { + LiteralValue::String(s) => s, + _ => unreachable!(), + }; + if path_string.is_empty() { + return Err(ErrMode::Cut( + CompilationError::fatal( + SourceRange::new(path.start, path.end, path.module_id), + "import path cannot be empty", + ) + .into(), + )); + } + if path_string + .chars() + .any(|c| !c.is_ascii_alphanumeric() && c != '_' && c != '-' && c != '.') + { + return Err(ErrMode::Cut( + CompilationError::fatal( + SourceRange::new(path.start, path.end, path.module_id), + "import path may only contain alphanumeric characters, underscore, hyphen, and period. Files in other directories are not yet supported.", + ) + .into(), + )); + } + + if let ImportSelector::None { alias: ref mut a } = selector { + if let Some(alias) = opt(preceded( + (whitespace, import_as_keyword, whitespace), + identifier.context(expected("an identifier to alias the import")), + )) + .parse_next(i)? + { + end = alias.end; + *a = Some(alias); + } + + ParseContext::warn(CompilationError::err( + SourceRange::new(start, path.end, path.module_id), + "Importing a whole module is experimental, likely to be buggy, and likely to change", + )); + + if a.is_none() + && (!path_string.ends_with(".kcl") + || path_string.starts_with("_") + || path_string.contains('-') + || path_string[0..path_string.len() - 4].contains('.')) + { + return Err(ErrMode::Cut( + CompilationError::fatal( + SourceRange::new(path.start, path.end, path.module_id), + "import path is not a valid identifier and must be aliased.".to_owned(), + ) + .into(), + )); + } + } + + Ok(Node::boxed( + ImportStatement { + selector, + visibility, + path: path_string, + digest: None, + }, + start, + end, + module_id, + )) +} + +fn import_item(i: &mut TokenSlice) -> PResult> { + let name = nameable_identifier + .context(expected("an identifier to import")) + .parse_next(i)?; + let start = name.start; + let module_id = name.module_id; + let alias = opt(preceded( + (whitespace, import_as_keyword, whitespace), + identifier.context(expected("an identifier to alias the import")), + )) + .parse_next(i)?; + let end = if let Some(ref alias) = alias { + alias.end + } else { + name.end + }; + Ok(Node::new( + ImportItem { + name, + alias, + digest: None, + }, + start, + end, + module_id, + )) +} + +fn import_as_keyword(i: &mut TokenSlice) -> PResult { + any.try_map(|token: Token| { + if matches!(token.token_type, TokenType::Keyword | TokenType::Word) && token.value == "as" { + Ok(token) + } else { + Err(CompilationError::fatal( + token.as_source_range(), + format!("{} is not the 'as' keyword", token.value.as_str()), + )) + } + }) + .context(expected("the 'as' keyword")) + .parse_next(i) +} + +/// Parse a return statement of a user-defined function, e.g. `return x`. +fn return_stmt(i: &mut TokenSlice) -> PResult> { + let ret = any + .try_map(|token: Token| { + if matches!(token.token_type, TokenType::Keyword) && token.value == "return" { + Ok(token) + } else { + Err(CompilationError::fatal( + token.as_source_range(), + format!("{} is not a return keyword", token.value.as_str()), + )) + } + }) + .context(expected( + "the 'return' keyword, which ends your function (and becomes this function's value when it's called)", + )) + .parse_next(i)?; + require_whitespace(i)?; + let argument = expression(i)?; + Ok(Node { + start: ret.start, + end: argument.end(), + module_id: ret.module_id, + inner: ReturnStatement { argument, digest: None }, + }) +} + +/// Parse a KCL expression. +fn expression(i: &mut TokenSlice) -> PResult { + let expr = expression_but_not_ascription.parse_next(i)?; + let ty = opt((colon, opt(whitespace), argument_type)).parse_next(i)?; + + // TODO this is probably not giving ascription the right precedence, but I have no idea how Winnow is handling that. + // Since we're not creating AST nodes for ascription, I don't think it matters right now. + if let Some((colon, _, _)) = ty { + ParseContext::err(CompilationError::err( + // Sadly there is no SourceRange for the type itself + colon.into(), + "Type ascription is experimental and currently does nothing.", + )); + } + + Ok(expr) +} + +// TODO once we remove the old record instantiation syntax, we can accept types ascription anywhere. +fn expression_but_not_ascription(i: &mut TokenSlice) -> PResult { + alt(( + pipe_expression.map(Box::new).map(Expr::PipeExpression), + expression_but_not_pipe, + )) + .context(expected("a KCL value")) + .parse_next(i) +} + +fn expression_but_not_pipe(i: &mut TokenSlice) -> PResult { + let expr = alt(( + binary_expression.map(Box::new).map(Expr::BinaryExpression), + unary_expression.map(Box::new).map(Expr::UnaryExpression), + expr_allowed_in_pipe_expr, + )) + .context(expected("a KCL value")) + .parse_next(i)?; + + let label = opt(label).parse_next(i)?; + match label { + Some(label) => Ok(Expr::LabelledExpression(Box::new(LabelledExpression::new(expr, label)))), + None => Ok(expr), + } +} + +fn label(i: &mut TokenSlice) -> PResult> { + let result = preceded( + (whitespace, import_as_keyword, whitespace), + identifier.context(expected("an identifier")), + ) + .parse_next(i)?; + + ParseContext::warn(CompilationError::err( + SourceRange::new(result.start, result.end, result.module_id), + "Using `as` for tagging expressions is experimental, likely to be buggy, and likely to change", + )); + + Ok(result) +} + +fn unnecessarily_bracketed(i: &mut TokenSlice) -> PResult { + delimited( + terminated(open_paren, opt(whitespace)), + expression, + preceded(opt(whitespace), close_paren), + ) + .parse_next(i) +} + +fn expr_allowed_in_pipe_expr(i: &mut TokenSlice) -> PResult { + alt(( + member_expression.map(Box::new).map(Expr::MemberExpression), + bool_value.map(Expr::Literal), + tag.map(Box::new).map(Expr::TagDeclarator), + literal.map(Expr::Literal), + fn_call.map(Box::new).map(Expr::CallExpression), + fn_call_kw.map(Box::new).map(Expr::CallExpressionKw), + nameable_identifier.map(Box::new).map(Expr::Identifier), + array, + object.map(Box::new).map(Expr::ObjectExpression), + pipe_sub.map(Box::new).map(Expr::PipeSubstitution), + function_expr, + if_expr.map(Expr::IfExpression), + unnecessarily_bracketed, + )) + .context(expected("a KCL expression (but not a pipe expression)")) + .parse_next(i) +} + +fn possible_operands(i: &mut TokenSlice) -> PResult { + alt(( + unary_expression.map(Box::new).map(Expr::UnaryExpression), + bool_value.map(Expr::Literal), + member_expression.map(Box::new).map(Expr::MemberExpression), + literal.map(Expr::Literal), + fn_call.map(Box::new).map(Expr::CallExpression), + nameable_identifier.map(Box::new).map(Expr::Identifier), + binary_expr_in_parens.map(Box::new).map(Expr::BinaryExpression), + unnecessarily_bracketed, + )) + .context(expected( + "a KCL value which can be used as an argument/operand to an operator", + )) + .parse_next(i) +} + +/// Parse an item visibility specifier, e.g. export. +fn item_visibility(i: &mut TokenSlice) -> PResult<(ItemVisibility, Token)> { + any.verify_map(|token: Token| { + if token.token_type == TokenType::Keyword && token.value == "export" { + Some((ItemVisibility::Export, token)) + } else { + None + } + }) + .context(expected("item visibility, e.g. 'export'")) + .parse_next(i) +} + +fn declaration_keyword(i: &mut TokenSlice) -> PResult<(VariableKind, Token)> { + let res = any + .verify_map(|token: Token| token.declaration_keyword().map(|kw| (kw, token))) + .parse_next(i)?; + Ok(res) +} + +/// Parse a variable/constant declaration. +fn declaration(i: &mut TokenSlice) -> PResult> { + let (visibility, visibility_token) = opt(terminated(item_visibility, whitespace)) + .parse_next(i)? + .map_or((ItemVisibility::Default, None), |pair| (pair.0, Some(pair.1))); + let decl_token = opt(declaration_keyword).parse_next(i)?; + if decl_token.is_some() { + // If there was a declaration keyword like `fn`, then it must be followed by some spaces. + // `fnx = ...` is not valid! + require_whitespace(i)?; + } + + let id = binding_name + .context(expected( + "an identifier, which becomes name you're binding the value to", + )) + .parse_next(i)?; + let (kind, mut start, dec_end) = if let Some((kind, token)) = &decl_token { + (*kind, token.start, token.end) + } else { + (VariableKind::Const, id.start, id.end) + }; + if let Some(token) = visibility_token { + start = token.start; + } + + ignore_whitespace(i); + + let val = if kind == VariableKind::Fn { + let eq = opt(equals).parse_next(i)?; + ignore_whitespace(i); + + let val = function_decl + .map(|t| Box::new(t.0)) + .map(Expr::FunctionExpression) + .context(expected("a KCL function expression, like () { return 1 }")) + .parse_next(i); + + if let Some(t) = eq { + let ctxt_end = val.as_ref().map(|e| e.end()).unwrap_or(t.end); + ParseContext::warn(CompilationError::with_suggestion( + t.as_source_range(), + Some(SourceRange::new(id.start, ctxt_end, id.module_id)), + "Unnecessary `=` in function declaration", + Some(("Remove `=`", "")), + Tag::Unnecessary, + )); + } + + val + } else { + equals(i)?; + ignore_whitespace(i); + + let val = expression + .try_map(|val| { + // Function bodies can be used if and only if declaring a function. + // Check the 'if' direction: + if matches!(val, Expr::FunctionExpression(_)) { + return Err(CompilationError::fatal( + SourceRange::new(start, dec_end, id.module_id), + format!("Expected a `fn` variable kind, found: `{}`", kind), + )); + } + Ok(val) + }) + .context(expected("a KCL value, which is being bound to a variable")) + .parse_next(i); + + if let Some((_, tok)) = decl_token { + ParseContext::warn(CompilationError::with_suggestion( + tok.as_source_range(), + Some(SourceRange::new( + id.start, + val.as_ref().map(|e| e.end()).unwrap_or(dec_end), + id.module_id, + )), + format!( + "Using `{}` to declare constants is deprecated; no keyword is required", + tok.value + ), + Some((format!("Remove `{}`", tok.value), "")), + Tag::Deprecated, + )); + } + + val + } + .map_err(|e| e.cut())?; + + let end = val.end(); + Ok(Box::new(Node { + start, + end, + module_id: id.module_id, + inner: VariableDeclaration { + declaration: Node { + start: id.start, + end, + module_id: id.module_id, + inner: VariableDeclarator { + id, + init: val, + digest: None, + }, + }, + visibility, + kind, + digest: None, + }, + })) +} + +impl TryFrom for Node { + type Error = CompilationError; + + fn try_from(token: Token) -> Result { + if token.token_type == TokenType::Word { + Ok(Node::new( + Identifier { + name: token.value, + digest: None, + }, + token.start, + token.end, + token.module_id, + )) + } else { + Err(CompilationError::fatal( + token.as_source_range(), + format!( + "Cannot assign a variable to a reserved keyword: {}", + token.value.as_str() + ), + )) + } + } +} + +/// Parse a KCL identifier (name of a constant/variable/function) +fn identifier(i: &mut TokenSlice) -> PResult> { + any.try_map(Node::::try_from) + .context(expected("an identifier, e.g. 'width' or 'myPart'")) + .parse_next(i) +} + +fn nameable_identifier(i: &mut TokenSlice) -> PResult> { + let result = identifier.parse_next(i)?; + + if !result.is_nameable() { + let desc = if result.name == "_" { + "Underscores" + } else { + "Names with a leading underscore" + }; + ParseContext::err(CompilationError::err( + SourceRange::new(result.start, result.end, result.module_id), + format!("{desc} cannot be referred to, only declared."), + )); + } + + Ok(result) +} + +fn sketch_keyword(i: &mut TokenSlice) -> PResult> { + any.try_map(|token: Token| { + if token.token_type == TokenType::Type && token.value == "sketch" { + Ok(Node::new( + Identifier { + name: token.value, + digest: None, + }, + token.start, + token.end, + token.module_id, + )) + } else { + Err(CompilationError::fatal( + token.as_source_range(), + format!("Expected 'sketch' keyword, but found {}", token.value.as_str()), + )) + } + }) + .context(expected("the 'sketch' keyword")) + .parse_next(i) +} + +impl TryFrom for Node { + type Error = CompilationError; + + fn try_from(token: Token) -> Result { + match token.token_type { + TokenType::Word => { + Ok(Node::new( + TagDeclarator { + // We subtract 1 from the start because the tag starts with a `$`. + name: token.value, + digest: None, + }, + token.start - 1, + token.end, + token.module_id, + )) + } + TokenType::Number => Err(CompilationError::fatal( + token.as_source_range(), + format!( + "Tag names must not start with a number. Tag starts with `{}`", + token.value.as_str() + ), + )), + + // e.g. `line(%, $)` or `line(%, $ , 5)` + TokenType::Brace | TokenType::Whitespace | TokenType::Comma => Err(CompilationError::fatal( + token.as_source_range(), + "Tag names must not be empty".to_string(), + )), + + TokenType::Type => Err(CompilationError::fatal( + token.as_source_range(), + format!("Cannot assign a tag to a reserved keyword: {}", token.value.as_str()), + )), + + TokenType::Bang + | TokenType::At + | TokenType::Hash + | TokenType::Colon + | TokenType::Period + | TokenType::Operator + | TokenType::DoublePeriod + | TokenType::QuestionMark + | TokenType::BlockComment + | TokenType::Function + | TokenType::String + | TokenType::Dollar + | TokenType::Keyword + | TokenType::Unknown + | TokenType::LineComment => Err(CompilationError::fatal( + token.as_source_range(), + // this is `start with` because if most of these cases are in the middle, it ends + // up hitting a different error path(e.g. including a bang) or being valid(e.g. including a comment) since it will get broken up into + // multiple tokens + format!("Tag names must not start with a {}", token.token_type), + )), + } + } +} + +impl Node { + fn into_valid_binding_name(self) -> Result { + // Make sure they are not assigning a variable to a stdlib function. + if crate::std::name_in_stdlib(&self.name) { + return Err(CompilationError::fatal( + SourceRange::from(&self), + format!("Cannot assign a tag to a reserved keyword: {}", self.name), + )); + } + Ok(self) + } +} + +/// Parse a Kcl tag that starts with a `$`. +fn tag(i: &mut TokenSlice) -> PResult> { + dollar.parse_next(i)?; + let tag_declarator = any + .try_map(Node::::try_from) + .context(expected("a tag, e.g. '$seg01' or '$line01'")) + .parse_next(i) + .map_err(|e| e.cut())?; + // Now that we've parsed a tag declarator, verify that it's not a stdlib + // name. If it is, stop backtracking. + tag_declarator + .into_valid_binding_name() + .map_err(|e| ErrMode::Cut(ContextError::from(e))) +} + +/// Helper function. Matches any number of whitespace tokens and ignores them. +fn ignore_whitespace(i: &mut TokenSlice) { + let _: PResult<()> = repeat(0.., whitespace).parse_next(i); +} + +// A helper function to ignore a trailing comma. +fn ignore_trailing_comma(i: &mut TokenSlice) { + let _ = opt(comma).parse_next(i); +} + +/// Matches at least 1 whitespace. +fn require_whitespace(i: &mut TokenSlice) -> PResult<()> { + repeat(1.., whitespace).parse_next(i) +} + +fn unary_expression(i: &mut TokenSlice) -> PResult> { + const EXPECTED: &str = "expected a unary operator (like '-', the negative-numeric operator),"; + let (operator, op_token) = any + .try_map(|token: Token| match token.token_type { + TokenType::Operator if token.value == "-" => Ok((UnaryOperator::Neg, token)), + TokenType::Operator => Err(CompilationError::fatal( + token.as_source_range(), + format!("{EXPECTED} but found {} which is an operator, but not a unary one (unary operators apply to just a single operand, your operator applies to two or more operands)", token.value.as_str(),), + )), + TokenType::Bang => Ok((UnaryOperator::Not, token)), + other => Err(CompilationError::fatal( token.as_source_range(), format!("{EXPECTED} but found {} which is {}", token.value.as_str(), other,) )), + }) + .context(expected("a unary expression, e.g. -x or -3")) + .parse_next(i)?; + let argument = operand.parse_next(i)?; + Ok(Node { + start: op_token.start, + end: argument.end(), + module_id: op_token.module_id, + inner: UnaryExpression { + operator, + argument, + digest: None, + }, + }) +} + +/// Consume tokens that make up a binary expression, but don't actually return them. +/// Why not? +/// Because this is designed to be used with .take() within the `binary_expression` parser. +fn binary_expression_tokens(i: &mut TokenSlice) -> PResult> { + let first = operand.parse_next(i).map(BinaryExpressionToken::from)?; + let remaining: Vec<_> = repeat( + 1.., + ( + preceded(opt(whitespace), binary_operator).map(BinaryExpressionToken::from), + preceded(opt(whitespace), operand).map(BinaryExpressionToken::from), + ), + ) + .context(expected( + "one or more binary operators (like + or -) and operands for them, e.g. 1 + 2 - 3", + )) + .parse_next(i)?; + let mut out = Vec::with_capacity(1 + 2 * remaining.len()); + out.push(first); + out.extend(remaining.into_iter().flat_map(|(a, b)| [a, b])); + Ok(out) +} + +/// Parse an infix binary expression. +fn binary_expression(i: &mut TokenSlice) -> PResult> { + // Find the slice of tokens which makes up the binary expression + let tokens = binary_expression_tokens.parse_next(i)?; + + // Pass the token slice into the specialized math parser, for things like + // precedence and converting infix operations to an AST. + let expr = super::math::parse(tokens).map_err(|e| ErrMode::Backtrack(e.into()))?; + Ok(expr) +} + +fn binary_expr_in_parens(i: &mut TokenSlice) -> PResult> { + let span_with_brackets = bracketed_section.take().parse_next(i)?; + let mut span_no_brackets = span_with_brackets.without_ends(); + let expr = binary_expression.parse_next(&mut span_no_brackets)?; + Ok(expr) +} + +/// Match a starting bracket, then match to the corresponding end bracket. +/// Return the count of how many tokens are in that span +/// (not including the bracket tokens). +fn bracketed_section(i: &mut TokenSlice) -> PResult { + // Find the start of this bracketed expression. + let _ = open_paren.parse_next(i)?; + let mut opened_braces = 1usize; + let mut tokens_examined = 0; + while opened_braces > 0 { + let tok = any.parse_next(i)?; + tokens_examined += 1; + if matches!(tok.token_type, TokenType::Brace) { + if tok.value == "(" { + opened_braces += 1; + } else if tok.value == ")" { + opened_braces -= 1; + } + } + } + Ok(tokens_examined) +} + +/// Parse a KCL expression statement. +fn expression_stmt(i: &mut TokenSlice) -> PResult> { + let val = expression + .context(expected( + "an expression (i.e. a value, or an algorithm for calculating one), e.g. 'x + y' or '3' or 'width * 2'", + )) + .parse_next(i)?; + Ok(Node { + start: val.start(), + end: val.end(), + module_id: val.module_id(), + inner: ExpressionStatement { + expression: val, + digest: None, + }, + }) +} + +/// Parse the given brace symbol. +fn some_brace(symbol: &'static str, i: &mut TokenSlice) -> PResult { + one_of((TokenType::Brace, symbol)) + .context(expected(symbol)) + .parse_next(i) +} + +/// Parse a => operator. +fn big_arrow(i: &mut TokenSlice) -> PResult { + one_of((TokenType::Operator, "=>")) + .context(expected("the => symbol, used for declaring functions")) + .parse_next(i) +} +/// Parse a |> operator. +fn pipe_operator(i: &mut TokenSlice) -> PResult { + one_of((TokenType::Operator, PIPE_OPERATOR)) + .context(expected( + "the |> operator, used for 'piping' one function's output into another function's input", + )) + .parse_next(i) +} + +fn ws_with_newline(i: &mut TokenSlice) -> PResult { + one_of(TokenType::Whitespace) + .verify(|token: &Token| token.value.contains('\n')) + .context(expected("a newline, possibly with whitespace")) + .parse_next(i) +} + +/// ( +fn open_paren(i: &mut TokenSlice) -> PResult { + some_brace("(", i) +} + +/// ) +fn close_paren(i: &mut TokenSlice) -> PResult { + some_brace(")", i) +} + +/// [ +fn open_bracket(i: &mut TokenSlice) -> PResult { + some_brace("[", i) +} + +/// ] +fn close_bracket(i: &mut TokenSlice) -> PResult { + some_brace("]", i) +} + +/// { +fn open_brace(i: &mut TokenSlice) -> PResult { + some_brace("{", i) +} + +/// } +fn close_brace(i: &mut TokenSlice) -> PResult { + some_brace("}", i) +} + +fn comma(i: &mut TokenSlice) -> PResult<()> { + TokenType::Comma.parse_from(i)?; + Ok(()) +} + +fn hash(i: &mut TokenSlice) -> PResult<()> { + TokenType::Hash.parse_from(i)?; + Ok(()) +} + +fn bang(i: &mut TokenSlice) -> PResult { + TokenType::Bang.parse_from(i) +} + +fn dollar(i: &mut TokenSlice) -> PResult<()> { + TokenType::Dollar.parse_from(i)?; + Ok(()) +} + +fn period(i: &mut TokenSlice) -> PResult<()> { + TokenType::Period.parse_from(i)?; + Ok(()) +} + +fn double_period(i: &mut TokenSlice) -> PResult { + any.try_map(|token: Token| { + if matches!(token.token_type, TokenType::DoublePeriod) { + Ok(token) + } else { + Err(CompilationError::fatal( + token.as_source_range(), + format!( + "expected a '..' (double period) found {} which is {}", + token.value.as_str(), + token.token_type + ), + )) + } + }) + .context(expected("the .. operator, used for array ranges like [0..10]")) + .parse_next(i) +} + +fn colon(i: &mut TokenSlice) -> PResult { + TokenType::Colon.parse_from(i) +} + +fn equals(i: &mut TokenSlice) -> PResult { + one_of((TokenType::Operator, "=")) + .context(expected("the equals operator, =")) + .parse_next(i) +} + +fn question_mark(i: &mut TokenSlice) -> PResult<()> { + TokenType::QuestionMark.parse_from(i)?; + Ok(()) +} + +fn at_sign(i: &mut TokenSlice) -> PResult { + TokenType::At.parse_from(i) +} + +fn fun(i: &mut TokenSlice) -> PResult { + any.try_map(|token: Token| match token.token_type { + TokenType::Keyword if token.value == "fn" => Ok(token), + _ => Err(CompilationError::fatal( + token.as_source_range(), + format!("expected 'fn', found {}", token.value.as_str(),), + )), + }) + .parse_next(i) +} + +/// Parse a comma, optionally followed by some whitespace. +fn comma_sep(i: &mut TokenSlice) -> PResult<()> { + (opt(whitespace), comma, opt(whitespace)) + .context(expected("a comma, optionally followed by whitespace")) + .parse_next(i)?; + Ok(()) +} + +/// Arguments are passed into a function. +fn arguments(i: &mut TokenSlice) -> PResult> { + separated(0.., expression, comma_sep) + .context(expected("function arguments")) + .parse_next(i) +} + +fn labeled_argument(i: &mut TokenSlice) -> PResult { + separated_pair( + terminated(nameable_identifier, opt(whitespace)), + terminated(one_of((TokenType::Operator, "=")), opt(whitespace)), + expression, + ) + .map(|(label, arg)| LabeledArg { + label: label.inner, + arg, + }) + .parse_next(i) +} + +/// Arguments are passed into a function, +/// preceded by the name of the parameter (the label). +fn labeled_arguments(i: &mut TokenSlice) -> PResult> { + separated(0.., labeled_argument, comma_sep) + .context(expected("function arguments")) + .parse_next(i) +} + +/// A type of a function argument. +/// This can be: +/// - a primitive type, e.g. 'number' or 'string' or 'bool' +/// - an array type, e.g. 'number[]' or 'string[]' or 'bool[]' +/// - an object type, e.g. '{x: number, y: number}' or '{name: string, age: number}' +fn argument_type(i: &mut TokenSlice) -> PResult { + let type_ = alt(( + // Object types + // TODO it is buggy to treat object fields like parameters since the parameters parser assumes a terminating `)`. + (open_brace, parameters, close_brace).map(|(_, params, _)| Ok(FnArgType::Object { properties: params })), + // Array types + (one_of(TokenType::Type), open_bracket, close_bracket).map(|(token, _, _)| { + FnArgPrimitive::from_str(&token.value) + .map(FnArgType::Array) + .map_err(|err| CompilationError::fatal(token.as_source_range(), format!("Invalid type: {}", err))) + }), + // Primitive types + ( + one_of(TokenType::Type), + opt(delimited(open_paren, uom_for_type, close_paren)), + ) + .map(|(token, suffix)| { + if suffix.is_some() { + ParseContext::err(CompilationError::err( + (&token).into(), + "Unit of Measure types are experimental and currently do nothing.", + )); + } + FnArgPrimitive::from_str(&token.value) + .map(FnArgType::Primitive) + .map_err(|err| CompilationError::fatal(token.as_source_range(), format!("Invalid type: {}", err))) + }), + )) + .parse_next(i)? + .map_err(|e: CompilationError| ErrMode::Backtrack(ContextError::from(e)))?; + Ok(type_) +} + +fn uom_for_type(i: &mut TokenSlice) -> PResult { + any.try_map(|t: Token| t.value.parse()).parse_next(i) +} + +struct ParamDescription { + labeled: bool, + arg_name: Token, + type_: std::option::Option, + default_value: Option, +} + +fn parameter(i: &mut TokenSlice) -> PResult { + let (found_at_sign, arg_name, question_mark, _, type_, _ws, default_literal) = ( + opt(at_sign), + any.verify(|token: &Token| !matches!(token.token_type, TokenType::Brace) || token.value != ")"), + opt(question_mark), + opt(whitespace), + opt((colon, opt(whitespace), argument_type).map(|tup| tup.2)), + opt(whitespace), + opt((equals, opt(whitespace), literal).map(|(_, _, literal)| literal)), + ) + .parse_next(i)?; + Ok(ParamDescription { + labeled: found_at_sign.is_none(), + arg_name, + type_, + default_value: match (question_mark.is_some(), default_literal) { + (true, Some(lit)) => Some(DefaultParamVal::Literal(lit.inner)), + (true, None) => Some(DefaultParamVal::none()), + (false, None) => None, + (false, Some(lit)) => { + let msg = "You're trying to set a default value for an argument, but only optional arguments can have default values, and this argument is mandatory. Try putting a ? after the argument name, to make the argument optional."; + let e = CompilationError::fatal((&lit).into(), msg); + return Err(ErrMode::Backtrack(ContextError::from(e))); + } + }, + }) +} + +/// Parameters are declared in a function signature, and used within a function. +fn parameters(i: &mut TokenSlice) -> PResult> { + // Get all tokens until the next ), because that ends the parameter list. + let candidates: Vec<_> = separated(0.., parameter, comma_sep) + .context(expected("function parameters")) + .parse_next(i)?; + + // Make sure all those tokens are valid parameters. + let params: Vec = candidates + .into_iter() + .map( + |ParamDescription { + labeled, + arg_name, + type_, + default_value, + }| { + let identifier = + Node::::try_from(arg_name).and_then(Node::::into_valid_binding_name)?; + + Ok(Parameter { + identifier, + type_, + default_value, + labeled, + digest: None, + }) + }, + ) + .collect::>() + .map_err(|e: CompilationError| ErrMode::Backtrack(ContextError::from(e)))?; + + // Make sure the only unlabeled parameter is the first one. + if let Some(param) = params.iter().skip(1).find(|param| !param.labeled) { + let source_range = SourceRange::from(param); + return Err(ErrMode::Cut(ContextError::from(CompilationError::fatal( + source_range, + "Only the first parameter can be declared unlabeled", + )))); + } + + // Make sure optional parameters are last. + if let Err(e) = optional_after_required(¶ms) { + return Err(ErrMode::Cut(ContextError::from(e))); + } + Ok(params) +} + +fn optional_after_required(params: &[Parameter]) -> Result<(), CompilationError> { + let mut found_optional = false; + for p in params { + if p.optional() { + found_optional = true; + } + if !p.optional() && found_optional { + let e = CompilationError::fatal( + (&p.identifier).into(), + "mandatory parameters must be declared before optional parameters", + ); + return Err(e); + } + } + Ok(()) +} + +impl Node { + fn into_valid_binding_name(self) -> Result, CompilationError> { + // Make sure they are not assigning a variable to a stdlib function. + if crate::std::name_in_stdlib(&self.name) { + return Err(CompilationError::fatal( + SourceRange::from(&self), + format!("Cannot assign a variable to a reserved keyword: {}", self.name), + )); + } + Ok(self) + } +} + +/// Introduce a new name, which binds some value. +fn binding_name(i: &mut TokenSlice) -> PResult> { + identifier + .context(expected("an identifier, which will be the name of some value")) + .try_map(Node::::into_valid_binding_name) + .context(expected("an identifier, which will be the name of some value")) + .parse_next(i) +} + +fn typecheck_all(std_fn: Box, args: &[&Expr]) -> PResult<()> { + // Type check the arguments. + for (i, spec_arg) in std_fn.args(false).iter().enumerate() { + let Some(arg) = &args.get(i) else { + // The executor checks the number of arguments, so we don't need to check it here. + continue; + }; + typecheck(spec_arg, arg)?; + } + Ok(()) +} + +fn typecheck(spec_arg: &crate::docs::StdLibFnArg, arg: &&Expr) -> PResult<()> { + match spec_arg.type_.as_ref() { + "TagNode" => match &arg { + Expr::Identifier(_) => { + // These are fine since we want someone to be able to map a variable to a tag declarator. + } + Expr::TagDeclarator(tag) => { + // TODO: Remove this check. It should be redundant. + tag.clone() + .into_valid_binding_name() + .map_err(|e| ErrMode::Cut(ContextError::from(e)))?; + } + e => { + return Err(ErrMode::Cut( + CompilationError::fatal( + SourceRange::from(*arg), + format!("Expected a tag declarator like `$name`, found {:?}", e), + ) + .into(), + )); + } + }, + "TagIdentifier" => match &arg { + Expr::Identifier(_) => {} + Expr::MemberExpression(_) => {} + e => { + return Err(ErrMode::Cut( + CompilationError::fatal( + SourceRange::from(*arg), + format!("Expected a tag identifier like `tagName`, found {:?}", e), + ) + .into(), + )); + } + }, + _ => {} + } + Ok(()) +} + +/// Either a positional or keyword function call. +fn fn_call_pos_or_kw(i: &mut TokenSlice) -> PResult { + alt(( + fn_call.map(Box::new).map(Expr::CallExpression), + fn_call_kw.map(Box::new).map(Expr::CallExpressionKw), + )) + .parse_next(i) +} + +fn labelled_fn_call(i: &mut TokenSlice) -> PResult { + let expr = fn_call_pos_or_kw.parse_next(i)?; + + let label = opt(label).parse_next(i)?; + match label { + Some(label) => Ok(Expr::LabelledExpression(Box::new(LabelledExpression::new(expr, label)))), + None => Ok(expr), + } +} + +fn fn_call(i: &mut TokenSlice) -> PResult> { + let fn_name = nameable_identifier(i)?; + opt(whitespace).parse_next(i)?; + let _ = terminated(open_paren, opt(whitespace)).parse_next(i)?; + let args = arguments(i)?; + + if let Some(std_fn) = crate::std::get_stdlib_fn(&fn_name.name) { + let just_args: Vec<_> = args.iter().collect(); + typecheck_all(std_fn, &just_args)?; + } + let end = preceded(opt(whitespace), close_paren).parse_next(i)?.end; + + // This should really be done with resolved names, but we don't have warning support there + // so we'll hack this in here. + if fn_name.name == "int" { + assert_eq!(args.len(), 1); + let mut arg_str = args[0].recast(&crate::FormatOptions::default(), 0, ExprContext::Other); + if arg_str.contains('.') && !arg_str.ends_with(".0") { + arg_str = format!("round({arg_str})"); + } + ParseContext::warn(CompilationError::with_suggestion( + SourceRange::new(fn_name.start, end, fn_name.module_id), + None, + "`int` function is deprecated. You may not need it at all. If you need to round, consider `round`, `ceil`, or `floor`.", + Some(("Remove call to `int`", arg_str)), + Tag::Deprecated, + )); + } + + Ok(Node { + start: fn_name.start, + end, + module_id: fn_name.module_id, + inner: CallExpression { + callee: fn_name, + arguments: args, + digest: None, + }, + }) +} + +fn fn_call_kw(i: &mut TokenSlice) -> PResult> { + let fn_name = nameable_identifier(i)?; + opt(whitespace).parse_next(i)?; + let _ = open_paren.parse_next(i)?; + ignore_whitespace(i); + + let initial_unlabeled_arg = opt((expression, comma, opt(whitespace)).map(|(arg, _, _)| arg)).parse_next(i)?; + let args = labeled_arguments(i)?; + ignore_whitespace(i); + opt(comma_sep).parse_next(i)?; + let end = close_paren.parse_next(i)?.end; + + Ok(Node { + start: fn_name.start, + end, + module_id: fn_name.module_id, + inner: CallExpressionKw { + callee: fn_name, + unlabeled: initial_unlabeled_arg, + arguments: args, + digest: None, + }, + }) +} + +#[cfg(test)] +mod tests { + use itertools::Itertools; + use pretty_assertions::assert_eq; + + use super::*; + use crate::{ + parsing::ast::types::{BodyItem, Expr, VariableKind}, + KclError, ModuleId, + }; + + fn assert_reserved(word: &str) { + // Try to use it as a variable name. + let code = format!(r#"{} = 0"#, word); + let result = crate::parsing::top_level_parse(code.as_str()); + let err = &result.unwrap_errs().next().unwrap(); + // Which token causes the error may change. In "return = 0", for + // example, "return" is the problem. + assert!( + err.message.starts_with("Unexpected token: ") + || err.message.starts_with("= is not") + || err + .message + .starts_with("Cannot assign a variable to a reserved keyword: "), + "Error message is: `{}`", + err.message, + ); + } + + #[test] + fn reserved_words() { + // Since these are stored in a set, we sort to make the tests + // deterministic. + for word in crate::parsing::token::RESERVED_WORDS.keys().sorted() { + assert_reserved(word); + } + assert_reserved("import"); + } + + #[test] + fn parse_args() { + for (i, (test, expected_len)) in [("someVar", 1), ("5, 3", 2), (r#""a""#, 1)].into_iter().enumerate() { + let tokens = crate::parsing::token::lex(test, ModuleId::default()).unwrap(); + let actual = match arguments.parse(tokens.as_slice()) { + Ok(x) => x, + Err(e) => panic!("Failed test {i}, could not parse function arguments from \"{test}\": {e:?}"), + }; + assert_eq!(actual.len(), expected_len, "failed test {i}"); + } + } + + #[test] + fn weird_program_unclosed_paren() { + let tokens = crate::parsing::token::lex("fn firstPrime(", ModuleId::default()).unwrap(); + let tokens = tokens.as_slice(); + let last = tokens.last().unwrap().as_source_range(); + let err: CompilationError = program.parse(tokens).unwrap_err().into(); + assert_eq!(err.source_range, last); + // TODO: Better comment. This should explain the compiler expected ) because the user had started declaring the function's parameters. + // Part of https://github.com/KittyCAD/modeling-app/issues/784 + assert_eq!(err.message, "Unexpected end of file. The compiler expected )"); + } + + #[test] + fn weird_program_just_a_pipe() { + let tokens = crate::parsing::token::lex("|", ModuleId::default()).unwrap(); + let err: CompilationError = program.parse(tokens.as_slice()).unwrap_err().into(); + assert_eq!(err.source_range, SourceRange::new(0, 1, ModuleId::default())); + assert_eq!(err.message, "Unexpected token: |"); + } + + #[test] + fn parse_binary_expressions() { + for (i, test_program) in ["1 + 2 + 3"].into_iter().enumerate() { + let tokens = crate::parsing::token::lex(test_program, ModuleId::default()).unwrap(); + let _actual = match binary_expression.parse_next(&mut tokens.as_slice()) { + Ok(x) => x, + Err(e) => panic!("Failed test {i}, could not parse binary expressions from \"{test_program}\": {e:?}"), + }; + } + } + + #[test] + fn test_vardec_no_keyword() { + let tokens = crate::parsing::token::lex("x = 4", ModuleId::default()).unwrap(); + let vardec = declaration(&mut tokens.as_slice()).unwrap(); + assert_eq!(vardec.inner.kind, VariableKind::Const); + let vardec = &vardec.declaration; + assert_eq!(vardec.id.name, "x"); + let Expr::Literal(init_val) = &vardec.init else { + panic!("weird init value") + }; + assert_eq!(init_val.raw, "4"); + } + + #[test] + fn test_negative_operands() { + let tokens = crate::parsing::token::lex("-leg2", ModuleId::default()).unwrap(); + let _s = operand.parse_next(&mut tokens.as_slice()).unwrap(); + } + + #[test] + fn test_comments_in_function1() { + let test_program = r#"() { + // comment 0 + a = 1 + // comment 1 + b = 2 + // comment 2 + return 1 + }"#; + let tokens = crate::parsing::token::lex(test_program, ModuleId::default()).unwrap(); + let expr = function_decl.map(|t| t.0).parse_next(&mut tokens.as_slice()).unwrap(); + assert_eq!(expr.params, vec![]); + let comment_start = expr.body.non_code_meta.start_nodes.first().unwrap(); + let comment0 = &expr.body.non_code_meta.non_code_nodes.get(&0).unwrap()[0]; + let comment1 = &expr.body.non_code_meta.non_code_nodes.get(&1).unwrap()[0]; + assert_eq!(comment_start.value(), "comment 0"); + assert_eq!(comment0.value(), "comment 1"); + assert_eq!(comment1.value(), "comment 2"); + } + + #[test] + fn test_comments_in_function2() { + let test_program = r#"() { + yo = { a = { b = { c = '123' } } } /* block +comment */ +}"#; + let tokens = crate::parsing::token::lex(test_program, ModuleId::default()).unwrap(); + let expr = function_decl.map(|t| t.0).parse_next(&mut tokens.as_slice()).unwrap(); + let comment0 = &expr.body.non_code_meta.non_code_nodes.get(&0).unwrap()[0]; + assert_eq!(comment0.value(), "block\ncomment"); + } + + #[test] + fn test_comment_at_start_of_program() { + let test_program = r#" +/* comment at start */ + +mySk1 = startSketchAt([0, 0])"#; + let tokens = crate::parsing::token::lex(test_program, ModuleId::default()).unwrap(); + let program = program.parse(tokens.as_slice()).unwrap(); + let mut starting_comments = program.inner.non_code_meta.start_nodes; + assert_eq!(starting_comments.len(), 2); + let start0 = starting_comments.remove(0); + let start1 = starting_comments.remove(0); + assert_eq!( + start0.value, + NonCodeValue::BlockComment { + value: "comment at start".to_owned(), + style: CommentStyle::Block + } + ); + assert_eq!(start1.value, NonCodeValue::NewLine); + } + + #[test] + fn test_comment_in_pipe() { + let tokens = crate::parsing::token::lex(r#"x = y() |> /*hi*/ z(%)"#, ModuleId::default()).unwrap(); + let mut body = program.parse(tokens.as_slice()).unwrap().inner.body; + let BodyItem::VariableDeclaration(item) = body.remove(0) else { + panic!("expected vardec"); + }; + let val = item.inner.declaration.inner.init; + let Expr::PipeExpression(pipe) = val else { + panic!("expected pipe"); + }; + let mut noncode = pipe.inner.non_code_meta; + assert_eq!(noncode.non_code_nodes.len(), 1); + let comment = noncode.non_code_nodes.remove(&0).unwrap().pop().unwrap(); + assert_eq!( + comment.value, + NonCodeValue::BlockComment { + value: "hi".to_owned(), + style: CommentStyle::Block + } + ); + } + + #[test] + fn test_whitespace_in_function() { + let test_program = r#"() { + return sg + return sg + }"#; + let tokens = crate::parsing::token::lex(test_program, ModuleId::default()).unwrap(); + let _expr = function_decl.parse_next(&mut tokens.as_slice()).unwrap(); + } + + #[test] + fn test_empty_lines_in_function() { + let test_program = "() { + + return 2 + }"; + let module_id = ModuleId::from_usize(1); + let tokens = crate::parsing::token::lex(test_program, module_id).unwrap(); + let expr = function_decl.map(|t| t.0).parse_next(&mut tokens.as_slice()).unwrap(); + assert_eq!( + expr, + Node::new( + FunctionExpression { + params: Default::default(), + body: Node::new( + Program { + body: vec![BodyItem::ReturnStatement(Node::new( + ReturnStatement { + argument: Expr::Literal(Box::new(Node::new( + Literal { + value: 2u32.into(), + raw: "2".to_owned(), + digest: None, + }, + 29, + 30, + module_id, + ))), + digest: None, + }, + 22, + 30, + module_id, + ))], + non_code_meta: NonCodeMeta { + non_code_nodes: Default::default(), + start_nodes: vec![Node::new( + NonCodeNode { + value: NonCodeValue::NewLine, + digest: None + }, + 4, + 22, + module_id, + )], + digest: None, + }, + shebang: None, + digest: None, + }, + 4, + 44, + module_id, + ), + return_type: None, + digest: None, + }, + 0, + 44, + module_id, + ) + ); + } + + #[test] + fn inline_comment_pipe_expression() { + let test_input = r#"a('XY') + |> b(%) + |> c(%) // inline-comment + |> d(%)"#; + + let tokens = crate::parsing::token::lex(test_input, ModuleId::default()).unwrap(); + let Node { + inner: PipeExpression { + body, non_code_meta, .. + }, + .. + } = pipe_expression.parse_next(&mut tokens.as_slice()).unwrap(); + assert_eq!(non_code_meta.non_code_nodes.len(), 1); + assert_eq!( + non_code_meta.non_code_nodes.get(&2).unwrap()[0].value, + NonCodeValue::InlineComment { + value: "inline-comment".to_owned(), + style: CommentStyle::Line + } + ); + assert_eq!(body.len(), 4); + } + + #[test] + fn many_comments() { + let test_program = r#"// this is a comment + yo = { a = { b = { c = '123' } } } /* block + comment */ + + key = 'c' + // this is also a comment + return things +"#; + + let module_id = ModuleId::default(); + let tokens = crate::parsing::token::lex(test_program, module_id).unwrap(); + let Program { non_code_meta, .. } = function_body.parse(tokens.as_slice()).unwrap().inner; + assert_eq!( + vec![Node::new( + NonCodeNode { + value: NonCodeValue::BlockComment { + value: "this is a comment".to_owned(), + style: CommentStyle::Line + }, + digest: None, + }, + 0, + 20, + module_id, + )], + non_code_meta.start_nodes, + ); + + assert_eq!( + Some(&vec![ + Node::new( + NonCodeNode { + value: NonCodeValue::InlineComment { + value: "block\n comment".to_owned(), + style: CommentStyle::Block + }, + digest: None, + }, + 57, + 79, + module_id, + ), + Node::new( + NonCodeNode { + value: NonCodeValue::NewLine, + digest: None, + }, + 79, + 83, + module_id, + ) + ]), + non_code_meta.non_code_nodes.get(&0), + ); + + assert_eq!( + Some(&vec![Node::new( + NonCodeNode { + value: NonCodeValue::BlockComment { + value: "this is also a comment".to_owned(), + style: CommentStyle::Line + }, + digest: None, + }, + 94, + 120, + module_id, + )]), + non_code_meta.non_code_nodes.get(&1), + ); + } + + #[test] + fn inline_block_comments() { + let test_program = r#"yo = 3 /* block + comment */ + return 1"#; + + let tokens = crate::parsing::token::lex(test_program, ModuleId::default()).unwrap(); + let actual = program.parse(tokens.as_slice()).unwrap(); + assert_eq!(actual.non_code_meta.non_code_nodes.len(), 1); + assert_eq!( + actual.non_code_meta.non_code_nodes.get(&0).unwrap()[0].value, + NonCodeValue::InlineComment { + value: "block\n comment".to_owned(), + style: CommentStyle::Block + } + ); + } + + #[test] + fn test_bracketed_binary_expression() { + let input = "(2 - 3)"; + let tokens = crate::parsing::token::lex(input, ModuleId::default()).unwrap(); + let actual = match binary_expr_in_parens.parse(tokens.as_slice()) { + Ok(x) => x, + Err(e) => panic!("{e:?}"), + }; + assert_eq!(actual.operator, BinaryOperator::Sub); + } + + #[test] + fn test_arg() { + for input in [ + "( sigmaAllow * width )", + "6 / ( sigmaAllow * width )", + "sqrt(distance * p * FOS * 6 / ( sigmaAllow * width ))", + ] { + let tokens = crate::parsing::token::lex(input, ModuleId::default()).unwrap(); + let _actual = match expression.parse(tokens.as_slice()) { + Ok(x) => x, + Err(e) => panic!("{e:?}"), + }; + } + } + + #[test] + fn test_arithmetic() { + let input = "1 * (2 - 3)"; + let tokens = crate::parsing::token::lex(input, ModuleId::default()).unwrap(); + // The RHS should be a binary expression. + let actual = binary_expression.parse(tokens.as_slice()).unwrap(); + assert_eq!(actual.operator, BinaryOperator::Mul); + let BinaryPart::BinaryExpression(rhs) = actual.inner.right else { + panic!("Expected RHS to be another binary expression"); + }; + assert_eq!(rhs.operator, BinaryOperator::Sub); + match &rhs.right { + BinaryPart::Literal(lit) => { + assert!(lit.start == 9 && lit.end == 10); + assert!(lit.value == 3u32.into() && &lit.raw == "3" && lit.digest.is_none()); + } + _ => panic!(), + } + } + + #[test] + fn assign_brackets() { + for (i, test_input) in [ + "thickness_squared = (1 + 1)", + "thickness_squared = ( 1 + 1)", + "thickness_squared = (1 + 1 )", + "thickness_squared = ( 1 + 1 )", + ] + .into_iter() + .enumerate() + { + let tokens = crate::parsing::token::lex(test_input, ModuleId::default()).unwrap(); + let actual = match declaration.parse(tokens.as_slice()) { + Err(e) => panic!("Could not parse test {i}: {e:#?}"), + Ok(a) => a, + }; + let Expr::BinaryExpression(_expr) = &actual.declaration.inner.init else { + panic!( + "Expected test {i} to be a binary expression but it wasn't, it was {:?}", + actual.declaration + ); + }; + // TODO: check both sides are 1... probably not necessary but should do. + } + } + + #[test] + fn test_function_call() { + for (i, test_input) in ["x = f(1)", "x = f( 1 )"].into_iter().enumerate() { + let tokens = crate::parsing::token::lex(test_input, ModuleId::default()).unwrap(); + let _actual = match declaration.parse(tokens.as_slice()) { + Err(e) => panic!("Could not parse test {i}: {e:#?}"), + Ok(a) => a, + }; + } + } + + #[test] + fn test_nested_arithmetic() { + let input = "1 * ((2 - 3) / 4)"; + let tokens = crate::parsing::token::lex(input, ModuleId::default()).unwrap(); + // The RHS should be a binary expression. + let outer = binary_expression.parse(tokens.as_slice()).unwrap(); + assert_eq!(outer.operator, BinaryOperator::Mul); + let BinaryPart::BinaryExpression(middle) = outer.inner.right else { + panic!("Expected RHS to be another binary expression"); + }; + + assert_eq!(middle.operator, BinaryOperator::Div); + let BinaryPart::BinaryExpression(inner) = middle.inner.left else { + panic!("expected nested binary expression"); + }; + assert_eq!(inner.operator, BinaryOperator::Sub); + } + + #[test] + fn binary_expression_ignores_whitespace() { + let tests = ["1 - 2", "1- 2", "1 -2", "1-2"]; + for test in tests { + let tokens = crate::parsing::token::lex(test, ModuleId::default()).unwrap(); + let actual = binary_expression.parse(tokens.as_slice()).unwrap(); + assert_eq!(actual.operator, BinaryOperator::Sub); + let BinaryPart::Literal(left) = actual.inner.left else { + panic!("should be expression"); + }; + assert_eq!(left.value, 1u32.into()); + let BinaryPart::Literal(right) = actual.inner.right else { + panic!("should be expression"); + }; + assert_eq!(right.value, 2u32.into()); + } + } + + #[test] + fn some_pipe_expr() { + let test_program = r#"x() + |> y(%) /* this is + a comment + spanning a few lines */ + |> z(%)"#; + let tokens = crate::parsing::token::lex(test_program, ModuleId::default()).unwrap(); + let actual = pipe_expression.parse(tokens.as_slice()).unwrap(); + let n = actual.non_code_meta.non_code_nodes.len(); + assert_eq!(n, 1, "expected one comment in pipe expression but found {n}"); + let nc = &actual.non_code_meta.non_code_nodes.get(&1).unwrap()[0]; + assert!(nc.value().starts_with("this")); + assert!(nc.value().ends_with("lines")); + } + + #[test] + fn comments_in_pipe_expr() { + for (i, test_program) in [ + r#"y() |> /*hi*/ z(%)"#, + "1 |>/*hi*/ f(%)", + r#"y() |> /*hi*/ z(%)"#, + "1 /*hi*/ |> f(%)", + "1 + // Hi + |> f(%)", + "1 + /* Hi + there + */ + |> f(%)", + ] + .into_iter() + .enumerate() + { + let tokens = crate::parsing::token::lex(test_program, ModuleId::default()).unwrap(); + let actual = pipe_expression.parse(tokens.as_slice()); + assert!(actual.is_ok(), "could not parse test {i}, '{test_program}'"); + let actual = actual.unwrap(); + let n = actual.non_code_meta.non_code_nodes.len(); + assert_eq!(n, 1, "expected one comment in pipe expression but found {n}",) + } + } + + #[test] + fn comments() { + let module_id = ModuleId::from_usize(1); + for (i, (test_program, expected)) in [ + ( + "//hi", + Node::new( + NonCodeNode { + value: NonCodeValue::BlockComment { + value: "hi".to_owned(), + style: CommentStyle::Line, + }, + digest: None, + }, + 0, + 4, + module_id, + ), + ), + ( + "/*hello*/", + Node::new( + NonCodeNode { + value: NonCodeValue::BlockComment { + value: "hello".to_owned(), + style: CommentStyle::Block, + }, + digest: None, + }, + 0, + 9, + module_id, + ), + ), + ( + "/* hello */", + Node::new( + NonCodeNode { + value: NonCodeValue::BlockComment { + value: "hello".to_owned(), + style: CommentStyle::Block, + }, + digest: None, + }, + 0, + 11, + module_id, + ), + ), + ( + "/* \nhello */", + Node::new( + NonCodeNode { + value: NonCodeValue::BlockComment { + value: "hello".to_owned(), + style: CommentStyle::Block, + }, + digest: None, + }, + 0, + 12, + module_id, + ), + ), + ( + " + /* hello */", + Node::new( + NonCodeNode { + value: NonCodeValue::BlockComment { + value: "hello".to_owned(), + style: CommentStyle::Block, + }, + digest: None, + }, + 0, + 29, + module_id, + ), + ), + ( + // Empty line with trailing whitespace + " + + /* hello */", + Node::new( + NonCodeNode { + value: NonCodeValue::NewLineBlockComment { + value: "hello".to_owned(), + style: CommentStyle::Block, + }, + digest: None, + }, + 0, + 32, + module_id, + ), + ), + ( + // Empty line, no trailing whitespace + " + + /* hello */", + Node::new( + NonCodeNode { + value: NonCodeValue::NewLineBlockComment { + value: "hello".to_owned(), + style: CommentStyle::Block, + }, + digest: None, + }, + 0, + 30, + module_id, + ), + ), + ( + r#"/* block + comment */"#, + Node::new( + NonCodeNode { + value: NonCodeValue::BlockComment { + value: "block\n comment".to_owned(), + style: CommentStyle::Block, + }, + digest: None, + }, + 0, + 39, + module_id, + ), + ), + ] + .into_iter() + .enumerate() + { + let tokens = crate::parsing::token::lex(test_program, module_id).unwrap(); + let actual = non_code_node.parse(tokens.as_slice()); + assert!(actual.is_ok(), "could not parse test {i}: {actual:#?}"); + let actual = actual.unwrap(); + assert_eq!(actual, expected, "failed test {i}"); + } + } + + #[test] + fn recognize_invalid_params() { + let test_fn = "(let) => { return 1 }"; + let module_id = ModuleId::from_usize(2); + let tokens = crate::parsing::token::lex(test_fn, module_id).unwrap(); + let err = function_decl.parse(tokens.as_slice()).unwrap_err().into_inner(); + let cause = err.cause.unwrap(); + // This is the token `let` + assert_eq!(cause.source_range, SourceRange::new(1, 4, ModuleId::from_usize(2))); + assert_eq!(cause.message, "Cannot assign a variable to a reserved keyword: let"); + } + + #[test] + fn comment_in_string() { + let string_literal = r#"" + // a comment + ""#; + let tokens = crate::parsing::token::lex(string_literal, ModuleId::default()).unwrap(); + let parsed_literal = literal.parse(tokens.as_slice()).unwrap(); + assert_eq!( + parsed_literal.value, + " + // a comment + " + .into() + ); + } + + #[test] + fn pipes_on_pipes_minimal() { + let test_program = r#"startSketchAt([0, 0]) + |> lineTo([0, -0], %) // MoveRelative + + "#; + let tokens = crate::parsing::token::lex(test_program, ModuleId::default()).unwrap(); + let tokens = &mut tokens.as_slice(); + let _actual = pipe_expression.parse_next(tokens).unwrap(); + assert_eq!(tokens.first().unwrap().token_type, TokenType::Whitespace); + } + + #[test] + fn test_pipes_on_pipes() { + let test_program = include_str!("../../../tests/executor/inputs/pipes_on_pipes.kcl"); + let tokens = crate::parsing::token::lex(test_program, ModuleId::default()).unwrap(); + let _ = run_parser(tokens.as_slice()).unwrap(); + } + + #[test] + fn test_cube() { + let test_program = include_str!("../../../tests/executor/inputs/cube.kcl"); + let tokens = crate::parsing::token::lex(test_program, ModuleId::default()).unwrap(); + match program.parse(tokens.as_slice()) { + Ok(_) => {} + Err(e) => { + panic!("{e:#?}"); + } + } + } + + #[test] + fn test_parameter_list() { + let tests = [ + ("", vec![]), + ("a", vec!["a"]), + ("a, b", vec!["a", "b"]), + ("a,b", vec!["a", "b"]), + ]; + for (i, (input, expected)) in tests.into_iter().enumerate() { + let tokens = crate::parsing::token::lex(input, ModuleId::default()).unwrap(); + let actual = parameters.parse(tokens.as_slice()); + assert!(actual.is_ok(), "could not parse test {i}"); + let actual_ids: Vec<_> = actual.unwrap().into_iter().map(|p| p.identifier.inner.name).collect(); + assert_eq!(actual_ids, expected); + } + } + + #[test] + fn test_user_function() { + let input = "() { + return 2 + }"; + + let tokens = crate::parsing::token::lex(input, ModuleId::default()).unwrap(); + let actual = function_decl.parse(tokens.as_slice()); + assert!(actual.is_ok(), "could not parse test function"); + } + + #[test] + fn test_declaration() { + let tests = ["myVar = 5", "myVar=5", "myVar =5", "myVar= 5"]; + for test in tests { + // Run the original parser + let tokens = crate::parsing::token::lex(test, ModuleId::default()).unwrap(); + let mut expected_body = crate::parsing::parse_tokens(tokens.clone()).unwrap().inner.body; + assert_eq!(expected_body.len(), 1); + let BodyItem::VariableDeclaration(expected) = expected_body.pop().unwrap() else { + panic!("Expected variable declaration"); + }; + + // Run the second parser, check it matches the first parser. + let actual = declaration.parse(tokens.as_slice()).unwrap(); + assert_eq!(expected, actual); + + // Inspect its output in more detail. + assert_eq!(actual.inner.kind, VariableKind::Const); + assert_eq!(actual.start, 0); + let decl = &actual.declaration; + assert_eq!(decl.id.name, "myVar"); + let Expr::Literal(value) = &decl.inner.init else { + panic!("value should be a literal") + }; + assert_eq!(value.end, test.len()); + assert_eq!(value.raw, "5"); + } + } + + #[test] + fn test_math_parse() { + let module_id = ModuleId::default(); + let actual = crate::parsing::parse_str(r#"5 + "a""#, module_id).unwrap().inner.body; + let expr = Node::boxed( + BinaryExpression { + operator: BinaryOperator::Add, + left: BinaryPart::Literal(Box::new(Node::new( + Literal { + value: 5u32.into(), + raw: "5".to_owned(), + digest: None, + }, + 0, + 1, + module_id, + ))), + right: BinaryPart::Literal(Box::new(Node::new( + Literal { + value: "a".into(), + raw: r#""a""#.to_owned(), + digest: None, + }, + 4, + 7, + module_id, + ))), + digest: None, + }, + 0, + 7, + module_id, + ); + let expected = vec![BodyItem::ExpressionStatement(Node::new( + ExpressionStatement { + expression: Expr::BinaryExpression(expr), + digest: None, + }, + 0, + 7, + module_id, + ))]; + assert_eq!(expected, actual); + } + + #[test] + fn test_abstract_syntax_tree() { + let code = "5 +6"; + let module_id = ModuleId::default(); + let result = crate::parsing::parse_str(code, module_id).unwrap(); + let expected_result = Node::new( + Program { + body: vec![BodyItem::ExpressionStatement(Node::new( + ExpressionStatement { + expression: Expr::BinaryExpression(Node::boxed( + BinaryExpression { + left: BinaryPart::Literal(Box::new(Node::new( + Literal { + value: 5u32.into(), + raw: "5".to_string(), + digest: None, + }, + 0, + 1, + module_id, + ))), + operator: BinaryOperator::Add, + right: BinaryPart::Literal(Box::new(Node::new( + Literal { + value: 6u32.into(), + raw: "6".to_string(), + digest: None, + }, + 3, + 4, + module_id, + ))), + digest: None, + }, + 0, + 4, + module_id, + )), + digest: None, + }, + 0, + 4, + module_id, + ))], + shebang: None, + non_code_meta: NonCodeMeta::default(), + digest: None, + }, + 0, + 4, + module_id, + ); + + assert_eq!(result, expected_result); + } + + #[test] + fn test_empty_file() { + let some_program_string = r#""#; + let result = crate::parsing::top_level_parse(some_program_string); + assert!(result.is_ok()); + } + + #[track_caller] + fn assert_no_err(p: &str) -> (Node, Vec) { + let result = crate::parsing::top_level_parse(p); + let result = result.0.unwrap(); + assert!(result.1.iter().all(|e| !e.severity.is_err()), "found: {:#?}", result.1); + (result.0.unwrap(), result.1) + } + + #[track_caller] + fn assert_no_fatal(p: &str) -> (Node, Vec) { + let result = crate::parsing::top_level_parse(p); + let result = result.0.unwrap(); + assert!( + result.1.iter().all(|e| e.severity != Severity::Fatal), + "found: {:#?}", + result.1 + ); + (result.0.unwrap(), result.1) + } + + #[track_caller] + fn assert_err(p: &str, msg: &str, src_expected: [usize; 2]) { + let result = crate::parsing::top_level_parse(p); + let err = result.unwrap_errs().next().unwrap(); + assert_eq!(err.message, msg); + let src_actual = [err.source_range.start(), err.source_range.end()]; + assert_eq!( + src_expected, + src_actual, + "expected error would highlight {} but it actually highlighted {}", + &p[src_expected[0]..src_expected[1]], + &p[src_actual[0]..src_actual[1]], + ); + } + + #[track_caller] + fn assert_err_contains(p: &str, expected: &str) { + let result = crate::parsing::top_level_parse(p); + let err = &result.unwrap_errs().next().unwrap().message; + assert!(err.contains(expected), "actual='{err}'"); + } + + #[test] + fn test_parse_half_pipe_small() { + assert_err_contains( + "secondExtrude = startSketchOn('XY') + |> startProfileAt([0,0], %) + |", + "Unexpected token: |", + ); + } + + #[test] + fn test_parse_member_expression_double_nested_braces() { + let code = r#"prop = yo["one"][two]"#; + crate::parsing::top_level_parse(code).unwrap(); + } + + #[test] + fn test_parse_member_expression_binary_expression_period_number_first() { + let code = r#"obj = { a: 1, b: 2 } +height = 1 - obj.a"#; + crate::parsing::top_level_parse(code).unwrap(); + } + + #[test] + fn test_parse_member_expression_allowed_type_in_expression() { + let code = r#"obj = { thing: 1 } +startSketchOn(obj.sketch)"#; + + crate::parsing::top_level_parse(code).unwrap(); + } + + #[test] + fn test_parse_member_expression_binary_expression_brace_number_first() { + let code = r#"obj = { a: 1, b: 2 } +height = 1 - obj["a"]"#; + crate::parsing::top_level_parse(code).unwrap(); + } + + #[test] + fn test_parse_member_expression_binary_expression_brace_number_second() { + let code = r#"obj = { a: 1, b: 2 } +height = obj["a"] - 1"#; + crate::parsing::top_level_parse(code).unwrap(); + } + + #[test] + fn test_parse_member_expression_binary_expression_in_array_number_first() { + let code = r#"obj = { a: 1, b: 2 } +height = [1 - obj["a"], 0]"#; + crate::parsing::top_level_parse(code).unwrap(); + } + + #[test] + fn test_parse_member_expression_binary_expression_in_array_number_second() { + let code = r#"obj = { a: 1, b: 2 } +height = [obj["a"] - 1, 0]"#; + crate::parsing::top_level_parse(code).unwrap(); + } + + #[test] + fn test_parse_member_expression_binary_expression_in_array_number_second_missing_space() { + let code = r#"obj = { a: 1, b: 2 } +height = [obj["a"] -1, 0]"#; + crate::parsing::top_level_parse(code).unwrap(); + } + + #[test] + fn test_anon_fn() { + crate::parsing::top_level_parse("foo(42, fn(x) { return x + 1 })").unwrap(); + } + + #[test] + fn test_annotation_fn() { + crate::parsing::top_level_parse( + r#"fn foo() { + @annotated + return 1 +}"#, + ) + .unwrap(); + } + + #[test] + fn test_annotation_settings() { + crate::parsing::top_level_parse("@settings(units = mm)").unwrap(); + } + + #[test] + fn test_anon_fn_no_fn() { + assert_err_contains("foo(42, (x) { return x + 1 })", "Anonymous function requires `fn`"); + } + + #[test] + fn test_parse_half_pipe() { + let code = "height = 10 + +firstExtrude = startSketchOn('XY') + |> startProfileAt([0,0], %) + |> line([0, 8], %) + |> line([20, 0], %) + |> line([0, -8], %) + |> close(%) + |> extrude(2, %) + +secondExtrude = startSketchOn('XY') + |> startProfileAt([0,0], %) + |"; + assert_err_contains(code, "Unexpected token: |"); + } + + #[test] + fn test_parse_greater_bang() { + assert_err(">!", "Unexpected token: >", [0, 1]); + } + + #[test] + fn test_parse_unlabeled_param_not_allowed() { + assert_err( + "fn f(@x, @y) { return 1 }", + "Only the first parameter can be declared unlabeled", + [9, 11], + ); + assert_err( + "fn f(x, @y) { return 1 }", + "Only the first parameter can be declared unlabeled", + [8, 10], + ); + } + + #[test] + fn test_parse_z_percent_parens() { + assert_err("z%)", "Unexpected token: %", [1, 2]); + } + + #[test] + fn test_parse_parens_unicode() { + let result = crate::parsing::top_level_parse("(ޜ"); + let KclError::Lexical(details) = result.0.unwrap_err() else { + panic!(); + }; + // TODO: Better errors when program cannot tokenize. + // https://github.com/KittyCAD/modeling-app/issues/696 + assert_eq!(details.message, "found unknown token 'ޜ'"); + assert_eq!(details.source_ranges[0].start(), 1); + assert_eq!(details.source_ranges[0].end(), 2); + } + + #[test] + fn test_parse_negative_in_array_binary_expression() { + let code = r#"leg1 = 5 +thickness = 0.56 + +bracket = [-leg2 + thickness, 0] +"#; + crate::parsing::top_level_parse(code).unwrap(); + } + + #[test] + fn test_parse_nested_open_brackets() { + let _ = crate::parsing::top_level_parse( + r#" +z(-[["#, + ) + .unwrap_errs(); + } + + #[test] + fn test_parse_weird_new_line_function() { + assert_err( + r#"z +(--#"#, + "Unexpected token: (", + [2, 3], + ); + } + + #[test] + fn test_parse_weird_lots_of_fancy_brackets() { + assert_err(r#"zz({{{{{{{{)iegAng{{{{{{{##"#, "Unexpected token: (", [2, 3]); + } + + #[test] + fn test_parse_weird_close_before_open() { + assert_err_contains( + r#"fn)n +e +["#, + "expected whitespace, found ')' which is brace", + ); + } + + #[test] + fn test_parse_weird_close_before_nada() { + assert_err_contains(r#"fn)n-"#, "expected whitespace, found ')' which is brace"); + } + + #[test] + fn test_parse_weird_lots_of_slashes() { + assert_err_contains( + r#"J///////////o//+///////////P++++*++++++P///////˟ +++4"#, + "Unexpected token: +", + ); + } + + #[test] + fn test_optional_param_order() { + for (i, (params, expect_ok)) in [ + ( + vec![Parameter { + identifier: Node::no_src(Identifier { + name: "a".to_owned(), + digest: None, + }), + type_: None, + default_value: Some(DefaultParamVal::none()), + labeled: true, + digest: None, + }], + true, + ), + ( + vec![Parameter { + identifier: Node::no_src(Identifier { + name: "a".to_owned(), + digest: None, + }), + type_: None, + default_value: None, + labeled: true, + digest: None, + }], + true, + ), + ( + vec![ + Parameter { + identifier: Node::no_src(Identifier { + name: "a".to_owned(), + digest: None, + }), + type_: None, + default_value: None, + labeled: true, + digest: None, + }, + Parameter { + identifier: Node::no_src(Identifier { + name: "b".to_owned(), + digest: None, + }), + type_: None, + default_value: Some(DefaultParamVal::none()), + labeled: true, + digest: None, + }, + ], + true, + ), + ( + vec![ + Parameter { + identifier: Node::no_src(Identifier { + name: "a".to_owned(), + digest: None, + }), + type_: None, + default_value: Some(DefaultParamVal::none()), + labeled: true, + digest: None, + }, + Parameter { + identifier: Node::no_src(Identifier { + name: "b".to_owned(), + digest: None, + }), + type_: None, + default_value: None, + labeled: true, + digest: None, + }, + ], + false, + ), + ] + .into_iter() + .enumerate() + { + let actual = optional_after_required(¶ms); + assert_eq!(actual.is_ok(), expect_ok, "failed test {i}"); + } + } + + #[test] + fn test_error_keyword_in_variable() { + assert_err( + r#"const let = "thing""#, + "Cannot assign a variable to a reserved keyword: let", + [6, 9], + ); + } + + #[test] + fn test_error_keyword_in_fn_name() { + assert_err( + r#"fn let = () {}"#, + "Cannot assign a variable to a reserved keyword: let", + [3, 6], + ); + } + + #[test] + fn test_error_stdlib_in_fn_name() { + assert_err( + r#"fn cos = () => { + return 1 + }"#, + "Cannot assign a variable to a reserved keyword: cos", + [3, 6], + ); + } + + #[test] + fn test_error_keyword_in_fn_args() { + assert_err( + r#"fn thing = (let) => { + return 1 +}"#, + "Cannot assign a variable to a reserved keyword: let", + [12, 15], + ) + } + + #[test] + fn test_error_stdlib_in_fn_args() { + assert_err( + r#"fn thing = (cos) => { + return 1 +}"#, + "Cannot assign a variable to a reserved keyword: cos", + [12, 15], + ) + } + + #[test] + fn bad_imports() { + assert_err( + r#"import cube from "../cube.kcl""#, + "import path may only contain alphanumeric characters, underscore, hyphen, and period. Files in other directories are not yet supported.", + [17, 30], + ); + assert_err( + r#"import * as foo from "dsfs""#, + "as is not the 'from' keyword", + [9, 11], + ); + assert_err(r#"import a from "dsfs" as b"#, "Unexpected token: as", [21, 23]); + assert_err(r#"import * from "dsfs" as b"#, "Unexpected token: as", [21, 23]); + assert_err(r#"import a from b"#, "invalid string literal", [14, 15]); + assert_err(r#"import * "dsfs""#, "\"dsfs\" is not the 'from' keyword", [9, 15]); + assert_err(r#"import from "dsfs""#, "\"dsfs\" is not the 'from' keyword", [12, 18]); + assert_err(r#"import "dsfs.kcl" as *"#, "Unexpected token: as", [18, 20]); + assert_err( + r#"import "dsfs""#, + "import path is not a valid identifier and must be aliased.", + [7, 13], + ); + assert_err( + r#"import "foo.bar.kcl""#, + "import path is not a valid identifier and must be aliased.", + [7, 20], + ); + assert_err( + r#"import "_foo.kcl""#, + "import path is not a valid identifier and must be aliased.", + [7, 17], + ); + assert_err( + r#"import "foo-bar.kcl""#, + "import path is not a valid identifier and must be aliased.", + [7, 20], + ); + } + + #[test] + fn warn_import() { + let some_program_string = r#"import "foo.kcl""#; + let (_, errs) = assert_no_err(some_program_string); + assert_eq!(errs.len(), 1); + } + + #[test] + fn fn_decl_uom_ty() { + let some_program_string = r#"fn foo(x: number(mm)): number(_) { return 1 }"#; + let (_, errs) = assert_no_fatal(some_program_string); + assert_eq!(errs.len(), 2); + } + + #[test] + fn error_underscore() { + let (_, errs) = assert_no_fatal("_foo(_blah, _)"); + assert_eq!(errs.len(), 3, "found: {:#?}", errs); + } + + #[test] + fn error_type_ascription() { + let (_, errs) = assert_no_fatal("a + b: number"); + assert_eq!(errs.len(), 1, "found: {:#?}", errs); + } + + #[test] + fn zero_param_function() { + let code = r#" + fn firstPrimeNumber = () => { + return 2 + } + firstPrimeNumber() + "#; + let _ast = crate::parsing::top_level_parse(code).unwrap(); + } + + #[test] + fn array() { + let program = r#"[1, 2, 3]"#; + let module_id = ModuleId::default(); + let tokens = crate::parsing::token::lex(program, module_id).unwrap(); + let _arr = array_elem_by_elem(&mut tokens.as_slice()).unwrap(); + } + + #[test] + fn array_linesep_trailing_comma() { + let program = r#"[ + 1, + 2, + 3, + ]"#; + let module_id = ModuleId::default(); + let tokens = crate::parsing::token::lex(program, module_id).unwrap(); + let _arr = array_elem_by_elem(&mut tokens.as_slice()).unwrap(); + } + + #[allow(unused)] + #[test] + fn array_linesep_no_trailing_comma() { + let program = r#"[ + 1, + 2, + 3 + ]"#; + let module_id = ModuleId::default(); + let tokens = crate::parsing::token::lex(program, module_id).unwrap(); + let _arr = array_elem_by_elem(&mut tokens.as_slice()).unwrap(); + } + + #[test] + fn basic_if_else() { + let some_program_string = "if true { + 3 + } else { + 4 + }"; + let module_id = ModuleId::default(); + let tokens = crate::parsing::token::lex(some_program_string, module_id).unwrap(); + let _res = if_expr(&mut tokens.as_slice()).unwrap(); + } + + #[test] + fn basic_else_if() { + let some_program_string = "else if true { + 4 + }"; + let module_id = ModuleId::default(); + let tokens = crate::parsing::token::lex(some_program_string, module_id).unwrap(); + let _res = else_if(&mut tokens.as_slice()).unwrap(); + } + + #[test] + fn basic_if_else_if() { + let some_program_string = "if true { + 3 + } else if true { + 4 + } else { + 5 + }"; + let module_id = ModuleId::default(); + let tokens = crate::parsing::token::lex(some_program_string, module_id).unwrap(); + let _res = if_expr(&mut tokens.as_slice()).unwrap(); + } + + #[test] + fn test_keyword_ok_in_fn_args_return() { + let some_program_string = r#"fn thing(param) { + return true +} + +thing(false) +"#; + crate::parsing::top_level_parse(some_program_string).unwrap(); + } + + #[test] + fn test_error_define_function_as_var() { + for name in ["var", "let", "const"] { + let some_program_string = format!( + r#"{} thing = (param) => {{ + return true +}} + +thing(false) +"#, + name + ); + assert_err( + &some_program_string, + "Expected a `fn` variable kind, found: `const`", + [0, name.len()], + ); + } + } + + #[test] + fn test_error_define_var_as_function() { + // TODO: https://github.com/KittyCAD/modeling-app/issues/784 + // Improve this error message. + // It should say that the compiler is expecting a function expression on the RHS. + assert_err(r#"fn thing = "thing""#, "Unexpected token: \"thing\"", [11, 18]); + } + + #[test] + fn random_words_fail() { + let test_program = r#"part001 = startSketchOn('-XZ') + |> startProfileAt([8.53, 11.8], %) + asdasd asdasd + |> line([11.12, -14.82], %) + |> line([-13.27, -6.98], %) + |> line([-5.09, 12.33], %) + asdasd +"#; + let _ = crate::parsing::top_level_parse(test_program).unwrap_errs(); + } + + #[test] + fn test_member_expression_sketch() { + let some_program_string = r#"fn cube = (pos, scale) => { + sg = startSketchOn('XY') + |> startProfileAt(pos, %) + |> line([0, scale], %) + |> line([scale, 0], %) + |> line([0, -scale], %) + + return sg +} + +b1 = cube([0,0], 10) +b2 = cube([3,3], 4) + +pt1 = b1[0] +pt2 = b2[0] +"#; + crate::parsing::top_level_parse(some_program_string).unwrap(); + } + + #[test] + fn test_math_with_stdlib() { + let some_program_string = r#"d2r = pi() / 2 +let other_thing = 2 * cos(3)"#; + crate::parsing::top_level_parse(some_program_string).unwrap(); + } + + #[test] + fn test_negative_arguments() { + let some_program_string = r#"fn box = (p, h, l, w) => { + myBox = startSketchOn('XY') + |> startProfileAt(p, %) + |> line([0, l], %) + |> line([w, 0], %) + |> line([0, -l], %) + |> close(%) + |> extrude(h, %) + + return myBox +} +let myBox = box([0,0], -3, -16, -10) +"#; + crate::parsing::top_level_parse(some_program_string).unwrap(); + } + + #[test] + fn arg_labels() { + let input = r#"length: 3"#; + let module_id = ModuleId::default(); + let tokens = crate::parsing::token::lex(input, module_id).unwrap(); + super::labeled_arguments(&mut tokens.as_slice()).unwrap(); + } + + #[test] + fn kw_fn() { + for input in ["val = foo(x, y = z)", "val = foo(y = z)"] { + let module_id = ModuleId::default(); + let tokens = crate::parsing::token::lex(input, module_id).unwrap(); + super::program.parse(tokens.as_slice()).unwrap(); + } + } + + #[test] + fn test_parse_tag_named_std_lib() { + let some_program_string = r#"startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line([5, 5], %, $xLine) +"#; + assert_err( + some_program_string, + "Cannot assign a tag to a reserved keyword: xLine", + [76, 82], + ); + } + + #[test] + fn test_parse_empty_tag_brace() { + let some_program_string = r#"startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line(%, $) + "#; + assert_err(some_program_string, "Tag names must not be empty", [69, 70]); + } + #[test] + fn test_parse_empty_tag_whitespace() { + let some_program_string = r#"startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line(%, $ ,01) + "#; + assert_err(some_program_string, "Tag names must not be empty", [69, 70]); + } + + #[test] + fn test_parse_empty_tag_comma() { + let some_program_string = r#"startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line(%, $,) + "#; + assert_err(some_program_string, "Tag names must not be empty", [69, 70]); + } + #[test] + fn test_parse_tag_starting_with_digit() { + let some_program_string = r#" + startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line(%, $01)"#; + assert_err( + some_program_string, + "Tag names must not start with a number. Tag starts with `01`", + [74, 76], + ); + } + #[test] + fn test_parse_tag_including_digit() { + let some_program_string = r#" + startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line(%, $var01)"#; + assert_no_err(some_program_string); + } + #[test] + fn test_parse_tag_starting_with_bang() { + let some_program_string = r#"startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line(%, $!var,01) + "#; + assert_err(some_program_string, "Tag names must not start with a bang", [69, 70]); + } + #[test] + fn test_parse_tag_starting_with_dollar() { + let some_program_string = r#"startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line(%, $$,01) + "#; + assert_err(some_program_string, "Tag names must not start with a dollar", [69, 70]); + } + #[test] + fn test_parse_tag_starting_with_fn() { + let some_program_string = r#"startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line(%, $fn,01) + "#; + assert_err(some_program_string, "Tag names must not start with a keyword", [69, 71]); + } + #[test] + fn test_parse_tag_starting_with_a_comment() { + let some_program_string = r#"startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line(%, $// + ,01) + "#; + assert_err( + some_program_string, + "Tag names must not start with a lineComment", + [69, 71], + ); + } + + #[test] + fn test_parse_tag_starting_with_reserved_type() { + let some_program_string = r#" + startSketchOn('XY') + |> line(%, $sketch) + "#; + assert_err( + some_program_string, + "Cannot assign a tag to a reserved keyword: sketch", + [41, 47], + ); + } + #[test] + fn test_parse_tag_with_reserved_in_middle_works() { + let some_program_string = r#" + startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line([5, 5], %, $sketching) + "#; + assert_no_err(some_program_string); + } + + #[test] + fn warn_object_expr() { + let some_program_string = "{ foo: bar }"; + let (_, errs) = assert_no_err(some_program_string); + assert_eq!(errs.len(), 1); + assert_eq!(errs[0].apply_suggestion(some_program_string).unwrap(), "{ foo = bar }") + } + + #[test] + fn warn_fn_int() { + let some_program_string = r#"int(1.0) +int(42.3)"#; + let (_, errs) = assert_no_err(some_program_string); + assert_eq!(errs.len(), 2); + let replaced = errs[1].apply_suggestion(some_program_string).unwrap(); + let replaced = errs[0].apply_suggestion(&replaced).unwrap(); + assert_eq!(replaced, "1.0\nround(42.3)"); + } + + #[test] + fn warn_fn_decl() { + let some_program_string = r#"fn foo = () => { + return 0 +}"#; + let (_, errs) = assert_no_err(some_program_string); + assert_eq!(errs.len(), 2); + let replaced = errs[0].apply_suggestion(some_program_string).unwrap(); + let replaced = errs[1].apply_suggestion(&replaced).unwrap(); + // Note the whitespace here is bad, but we're just testing the suggestion spans really. In + // real life we might reformat after applying suggestions. + assert_eq!( + replaced, + r#"fn foo () { + return 0 +}"# + ); + } + + #[test] + fn warn_const() { + let some_program_string = r#"const foo = 0 +let bar = 1 +var baz = 2 +"#; + let (_, errs) = assert_no_err(some_program_string); + assert_eq!(errs.len(), 3); + let replaced = errs[2].apply_suggestion(some_program_string).unwrap(); + let replaced = errs[1].apply_suggestion(&replaced).unwrap(); + let replaced = errs[0].apply_suggestion(&replaced).unwrap(); + assert_eq!( + replaced, + r#" foo = 0 + bar = 1 + baz = 2 +"# + ); + } + + #[test] + fn test_unary_not_on_keyword_bool() { + let some_program_string = r#"!true"#; + let module_id = ModuleId::default(); + let tokens = crate::parsing::token::lex(some_program_string, module_id).unwrap(); // Updated import path + let actual = match unary_expression.parse(tokens.as_slice()) { + // Use tokens.as_slice() for parsing + Ok(x) => x, + Err(e) => panic!("{e:?}"), + }; + assert_eq!(actual.operator, UnaryOperator::Not); + crate::parsing::top_level_parse(some_program_string).unwrap(); // Updated import path + } +} + +#[cfg(test)] +mod snapshot_math_tests { + use super::*; + + // This macro generates a test function with the given function name. + // The macro takes a KCL program, ensures it tokenizes and parses, then compares + // its parsed AST to a snapshot (kept in this repo in a file under snapshots/ dir) + macro_rules! snapshot_test { + ($func_name:ident, $test_kcl_program:expr) => { + #[test] + fn $func_name() { + let module_id = crate::ModuleId::default(); + let tokens = crate::parsing::token::lex($test_kcl_program, module_id).unwrap(); + ParseContext::init(); + + let actual = match binary_expression.parse(tokens.as_slice()) { + Ok(x) => x, + Err(_e) => panic!("could not parse test"), + }; + insta::assert_json_snapshot!(actual); + let _ = ParseContext::take(); + } + }; + } + + snapshot_test!(a, "1 + 2"); + snapshot_test!(b, "1+2"); + snapshot_test!(c, "1 -2"); + snapshot_test!(d, "1 + 2 * 3"); + snapshot_test!(e, "1 * ( 2 + 3 )"); + snapshot_test!(f, "1 * ( 2 + 3 ) / 4"); + snapshot_test!(g, "1 + ( 2 + 3 ) / 4"); + snapshot_test!(h, "1 * (( 2 + 3 ) / 4 + 5 )"); + snapshot_test!(i, "1 * ((( 2 + 3 )))"); + snapshot_test!(j, "distance * p * FOS * 6 / (sigmaAllow * width)"); + snapshot_test!(k, "2 + (((3)))"); +} + +#[cfg(test)] +mod snapshot_tests { + use super::*; + + // This macro generates a test function with the given function name. + // The macro takes a KCL program, ensures it tokenizes and parses, then compares + // its parsed AST to a snapshot (kept in this repo in a file under snapshots/ dir) + macro_rules! snapshot_test { + ($func_name:ident, $test_kcl_program:expr) => { + #[test] + fn $func_name() { + let module_id = crate::ModuleId::default(); + let tokens = crate::parsing::token::lex($test_kcl_program, module_id).unwrap(); + print_tokens(tokens.as_slice()); + ParseContext::init(); + let actual = match program.parse(tokens.as_slice()) { + Ok(x) => x, + Err(e) => panic!("could not parse test: {e:?}"), + }; + let mut settings = insta::Settings::clone_current(); + settings.set_sort_maps(true); + settings.bind(|| { + insta::assert_json_snapshot!(actual); + }); + let _ = ParseContext::take(); + } + }; + } + + snapshot_test!( + a, + r#"boxSketch = startSketchAt([0, 0]) + |> line([0, 10], %) + |> tangentialArc([-5, 5], %) + |> line([5, -15], %) + |> extrude(10, %) +"# + ); + snapshot_test!(b, "myVar = min(5 , -legLen(5, 4))"); // Space before comma + + snapshot_test!(c, "myVar = min(-legLen(5, 4), 5)"); + snapshot_test!(d, "myVar = 5 + 6 |> myFunc(45, %)"); + snapshot_test!(e, "let x = 1 * (3 - 4)"); + snapshot_test!(f, r#"x = 1 // this is an inline comment"#); + snapshot_test!( + g, + r#"fn x = () => { + return sg + return sg + }"# + ); + snapshot_test!(d2, r#"x = -leg2 + thickness"#); + snapshot_test!( + h, + r#"obj = { a: 1, b: 2 } + height = 1 - obj.a"# + ); + snapshot_test!( + i, + r#"obj = { a: 1, b: 2 } + height = 1 - obj["a"]"# + ); + snapshot_test!( + j, + r#"obj = { a: 1, b: 2 } + height = obj["a"] - 1"# + ); + snapshot_test!( + k, + r#"obj = { a: 1, b: 2 } + height = [1 - obj["a"], 0]"# + ); + snapshot_test!( + l, + r#"obj = { a: 1, b: 2 } + height = [obj["a"] - 1, 0]"# + ); + snapshot_test!( + m, + r#"obj = { a: 1, b: 2 } + height = [obj["a"] -1, 0]"# + ); + snapshot_test!(n, "height = 1 - obj.a"); + snapshot_test!(o, "six = 1 + 2 + 3"); + snapshot_test!(p, "five = 3 * 1 + 2"); + snapshot_test!(q, r#"height = [ obj["a"], 0 ]"#); + snapshot_test!( + r, + r#"obj = { a: 1, b: 2 } + height = obj["a"]"# + ); + snapshot_test!(s, r#"prop = yo["one"][two]"#); + snapshot_test!(t, r#"pt1 = b1[x]"#); + snapshot_test!(u, "prop = yo.one.two.three.four"); + snapshot_test!(v, r#"pt1 = b1[0]"#); + snapshot_test!(w, r#"pt1 = b1['zero']"#); + snapshot_test!(x, r#"pt1 = b1.zero"#); + snapshot_test!(y, "sg = startSketchAt(pos)"); + snapshot_test!(z, "sg = startSketchAt(pos) |> line([0, -scale], %)"); + snapshot_test!(aa, r#"sg = -scale"#); + snapshot_test!(ab, "lineTo({ to: [0, -1] })"); + snapshot_test!(ac, "myArray = [0..10]"); + snapshot_test!( + ad, + r#" + fn firstPrimeNumber = () => { + return 2 + } + firstPrimeNumber()"# + ); + snapshot_test!( + ae, + r#"fn thing = (param) => { + return true + } + thing(false)"# + ); + snapshot_test!( + af, + r#"mySketch = startSketchAt([0,0]) + |> lineTo([0, 1], %, $myPath) + |> lineTo([1, 1], %) + |> lineTo([1, 0], %, $rightPath) + |> close(%)"# + ); + snapshot_test!(ag, "mySketch = startSketchAt([0,0]) |> lineTo([1, 1], %) |> close(%)"); + snapshot_test!(ah, "myBox = startSketchAt(p)"); + snapshot_test!(ai, r#"myBox = f(1) |> g(2, %)"#); + snapshot_test!(aj, r#"myBox = startSketchAt(p) |> line([0, l], %)"#); + snapshot_test!(ak, "lineTo({ to: [0, 1] })"); + snapshot_test!(al, "lineTo({ to: [0, 1], from: [3, 3] })"); + snapshot_test!(am, "lineTo({to:[0, 1]})"); + snapshot_test!(an, "lineTo({ to: [0, 1], from: [3, 3]})"); + snapshot_test!(ao, "lineTo({ to: [0, 1],from: [3, 3] })"); + snapshot_test!(ap, "mySketch = startSketchAt([0,0])"); + snapshot_test!(aq, "log(5, \"hello\", aIdentifier)"); + snapshot_test!(ar, r#"5 + "a""#); + snapshot_test!(at, "line([0, l], %)"); + snapshot_test!(au, include_str!("../../../tests/executor/inputs/cylinder.kcl")); + snapshot_test!(av, "fn f = (angle?) => { return default(angle, 360) }"); + snapshot_test!( + aw, + "let numbers = [ + 1, + // A, + // B, + 3, + ]" + ); + snapshot_test!( + ax, + "let numbers = [ + 1, + 2, + // A, + // B, + ]" + ); + snapshot_test!( + ay, + "let props = { + a: 1, + // b: 2, + c: 3, + }" + ); + snapshot_test!( + az, + "let props = { + a: 1, + // b: 2, + c: 3 + }" + ); + snapshot_test!( + ba, + r#" +sketch001 = startSketchOn('XY') + // |> arc({ + // angleEnd: 270, + // angleStart: 450, + // }, %) + |> startProfileAt(%) +"# + ); + snapshot_test!( + bb, + r#" +my14 = 4 ^ 2 - 3 ^ 2 * 2 +"# + ); + snapshot_test!( + bc, + r#"x = if true { + 3 + } else { + 4 + }"# + ); + snapshot_test!( + bd, + r#"x = if true { + 3 + } else if func(radius) { + 4 + } else { + 5 + }"# + ); + snapshot_test!(be, "let x = 3 == 3"); + snapshot_test!(bf, "let x = 3 != 3"); + snapshot_test!(bg, r#"x = 4"#); + snapshot_test!(bh, "obj = {center : [10, 10], radius: 5}"); + snapshot_test!( + bi, + r#"x = 3 + obj = { x, y: 4}"# + ); + snapshot_test!(bj, "true"); + snapshot_test!(bk, "truee"); + snapshot_test!(bl, "x = !true"); + snapshot_test!(bm, "x = true & false"); + snapshot_test!(bn, "x = true | false"); + snapshot_test!(kw_function_unnamed_first, r#"val = foo(x, y = z)"#); + snapshot_test!(kw_function_all_named, r#"val = foo(x = a, y = b)"#); + snapshot_test!(kw_function_decl_all_labeled, r#"fn foo(x, y) { return 1 }"#); + snapshot_test!(kw_function_decl_first_unlabeled, r#"fn foo(@x, y) { return 1 }"#); + snapshot_test!(kw_function_decl_with_default_no_type, r#"fn foo(x? = 2) { return 1 }"#); + snapshot_test!( + kw_function_decl_with_default_and_type, + r#"fn foo(x?: number = 2) { return 1 }"# + ); + snapshot_test!(kw_function_call_in_pipe, r#"val = 1 |> f(arg = x)"#); +} + +#[allow(unused)] +#[cfg(test)] +pub(crate) fn print_tokens(tokens: TokenSlice) { + for (i, tok) in tokens.iter().enumerate() { + println!("{i:.2}: ({:?}):) '{}'", tok.token_type, tok.value.replace("\n", "\\n")); + } +} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__a.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__a.snap similarity index 57% rename from src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__a.snap rename to src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__a.snap index f4d3f410b..fcefa57e6 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__a.snap +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__a.snap @@ -1,26 +1,28 @@ --- -source: kcl/src/parser/parser_impl.rs +source: kcl/src/parsing/parser.rs +assertion_line: 3851 expression: actual +snapshot_kind: text --- { "type": "BinaryExpression", - "start": 0, - "end": 5, "operator": "+", "left": { "type": "Literal", "type": "Literal", + "value": 1.0, + "raw": "1", "start": 0, - "end": 1, - "value": 1, - "raw": "1" + "end": 1 }, "right": { "type": "Literal", "type": "Literal", + "value": 2.0, + "raw": "2", "start": 4, - "end": 5, - "value": 2, - "raw": "2" - } + "end": 5 + }, + "start": 0, + "end": 5 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__b.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__b.snap similarity index 57% rename from src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__b.snap rename to src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__b.snap index d76a13faa..637b00246 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__b.snap +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__b.snap @@ -1,26 +1,28 @@ --- -source: kcl/src/parser/parser_impl.rs +source: kcl/src/parsing/parser.rs +assertion_line: 3852 expression: actual +snapshot_kind: text --- { "type": "BinaryExpression", - "start": 0, - "end": 3, "operator": "+", "left": { "type": "Literal", "type": "Literal", + "value": 1.0, + "raw": "1", "start": 0, - "end": 1, - "value": 1, - "raw": "1" + "end": 1 }, "right": { "type": "Literal", "type": "Literal", + "value": 2.0, + "raw": "2", "start": 2, - "end": 3, - "value": 2, - "raw": "2" - } + "end": 3 + }, + "start": 0, + "end": 3 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__c.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__c.snap similarity index 57% rename from src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__c.snap rename to src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__c.snap index 53ae57d2d..b12df680f 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__c.snap +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__c.snap @@ -1,26 +1,28 @@ --- -source: kcl/src/parser/parser_impl.rs +source: kcl/src/parsing/parser.rs +assertion_line: 3853 expression: actual +snapshot_kind: text --- { "type": "BinaryExpression", - "start": 0, - "end": 4, "operator": "-", "left": { "type": "Literal", "type": "Literal", + "value": 1.0, + "raw": "1", "start": 0, - "end": 1, - "value": 1, - "raw": "1" + "end": 1 }, "right": { "type": "Literal", "type": "Literal", + "value": 2.0, + "raw": "2", "start": 3, - "end": 4, - "value": 2, - "raw": "2" - } + "end": 4 + }, + "start": 0, + "end": 4 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__d.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__d.snap similarity index 63% rename from src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__d.snap rename to src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__d.snap index 3421b79f1..ba6a1dc99 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__d.snap +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__d.snap @@ -1,41 +1,43 @@ --- -source: kcl/src/parser/parser_impl.rs +source: kcl/src/parsing/parser.rs +assertion_line: 3854 expression: actual +snapshot_kind: text --- { "type": "BinaryExpression", - "start": 0, - "end": 9, "operator": "+", "left": { "type": "Literal", "type": "Literal", + "value": 1.0, + "raw": "1", "start": 0, - "end": 1, - "value": 1, - "raw": "1" + "end": 1 }, "right": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 4, - "end": 9, "operator": "*", "left": { "type": "Literal", "type": "Literal", + "value": 2.0, + "raw": "2", "start": 4, - "end": 5, - "value": 2, - "raw": "2" + "end": 5 }, "right": { "type": "Literal", "type": "Literal", + "value": 3.0, + "raw": "3", "start": 8, - "end": 9, - "value": 3, - "raw": "3" - } - } + "end": 9 + }, + "start": 4, + "end": 9 + }, + "start": 0, + "end": 9 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__e.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__e.snap similarity index 63% rename from src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__e.snap rename to src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__e.snap index 52118eaba..bf684fde0 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__e.snap +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__e.snap @@ -1,41 +1,43 @@ --- -source: kcl/src/parser/parser_impl.rs +source: kcl/src/parsing/parser.rs +assertion_line: 3855 expression: actual +snapshot_kind: text --- { "type": "BinaryExpression", - "start": 0, - "end": 11, "operator": "*", "left": { "type": "Literal", "type": "Literal", + "value": 1.0, + "raw": "1", "start": 0, - "end": 1, - "value": 1, - "raw": "1" + "end": 1 }, "right": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 6, - "end": 11, "operator": "+", "left": { "type": "Literal", "type": "Literal", + "value": 2.0, + "raw": "2", "start": 6, - "end": 7, - "value": 2, - "raw": "2" + "end": 7 }, "right": { "type": "Literal", "type": "Literal", + "value": 3.0, + "raw": "3", "start": 10, - "end": 11, - "value": 3, - "raw": "3" - } - } + "end": 11 + }, + "start": 6, + "end": 11 + }, + "start": 0, + "end": 11 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__f.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__f.snap similarity index 65% rename from src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__f.snap rename to src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__f.snap index 1cc881d04..2859e0587 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__f.snap +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__f.snap @@ -1,56 +1,58 @@ --- -source: kcl/src/parser/parser_impl.rs +source: kcl/src/parsing/parser.rs +assertion_line: 3856 expression: actual +snapshot_kind: text --- { "type": "BinaryExpression", - "start": 0, - "end": 17, "operator": "/", "left": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 0, - "end": 11, "operator": "*", "left": { "type": "Literal", "type": "Literal", + "value": 1.0, + "raw": "1", "start": 0, - "end": 1, - "value": 1, - "raw": "1" + "end": 1 }, "right": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 6, - "end": 11, "operator": "+", "left": { "type": "Literal", "type": "Literal", + "value": 2.0, + "raw": "2", "start": 6, - "end": 7, - "value": 2, - "raw": "2" + "end": 7 }, "right": { "type": "Literal", "type": "Literal", + "value": 3.0, + "raw": "3", "start": 10, - "end": 11, - "value": 3, - "raw": "3" - } - } + "end": 11 + }, + "start": 6, + "end": 11 + }, + "start": 0, + "end": 11 }, "right": { "type": "Literal", "type": "Literal", + "value": 4.0, + "raw": "4", "start": 16, - "end": 17, - "value": 4, - "raw": "4" - } + "end": 17 + }, + "start": 0, + "end": 17 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__g.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__g.snap similarity index 65% rename from src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__g.snap rename to src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__g.snap index 1d6cd97be..1c5307df0 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__g.snap +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__g.snap @@ -1,56 +1,58 @@ --- -source: kcl/src/parser/parser_impl.rs +source: kcl/src/parsing/parser.rs +assertion_line: 3857 expression: actual +snapshot_kind: text --- { "type": "BinaryExpression", - "start": 0, - "end": 17, "operator": "+", "left": { "type": "Literal", "type": "Literal", + "value": 1.0, + "raw": "1", "start": 0, - "end": 1, - "value": 1, - "raw": "1" + "end": 1 }, "right": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 6, - "end": 17, "operator": "/", "left": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 6, - "end": 11, "operator": "+", "left": { "type": "Literal", "type": "Literal", + "value": 2.0, + "raw": "2", "start": 6, - "end": 7, - "value": 2, - "raw": "2" + "end": 7 }, "right": { "type": "Literal", "type": "Literal", + "value": 3.0, + "raw": "3", "start": 10, - "end": 11, - "value": 3, - "raw": "3" - } + "end": 11 + }, + "start": 6, + "end": 11 }, "right": { "type": "Literal", "type": "Literal", + "value": 4.0, + "raw": "4", "start": 16, - "end": 17, - "value": 4, - "raw": "4" - } - } + "end": 17 + }, + "start": 6, + "end": 17 + }, + "start": 0, + "end": 17 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__h.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__h.snap similarity index 67% rename from src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__h.snap rename to src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__h.snap index 055108a9b..f106b5f18 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__h.snap +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__h.snap @@ -1,71 +1,73 @@ --- -source: kcl/src/parser/parser_impl.rs +source: kcl/src/parsing/parser.rs +assertion_line: 3858 expression: actual +snapshot_kind: text --- { "type": "BinaryExpression", - "start": 0, - "end": 22, "operator": "*", "left": { "type": "Literal", "type": "Literal", + "value": 1.0, + "raw": "1", "start": 0, - "end": 1, - "value": 1, - "raw": "1" + "end": 1 }, "right": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 7, - "end": 22, "operator": "+", "left": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 7, - "end": 18, "operator": "/", "left": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 7, - "end": 12, "operator": "+", "left": { "type": "Literal", "type": "Literal", + "value": 2.0, + "raw": "2", "start": 7, - "end": 8, - "value": 2, - "raw": "2" + "end": 8 }, "right": { "type": "Literal", "type": "Literal", + "value": 3.0, + "raw": "3", "start": 11, - "end": 12, - "value": 3, - "raw": "3" - } + "end": 12 + }, + "start": 7, + "end": 12 }, "right": { "type": "Literal", "type": "Literal", + "value": 4.0, + "raw": "4", "start": 17, - "end": 18, - "value": 4, - "raw": "4" - } + "end": 18 + }, + "start": 7, + "end": 18 }, "right": { "type": "Literal", "type": "Literal", + "value": 5.0, + "raw": "5", "start": 21, - "end": 22, - "value": 5, - "raw": "5" - } - } + "end": 22 + }, + "start": 7, + "end": 22 + }, + "start": 0, + "end": 22 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__i.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__i.snap similarity index 63% rename from src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__i.snap rename to src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__i.snap index 0027ba4fd..456ed5c8c 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__i.snap +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__i.snap @@ -1,41 +1,43 @@ --- -source: kcl/src/parser/parser_impl.rs +source: kcl/src/parsing/parser.rs +assertion_line: 3859 expression: actual +snapshot_kind: text --- { "type": "BinaryExpression", - "start": 0, - "end": 13, "operator": "*", "left": { "type": "Literal", "type": "Literal", + "value": 1.0, + "raw": "1", "start": 0, - "end": 1, - "value": 1, - "raw": "1" + "end": 1 }, "right": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 8, - "end": 13, "operator": "+", "left": { "type": "Literal", "type": "Literal", + "value": 2.0, + "raw": "2", "start": 8, - "end": 9, - "value": 2, - "raw": "2" + "end": 9 }, "right": { "type": "Literal", "type": "Literal", + "value": 3.0, + "raw": "3", "start": 12, - "end": 13, - "value": 3, - "raw": "3" - } - } + "end": 13 + }, + "start": 8, + "end": 13 + }, + "start": 0, + "end": 13 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__j.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__j.snap similarity index 72% rename from src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__j.snap rename to src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__j.snap index a3cbd38bf..db5460978 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__j.snap +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__j.snap @@ -1,81 +1,83 @@ --- -source: kcl/src/parser/parser_impl.rs +source: kcl/src/parsing/parser.rs +assertion_line: 3860 expression: actual +snapshot_kind: text --- { "type": "BinaryExpression", - "start": 0, - "end": 44, "operator": "/", "left": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 0, - "end": 22, "operator": "*", "left": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 0, - "end": 18, "operator": "*", "left": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 0, - "end": 12, "operator": "*", "left": { "type": "Identifier", "type": "Identifier", + "name": "distance", "start": 0, - "end": 8, - "name": "distance" + "end": 8 }, "right": { "type": "Identifier", "type": "Identifier", + "name": "p", "start": 11, - "end": 12, - "name": "p" - } + "end": 12 + }, + "start": 0, + "end": 12 }, "right": { "type": "Identifier", "type": "Identifier", + "name": "FOS", "start": 15, - "end": 18, - "name": "FOS" - } + "end": 18 + }, + "start": 0, + "end": 18 }, "right": { "type": "Literal", "type": "Literal", + "value": 6.0, + "raw": "6", "start": 21, - "end": 22, - "value": 6, - "raw": "6" - } + "end": 22 + }, + "start": 0, + "end": 22 }, "right": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 26, - "end": 44, "operator": "*", "left": { "type": "Identifier", "type": "Identifier", + "name": "sigmaAllow", "start": 26, - "end": 36, - "name": "sigmaAllow" + "end": 36 }, "right": { "type": "Identifier", "type": "Identifier", + "name": "width", "start": 39, - "end": 44, - "name": "width" - } - } + "end": 44 + }, + "start": 26, + "end": 44 + }, + "start": 0, + "end": 44 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__k.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__k.snap similarity index 57% rename from src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__k.snap rename to src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__k.snap index a9bfe4c77..06909d27e 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__k.snap +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_math_tests__k.snap @@ -1,26 +1,28 @@ --- -source: kcl/src/parser/parser_impl.rs +source: kcl/src/parsing/parser.rs +assertion_line: 3861 expression: actual +snapshot_kind: text --- { "type": "BinaryExpression", - "start": 0, - "end": 8, "operator": "+", "left": { "type": "Literal", "type": "Literal", + "value": 2.0, + "raw": "2", "start": 0, - "end": 1, - "value": 2, - "raw": "2" + "end": 1 }, "right": { "type": "Literal", "type": "Literal", + "value": 3.0, + "raw": "3", "start": 7, - "end": 8, - "value": 3, - "raw": "3" - } + "end": 8 + }, + "start": 0, + "end": 8 } diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__a.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__a.snap new file mode 100644 index 000000000..2578b7b6e --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__a.snap @@ -0,0 +1,248 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 137, + "id": { + "end": 9, + "name": "boxSketch", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "elements": [ + { + "end": 28, + "raw": "0", + "start": 27, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 31, + "raw": "0", + "start": 30, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 32, + "start": 26, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + ], + "callee": { + "end": 25, + "name": "startSketchAt", + "start": 12, + "type": "Identifier" + }, + "end": 33, + "start": 12, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 48, + "raw": "0", + "start": 47, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 52, + "raw": "10", + "start": 50, + "type": "Literal", + "type": "Literal", + "value": 10.0 + } + ], + "end": 53, + "start": 46, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 56, + "start": 55, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 45, + "name": "line", + "start": 41, + "type": "Identifier" + }, + "end": 57, + "start": 41, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 82, + "raw": "5", + "start": 81, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + "end": 82, + "operator": "-", + "start": 80, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 85, + "raw": "5", + "start": 84, + "type": "Literal", + "type": "Literal", + "value": 5.0 + } + ], + "end": 86, + "start": 79, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 89, + "start": 88, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 78, + "name": "tangentialArc", + "start": 65, + "type": "Identifier" + }, + "end": 90, + "start": 65, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 105, + "raw": "5", + "start": 104, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + { + "argument": { + "end": 110, + "raw": "15", + "start": 108, + "type": "Literal", + "type": "Literal", + "value": 15.0 + }, + "end": 110, + "operator": "-", + "start": 107, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 111, + "start": 103, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 114, + "start": 113, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 102, + "name": "line", + "start": 98, + "type": "Identifier" + }, + "end": 115, + "start": 98, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 133, + "raw": "10", + "start": 131, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + { + "end": 136, + "start": 135, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 130, + "name": "extrude", + "start": 123, + "type": "Identifier" + }, + "end": 137, + "start": 123, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 137, + "start": 12, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 137, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 138, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__aa.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__aa.snap new file mode 100644 index 000000000..f9d8ee878 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__aa.snap @@ -0,0 +1,42 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 11, + "id": { + "end": 2, + "name": "sg", + "start": 0, + "type": "Identifier" + }, + "init": { + "argument": { + "end": 11, + "name": "scale", + "start": 6, + "type": "Identifier", + "type": "Identifier" + }, + "end": 11, + "operator": "-", + "start": 5, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 11, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 11, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ab.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ab.snap similarity index 70% rename from src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ab.snap rename to src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ab.snap index 545ee7aa6..064dbf918 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ab.snap +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ab.snap @@ -1,81 +1,82 @@ --- -source: kcl/src/parser/parser_impl.rs +source: kcl/src/parsing/parser.rs +assertion_line: 3964 expression: actual +snapshot_kind: text --- { - "start": 0, - "end": 23, "body": [ { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 0, "end": 23, "expression": { - "type": "CallExpression", - "type": "CallExpression", - "start": 0, - "end": 23, - "callee": { - "type": "Identifier", - "start": 0, - "end": 6, - "name": "lineTo" - }, "arguments": [ { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 7, "end": 22, "properties": [ { - "type": "ObjectProperty", - "start": 9, "end": 20, "key": { - "type": "Identifier", - "start": 9, "end": 11, - "name": "to" + "name": "to", + "start": 9, + "type": "Identifier" }, + "start": 9, + "type": "ObjectProperty", "value": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 13, - "end": 20, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 14, "end": 15, - "value": 0, - "raw": "0" + "raw": "0", + "start": 14, + "type": "Literal", + "type": "Literal", + "value": 0.0 }, { - "type": "UnaryExpression", - "type": "UnaryExpression", - "start": 17, + "argument": { + "end": 19, + "raw": "1", + "start": 18, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, "end": 19, "operator": "-", - "argument": { - "type": "Literal", - "type": "Literal", - "start": 18, - "end": 19, - "value": 1, - "raw": "1" - } + "start": 17, + "type": "UnaryExpression", + "type": "UnaryExpression" } - ] + ], + "end": 20, + "start": 13, + "type": "ArrayExpression", + "type": "ArrayExpression" } } - ] + ], + "start": 7, + "type": "ObjectExpression", + "type": "ObjectExpression" } ], - "optional": false - } + "callee": { + "end": 6, + "name": "lineTo", + "start": 0, + "type": "Identifier" + }, + "end": 23, + "start": 0, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" } - ] + ], + "end": 23, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ac.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ac.snap new file mode 100644 index 000000000..463ab7e9f --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ac.snap @@ -0,0 +1,51 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 17, + "id": { + "end": 7, + "name": "myArray", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 17, + "endElement": { + "end": 16, + "raw": "10", + "start": 14, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + "endInclusive": true, + "start": 10, + "startElement": { + "end": 12, + "raw": "0", + "start": 11, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "type": "ArrayRangeExpression", + "type": "ArrayRangeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 17, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 17, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ad.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ad.snap new file mode 100644 index 000000000..06d828140 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ad.snap @@ -0,0 +1,74 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 57, + "id": { + "end": 24, + "name": "firstPrimeNumber", + "start": 8, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "end": 51, + "raw": "2", + "start": 50, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "end": 51, + "start": 43, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 57, + "start": 33 + }, + "end": 57, + "params": [], + "start": 27, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 8, + "type": "VariableDeclarator" + }, + "end": 57, + "kind": "fn", + "start": 5, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 80, + "expression": { + "arguments": [], + "callee": { + "end": 78, + "name": "firstPrimeNumber", + "start": 62, + "type": "Identifier" + }, + "end": 80, + "start": 62, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 62, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 80, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ae.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ae.snap new file mode 100644 index 000000000..a43480d9f --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ae.snap @@ -0,0 +1,93 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 49, + "id": { + "end": 8, + "name": "thing", + "start": 3, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "end": 43, + "raw": "true", + "start": 39, + "type": "Literal", + "type": "Literal", + "value": true + }, + "end": 43, + "start": 32, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 49, + "start": 22 + }, + "end": 49, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 17, + "name": "param", + "start": 12, + "type": "Identifier" + } + } + ], + "start": 11, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" + }, + "end": 49, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 66, + "expression": { + "arguments": [ + { + "end": 65, + "raw": "false", + "start": 60, + "type": "Literal", + "type": "Literal", + "value": false + } + ], + "callee": { + "end": 59, + "name": "thing", + "start": 54, + "type": "Identifier" + }, + "end": 66, + "start": 54, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 54, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 66, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__af.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__af.snap new file mode 100644 index 000000000..07cab74d0 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__af.snap @@ -0,0 +1,240 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 159, + "id": { + "end": 8, + "name": "mySketch", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "elements": [ + { + "end": 27, + "raw": "0", + "start": 26, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 29, + "raw": "0", + "start": 28, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 30, + "start": 25, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + ], + "callee": { + "end": 24, + "name": "startSketchAt", + "start": 11, + "type": "Identifier" + }, + "end": 31, + "start": 11, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 52, + "raw": "0", + "start": 51, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 55, + "raw": "1", + "start": 54, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + ], + "end": 56, + "start": 50, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 59, + "start": 58, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 68, + "start": 61, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "myPath" + } + ], + "callee": { + "end": 49, + "name": "lineTo", + "start": 43, + "type": "Identifier" + }, + "end": 69, + "start": 43, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 90, + "raw": "1", + "start": 89, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 93, + "raw": "1", + "start": 92, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + ], + "end": 94, + "start": 88, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 97, + "start": 96, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 87, + "name": "lineTo", + "start": 81, + "type": "Identifier" + }, + "end": 98, + "start": 81, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 119, + "raw": "1", + "start": 118, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 122, + "raw": "0", + "start": 121, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 123, + "start": 117, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 126, + "start": 125, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 138, + "start": 128, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "rightPath" + } + ], + "callee": { + "end": 116, + "name": "lineTo", + "start": 110, + "type": "Identifier" + }, + "end": 139, + "start": 110, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 158, + "start": 157, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 156, + "name": "close", + "start": 151, + "type": "Identifier" + }, + "end": 159, + "start": 151, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 159, + "start": 11, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 159, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 159, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ag.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ag.snap new file mode 100644 index 000000000..9e709d96f --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ag.snap @@ -0,0 +1,138 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 64, + "id": { + "end": 8, + "name": "mySketch", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "elements": [ + { + "end": 27, + "raw": "0", + "start": 26, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 29, + "raw": "0", + "start": 28, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 30, + "start": 25, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + ], + "callee": { + "end": 24, + "name": "startSketchAt", + "start": 11, + "type": "Identifier" + }, + "end": 31, + "start": 11, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 44, + "raw": "1", + "start": 43, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 47, + "raw": "1", + "start": 46, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + ], + "end": 48, + "start": 42, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 51, + "start": 50, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 41, + "name": "lineTo", + "start": 35, + "type": "Identifier" + }, + "end": 52, + "start": 35, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 63, + "start": 62, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 61, + "name": "close", + "start": 56, + "type": "Identifier" + }, + "end": 64, + "start": 56, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 64, + "start": 11, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 64, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 64, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ah.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ah.snap new file mode 100644 index 000000000..1155f1bfd --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ah.snap @@ -0,0 +1,49 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 24, + "id": { + "end": 5, + "name": "myBox", + "start": 0, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 23, + "name": "p", + "start": 22, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 21, + "name": "startSketchAt", + "start": 8, + "type": "Identifier" + }, + "end": 24, + "start": 8, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 24, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 24, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ai.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ai.snap new file mode 100644 index 000000000..9e358d5e7 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ai.snap @@ -0,0 +1,86 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 23, + "id": { + "end": 5, + "name": "myBox", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 11, + "raw": "1", + "start": 10, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + ], + "callee": { + "end": 9, + "name": "f", + "start": 8, + "type": "Identifier" + }, + "end": 12, + "start": 8, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 19, + "raw": "2", + "start": 18, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + { + "end": 22, + "start": 21, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 17, + "name": "g", + "start": 16, + "type": "Identifier" + }, + "end": 23, + "start": 16, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 23, + "start": 8, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 23, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 23, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__aj.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__aj.snap new file mode 100644 index 000000000..3c05b8c61 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__aj.snap @@ -0,0 +1,100 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 43, + "id": { + "end": 5, + "name": "myBox", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 23, + "name": "p", + "start": 22, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 21, + "name": "startSketchAt", + "start": 8, + "type": "Identifier" + }, + "end": 24, + "start": 8, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 35, + "raw": "0", + "start": 34, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 38, + "name": "l", + "start": 37, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 39, + "start": 33, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 42, + "start": 41, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 32, + "name": "line", + "start": 28, + "type": "Identifier" + }, + "end": 43, + "start": 28, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 43, + "start": 8, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 43, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 43, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ak.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ak.snap similarity index 69% rename from src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ak.snap rename to src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ak.snap index c5137bb08..7c3301bd5 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ak.snap +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ak.snap @@ -1,74 +1,75 @@ --- -source: kcl/src/parser/parser_impl.rs +source: kcl/src/parsing/parser.rs +assertion_line: 3996 expression: actual +snapshot_kind: text --- { - "start": 0, - "end": 22, "body": [ { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 0, "end": 22, "expression": { - "type": "CallExpression", - "type": "CallExpression", - "start": 0, - "end": 22, - "callee": { - "type": "Identifier", - "start": 0, - "end": 6, - "name": "lineTo" - }, "arguments": [ { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 7, "end": 21, "properties": [ { - "type": "ObjectProperty", - "start": 9, "end": 19, "key": { - "type": "Identifier", - "start": 9, "end": 11, - "name": "to" + "name": "to", + "start": 9, + "type": "Identifier" }, + "start": 9, + "type": "ObjectProperty", "value": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 13, - "end": 19, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 14, "end": 15, - "value": 0, - "raw": "0" + "raw": "0", + "start": 14, + "type": "Literal", + "type": "Literal", + "value": 0.0 }, { - "type": "Literal", - "type": "Literal", - "start": 17, "end": 18, - "value": 1, - "raw": "1" + "raw": "1", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 1.0 } - ] + ], + "end": 19, + "start": 13, + "type": "ArrayExpression", + "type": "ArrayExpression" } } - ] + ], + "start": 7, + "type": "ObjectExpression", + "type": "ObjectExpression" } ], - "optional": false - } + "callee": { + "end": 6, + "name": "lineTo", + "start": 0, + "type": "Identifier" + }, + "end": 22, + "start": 0, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" } - ] + ], + "end": 22, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__al.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__al.snap similarity index 71% rename from src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__al.snap rename to src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__al.snap index 99870608c..da3bc68dd 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__al.snap +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__al.snap @@ -1,109 +1,110 @@ --- -source: kcl/src/parser/parser_impl.rs +source: kcl/src/parsing/parser.rs +assertion_line: 3997 expression: actual +snapshot_kind: text --- { - "start": 0, - "end": 36, "body": [ { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 0, "end": 36, "expression": { - "type": "CallExpression", - "type": "CallExpression", - "start": 0, - "end": 36, - "callee": { - "type": "Identifier", - "start": 0, - "end": 6, - "name": "lineTo" - }, "arguments": [ { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 7, "end": 35, "properties": [ { - "type": "ObjectProperty", - "start": 9, "end": 19, "key": { - "type": "Identifier", - "start": 9, "end": 11, - "name": "to" + "name": "to", + "start": 9, + "type": "Identifier" }, + "start": 9, + "type": "ObjectProperty", "value": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 13, - "end": 19, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 14, "end": 15, - "value": 0, - "raw": "0" + "raw": "0", + "start": 14, + "type": "Literal", + "type": "Literal", + "value": 0.0 }, { - "type": "Literal", - "type": "Literal", - "start": 17, "end": 18, - "value": 1, - "raw": "1" + "raw": "1", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 1.0 } - ] + ], + "end": 19, + "start": 13, + "type": "ArrayExpression", + "type": "ArrayExpression" } }, { - "type": "ObjectProperty", - "start": 21, "end": 33, "key": { - "type": "Identifier", - "start": 21, "end": 25, - "name": "from" + "name": "from", + "start": 21, + "type": "Identifier" }, + "start": 21, + "type": "ObjectProperty", "value": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 27, - "end": 33, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 28, "end": 29, - "value": 3, - "raw": "3" + "raw": "3", + "start": 28, + "type": "Literal", + "type": "Literal", + "value": 3.0 }, { - "type": "Literal", - "type": "Literal", - "start": 31, "end": 32, - "value": 3, - "raw": "3" + "raw": "3", + "start": 31, + "type": "Literal", + "type": "Literal", + "value": 3.0 } - ] + ], + "end": 33, + "start": 27, + "type": "ArrayExpression", + "type": "ArrayExpression" } } - ] + ], + "start": 7, + "type": "ObjectExpression", + "type": "ObjectExpression" } ], - "optional": false - } + "callee": { + "end": 6, + "name": "lineTo", + "start": 0, + "type": "Identifier" + }, + "end": 36, + "start": 0, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" } - ] + ], + "end": 36, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__am.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__am.snap similarity index 69% rename from src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__am.snap rename to src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__am.snap index e969ef25e..39739efb5 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__am.snap +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__am.snap @@ -1,74 +1,75 @@ --- -source: kcl/src/parser/parser_impl.rs +source: kcl/src/parsing/parser.rs +assertion_line: 3998 expression: actual +snapshot_kind: text --- { - "start": 0, - "end": 19, "body": [ { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 0, "end": 19, "expression": { - "type": "CallExpression", - "type": "CallExpression", - "start": 0, - "end": 19, - "callee": { - "type": "Identifier", - "start": 0, - "end": 6, - "name": "lineTo" - }, "arguments": [ { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 7, "end": 18, "properties": [ { - "type": "ObjectProperty", - "start": 8, "end": 17, "key": { - "type": "Identifier", - "start": 8, "end": 10, - "name": "to" + "name": "to", + "start": 8, + "type": "Identifier" }, + "start": 8, + "type": "ObjectProperty", "value": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 11, - "end": 17, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 12, "end": 13, - "value": 0, - "raw": "0" + "raw": "0", + "start": 12, + "type": "Literal", + "type": "Literal", + "value": 0.0 }, { - "type": "Literal", - "type": "Literal", - "start": 15, "end": 16, - "value": 1, - "raw": "1" + "raw": "1", + "start": 15, + "type": "Literal", + "type": "Literal", + "value": 1.0 } - ] + ], + "end": 17, + "start": 11, + "type": "ArrayExpression", + "type": "ArrayExpression" } } - ] + ], + "start": 7, + "type": "ObjectExpression", + "type": "ObjectExpression" } ], - "optional": false - } + "callee": { + "end": 6, + "name": "lineTo", + "start": 0, + "type": "Identifier" + }, + "end": 19, + "start": 0, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" } - ] + ], + "end": 19, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__an.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__an.snap similarity index 71% rename from src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__an.snap rename to src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__an.snap index c066ffd25..fae9112de 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__an.snap +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__an.snap @@ -1,109 +1,110 @@ --- -source: kcl/src/parser/parser_impl.rs +source: kcl/src/parsing/parser.rs +assertion_line: 3999 expression: actual +snapshot_kind: text --- { - "start": 0, - "end": 35, "body": [ { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 0, "end": 35, "expression": { - "type": "CallExpression", - "type": "CallExpression", - "start": 0, - "end": 35, - "callee": { - "type": "Identifier", - "start": 0, - "end": 6, - "name": "lineTo" - }, "arguments": [ { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 7, "end": 34, "properties": [ { - "type": "ObjectProperty", - "start": 9, "end": 19, "key": { - "type": "Identifier", - "start": 9, "end": 11, - "name": "to" + "name": "to", + "start": 9, + "type": "Identifier" }, + "start": 9, + "type": "ObjectProperty", "value": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 13, - "end": 19, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 14, "end": 15, - "value": 0, - "raw": "0" + "raw": "0", + "start": 14, + "type": "Literal", + "type": "Literal", + "value": 0.0 }, { - "type": "Literal", - "type": "Literal", - "start": 17, "end": 18, - "value": 1, - "raw": "1" + "raw": "1", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 1.0 } - ] + ], + "end": 19, + "start": 13, + "type": "ArrayExpression", + "type": "ArrayExpression" } }, { - "type": "ObjectProperty", - "start": 21, "end": 33, "key": { - "type": "Identifier", - "start": 21, "end": 25, - "name": "from" + "name": "from", + "start": 21, + "type": "Identifier" }, + "start": 21, + "type": "ObjectProperty", "value": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 27, - "end": 33, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 28, "end": 29, - "value": 3, - "raw": "3" + "raw": "3", + "start": 28, + "type": "Literal", + "type": "Literal", + "value": 3.0 }, { - "type": "Literal", - "type": "Literal", - "start": 31, "end": 32, - "value": 3, - "raw": "3" + "raw": "3", + "start": 31, + "type": "Literal", + "type": "Literal", + "value": 3.0 } - ] + ], + "end": 33, + "start": 27, + "type": "ArrayExpression", + "type": "ArrayExpression" } } - ] + ], + "start": 7, + "type": "ObjectExpression", + "type": "ObjectExpression" } ], - "optional": false - } + "callee": { + "end": 6, + "name": "lineTo", + "start": 0, + "type": "Identifier" + }, + "end": 35, + "start": 0, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" } - ] + ], + "end": 35, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ao.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ao.snap similarity index 71% rename from src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ao.snap rename to src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ao.snap index f41266ac4..4f96570f3 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ao.snap +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ao.snap @@ -1,109 +1,110 @@ --- -source: kcl/src/parser/parser_impl.rs +source: kcl/src/parsing/parser.rs +assertion_line: 4000 expression: actual +snapshot_kind: text --- { - "start": 0, - "end": 35, "body": [ { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 0, "end": 35, "expression": { - "type": "CallExpression", - "type": "CallExpression", - "start": 0, - "end": 35, - "callee": { - "type": "Identifier", - "start": 0, - "end": 6, - "name": "lineTo" - }, "arguments": [ { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 7, "end": 34, "properties": [ { - "type": "ObjectProperty", - "start": 9, "end": 19, "key": { - "type": "Identifier", - "start": 9, "end": 11, - "name": "to" + "name": "to", + "start": 9, + "type": "Identifier" }, + "start": 9, + "type": "ObjectProperty", "value": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 13, - "end": 19, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 14, "end": 15, - "value": 0, - "raw": "0" + "raw": "0", + "start": 14, + "type": "Literal", + "type": "Literal", + "value": 0.0 }, { - "type": "Literal", - "type": "Literal", - "start": 17, "end": 18, - "value": 1, - "raw": "1" + "raw": "1", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 1.0 } - ] + ], + "end": 19, + "start": 13, + "type": "ArrayExpression", + "type": "ArrayExpression" } }, { - "type": "ObjectProperty", - "start": 20, "end": 32, "key": { - "type": "Identifier", - "start": 20, "end": 24, - "name": "from" + "name": "from", + "start": 20, + "type": "Identifier" }, + "start": 20, + "type": "ObjectProperty", "value": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 26, - "end": 32, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 27, "end": 28, - "value": 3, - "raw": "3" + "raw": "3", + "start": 27, + "type": "Literal", + "type": "Literal", + "value": 3.0 }, { - "type": "Literal", - "type": "Literal", - "start": 30, "end": 31, - "value": 3, - "raw": "3" + "raw": "3", + "start": 30, + "type": "Literal", + "type": "Literal", + "value": 3.0 } - ] + ], + "end": 32, + "start": 26, + "type": "ArrayExpression", + "type": "ArrayExpression" } } - ] + ], + "start": 7, + "type": "ObjectExpression", + "type": "ObjectExpression" } ], - "optional": false - } + "callee": { + "end": 6, + "name": "lineTo", + "start": 0, + "type": "Identifier" + }, + "end": 35, + "start": 0, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" } - ] + ], + "end": 35, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ap.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ap.snap new file mode 100644 index 000000000..3d1b3c390 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ap.snap @@ -0,0 +1,66 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 31, + "id": { + "end": 8, + "name": "mySketch", + "start": 0, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "elements": [ + { + "end": 27, + "raw": "0", + "start": 26, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 29, + "raw": "0", + "start": 28, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 30, + "start": 25, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + ], + "callee": { + "end": 24, + "name": "startSketchAt", + "start": 11, + "type": "Identifier" + }, + "end": 31, + "start": 11, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 31, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 31, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aq.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__aq.snap similarity index 63% rename from src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aq.snap rename to src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__aq.snap index b0e4a021c..58651956e 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aq.snap +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__aq.snap @@ -1,54 +1,55 @@ --- -source: kcl/src/parser/parser_impl.rs +source: kcl/src/parsing/parser.rs +assertion_line: 4002 expression: actual +snapshot_kind: text --- { - "start": 0, - "end": 28, "body": [ { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 0, "end": 28, "expression": { - "type": "CallExpression", - "type": "CallExpression", - "start": 0, - "end": 28, - "callee": { - "type": "Identifier", - "start": 0, - "end": 3, - "name": "log" - }, "arguments": [ { - "type": "Literal", - "type": "Literal", - "start": 4, "end": 5, - "value": 5, - "raw": "5" + "raw": "5", + "start": 4, + "type": "Literal", + "type": "Literal", + "value": 5.0 }, { - "type": "Literal", - "type": "Literal", - "start": 7, "end": 14, - "value": "hello", - "raw": "\"hello\"" + "raw": "\"hello\"", + "start": 7, + "type": "Literal", + "type": "Literal", + "value": "hello" }, { - "type": "Identifier", - "type": "Identifier", - "start": 16, "end": 27, - "name": "aIdentifier" + "name": "aIdentifier", + "start": 16, + "type": "Identifier", + "type": "Identifier" } ], - "optional": false - } + "callee": { + "end": 3, + "name": "log", + "start": 0, + "type": "Identifier" + }, + "end": 28, + "start": 0, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" } - ] + ], + "end": 28, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ar.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ar.snap similarity index 64% rename from src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ar.snap rename to src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ar.snap index 24602b164..6fa2c06d0 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ar.snap +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ar.snap @@ -1,39 +1,41 @@ --- -source: kcl/src/parser/parser_impl.rs +source: kcl/src/parsing/parser.rs +assertion_line: 4003 expression: actual +snapshot_kind: text --- { - "start": 0, - "end": 7, "body": [ { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 0, "end": 7, "expression": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 0, "end": 7, - "operator": "+", "left": { - "type": "Literal", - "type": "Literal", - "start": 0, "end": 1, - "value": 5, - "raw": "5" + "raw": "5", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": 5.0 }, + "operator": "+", "right": { - "type": "Literal", - "type": "Literal", - "start": 4, "end": 7, - "value": "a", - "raw": "\"a\"" - } - } + "raw": "\"a\"", + "start": 4, + "type": "Literal", + "type": "Literal", + "value": "a" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" } - ] + ], + "end": 7, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__at.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__at.snap similarity index 64% rename from src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__at.snap rename to src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__at.snap index 9935614d1..f627be223 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__at.snap +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__at.snap @@ -1,60 +1,61 @@ --- -source: kcl/src/parser/parser_impl.rs +source: kcl/src/parsing/parser.rs +assertion_line: 4004 expression: actual +snapshot_kind: text --- { - "start": 0, - "end": 15, "body": [ { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 0, "end": 15, "expression": { - "type": "CallExpression", - "type": "CallExpression", - "start": 0, - "end": 15, - "callee": { - "type": "Identifier", - "start": 0, - "end": 4, - "name": "line" - }, "arguments": [ { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 5, - "end": 11, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 6, "end": 7, - "value": 0, - "raw": "0" + "raw": "0", + "start": 6, + "type": "Literal", + "type": "Literal", + "value": 0.0 }, { - "type": "Identifier", - "type": "Identifier", - "start": 9, "end": 10, - "name": "l" + "name": "l", + "start": 9, + "type": "Identifier", + "type": "Identifier" } - ] + ], + "end": 11, + "start": 5, + "type": "ArrayExpression", + "type": "ArrayExpression" }, { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 14, "start": 13, - "end": 14 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false - } + "callee": { + "end": 4, + "name": "line", + "start": 0, + "type": "Identifier" + }, + "end": 15, + "start": 0, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" } - ] + ], + "end": 15, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__au.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__au.snap new file mode 100644 index 000000000..c3c6b1405 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__au.snap @@ -0,0 +1,168 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 107, + "id": { + "end": 14, + "name": "cylinder", + "start": 6, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 35, + "raw": "'XY'", + "start": 31, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 30, + "name": "startSketchOn", + "start": 17, + "type": "Identifier" + }, + "end": 36, + "start": 17, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 81, + "properties": [ + { + "end": 67, + "key": { + "end": 59, + "name": "center", + "start": 53, + "type": "Identifier" + }, + "start": 53, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 63, + "raw": "0", + "start": 62, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 66, + "raw": "0", + "start": 65, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 67, + "start": 61, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "end": 79, + "key": { + "end": 75, + "name": "radius", + "start": 69, + "type": "Identifier" + }, + "start": 69, + "type": "ObjectProperty", + "value": { + "end": 79, + "raw": "22", + "start": 77, + "type": "Literal", + "type": "Literal", + "value": 22.0 + } + } + ], + "start": 51, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 84, + "start": 83, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 50, + "name": "circle", + "start": 44, + "type": "Identifier" + }, + "end": 85, + "start": 44, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 103, + "raw": "14", + "start": 101, + "type": "Literal", + "type": "Literal", + "value": 14.0 + }, + { + "end": 106, + "start": 105, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 100, + "name": "extrude", + "start": 93, + "type": "Identifier" + }, + "end": 107, + "start": 93, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 107, + "start": 17, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 6, + "type": "VariableDeclarator" + }, + "end": 107, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 108, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__av.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__av.snap new file mode 100644 index 000000000..d723b603b --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__av.snap @@ -0,0 +1,91 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 49, + "id": { + "end": 4, + "name": "f", + "start": 3, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "arguments": [ + { + "end": 41, + "name": "angle", + "start": 36, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 46, + "raw": "360", + "start": 43, + "type": "Literal", + "type": "Literal", + "value": 360.0 + } + ], + "callee": { + "end": 35, + "name": "default", + "start": 28, + "type": "Identifier" + }, + "end": 47, + "start": 28, + "type": "CallExpression", + "type": "CallExpression" + }, + "end": 47, + "start": 21, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 49, + "start": 19 + }, + "end": 49, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 13, + "name": "angle", + "start": 8, + "type": "Identifier" + }, + "default_value": { + "type": "KclNone", + "type": "KclNone", + "__private": "KCL_NONE_ID" + } + } + ], + "start": 7, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" + }, + "end": 49, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 49, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__aw.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__aw.snap new file mode 100644 index 000000000..929c32e2c --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__aw.snap @@ -0,0 +1,81 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 91, + "id": { + "end": 11, + "name": "numbers", + "start": 4, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 29, + "raw": "1", + "start": 28, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 80, + "raw": "3", + "start": 79, + "type": "Literal", + "type": "Literal", + "value": 3.0 + } + ], + "end": 91, + "nonCodeMeta": { + "nonCodeNodes": { + "1": [ + { + "end": 48, + "start": 43, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "A,", + "style": "line" + } + } + ], + "2": [ + { + "end": 66, + "start": 61, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "B,", + "style": "line" + } + } + ] + }, + "startNodes": [] + }, + "start": 14, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 4, + "type": "VariableDeclarator" + }, + "end": 91, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 91, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ax.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ax.snap new file mode 100644 index 000000000..3f3fe9988 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ax.snap @@ -0,0 +1,81 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 91, + "id": { + "end": 11, + "name": "numbers", + "start": 4, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 29, + "raw": "1", + "start": 28, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 44, + "raw": "2", + "start": 43, + "type": "Literal", + "type": "Literal", + "value": 2.0 + } + ], + "end": 91, + "nonCodeMeta": { + "nonCodeNodes": { + "2": [ + { + "end": 63, + "start": 58, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "A,", + "style": "line" + } + } + ], + "3": [ + { + "end": 81, + "start": 76, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "B,", + "style": "line" + } + } + ] + }, + "startNodes": [] + }, + "start": 14, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 4, + "type": "VariableDeclarator" + }, + "end": 91, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 91, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ay.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ay.snap new file mode 100644 index 000000000..edc3e4e80 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ay.snap @@ -0,0 +1,91 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 80, + "id": { + "end": 9, + "name": "props", + "start": 4, + "type": "Identifier" + }, + "init": { + "end": 80, + "nonCodeMeta": { + "nonCodeNodes": { + "1": [ + { + "end": 52, + "start": 44, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "b: 2,", + "style": "line" + } + } + ] + }, + "startNodes": [] + }, + "properties": [ + { + "end": 30, + "key": { + "end": 27, + "name": "a", + "start": 26, + "type": "Identifier" + }, + "start": 26, + "type": "ObjectProperty", + "value": { + "end": 30, + "raw": "1", + "start": 29, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + }, + { + "end": 69, + "key": { + "end": 66, + "name": "c", + "start": 65, + "type": "Identifier" + }, + "start": 65, + "type": "ObjectProperty", + "value": { + "end": 69, + "raw": "3", + "start": 68, + "type": "Literal", + "type": "Literal", + "value": 3.0 + } + } + ], + "start": 12, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 4, + "type": "VariableDeclarator" + }, + "end": 80, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 80, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__az.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__az.snap new file mode 100644 index 000000000..a1bec8027 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__az.snap @@ -0,0 +1,91 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 79, + "id": { + "end": 9, + "name": "props", + "start": 4, + "type": "Identifier" + }, + "init": { + "end": 79, + "nonCodeMeta": { + "nonCodeNodes": { + "1": [ + { + "end": 52, + "start": 44, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "b: 2,", + "style": "line" + } + } + ] + }, + "startNodes": [] + }, + "properties": [ + { + "end": 30, + "key": { + "end": 27, + "name": "a", + "start": 26, + "type": "Identifier" + }, + "start": 26, + "type": "ObjectProperty", + "value": { + "end": 30, + "raw": "1", + "start": 29, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + }, + { + "end": 69, + "key": { + "end": 66, + "name": "c", + "start": 65, + "type": "Identifier" + }, + "start": 65, + "type": "ObjectProperty", + "value": { + "end": 69, + "raw": "3", + "start": 68, + "type": "Literal", + "type": "Literal", + "value": 3.0 + } + } + ], + "start": 12, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 4, + "type": "VariableDeclarator" + }, + "end": 79, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 79, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__b.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__b.snap new file mode 100644 index 000000000..82864fb90 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__b.snap @@ -0,0 +1,87 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 30, + "id": { + "end": 5, + "name": "myVar", + "start": 0, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 13, + "raw": "5", + "start": 12, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + { + "argument": { + "arguments": [ + { + "end": 25, + "raw": "5", + "start": 24, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + { + "end": 28, + "raw": "4", + "start": 27, + "type": "Literal", + "type": "Literal", + "value": 4.0 + } + ], + "callee": { + "end": 23, + "name": "legLen", + "start": 17, + "type": "Identifier" + }, + "end": 29, + "start": 17, + "type": "CallExpression", + "type": "CallExpression" + }, + "end": 29, + "operator": "-", + "start": 16, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "callee": { + "end": 11, + "name": "min", + "start": 8, + "type": "Identifier" + }, + "end": 30, + "start": 8, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 30, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 30, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ba.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ba.snap new file mode 100644 index 000000000..a48e13016 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ba.snap @@ -0,0 +1,125 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 126, + "id": { + "end": 10, + "name": "sketch001", + "start": 1, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 31, + "raw": "'XY'", + "start": 27, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 26, + "name": "startSketchOn", + "start": 13, + "type": "Identifier" + }, + "end": 32, + "start": 13, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 125, + "start": 124, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 123, + "name": "startProfileAt", + "start": 109, + "type": "Identifier" + }, + "end": 126, + "start": 109, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 126, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 46, + "start": 35, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "|> arc({", + "style": "line" + } + }, + { + "end": 68, + "start": 49, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "angleEnd: 270,", + "style": "line" + } + }, + { + "end": 92, + "start": 71, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "angleStart: 450,", + "style": "line" + } + }, + { + "end": 103, + "start": 95, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "}, %)", + "style": "line" + } + } + ] + }, + "startNodes": [] + }, + "start": 13, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 1, + "type": "VariableDeclarator" + }, + "end": 126, + "kind": "const", + "start": 1, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 127, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bb.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bb.snap new file mode 100644 index 000000000..45c614e07 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bb.snap @@ -0,0 +1,96 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 25, + "id": { + "end": 5, + "name": "my14", + "start": 1, + "type": "Identifier" + }, + "init": { + "end": 25, + "left": { + "end": 13, + "left": { + "end": 9, + "raw": "4", + "start": 8, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "operator": "^", + "right": { + "end": 13, + "raw": "2", + "start": 12, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 8, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "-", + "right": { + "end": 25, + "left": { + "end": 21, + "left": { + "end": 17, + "raw": "3", + "start": 16, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "operator": "^", + "right": { + "end": 21, + "raw": "2", + "start": 20, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 16, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "*", + "right": { + "end": 25, + "raw": "2", + "start": 24, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 16, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 8, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 1, + "type": "VariableDeclarator" + }, + "end": 25, + "kind": "const", + "start": 1, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 26, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bc.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bc.snap new file mode 100644 index 000000000..78d3cf9cf --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bc.snap @@ -0,0 +1,84 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 68, + "id": { + "end": 1, + "name": "x", + "start": 0, + "type": "Identifier" + }, + "init": { + "cond": { + "end": 11, + "raw": "true", + "start": 7, + "type": "Literal", + "type": "Literal", + "value": true + }, + "digest": null, + "else_ifs": [], + "end": 68, + "final_else": { + "body": [ + { + "end": 58, + "expression": { + "end": 58, + "raw": "4", + "start": 57, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "start": 57, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 67, + "start": 57 + }, + "start": 4, + "then_val": { + "body": [ + { + "end": 27, + "expression": { + "end": 27, + "raw": "3", + "start": 26, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "start": 26, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 36, + "start": 26 + }, + "type": "IfExpression", + "type": "IfExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 68, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 68, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bd.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bd.snap new file mode 100644 index 000000000..930b334ef --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bd.snap @@ -0,0 +1,132 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 115, + "id": { + "end": 1, + "name": "x", + "start": 0, + "type": "Identifier" + }, + "init": { + "cond": { + "end": 11, + "raw": "true", + "start": 7, + "type": "Literal", + "type": "Literal", + "value": true + }, + "digest": null, + "else_ifs": [ + { + "cond": { + "arguments": [ + { + "end": 57, + "name": "radius", + "start": 51, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 50, + "name": "func", + "start": 46, + "type": "Identifier" + }, + "end": 58, + "start": 46, + "type": "CallExpression", + "type": "CallExpression" + }, + "digest": null, + "end": 84, + "start": 38, + "then_val": { + "body": [ + { + "end": 74, + "expression": { + "end": 74, + "raw": "4", + "start": 73, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "start": 73, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 83, + "start": 59 + }, + "type": "ElseIf" + } + ], + "end": 115, + "final_else": { + "body": [ + { + "end": 105, + "expression": { + "end": 105, + "raw": "5", + "start": 104, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + "start": 104, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 114, + "start": 104 + }, + "start": 4, + "then_val": { + "body": [ + { + "end": 27, + "expression": { + "end": 27, + "raw": "3", + "start": 26, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "start": 26, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 36, + "start": 26 + }, + "type": "IfExpression", + "type": "IfExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 115, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 115, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__be.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__be.snap new file mode 100644 index 000000000..c113d0d05 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__be.snap @@ -0,0 +1,51 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 14, + "id": { + "end": 5, + "name": "x", + "start": 4, + "type": "Identifier" + }, + "init": { + "end": 14, + "left": { + "end": 9, + "raw": "3", + "start": 8, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "operator": "==", + "right": { + "end": 14, + "raw": "3", + "start": 13, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "start": 8, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 4, + "type": "VariableDeclarator" + }, + "end": 14, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 14, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bf.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bf.snap new file mode 100644 index 000000000..478fa810a --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bf.snap @@ -0,0 +1,51 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 14, + "id": { + "end": 5, + "name": "x", + "start": 4, + "type": "Identifier" + }, + "init": { + "end": 14, + "left": { + "end": 9, + "raw": "3", + "start": 8, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "operator": "!=", + "right": { + "end": 14, + "raw": "3", + "start": 13, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "start": 8, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 4, + "type": "VariableDeclarator" + }, + "end": 14, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 14, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bg.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bg.snap new file mode 100644 index 000000000..96dd04101 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bg.snap @@ -0,0 +1,36 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 5, + "id": { + "end": 1, + "name": "x", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 5, + "raw": "4", + "start": 4, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 5, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 5, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bh.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bh.snap new file mode 100644 index 000000000..d587d96ea --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bh.snap @@ -0,0 +1,90 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 36, + "id": { + "end": 3, + "name": "obj", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 36, + "properties": [ + { + "end": 24, + "key": { + "end": 13, + "name": "center", + "start": 7, + "type": "Identifier" + }, + "start": 7, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 19, + "raw": "10", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + { + "end": 23, + "raw": "10", + "start": 21, + "type": "Literal", + "type": "Literal", + "value": 10.0 + } + ], + "end": 24, + "start": 16, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "end": 35, + "key": { + "end": 32, + "name": "radius", + "start": 26, + "type": "Identifier" + }, + "start": 26, + "type": "ObjectProperty", + "value": { + "end": 35, + "raw": "5", + "start": 34, + "type": "Literal", + "type": "Literal", + "value": 5.0 + } + } + ], + "start": 6, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 36, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 36, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bi.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bi.snap new file mode 100644 index 000000000..7b224163e --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bi.snap @@ -0,0 +1,99 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 5, + "id": { + "end": 1, + "name": "x", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 5, + "raw": "3", + "start": 4, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 5, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 30, + "id": { + "end": 17, + "name": "obj", + "start": 14, + "type": "Identifier" + }, + "init": { + "end": 30, + "properties": [ + { + "end": 23, + "key": { + "end": 23, + "name": "x", + "start": 22, + "type": "Identifier" + }, + "start": 22, + "type": "ObjectProperty", + "value": { + "end": 23, + "name": "x", + "start": 22, + "type": "Identifier", + "type": "Identifier" + } + }, + { + "end": 29, + "key": { + "end": 26, + "name": "y", + "start": 25, + "type": "Identifier" + }, + "start": 25, + "type": "ObjectProperty", + "value": { + "end": 29, + "raw": "4", + "start": 28, + "type": "Literal", + "type": "Literal", + "value": 4.0 + } + } + ], + "start": 20, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 14, + "type": "VariableDeclarator" + }, + "end": 30, + "kind": "const", + "start": 14, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 30, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bj.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bj.snap new file mode 100644 index 000000000..fe8afa014 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bj.snap @@ -0,0 +1,26 @@ +--- +source: kcl/src/parsing/parser.rs +assertion_line: 4521 +expression: actual +snapshot_kind: text +--- +{ + "body": [ + { + "end": 4, + "expression": { + "end": 4, + "raw": "true", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": true + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 4, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bk.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bk.snap new file mode 100644 index 000000000..777c1da67 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bk.snap @@ -0,0 +1,25 @@ +--- +source: kcl/src/parsing/parser.rs +assertion_line: 4522 +expression: actual +snapshot_kind: text +--- +{ + "body": [ + { + "end": 5, + "expression": { + "end": 5, + "name": "truee", + "start": 0, + "type": "Identifier", + "type": "Identifier" + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 5, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bl.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bl.snap new file mode 100644 index 000000000..4573d0c1f --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bl.snap @@ -0,0 +1,45 @@ +--- +source: kcl/src/parsing/parser.rs +assertion_line: 4523 +expression: actual +snapshot_kind: text +--- +{ + "body": [ + { + "declaration": { + "end": 9, + "id": { + "end": 1, + "name": "x", + "start": 0, + "type": "Identifier" + }, + "init": { + "argument": { + "end": 9, + "raw": "true", + "start": 5, + "type": "Literal", + "type": "Literal", + "value": true + }, + "end": 9, + "operator": "!", + "start": 4, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 9, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 9, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bm.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bm.snap new file mode 100644 index 000000000..b82bc3164 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bm.snap @@ -0,0 +1,53 @@ +--- +source: kcl/src/parsing/parser.rs +assertion_line: 4524 +expression: actual +snapshot_kind: text +--- +{ + "body": [ + { + "declaration": { + "end": 16, + "id": { + "end": 1, + "name": "x", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 16, + "left": { + "end": 8, + "raw": "true", + "start": 4, + "type": "Literal", + "type": "Literal", + "value": true + }, + "operator": "&", + "right": { + "end": 16, + "raw": "false", + "start": 11, + "type": "Literal", + "type": "Literal", + "value": false + }, + "start": 4, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 16, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 16, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bn.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bn.snap new file mode 100644 index 000000000..c094e8715 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__bn.snap @@ -0,0 +1,53 @@ +--- +source: kcl/src/parsing/parser.rs +assertion_line: 4525 +expression: actual +snapshot_kind: text +--- +{ + "body": [ + { + "declaration": { + "end": 16, + "id": { + "end": 1, + "name": "x", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 16, + "left": { + "end": 8, + "raw": "true", + "start": 4, + "type": "Literal", + "type": "Literal", + "value": true + }, + "operator": "|", + "right": { + "end": 16, + "raw": "false", + "start": 11, + "type": "Literal", + "type": "Literal", + "value": false + }, + "start": 4, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 16, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 16, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__c.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__c.snap new file mode 100644 index 000000000..cb950da68 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__c.snap @@ -0,0 +1,87 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 29, + "id": { + "end": 5, + "name": "myVar", + "start": 0, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "argument": { + "arguments": [ + { + "end": 21, + "raw": "5", + "start": 20, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + { + "end": 24, + "raw": "4", + "start": 23, + "type": "Literal", + "type": "Literal", + "value": 4.0 + } + ], + "callee": { + "end": 19, + "name": "legLen", + "start": 13, + "type": "Identifier" + }, + "end": 25, + "start": 13, + "type": "CallExpression", + "type": "CallExpression" + }, + "end": 25, + "operator": "-", + "start": 12, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 28, + "raw": "5", + "start": 27, + "type": "Literal", + "type": "Literal", + "value": 5.0 + } + ], + "callee": { + "end": 11, + "name": "min", + "start": 8, + "type": "Identifier" + }, + "end": 29, + "start": 8, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 29, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 29, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__d.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__d.snap new file mode 100644 index 000000000..13923810f --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__d.snap @@ -0,0 +1,87 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 30, + "id": { + "end": 5, + "name": "myVar", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "end": 13, + "left": { + "end": 9, + "raw": "5", + "start": 8, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + "operator": "+", + "right": { + "end": 13, + "raw": "6", + "start": 12, + "type": "Literal", + "type": "Literal", + "value": 6.0 + }, + "start": 8, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "arguments": [ + { + "end": 26, + "raw": "45", + "start": 24, + "type": "Literal", + "type": "Literal", + "value": 45.0 + }, + { + "end": 29, + "start": 28, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 23, + "name": "myFunc", + "start": 17, + "type": "Identifier" + }, + "end": 30, + "start": 17, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 30, + "start": 8, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 30, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 30, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__d2.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__d2.snap new file mode 100644 index 000000000..ea5923058 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__d2.snap @@ -0,0 +1,56 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 21, + "id": { + "end": 1, + "name": "x", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 21, + "left": { + "argument": { + "end": 9, + "name": "leg2", + "start": 5, + "type": "Identifier", + "type": "Identifier" + }, + "end": 9, + "operator": "-", + "start": 4, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 21, + "name": "thickness", + "start": 12, + "type": "Identifier", + "type": "Identifier" + }, + "start": 4, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 21, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 21, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__e.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__e.snap new file mode 100644 index 000000000..0928b80d5 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__e.snap @@ -0,0 +1,66 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 18, + "id": { + "end": 5, + "name": "x", + "start": 4, + "type": "Identifier" + }, + "init": { + "end": 18, + "left": { + "end": 9, + "raw": "1", + "start": 8, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "operator": "*", + "right": { + "end": 18, + "left": { + "end": 14, + "raw": "3", + "start": 13, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "operator": "-", + "right": { + "end": 18, + "raw": "4", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "start": 13, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 8, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 4, + "type": "VariableDeclarator" + }, + "end": 18, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 18, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__f.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__f.snap new file mode 100644 index 000000000..2c6bea2d5 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__f.snap @@ -0,0 +1,53 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 5, + "id": { + "end": 1, + "name": "x", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 5, + "raw": "1", + "start": 4, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 5, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 34, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 34, + "start": 5, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "this is an inline comment", + "style": "line" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__g.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__g.snap new file mode 100644 index 000000000..3e3b2c9dc --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__g.snap @@ -0,0 +1,67 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 58, + "id": { + "end": 4, + "name": "x", + "start": 3, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "end": 32, + "name": "sg", + "start": 30, + "type": "Identifier", + "type": "Identifier" + }, + "end": 32, + "start": 23, + "type": "ReturnStatement", + "type": "ReturnStatement" + }, + { + "argument": { + "end": 50, + "name": "sg", + "start": 48, + "type": "Identifier", + "type": "Identifier" + }, + "end": 50, + "start": 41, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 58, + "start": 13 + }, + "end": 58, + "params": [], + "start": 7, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" + }, + "end": 58, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 58, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__h.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__h.snap new file mode 100644 index 000000000..fb043e483 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__h.snap @@ -0,0 +1,128 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 20, + "id": { + "end": 3, + "name": "obj", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 20, + "properties": [ + { + "end": 12, + "key": { + "end": 9, + "name": "a", + "start": 8, + "type": "Identifier" + }, + "start": 8, + "type": "ObjectProperty", + "value": { + "end": 12, + "raw": "1", + "start": 11, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + }, + { + "end": 18, + "key": { + "end": 15, + "name": "b", + "start": 14, + "type": "Identifier" + }, + "start": 14, + "type": "ObjectProperty", + "value": { + "end": 18, + "raw": "2", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 2.0 + } + } + ], + "start": 6, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 20, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 43, + "id": { + "end": 31, + "name": "height", + "start": 25, + "type": "Identifier" + }, + "init": { + "end": 43, + "left": { + "end": 35, + "raw": "1", + "start": 34, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "operator": "-", + "right": { + "computed": false, + "end": 43, + "object": { + "end": 41, + "name": "obj", + "start": 38, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 43, + "name": "a", + "start": 42, + "type": "Identifier", + "type": "Identifier" + }, + "start": 38, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 34, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 25, + "type": "VariableDeclarator" + }, + "end": 43, + "kind": "const", + "start": 25, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 43, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__i.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__i.snap new file mode 100644 index 000000000..a1cc24990 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__i.snap @@ -0,0 +1,129 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 20, + "id": { + "end": 3, + "name": "obj", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 20, + "properties": [ + { + "end": 12, + "key": { + "end": 9, + "name": "a", + "start": 8, + "type": "Identifier" + }, + "start": 8, + "type": "ObjectProperty", + "value": { + "end": 12, + "raw": "1", + "start": 11, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + }, + { + "end": 18, + "key": { + "end": 15, + "name": "b", + "start": 14, + "type": "Identifier" + }, + "start": 14, + "type": "ObjectProperty", + "value": { + "end": 18, + "raw": "2", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 2.0 + } + } + ], + "start": 6, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 20, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 47, + "id": { + "end": 32, + "name": "height", + "start": 26, + "type": "Identifier" + }, + "init": { + "end": 47, + "left": { + "end": 36, + "raw": "1", + "start": 35, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "operator": "-", + "right": { + "computed": false, + "end": 47, + "object": { + "end": 42, + "name": "obj", + "start": 39, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 46, + "raw": "\"a\"", + "start": 43, + "type": "Literal", + "type": "Literal", + "value": "a" + }, + "start": 39, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 35, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 26, + "type": "VariableDeclarator" + }, + "end": 47, + "kind": "const", + "start": 26, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 47, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__j.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__j.snap new file mode 100644 index 000000000..4a176f3ec --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__j.snap @@ -0,0 +1,129 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 20, + "id": { + "end": 3, + "name": "obj", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 20, + "properties": [ + { + "end": 12, + "key": { + "end": 9, + "name": "a", + "start": 8, + "type": "Identifier" + }, + "start": 8, + "type": "ObjectProperty", + "value": { + "end": 12, + "raw": "1", + "start": 11, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + }, + { + "end": 18, + "key": { + "end": 15, + "name": "b", + "start": 14, + "type": "Identifier" + }, + "start": 14, + "type": "ObjectProperty", + "value": { + "end": 18, + "raw": "2", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 2.0 + } + } + ], + "start": 6, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 20, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 46, + "id": { + "end": 31, + "name": "height", + "start": 25, + "type": "Identifier" + }, + "init": { + "end": 46, + "left": { + "computed": false, + "end": 42, + "object": { + "end": 37, + "name": "obj", + "start": 34, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 41, + "raw": "\"a\"", + "start": 38, + "type": "Literal", + "type": "Literal", + "value": "a" + }, + "start": 34, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "operator": "-", + "right": { + "end": 46, + "raw": "1", + "start": 45, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 34, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 25, + "type": "VariableDeclarator" + }, + "end": 46, + "kind": "const", + "start": 25, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 46, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__k.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__k.snap new file mode 100644 index 000000000..5be22d9da --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__k.snap @@ -0,0 +1,145 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 20, + "id": { + "end": 3, + "name": "obj", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 20, + "properties": [ + { + "end": 12, + "key": { + "end": 9, + "name": "a", + "start": 8, + "type": "Identifier" + }, + "start": 8, + "type": "ObjectProperty", + "value": { + "end": 12, + "raw": "1", + "start": 11, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + }, + { + "end": 18, + "key": { + "end": 15, + "name": "b", + "start": 14, + "type": "Identifier" + }, + "start": 14, + "type": "ObjectProperty", + "value": { + "end": 18, + "raw": "2", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 2.0 + } + } + ], + "start": 6, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 20, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 51, + "id": { + "end": 31, + "name": "height", + "start": 25, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 47, + "left": { + "end": 36, + "raw": "1", + "start": 35, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "operator": "-", + "right": { + "computed": false, + "end": 47, + "object": { + "end": 42, + "name": "obj", + "start": 39, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 46, + "raw": "\"a\"", + "start": 43, + "type": "Literal", + "type": "Literal", + "value": "a" + }, + "start": 39, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 35, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 50, + "raw": "0", + "start": 49, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 51, + "start": 34, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 25, + "type": "VariableDeclarator" + }, + "end": 51, + "kind": "const", + "start": 25, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 51, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__kw_function_all_named.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__kw_function_all_named.snap new file mode 100644 index 000000000..8093ebb08 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__kw_function_all_named.snap @@ -0,0 +1,72 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +snapshot_kind: text +--- +{ + "body": [ + { + "declaration": { + "end": 23, + "id": { + "end": 3, + "name": "val", + "start": 0, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "x" + }, + "arg": { + "end": 15, + "name": "a", + "start": 14, + "type": "Identifier", + "type": "Identifier" + } + }, + { + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "y" + }, + "arg": { + "end": 22, + "name": "b", + "start": 21, + "type": "Identifier", + "type": "Identifier" + } + } + ], + "callee": { + "end": 9, + "name": "foo", + "start": 6, + "type": "Identifier" + }, + "end": 23, + "start": 6, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 23, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 23, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__kw_function_call_in_pipe.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__kw_function_call_in_pipe.snap new file mode 100644 index 000000000..c3ac2e9f7 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__kw_function_call_in_pipe.snap @@ -0,0 +1,75 @@ +--- +source: kcl/src/parsing/parser.rs +assertion_line: 4674 +expression: actual +snapshot_kind: text +--- +{ + "body": [ + { + "declaration": { + "end": 21, + "id": { + "end": 3, + "name": "val", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "end": 7, + "raw": "1", + "start": 6, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "arg" + }, + "arg": { + "end": 20, + "name": "x", + "start": 19, + "type": "Identifier", + "type": "Identifier" + } + } + ], + "callee": { + "end": 12, + "name": "f", + "start": 11, + "type": "Identifier" + }, + "end": 21, + "start": 11, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + ], + "end": 21, + "start": 6, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 21, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 21, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__kw_function_decl_all_labeled.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__kw_function_decl_all_labeled.snap new file mode 100644 index 000000000..d7616e011 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__kw_function_decl_all_labeled.snap @@ -0,0 +1,75 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +snapshot_kind: text +--- +{ + "body": [ + { + "declaration": { + "end": 25, + "id": { + "end": 6, + "name": "foo", + "start": 3, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "end": 23, + "raw": "1", + "start": 22, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "end": 23, + "start": 15, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 25, + "start": 13 + }, + "end": 25, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 8, + "name": "x", + "start": 7, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 11, + "name": "y", + "start": 10, + "type": "Identifier" + } + } + ], + "start": 6, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" + }, + "end": 25, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 25, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__kw_function_decl_first_unlabeled.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__kw_function_decl_first_unlabeled.snap new file mode 100644 index 000000000..cc1a4838a --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__kw_function_decl_first_unlabeled.snap @@ -0,0 +1,76 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +snapshot_kind: text +--- +{ + "body": [ + { + "declaration": { + "end": 26, + "id": { + "end": 6, + "name": "foo", + "start": 3, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "end": 24, + "raw": "1", + "start": 23, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "end": 24, + "start": 16, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 26, + "start": 14 + }, + "end": 26, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 9, + "name": "x", + "start": 8, + "type": "Identifier" + }, + "labeled": false + }, + { + "type": "Parameter", + "identifier": { + "end": 12, + "name": "y", + "start": 11, + "type": "Identifier" + } + } + ], + "start": 6, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" + }, + "end": 26, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 26, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__kw_function_decl_with_default_and_type.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__kw_function_decl_with_default_and_type.snap new file mode 100644 index 000000000..c8640eea1 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__kw_function_decl_with_default_and_type.snap @@ -0,0 +1,76 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +snapshot_kind: text +--- +{ + "body": [ + { + "declaration": { + "end": 35, + "id": { + "end": 6, + "name": "foo", + "start": 3, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "end": 33, + "raw": "1", + "start": 32, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "end": 33, + "start": 25, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 35, + "start": 23 + }, + "end": 35, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 8, + "name": "x", + "start": 7, + "type": "Identifier" + }, + "type_": { + "type": "Primitive", + "type": "Number" + }, + "default_value": { + "type": "Literal", + "type": "Literal", + "value": 2.0, + "raw": "2" + } + } + ], + "start": 6, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" + }, + "end": 35, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 35, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__kw_function_decl_with_default_no_type.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__kw_function_decl_with_default_no_type.snap new file mode 100644 index 000000000..4d04a6e46 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__kw_function_decl_with_default_no_type.snap @@ -0,0 +1,72 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +snapshot_kind: text +--- +{ + "body": [ + { + "declaration": { + "end": 27, + "id": { + "end": 6, + "name": "foo", + "start": 3, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "end": 25, + "raw": "1", + "start": 24, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "end": 25, + "start": 17, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 27, + "start": 15 + }, + "end": 27, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 8, + "name": "x", + "start": 7, + "type": "Identifier" + }, + "default_value": { + "type": "Literal", + "type": "Literal", + "value": 2.0, + "raw": "2" + } + } + ], + "start": 6, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" + }, + "end": 27, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 27, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__kw_function_unnamed_first.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__kw_function_unnamed_first.snap new file mode 100644 index 000000000..14297e950 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__kw_function_unnamed_first.snap @@ -0,0 +1,64 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +snapshot_kind: text +--- +{ + "body": [ + { + "declaration": { + "end": 19, + "id": { + "end": 3, + "name": "val", + "start": 0, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "y" + }, + "arg": { + "end": 18, + "name": "z", + "start": 17, + "type": "Identifier", + "type": "Identifier" + } + } + ], + "callee": { + "end": 9, + "name": "foo", + "start": 6, + "type": "Identifier" + }, + "end": 19, + "start": 6, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "end": 11, + "name": "x", + "start": 10, + "type": "Identifier", + "type": "Identifier" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 19, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 19, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__l.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__l.snap new file mode 100644 index 000000000..685b2021c --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__l.snap @@ -0,0 +1,145 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 20, + "id": { + "end": 3, + "name": "obj", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 20, + "properties": [ + { + "end": 12, + "key": { + "end": 9, + "name": "a", + "start": 8, + "type": "Identifier" + }, + "start": 8, + "type": "ObjectProperty", + "value": { + "end": 12, + "raw": "1", + "start": 11, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + }, + { + "end": 18, + "key": { + "end": 15, + "name": "b", + "start": 14, + "type": "Identifier" + }, + "start": 14, + "type": "ObjectProperty", + "value": { + "end": 18, + "raw": "2", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 2.0 + } + } + ], + "start": 6, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 20, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 51, + "id": { + "end": 31, + "name": "height", + "start": 25, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 47, + "left": { + "computed": false, + "end": 43, + "object": { + "end": 38, + "name": "obj", + "start": 35, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 42, + "raw": "\"a\"", + "start": 39, + "type": "Literal", + "type": "Literal", + "value": "a" + }, + "start": 35, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "operator": "-", + "right": { + "end": 47, + "raw": "1", + "start": 46, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 35, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 50, + "raw": "0", + "start": 49, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 51, + "start": 34, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 25, + "type": "VariableDeclarator" + }, + "end": 51, + "kind": "const", + "start": 25, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 51, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__m.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__m.snap new file mode 100644 index 000000000..38b91dbbe --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__m.snap @@ -0,0 +1,145 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 20, + "id": { + "end": 3, + "name": "obj", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 20, + "properties": [ + { + "end": 12, + "key": { + "end": 9, + "name": "a", + "start": 8, + "type": "Identifier" + }, + "start": 8, + "type": "ObjectProperty", + "value": { + "end": 12, + "raw": "1", + "start": 11, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + }, + { + "end": 18, + "key": { + "end": 15, + "name": "b", + "start": 14, + "type": "Identifier" + }, + "start": 14, + "type": "ObjectProperty", + "value": { + "end": 18, + "raw": "2", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 2.0 + } + } + ], + "start": 6, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 20, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 50, + "id": { + "end": 31, + "name": "height", + "start": 25, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 46, + "left": { + "computed": false, + "end": 43, + "object": { + "end": 38, + "name": "obj", + "start": 35, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 42, + "raw": "\"a\"", + "start": 39, + "type": "Literal", + "type": "Literal", + "value": "a" + }, + "start": 35, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "operator": "-", + "right": { + "end": 46, + "raw": "1", + "start": 45, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 35, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 49, + "raw": "0", + "start": 48, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 50, + "start": 34, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 25, + "type": "VariableDeclarator" + }, + "end": 50, + "kind": "const", + "start": 25, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 50, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__n.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__n.snap new file mode 100644 index 000000000..443fd4f56 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__n.snap @@ -0,0 +1,64 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 18, + "id": { + "end": 6, + "name": "height", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 18, + "left": { + "end": 10, + "raw": "1", + "start": 9, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "operator": "-", + "right": { + "computed": false, + "end": 18, + "object": { + "end": 16, + "name": "obj", + "start": 13, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 18, + "name": "a", + "start": 17, + "type": "Identifier", + "type": "Identifier" + }, + "start": 13, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 9, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 18, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 18, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__o.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__o.snap new file mode 100644 index 000000000..0f73fddfc --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__o.snap @@ -0,0 +1,66 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 15, + "id": { + "end": 3, + "name": "six", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 15, + "left": { + "end": 11, + "left": { + "end": 7, + "raw": "1", + "start": 6, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "operator": "+", + "right": { + "end": 11, + "raw": "2", + "start": 10, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 6, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "end": 15, + "raw": "3", + "start": 14, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "start": 6, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 15, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 15, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__p.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__p.snap new file mode 100644 index 000000000..b19329c1a --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__p.snap @@ -0,0 +1,66 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 16, + "id": { + "end": 4, + "name": "five", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 16, + "left": { + "end": 12, + "left": { + "end": 8, + "raw": "3", + "start": 7, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "operator": "*", + "right": { + "end": 12, + "raw": "1", + "start": 11, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 7, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "end": 16, + "raw": "2", + "start": 15, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 7, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 16, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 16, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__q.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__q.snap new file mode 100644 index 000000000..b2bf9ff2a --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__q.snap @@ -0,0 +1,66 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 24, + "id": { + "end": 6, + "name": "height", + "start": 0, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "computed": false, + "end": 19, + "object": { + "end": 14, + "name": "obj", + "start": 11, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 18, + "raw": "\"a\"", + "start": 15, + "type": "Literal", + "type": "Literal", + "value": "a" + }, + "start": 11, + "type": "MemberExpression", + "type": "MemberExpression" + }, + { + "end": 22, + "raw": "0", + "start": 21, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 24, + "start": 9, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 24, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 24, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__r.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__r.snap new file mode 100644 index 000000000..511926a15 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__r.snap @@ -0,0 +1,114 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 20, + "id": { + "end": 3, + "name": "obj", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 20, + "properties": [ + { + "end": 12, + "key": { + "end": 9, + "name": "a", + "start": 8, + "type": "Identifier" + }, + "start": 8, + "type": "ObjectProperty", + "value": { + "end": 12, + "raw": "1", + "start": 11, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + }, + { + "end": 18, + "key": { + "end": 15, + "name": "b", + "start": 14, + "type": "Identifier" + }, + "start": 14, + "type": "ObjectProperty", + "value": { + "end": 18, + "raw": "2", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 2.0 + } + } + ], + "start": 6, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 20, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 42, + "id": { + "end": 31, + "name": "height", + "start": 25, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 42, + "object": { + "end": 37, + "name": "obj", + "start": 34, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 41, + "raw": "\"a\"", + "start": 38, + "type": "Literal", + "type": "Literal", + "value": "a" + }, + "start": 34, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 25, + "type": "VariableDeclarator" + }, + "end": 42, + "kind": "const", + "start": 25, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 42, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__s.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__s.snap new file mode 100644 index 000000000..24a506c9c --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__s.snap @@ -0,0 +1,64 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 21, + "id": { + "end": 4, + "name": "prop", + "start": 0, + "type": "Identifier" + }, + "init": { + "computed": true, + "end": 21, + "object": { + "computed": false, + "end": 16, + "object": { + "end": 9, + "name": "yo", + "start": 7, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 15, + "raw": "\"one\"", + "start": 10, + "type": "Literal", + "type": "Literal", + "value": "one" + }, + "start": 7, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "property": { + "end": 20, + "name": "two", + "start": 17, + "type": "Identifier", + "type": "Identifier" + }, + "start": 7, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 21, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 21, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__t.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__t.snap new file mode 100644 index 000000000..b86a97197 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__t.snap @@ -0,0 +1,49 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 11, + "id": { + "end": 3, + "name": "pt1", + "start": 0, + "type": "Identifier" + }, + "init": { + "computed": true, + "end": 11, + "object": { + "end": 8, + "name": "b1", + "start": 6, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 10, + "name": "x", + "start": 9, + "type": "Identifier", + "type": "Identifier" + }, + "start": 6, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 11, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 11, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__u.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__u.snap new file mode 100644 index 000000000..b5d19e46c --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__u.snap @@ -0,0 +1,91 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 28, + "id": { + "end": 4, + "name": "prop", + "start": 0, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 28, + "object": { + "computed": false, + "end": 23, + "object": { + "computed": false, + "end": 17, + "object": { + "computed": false, + "end": 13, + "object": { + "end": 9, + "name": "yo", + "start": 7, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 13, + "name": "one", + "start": 10, + "type": "Identifier", + "type": "Identifier" + }, + "start": 7, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "property": { + "end": 17, + "name": "two", + "start": 14, + "type": "Identifier", + "type": "Identifier" + }, + "start": 7, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "property": { + "end": 23, + "name": "three", + "start": 18, + "type": "Identifier", + "type": "Identifier" + }, + "start": 7, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "property": { + "end": 28, + "name": "four", + "start": 24, + "type": "Identifier", + "type": "Identifier" + }, + "start": 7, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 28, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 28, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__v.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__v.snap new file mode 100644 index 000000000..aaf44697a --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__v.snap @@ -0,0 +1,50 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 11, + "id": { + "end": 3, + "name": "pt1", + "start": 0, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 11, + "object": { + "end": 8, + "name": "b1", + "start": 6, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 10, + "raw": "0", + "start": 9, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "start": 6, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 11, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 11, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__w.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__w.snap new file mode 100644 index 000000000..81986cac7 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__w.snap @@ -0,0 +1,50 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 16, + "id": { + "end": 3, + "name": "pt1", + "start": 0, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 16, + "object": { + "end": 8, + "name": "b1", + "start": 6, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 15, + "raw": "'zero'", + "start": 9, + "type": "Literal", + "type": "Literal", + "value": "zero" + }, + "start": 6, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 16, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 16, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__x.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__x.snap new file mode 100644 index 000000000..87e8d91f3 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__x.snap @@ -0,0 +1,49 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 13, + "id": { + "end": 3, + "name": "pt1", + "start": 0, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 13, + "object": { + "end": 8, + "name": "b1", + "start": 6, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 13, + "name": "zero", + "start": 9, + "type": "Identifier", + "type": "Identifier" + }, + "start": 6, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 13, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 13, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__y.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__y.snap new file mode 100644 index 000000000..1fb756600 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__y.snap @@ -0,0 +1,49 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 23, + "id": { + "end": 2, + "name": "sg", + "start": 0, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 22, + "name": "pos", + "start": 19, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 18, + "name": "startSketchAt", + "start": 5, + "type": "Identifier" + }, + "end": 23, + "start": 5, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 23, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 23, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__z.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__z.snap new file mode 100644 index 000000000..b14cfc097 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__z.snap @@ -0,0 +1,107 @@ +--- +source: kcl/src/parsing/parser.rs +expression: actual +--- +{ + "body": [ + { + "declaration": { + "end": 47, + "id": { + "end": 2, + "name": "sg", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 22, + "name": "pos", + "start": 19, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 18, + "name": "startSketchAt", + "start": 5, + "type": "Identifier" + }, + "end": 23, + "start": 5, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 34, + "raw": "0", + "start": 33, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 42, + "name": "scale", + "start": 37, + "type": "Identifier", + "type": "Identifier" + }, + "end": 42, + "operator": "-", + "start": 36, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 43, + "start": 32, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 46, + "start": 45, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 31, + "name": "line", + "start": 27, + "type": "Identifier" + }, + "end": 47, + "start": 27, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 47, + "start": 5, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 47, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 47, + "start": 0 +} diff --git a/src/wasm-lib/kcl/src/parsing/token/mod.rs b/src/wasm-lib/kcl/src/parsing/token/mod.rs new file mode 100644 index 000000000..559711eca --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/token/mod.rs @@ -0,0 +1,508 @@ +// Clippy does not agree with rustc here for some reason. +#![allow(clippy::needless_lifetimes)] + +use std::{fmt, iter::Enumerate, num::NonZeroUsize, str::FromStr}; + +use anyhow::Result; +use parse_display::Display; +use tokeniser::Input; +use tower_lsp::lsp_types::SemanticTokenType; +use winnow::{ + self, + error::ParseError, + stream::{ContainsToken, Stream}, +}; + +use crate::{ + errors::KclError, + parsing::ast::types::{ItemVisibility, VariableKind}, + source_range::{ModuleId, SourceRange}, + CompilationError, +}; + +mod tokeniser; + +#[cfg(test)] +pub(crate) use tokeniser::RESERVED_WORDS; + +// Note the ordering, it's important that `m` comes after `mm` and `cm`. +pub const NUM_SUFFIXES: [&str; 9] = ["mm", "cm", "m", "inch", "in", "ft", "yd", "deg", "rad"]; + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum NumericSuffix { + None, + Count, + Mm, + Cm, + M, + Inch, + Ft, + Yd, + Deg, + Rad, +} + +impl NumericSuffix { + #[allow(dead_code)] + pub fn is_none(self) -> bool { + self == Self::None + } + + pub fn is_some(self) -> bool { + self != Self::None + } +} + +impl FromStr for NumericSuffix { + type Err = CompilationError; + + fn from_str(s: &str) -> Result { + match s { + "_" => Ok(NumericSuffix::Count), + "mm" => Ok(NumericSuffix::Mm), + "cm" => Ok(NumericSuffix::Cm), + "m" => Ok(NumericSuffix::M), + "inch" | "in" => Ok(NumericSuffix::Inch), + "ft" => Ok(NumericSuffix::Ft), + "yd" => Ok(NumericSuffix::Yd), + "deg" => Ok(NumericSuffix::Deg), + "rad" => Ok(NumericSuffix::Rad), + _ => Err(CompilationError::err(SourceRange::default(), "invalid unit of measure")), + } + } +} + +#[derive(Clone, Debug, PartialEq)] +pub(crate) struct TokenStream { + tokens: Vec, +} + +impl TokenStream { + fn new(tokens: Vec) -> Self { + Self { tokens } + } + + pub(super) fn remove_unknown(&mut self) -> Vec { + let tokens = std::mem::take(&mut self.tokens); + let (tokens, unknown_tokens): (Vec, Vec) = tokens + .into_iter() + .partition(|token| token.token_type != TokenType::Unknown); + self.tokens = tokens; + unknown_tokens + } + + pub fn iter(&self) -> impl Iterator { + self.tokens.iter() + } + + pub fn is_empty(&self) -> bool { + self.tokens.is_empty() + } + + pub fn as_slice(&self) -> TokenSlice { + TokenSlice::from(self) + } +} + +impl<'a> From<&'a TokenStream> for TokenSlice<'a> { + fn from(stream: &'a TokenStream) -> Self { + TokenSlice { + start: 0, + end: stream.tokens.len(), + stream, + } + } +} + +impl IntoIterator for TokenStream { + type Item = Token; + + type IntoIter = std::vec::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.tokens.into_iter() + } +} + +#[derive(Debug, Clone)] +pub(crate) struct TokenSlice<'a> { + stream: &'a TokenStream, + start: usize, + end: usize, +} + +impl<'a> std::ops::Deref for TokenSlice<'a> { + type Target = [Token]; + + fn deref(&self) -> &Self::Target { + &self.stream.tokens[self.start..self.end] + } +} + +impl<'a> TokenSlice<'a> { + pub fn token(&self, i: usize) -> &Token { + &self.stream.tokens[i + self.start] + } + + pub fn iter(&self) -> impl Iterator { + (**self).iter() + } + + pub fn without_ends(&self) -> Self { + Self { + start: self.start + 1, + end: self.end - 1, + stream: self.stream, + } + } +} + +impl<'a> IntoIterator for TokenSlice<'a> { + type Item = &'a Token; + + type IntoIter = std::slice::Iter<'a, Token>; + + fn into_iter(self) -> Self::IntoIter { + self.stream.tokens[self.start..self.end].iter() + } +} + +impl<'a> Stream for TokenSlice<'a> { + type Token = Token; + type Slice = Self; + type IterOffsets = Enumerate>; + type Checkpoint = Checkpoint; + + fn iter_offsets(&self) -> Self::IterOffsets { + #[allow(clippy::unnecessary_to_owned)] + self.to_vec().into_iter().enumerate() + } + + fn eof_offset(&self) -> usize { + self.len() + } + + fn next_token(&mut self) -> Option { + let token = self.first()?.clone(); + self.start += 1; + Some(token) + } + + fn offset_for

    (&self, predicate: P) -> Option + where + P: Fn(Self::Token) -> bool, + { + self.iter().position(|b| predicate(b.clone())) + } + + fn offset_at(&self, tokens: usize) -> Result { + if let Some(needed) = tokens.checked_sub(self.len()).and_then(NonZeroUsize::new) { + Err(winnow::error::Needed::Size(needed)) + } else { + Ok(tokens) + } + } + + fn next_slice(&mut self, offset: usize) -> Self::Slice { + assert!(self.start + offset <= self.end); + + let next = TokenSlice { + stream: self.stream, + start: self.start, + end: self.start + offset, + }; + self.start += offset; + next + } + + fn checkpoint(&self) -> Self::Checkpoint { + Checkpoint(self.start, self.end) + } + + fn reset(&mut self, checkpoint: &Self::Checkpoint) { + self.start = checkpoint.0; + self.end = checkpoint.1; + } + + fn raw(&self) -> &dyn fmt::Debug { + self + } +} + +impl<'a> winnow::stream::Offset for TokenSlice<'a> { + fn offset_from(&self, start: &Self) -> usize { + self.start - start.start + } +} + +impl<'a> winnow::stream::Offset for TokenSlice<'a> { + fn offset_from(&self, start: &Checkpoint) -> usize { + self.start - start.0 + } +} + +impl winnow::stream::Offset for Checkpoint { + fn offset_from(&self, start: &Self) -> usize { + self.0 - start.0 + } +} + +impl<'a> winnow::stream::StreamIsPartial for TokenSlice<'a> { + type PartialState = (); + + fn complete(&mut self) -> Self::PartialState {} + + fn restore_partial(&mut self, _: Self::PartialState) {} + + fn is_partial_supported() -> bool { + false + } +} + +#[derive(Clone, Debug)] +pub struct Checkpoint(usize, usize); + +/// The types of tokens. +#[derive(Debug, PartialEq, Eq, Copy, Clone, Display)] +#[display(style = "camelCase")] +pub enum TokenType { + /// A number. + Number, + /// A word. + Word, + /// An operator. + Operator, + /// A string. + String, + /// A keyword. + Keyword, + /// A type. + Type, + /// A brace. + Brace, + /// A hash. + Hash, + /// A bang. + Bang, + /// A dollar sign. + Dollar, + /// Whitespace. + Whitespace, + /// A comma. + Comma, + /// A colon. + Colon, + /// A period. + Period, + /// A double period: `..`. + DoublePeriod, + /// A line comment. + LineComment, + /// A block comment. + BlockComment, + /// A function name. + Function, + /// Unknown lexemes. + Unknown, + /// The ? symbol, used for optional values. + QuestionMark, + /// The @ symbol. + At, +} + +/// Most KCL tokens correspond to LSP semantic tokens (but not all). +impl TryFrom for SemanticTokenType { + type Error = anyhow::Error; + fn try_from(token_type: TokenType) -> Result { + // If you return a new kind of `SemanticTokenType`, make sure to update `SEMANTIC_TOKEN_TYPES` + // in the LSP implementation. + Ok(match token_type { + TokenType::Number => Self::NUMBER, + TokenType::Word => Self::VARIABLE, + TokenType::Keyword => Self::KEYWORD, + TokenType::Type => Self::TYPE, + TokenType::Operator => Self::OPERATOR, + TokenType::QuestionMark => Self::OPERATOR, + TokenType::String => Self::STRING, + TokenType::Bang => Self::OPERATOR, + TokenType::LineComment => Self::COMMENT, + TokenType::BlockComment => Self::COMMENT, + TokenType::Function => Self::FUNCTION, + TokenType::Whitespace + | TokenType::Brace + | TokenType::Comma + | TokenType::Colon + | TokenType::Period + | TokenType::DoublePeriod + | TokenType::Hash + | TokenType::Dollar + | TokenType::At + | TokenType::Unknown => { + anyhow::bail!("unsupported token type: {:?}", token_type) + } + }) + } +} + +impl TokenType { + pub fn is_whitespace(&self) -> bool { + matches!(self, Self::Whitespace) + } + + pub fn is_comment(&self) -> bool { + matches!(self, Self::LineComment | Self::BlockComment) + } +} + +#[derive(Debug, PartialEq, Eq, Clone)] +pub struct Token { + pub token_type: TokenType, + /// Offset in the source code where this token begins. + pub start: usize, + /// Offset in the source code where this token ends. + pub end: usize, + pub(super) module_id: ModuleId, + pub(super) value: String, +} + +impl ContainsToken for (TokenType, &str) { + fn contains_token(&self, token: Token) -> bool { + self.0 == token.token_type && self.1 == token.value + } +} + +impl ContainsToken for TokenType { + fn contains_token(&self, token: Token) -> bool { + *self == token.token_type + } +} + +impl Token { + pub fn from_range( + range: std::ops::Range, + module_id: ModuleId, + token_type: TokenType, + value: String, + ) -> Self { + Self { + start: range.start, + end: range.end, + module_id, + value, + token_type, + } + } + pub fn is_code_token(&self) -> bool { + !matches!( + self.token_type, + TokenType::Whitespace | TokenType::LineComment | TokenType::BlockComment + ) + } + + pub fn as_source_range(&self) -> SourceRange { + SourceRange::new(self.start, self.end, self.module_id) + } + + pub fn as_source_ranges(&self) -> Vec { + vec![self.as_source_range()] + } + + pub fn visibility_keyword(&self) -> Option { + if !matches!(self.token_type, TokenType::Keyword) { + return None; + } + match self.value.as_str() { + "export" => Some(ItemVisibility::Export), + _ => None, + } + } + + pub fn numeric_value(&self) -> Option { + if self.token_type != TokenType::Number { + return None; + } + let value = &self.value; + let value = value + .split_once(|c: char| c == '_' || c.is_ascii_alphabetic()) + .map(|(s, _)| s) + .unwrap_or(value); + value.parse().ok() + } + + pub fn numeric_suffix(&self) -> NumericSuffix { + if self.token_type != TokenType::Number { + return NumericSuffix::None; + } + + if self.value.ends_with('_') { + return NumericSuffix::Count; + } + + for suffix in NUM_SUFFIXES { + if self.value.ends_with(suffix) { + return suffix.parse().unwrap(); + } + } + + NumericSuffix::None + } + + /// Is this token the beginning of a variable/function declaration? + /// If so, what kind? + /// If not, returns None. + pub fn declaration_keyword(&self) -> Option { + if !matches!(self.token_type, TokenType::Keyword) { + return None; + } + Some(match self.value.as_str() { + "fn" => VariableKind::Fn, + "var" | "let" | "const" => VariableKind::Const, + _ => return None, + }) + } +} + +impl From for SourceRange { + fn from(token: Token) -> Self { + Self::new(token.start, token.end, token.module_id) + } +} + +impl From<&Token> for SourceRange { + fn from(token: &Token) -> Self { + Self::new(token.start, token.end, token.module_id) + } +} + +pub fn lex(s: &str, module_id: ModuleId) -> Result { + tokeniser::lex(s, module_id).map_err(From::from) +} + +impl From, winnow::error::ContextError>> for KclError { + fn from(err: ParseError, winnow::error::ContextError>) -> Self { + let (input, offset): (Vec, usize) = (err.input().chars().collect(), err.offset()); + let module_id = err.input().state.module_id; + + if offset >= input.len() { + // From the winnow docs: + // + // This is an offset, not an index, and may point to + // the end of input (input.len()) on eof errors. + + return KclError::Lexical(crate::errors::KclErrorDetails { + source_ranges: vec![SourceRange::new(offset, offset, module_id)], + message: "unexpected EOF while parsing".to_string(), + }); + } + + // TODO: Add the Winnow tokenizer context to the error. + // See https://github.com/KittyCAD/modeling-app/issues/784 + let bad_token = &input[offset]; + // TODO: Add the Winnow parser context to the error. + // See https://github.com/KittyCAD/modeling-app/issues/784 + KclError::Lexical(crate::errors::KclErrorDetails { + source_ranges: vec![SourceRange::new(offset, offset + 1, module_id)], + message: format!("found unknown token '{}'", bad_token), + }) + } +} diff --git a/src/wasm-lib/kcl/src/parsing/token/snapshots/kcl_lib__parsing__token__tokeniser__tests__program2.snap b/src/wasm-lib/kcl/src/parsing/token/snapshots/kcl_lib__parsing__token__tokeniser__tests__program2.snap new file mode 100644 index 000000000..4518b52c2 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/token/snapshots/kcl_lib__parsing__token__tokeniser__tests__program2.snap @@ -0,0 +1,1014 @@ +--- +source: kcl/src/parsing/token/tokeniser.rs +expression: actual.tokens +--- +[ + Token { + token_type: Keyword, + start: 0, + end: 5, + module_id: ModuleId( + 1, + ), + value: "const", + }, + Token { + token_type: Whitespace, + start: 5, + end: 6, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Word, + start: 6, + end: 13, + module_id: ModuleId( + 1, + ), + value: "part001", + }, + Token { + token_type: Whitespace, + start: 13, + end: 14, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Operator, + start: 14, + end: 15, + module_id: ModuleId( + 1, + ), + value: "=", + }, + Token { + token_type: Whitespace, + start: 15, + end: 16, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Word, + start: 16, + end: 29, + module_id: ModuleId( + 1, + ), + value: "startSketchAt", + }, + Token { + token_type: Brace, + start: 29, + end: 30, + module_id: ModuleId( + 1, + ), + value: "(", + }, + Token { + token_type: Brace, + start: 30, + end: 31, + module_id: ModuleId( + 1, + ), + value: "[", + }, + Token { + token_type: Number, + start: 31, + end: 43, + module_id: ModuleId( + 1, + ), + value: "0.0000000000", + }, + Token { + token_type: Comma, + start: 43, + end: 44, + module_id: ModuleId( + 1, + ), + value: ",", + }, + Token { + token_type: Whitespace, + start: 44, + end: 45, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Number, + start: 45, + end: 57, + module_id: ModuleId( + 1, + ), + value: "5.0000000000", + }, + Token { + token_type: Brace, + start: 57, + end: 58, + module_id: ModuleId( + 1, + ), + value: "]", + }, + Token { + token_type: Brace, + start: 58, + end: 59, + module_id: ModuleId( + 1, + ), + value: ")", + }, + Token { + token_type: Whitespace, + start: 59, + end: 64, + module_id: ModuleId( + 1, + ), + value: "\n ", + }, + Token { + token_type: Operator, + start: 64, + end: 66, + module_id: ModuleId( + 1, + ), + value: "|>", + }, + Token { + token_type: Whitespace, + start: 66, + end: 67, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Word, + start: 67, + end: 71, + module_id: ModuleId( + 1, + ), + value: "line", + }, + Token { + token_type: Brace, + start: 71, + end: 72, + module_id: ModuleId( + 1, + ), + value: "(", + }, + Token { + token_type: Brace, + start: 72, + end: 73, + module_id: ModuleId( + 1, + ), + value: "[", + }, + Token { + token_type: Number, + start: 73, + end: 85, + module_id: ModuleId( + 1, + ), + value: "0.4900857016", + }, + Token { + token_type: Comma, + start: 85, + end: 86, + module_id: ModuleId( + 1, + ), + value: ",", + }, + Token { + token_type: Whitespace, + start: 86, + end: 87, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Operator, + start: 87, + end: 88, + module_id: ModuleId( + 1, + ), + value: "-", + }, + Token { + token_type: Number, + start: 88, + end: 100, + module_id: ModuleId( + 1, + ), + value: "0.0240763666", + }, + Token { + token_type: Brace, + start: 100, + end: 101, + module_id: ModuleId( + 1, + ), + value: "]", + }, + Token { + token_type: Comma, + start: 101, + end: 102, + module_id: ModuleId( + 1, + ), + value: ",", + }, + Token { + token_type: Whitespace, + start: 102, + end: 103, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Operator, + start: 103, + end: 104, + module_id: ModuleId( + 1, + ), + value: "%", + }, + Token { + token_type: Brace, + start: 104, + end: 105, + module_id: ModuleId( + 1, + ), + value: ")", + }, + Token { + token_type: Whitespace, + start: 105, + end: 107, + module_id: ModuleId( + 1, + ), + value: "\n\n", + }, + Token { + token_type: Keyword, + start: 107, + end: 112, + module_id: ModuleId( + 1, + ), + value: "const", + }, + Token { + token_type: Whitespace, + start: 112, + end: 113, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Word, + start: 113, + end: 120, + module_id: ModuleId( + 1, + ), + value: "part002", + }, + Token { + token_type: Whitespace, + start: 120, + end: 121, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Operator, + start: 121, + end: 122, + module_id: ModuleId( + 1, + ), + value: "=", + }, + Token { + token_type: Whitespace, + start: 122, + end: 123, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: String, + start: 123, + end: 132, + module_id: ModuleId( + 1, + ), + value: "\"part002\"", + }, + Token { + token_type: Whitespace, + start: 132, + end: 133, + module_id: ModuleId( + 1, + ), + value: "\n", + }, + Token { + token_type: Keyword, + start: 133, + end: 138, + module_id: ModuleId( + 1, + ), + value: "const", + }, + Token { + token_type: Whitespace, + start: 138, + end: 139, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Word, + start: 139, + end: 145, + module_id: ModuleId( + 1, + ), + value: "things", + }, + Token { + token_type: Whitespace, + start: 145, + end: 146, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Operator, + start: 146, + end: 147, + module_id: ModuleId( + 1, + ), + value: "=", + }, + Token { + token_type: Whitespace, + start: 147, + end: 148, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Brace, + start: 148, + end: 149, + module_id: ModuleId( + 1, + ), + value: "[", + }, + Token { + token_type: Word, + start: 149, + end: 156, + module_id: ModuleId( + 1, + ), + value: "part001", + }, + Token { + token_type: Comma, + start: 156, + end: 157, + module_id: ModuleId( + 1, + ), + value: ",", + }, + Token { + token_type: Whitespace, + start: 157, + end: 158, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Number, + start: 158, + end: 161, + module_id: ModuleId( + 1, + ), + value: "0.0", + }, + Token { + token_type: Brace, + start: 161, + end: 162, + module_id: ModuleId( + 1, + ), + value: "]", + }, + Token { + token_type: Whitespace, + start: 162, + end: 163, + module_id: ModuleId( + 1, + ), + value: "\n", + }, + Token { + token_type: Keyword, + start: 163, + end: 166, + module_id: ModuleId( + 1, + ), + value: "let", + }, + Token { + token_type: Whitespace, + start: 166, + end: 167, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Word, + start: 167, + end: 171, + module_id: ModuleId( + 1, + ), + value: "blah", + }, + Token { + token_type: Whitespace, + start: 171, + end: 172, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Operator, + start: 172, + end: 173, + module_id: ModuleId( + 1, + ), + value: "=", + }, + Token { + token_type: Whitespace, + start: 173, + end: 174, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Number, + start: 174, + end: 175, + module_id: ModuleId( + 1, + ), + value: "1", + }, + Token { + token_type: Whitespace, + start: 175, + end: 176, + module_id: ModuleId( + 1, + ), + value: "\n", + }, + Token { + token_type: Keyword, + start: 176, + end: 181, + module_id: ModuleId( + 1, + ), + value: "const", + }, + Token { + token_type: Whitespace, + start: 181, + end: 182, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Word, + start: 182, + end: 185, + module_id: ModuleId( + 1, + ), + value: "foo", + }, + Token { + token_type: Whitespace, + start: 185, + end: 186, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Operator, + start: 186, + end: 187, + module_id: ModuleId( + 1, + ), + value: "=", + }, + Token { + token_type: Whitespace, + start: 187, + end: 188, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Keyword, + start: 188, + end: 193, + module_id: ModuleId( + 1, + ), + value: "false", + }, + Token { + token_type: Whitespace, + start: 193, + end: 194, + module_id: ModuleId( + 1, + ), + value: "\n", + }, + Token { + token_type: Keyword, + start: 194, + end: 197, + module_id: ModuleId( + 1, + ), + value: "let", + }, + Token { + token_type: Whitespace, + start: 197, + end: 198, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Word, + start: 198, + end: 201, + module_id: ModuleId( + 1, + ), + value: "baz", + }, + Token { + token_type: Whitespace, + start: 201, + end: 202, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Operator, + start: 202, + end: 203, + module_id: ModuleId( + 1, + ), + value: "=", + }, + Token { + token_type: Whitespace, + start: 203, + end: 204, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Brace, + start: 204, + end: 205, + module_id: ModuleId( + 1, + ), + value: "{", + }, + Token { + token_type: Word, + start: 205, + end: 206, + module_id: ModuleId( + 1, + ), + value: "a", + }, + Token { + token_type: Colon, + start: 206, + end: 207, + module_id: ModuleId( + 1, + ), + value: ":", + }, + Token { + token_type: Whitespace, + start: 207, + end: 208, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Number, + start: 208, + end: 209, + module_id: ModuleId( + 1, + ), + value: "1", + }, + Token { + token_type: Comma, + start: 209, + end: 210, + module_id: ModuleId( + 1, + ), + value: ",", + }, + Token { + token_type: Whitespace, + start: 210, + end: 211, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Word, + start: 211, + end: 218, + module_id: ModuleId( + 1, + ), + value: "part001", + }, + Token { + token_type: Colon, + start: 218, + end: 219, + module_id: ModuleId( + 1, + ), + value: ":", + }, + Token { + token_type: Whitespace, + start: 219, + end: 220, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: String, + start: 220, + end: 227, + module_id: ModuleId( + 1, + ), + value: "\"thing\"", + }, + Token { + token_type: Brace, + start: 227, + end: 228, + module_id: ModuleId( + 1, + ), + value: "}", + }, + Token { + token_type: Whitespace, + start: 228, + end: 230, + module_id: ModuleId( + 1, + ), + value: "\n\n", + }, + Token { + token_type: Keyword, + start: 230, + end: 232, + module_id: ModuleId( + 1, + ), + value: "fn", + }, + Token { + token_type: Whitespace, + start: 232, + end: 233, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Word, + start: 233, + end: 236, + module_id: ModuleId( + 1, + ), + value: "ghi", + }, + Token { + token_type: Whitespace, + start: 236, + end: 237, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Operator, + start: 237, + end: 238, + module_id: ModuleId( + 1, + ), + value: "=", + }, + Token { + token_type: Whitespace, + start: 238, + end: 239, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Brace, + start: 239, + end: 240, + module_id: ModuleId( + 1, + ), + value: "(", + }, + Token { + token_type: Word, + start: 240, + end: 247, + module_id: ModuleId( + 1, + ), + value: "part001", + }, + Token { + token_type: Brace, + start: 247, + end: 248, + module_id: ModuleId( + 1, + ), + value: ")", + }, + Token { + token_type: Whitespace, + start: 248, + end: 249, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Operator, + start: 249, + end: 251, + module_id: ModuleId( + 1, + ), + value: "=>", + }, + Token { + token_type: Whitespace, + start: 251, + end: 252, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Brace, + start: 252, + end: 253, + module_id: ModuleId( + 1, + ), + value: "{", + }, + Token { + token_type: Whitespace, + start: 253, + end: 256, + module_id: ModuleId( + 1, + ), + value: "\n ", + }, + Token { + token_type: Keyword, + start: 256, + end: 262, + module_id: ModuleId( + 1, + ), + value: "return", + }, + Token { + token_type: Whitespace, + start: 262, + end: 263, + module_id: ModuleId( + 1, + ), + value: " ", + }, + Token { + token_type: Word, + start: 263, + end: 270, + module_id: ModuleId( + 1, + ), + value: "part001", + }, + Token { + token_type: Whitespace, + start: 270, + end: 271, + module_id: ModuleId( + 1, + ), + value: "\n", + }, + Token { + token_type: Brace, + start: 271, + end: 272, + module_id: ModuleId( + 1, + ), + value: "}", + }, + Token { + token_type: Whitespace, + start: 272, + end: 274, + module_id: ModuleId( + 1, + ), + value: "\n\n", + }, + Token { + token_type: Word, + start: 274, + end: 278, + module_id: ModuleId( + 1, + ), + value: "show", + }, + Token { + token_type: Brace, + start: 278, + end: 279, + module_id: ModuleId( + 1, + ), + value: "(", + }, + Token { + token_type: Word, + start: 279, + end: 286, + module_id: ModuleId( + 1, + ), + value: "part001", + }, + Token { + token_type: Brace, + start: 286, + end: 287, + module_id: ModuleId( + 1, + ), + value: ")", + }, +] diff --git a/src/wasm-lib/kcl/src/parsing/token/tokeniser.rs b/src/wasm-lib/kcl/src/parsing/token/tokeniser.rs new file mode 100644 index 000000000..bd7625f15 --- /dev/null +++ b/src/wasm-lib/kcl/src/parsing/token/tokeniser.rs @@ -0,0 +1,779 @@ +use fnv::FnvHashMap; +use lazy_static::lazy_static; +use winnow::{ + ascii::{digit1, multispace1}, + combinator::{alt, opt, peek, preceded, repeat}, + error::{ContextError, ParseError}, + prelude::*, + stream::{Location, Stream}, + token::{any, none_of, one_of, take_till, take_until}, + Located, Stateful, +}; + +use super::TokenStream; +use crate::{ + parsing::token::{Token, TokenType}, + source_range::ModuleId, +}; + +lazy_static! { + pub(crate) static ref RESERVED_WORDS: FnvHashMap<&'static str, TokenType> = { + let mut set = FnvHashMap::default(); + set.insert("if", TokenType::Keyword); + set.insert("else", TokenType::Keyword); + set.insert("for", TokenType::Keyword); + set.insert("while", TokenType::Keyword); + set.insert("return", TokenType::Keyword); + set.insert("break", TokenType::Keyword); + set.insert("continue", TokenType::Keyword); + set.insert("fn", TokenType::Keyword); + set.insert("let", TokenType::Keyword); + set.insert("mut", TokenType::Keyword); + set.insert("as", TokenType::Keyword); + set.insert("loop", TokenType::Keyword); + set.insert("true", TokenType::Keyword); + set.insert("false", TokenType::Keyword); + set.insert("nil", TokenType::Keyword); + // This isn't a type because brackets are used for the type. + set.insert("array", TokenType::Keyword); + set.insert("and", TokenType::Keyword); + set.insert("or", TokenType::Keyword); + set.insert("not", TokenType::Keyword); + set.insert("var", TokenType::Keyword); + set.insert("const", TokenType::Keyword); + // "import" is special because of import(). + set.insert("export", TokenType::Keyword); + set.insert("type", TokenType::Keyword); + set.insert("interface", TokenType::Keyword); + set.insert("new", TokenType::Keyword); + set.insert("self", TokenType::Keyword); + set.insert("record", TokenType::Keyword); + set.insert("struct", TokenType::Keyword); + set.insert("object", TokenType::Keyword); + + set.insert("string", TokenType::Type); + set.insert("number", TokenType::Type); + set.insert("bool", TokenType::Type); + set.insert("sketch", TokenType::Type); + set.insert("sketch_surface", TokenType::Type); + set.insert("solid", TokenType::Type); + + set + }; +} + +pub(super) fn lex(i: &str, module_id: ModuleId) -> Result, ContextError>> { + let state = State::new(module_id); + let input = Input { + input: Located::new(i), + state, + }; + Ok(TokenStream::new(repeat(0.., token).parse(input)?)) +} + +pub(super) type Input<'a> = Stateful, State>; + +#[derive(Debug, Clone)] +pub(super) struct State { + pub module_id: ModuleId, +} + +impl State { + fn new(module_id: ModuleId) -> Self { + Self { module_id } + } +} + +pub(super) fn token(i: &mut Input<'_>) -> PResult { + match winnow::combinator::dispatch! {peek(any); + '"' | '\'' => string, + '/' => alt((line_comment, block_comment, operator)), + '{' | '(' | '[' => brace_start, + '}' | ')' | ']' => brace_end, + ',' => comma, + '?' => question_mark, + '@' => at, + '0'..='9' => number, + ':' => colon, + '.' => alt((number, double_period, period)), + '#' => hash, + '$' => dollar, + '!' => alt((operator, bang)), + ' ' | '\t' | '\n' => whitespace, + _ => alt((operator, keyword_type_or_word)) + } + .parse_next(i) + { + Ok(token) => Ok(token), + Err(x) => { + // TODO: Handle non ascii cases + if i.len() == 0 || !i.is_ascii() { + return Err(x); + } + + Ok(Token::from_range( + i.location()..i.location() + 1, + i.state.module_id, + TokenType::Unknown, + i.next_slice(1).to_string(), + )) + } + } +} + +fn block_comment(i: &mut Input<'_>) -> PResult { + let inner = ("/*", take_until(0.., "*/"), "*/").take(); + let (value, range) = inner.with_span().parse_next(i)?; + Ok(Token::from_range( + range, + i.state.module_id, + TokenType::BlockComment, + value.to_string(), + )) +} + +fn line_comment(i: &mut Input<'_>) -> PResult { + let inner = (r#"//"#, take_till(0.., ['\n', '\r'])).take(); + let (value, range) = inner.with_span().parse_next(i)?; + Ok(Token::from_range( + range, + i.state.module_id, + TokenType::LineComment, + value.to_string(), + )) +} + +fn number(i: &mut Input<'_>) -> PResult { + let number_parser = alt(( + // Digits before the decimal point. + (digit1, opt(('.', digit1)), opt('_'), opt(alt(super::NUM_SUFFIXES))).map(|_| ()), + // No digits before the decimal point. + ('.', digit1, opt('_'), opt(alt(super::NUM_SUFFIXES))).map(|_| ()), + )); + let (value, range) = number_parser.take().with_span().parse_next(i)?; + Ok(Token::from_range( + range, + i.state.module_id, + TokenType::Number, + value.to_string(), + )) +} + +fn whitespace(i: &mut Input<'_>) -> PResult { + let (value, range) = multispace1.with_span().parse_next(i)?; + Ok(Token::from_range( + range, + i.state.module_id, + TokenType::Whitespace, + value.to_string(), + )) +} + +fn inner_word(i: &mut Input<'_>) -> PResult<()> { + one_of(('a'..='z', 'A'..='Z', '_')).parse_next(i)?; + repeat::<_, _, (), _, _>(0.., one_of(('a'..='z', 'A'..='Z', '0'..='9', '_'))).parse_next(i)?; + Ok(()) +} + +fn word(i: &mut Input<'_>) -> PResult { + let (value, range) = inner_word.take().with_span().parse_next(i)?; + Ok(Token::from_range( + range, + i.state.module_id, + TokenType::Word, + value.to_string(), + )) +} + +fn operator(i: &mut Input<'_>) -> PResult { + let (value, range) = alt(( + ">=", "<=", "==", "=>", "!=", "|>", "*", "+", "-", "/", "%", "=", "<", ">", r"\", "^", "|", "&", + )) + .with_span() + .parse_next(i)?; + Ok(Token::from_range( + range, + i.state.module_id, + TokenType::Operator, + value.to_string(), + )) +} + +fn brace_start(i: &mut Input<'_>) -> PResult { + let (value, range) = alt(('{', '(', '[')).with_span().parse_next(i)?; + Ok(Token::from_range( + range, + i.state.module_id, + TokenType::Brace, + value.to_string(), + )) +} + +fn brace_end(i: &mut Input<'_>) -> PResult { + let (value, range) = alt(('}', ')', ']')).with_span().parse_next(i)?; + Ok(Token::from_range( + range, + i.state.module_id, + TokenType::Brace, + value.to_string(), + )) +} + +fn comma(i: &mut Input<'_>) -> PResult { + let (value, range) = ','.with_span().parse_next(i)?; + Ok(Token::from_range( + range, + i.state.module_id, + TokenType::Comma, + value.to_string(), + )) +} + +fn hash(i: &mut Input<'_>) -> PResult { + let (value, range) = '#'.with_span().parse_next(i)?; + Ok(Token::from_range( + range, + i.state.module_id, + TokenType::Hash, + value.to_string(), + )) +} + +fn bang(i: &mut Input<'_>) -> PResult { + let (value, range) = '!'.with_span().parse_next(i)?; + Ok(Token::from_range( + range, + i.state.module_id, + TokenType::Bang, + value.to_string(), + )) +} + +fn dollar(i: &mut Input<'_>) -> PResult { + let (value, range) = '$'.with_span().parse_next(i)?; + Ok(Token::from_range( + range, + i.state.module_id, + TokenType::Dollar, + value.to_string(), + )) +} + +fn question_mark(i: &mut Input<'_>) -> PResult { + let (value, range) = '?'.with_span().parse_next(i)?; + Ok(Token::from_range( + range, + i.state.module_id, + TokenType::QuestionMark, + value.to_string(), + )) +} + +fn at(i: &mut Input<'_>) -> PResult { + let (value, range) = '@'.with_span().parse_next(i)?; + Ok(Token::from_range( + range, + i.state.module_id, + TokenType::At, + value.to_string(), + )) +} + +fn colon(i: &mut Input<'_>) -> PResult { + let (value, range) = ':'.with_span().parse_next(i)?; + Ok(Token::from_range( + range, + i.state.module_id, + TokenType::Colon, + value.to_string(), + )) +} + +fn period(i: &mut Input<'_>) -> PResult { + let (value, range) = '.'.with_span().parse_next(i)?; + Ok(Token::from_range( + range, + i.state.module_id, + TokenType::Period, + value.to_string(), + )) +} + +fn double_period(i: &mut Input<'_>) -> PResult { + let (value, range) = "..".with_span().parse_next(i)?; + Ok(Token::from_range( + range, + i.state.module_id, + TokenType::DoublePeriod, + value.to_string(), + )) +} + +/// Zero or more of either: +/// 1. Any character except " or \ +/// 2. Any character preceded by \ +fn inner_double_quote(i: &mut Input<'_>) -> PResult<()> { + repeat(0.., alt((none_of(('"', '\\')), preceded('\\', winnow::token::any)))).parse_next(i) +} + +/// Zero or more of either: +/// 1. Any character except ' or \ +/// 2. Any character preceded by \ +fn inner_single_quote(i: &mut Input<'_>) -> PResult<()> { + repeat(0.., alt((none_of(('\'', '\\')), preceded('\\', winnow::token::any)))).parse_next(i) +} + +fn string(i: &mut Input<'_>) -> PResult { + let single_quoted_string = ('\'', inner_single_quote.take(), '\''); + let double_quoted_string = ('"', inner_double_quote.take(), '"'); + let either_quoted_string = alt((single_quoted_string.take(), double_quoted_string.take())); + let (value, range): (&str, _) = either_quoted_string.with_span().parse_next(i)?; + Ok(Token::from_range( + range, + i.state.module_id, + TokenType::String, + value.to_string(), + )) +} + +fn import_keyword(i: &mut Input<'_>) -> PResult { + let (value, range) = "import".with_span().parse_next(i)?; + let token_type = peek(alt((' '.map(|_| TokenType::Keyword), '('.map(|_| TokenType::Word)))).parse_next(i)?; + Ok(Token::from_range( + range, + i.state.module_id, + token_type, + value.to_owned(), + )) +} + +fn unambiguous_keyword_type_or_word(i: &mut Input<'_>) -> PResult { + let mut w = word.parse_next(i)?; + if let Some(token_type) = RESERVED_WORDS.get(w.value.as_str()) { + w.token_type = *token_type; + } + Ok(w) +} + +fn keyword_type_or_word(i: &mut Input<'_>) -> PResult { + alt((import_keyword, unambiguous_keyword_type_or_word)).parse_next(i) +} + +#[cfg(test)] +mod tests { + use winnow::Located; + + use super::*; + use crate::parsing::token::TokenSlice; + + fn assert_parse_err<'i, P, O, E>(mut p: P, s: &'i str) + where + O: std::fmt::Debug, + P: Parser, O, E>, + { + let state = State::new(ModuleId::default()); + let mut input = Input { + input: Located::new(s), + state, + }; + assert!(p.parse_next(&mut input).is_err(), "parsed {s} but should have failed"); + } + + // Returns the token and whether any more input is remaining to tokenize. + fn assert_parse_ok<'i, P, O, E>(mut p: P, s: &'i str) -> (O, bool) + where + E: std::fmt::Debug, + O: std::fmt::Debug, + P: Parser, O, E>, + { + let state = State::new(ModuleId::default()); + let mut input = Input { + input: Located::new(s), + state, + }; + let res = p.parse_next(&mut input); + assert!(res.is_ok(), "failed to parse {s}, got {}", res.unwrap_err()); + (res.unwrap(), !input.is_empty()) + } + + #[test] + fn test_number() { + for (valid, expected) in [ + ("1", false), + ("1 abc", true), + ("1.1", false), + ("1.1 abv", true), + ("1.1 abv", true), + ("1", false), + (".1", false), + ("5?", true), + ("5 + 6", true), + ("5 + a", true), + ("5.5", false), + ("1abc", true), + ] { + let (_, remaining) = assert_parse_ok(number, valid); + assert_eq!(expected, remaining, "`{valid}` expected another token to be {expected}"); + } + + for invalid in ["a", "?", "?5"] { + assert_parse_err(number, invalid); + } + + let module_id = ModuleId::from_usize(1); + let input = Input { + input: Located::new("0.0000000000"), + state: State::new(module_id), + }; + + assert_eq!(number.parse(input).unwrap().value, "0.0000000000"); + } + + #[test] + fn test_number_suffix() { + for (valid, expected_val, expected_next) in [ + ("1_", 1.0, false), + ("1_mm", 1.0, false), + ("1_yd", 1.0, false), + ("1m", 1.0, false), + ("1inch", 1.0, false), + ("1toot", 1.0, true), + ("1.4inch t", 1.4, true), + ] { + let (t, remaining) = assert_parse_ok(number, valid); + assert_eq!(expected_next, remaining); + assert_eq!( + Some(expected_val), + t.numeric_value(), + "{valid} has incorrect numeric value, expected {expected_val} {t:?}" + ); + } + } + + #[test] + fn test_word() { + for valid in ["a", "a ", "a5", "a5a"] { + assert_parse_ok(word, valid); + } + + for invalid in ["5", "5a", "5a5"] { + assert_parse_err(word, invalid); + } + } + + #[test] + fn test_operator() { + for valid in [ + "+", "+ ", "-", "<=", "<= ", ">=", ">= ", "> ", "< ", "|> ", "^ ", "% ", "+* ", "| ", "& ", + ] { + assert_parse_ok(operator, valid); + } + + for invalid in ["5 + 5", "a", "a+", "a+5", "5a+5", ", newVar", ","] { + assert_parse_err(operator, invalid); + } + } + + #[test] + fn test_string() { + for valid in [ + "\"\"", + "\"a\"", + "\"a\" ", + "\"a\"5", + "'a'5", + "\"with escaped \\\" backslash\"", + "\'with escaped \\\' backslash\'", + "'c'", + ] { + assert_parse_ok(string, valid); + } + + for invalid in ["\"", "\"a", "a\"", " \"a\"", "5\"a\"", "a + 'str'"] { + assert_parse_err(string, invalid); + } + } + + #[track_caller] + fn assert_tokens(expected: &[(TokenType, usize, usize)], actual: TokenSlice) { + let mut e = 0; + let mut issues = vec![]; + for a in actual { + if expected[e].0 != a.token_type { + if a.token_type == TokenType::Whitespace { + continue; + } + issues.push(format!( + "Type mismatch: expected `{}`, found `{}` (`{a:?}`), at index {e}", + expected[e].0, a.token_type + )); + } + + if expected[e].1 != a.start || expected[e].2 != a.end { + issues.push(format!( + "Source range mismatch: expected {}-{}, found {}-{} (`{a:?}`), at index {e}", + expected[e].1, expected[e].2, a.start, a.end + )); + } + + e += 1; + } + if e < expected.len() { + issues.push(format!("Expected `{}` tokens, found `{e}`", expected.len())); + } + assert!(issues.is_empty(), "{}", issues.join("\n")); + } + + #[test] + fn test_program0() { + let program = "const a=5"; + let module_id = ModuleId::from_usize(1); + let actual = lex(program, module_id).unwrap(); + + use TokenType::*; + assert_tokens( + &[(Keyword, 0, 5), (Word, 6, 7), (Operator, 7, 8), (Number, 8, 9)], + actual.as_slice(), + ); + } + + #[test] + fn test_program1() { + let program = "54 + 22500 + 6"; + let module_id = ModuleId::from_usize(1); + let actual = lex(program, module_id).unwrap(); + + use TokenType::*; + assert_tokens( + &[ + (Number, 0, 2), + (Operator, 3, 4), + (Number, 5, 10), + (Operator, 11, 12), + (Number, 13, 14), + ], + actual.as_slice(), + ); + } + + #[test] + fn test_program2() { + let program = r#"const part001 = startSketchAt([0.0000000000, 5.0000000000]) + |> line([0.4900857016, -0.0240763666], %) + +const part002 = "part002" +const things = [part001, 0.0] +let blah = 1 +const foo = false +let baz = {a: 1, part001: "thing"} + +fn ghi = (part001) => { + return part001 +} + +show(part001)"#; + let module_id = ModuleId::from_usize(1); + let actual = lex(program, module_id).unwrap(); + insta::assert_debug_snapshot!(actual.tokens); + } + + #[test] + fn test_program3() { + let program = r#" +// this is a comment +const yo = { a: { b: { c: '123' } } } + +const key = 'c' +const things = "things" + +// this is also a comment"#; + let module_id = ModuleId::from_usize(1); + let actual = lex(program, module_id).unwrap(); + + use TokenType::*; + assert_tokens( + &[ + (Whitespace, 0, 1), + (LineComment, 1, 21), + (Whitespace, 21, 22), + (Keyword, 22, 27), + (Whitespace, 27, 28), + (Word, 28, 30), + (Whitespace, 30, 31), + (Operator, 31, 32), + (Whitespace, 32, 33), + (Brace, 33, 34), + (Whitespace, 34, 35), + (Word, 35, 36), + (Colon, 36, 37), + (Whitespace, 37, 38), + (Brace, 38, 39), + (Whitespace, 39, 40), + (Word, 40, 41), + (Colon, 41, 42), + (Whitespace, 42, 43), + (Brace, 43, 44), + (Whitespace, 44, 45), + (Word, 45, 46), + (Colon, 46, 47), + (Whitespace, 47, 48), + (String, 48, 53), + (Whitespace, 53, 54), + (Brace, 54, 55), + (Whitespace, 55, 56), + (Brace, 56, 57), + (Whitespace, 57, 58), + (Brace, 58, 59), + (Whitespace, 59, 61), + (Keyword, 61, 66), + (Whitespace, 66, 67), + (Word, 67, 70), + (Whitespace, 70, 71), + (Operator, 71, 72), + (Whitespace, 72, 73), + (String, 73, 76), + (Whitespace, 76, 77), + (Keyword, 77, 82), + (Whitespace, 82, 83), + (Word, 83, 89), + (Whitespace, 89, 90), + (Operator, 90, 91), + (Whitespace, 91, 92), + (String, 92, 100), + (Whitespace, 100, 102), + (LineComment, 102, 127), + ], + actual.as_slice(), + ); + } + + #[test] + fn test_program4() { + let program = "const myArray = [0..10]"; + let module_id = ModuleId::from_usize(1); + let actual = lex(program, module_id).unwrap(); + + use TokenType::*; + assert_tokens( + &[ + (Keyword, 0, 5), + (Word, 6, 13), + (Operator, 14, 15), + (Brace, 16, 17), + (Number, 17, 18), + (DoublePeriod, 18, 20), + (Number, 20, 22), + (Brace, 22, 23), + ], + actual.as_slice(), + ); + } + + #[test] + fn test_lexer_negative_word() { + let module_id = ModuleId::from_usize(1); + let actual = lex("-legX", module_id).unwrap(); + + use TokenType::*; + assert_tokens(&[(Operator, 0, 1), (Word, 1, 5)], actual.as_slice()); + } + + #[test] + fn not_eq() { + let module_id = ModuleId::from_usize(1); + let actual = lex("!=", module_id).unwrap(); + let expected = vec![Token { + token_type: TokenType::Operator, + value: "!=".to_owned(), + start: 0, + end: 2, + module_id, + }]; + assert_eq!(actual.tokens, expected); + } + + #[test] + fn test_unrecognized_token() { + let module_id = ModuleId::from_usize(1); + let actual = lex("12 ; 8", module_id).unwrap(); + + use TokenType::*; + assert_tokens(&[(Number, 0, 2), (Unknown, 3, 4), (Number, 5, 6)], actual.as_slice()); + } + + #[test] + fn import_keyword() { + let module_id = ModuleId::from_usize(1); + let actual = lex("import foo", module_id).unwrap(); + let expected = Token { + token_type: TokenType::Keyword, + value: "import".to_owned(), + start: 0, + end: 6, + module_id, + }; + assert_eq!(actual.tokens[0], expected); + } + + #[test] + fn import_function() { + let module_id = ModuleId::from_usize(1); + let actual = lex("import(3)", module_id).unwrap(); + let expected = Token { + token_type: TokenType::Word, + value: "import".to_owned(), + start: 0, + end: 6, + module_id, + }; + assert_eq!(actual.tokens[0], expected); + } + + #[test] + fn test_is_code_token() { + let module_id = ModuleId::default(); + let actual = lex("foo (4/* comment */ +,2,\"sdfsdf\") // comment", module_id).unwrap(); + let non_code = [1, 4, 5, 12, 13]; + for i in 0..14 { + if non_code.contains(&i) { + assert!( + !actual.tokens[i].is_code_token(), + "failed test {i}: {:?}", + &actual.tokens[i], + ); + } else { + assert!( + actual.tokens[i].is_code_token(), + "failed test {i}: {:?}", + &actual.tokens[i], + ); + } + } + } + #[test] + fn test_boolean_literal() { + let module_id = ModuleId::default(); + let actual = lex("true", module_id).unwrap(); + let expected = Token { + token_type: TokenType::Keyword, + value: "true".to_owned(), + start: 0, + end: 4, + module_id, + }; + assert_eq!(actual.tokens[0], expected); + } + #[test] + fn test_word_starting_with_keyword() { + let module_id = ModuleId::default(); + let actual = lex("truee", module_id).unwrap(); + let expected = Token { + token_type: TokenType::Word, + value: "truee".to_owned(), + start: 0, + end: 5, + module_id, + }; + assert_eq!(actual.tokens[0], expected); + } +} diff --git a/src/wasm-lib/kcl/src/settings/types/mod.rs b/src/wasm-lib/kcl/src/settings/types/mod.rs index 231a99836..cc04f7fa8 100644 --- a/src/wasm-lib/kcl/src/settings/types/mod.rs +++ b/src/wasm-lib/kcl/src/settings/types/mod.rs @@ -9,7 +9,6 @@ use serde::{Deserialize, Serialize}; use validator::{Validate, ValidateRange}; const DEFAULT_THEME_COLOR: f64 = 264.5; -pub const DEFAULT_PROJECT_KCL_FILE: &str = "main.kcl"; const DEFAULT_PROJECT_NAME_TEMPLATE: &str = "project-$nnn"; /// High level configuration. @@ -381,9 +380,9 @@ impl From for kittycad_modeling_cmds::units::UnitLength { #[display(style = "snake_case")] pub enum MouseControlType { #[default] - #[display("kittycad")] - #[serde(rename = "kittycad", alias = "KittyCAD")] - KittyCad, + #[display("zoo")] + #[serde(rename = "zoo", alias = "Zoo", alias = "KittyCAD")] + Zoo, #[display("onshape")] #[serde(rename = "onshape", alias = "OnShape")] OnShape, @@ -478,6 +477,10 @@ pub struct CommandBarSettings { #[serde(rename_all = "snake_case")] #[display(style = "snake_case")] pub enum OnboardingStatus { + /// The unset state. + #[serde(rename = "")] + #[display("")] + Unset, /// The user has completed onboarding. Completed, /// The user has not completed onboarding. diff --git a/src/wasm-lib/kcl/src/simulation_tests.rs b/src/wasm-lib/kcl/src/simulation_tests.rs new file mode 100644 index 000000000..f2b78c045 --- /dev/null +++ b/src/wasm-lib/kcl/src/simulation_tests.rs @@ -0,0 +1,1742 @@ +use std::path::Path; + +use insta::rounded_redaction; + +use crate::{ + errors::KclError, + parsing::ast::types::{Node, Program}, + source_range::ModuleId, +}; + +/// Deserialize the data from a snapshot. +fn get(snapshot: &str) -> T { + let mut parts = snapshot.split("---"); + let _empty = parts.next().unwrap(); + let _header = parts.next().unwrap(); + let snapshot_data = parts.next().unwrap(); + serde_json::from_str(snapshot_data) + .and_then(serde_json::from_value) + .unwrap() +} + +fn assert_snapshot(test_name: &str, operation: &str, f: F) +where + F: FnOnce() -> R, +{ + let mut settings = insta::Settings::clone_current(); + // These make the snapshots more readable and match our dir structure. + settings.set_omit_expression(true); + settings.set_snapshot_path(format!("../tests/{test_name}")); + settings.set_prepend_module_to_snapshot(false); + settings.set_description(format!("{operation} {test_name}.kcl")); + // Sorting maps makes them easier to diff. + settings.set_sort_maps(true); + // Replace UUIDs with the string "[uuid]", because otherwise the tests would constantly + // be changing the UUID. This is a stopgap measure until we make the engine more deterministic. + settings.add_filter( + r"\b[[:xdigit:]]{8}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{12}\b", + "[uuid]", + ); + // Run `f` (the closure that was passed in) with these settings. + settings.bind(f); +} + +fn read(filename: &'static str, test_name: &str) -> String { + std::fs::read_to_string(format!("tests/{test_name}/{filename}")).unwrap() +} + +fn parse(test_name: &str) { + let input = read("input.kcl", test_name); + let tokens = crate::parsing::token::lex(&input, ModuleId::default()).unwrap(); + + // Parse the tokens into an AST. + let parse_res = Result::<_, KclError>::Ok(crate::parsing::parse_tokens(tokens).unwrap()); + assert_snapshot(test_name, "Result of parsing", || { + insta::assert_json_snapshot!("ast", parse_res); + }); +} + +fn unparse(test_name: &str) { + let input = read("ast.snap", test_name); + let ast_res: Result = get(&input); + let Ok(ast) = ast_res else { + return; + }; + // Check recasting the AST produces the original string. + let actual = ast.recast(&Default::default(), 0); + if matches!(std::env::var("EXPECTORATE").as_deref(), Ok("overwrite")) { + std::fs::write(format!("tests/{test_name}/input.kcl"), &actual).unwrap(); + } + let expected = read("input.kcl", test_name); + pretty_assertions::assert_eq!( + actual, + expected, + "Parse then unparse didn't recreate the original KCL file" + ); +} + +async fn execute(test_name: &str, render_to_png: bool) { + // Read the AST from disk. + let input = read("ast.snap", test_name); + let ast_res: Result, KclError> = get(&input); + let Ok(ast) = ast_res else { + return; + }; + + // Run the program. + let exec_res = crate::test_server::execute_and_snapshot_ast( + ast.into(), + crate::settings::types::UnitLength::Mm, + Some(Path::new("tests").join(test_name)), + ) + .await; + match exec_res { + Ok((program_memory, ops, png)) => { + if render_to_png { + twenty_twenty::assert_image(format!("tests/{test_name}/rendered_model.png"), &png, 0.99); + } + assert_snapshot(test_name, "Program memory after executing", || { + insta::assert_json_snapshot!("program_memory", program_memory, { + ".environments[].**[].from[]" => rounded_redaction(4), + ".environments[].**[].to[]" => rounded_redaction(4), + ".environments[].**[].x[]" => rounded_redaction(4), + ".environments[].**[].y[]" => rounded_redaction(4), + ".environments[].**[].z[]" => rounded_redaction(4), + }); + }); + assert_snapshot(test_name, "Operations executed", || { + insta::assert_json_snapshot!("ops", ops); + }); + } + Err(e) => { + match e.error { + crate::errors::ExecError::Kcl(error) => { + // Snapshot the KCL error with a fancy graphical report. + // This looks like a Cargo compile error, with arrows pointing + // to source code, underlines, etc. + let report = crate::errors::Report { + error, + filename: format!("{test_name}.kcl"), + kcl_source: read("input.kcl", test_name), + }; + let report = miette::Report::new(report); + let report = format!("{:?}", report); + + assert_snapshot(test_name, "Error from executing", || { + insta::assert_snapshot!("execution_error", report); + }); + + assert_snapshot(test_name, "Operations executed", || { + insta::assert_json_snapshot!("ops", e.exec_state.mod_local.operations); + }); + } + e => { + // These kinds of errors aren't expected to occur. We don't + // snapshot them because they indicate there's something wrong + // with the Rust test, not with the KCL code being tested. + panic!("{e}") + } + }; + } + } +} + +mod cube { + const TEST_NAME: &str = "cube"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod helix_ccw { + const TEST_NAME: &str = "helix_ccw"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod double_map_fn { + const TEST_NAME: &str = "double_map_fn"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod property_of_object { + const TEST_NAME: &str = "property_of_object"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod index_of_array { + const TEST_NAME: &str = "index_of_array"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod comparisons { + const TEST_NAME: &str = "comparisons"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod array_range_expr { + const TEST_NAME: &str = "array_range_expr"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod array_range_negative_expr { + const TEST_NAME: &str = "array_range_negative_expr"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod sketch_in_object { + const TEST_NAME: &str = "sketch_in_object"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod if_else { + const TEST_NAME: &str = "if_else"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod add_lots { + const TEST_NAME: &str = "add_lots"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod argument_error { + //! The argument error points to the problematic argument in the call site, + //! not the function definition that the variable points to. + + const TEST_NAME: &str = "argument_error"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod array_elem_push { + const TEST_NAME: &str = "array_elem_push"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod invalid_index_str { + const TEST_NAME: &str = "invalid_index_str"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod invalid_index_negative { + const TEST_NAME: &str = "invalid_index_negative"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod invalid_index_fractional { + const TEST_NAME: &str = "invalid_index_fractional"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod invalid_member_object { + const TEST_NAME: &str = "invalid_member_object"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod invalid_member_object_prop { + const TEST_NAME: &str = "invalid_member_object_prop"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod non_string_key_of_object { + const TEST_NAME: &str = "non_string_key_of_object"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod array_index_oob { + const TEST_NAME: &str = "array_index_oob"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod object_prop_not_found { + const TEST_NAME: &str = "object_prop_not_found"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod pipe_substitution_inside_function_called_from_pipeline { + const TEST_NAME: &str = "pipe_substitution_inside_function_called_from_pipeline"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod comparisons_multiple { + const TEST_NAME: &str = "comparisons_multiple"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod import_cycle1 { + const TEST_NAME: &str = "import_cycle1"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod import_constant { + const TEST_NAME: &str = "import_constant"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod import_export { + const TEST_NAME: &str = "import_export"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod import_glob { + const TEST_NAME: &str = "import_glob"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod import_whole { + const TEST_NAME: &str = "import_whole"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod import_side_effect { + const TEST_NAME: &str = "import_side_effect"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod array_elem_push_fail { + const TEST_NAME: &str = "array_elem_push_fail"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod sketch_on_face { + const TEST_NAME: &str = "sketch_on_face"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod poop_chute { + const TEST_NAME: &str = "poop_chute"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod neg_xz_plane { + const TEST_NAME: &str = "neg_xz_plane"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod xz_plane { + const TEST_NAME: &str = "xz_plane"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod sketch_on_face_after_fillets_referencing_face { + const TEST_NAME: &str = "sketch_on_face_after_fillets_referencing_face"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod circular_pattern3d_a_pattern { + const TEST_NAME: &str = "circular_pattern3d_a_pattern"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod linear_pattern3d_a_pattern { + const TEST_NAME: &str = "linear_pattern3d_a_pattern"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod tangential_arc { + const TEST_NAME: &str = "tangential_arc"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod big_number_angle_to_match_length_x { + const TEST_NAME: &str = "big_number_angle_to_match_length_x"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod big_number_angle_to_match_length_y { + const TEST_NAME: &str = "big_number_angle_to_match_length_y"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod sketch_on_face_circle_tagged { + const TEST_NAME: &str = "sketch_on_face_circle_tagged"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod basic_fillet_cube_start { + const TEST_NAME: &str = "basic_fillet_cube_start"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod basic_fillet_cube_next_adjacent { + const TEST_NAME: &str = "basic_fillet_cube_next_adjacent"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod basic_fillet_cube_previous_adjacent { + const TEST_NAME: &str = "basic_fillet_cube_previous_adjacent"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod basic_fillet_cube_end { + const TEST_NAME: &str = "basic_fillet_cube_end"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod basic_fillet_cube_close_opposite { + const TEST_NAME: &str = "basic_fillet_cube_close_opposite"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod sketch_on_face_end { + const TEST_NAME: &str = "sketch_on_face_end"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod sketch_on_face_start { + const TEST_NAME: &str = "sketch_on_face_start"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod sketch_on_face_end_negative_extrude { + const TEST_NAME: &str = "sketch_on_face_end_negative_extrude"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod mike_stress_test { + const TEST_NAME: &str = "mike_stress_test"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod pentagon_fillet_sugar { + const TEST_NAME: &str = "pentagon_fillet_sugar"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod pipe_as_arg { + const TEST_NAME: &str = "pipe_as_arg"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod computed_var { + const TEST_NAME: &str = "computed_var"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod riddle_small { + const TEST_NAME: &str = "riddle_small"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod tan_arc_x_line { + const TEST_NAME: &str = "tan_arc_x_line"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod fillet_and_shell { + const TEST_NAME: &str = "fillet-and-shell"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod sketch_on_chamfer_two_times { + const TEST_NAME: &str = "sketch-on-chamfer-two-times"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod sketch_on_chamfer_two_times_different_order { + const TEST_NAME: &str = "sketch-on-chamfer-two-times-different-order"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod parametric_with_tan_arc { + const TEST_NAME: &str = "parametric_with_tan_arc"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod parametric { + const TEST_NAME: &str = "parametric"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod angled_line { + const TEST_NAME: &str = "angled_line"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod function_sketch_with_position { + const TEST_NAME: &str = "function_sketch_with_position"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod function_sketch { + const TEST_NAME: &str = "function_sketch"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod i_shape { + const TEST_NAME: &str = "i_shape"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod kittycad_svg { + const TEST_NAME: &str = "kittycad_svg"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod kw_fn { + const TEST_NAME: &str = "kw_fn"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod kw_fn_too_few_args { + const TEST_NAME: &str = "kw_fn_too_few_args"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod kw_fn_unlabeled_but_has_label { + const TEST_NAME: &str = "kw_fn_unlabeled_but_has_label"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod kw_fn_with_defaults { + const TEST_NAME: &str = "kw_fn_with_defaults"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod boolean_logical_and { + const TEST_NAME: &str = "boolean_logical_and"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod boolean_logical_or { + const TEST_NAME: &str = "boolean_logical_or"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod boolean_logical_multiple { + const TEST_NAME: &str = "boolean_logical_multiple"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod circle_three_point { + const TEST_NAME: &str = "circle_three_point"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod array_elem_pop { + const TEST_NAME: &str = "array_elem_pop"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod array_elem_pop_empty_fail { + const TEST_NAME: &str = "array_elem_pop_empty_fail"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} +mod array_elem_pop_fail { + const TEST_NAME: &str = "array_elem_pop_fail"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await + } +} diff --git a/src/wasm-lib/kcl/src/snapshots/kcl_lib__tests__tokenize_cube.snap b/src/wasm-lib/kcl/src/snapshots/kcl_lib__tests__tokenize_cube.snap new file mode 100644 index 000000000..73a6d1acc --- /dev/null +++ b/src/wasm-lib/kcl/src/snapshots/kcl_lib__tests__tokenize_cube.snap @@ -0,0 +1,969 @@ +--- +source: kcl/src/tests.rs +expression: tokens +--- +Ok: + - type: keyword + start: 0 + end: 2 + value: fn + - type: whitespace + start: 2 + end: 3 + value: " " + - type: word + start: 3 + end: 9 + value: square + - type: whitespace + start: 9 + end: 10 + value: " " + - type: operator + start: 10 + end: 11 + value: "=" + - type: whitespace + start: 11 + end: 12 + value: " " + - type: brace + start: 12 + end: 13 + value: ( + - type: word + start: 13 + end: 19 + value: length + - type: comma + start: 19 + end: 20 + value: "," + - type: whitespace + start: 20 + end: 21 + value: " " + - type: word + start: 21 + end: 27 + value: center + - type: brace + start: 27 + end: 28 + value: ) + - type: whitespace + start: 28 + end: 29 + value: " " + - type: operator + start: 29 + end: 31 + value: "=>" + - type: whitespace + start: 31 + end: 32 + value: " " + - type: brace + start: 32 + end: 33 + value: "{" + - type: whitespace + start: 33 + end: 36 + value: "\n " + - type: word + start: 36 + end: 37 + value: l + - type: whitespace + start: 37 + end: 38 + value: " " + - type: operator + start: 38 + end: 39 + value: "=" + - type: whitespace + start: 39 + end: 40 + value: " " + - type: word + start: 40 + end: 46 + value: length + - type: whitespace + start: 46 + end: 47 + value: " " + - type: operator + start: 47 + end: 48 + value: / + - type: whitespace + start: 48 + end: 49 + value: " " + - type: number + start: 49 + end: 50 + value: "2" + - type: whitespace + start: 50 + end: 53 + value: "\n " + - type: word + start: 53 + end: 54 + value: x + - type: whitespace + start: 54 + end: 55 + value: " " + - type: operator + start: 55 + end: 56 + value: "=" + - type: whitespace + start: 56 + end: 57 + value: " " + - type: word + start: 57 + end: 63 + value: center + - type: brace + start: 63 + end: 64 + value: "[" + - type: number + start: 64 + end: 65 + value: "0" + - type: brace + start: 65 + end: 66 + value: "]" + - type: whitespace + start: 66 + end: 69 + value: "\n " + - type: word + start: 69 + end: 70 + value: y + - type: whitespace + start: 70 + end: 71 + value: " " + - type: operator + start: 71 + end: 72 + value: "=" + - type: whitespace + start: 72 + end: 73 + value: " " + - type: word + start: 73 + end: 79 + value: center + - type: brace + start: 79 + end: 80 + value: "[" + - type: number + start: 80 + end: 81 + value: "1" + - type: brace + start: 81 + end: 82 + value: "]" + - type: whitespace + start: 82 + end: 85 + value: "\n " + - type: word + start: 85 + end: 87 + value: p0 + - type: whitespace + start: 87 + end: 88 + value: " " + - type: operator + start: 88 + end: 89 + value: "=" + - type: whitespace + start: 89 + end: 90 + value: " " + - type: brace + start: 90 + end: 91 + value: "[" + - type: operator + start: 91 + end: 92 + value: "-" + - type: word + start: 92 + end: 93 + value: l + - type: whitespace + start: 93 + end: 94 + value: " " + - type: operator + start: 94 + end: 95 + value: + + - type: whitespace + start: 95 + end: 96 + value: " " + - type: word + start: 96 + end: 97 + value: x + - type: comma + start: 97 + end: 98 + value: "," + - type: whitespace + start: 98 + end: 99 + value: " " + - type: operator + start: 99 + end: 100 + value: "-" + - type: word + start: 100 + end: 101 + value: l + - type: whitespace + start: 101 + end: 102 + value: " " + - type: operator + start: 102 + end: 103 + value: + + - type: whitespace + start: 103 + end: 104 + value: " " + - type: word + start: 104 + end: 105 + value: y + - type: brace + start: 105 + end: 106 + value: "]" + - type: whitespace + start: 106 + end: 109 + value: "\n " + - type: word + start: 109 + end: 111 + value: p1 + - type: whitespace + start: 111 + end: 112 + value: " " + - type: operator + start: 112 + end: 113 + value: "=" + - type: whitespace + start: 113 + end: 114 + value: " " + - type: brace + start: 114 + end: 115 + value: "[" + - type: operator + start: 115 + end: 116 + value: "-" + - type: word + start: 116 + end: 117 + value: l + - type: whitespace + start: 117 + end: 118 + value: " " + - type: operator + start: 118 + end: 119 + value: + + - type: whitespace + start: 119 + end: 120 + value: " " + - type: word + start: 120 + end: 121 + value: x + - type: comma + start: 121 + end: 122 + value: "," + - type: whitespace + start: 122 + end: 124 + value: " " + - type: word + start: 124 + end: 125 + value: l + - type: whitespace + start: 125 + end: 126 + value: " " + - type: operator + start: 126 + end: 127 + value: + + - type: whitespace + start: 127 + end: 128 + value: " " + - type: word + start: 128 + end: 129 + value: y + - type: brace + start: 129 + end: 130 + value: "]" + - type: whitespace + start: 130 + end: 133 + value: "\n " + - type: word + start: 133 + end: 135 + value: p2 + - type: whitespace + start: 135 + end: 136 + value: " " + - type: operator + start: 136 + end: 137 + value: "=" + - type: whitespace + start: 137 + end: 138 + value: " " + - type: brace + start: 138 + end: 139 + value: "[" + - type: whitespace + start: 139 + end: 140 + value: " " + - type: word + start: 140 + end: 141 + value: l + - type: whitespace + start: 141 + end: 142 + value: " " + - type: operator + start: 142 + end: 143 + value: + + - type: whitespace + start: 143 + end: 144 + value: " " + - type: word + start: 144 + end: 145 + value: x + - type: comma + start: 145 + end: 146 + value: "," + - type: whitespace + start: 146 + end: 148 + value: " " + - type: word + start: 148 + end: 149 + value: l + - type: whitespace + start: 149 + end: 150 + value: " " + - type: operator + start: 150 + end: 151 + value: + + - type: whitespace + start: 151 + end: 152 + value: " " + - type: word + start: 152 + end: 153 + value: y + - type: brace + start: 153 + end: 154 + value: "]" + - type: whitespace + start: 154 + end: 157 + value: "\n " + - type: word + start: 157 + end: 159 + value: p3 + - type: whitespace + start: 159 + end: 160 + value: " " + - type: operator + start: 160 + end: 161 + value: "=" + - type: whitespace + start: 161 + end: 162 + value: " " + - type: brace + start: 162 + end: 163 + value: "[" + - type: whitespace + start: 163 + end: 164 + value: " " + - type: word + start: 164 + end: 165 + value: l + - type: whitespace + start: 165 + end: 166 + value: " " + - type: operator + start: 166 + end: 167 + value: + + - type: whitespace + start: 167 + end: 168 + value: " " + - type: word + start: 168 + end: 169 + value: x + - type: comma + start: 169 + end: 170 + value: "," + - type: whitespace + start: 170 + end: 171 + value: " " + - type: operator + start: 171 + end: 172 + value: "-" + - type: word + start: 172 + end: 173 + value: l + - type: whitespace + start: 173 + end: 174 + value: " " + - type: operator + start: 174 + end: 175 + value: + + - type: whitespace + start: 175 + end: 176 + value: " " + - type: word + start: 176 + end: 177 + value: y + - type: brace + start: 177 + end: 178 + value: "]" + - type: whitespace + start: 178 + end: 181 + value: "\n " + - type: keyword + start: 181 + end: 187 + value: return + - type: whitespace + start: 187 + end: 188 + value: " " + - type: word + start: 188 + end: 201 + value: startSketchAt + - type: brace + start: 201 + end: 202 + value: ( + - type: word + start: 202 + end: 204 + value: p0 + - type: brace + start: 204 + end: 205 + value: ) + - type: whitespace + start: 205 + end: 210 + value: "\n " + - type: operator + start: 210 + end: 212 + value: "|>" + - type: whitespace + start: 212 + end: 213 + value: " " + - type: word + start: 213 + end: 219 + value: lineTo + - type: brace + start: 219 + end: 220 + value: ( + - type: word + start: 220 + end: 222 + value: p1 + - type: comma + start: 222 + end: 223 + value: "," + - type: whitespace + start: 223 + end: 224 + value: " " + - type: operator + start: 224 + end: 225 + value: "%" + - type: brace + start: 225 + end: 226 + value: ) + - type: whitespace + start: 226 + end: 231 + value: "\n " + - type: operator + start: 231 + end: 233 + value: "|>" + - type: whitespace + start: 233 + end: 234 + value: " " + - type: word + start: 234 + end: 240 + value: lineTo + - type: brace + start: 240 + end: 241 + value: ( + - type: word + start: 241 + end: 243 + value: p2 + - type: comma + start: 243 + end: 244 + value: "," + - type: whitespace + start: 244 + end: 245 + value: " " + - type: operator + start: 245 + end: 246 + value: "%" + - type: brace + start: 246 + end: 247 + value: ) + - type: whitespace + start: 247 + end: 252 + value: "\n " + - type: operator + start: 252 + end: 254 + value: "|>" + - type: whitespace + start: 254 + end: 255 + value: " " + - type: word + start: 255 + end: 261 + value: lineTo + - type: brace + start: 261 + end: 262 + value: ( + - type: word + start: 262 + end: 264 + value: p3 + - type: comma + start: 264 + end: 265 + value: "," + - type: whitespace + start: 265 + end: 266 + value: " " + - type: operator + start: 266 + end: 267 + value: "%" + - type: brace + start: 267 + end: 268 + value: ) + - type: whitespace + start: 268 + end: 273 + value: "\n " + - type: operator + start: 273 + end: 275 + value: "|>" + - type: whitespace + start: 275 + end: 276 + value: " " + - type: word + start: 276 + end: 282 + value: lineTo + - type: brace + start: 282 + end: 283 + value: ( + - type: word + start: 283 + end: 285 + value: p0 + - type: comma + start: 285 + end: 286 + value: "," + - type: whitespace + start: 286 + end: 287 + value: " " + - type: operator + start: 287 + end: 288 + value: "%" + - type: brace + start: 288 + end: 289 + value: ) + - type: whitespace + start: 289 + end: 294 + value: "\n " + - type: operator + start: 294 + end: 296 + value: "|>" + - type: whitespace + start: 296 + end: 297 + value: " " + - type: word + start: 297 + end: 302 + value: close + - type: brace + start: 302 + end: 303 + value: ( + - type: operator + start: 303 + end: 304 + value: "%" + - type: brace + start: 304 + end: 305 + value: ) + - type: whitespace + start: 305 + end: 306 + value: "\n" + - type: brace + start: 306 + end: 307 + value: "}" + - type: whitespace + start: 307 + end: 309 + value: "\n\n" + - type: keyword + start: 309 + end: 311 + value: fn + - type: whitespace + start: 311 + end: 312 + value: " " + - type: word + start: 312 + end: 316 + value: cube + - type: whitespace + start: 316 + end: 317 + value: " " + - type: operator + start: 317 + end: 318 + value: "=" + - type: whitespace + start: 318 + end: 319 + value: " " + - type: brace + start: 319 + end: 320 + value: ( + - type: word + start: 320 + end: 326 + value: length + - type: comma + start: 326 + end: 327 + value: "," + - type: whitespace + start: 327 + end: 328 + value: " " + - type: word + start: 328 + end: 334 + value: center + - type: brace + start: 334 + end: 335 + value: ) + - type: whitespace + start: 335 + end: 336 + value: " " + - type: operator + start: 336 + end: 338 + value: "=>" + - type: whitespace + start: 338 + end: 339 + value: " " + - type: brace + start: 339 + end: 340 + value: "{" + - type: whitespace + start: 340 + end: 343 + value: "\n " + - type: keyword + start: 343 + end: 349 + value: return + - type: whitespace + start: 349 + end: 350 + value: " " + - type: word + start: 350 + end: 356 + value: square + - type: brace + start: 356 + end: 357 + value: ( + - type: word + start: 357 + end: 363 + value: length + - type: comma + start: 363 + end: 364 + value: "," + - type: whitespace + start: 364 + end: 365 + value: " " + - type: word + start: 365 + end: 371 + value: center + - type: brace + start: 371 + end: 372 + value: ) + - type: whitespace + start: 372 + end: 377 + value: "\n " + - type: operator + start: 377 + end: 379 + value: "|>" + - type: whitespace + start: 379 + end: 380 + value: " " + - type: word + start: 380 + end: 387 + value: extrude + - type: brace + start: 387 + end: 388 + value: ( + - type: word + start: 388 + end: 394 + value: length + - type: comma + start: 394 + end: 395 + value: "," + - type: whitespace + start: 395 + end: 396 + value: " " + - type: operator + start: 396 + end: 397 + value: "%" + - type: brace + start: 397 + end: 398 + value: ) + - type: whitespace + start: 398 + end: 399 + value: "\n" + - type: brace + start: 399 + end: 400 + value: "}" + - type: whitespace + start: 400 + end: 402 + value: "\n\n" + - type: word + start: 402 + end: 407 + value: width + - type: whitespace + start: 407 + end: 408 + value: " " + - type: operator + start: 408 + end: 409 + value: "=" + - type: whitespace + start: 409 + end: 410 + value: " " + - type: number + start: 410 + end: 412 + value: "20" + - type: whitespace + start: 412 + end: 413 + value: "\n" + - type: word + start: 413 + end: 417 + value: cube + - type: brace + start: 417 + end: 418 + value: ( + - type: word + start: 418 + end: 423 + value: width + - type: comma + start: 423 + end: 424 + value: "," + - type: whitespace + start: 424 + end: 425 + value: " " + - type: brace + start: 425 + end: 426 + value: "[" + - type: number + start: 426 + end: 428 + value: "20" + - type: comma + start: 428 + end: 429 + value: "," + - type: whitespace + start: 429 + end: 430 + value: " " + - type: number + start: 430 + end: 431 + value: "0" + - type: brace + start: 431 + end: 432 + value: "]" + - type: brace + start: 432 + end: 433 + value: ) + - type: whitespace + start: 433 + end: 434 + value: "\n" diff --git a/src/wasm-lib/kcl/src/source_range.rs b/src/wasm-lib/kcl/src/source_range.rs new file mode 100644 index 000000000..7b618b3cd --- /dev/null +++ b/src/wasm-lib/kcl/src/source_range.rs @@ -0,0 +1,118 @@ +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use tower_lsp::lsp_types::{Position as LspPosition, Range as LspRange}; + +/// Identifier of a source file. Uses a u32 to keep the size small. +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize, ts_rs::TS, JsonSchema)] +#[ts(export)] +pub struct ModuleId(u32); + +impl ModuleId { + pub fn from_usize(id: usize) -> Self { + Self(u32::try_from(id).expect("module ID should fit in a u32")) + } + + pub fn as_usize(&self) -> usize { + usize::try_from(self.0).expect("module ID should fit in a usize") + } + + /// Top-level file is the one being executed. + /// Represented by module ID of 0, i.e. the default value. + pub fn is_top_level(&self) -> bool { + *self == Self::default() + } +} + +#[derive(Debug, Default, Deserialize, Serialize, PartialEq, Copy, Clone, ts_rs::TS, JsonSchema, Hash, Eq)] +#[ts(export, type = "[number, number, number]")] +pub struct SourceRange([usize; 3]); + +impl From<[usize; 3]> for SourceRange { + fn from(value: [usize; 3]) -> Self { + Self(value) + } +} + +impl From<&SourceRange> for miette::SourceSpan { + fn from(source_range: &SourceRange) -> Self { + let length = source_range.end() - source_range.start(); + let start = miette::SourceOffset::from(source_range.start()); + Self::new(start, length) + } +} + +impl From for miette::SourceSpan { + fn from(source_range: SourceRange) -> Self { + Self::from(&source_range) + } +} + +impl SourceRange { + /// Create a new source range. + pub fn new(start: usize, end: usize, module_id: ModuleId) -> Self { + Self([start, end, module_id.as_usize()]) + } + + /// A source range that doesn't correspond to any source code. + pub fn synthetic() -> Self { + Self::default() + } + + /// Get the start of the range. + pub fn start(&self) -> usize { + self.0[0] + } + + /// Get the end of the range. + pub fn end(&self) -> usize { + self.0[1] + } + + /// Get the module ID of the range. + pub fn module_id(&self) -> ModuleId { + ModuleId::from_usize(self.0[2]) + } + + /// Check if the range contains a position. + pub fn contains(&self, pos: usize) -> bool { + pos >= self.start() && pos <= self.end() + } + + pub fn start_to_lsp_position(&self, code: &str) -> LspPosition { + // Calculate the line and column of the error from the source range. + // Lines are zero indexed in vscode so we need to subtract 1. + let mut line = code.get(..self.start()).unwrap_or_default().lines().count(); + if line > 0 { + line = line.saturating_sub(1); + } + let column = code[..self.start()].lines().last().map(|l| l.len()).unwrap_or_default(); + + LspPosition { + line: line as u32, + character: column as u32, + } + } + + pub fn end_to_lsp_position(&self, code: &str) -> LspPosition { + let lines = code.get(..self.end()).unwrap_or_default().lines(); + if lines.clone().count() == 0 { + return LspPosition { line: 0, character: 0 }; + } + + // Calculate the line and column of the error from the source range. + // Lines are zero indexed in vscode so we need to subtract 1. + let line = lines.clone().count() - 1; + let column = lines.last().map(|l| l.len()).unwrap_or_default(); + + LspPosition { + line: line as u32, + character: column as u32, + } + } + + pub fn to_lsp_range(&self, code: &str) -> LspRange { + let start = self.start_to_lsp_position(code); + let end = self.end_to_lsp_position(code); + LspRange { start, end } + } +} diff --git a/src/wasm-lib/kcl/src/std/appearance.rs b/src/wasm-lib/kcl/src/std/appearance.rs new file mode 100644 index 000000000..a34866ad4 --- /dev/null +++ b/src/wasm-lib/kcl/src/std/appearance.rs @@ -0,0 +1,303 @@ +//! Standard library appearance. + +use anyhow::Result; +use derive_docs::stdlib; +use kcmc::{each_cmd as mcmd, ModelingCmd}; +use kittycad_modeling_cmds::{self as kcmc, shared::Color}; +use regex::Regex; +use rgba_simple::Hex; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use validator::Validate; + +use crate::{ + errors::{KclError, KclErrorDetails}, + execution::{ExecState, KclValue, Solid, SolidSet}, + std::Args, +}; + +lazy_static::lazy_static! { + static ref HEX_REGEX: Regex = Regex::new(r"^#[0-9a-fA-F]{6}$").unwrap(); +} + +/// Data for appearance. +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Validate)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct AppearanceData { + /// Color of the new material, a hex string like "#ff0000". + #[schemars(regex(pattern = "#[0-9a-fA-F]{6}"))] + pub color: String, + /// Metalness of the new material, a percentage like 95.7. + #[validate(range(min = 0.0, max = 100.0))] + pub metalness: Option, + /// Roughness of the new material, a percentage like 95.7. + #[validate(range(min = 0.0, max = 100.0))] + pub roughness: Option, + // TODO(jess): we can also ambient occlusion here I just don't know what it is. +} + +/// Set the appearance of a solid. This only works on solids, not sketches or individual paths. +pub async fn appearance(_exec_state: &mut ExecState, args: Args) -> Result { + let (data, solid_set): (AppearanceData, SolidSet) = args.get_data_and_solid_set()?; + + // Validate the data. + data.validate().map_err(|err| { + KclError::Semantic(KclErrorDetails { + message: format!("Invalid appearance data: {}", err), + source_ranges: vec![args.source_range], + }) + })?; + + // Make sure the color if set is valid. + if !HEX_REGEX.is_match(&data.color) { + return Err(KclError::Semantic(KclErrorDetails { + message: format!("Invalid hex color (`{}`), try something like `#fff000`", data.color), + source_ranges: vec![args.source_range], + })); + } + + let result = inner_appearance(data, solid_set, args).await?; + Ok(result.into()) +} + +/// Set the appearance of a solid. This only works on solids, not sketches or individual paths. +/// +/// This will work on any solid, including extruded solids, revolved solids, and shelled solids. +/// ```no_run +/// // Add color to an extruded solid. +/// exampleSketch = startSketchOn("XZ") +/// |> startProfileAt([0, 0], %) +/// |> lineTo([10, 0], %) +/// |> lineTo([0, 10], %) +/// |> lineTo([-10, 0], %) +/// |> close(%) +/// +/// example = extrude(5, exampleSketch) +/// |> appearance({color= '#ff0000', metalness= 50, roughness= 50}, %) +/// ``` +/// +/// ```no_run +/// // Add color to a revolved solid. +/// sketch001 = startSketchOn('XY') +/// |> circle({ center = [15, 0], radius = 5 }, %) +/// |> revolve({ angle = 360, axis = 'y' }, %) +/// |> appearance({ +/// color = '#ff0000', +/// metalness = 90, +/// roughness = 90 +/// }, %) +/// ``` +/// +/// ```no_run +/// // Add color to different solids. +/// fn cube(center) { +/// return startSketchOn('XY') +/// |> startProfileAt([center[0] - 10, center[1] - 10], %) +/// |> lineTo([center[0] + 10, center[1] - 10], %) +/// |> lineTo([center[0] + 10, center[1] + 10], %) +/// |> lineTo([center[0] - 10, center[1] + 10], %) +/// |> close(%) +/// |> extrude(10, %) +/// } +/// +/// example0 = cube([0, 0]) +/// example1 = cube([20, 0]) +/// example2 = cube([40, 0]) +/// +/// appearance({color= '#ff0000', metalness= 50, roughness= 50}, [example0, example1]) +/// appearance({color= '#00ff00', metalness= 50, roughness= 50}, example2) +/// ``` +/// +/// ```no_run +/// // You can set the appearance before or after you shell it will yield the same result. +/// // This example shows setting the appearance _after_ the shell. +/// firstSketch = startSketchOn('XY') +/// |> startProfileAt([-12, 12], %) +/// |> line([24, 0], %) +/// |> line([0, -24], %) +/// |> line([-24, 0], %) +/// |> close(%) +/// |> extrude(6, %) +/// +/// shell({ +/// faces = ['end'], +/// thickness = 0.25, +/// }, firstSketch) +/// |> appearance({ +/// color = '#ff0000', +/// metalness = 90, +/// roughness = 90 +/// }, %) +/// ``` +/// +/// ```no_run +/// // You can set the appearance before or after you shell it will yield the same result. +/// // This example shows setting the appearance _before_ the shell. +/// firstSketch = startSketchOn('XY') +/// |> startProfileAt([-12, 12], %) +/// |> line([24, 0], %) +/// |> line([0, -24], %) +/// |> line([-24, 0], %) +/// |> close(%) +/// |> extrude(6, %) +/// |> appearance({ +/// color = '#ff0000', +/// metalness = 90, +/// roughness = 90 +/// }, %) +/// +/// shell({ +/// faces = ['end'], +/// thickness = 0.25, +/// }, firstSketch) +/// ``` +/// +/// ```no_run +/// // Setting the appearance of a 3D pattern can be done _before_ or _after_ the pattern. +/// // This example shows _before_ the pattern. +/// exampleSketch = startSketchOn('XZ') +/// |> startProfileAt([0, 0], %) +/// |> line([0, 2], %) +/// |> line([3, 1], %) +/// |> line([0, -4], %) +/// |> close(%) +/// +/// example = extrude(1, exampleSketch) +/// |> appearance({ +/// color = '#ff0000', +/// metalness = 90, +/// roughness = 90 +/// }, %) +/// |> patternLinear3d({ +/// axis = [1, 0, 1], +/// instances = 7, +/// distance = 6 +/// }, %) +/// ``` +/// +/// ```no_run +/// // Setting the appearance of a 3D pattern can be done _before_ or _after_ the pattern. +/// // This example shows _after_ the pattern. +/// exampleSketch = startSketchOn('XZ') +/// |> startProfileAt([0, 0], %) +/// |> line([0, 2], %) +/// |> line([3, 1], %) +/// |> line([0, -4], %) +/// |> close(%) +/// +/// example = extrude(1, exampleSketch) +/// |> patternLinear3d({ +/// axis = [1, 0, 1], +/// instances = 7, +/// distance = 6 +/// }, %) +/// |> appearance({ +/// color = '#ff0000', +/// metalness = 90, +/// roughness = 90 +/// }, %) +/// ``` +/// +/// ```no_run +/// // Color the result of a 2D pattern that was extruded. +/// exampleSketch = startSketchOn('XZ') +/// |> startProfileAt([.5, 25], %) +/// |> line([0, 5], %) +/// |> line([-1, 0], %) +/// |> line([0, -5], %) +/// |> close(%) +/// |> patternCircular2d({ +/// center = [0, 0], +/// instances = 13, +/// arcDegrees = 360, +/// rotateDuplicates = true +/// }, %) +/// +/// example = extrude(1, exampleSketch) +/// |> appearance({ +/// color = '#ff0000', +/// metalness = 90, +/// roughness = 90 +/// }, %) +/// ``` +/// +/// ```no_run +/// // Color the result of a sweep. +/// +/// // Create a path for the sweep. +/// sweepPath = startSketchOn('XZ') +/// |> startProfileAt([0.05, 0.05], %) +/// |> line([0, 7], %) +/// |> tangentialArc({ +/// offset: 90, +/// radius: 5 +/// }, %) +/// |> line([-3, 0], %) +/// |> tangentialArc({ +/// offset: -90, +/// radius: 5 +/// }, %) +/// |> line([0, 7], %) +/// +/// pipeHole = startSketchOn('XY') +/// |> circle({ +/// center = [0, 0], +/// radius = 1.5, +/// }, %) +/// +/// sweepSketch = startSketchOn('XY') +/// |> circle({ +/// center = [0, 0], +/// radius = 2, +/// }, %) +/// |> hole(pipeHole, %) +/// |> sweep({ +/// path: sweepPath, +/// }, %) +/// |> appearance({ +/// color: "#ff0000", +/// metalness: 50, +/// roughness: 50 +/// }, %) +/// ``` +#[stdlib { + name = "appearance", +}] +async fn inner_appearance(data: AppearanceData, solid_set: SolidSet, args: Args) -> Result { + let solids: Vec> = solid_set.into(); + + for solid in &solids { + // Set the material properties. + let rgb = rgba_simple::RGB::::from_hex(&data.color).map_err(|err| { + KclError::Semantic(KclErrorDetails { + message: format!("Invalid hex color (`{}`): {}", data.color, err), + source_ranges: vec![args.source_range], + }) + })?; + + let color = Color { + r: rgb.red, + g: rgb.green, + b: rgb.blue, + a: 100.0, + }; + + args.batch_modeling_cmd( + uuid::Uuid::new_v4(), + ModelingCmd::from(mcmd::ObjectSetMaterialParamsPbr { + object_id: solid.id, + color, + metalness: data.metalness.unwrap_or_default() as f32 / 100.0, + roughness: data.roughness.unwrap_or_default() as f32 / 100.0, + ambient_occlusion: 0.0, + }), + ) + .await?; + + // Idk if we want to actually modify the memory for the colors, but I'm not right now since + // I can't think of a use case for it. + } + + Ok(SolidSet::from(solids)) +} diff --git a/src/wasm-lib/kcl/src/std/args.rs b/src/wasm-lib/kcl/src/std/args.rs index d0d40336b..69bd54a70 100644 --- a/src/wasm-lib/kcl/src/std/args.rs +++ b/src/wasm-lib/kcl/src/std/args.rs @@ -1,34 +1,94 @@ -use std::any::type_name; +use std::{any::type_name, collections::HashMap, num::NonZeroU32}; use anyhow::Result; use kcmc::{websocket::OkWebSocketResponseData, ModelingCmd}; use kittycad_modeling_cmds as kcmc; -use serde::de::DeserializeOwned; -use serde_json::Value as JValue; +use super::shapes::PolygonType; use crate::{ - ast::types::{execute::parse_json_number_as_f64, TagDeclarator}, errors::{KclError, KclErrorDetails}, - executor::{ - ExecState, ExecutorContext, ExtrudeSurface, KclValue, Metadata, Sketch, SketchSet, SketchSurface, Solid, - SolidSet, SourceRange, TagIdentifier, UserVal, + execution::{ + ExecState, ExecutorContext, ExtrudeSurface, KclObjectFields, KclValue, Metadata, Sketch, SketchSet, + SketchSurface, Solid, SolidSet, TagIdentifier, }, + parsing::ast::types::TagNode, + source_range::SourceRange, std::{shapes::SketchOrSurface, sketch::FaceTag, FnAsArg}, + ModuleId, }; +#[derive(Debug, Clone)] +pub struct Arg { + /// The evaluated argument. + pub value: KclValue, + /// The source range of the unevaluated argument. + pub source_range: SourceRange, +} + +impl Arg { + pub fn new(value: KclValue, source_range: SourceRange) -> Self { + Self { value, source_range } + } + + pub fn synthetic(value: KclValue) -> Self { + Self { + value, + source_range: SourceRange::synthetic(), + } + } + + pub fn source_ranges(&self) -> Vec { + vec![self.source_range] + } +} + +#[derive(Debug, Clone, Default)] +pub struct KwArgs { + /// Unlabeled keyword args. Currently only the first arg can be unlabeled. + pub unlabeled: Option, + /// Labeled args. + pub labeled: HashMap, +} + +impl KwArgs { + /// How many arguments are there? + pub fn len(&self) -> usize { + self.labeled.len() + if self.unlabeled.is_some() { 1 } else { 0 } + } +} + #[derive(Debug, Clone)] pub struct Args { - pub args: Vec, + /// Positional args. + pub args: Vec, + /// Keyword arguments + pub kw_args: KwArgs, pub source_range: SourceRange, pub ctx: ExecutorContext, + /// If this call happens inside a pipe (|>) expression, this holds the LHS of that |>. + /// Otherwise it's None. + pipe_value: Option, } impl Args { - pub fn new(args: Vec, source_range: SourceRange, ctx: ExecutorContext) -> Self { + pub fn new(args: Vec, source_range: SourceRange, ctx: ExecutorContext, pipe_value: Option) -> Self { Self { args, + kw_args: Default::default(), source_range, ctx, + pipe_value, + } + } + + /// Collect the given keyword arguments. + pub fn new_kw(kw_args: KwArgs, source_range: SourceRange, ctx: ExecutorContext, pipe_value: Option) -> Self { + Self { + args: Default::default(), + kw_args, + source_range, + ctx, + pipe_value, } } @@ -38,14 +98,68 @@ impl Args { Ok(Self { args: Vec::new(), + kw_args: Default::default(), source_range: SourceRange::default(), ctx: ExecutorContext { engine: Arc::new(Box::new(crate::engine::conn_mock::EngineConnection::new().await?)), fs: Arc::new(crate::fs::FileManager::new()), stdlib: Arc::new(crate::std::StdLib::new()), settings: Default::default(), - context_type: crate::executor::ContextType::Mock, + context_type: crate::execution::ContextType::Mock, }, + pipe_value: None, + }) + } + + /// Get a keyword argument. If not set, returns None. + pub(crate) fn get_kw_arg_opt<'a, T>(&'a self, label: &str) -> Option + where + T: FromKclValue<'a>, + { + self.kw_args + .labeled + .get(label) + .and_then(|arg| T::from_kcl_val(&arg.value)) + } + + /// Get a keyword argument. If not set, returns Err. + pub(crate) fn get_kw_arg<'a, T>(&'a self, label: &str) -> Result + where + T: FromKclValue<'a>, + { + self.get_kw_arg_opt(label).ok_or_else(|| { + KclError::Semantic(KclErrorDetails { + source_ranges: vec![self.source_range], + message: format!("This function requires a keyword argument '{label}'"), + }) + }) + } + + /// Get the unlabeled keyword argument. If not set, returns Err. + pub(crate) fn get_unlabeled_kw_arg<'a, T>(&'a self, label: &str) -> Result + where + T: FromKclValue<'a>, + { + let arg = self + .kw_args + .unlabeled + .as_ref() + .or(self.args.first()) + .or(self.pipe_value.as_ref()) + .ok_or(KclError::Semantic(KclErrorDetails { + source_ranges: vec![self.source_range], + message: format!("This function requires a value for the special unlabeled first parameter, '{label}'"), + }))?; + + T::from_kcl_val(&arg.value).ok_or_else(|| { + KclError::Semantic(KclErrorDetails { + source_ranges: arg.source_ranges(), + message: format!( + "Expected a {} but found {}", + type_name::(), + arg.value.human_friendly_type() + ), + }) }) } @@ -78,8 +192,8 @@ impl Args { &'a self, exec_state: &'e mut ExecState, tag: &'a TagIdentifier, - ) -> Result<&'e crate::executor::TagEngineInfo, KclError> { - if let KclValue::TagIdentifier(t) = exec_state.memory.get(&tag.value, self.source_range)? { + ) -> Result<&'e crate::execution::TagEngineInfo, KclError> { + if let KclValue::TagIdentifier(t) = exec_state.memory().get(&tag.value, self.source_range)? { Ok(t.info.as_ref().ok_or_else(|| { KclError::Type(KclErrorDetails { message: format!("Tag `{}` does not have engine info", tag.value), @@ -98,7 +212,7 @@ impl Args { &'a self, exec_state: &'e mut ExecState, tag: &'a TagIdentifier, - ) -> Result<&'a crate::executor::TagEngineInfo, KclError> + ) -> Result<&'a crate::execution::TagEngineInfo, KclError> where 'e: 'a, { @@ -113,7 +227,7 @@ impl Args { &'a self, exec_state: &'e mut ExecState, tag: &'a TagIdentifier, - ) -> Result<&'a crate::executor::TagEngineInfo, KclError> + ) -> Result<&'a crate::execution::TagEngineInfo, KclError> where 'e: 'a, { @@ -145,12 +259,12 @@ impl Args { // Find all the solids on the same shared sketch. ids.extend( exec_state - .memory + .memory() .find_solids_on_sketch(solid.sketch.id) .iter() .flat_map(|eg| eg.get_all_edge_cut_ids()), ); - ids.extend(exec_state.dynamic_state.edge_cut_ids_on_sketch(sketch_id)); + ids.extend(exec_state.mod_local.dynamic_state.edge_cut_ids_on_sketch(sketch_id)); traversed_sketches.push(sketch_id); } @@ -181,47 +295,49 @@ impl Args { Ok(()) } - fn make_user_val_from_json(&self, j: serde_json::Value) -> Result { - Ok(KclValue::UserVal(crate::executor::UserVal { - value: j, - meta: vec![Metadata { + pub(crate) fn make_user_val_from_point(&self, p: [f64; 2]) -> Result { + let meta = Metadata { + source_range: self.source_range, + }; + let x = KclValue::Number { + value: p[0], + meta: vec![meta], + }; + let y = KclValue::Number { + value: p[1], + meta: vec![meta], + }; + Ok(KclValue::Array { + value: vec![x, y], + meta: vec![meta], + }) + } + + pub(crate) fn make_user_val_from_f64(&self, f: f64) -> KclValue { + KclValue::from_number( + f, + vec![Metadata { source_range: self.source_range, }], - })) - } - - pub(crate) fn make_null_user_val(&self) -> Result { - self.make_user_val_from_json(serde_json::Value::Null) - } - - pub(crate) fn make_user_val_from_i64(&self, n: i64) -> Result { - self.make_user_val_from_json(serde_json::Value::Number(serde_json::Number::from(n))) - } - - pub(crate) fn make_user_val_from_f64(&self, f: f64) -> Result { - self.make_user_val_from_json(serde_json::Value::Number(serde_json::Number::from_f64(f).ok_or_else( - || { - KclError::Type(KclErrorDetails { - message: format!("Failed to convert `{}` to a number", f), - source_ranges: vec![self.source_range], - }) - }, - )?)) + ) } pub(crate) fn make_user_val_from_f64_array(&self, f: Vec) -> Result { - let mut arr = Vec::new(); - for n in f { - arr.push(serde_json::Value::Number(serde_json::Number::from_f64(n).ok_or_else( - || { - KclError::Type(KclErrorDetails { - message: format!("Failed to convert `{}` to a number", n), - source_ranges: vec![self.source_range], - }) - }, - )?)); - } - self.make_user_val_from_json(serde_json::Value::Array(arr)) + let array = f + .into_iter() + .map(|n| KclValue::Number { + value: n, + meta: vec![Metadata { + source_range: self.source_range, + }], + }) + .collect::>(); + Ok(KclValue::Array { + value: array, + meta: vec![Metadata { + source_range: self.source_range, + }], + }) } pub(crate) fn get_number(&self) -> Result { @@ -229,11 +345,19 @@ impl Args { } pub(crate) fn get_number_array(&self) -> Result, KclError> { - let mut numbers: Vec = Vec::new(); - for arg in &self.args { - let parsed = arg.get_json_value()?; - numbers.push(parse_json_number_as_f64(&parsed, self.source_range)?); - } + let numbers = self + .args + .iter() + .map(|arg| { + let Some(num) = f64::from_kcl_val(&arg.value) else { + return Err(KclError::Semantic(KclErrorDetails { + source_ranges: arg.source_ranges(), + message: format!("Expected a number but found {}", arg.value.human_friendly_type()), + })); + }; + Ok(num) + }) + .collect::>()?; Ok(numbers) } @@ -260,7 +384,7 @@ impl Args { ( crate::std::shapes::CircleData, crate::std::shapes::SketchOrSurface, - Option, + Option, ), KclError, > { @@ -286,14 +410,7 @@ impl Args { FromArgs::from_args(self, 0) } - pub(crate) fn get_sketch_and_optional_tag(&self) -> Result<(Sketch, Option), KclError> { - FromArgs::from_args(self, 0) - } - - pub(crate) fn get_sketches_and_data<'a, T>(&'a self) -> Result<(Vec, Option), KclError> - where - T: FromArgs<'a> + serde::de::DeserializeOwned + FromKclValue<'a> + Sized, - { + pub(crate) fn get_sketch_and_optional_tag(&self) -> Result<(Sketch, Option), KclError> { FromArgs::from_args(self, 0) } @@ -318,16 +435,14 @@ impl Args { FromArgs::from_args(self, 0) } - pub(crate) fn get_data_and_sketch_and_tag<'a, T>(&'a self) -> Result<(T, Sketch, Option), KclError> + pub(crate) fn get_data_and_sketch_and_tag<'a, T>(&'a self) -> Result<(T, Sketch, Option), KclError> where T: serde::de::DeserializeOwned + FromKclValue<'a> + Sized, { FromArgs::from_args(self, 0) } - pub(crate) fn get_data_and_sketch_surface<'a, T>( - &'a self, - ) -> Result<(T, SketchSurface, Option), KclError> + pub(crate) fn get_data_and_sketch_surface<'a, T>(&'a self) -> Result<(T, SketchSurface, Option), KclError> where T: serde::de::DeserializeOwned + FromKclValue<'a> + Sized, { @@ -348,9 +463,7 @@ impl Args { FromArgs::from_args(self, 0) } - pub(crate) fn get_data_and_solid_and_tag<'a, T>( - &'a self, - ) -> Result<(T, Box, Option), KclError> + pub(crate) fn get_data_and_solid_and_tag<'a, T>(&'a self) -> Result<(T, Box, Option), KclError> where T: serde::de::DeserializeOwned + FromKclValue<'a> + Sized, { @@ -459,6 +572,19 @@ impl Args { source_ranges: vec![self.source_range], })) } + + pub(crate) fn get_polygon_args( + &self, + ) -> Result< + ( + crate::std::shapes::PolygonData, + crate::std::shapes::SketchOrSurface, + Option, + ), + KclError, + > { + FromArgs::from_args(self, 0) + } } /// Types which impl this trait can be read out of the `Args` passed into a KCL function. @@ -470,7 +596,26 @@ pub trait FromArgs<'a>: Sized { /// Types which impl this trait can be extracted from a `KclValue`. pub trait FromKclValue<'a>: Sized { /// Try to convert a KclValue into this type. - fn from_mem_item(arg: &'a KclValue) -> Option; + fn from_kcl_val(arg: &'a KclValue) -> Option; +} + +impl<'a> FromArgs<'a> for Vec { + fn from_args(args: &'a Args, i: usize) -> Result { + let Some(arg) = args.args.get(i) else { + return Err(KclError::Semantic(KclErrorDetails { + message: format!("Expected an argument at index {i}"), + source_ranges: vec![args.source_range], + })); + }; + let KclValue::Array { value: array, meta: _ } = &arg.value else { + let message = format!("Expected an array but found {}", arg.value.human_friendly_type()); + return Err(KclError::Type(KclErrorDetails { + source_ranges: arg.source_ranges(), + message, + })); + }; + Ok(array.to_owned()) + } } impl<'a, T> FromArgs<'a> for T @@ -484,14 +629,14 @@ where source_ranges: vec![args.source_range], })); }; - let Some(val) = T::from_mem_item(arg) else { + let Some(val) = T::from_kcl_val(&arg.value) else { return Err(KclError::Semantic(KclErrorDetails { message: format!( "Argument at index {i} was supposed to be type {} but found {}", type_name::(), - arg.human_friendly_type() + arg.value.human_friendly_type() ), - source_ranges: vec![args.source_range], + source_ranges: arg.source_ranges(), })); }; Ok(val) @@ -504,17 +649,17 @@ where { fn from_args(args: &'a Args, i: usize) -> Result { let Some(arg) = args.args.get(i) else { return Ok(None) }; - if crate::ast::types::KclNone::from_mem_item(arg).is_some() { + if crate::parsing::ast::types::KclNone::from_kcl_val(&arg.value).is_some() { return Ok(None); } - let Some(val) = T::from_mem_item(arg) else { + let Some(val) = T::from_kcl_val(&arg.value) else { return Err(KclError::Semantic(KclErrorDetails { message: format!( - "Argument at index {i} was supposed to be type {} but found {}", + "Argument at index {i} was supposed to be type Option<{}> but found {}", type_name::(), - arg.human_friendly_type() + arg.value.human_friendly_type() ), - source_ranges: vec![args.source_range], + source_ranges: arg.source_ranges(), })); }; Ok(Some(val)) @@ -562,141 +707,924 @@ where } } -impl<'a> FromKclValue<'a> for &'a str { - fn from_mem_item(arg: &'a KclValue) -> Option { - arg.as_user_val().and_then(|uv| uv.value.as_str()) +impl<'a> FromKclValue<'a> for [f64; 2] { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let KclValue::Array { value, meta: _ } = arg else { + return None; + }; + if value.len() != 2 { + return None; + } + let v0 = value.first()?; + let v1 = value.get(1)?; + let array = [v0.as_f64()?, v1.as_f64()?]; + Some(array) } } -impl<'a> FromKclValue<'a> for i64 { - fn from_mem_item(arg: &'a KclValue) -> Option { - arg.as_user_val() - .and_then(|uv| uv.value.as_number()) - .and_then(|num| num.as_i64()) +impl<'a> FromKclValue<'a> for [usize; 3] { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let KclValue::Array { value, meta: _ } = arg else { + return None; + }; + if value.len() != 3 { + return None; + } + let v0 = value.first()?; + let v1 = value.get(1)?; + let v2 = value.get(2)?; + let array = [v0.as_usize()?, v1.as_usize()?, v2.as_usize()?]; + Some(array) } } -impl<'a> FromKclValue<'a> for UserVal { - fn from_mem_item(arg: &'a KclValue) -> Option { - arg.as_user_val().map(|x| x.to_owned()) +impl<'a> FromKclValue<'a> for [f64; 3] { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let KclValue::Array { value, meta: _ } = arg else { + return None; + }; + if value.len() != 3 { + return None; + } + let v0 = value.first()?; + let v1 = value.get(1)?; + let v2 = value.get(2)?; + let array = [v0.as_f64()?, v1.as_f64()?, v2.as_f64()?]; + Some(array) } } -impl<'a> FromKclValue<'a> for Vec { - fn from_mem_item(arg: &'a KclValue) -> Option { - arg.as_user_val() - .and_then(|uv| uv.value.as_array()) - .map(ToOwned::to_owned) - } -} - -impl<'a> FromKclValue<'a> for TagDeclarator { - fn from_mem_item(arg: &'a KclValue) -> Option { +impl<'a> FromKclValue<'a> for TagNode { + fn from_kcl_val(arg: &'a KclValue) -> Option { arg.get_tag_declarator().ok() } } impl<'a> FromKclValue<'a> for TagIdentifier { - fn from_mem_item(arg: &'a KclValue) -> Option { + fn from_kcl_val(arg: &'a KclValue) -> Option { arg.get_tag_identifier().ok() } } impl<'a> FromKclValue<'a> for KclValue { - fn from_mem_item(arg: &'a KclValue) -> Option { + fn from_kcl_val(arg: &'a KclValue) -> Option { Some(arg.clone()) } } -macro_rules! impl_from_arg_via_json { - ($typ:path) => { - impl<'a> FromKclValue<'a> for $typ { - fn from_mem_item(arg: &'a KclValue) -> Option { - from_user_val(arg) - } - } +macro_rules! let_field_of { + // Optional field + ($obj:ident, $field:ident?) => { + let $field = $obj.get(stringify!($field)).and_then(FromKclValue::from_kcl_val); + }; + // Mandatory field, but with a different string used as the key. + ($obj:ident, $field:ident $key:literal) => { + let $field = $obj.get($key).and_then(FromKclValue::from_kcl_val)?; + }; + // Mandatory field, optionally with a type annotation + ($obj:ident, $field:ident $(, $annotation:ty)?) => { + let $field $(: $annotation)? = $obj.get(stringify!($field)).and_then(FromKclValue::from_kcl_val)?; }; } -impl<'a, T> FromKclValue<'a> for Vec -where - T: serde::de::DeserializeOwned + FromKclValue<'a>, -{ - fn from_mem_item(arg: &'a KclValue) -> Option { - from_user_val(arg) +impl<'a> FromKclValue<'a> for crate::std::import::ImportFormat { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, typ "format"); + match typ { + "fbx" => Some(Self::Fbx {}), + "gltf" => Some(Self::Gltf {}), + "sldprt" => Some(Self::Sldprt {}), + "step" => Some(Self::Step {}), + "stl" => { + let_field_of!(obj, coords?); + let_field_of!(obj, units); + Some(Self::Stl { coords, units }) + } + "obj" => { + let_field_of!(obj, coords?); + let_field_of!(obj, units); + Some(Self::Obj { coords, units }) + } + "ply" => { + let_field_of!(obj, coords?); + let_field_of!(obj, units); + Some(Self::Ply { coords, units }) + } + _ => None, + } } } -macro_rules! impl_from_arg_for_array { - ($n:literal) => { - impl<'a, T> FromKclValue<'a> for [T; $n] - where - T: serde::de::DeserializeOwned + FromKclValue<'a>, - { - fn from_mem_item(arg: &'a KclValue) -> Option { - from_user_val(arg) +impl<'a> FromKclValue<'a> for super::sketch::AngledLineThatIntersectsData { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, angle); + let_field_of!(obj, intersect_tag "intersectTag"); + let_field_of!(obj, offset?); + Some(Self { + angle, + intersect_tag, + offset, + }) + } +} + +impl<'a> FromKclValue<'a> for super::shapes::PolygonData { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, radius); + let_field_of!(obj, num_sides "numSides"); + let_field_of!(obj, center); + let_field_of!(obj, inscribed); + let polygon_type = if inscribed { + PolygonType::Inscribed + } else { + PolygonType::Circumscribed + }; + Some(Self { + radius, + num_sides, + center, + polygon_type, + inscribed, + }) + } +} + +impl<'a> FromKclValue<'a> for crate::std::polar::PolarCoordsData { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, angle); + let_field_of!(obj, length); + Some(Self { angle, length }) + } +} + +impl<'a> FromKclValue<'a> for crate::std::planes::StandardPlane { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let s = arg.as_str()?; + match s { + "XY" | "xy" => Some(Self::XY), + "-XY" | "-xy" => Some(Self::NegXY), + "XZ" | "xz" => Some(Self::XZ), + "-XZ" | "-xz" => Some(Self::NegXZ), + "YZ" | "yz" => Some(Self::YZ), + "-YZ" | "-yz" => Some(Self::NegYZ), + _ => None, + } + } +} + +impl<'a> FromKclValue<'a> for crate::execution::Plane { + fn from_kcl_val(arg: &'a KclValue) -> Option { + if let Some(plane) = arg.as_plane() { + return Some(plane.clone()); + } + + let obj = arg.as_object()?; + let_field_of!(obj, id); + let_field_of!(obj, value); + let_field_of!(obj, origin); + let_field_of!(obj, x_axis "xAxis"); + let_field_of!(obj, y_axis "yAxis"); + let_field_of!(obj, z_axis "zAxis"); + let_field_of!(obj, meta "__meta"); + Some(Self { + id, + value, + origin, + x_axis, + y_axis, + z_axis, + meta, + }) + } +} + +impl<'a> FromKclValue<'a> for crate::execution::PlaneType { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let plane_type = match arg.as_str()? { + "XY" | "xy" => Self::XY, + "XZ" | "xz" => Self::XZ, + "YZ" | "yz" => Self::YZ, + "Custom" => Self::Custom, + _ => return None, + }; + Some(plane_type) + } +} + +impl<'a> FromKclValue<'a> for kittycad_modeling_cmds::units::UnitLength { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let s = arg.as_str()?; + s.parse().ok() + } +} + +impl<'a> FromKclValue<'a> for kittycad_modeling_cmds::coord::System { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, forward); + let_field_of!(obj, up); + Some(Self { forward, up }) + } +} + +impl<'a> FromKclValue<'a> for kittycad_modeling_cmds::coord::AxisDirectionPair { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, axis); + let_field_of!(obj, direction); + Some(Self { axis, direction }) + } +} + +impl<'a> FromKclValue<'a> for kittycad_modeling_cmds::coord::Axis { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let s = arg.as_str()?; + match s { + "y" => Some(Self::Y), + "z" => Some(Self::Z), + _ => None, + } + } +} + +impl<'a> FromKclValue<'a> for PolygonType { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let s = arg.as_str()?; + match s { + "inscribed" => Some(Self::Inscribed), + _ => Some(Self::Circumscribed), + } + } +} + +impl<'a> FromKclValue<'a> for kittycad_modeling_cmds::coord::Direction { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let s = arg.as_str()?; + match s { + "positive" => Some(Self::Positive), + "negative" => Some(Self::Negative), + _ => None, + } + } +} + +impl<'a> FromKclValue<'a> for super::patterns::CircularPattern3dData { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, instances); + let_field_of!(obj, arc_degrees "arcDegrees"); + let_field_of!(obj, rotate_duplicates "rotateDuplicates"); + let_field_of!(obj, axis); + let_field_of!(obj, center); + Some(Self { + instances, + axis, + center, + arc_degrees, + rotate_duplicates, + }) + } +} + +impl<'a> FromKclValue<'a> for super::patterns::CircularPattern2dData { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, instances); + let_field_of!(obj, arc_degrees "arcDegrees"); + let_field_of!(obj, rotate_duplicates "rotateDuplicates"); + let_field_of!(obj, center); + Some(Self { + instances, + center, + arc_degrees, + rotate_duplicates, + }) + } +} + +impl<'a> FromKclValue<'a> for super::patterns::LinearPattern3dData { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, distance); + let_field_of!(obj, instances); + let_field_of!(obj, axis); + Some(Self { + instances, + distance, + axis, + }) + } +} + +impl<'a> FromKclValue<'a> for super::patterns::LinearPattern2dData { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, distance); + let_field_of!(obj, instances); + let_field_of!(obj, axis); + Some(Self { + instances, + distance, + axis, + }) + } +} + +impl<'a> FromKclValue<'a> for super::sketch::BezierData { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, to); + let_field_of!(obj, control1); + let_field_of!(obj, control2); + Some(Self { to, control1, control2 }) + } +} + +impl<'a> FromKclValue<'a> for super::shell::ShellData { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, thickness); + let_field_of!(obj, faces); + Some(Self { thickness, faces }) + } +} + +impl<'a> FromKclValue<'a> for super::chamfer::ChamferData { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, length); + let_field_of!(obj, tags); + Some(Self { length, tags }) + } +} + +impl<'a> FromKclValue<'a> for super::fillet::FilletData { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, radius); + let_field_of!(obj, tolerance?); + let_field_of!(obj, tags); + Some(Self { + radius, + tolerance, + tags, + }) + } +} + +impl<'a> FromKclValue<'a> for super::sweep::SweepData { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, path); + let_field_of!(obj, sectional?); + let_field_of!(obj, tolerance?); + Some(Self { + path, + sectional, + tolerance, + }) + } +} + +impl<'a> FromKclValue<'a> for super::appearance::AppearanceData { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, color); + let_field_of!(obj, metalness?); + let_field_of!(obj, roughness?); + Some(Self { + color, + metalness, + roughness, + }) + } +} + +impl<'a> FromKclValue<'a> for super::helix::HelixData { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, revolutions); + let_field_of!(obj, length?); + let_field_of!(obj, ccw?); + let ccw = ccw.unwrap_or_default(); + let angle_start = obj.get("angleStart").or_else(|| obj.get("angle_start"))?.as_f64()?; + Some(Self { + revolutions, + angle_start, + ccw, + length, + }) + } +} + +impl<'a> FromKclValue<'a> for FaceTag { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let case1 = || match arg.as_str() { + Some("start" | "START") => Some(Self::StartOrEnd(super::sketch::StartOrEnd::Start)), + Some("end" | "END") => Some(Self::StartOrEnd(super::sketch::StartOrEnd::End)), + _ => None, + }; + let case2 = || { + let tag = TagIdentifier::from_kcl_val(arg)?; + Some(Self::Tag(Box::new(tag))) + }; + case1().or_else(case2) + } +} + +impl<'a> FromKclValue<'a> for super::sketch::AngledLineToData { + fn from_kcl_val(arg: &'a KclValue) -> Option { + // Deserialize from an {angle, to} object. + let case1 = || { + let obj = arg.as_object()?; + let_field_of!(obj, to); + let_field_of!(obj, angle); + Some(Self { angle, to }) + }; + // Deserialize from an [angle, to] array. + let case2 = || { + let [angle, to] = arg.as_point2d()?; + Some(Self { angle, to }) + }; + case1().or_else(case2) + } +} + +impl<'a> FromKclValue<'a> for super::sketch::ArcData { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, radius); + let case1 = || { + let angle_start = obj.get("angleStart").or_else(|| obj.get("angle_start"))?.as_f64()?; + let angle_end = obj.get("angleEnd").or_else(|| obj.get("angle_end"))?.as_f64()?; + Some(Self::AnglesAndRadius { + angle_start, + angle_end, + radius, + }) + }; + let case2 = || { + let obj = arg.as_object()?; + let_field_of!(obj, to); + let_field_of!(obj, center); + Some(Self::CenterToRadius { center, to, radius }) + }; + case1().or_else(case2) + } +} + +impl<'a> FromKclValue<'a> for super::sketch::ArcToData { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, end); + let_field_of!(obj, interior); + Some(Self { end, interior }) + } +} + +impl<'a> FromKclValue<'a> for super::revolve::RevolveData { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let angle = obj.get("angle").and_then(|x| x.as_f64()); + let tolerance = obj.get("tolerance").and_then(|x| x.as_f64()); + let_field_of!(obj, axis); + Some(Self { angle, axis, tolerance }) + } +} + +impl<'a> FromKclValue<'a> for super::shapes::CircleData { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, center); + let_field_of!(obj, radius); + Some(Self { center, radius }) + } +} + +impl<'a> FromKclValue<'a> for super::sketch::TangentialArcData { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, radius); + let_field_of!(obj, offset); + Some(Self::RadiusAndOffset { radius, offset }) + } +} + +impl<'a> FromKclValue<'a> for crate::execution::Point3d { + fn from_kcl_val(arg: &'a KclValue) -> Option { + // Case 1: object with x/y/z fields + if let Some(obj) = arg.as_object() { + let_field_of!(obj, x); + let_field_of!(obj, y); + let_field_of!(obj, z); + return Some(Self { x, y, z }); + } + // Case 2: Array of 3 numbers. + let [x, y, z]: [f64; 3] = FromKclValue::from_kcl_val(arg)?; + Some(Self { x, y, z }) + } +} + +impl<'a> FromKclValue<'a> for super::sketch::PlaneData { + fn from_kcl_val(arg: &'a KclValue) -> Option { + // Case 0: actual plane + if let KclValue::Plane(p) = arg { + return Some(Self::Plane { + origin: Box::new(p.origin), + x_axis: Box::new(p.x_axis), + y_axis: Box::new(p.y_axis), + z_axis: Box::new(p.z_axis), + }); + } + // Case 1: predefined plane + if let Some(s) = arg.as_str() { + return match s { + "XY" | "xy" => Some(Self::XY), + "-XY" | "-xy" => Some(Self::NegXY), + "XZ" | "xz" => Some(Self::XZ), + "-XZ" | "-xz" => Some(Self::NegXZ), + "YZ" | "yz" => Some(Self::YZ), + "-YZ" | "-yz" => Some(Self::NegYZ), + _ => None, + }; + } + // Case 2: custom plane + let obj = arg.as_object()?; + let_field_of!(obj, plane, &KclObjectFields); + let origin = plane.get("origin").and_then(FromKclValue::from_kcl_val).map(Box::new)?; + let x_axis = plane + .get("xAxis") + .or_else(|| plane.get("x_axis")) + .and_then(FromKclValue::from_kcl_val) + .map(Box::new)?; + let y_axis = plane + .get("yAxis") + .or_else(|| plane.get("y_axis")) + .and_then(FromKclValue::from_kcl_val) + .map(Box::new)?; + let z_axis = plane + .get("zAxis") + .or_else(|| plane.get("z_axis")) + .and_then(FromKclValue::from_kcl_val) + .map(Box::new)?; + Some(Self::Plane { + origin, + x_axis, + y_axis, + z_axis, + }) + } +} + +impl<'a> FromKclValue<'a> for crate::execution::ExtrudePlane { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, face_id "faceId"); + let tag = FromKclValue::from_kcl_val(obj.get("tag")?); + let_field_of!(obj, geo_meta "geoMeta"); + Some(Self { face_id, tag, geo_meta }) + } +} + +impl<'a> FromKclValue<'a> for crate::execution::ExtrudeArc { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, face_id "faceId"); + let tag = FromKclValue::from_kcl_val(obj.get("tag")?); + let_field_of!(obj, geo_meta "geoMeta"); + Some(Self { face_id, tag, geo_meta }) + } +} + +impl<'a> FromKclValue<'a> for crate::execution::GeoMeta { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, id); + let_field_of!(obj, source_range "sourceRange"); + Some(Self { + id, + metadata: Metadata { source_range }, + }) + } +} + +impl<'a> FromKclValue<'a> for crate::execution::ChamferSurface { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, face_id "faceId"); + let tag = FromKclValue::from_kcl_val(obj.get("tag")?); + let_field_of!(obj, geo_meta "geoMeta"); + Some(Self { face_id, tag, geo_meta }) + } +} + +impl<'a> FromKclValue<'a> for crate::execution::FilletSurface { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, face_id "faceId"); + let tag = FromKclValue::from_kcl_val(obj.get("tag")?); + let_field_of!(obj, geo_meta "geoMeta"); + Some(Self { face_id, tag, geo_meta }) + } +} + +impl<'a> FromKclValue<'a> for ExtrudeSurface { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let case1 = crate::execution::ExtrudePlane::from_kcl_val; + let case2 = crate::execution::ExtrudeArc::from_kcl_val; + let case3 = crate::execution::ChamferSurface::from_kcl_val; + let case4 = crate::execution::FilletSurface::from_kcl_val; + case1(arg) + .map(Self::ExtrudePlane) + .or_else(|| case2(arg).map(Self::ExtrudeArc)) + .or_else(|| case3(arg).map(Self::Chamfer)) + .or_else(|| case4(arg).map(Self::Fillet)) + } +} + +impl<'a> FromKclValue<'a> for crate::execution::EdgeCut { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, typ "type"); + let tag = Box::new(obj.get("tag").and_then(FromKclValue::from_kcl_val)); + let_field_of!(obj, edge_id "edgeId"); + let_field_of!(obj, id); + match typ { + "fillet" => { + let_field_of!(obj, radius); + Some(Self::Fillet { + edge_id, + tag, + id, + radius, + }) + } + "chamfer" => { + let_field_of!(obj, length); + Some(Self::Chamfer { + id, + length, + edge_id, + tag, + }) + } + _ => None, + } + } +} + +macro_rules! impl_from_kcl_for_vec { + ($typ:path) => { + impl<'a> FromKclValue<'a> for Vec<$typ> { + fn from_kcl_val(arg: &'a KclValue) -> Option { + arg.as_array()? + .iter() + .map(|value| FromKclValue::from_kcl_val(value)) + .collect::>() } } }; } -fn from_user_val(arg: &KclValue) -> Option { - let v = match arg { - KclValue::UserVal(v) => v.value.clone(), - other => serde_json::to_value(other).ok()?, - }; - serde_json::from_value(v).ok() -} +impl_from_kcl_for_vec!(FaceTag); +impl_from_kcl_for_vec!(crate::execution::EdgeCut); +impl_from_kcl_for_vec!(crate::execution::Metadata); +impl_from_kcl_for_vec!(super::fillet::EdgeReference); +impl_from_kcl_for_vec!(ExtrudeSurface); +impl_from_kcl_for_vec!(Sketch); -impl_from_arg_via_json!(super::sketch::AngledLineData); -impl_from_arg_via_json!(super::sketch::AngledLineToData); -impl_from_arg_via_json!(super::sketch::AngledLineThatIntersectsData); -impl_from_arg_via_json!(super::shapes::CircleData); -impl_from_arg_via_json!(super::sketch::ArcData); -impl_from_arg_via_json!(super::sketch::TangentialArcData); -impl_from_arg_via_json!(super::sketch::BezierData); -impl_from_arg_via_json!(super::chamfer::ChamferData); -impl_from_arg_via_json!(super::patterns::LinearPattern3dData); -impl_from_arg_via_json!(super::patterns::CircularPattern3dData); -impl_from_arg_via_json!(super::patterns::LinearPattern2dData); -impl_from_arg_via_json!(super::patterns::CircularPattern2dData); -impl_from_arg_via_json!(super::helix::HelixData); -impl_from_arg_via_json!(super::shell::ShellData); -impl_from_arg_via_json!(super::fillet::FilletData); -impl_from_arg_via_json!(super::revolve::RevolveData); -impl_from_arg_via_json!(super::sketch::SketchData); -impl_from_arg_via_json!(crate::std::import::ImportFormat); -impl_from_arg_via_json!(crate::std::polar::PolarCoordsData); -impl_from_arg_via_json!(crate::std::loft::LoftData); -impl_from_arg_via_json!(crate::std::planes::StandardPlane); -impl_from_arg_via_json!(crate::std::mirror::Mirror2dData); -impl_from_arg_via_json!(Sketch); -impl_from_arg_via_json!(FaceTag); -impl_from_arg_via_json!(String); -impl_from_arg_via_json!(crate::ast::types::KclNone); -impl_from_arg_via_json!(u32); -impl_from_arg_via_json!(u64); -impl_from_arg_via_json!(f64); -impl_from_arg_via_json!(bool); - -impl_from_arg_for_array!(2); -impl_from_arg_for_array!(3); - -impl<'a> FromKclValue<'a> for SketchSet { - fn from_mem_item(arg: &'a KclValue) -> Option { - let KclValue::UserVal(uv) = arg else { +impl<'a> FromKclValue<'a> for SourceRange { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let KclValue::Array { value, meta: _ } = arg else { return None; }; - if let Some((x, _meta)) = uv.get::() { - Some(SketchSet::from(x)) - } else { - uv.get::>().map(|x| x.0).map(SketchSet::from) + if value.len() != 3 { + return None; + } + let v0 = value.first()?; + let v1 = value.get(1)?; + let v2 = value.get(2)?; + Some(SourceRange::new( + v0.as_usize()?, + v1.as_usize()?, + ModuleId::from_usize(v2.as_usize()?), + )) + } +} + +impl<'a> FromKclValue<'a> for crate::execution::Metadata { + fn from_kcl_val(arg: &'a KclValue) -> Option { + FromKclValue::from_kcl_val(arg).map(|sr| Self { source_range: sr }) + } +} + +impl<'a> FromKclValue<'a> for crate::execution::Solid { + fn from_kcl_val(arg: &'a KclValue) -> Option { + arg.as_solid().cloned() + } +} + +impl<'a> FromKclValue<'a> for super::sketch::SketchData { + fn from_kcl_val(arg: &'a KclValue) -> Option { + // Order is critical since PlaneData is a subset of Plane. + let case1 = crate::execution::Plane::from_kcl_val; + let case2 = super::sketch::PlaneData::from_kcl_val; + let case3 = crate::execution::Solid::from_kcl_val; + case1(arg) + .map(Box::new) + .map(Self::Plane) + .or_else(|| case2(arg).map(Self::PlaneOrientation)) + .or_else(|| case3(arg).map(Box::new).map(Self::Solid)) + } +} + +impl<'a> FromKclValue<'a> for super::revolve::AxisAndOrigin { + fn from_kcl_val(arg: &'a KclValue) -> Option { + // Case 1: predefined planes. + if let Some(s) = arg.as_str() { + return match s { + "X" | "x" => Some(Self::X), + "Y" | "y" => Some(Self::Y), + "-X" | "-x" => Some(Self::NegX), + "-Y" | "-y" => Some(Self::NegY), + _ => None, + }; + } + // Case 2: custom planes. + let obj = arg.as_object()?; + let_field_of!(obj, custom, &KclObjectFields); + let_field_of!(custom, origin); + let_field_of!(custom, axis); + Some(Self::Custom { axis, origin }) + } +} + +impl<'a> FromKclValue<'a> for super::fillet::EdgeReference { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let id = arg.as_uuid().map(Self::Uuid); + let tag = || TagIdentifier::from_kcl_val(arg).map(Box::new).map(Self::Tag); + id.or_else(tag) + } +} + +impl<'a> FromKclValue<'a> for super::revolve::AxisOrEdgeReference { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let case1 = super::revolve::AxisAndOrigin::from_kcl_val; + let case2 = super::fillet::EdgeReference::from_kcl_val; + case1(arg).map(Self::Axis).or_else(|| case2(arg).map(Self::Edge)) + } +} + +impl<'a> FromKclValue<'a> for super::mirror::Mirror2dData { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let obj = arg.as_object()?; + let_field_of!(obj, axis); + Some(Self { axis }) + } +} + +impl<'a> FromKclValue<'a> for super::sketch::AngledLineData { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let case1 = |arg: &KclValue| { + let obj = arg.as_object()?; + let_field_of!(obj, angle); + let_field_of!(obj, length); + Some(Self::AngleAndLengthNamed { angle, length }) + }; + let case2 = |arg: &KclValue| { + let array = arg.as_array()?; + let ang = array.first()?.as_f64()?; + let len = array.get(1)?.as_f64()?; + Some(Self::AngleAndLengthPair([ang, len])) + }; + case1(arg).or_else(|| case2(arg)) + } +} + +impl<'a> FromKclValue<'a> for i64 { + fn from_kcl_val(arg: &'a KclValue) -> Option { + match arg { + KclValue::Number { value, meta: _ } => crate::try_f64_to_i64(*value), + KclValue::Int { value, meta: _ } => Some(*value), + _ => None, + } + } +} + +impl<'a> FromKclValue<'a> for &'a str { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let KclValue::String { value, meta: _ } = arg else { + return None; + }; + Some(value) + } +} + +impl<'a> FromKclValue<'a> for &'a KclObjectFields { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let KclValue::Object { value, meta: _ } = arg else { + return None; + }; + Some(value) + } +} + +impl<'a> FromKclValue<'a> for uuid::Uuid { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let KclValue::Uuid { value, meta: _ } = arg else { + return None; + }; + Some(*value) + } +} + +impl<'a> FromKclValue<'a> for u32 { + fn from_kcl_val(arg: &'a KclValue) -> Option { + match arg { + KclValue::Number { value, meta: _ } => crate::try_f64_to_u32(*value), + KclValue::Int { value, meta: _ } => Some(*value as u32), + _ => None, + } + } +} + +impl<'a> FromKclValue<'a> for NonZeroU32 { + fn from_kcl_val(arg: &'a KclValue) -> Option { + u32::from_kcl_val(arg).and_then(|x| x.try_into().ok()) + } +} + +impl<'a> FromKclValue<'a> for u64 { + fn from_kcl_val(arg: &'a KclValue) -> Option { + match arg { + KclValue::Number { value, meta: _ } => crate::try_f64_to_u64(*value), + KclValue::Int { value, meta: _ } => Some(*value as u64), + _ => None, + } + } +} +impl<'a> FromKclValue<'a> for f64 { + fn from_kcl_val(arg: &'a KclValue) -> Option { + match arg { + KclValue::Number { value, meta: _ } => Some(*value), + KclValue::Int { value, meta: _ } => Some(*value as f64), + _ => None, + } + } +} +impl<'a> FromKclValue<'a> for Sketch { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let KclValue::Sketch { value } = arg else { + return None; + }; + Some(value.as_ref().to_owned()) + } +} +impl<'a> FromKclValue<'a> for String { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let KclValue::String { value, meta: _ } = arg else { + return None; + }; + Some(value.to_owned()) + } +} +impl<'a> FromKclValue<'a> for crate::parsing::ast::types::KclNone { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let KclValue::KclNone { value, meta: _ } = arg else { + return None; + }; + Some(value.to_owned()) + } +} +impl<'a> FromKclValue<'a> for bool { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let KclValue::Bool { value, meta: _ } = arg else { + return None; + }; + Some(*value) + } +} + +impl<'a> FromKclValue<'a> for SketchSet { + fn from_kcl_val(arg: &'a KclValue) -> Option { + match arg { + KclValue::Sketch { value: sketch } => Some(SketchSet::from(sketch.to_owned())), + KclValue::Sketches { value } => Some(SketchSet::from(value.to_owned())), + KclValue::Array { .. } => { + let v: Option> = FromKclValue::from_kcl_val(arg); + Some(SketchSet::Sketches(v?.iter().cloned().map(Box::new).collect())) + } + _ => None, } } } impl<'a> FromKclValue<'a> for Box { - fn from_mem_item(arg: &'a KclValue) -> Option { + fn from_kcl_val(arg: &'a KclValue) -> Option { let KclValue::Solid(s) = arg else { return None; }; @@ -705,26 +1633,21 @@ impl<'a> FromKclValue<'a> for Box { } impl<'a> FromKclValue<'a> for FnAsArg<'a> { - fn from_mem_item(arg: &'a KclValue) -> Option { + fn from_kcl_val(arg: &'a KclValue) -> Option { arg.get_function() } } impl<'a> FromKclValue<'a> for SolidSet { - fn from_mem_item(arg: &'a KclValue) -> Option { + fn from_kcl_val(arg: &'a KclValue) -> Option { arg.get_solid_set().ok() } } + impl<'a> FromKclValue<'a> for SketchOrSurface { - fn from_mem_item(arg: &'a KclValue) -> Option { + fn from_kcl_val(arg: &'a KclValue) -> Option { match arg { - KclValue::UserVal(uv) => { - if let Some((sg, _meta)) = uv.get() { - Some(Self::Sketch(sg)) - } else { - None - } - } + KclValue::Sketch { value: sg } => Some(Self::Sketch(sg.to_owned())), KclValue::Plane(sg) => Some(Self::SketchSurface(SketchSurface::Plane(sg.clone()))), KclValue::Face(sg) => Some(Self::SketchSurface(SketchSurface::Face(sg.clone()))), _ => None, @@ -732,7 +1655,7 @@ impl<'a> FromKclValue<'a> for SketchOrSurface { } } impl<'a> FromKclValue<'a> for SketchSurface { - fn from_mem_item(arg: &'a KclValue) -> Option { + fn from_kcl_val(arg: &'a KclValue) -> Option { match arg { KclValue::Plane(sg) => Some(Self::Plane(sg.clone())), KclValue::Face(sg) => Some(Self::Face(sg.clone())), @@ -740,3 +1663,19 @@ impl<'a> FromKclValue<'a> for SketchSurface { } } } + +impl From for Metadata { + fn from(value: Args) -> Self { + Self { + source_range: value.source_range, + } + } +} + +impl From for Vec { + fn from(value: Args) -> Self { + vec![Metadata { + source_range: value.source_range, + }] + } +} diff --git a/src/wasm-lib/kcl/src/std/array.rs b/src/wasm-lib/kcl/src/std/array.rs index 5ecc65858..65bca4742 100644 --- a/src/wasm-lib/kcl/src/std/array.rs +++ b/src/wasm-lib/kcl/src/std/array.rs @@ -1,47 +1,28 @@ use derive_docs::stdlib; -use serde_json::Value as JValue; -use super::{args::FromArgs, Args, FnAsArg}; +use super::{ + args::{Arg, FromArgs}, + Args, FnAsArg, +}; use crate::{ errors::{KclError, KclErrorDetails}, - executor::{ExecState, KclValue, SourceRange, UserVal}, - function_param::FunctionParam, + execution::{ExecState, FunctionParam, KclValue}, + source_range::SourceRange, }; /// Apply a function to each element of an array. pub async fn map(exec_state: &mut ExecState, args: Args) -> Result { - let (array, f): (Vec, FnAsArg<'_>) = FromArgs::from_args(&args, 0)?; - let array: Vec = array - .into_iter() - .map(|jval| { - KclValue::UserVal(UserVal { - value: jval, - meta: vec![args.source_range.into()], - }) - }) - .collect(); + let (array, f): (Vec, FnAsArg<'_>) = FromArgs::from_args(&args, 0)?; + let meta = vec![args.source_range.into()]; let map_fn = FunctionParam { inner: f.func, fn_expr: f.expr, - meta: vec![args.source_range.into()], + meta: meta.clone(), ctx: args.ctx.clone(), memory: *f.memory, }; let new_array = inner_map(array, map_fn, exec_state, &args).await?; - let unwrapped = new_array - .clone() - .into_iter() - .map(|k| match k { - KclValue::UserVal(user_val) => Ok(user_val.value), - _ => Err(()), - }) - .collect::, _>>(); - if let Ok(unwrapped) = unwrapped { - let uv = UserVal::new(vec![args.source_range.into()], unwrapped); - return Ok(KclValue::UserVal(uv)); - } - let uv = UserVal::new(vec![args.source_range.into()], new_array); - Ok(KclValue::UserVal(uv)) + Ok(KclValue::Array { value: new_array, meta }) } /// Apply a function to every element of a list. @@ -49,8 +30,8 @@ pub async fn map(exec_state: &mut ExecState, args: Args) -> Result { +/// r = 10 // radius +/// fn drawCircle(id) { /// return startSketchOn("XY") /// |> circle({ center: [id * 2 * r, 0], radius: r}, %) /// } @@ -58,17 +39,17 @@ pub async fn map(exec_state: &mut ExecState, args: Args) -> Result { +/// fn(id) { /// return startSketchOn("XY") /// |> circle({ center: [id * 2 * r, 0], radius: r}, %) /// } @@ -97,7 +78,7 @@ async fn call_map_closure<'a>( source_range: SourceRange, exec_state: &mut ExecState, ) -> Result { - let output = map_fn.call(exec_state, vec![input]).await?; + let output = map_fn.call(exec_state, vec![Arg::synthetic(input)]).await?; let source_ranges = vec![source_range]; let output = output.ok_or_else(|| { KclError::Semantic(KclErrorDetails { @@ -110,16 +91,7 @@ async fn call_map_closure<'a>( /// For each item in an array, update a value. pub async fn reduce(exec_state: &mut ExecState, args: Args) -> Result { - let (array, start, f): (Vec, KclValue, FnAsArg<'_>) = FromArgs::from_args(&args, 0)?; - let array: Vec = array - .into_iter() - .map(|jval| { - KclValue::UserVal(UserVal { - value: jval, - meta: vec![args.source_range.into()], - }) - }) - .collect(); + let (array, start, f): (Vec, KclValue, FnAsArg<'_>) = FromArgs::from_args(&args, 0)?; let reduce_fn = FunctionParam { inner: f.func, fn_expr: f.expr, @@ -133,26 +105,81 @@ pub async fn reduce(exec_state: &mut ExecState, args: Args) -> Result { -/// let step = (1/10) * tau() -/// let sketch001 = startSketchAt([(cos(0)*radius), (sin(0) * radius)]) -/// return reduce([1..10], sketch001, (i, sg) => { -/// let x = cos(step * i) * radius -/// let y = sin(step * i) * radius -/// return lineTo([x, y], sg) -/// }) -/// } -/// decagon(5.0) |> close(%) +/// // This function adds two numbers. +/// fn add(a, b) { return a + b } +/// +/// // This function adds an array of numbers. +/// // It uses the `reduce` function, to call the `add` function on every +/// // element of the `arr` parameter. The starting value is 0. +/// fn sum(arr) { return reduce(arr, 0, add) } +/// +/// /* +/// The above is basically like this pseudo-code: +/// fn sum(arr): +/// sumSoFar = 0 +/// for i in arr: +/// sumSoFar = add(sumSoFar, i) +/// return sumSoFar +/// */ +/// +/// // We use `assertEqual` to check that our `sum` function gives the +/// // expected result. It's good to check your work! +/// assertEqual(sum([1, 2, 3]), 6, 0.00001, "1 + 2 + 3 summed is 6") /// ``` /// ```no_run -/// array = [1, 2, 3] -/// sum = reduce(array, 0, (i, result_so_far) => { return i + result_so_far }) +/// // This example works just like the previous example above, but it uses +/// // an anonymous `add` function as its parameter, instead of declaring a +/// // named function outside. +/// arr = [1, 2, 3] +/// sum = reduce(arr, 0, (i, result_so_far) => { return i + result_so_far }) +/// +/// // We use `assertEqual` to check that our `sum` function gives the +/// // expected result. It's good to check your work! /// assertEqual(sum, 6, 0.00001, "1 + 2 + 3 summed is 6") /// ``` /// ```no_run -/// fn add = (a, b) => { return a + b } -/// fn sum = (array) => { return reduce(array, 0, add) } -/// assertEqual(sum([1, 2, 3]), 6, 0.00001, "1 + 2 + 3 summed is 6") +/// // Declare a function that sketches a decagon. +/// fn decagon(radius) { +/// // Each side of the decagon is turned this many degrees from the previous angle. +/// stepAngle = (1/10) * tau() +/// +/// // Start the decagon sketch at this point. +/// startOfDecagonSketch = startSketchOn('XY') +/// |> startProfileAt([(cos(0)*radius), (sin(0) * radius)], %) +/// +/// // Use a `reduce` to draw the remaining decagon sides. +/// // For each number in the array 1..10, run the given function, +/// // which takes a partially-sketched decagon and adds one more edge to it. +/// fullDecagon = reduce([1..10], startOfDecagonSketch, fn(i, partialDecagon) { +/// // Draw one edge of the decagon. +/// x = cos(stepAngle * i) * radius +/// y = sin(stepAngle * i) * radius +/// return lineTo([x, y], partialDecagon) +/// }) +/// +/// return fullDecagon +/// +/// } +/// +/// /* +/// The `decagon` above is basically like this pseudo-code: +/// fn decagon(radius): +/// stepAngle = (1/10) * tau() +/// plane = startSketchOn('XY') +/// startOfDecagonSketch = startProfileAt([(cos(0)*radius), (sin(0) * radius)], plane) +/// +/// // Here's the reduce part. +/// partialDecagon = startOfDecagonSketch +/// for i in [1..10]: +/// x = cos(stepAngle * i) * radius +/// y = sin(stepAngle * i) * radius +/// partialDecagon = lineTo([x, y], partialDecagon) +/// fullDecagon = partialDecagon // it's now full +/// return fullDecagon +/// */ +/// +/// // Use the `decagon` function declared above, to sketch a decagon with radius 5. +/// decagon(5.0) |> close(%) /// ``` #[stdlib { name = "reduce", @@ -180,7 +207,7 @@ async fn call_reduce_closure<'a>( exec_state: &mut ExecState, ) -> Result { // Call the reduce fn for this repetition. - let reduce_fn_args = vec![elem, start]; + let reduce_fn_args = vec![Arg::synthetic(elem), Arg::synthetic(start)]; let transform_fn_return = reduce_fn.call(exec_state, reduce_fn_args).await?; // Unpack the returned transform object. @@ -193,3 +220,91 @@ async fn call_reduce_closure<'a>( })?; Ok(out) } + +/// Append an element to the end of an array. +/// +/// Returns a new array with the element appended. +/// +/// ```no_run +/// arr = [1, 2, 3] +/// new_arr = push(arr, 4) +/// assertEqual(new_arr[3], 4, 0.00001, "4 was added to the end of the array") +/// ``` +#[stdlib { + name = "push", +}] +async fn inner_push(mut array: Vec, elem: KclValue, args: &Args) -> Result { + // Unwrap the KclValues to JValues for manipulation + array.push(elem); + Ok(KclValue::Array { + value: array, + meta: vec![args.source_range.into()], + }) +} + +pub async fn push(_exec_state: &mut ExecState, args: Args) -> Result { + // Extract the array and the element from the arguments + let (val, elem): (KclValue, KclValue) = FromArgs::from_args(&args, 0)?; + + let meta = vec![args.source_range]; + let KclValue::Array { value: array, meta: _ } = val else { + let actual_type = val.human_friendly_type(); + return Err(KclError::Semantic(KclErrorDetails { + source_ranges: meta, + message: format!("You can't push to a value of type {actual_type}, only an array"), + })); + }; + inner_push(array, elem, &args).await +} + +/// Remove the last element from an array. +/// +/// Returns a new array with the last element removed. +/// +/// ```no_run +/// arr = [1, 2, 3, 4] +/// new_arr = pop(arr) +/// assertEqual(new_arr[0], 1, 0.00001, "1 is the first element of the array") +/// assertEqual(new_arr[1], 2, 0.00001, "2 is the second element of the array") +/// assertEqual(new_arr[2], 3, 0.00001, "3 is the third element of the array") +/// ``` +#[stdlib { + name = "pop", + keywords = true, + unlabeled_first = true, + arg_docs = { + array = "The array to pop from. Must not be empty.", + } +}] +async fn inner_pop(array: Vec, args: &Args) -> Result { + if array.is_empty() { + return Err(KclError::Semantic(KclErrorDetails { + message: "Cannot pop from an empty array".to_string(), + source_ranges: vec![args.source_range], + })); + } + + // Create a new array with all elements except the last one + let new_array = array[..array.len() - 1].to_vec(); + + Ok(KclValue::Array { + value: new_array, + meta: vec![args.source_range.into()], + }) +} + +pub async fn pop(_exec_state: &mut ExecState, args: Args) -> Result { + // Extract the array from the arguments + let val = args.get_unlabeled_kw_arg("array")?; + + let meta = vec![args.source_range]; + let KclValue::Array { value: array, meta: _ } = val else { + let actual_type = val.human_friendly_type(); + return Err(KclError::Semantic(KclErrorDetails { + source_ranges: meta, + message: format!("You can't pop from a value of type {actual_type}, only an array"), + })); + }; + + inner_pop(array, &args).await +} diff --git a/src/wasm-lib/kcl/src/std/assert.rs b/src/wasm-lib/kcl/src/std/assert.rs index 2b9c4a491..e8abd5dcc 100644 --- a/src/wasm-lib/kcl/src/std/assert.rs +++ b/src/wasm-lib/kcl/src/std/assert.rs @@ -5,7 +5,7 @@ use derive_docs::stdlib; use crate::{ errors::{KclError, KclErrorDetails}, - executor::{ExecState, KclValue}, + execution::{ExecState, KclValue}, std::Args, }; @@ -24,14 +24,14 @@ async fn _assert(value: bool, message: &str, args: &Args) -> Result<(), KclError pub async fn assert(_exec_state: &mut ExecState, args: Args) -> Result { let (data, description): (bool, String) = args.get_data()?; inner_assert(data, &description, &args).await?; - args.make_null_user_val() + Ok(args.make_user_val_from_f64(0.0)) // TODO: Add a new Void enum for fns that don't return anything. } /// Check a value at runtime, and raise an error if the argument provided /// is false. /// /// ```no_run -/// const myVar = true +/// myVar = true /// assert(myVar, "should always be true") /// ``` #[stdlib { @@ -44,7 +44,7 @@ async fn inner_assert(data: bool, message: &str, args: &Args) -> Result<(), KclE pub async fn assert_lt(_exec_state: &mut ExecState, args: Args) -> Result { let (left, right, description): (f64, f64, String) = args.get_data()?; inner_assert_lt(left, right, &description, &args).await?; - args.make_null_user_val() + Ok(args.make_user_val_from_f64(0.0)) // TODO: Add a new Void enum for fns that don't return anything. } /// Check that a numerical value is less than to another at runtime, @@ -63,22 +63,27 @@ async fn inner_assert_lt(left: f64, right: f64, message: &str, args: &Args) -> R pub async fn assert_gt(_exec_state: &mut ExecState, args: Args) -> Result { let (left, right, description): (f64, f64, String) = args.get_data()?; inner_assert_gt(left, right, &description, &args).await?; - args.make_null_user_val() + Ok(args.make_user_val_from_f64(0.0)) // TODO: Add a new Void enum for fns that don't return anything. } /// Check that a numerical value equals another at runtime, /// otherwise raise an error. /// /// ```no_run -/// let n = 1.0285 -/// let o = 1.0286 +/// n = 1.0285 +/// o = 1.0286 /// assertEqual(n, o, 0.01, "n is within the given tolerance for o") /// ``` #[stdlib { name = "assertEqual", }] async fn inner_assert_equal(left: f64, right: f64, epsilon: f64, message: &str, args: &Args) -> Result<(), KclError> { - if (right - left).abs() < epsilon { + if epsilon <= 0.0 { + Err(KclError::Type(KclErrorDetails { + message: "assertEqual epsilon must be greater than zero".to_owned(), + source_ranges: vec![args.source_range], + })) + } else if (right - left).abs() < epsilon { Ok(()) } else { Err(KclError::Type(KclErrorDetails { @@ -91,7 +96,7 @@ async fn inner_assert_equal(left: f64, right: f64, epsilon: f64, message: &str, pub async fn assert_equal(_exec_state: &mut ExecState, args: Args) -> Result { let (left, right, epsilon, description): (f64, f64, f64, String) = args.get_data()?; inner_assert_equal(left, right, epsilon, &description, &args).await?; - args.make_null_user_val() + Ok(args.make_user_val_from_f64(0.0)) // TODO: Add a new Void enum for fns that don't return anything. } /// Check that a numerical value is greater than another at runtime, @@ -110,7 +115,7 @@ async fn inner_assert_gt(left: f64, right: f64, message: &str, args: &Args) -> R pub async fn assert_lte(_exec_state: &mut ExecState, args: Args) -> Result { let (left, right, description): (f64, f64, String) = args.get_data()?; inner_assert_lte(left, right, &description, &args).await?; - args.make_null_user_val() + Ok(args.make_user_val_from_f64(0.0)) // TODO: Add a new Void enum for fns that don't return anything. } /// Check that a numerical value is less than or equal to another at runtime, @@ -130,7 +135,7 @@ async fn inner_assert_lte(left: f64, right: f64, message: &str, args: &Args) -> pub async fn assert_gte(_exec_state: &mut ExecState, args: Args) -> Result { let (left, right, description): (f64, f64, String) = args.get_data()?; inner_assert_gte(left, right, &description, &args).await?; - args.make_null_user_val() + Ok(args.make_user_val_from_f64(0.0)) // TODO: Add a new Void enum for fns that don't return anything. } /// Check that a numerical value is greater than or equal to another at runtime, diff --git a/src/wasm-lib/kcl/src/std/chamfer.rs b/src/wasm-lib/kcl/src/std/chamfer.rs index e3deb4250..9c4d6c864 100644 --- a/src/wasm-lib/kcl/src/std/chamfer.rs +++ b/src/wasm-lib/kcl/src/std/chamfer.rs @@ -8,9 +8,9 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use crate::{ - ast::types::TagDeclarator, errors::{KclError, KclErrorDetails}, - executor::{ChamferSurface, EdgeCut, ExecState, ExtrudeSurface, GeoMeta, KclValue, Solid}, + execution::{ChamferSurface, EdgeCut, ExecState, ExtrudeSurface, GeoMeta, KclValue, Solid}, + parsing::ast::types::TagNode, std::{fillet::EdgeReference, Args}, }; @@ -29,7 +29,7 @@ pub struct ChamferData { /// Create chamfers on tagged paths. pub async fn chamfer(exec_state: &mut ExecState, args: Args) -> Result { - let (data, solid, tag): (ChamferData, Box, Option) = args.get_data_and_solid_and_tag()?; + let (data, solid, tag): (ChamferData, Box, Option) = args.get_data_and_solid_and_tag()?; let solid = inner_chamfer(data, solid, tag, exec_state, args).await?; Ok(KclValue::Solid(solid)) @@ -43,22 +43,22 @@ pub async fn chamfer(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([-width/2, -length/2], %) /// |> lineTo([width/2, -length/2], %, $edge1) /// |> lineTo([width/2, length/2], %, $edge2) /// |> lineTo([-width/2, length/2], %, $edge3) /// |> close(%, $edge4) /// -/// const mountingPlate = extrude(thickness, mountingPlateSketch) +/// mountingPlate = extrude(thickness, mountingPlateSketch) /// |> chamfer({ -/// length: chamferLength, -/// tags: [ +/// length = chamferLength, +/// tags = [ /// getNextAdjacentEdge(edge1), /// getNextAdjacentEdge(edge2), /// getNextAdjacentEdge(edge3), @@ -69,8 +69,8 @@ pub async fn chamfer(exec_state: &mut ExecState, args: Args) -> Result { -/// const sg = startSketchOn('XY') +/// fn cube(pos, scale) { +/// sg = startSketchOn('XY') /// |> startProfileAt(pos, %) /// |> line([0, scale], %) /// |> line([scale, 0], %) @@ -79,15 +79,15 @@ pub async fn chamfer(exec_state: &mut ExecState, args: Args) -> Result close(%, $line1) /// |> extrude(20, %) /// |> chamfer({ -/// length: 10, -/// tags: [getOppositeEdge(line1)] +/// length = 10, +/// tags = [getOppositeEdge(line1)] /// }, %, $chamfer1) // We tag the chamfer to reference it later. /// -/// const sketch001 = startSketchOn(part001, chamfer1) +/// sketch001 = startSketchOn(part001, chamfer1) /// |> startProfileAt([10, 10], %) /// |> line([2, 0], %) /// |> line([0, 2], %) @@ -98,11 +98,12 @@ pub async fn chamfer(exec_state: &mut ExecState, args: Args) -> Result, - tag: Option, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result, KclError> { @@ -133,7 +134,7 @@ async fn inner_chamfer( EdgeReference::Tag(edge_tag) => args.get_tag_engine_info(exec_state, &edge_tag)?.id, }; - let id = exec_state.id_generator.next_uuid(); + let id = exec_state.global.id_generator.next_uuid(); args.batch_end_cmd( id, ModelingCmd::from(mcmd::Solid3dFilletEdge { diff --git a/src/wasm-lib/kcl/src/std/convert.rs b/src/wasm-lib/kcl/src/std/convert.rs index 69e8729ff..22c851f91 100644 --- a/src/wasm-lib/kcl/src/std/convert.rs +++ b/src/wasm-lib/kcl/src/std/convert.rs @@ -3,101 +3,38 @@ use derive_docs::stdlib; use crate::{ - errors::{KclError, KclErrorDetails}, - executor::{ExecState, KclValue, SourceRange}, + errors::KclError, + execution::{ExecState, KclValue}, std::Args, }; -#[derive(Debug, PartialEq, Eq)] -enum ConversionError { - Nan, - TooLarge, -} - -impl ConversionError { - pub fn into_kcl_error(self, source_range: SourceRange) -> KclError { - match self { - ConversionError::Nan => KclError::Semantic(KclErrorDetails { - message: "NaN cannot be converted to an integer".to_owned(), - source_ranges: vec![source_range], - }), - ConversionError::TooLarge => KclError::Semantic(KclErrorDetails { - message: "Number is too large to convert to integer".to_owned(), - source_ranges: vec![source_range], - }), - } - } -} - /// Converts a number to integer. pub async fn int(_exec_state: &mut ExecState, args: Args) -> Result { let num = args.get_number()?; - let converted = inner_int(num).map_err(|err| err.into_kcl_error(args.source_range))?; + let converted = inner_int(num)?; - args.make_user_val_from_i64(converted) + Ok(args.make_user_val_from_f64(converted)) } /// Convert a number to an integer. /// -/// Callers should use floor(), ceil(), or other rounding function first if they -/// care about how numbers with fractional parts are converted. If the number -/// has a fractional part, it's truncated, moving the number towards zero. -/// -/// If the number is NaN or has a magnitude, either positive or negative, that -/// is too large to fit into the internal integer representation, the result is -/// a runtime error. +/// DEPRECATED use floor(), ceil(), or round(). /// /// ```no_run -/// let n = int(ceil(5/2)) +/// n = int(ceil(5/2)) /// assertEqual(n, 3, 0.0001, "5/2 = 2.5, rounded up makes 3") /// // Draw n cylinders. /// startSketchOn('XZ') -/// |> circle({ center: [0, 0], radius: 2 }, %) +/// |> circle({ center = [0, 0], radius = 2 }, %) /// |> extrude(5, %) -/// |> patternTransform(n, (id) => { -/// return { translate: [4 * id, 0, 0] } +/// |> patternTransform(n, fn(id) { +/// return { translate = [4 * id, 0, 0] } /// }, %) /// ``` #[stdlib { name = "int", tags = ["convert"], }] -fn inner_int(num: f64) -> Result { - if num.is_nan() { - return Err(ConversionError::Nan); - } - if num > 2_f64.powi(53) || num < -(2_f64.powi(53)) { - // 2^53 is the largest magnitude integer that can be represented in f64 - // and accurately converted. - return Err(ConversionError::TooLarge); - } - - Ok(num as i64) -} - -#[cfg(test)] -mod tests { - use core::f64; - - use pretty_assertions::assert_eq; - - use super::*; - - #[test] - fn test_inner_int() { - assert_eq!(inner_int(0.0), Ok(0)); - assert_eq!(inner_int(-0.0), Ok(0)); - assert_eq!(inner_int(3.0), Ok(3)); - assert_eq!(inner_int(2.5), Ok(2)); - assert_eq!(inner_int(-2.5), Ok(-2)); - assert_eq!(inner_int(f64::NAN), Err(ConversionError::Nan)); - assert_eq!(inner_int(f64::INFINITY), Err(ConversionError::TooLarge)); - assert_eq!(inner_int(f64::NEG_INFINITY), Err(ConversionError::TooLarge)); - assert_eq!(inner_int(2_f64.powi(53)), Ok(2_i64.pow(53))); - assert_eq!(inner_int(-(2_f64.powi(53))), Ok(-(2_i64.pow(53)))); - // Note: 2_f64.powi(53) + 1.0 can't be represented. - assert_eq!(inner_int(2_f64.powi(53) + 2.0), Err(ConversionError::TooLarge)); - assert_eq!(inner_int(-(2_f64.powi(53)) - 2.0), Err(ConversionError::TooLarge)); - assert_eq!(inner_int(-(2_f64.powi(64))), Err(ConversionError::TooLarge)); - } +fn inner_int(num: f64) -> Result { + Ok(num) } diff --git a/src/wasm-lib/kcl/src/std/extrude.rs b/src/wasm-lib/kcl/src/std/extrude.rs index f4e277605..e8a672d12 100644 --- a/src/wasm-lib/kcl/src/std/extrude.rs +++ b/src/wasm-lib/kcl/src/std/extrude.rs @@ -13,7 +13,9 @@ use uuid::Uuid; use crate::{ errors::{KclError, KclErrorDetails}, - executor::{ExecState, ExtrudeSurface, GeoMeta, KclValue, Path, Sketch, SketchSet, SketchSurface, Solid, SolidSet}, + execution::{ + ExecState, ExtrudeSurface, GeoMeta, KclValue, Path, Sketch, SketchSet, SketchSurface, Solid, SolidSet, + }, std::Args, }; @@ -31,20 +33,20 @@ pub async fn extrude(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> line([10, 0], %) /// |> arc({ -/// angleStart: 120, -/// angleEnd: 0, -/// radius: 5, +/// angleStart = 120, +/// angleEnd = 0, +/// radius = 5, /// }, %) /// |> line([5, 0], %) /// |> line([0, 10], %) /// |> bezierCurve({ -/// control1: [-10, 0], -/// control2: [2, 10], -/// to: [-5, 10], +/// control1 = [-10, 0], +/// control2 = [2, 10], +/// to = [-5, 10], /// }, %) /// |> line([-5, -2], %) /// |> close(%) @@ -52,28 +54,29 @@ pub async fn extrude(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([-10, 0], %) /// |> arc({ -/// angleStart: 120, -/// angleEnd: -60, -/// radius: 5, +/// angleStart = 120, +/// angleEnd = -60, +/// radius = 5, /// }, %) /// |> line([10, 0], %) /// |> line([5, 0], %) /// |> bezierCurve({ -/// control1: [-3, 0], -/// control2: [2, 10], -/// to: [-5, 10], +/// control1 = [-3, 0], +/// control2 = [2, 10], +/// to = [-5, 10], /// }, %) /// |> line([-4, 10], %) /// |> line([-5, -2], %) /// |> close(%) /// -/// const example = extrude(10, exampleSketch) +/// example = extrude(10, exampleSketch) /// ``` #[stdlib { - name = "extrude" + name = "extrude", + feature_tree_operation = true, }] async fn inner_extrude( length: f64, @@ -81,7 +84,7 @@ async fn inner_extrude( exec_state: &mut ExecState, args: Args, ) -> Result { - let id = exec_state.id_generator.next_uuid(); + let id = exec_state.next_uuid(); // Extrude the element(s). let sketches: Vec = sketch_set.into(); @@ -90,7 +93,7 @@ async fn inner_extrude( // Before we extrude, we need to enable the sketch mode. // We do this here in case extrude is called out of order. args.batch_modeling_cmd( - exec_state.id_generator.next_uuid(), + exec_state.next_uuid(), ModelingCmd::from(mcmd::EnableSketchMode { animated: false, ortho: false, @@ -111,13 +114,14 @@ async fn inner_extrude( ModelingCmd::from(mcmd::Extrude { target: sketch.id.into(), distance: LengthUnit(length), + faces: Default::default(), }), ) .await?; // Disable the sketch mode. args.batch_modeling_cmd( - exec_state.id_generator.next_uuid(), + exec_state.next_uuid(), ModelingCmd::SketchModeDisable(mcmd::SketchModeDisable {}), ) .await?; @@ -136,7 +140,7 @@ pub(crate) async fn do_post_extrude( // Bring the object to the front of the scene. // See: https://github.com/KittyCAD/modeling-app/issues/806 args.batch_modeling_cmd( - exec_state.id_generator.next_uuid(), + exec_state.next_uuid(), ModelingCmd::from(mcmd::ObjectBringToFront { object_id: sketch.id }), ) .await?; @@ -159,7 +163,7 @@ pub(crate) async fn do_post_extrude( let solid3d_info = args .send_modeling_cmd( - exec_state.id_generator.next_uuid(), + exec_state.next_uuid(), ModelingCmd::from(mcmd::Solid3dGetExtrusionFaceInfo { edge_id: any_edge_id, object_id: sketch.id, @@ -192,7 +196,7 @@ pub(crate) async fn do_post_extrude( // Instead, the Typescript codebases (which handles WebSocket sends when compiled via Wasm) // uses this to build the artifact graph, which the UI needs. args.batch_modeling_cmd( - exec_state.id_generator.next_uuid(), + exec_state.next_uuid(), ModelingCmd::from(mcmd::Solid3dGetOppositeEdge { edge_id: curve_id, object_id: sketch.id, @@ -202,7 +206,7 @@ pub(crate) async fn do_post_extrude( .await?; args.batch_modeling_cmd( - exec_state.id_generator.next_uuid(), + exec_state.next_uuid(), ModelingCmd::from(mcmd::Solid3dGetNextAdjacentEdge { edge_id: curve_id, object_id: sketch.id, @@ -228,23 +232,23 @@ pub(crate) async fn do_post_extrude( | Path::TangentialArc { .. } | Path::TangentialArcTo { .. } | Path::Circle { .. } => { - let extrude_surface = ExtrudeSurface::ExtrudeArc(crate::executor::ExtrudeArc { + let extrude_surface = ExtrudeSurface::ExtrudeArc(crate::execution::ExtrudeArc { face_id: *actual_face_id, tag: path.get_base().tag.clone(), geo_meta: GeoMeta { id: path.get_base().geo_meta.id, - metadata: path.get_base().geo_meta.metadata.clone(), + metadata: path.get_base().geo_meta.metadata, }, }); Some(extrude_surface) } Path::Base { .. } | Path::ToPoint { .. } | Path::Horizontal { .. } | Path::AngledLineTo { .. } => { - let extrude_surface = ExtrudeSurface::ExtrudePlane(crate::executor::ExtrudePlane { + let extrude_surface = ExtrudeSurface::ExtrudePlane(crate::execution::ExtrudePlane { face_id: *actual_face_id, tag: path.get_base().tag.clone(), geo_meta: GeoMeta { id: path.get_base().geo_meta.id, - metadata: path.get_base().geo_meta.metadata.clone(), + metadata: path.get_base().geo_meta.metadata, }, }); Some(extrude_surface) @@ -253,13 +257,13 @@ pub(crate) async fn do_post_extrude( } else if args.ctx.is_mock() { // Only pre-populate the extrude surface if we are in mock mode. - let extrude_surface = ExtrudeSurface::ExtrudePlane(crate::executor::ExtrudePlane { + let extrude_surface = ExtrudeSurface::ExtrudePlane(crate::execution::ExtrudePlane { // pushing this values with a fake face_id to make extrudes mock-execute safe - face_id: exec_state.id_generator.next_uuid(), + face_id: exec_state.next_uuid(), tag: path.get_base().tag.clone(), geo_meta: GeoMeta { id: path.get_base().geo_meta.id, - metadata: path.get_base().geo_meta.metadata.clone(), + metadata: path.get_base().geo_meta.metadata, }, }); Some(extrude_surface) @@ -301,13 +305,17 @@ fn analyze_faces(exec_state: &mut ExecState, args: &Args, face_infos: Vec faces.start_cap_id = face_info.face_id, ExtrusionFaceCapType::Top => faces.end_cap_id = face_info.face_id, + ExtrusionFaceCapType::Both => { + faces.end_cap_id = face_info.face_id; + faces.start_cap_id = face_info.face_id; + } ExtrusionFaceCapType::None => { if let Some(curve_id) = face_info.curve_id { faces.sides.insert(curve_id, face_info.face_id); diff --git a/src/wasm-lib/kcl/src/std/fillet.rs b/src/wasm-lib/kcl/src/std/fillet.rs index 8e0f0fdc9..81277303d 100644 --- a/src/wasm-lib/kcl/src/std/fillet.rs +++ b/src/wasm-lib/kcl/src/std/fillet.rs @@ -12,9 +12,9 @@ use serde::{Deserialize, Serialize}; use uuid::Uuid; use crate::{ - ast::types::TagDeclarator, errors::{KclError, KclErrorDetails}, - executor::{EdgeCut, ExecState, ExtrudeSurface, FilletSurface, GeoMeta, KclValue, Solid, TagIdentifier, UserVal}, + execution::{EdgeCut, ExecState, ExtrudeSurface, FilletSurface, GeoMeta, KclValue, Solid, TagIdentifier}, + parsing::ast::types::TagNode, settings::types::UnitLength, std::Args, }; @@ -55,7 +55,7 @@ impl EdgeReference { /// Create fillets on tagged paths. pub async fn fillet(exec_state: &mut ExecState, args: Args) -> Result { - let (data, solid, tag): (FilletData, Box, Option) = args.get_data_and_solid_and_tag()?; + let (data, solid, tag): (FilletData, Box, Option) = args.get_data_and_solid_and_tag()?; let solid = inner_fillet(data, solid, tag, exec_state, args).await?; Ok(KclValue::Solid(solid)) @@ -68,22 +68,22 @@ pub async fn fillet(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([-width/2, -length/2], %) /// |> lineTo([width/2, -length/2], %, $edge1) /// |> lineTo([width/2, length/2], %, $edge2) /// |> lineTo([-width/2, length/2], %, $edge3) /// |> close(%, $edge4) /// -/// const mountingPlate = extrude(thickness, mountingPlateSketch) +/// mountingPlate = extrude(thickness, mountingPlateSketch) /// |> fillet({ -/// radius: filletRadius, -/// tags: [ +/// radius = filletRadius, +/// tags = [ /// getNextAdjacentEdge(edge1), /// getNextAdjacentEdge(edge2), /// getNextAdjacentEdge(edge3), @@ -93,23 +93,23 @@ pub async fn fillet(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([-width/2, -length/2], %) /// |> lineTo([width/2, -length/2], %, $edge1) /// |> lineTo([width/2, length/2], %, $edge2) /// |> lineTo([-width/2, length/2], %, $edge3) /// |> close(%, $edge4) /// -/// const mountingPlate = extrude(thickness, mountingPlateSketch) +/// mountingPlate = extrude(thickness, mountingPlateSketch) /// |> fillet({ -/// radius: filletRadius, -/// tolerance: 0.000001, -/// tags: [ +/// radius = filletRadius, +/// tolerance = 0.000001, +/// tags = [ /// getNextAdjacentEdge(edge1), /// getNextAdjacentEdge(edge2), /// getNextAdjacentEdge(edge3), @@ -119,11 +119,12 @@ pub async fn fillet(exec_state: &mut ExecState, args: Args) -> Result, - tag: Option, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result, KclError> { @@ -142,7 +143,7 @@ async fn inner_fillet( for edge_tag in data.tags { let edge_id = edge_tag.get_engine_id(exec_state, &args)?; - let id = exec_state.id_generator.next_uuid(); + let id = exec_state.next_uuid(); args.batch_end_cmd( id, ModelingCmd::from(mcmd::Solid3dFilletEdge { @@ -186,42 +187,37 @@ pub async fn get_opposite_edge(exec_state: &mut ExecState, args: Args) -> Result let tag: TagIdentifier = args.get_data()?; let edge = inner_get_opposite_edge(tag, exec_state, args.clone()).await?; - Ok(KclValue::UserVal(UserVal { - value: serde_json::to_value(edge).map_err(|e| { - KclError::Type(KclErrorDetails { - message: format!("Failed to convert Uuid to json: {}", e), - source_ranges: vec![args.source_range], - }) - })?, + Ok(KclValue::Uuid { + value: edge, meta: vec![args.source_range.into()], - })) + }) } /// Get the opposite edge to the edge given. /// /// ```no_run -/// const exampleSketch = startSketchOn('XZ') +/// exampleSketch = startSketchOn('XZ') /// |> startProfileAt([0, 0], %) /// |> line([10, 0], %) /// |> angledLine({ -/// angle: 60, -/// length: 10, +/// angle = 60, +/// length = 10, /// }, %) /// |> angledLine({ -/// angle: 120, -/// length: 10, +/// angle = 120, +/// length = 10, /// }, %) /// |> line([-10, 0], %) /// |> angledLine({ -/// angle: 240, -/// length: 10, +/// angle = 240, +/// length = 10, /// }, %, $referenceEdge) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// |> fillet({ -/// radius: 3, -/// tags: [getOppositeEdge(referenceEdge)], +/// radius = 3, +/// tags = [getOppositeEdge(referenceEdge)], /// }, %) /// ``` #[stdlib { @@ -229,11 +225,11 @@ pub async fn get_opposite_edge(exec_state: &mut ExecState, args: Args) -> Result }] async fn inner_get_opposite_edge(tag: TagIdentifier, exec_state: &mut ExecState, args: Args) -> Result { if args.ctx.is_mock() { - return Ok(exec_state.id_generator.next_uuid()); + return Ok(exec_state.next_uuid()); } let face_id = args.get_adjacent_face_to_tag(exec_state, &tag, false).await?; - let id = exec_state.id_generator.next_uuid(); + let id = exec_state.next_uuid(); let tagged_path = args.get_tag_engine_info(exec_state, &tag)?; let resp = args @@ -264,42 +260,37 @@ pub async fn get_next_adjacent_edge(exec_state: &mut ExecState, args: Args) -> R let tag: TagIdentifier = args.get_data()?; let edge = inner_get_next_adjacent_edge(tag, exec_state, args.clone()).await?; - Ok(KclValue::UserVal(UserVal { - value: serde_json::to_value(edge).map_err(|e| { - KclError::Type(KclErrorDetails { - message: format!("Failed to convert Uuid to json: {}", e), - source_ranges: vec![args.source_range], - }) - })?, + Ok(KclValue::Uuid { + value: edge, meta: vec![args.source_range.into()], - })) + }) } /// Get the next adjacent edge to the edge given. /// /// ```no_run -/// const exampleSketch = startSketchOn('XZ') +/// exampleSketch = startSketchOn('XZ') /// |> startProfileAt([0, 0], %) /// |> line([10, 0], %) /// |> angledLine({ -/// angle: 60, -/// length: 10, +/// angle = 60, +/// length = 10, /// }, %) /// |> angledLine({ -/// angle: 120, -/// length: 10, +/// angle = 120, +/// length = 10, /// }, %) /// |> line([-10, 0], %) /// |> angledLine({ -/// angle: 240, -/// length: 10, +/// angle = 240, +/// length = 10, /// }, %, $referenceEdge) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// |> fillet({ -/// radius: 3, -/// tags: [getNextAdjacentEdge(referenceEdge)], +/// radius = 3, +/// tags = [getNextAdjacentEdge(referenceEdge)], /// }, %) /// ``` #[stdlib { @@ -311,11 +302,11 @@ async fn inner_get_next_adjacent_edge( args: Args, ) -> Result { if args.ctx.is_mock() { - return Ok(exec_state.id_generator.next_uuid()); + return Ok(exec_state.next_uuid()); } let face_id = args.get_adjacent_face_to_tag(exec_state, &tag, false).await?; - let id = exec_state.id_generator.next_uuid(); + let id = exec_state.next_uuid(); let tagged_path = args.get_tag_engine_info(exec_state, &tag)?; let resp = args @@ -354,42 +345,37 @@ pub async fn get_previous_adjacent_edge(exec_state: &mut ExecState, args: Args) let tag: TagIdentifier = args.get_data()?; let edge = inner_get_previous_adjacent_edge(tag, exec_state, args.clone()).await?; - Ok(KclValue::UserVal(UserVal { - value: serde_json::to_value(edge).map_err(|e| { - KclError::Type(KclErrorDetails { - message: format!("Failed to convert Uuid to json: {}", e), - source_ranges: vec![args.source_range], - }) - })?, + Ok(KclValue::Uuid { + value: edge, meta: vec![args.source_range.into()], - })) + }) } /// Get the previous adjacent edge to the edge given. /// /// ```no_run -/// const exampleSketch = startSketchOn('XZ') +/// exampleSketch = startSketchOn('XZ') /// |> startProfileAt([0, 0], %) /// |> line([10, 0], %) /// |> angledLine({ -/// angle: 60, -/// length: 10, +/// angle = 60, +/// length = 10, /// }, %) /// |> angledLine({ -/// angle: 120, -/// length: 10, +/// angle = 120, +/// length = 10, /// }, %) /// |> line([-10, 0], %) /// |> angledLine({ -/// angle: 240, -/// length: 10, +/// angle = 240, +/// length = 10, /// }, %, $referenceEdge) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// |> fillet({ -/// radius: 3, -/// tags: [getPreviousAdjacentEdge(referenceEdge)], +/// radius = 3, +/// tags = [getPreviousAdjacentEdge(referenceEdge)], /// }, %) /// ``` #[stdlib { @@ -401,11 +387,11 @@ async fn inner_get_previous_adjacent_edge( args: Args, ) -> Result { if args.ctx.is_mock() { - return Ok(exec_state.id_generator.next_uuid()); + return Ok(exec_state.next_uuid()); } let face_id = args.get_adjacent_face_to_tag(exec_state, &tag, false).await?; - let id = exec_state.id_generator.next_uuid(); + let id = exec_state.next_uuid(); let tagged_path = args.get_tag_engine_info(exec_state, &tag)?; let resp = args diff --git a/src/wasm-lib/kcl/src/std/helix.rs b/src/wasm-lib/kcl/src/std/helix.rs index 5d340a5fb..d91486eee 100644 --- a/src/wasm-lib/kcl/src/std/helix.rs +++ b/src/wasm-lib/kcl/src/std/helix.rs @@ -9,7 +9,7 @@ use serde::{Deserialize, Serialize}; use crate::{ errors::KclError, - executor::{ExecState, KclValue, Solid}, + execution::{ExecState, KclValue, Solid}, std::Args, }; @@ -20,7 +20,7 @@ pub struct HelixData { /// Number of revolutions. pub revolutions: f64, /// Start angle (in degrees). - #[serde(rename = "angleStart", alias = "angle_start")] + #[serde(rename = "angleStart")] pub angle_start: f64, /// Is the helix rotation counter clockwise? /// The default is `false`. @@ -42,17 +42,18 @@ pub async fn helix(exec_state: &mut ExecState, args: Args) -> Result circle({ center: [5, 5], radius: 10 }, %) /// |> extrude(10, %) /// |> helix({ -/// angleStart: 0, -/// ccw: true, -/// revolutions: 16, +/// angleStart = 0, +/// ccw = true, +/// revolutions = 16, /// }, %) /// ``` #[stdlib { name = "helix", + feature_tree_operation = true, }] async fn inner_helix( data: HelixData, @@ -60,7 +61,7 @@ async fn inner_helix( exec_state: &mut ExecState, args: Args, ) -> Result, KclError> { - let id = exec_state.id_generator.next_uuid(); + let id = exec_state.next_uuid(); args.batch_modeling_cmd( id, ModelingCmd::from(mcmd::EntityMakeHelix { diff --git a/src/wasm-lib/kcl/src/std/import.rs b/src/wasm-lib/kcl/src/std/import.rs index 3167c7fc8..89ad712a2 100644 --- a/src/wasm-lib/kcl/src/std/import.rs +++ b/src/wasm-lib/kcl/src/std/import.rs @@ -18,7 +18,7 @@ use kittycad_modeling_cmds as kcmc; use crate::{ errors::{KclError, KclErrorDetails}, - executor::{ExecState, ImportedGeometry, KclValue}, + execution::{ExecState, ImportedGeometry, KclValue}, fs::FileSystem, std::Args, }; @@ -42,7 +42,7 @@ const ZOO_COORD_SYSTEM: System = System { /// Import format specifier #[derive(serde :: Serialize, serde :: Deserialize, PartialEq, Debug, Clone, schemars :: JsonSchema)] #[cfg_attr(feature = "tabled", derive(tabled::Tabled))] -#[serde(tag = "type")] +#[serde(tag = "format")] pub enum ImportFormat { /// Autodesk Filmbox (FBX) format #[serde(rename = "fbx")] @@ -144,27 +144,40 @@ pub async fn import(exec_state: &mut ExecState, args: Args) -> Result Box; - fn function(&self) -> &FunctionExpression; - fn program(&self) -> &Program; - fn std_lib(&self) -> Box { - self.clone_box() - } -} - -impl ts_rs::TS for dyn KclStdLibFn { - type WithoutGenerics = Self; - - fn name() -> String { - "StdLibFnData".to_string() - } - - fn decl() -> String { - StdLibFnData::decl() - } - - fn decl_concrete() -> String { - StdLibFnData::decl_concrete() - } - - fn inline() -> String { - StdLibFnData::inline() - } - - fn inline_flattened() -> String { - StdLibFnData::inline_flattened() - } - - fn output_path() -> Option<&'static Path> { - StdLibFnData::output_path() - } -} - -impl Clone for Box { - fn clone(&self) -> Box { - self.kcl_clone_box() - } -} - -impl JsonSchema for dyn KclStdLibFn { - fn schema_name() -> String { - "KclStdLibFn".to_string() - } - - fn json_schema(gen: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema { - gen.subschema_for::() - } -} - -impl<'de> Deserialize<'de> for Box { - fn deserialize>(deserializer: D) -> Result { - let data = StdLibFnData::deserialize(deserializer)?; - let stdlib = crate::std::StdLib::new(); - let stdlib_fn = stdlib - .get_kcl(&data.name) - .ok_or_else(|| serde::de::Error::custom(format!("StdLibFn {} not found", data.name)))?; - Ok(stdlib_fn) - } -} - -impl Serialize for Box { - fn serialize(&self, serializer: S) -> Result { - self.to_json().unwrap().serialize(serializer) - } -} - -/// Parse a KCL program. Expect it to have a single body item, which is a function. -/// Return the program and its single function. -/// Return None if those expectations aren't met. -pub fn extract_function(source: &str) -> Option<(Program, Box)> { - let tokens = lexer(source).unwrap(); - let src = crate::parser::Parser::new(tokens).ast().ok()?; - assert_eq!(src.body.len(), 1); - let BodyItem::ExpressionStatement(expr) = src.body.last()? else { - panic!("expected expression statement"); - }; - let Expr::FunctionExpression(function) = expr.expression.clone() else { - panic!("expected function expr"); - }; - Some((src, function)) -} diff --git a/src/wasm-lib/kcl/src/std/loft.rs b/src/wasm-lib/kcl/src/std/loft.rs index 52e70b884..a43bbba0b 100644 --- a/src/wasm-lib/kcl/src/std/loft.rs +++ b/src/wasm-lib/kcl/src/std/loft.rs @@ -1,59 +1,45 @@ //! Standard library lofts. +use std::num::NonZeroU32; + use anyhow::Result; use derive_docs::stdlib; use kcmc::{each_cmd as mcmd, length_unit::LengthUnit, ModelingCmd}; use kittycad_modeling_cmds as kcmc; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; use crate::{ errors::{KclError, KclErrorDetails}, - executor::{ExecState, KclValue, Sketch, Solid}, + execution::{ExecState, KclValue, Sketch, Solid}, std::{extrude::do_post_extrude, fillet::default_tolerance, Args}, }; const DEFAULT_V_DEGREE: u32 = 2; -/// Data for a loft. -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] -#[ts(export)] -#[serde(rename_all = "camelCase")] -pub struct LoftData { - /// Degree of the interpolation. Must be greater than zero. - /// For example, use 2 for quadratic, or 3 for cubic interpolation in the V direction. - /// This defaults to 2, if not specified. - pub v_degree: Option, - /// Attempt to approximate rational curves (such as arcs) using a bezier. - /// This will remove banding around interpolations between arcs and non-arcs. It may produce errors in other scenarios - /// Over time, this field won't be necessary. - #[serde(default)] - pub bez_approximate_rational: Option, - /// This can be set to override the automatically determined topological base curve, which is usually the first section encountered. - #[serde(default)] - pub base_curve_index: Option, - /// Tolerance for the loft operation. - #[serde(default)] - pub tolerance: Option, -} - -impl Default for LoftData { - fn default() -> Self { - Self { - // This unwrap is safe because the default value is always greater than zero. - v_degree: Some(std::num::NonZeroU32::new(DEFAULT_V_DEGREE).unwrap()), - bez_approximate_rational: None, - base_curve_index: None, - tolerance: None, - } - } -} - /// Create a 3D surface or solid by interpolating between two or more sketches. pub async fn loft(exec_state: &mut ExecState, args: Args) -> Result { - let (sketches, data): (Vec, Option) = args.get_sketches_and_data()?; + let sketches = args.get_unlabeled_kw_arg("sketches")?; + let v_degree: NonZeroU32 = args + .get_kw_arg_opt("vDegree") + .unwrap_or(NonZeroU32::new(DEFAULT_V_DEGREE).unwrap()); + // Attempt to approximate rational curves (such as arcs) using a bezier. + // This will remove banding around interpolations between arcs and non-arcs. It may produce errors in other scenarios + // Over time, this field won't be necessary. + let bez_approximate_rational = args.get_kw_arg_opt("bezApproximateRational").unwrap_or(false); + // This can be set to override the automatically determined topological base curve, which is usually the first section encountered. + let base_curve_index: Option = args.get_kw_arg_opt("baseCurveIndex"); + // Tolerance for the loft operation. + let tolerance: Option = args.get_kw_arg_opt("tolerance"); - let solid = inner_loft(sketches, data, exec_state, args).await?; + let solid = inner_loft( + sketches, + v_degree, + bez_approximate_rational, + base_curve_index, + tolerance, + exec_state, + args, + ) + .await?; Ok(KclValue::Solid(solid)) } @@ -63,7 +49,7 @@ pub async fn loft(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([-100, 200], %) /// |> line([200, 0], %) /// |> line([0, -200], %) @@ -71,7 +57,7 @@ pub async fn loft(exec_state: &mut ExecState, args: Args) -> Result lineTo([profileStartX(%), profileStartY(%)], %) /// |> close(%) /// -/// const triangleSketch = startSketchOn(offsetPlane('XY', 75)) +/// triangleSketch = startSketchOn(offsetPlane('XY', 75)) /// |> startProfileAt([0, 125], %) /// |> line([-15, -30], %) /// |> line([30, 0], %) @@ -83,7 +69,7 @@ pub async fn loft(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([-100, 200], %) /// |> line([200, 0], %) /// |> line([0, -200], %) @@ -91,18 +77,18 @@ pub async fn loft(exec_state: &mut ExecState, args: Args) -> Result lineTo([profileStartX(%), profileStartY(%)], %) /// |> close(%) /// -/// const circleSketch0 = startSketchOn(offsetPlane('XY', 75)) -/// |> circle({ center: [0, 100], radius: 50 }, %) +/// circleSketch0 = startSketchOn(offsetPlane('XY', 75)) +/// |> circle({ center = [0, 100], radius = 50 }, %) /// -/// const circleSketch1 = startSketchOn(offsetPlane('XY', 150)) -/// |> circle({ center: [0, 100], radius: 20 }, %) +/// circleSketch1 = startSketchOn(offsetPlane('XY', 150)) +/// |> circle({ center = [0, 100], radius = 20 }, %) /// /// loft([squareSketch, circleSketch0, circleSketch1]) /// ``` /// /// ```no_run /// // Loft a square, a circle, and another circle with options. -/// const squareSketch = startSketchOn('XY') +/// squareSketch = startSketchOn('XY') /// |> startProfileAt([-100, 200], %) /// |> line([200, 0], %) /// |> line([0, -200], %) @@ -110,34 +96,38 @@ pub async fn loft(exec_state: &mut ExecState, args: Args) -> Result lineTo([profileStartX(%), profileStartY(%)], %) /// |> close(%) /// -/// const circleSketch0 = startSketchOn(offsetPlane('XY', 75)) -/// |> circle({ center: [0, 100], radius: 50 }, %) +/// circleSketch0 = startSketchOn(offsetPlane('XY', 75)) +/// |> circle({ center = [0, 100], radius = 50 }, %) /// -/// const circleSketch1 = startSketchOn(offsetPlane('XY', 150)) -/// |> circle({ center: [0, 100], radius: 20 }, %) +/// circleSketch1 = startSketchOn(offsetPlane('XY', 150)) +/// |> circle({ center = [0, 100], radius = 20 }, %) /// -/// loft([squareSketch, circleSketch0, circleSketch1], { -/// // This can be set to override the automatically determined -/// // topological base curve, which is usually the first section encountered. -/// baseCurveIndex: 0, -/// // Attempt to approximate rational curves (such as arcs) using a bezier. -/// // This will remove banding around interpolations between arcs and non-arcs. -/// // It may produce errors in other scenarios Over time, this field won't be necessary. -/// bezApproximateRational: false, -/// // Tolerance for the loft operation. -/// tolerance: 0.000001, -/// // Degree of the interpolation. Must be greater than zero. -/// // For example, use 2 for quadratic, or 3 for cubic interpolation in -/// // the V direction. This defaults to 2, if not specified. -/// vDegree: 2, -/// }) +/// loft([squareSketch, circleSketch0, circleSketch1], +/// baseCurveIndex = 0, +/// bezApproximateRational = false, +/// tolerance = 0.000001, +/// vDegree = 2, +/// ) /// ``` #[stdlib { name = "loft", + feature_tree_operation = true, + keywords = true, + unlabeled_first = true, + arg_docs = { + sketches = "Which sketches to loft. Must include at least 2 sketches.", + v_degree = "Degree of the interpolation. Must be greater than zero. For example, use 2 for quadratic, or 3 for cubic interpolation in the V direction. This defaults to 2, if not specified.", + bez_approximate_rational = "Attempt to approximate rational curves (such as arcs) using a bezier. This will remove banding around interpolations between arcs and non-arcs. It may produce errors in other scenarios Over time, this field won't be necessary.", + base_curve_index = "This can be set to override the automatically determined topological base curve, which is usually the first section encountered.", + tolerance = "Tolerance for the loft operation.", + } }] async fn inner_loft( sketches: Vec, - data: Option, + v_degree: NonZeroU32, + bez_approximate_rational: bool, + base_curve_index: Option, + tolerance: Option, exec_state: &mut ExecState, args: Args, ) -> Result, KclError> { @@ -152,20 +142,15 @@ async fn inner_loft( })); } - // Get the loft data. - let data = data.unwrap_or_default(); - - let id = exec_state.id_generator.next_uuid(); + let id = exec_state.next_uuid(); args.batch_modeling_cmd( id, ModelingCmd::from(mcmd::Loft { section_ids: sketches.iter().map(|group| group.id).collect(), - base_curve_index: data.base_curve_index, - bez_approximate_rational: data.bez_approximate_rational.unwrap_or(false), - tolerance: LengthUnit(data.tolerance.unwrap_or(default_tolerance(&args.ctx.settings.units))), - v_degree: data - .v_degree - .unwrap_or_else(|| std::num::NonZeroU32::new(DEFAULT_V_DEGREE).unwrap()), + base_curve_index, + bez_approximate_rational, + tolerance: LengthUnit(tolerance.unwrap_or(default_tolerance(&args.ctx.settings.units))), + v_degree, }), ) .await?; diff --git a/src/wasm-lib/kcl/src/std/math.rs b/src/wasm-lib/kcl/src/std/math.rs index 36989ac46..72ad04672 100644 --- a/src/wasm-lib/kcl/src/std/math.rs +++ b/src/wasm-lib/kcl/src/std/math.rs @@ -3,36 +3,47 @@ use anyhow::Result; use derive_docs::stdlib; -use super::args::FromArgs; use crate::{ errors::{KclError, KclErrorDetails}, - executor::{ExecState, KclValue}, + execution::{ExecState, KclValue}, std::Args, }; +use super::args::FromArgs; + /// Compute the remainder after dividing `num` by `div`. /// If `num` is negative, the result will be too. pub async fn rem(_exec_state: &mut ExecState, args: Args) -> Result { - let (n, d) = FromArgs::from_args(&args, 0)?; - let result = inner_rem(n, d)?; + let n = args.get_unlabeled_kw_arg("number to divide")?; + let d = args.get_kw_arg("divisor")?; + let remainder = inner_rem(n, d); - args.make_user_val_from_i64(result) + Ok(args.make_user_val_from_f64(remainder)) } /// Compute the remainder after dividing `num` by `div`. /// If `num` is negative, the result will be too. /// /// ```no_run -/// assertEqual(rem(int( 7), int(4)), 3, 0.01, "remainder is 3") -/// assertEqual(rem(int(-7), int(4)), -3, 0.01, "remainder is 3") -/// assertEqual(rem(int( 7), int(-4)), 3, 0.01, "remainder is 3") +/// assertEqual(rem( 7, divisor = 4), 3, 0.01, "remainder is 3" ) +/// assertEqual(rem(-7, divisor = 4), -3, 0.01, "remainder is -3") +/// assertEqual(rem( 7, divisor = -4), 3, 0.01, "remainder is 3" ) +/// assertEqual(rem( 6, divisor = 2.5), 1, 0.01, "remainder is 1" ) +/// assertEqual(rem( 6.5, divisor = 2.5), 1.5, 0.01, "remainder is 1.5" ) +/// assertEqual(rem( 6.5, divisor = 2), 0.5, 0.01, "remainder is 0.5" ) /// ``` #[stdlib { name = "rem", tags = ["math"], + keywords = true, + unlabeled_first = true, + arg_docs = { + num = "The number which will be divided by `divisor`.", + divisor = "The number which will divide `num`.", + } }] -fn inner_rem(num: i64, divisor: i64) -> Result { - Ok(num % divisor) +fn inner_rem(num: f64, divisor: f64) -> f64 { + num % divisor } /// Compute the cosine of a number (in radians). @@ -40,22 +51,22 @@ pub async fn cos(_exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> angledLine({ -/// angle: 30, -/// length: 3 / cos(toRadians(30)), +/// angle = 30, +/// length = 3 / cos(toRadians(30)), /// }, %) /// |> yLineTo(0, %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "cos", @@ -70,22 +81,22 @@ pub async fn sin(_exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> angledLine({ -/// angle: 50, -/// length: 15 / sin(toDegrees(135)), +/// angle = 50, +/// length = 15 / sin(toDegrees(135)), /// }, %) /// |> yLineTo(0, %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "sin", @@ -100,22 +111,22 @@ pub async fn tan(_exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> angledLine({ -/// angle: 50, -/// length: 50 * tan(1/2), +/// angle = 50, +/// length = 50 * tan(1/2), /// }, %) /// |> yLineTo(0, %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "tan", @@ -129,18 +140,18 @@ fn inner_tan(num: f64) -> Result { pub async fn pi(_exec_state: &mut ExecState, args: Args) -> Result { let result = inner_pi()?; - args.make_user_val_from_f64(result) + Ok(args.make_user_val_from_f64(result)) } /// Return the value of `pi`. Archimedes’ constant (π). /// /// ```no_run -/// const circumference = 70 +/// circumference = 70 /// -/// const exampleSketch = startSketchOn("XZ") -/// |> circle({ center: [0, 0], radius: circumference/ (2 * pi()) }, %) +/// exampleSketch = startSketchOn("XZ") +/// |> circle({ center = [0, 0], radius = circumference/ (2 * pi()) }, %) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "pi", @@ -155,22 +166,22 @@ pub async fn sqrt(_exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> angledLine({ -/// angle: 50, -/// length: sqrt(2500), +/// angle = 50, +/// length = sqrt(2500), /// }, %) /// |> yLineTo(0, %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "sqrt", @@ -185,29 +196,29 @@ pub async fn abs(_exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> line([8, 0], %) /// |> angledLine({ -/// angle: abs(myAngle), -/// length: 5, +/// angle = abs(myAngle), +/// length = 5, /// }, %) /// |> line([-5, 0], %) /// |> angledLine({ -/// angle: myAngle, -/// length: 5, +/// angle = myAngle, +/// length = 5, /// }, %) /// |> close(%) /// -/// const baseExtrusion = extrude(5, sketch001) +/// baseExtrusion = extrude(5, sketch001) /// ``` #[stdlib { name = "abs", @@ -217,25 +228,53 @@ fn inner_abs(num: f64) -> Result { Ok(num.abs()) } +/// Round a number to the nearest integer. +pub async fn round(_exec_state: &mut ExecState, args: Args) -> Result { + let num = args.get_number()?; + let result = inner_round(num)?; + + Ok(args.make_user_val_from_f64(result)) +} + +/// Round a number to the nearest integer. +/// +/// ```no_run +/// sketch001 = startSketchOn('XZ') +/// |> startProfileAt([0, 0], %) +/// |> lineTo([12, 10], %) +/// |> line([round(7.02986), 0], %) +/// |> yLineTo(0, %) +/// |> close(%) +/// +/// extrude001 = extrude(5, sketch001) +/// ``` +#[stdlib { + name = "round", + tags = ["math"], +}] +fn inner_round(num: f64) -> Result { + Ok(num.round()) +} + /// Compute the largest integer less than or equal to a number. pub async fn floor(_exec_state: &mut ExecState, args: Args) -> Result { let num = args.get_number()?; let result = inner_floor(num)?; - args.make_user_val_from_f64(result) + Ok(args.make_user_val_from_f64(result)) } /// Compute the largest integer less than or equal to a number. /// /// ```no_run -/// const sketch001 = startSketchOn('XZ') +/// sketch001 = startSketchOn('XZ') /// |> startProfileAt([0, 0], %) /// |> lineTo([12, 10], %) /// |> line([floor(7.02986), 0], %) /// |> yLineTo(0, %) /// |> close(%) /// -/// const extrude001 = extrude(5, sketch001) +/// extrude001 = extrude(5, sketch001) /// ``` #[stdlib { name = "floor", @@ -250,20 +289,20 @@ pub async fn ceil(_exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> lineTo([12, 10], %) /// |> line([ceil(7.02986), 0], %) /// |> yLineTo(0, %) /// |> close(%) /// -/// const extrude001 = extrude(5, sketch001) +/// extrude001 = extrude(5, sketch001) /// ``` #[stdlib { name = "ceil", @@ -278,22 +317,22 @@ pub async fn min(_exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> angledLine({ -/// angle: 70, -/// length: min(15, 31, 4, 13, 22) +/// angle = 70, +/// length = min(15, 31, 4, 13, 22) /// }, %) /// |> line([20, 0], %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "min", @@ -315,22 +354,22 @@ pub async fn max(_exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> angledLine({ -/// angle: 70, -/// length: max(15, 31, 4, 13, 22) +/// angle = 70, +/// length = max(15, 31, 4, 13, 22) /// }, %) /// |> line([20, 0], %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "max", @@ -366,22 +405,22 @@ pub async fn pow(_exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> angledLine({ -/// angle: 50, -/// length: pow(5, 2), +/// angle = 50, +/// length = pow(5, 2), /// }, %) /// |> yLineTo(0, %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "pow", @@ -396,23 +435,23 @@ pub async fn acos(_exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> angledLine({ -/// angle: toDegrees(acos(0.5)), -/// length: 10, +/// angle = toDegrees(acos(0.5)), +/// length = 10, /// }, %) /// |> line([5, 0], %) /// |> lineTo([12, 0], %) /// |> close(%) /// -/// const extrude001 = extrude(5, sketch001) +/// extrude001 = extrude(5, sketch001) /// ``` #[stdlib { name = "acos", @@ -427,22 +466,22 @@ pub async fn asin(_exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> angledLine({ -/// angle: toDegrees(asin(0.5)), -/// length: 20, +/// angle = toDegrees(asin(0.5)), +/// length = 20, /// }, %) /// |> yLineTo(0, %) /// |> close(%) /// -/// const extrude001 = extrude(5, sketch001) +/// extrude001 = extrude(5, sketch001) /// ``` #[stdlib { name = "asin", @@ -457,22 +496,22 @@ pub async fn atan(_exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> angledLine({ -/// angle: toDegrees(atan(1.25)), -/// length: 20, +/// angle = toDegrees(atan(1.25)), +/// length = 20, /// }, %) /// |> yLineTo(0, %) /// |> close(%) /// -/// const extrude001 = extrude(5, sketch001) +/// extrude001 = extrude(5, sketch001) /// ``` #[stdlib { name = "atan", @@ -482,6 +521,36 @@ fn inner_atan(num: f64) -> Result { Ok(num.atan()) } +/// Compute the four quadrant arctangent of Y and X (in radians). +pub async fn atan2(_exec_state: &mut ExecState, args: Args) -> Result { + let (y, x) = FromArgs::from_args(&args, 0)?; + let result = inner_atan2(y, x)?; + + Ok(args.make_user_val_from_f64(result)) +} + +/// Compute the four quadrant arctangent of Y and X (in radians). +/// +/// ```no_run +/// sketch001 = startSketchOn('XZ') +/// |> startProfileAt([0, 0], %) +/// |> angledLine({ +/// angle = toDegrees(atan2(1.25, 2)), +/// length = 20, +/// }, %) +/// |> yLineTo(0, %) +/// |> close(%) +/// +/// extrude001 = extrude(5, sketch001) +/// ``` +#[stdlib { + name = "atan2", + tags = ["math"], +}] +fn inner_atan2(y: f64, x: f64) -> Result { + Ok(y.atan2(x)) +} + /// Compute the logarithm of the number with respect to an arbitrary base. /// /// The result might not be correctly rounded owing to implementation @@ -504,7 +573,7 @@ pub async fn log(_exec_state: &mut ExecState, args: Args) -> Result Result startProfileAt([0, 0], %) /// |> line([log(100, 5), 0], %) /// |> line([5, 8], %) /// |> line([-10, 0], %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "log", @@ -536,20 +605,20 @@ pub async fn log2(_exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> line([log2(100), 0], %) /// |> line([5, 8], %) /// |> line([-10, 0], %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "log2", @@ -564,20 +633,20 @@ pub async fn log10(_exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> line([log10(100), 0], %) /// |> line([5, 8], %) /// |> line([-10, 0], %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "log10", @@ -592,20 +661,20 @@ pub async fn ln(_exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> line([ln(100), 15], %) /// |> line([5, -6], %) /// |> line([-10, -10], %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "ln", @@ -619,22 +688,22 @@ fn inner_ln(num: f64) -> Result { pub async fn e(_exec_state: &mut ExecState, args: Args) -> Result { let result = inner_e()?; - args.make_user_val_from_f64(result) + Ok(args.make_user_val_from_f64(result)) } /// Return the value of Euler’s number `e`. /// /// ```no_run -/// const exampleSketch = startSketchOn("XZ") +/// exampleSketch = startSketchOn("XZ") /// |> startProfileAt([0, 0], %) /// |> angledLine({ -/// angle: 30, -/// length: 2 * e() ^ 2, +/// angle = 30, +/// length = 2 * e() ^ 2, /// }, %) /// |> yLineTo(0, %) /// |> close(%) /// -/// const example = extrude(10, exampleSketch) +/// example = extrude(10, exampleSketch) /// ``` #[stdlib { name = "e", @@ -648,22 +717,22 @@ fn inner_e() -> Result { pub async fn tau(_exec_state: &mut ExecState, args: Args) -> Result { let result = inner_tau()?; - args.make_user_val_from_f64(result) + Ok(args.make_user_val_from_f64(result)) } /// Return the value of `tau`. The full circle constant (τ). Equal to 2π. /// /// ```no_run -/// const exampleSketch = startSketchOn("XZ") +/// exampleSketch = startSketchOn("XZ") /// |> startProfileAt([0, 0], %) /// |> angledLine({ -/// angle: 50, -/// length: 10 * tau(), +/// angle = 50, +/// length = 10 * tau(), /// }, %) /// |> yLineTo(0, %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "tau", @@ -678,22 +747,22 @@ pub async fn to_radians(_exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> angledLine({ -/// angle: 50, -/// length: 70 * cos(toRadians(45)), +/// angle = 50, +/// length = 70 * cos(toRadians(45)), /// }, %) /// |> yLineTo(0, %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "toRadians", @@ -708,22 +777,22 @@ pub async fn to_degrees(_exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> angledLine({ -/// angle: 50, -/// length: 70 * cos(toDegrees(pi()/4)), +/// angle = 50, +/// length = 70 * cos(toDegrees(pi()/4)), /// }, %) /// |> yLineTo(0, %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "toDegrees", diff --git a/src/wasm-lib/kcl/src/std/mirror.rs b/src/wasm-lib/kcl/src/std/mirror.rs index 21ff9d50e..3882e611b 100644 --- a/src/wasm-lib/kcl/src/std/mirror.rs +++ b/src/wasm-lib/kcl/src/std/mirror.rs @@ -9,7 +9,7 @@ use serde::{Deserialize, Serialize}; use crate::{ errors::KclError, - executor::{ExecState, KclValue, Sketch, SketchSet}, + execution::{ExecState, KclValue, Sketch, SketchSet}, std::{revolve::AxisOrEdgeReference, Args}, }; @@ -40,7 +40,7 @@ pub async fn mirror_2d(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 10], %) /// |> line([15, 0], %) /// |> line([-7, -3], %) @@ -50,53 +50,53 @@ pub async fn mirror_2d(exec_state: &mut ExecState, args: Args) -> Result line([-8, -3], %) /// |> line([9, -1], %) /// |> line([-19, -0], %) -/// |> mirror2d({axis: 'Y'}, %) +/// |> mirror2d({axis = 'Y'}, %) /// -/// const example = extrude(10, sketch001) +/// example = extrude(10, sketch001) /// ``` /// /// ```no_run /// // Mirror a un-closed sketch across the Y axis. -/// const sketch001 = startSketchOn('XZ') +/// sketch001 = startSketchOn('XZ') /// |> startProfileAt([0, 8.5], %) /// |> line([20, -8.5], %) /// |> line([-20, -8.5], %) -/// |> mirror2d({axis: 'Y'}, %) +/// |> mirror2d({axis = 'Y'}, %) /// -/// const example = extrude(10, sketch001) +/// example = extrude(10, sketch001) /// ``` /// /// ```no_run /// // Mirror a un-closed sketch across an edge. -/// const helper001 = startSketchOn('XZ') +/// helper001 = startSketchOn('XZ') /// |> startProfileAt([0, 0], %) /// |> line([0, 10], %, $edge001) /// -/// const sketch001 = startSketchOn('XZ') +/// sketch001 = startSketchOn('XZ') /// |> startProfileAt([0, 8.5], %) /// |> line([20, -8.5], %) /// |> line([-20, -8.5], %) -/// |> mirror2d({axis: edge001}, %) +/// |> mirror2d({axis = edge001}, %) /// -/// const example = extrude(10, sketch001) +/// example = extrude(10, sketch001) /// ``` /// /// ```no_run /// // Mirror an un-closed sketch across a custom axis. -/// const sketch001 = startSketchOn('XZ') +/// sketch001 = startSketchOn('XZ') /// |> startProfileAt([0, 8.5], %) /// |> line([20, -8.5], %) /// |> line([-20, -8.5], %) /// |> mirror2d({ -/// axis: { -/// custom: { -/// axis: [0.0, 1.0], -/// origin: [0.0, 0.0] +/// axis = { +/// custom = { +/// axis = [0.0, 1.0], +/// origin = [0.0, 0.0] /// } /// } /// }, %) /// -/// const example = extrude(10, sketch001) +/// example = extrude(10, sketch001) /// ``` #[stdlib { name = "mirror2d", @@ -121,7 +121,7 @@ async fn inner_mirror_2d( let (axis, origin) = axis.axis_and_origin()?; args.batch_modeling_cmd( - exec_state.id_generator.next_uuid(), + exec_state.next_uuid(), ModelingCmd::from(mcmd::EntityMirror { ids: starting_sketches.iter().map(|sketch| sketch.id).collect(), axis, @@ -134,7 +134,7 @@ async fn inner_mirror_2d( let edge_id = edge.get_engine_id(exec_state, &args)?; args.batch_modeling_cmd( - exec_state.id_generator.next_uuid(), + exec_state.next_uuid(), ModelingCmd::from(mcmd::EntityMirrorAcrossEdge { ids: starting_sketches.iter().map(|sketch| sketch.id).collect(), edge_id, diff --git a/src/wasm-lib/kcl/src/std/mod.rs b/src/wasm-lib/kcl/src/std/mod.rs index a8681457f..5b0bedc24 100644 --- a/src/wasm-lib/kcl/src/std/mod.rs +++ b/src/wasm-lib/kcl/src/std/mod.rs @@ -1,5 +1,6 @@ //! Functions implemented for language execution. +pub mod appearance; pub mod args; pub mod array; pub mod assert; @@ -9,7 +10,6 @@ pub mod extrude; pub mod fillet; pub mod helix; pub mod import; -pub mod kcl_stdlib; pub mod loft; pub mod math; pub mod mirror; @@ -21,26 +21,25 @@ pub mod segment; pub mod shapes; pub mod shell; pub mod sketch; +pub mod sweep; pub mod types; pub mod units; pub mod utils; -use std::collections::HashMap; - use anyhow::Result; pub use args::Args; use derive_docs::stdlib; +use indexmap::IndexMap; use lazy_static::lazy_static; use parse_display::{Display, FromStr}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use crate::{ - ast::types::FunctionExpression, docs::StdLibFn, errors::KclError, - executor::{ExecState, KclValue, ProgramMemory}, - std::kcl_stdlib::KclStdLibFn, + execution::{ExecState, KclValue, ProgramMemory}, + parsing::ast::types::FunctionExpression, }; pub type StdFn = fn( @@ -48,24 +47,30 @@ pub type StdFn = fn( Args, ) -> std::pin::Pin> + Send + '_>>; -pub type FnMap = HashMap; - lazy_static! { static ref CORE_FNS: Vec> = vec![ Box::new(LegLen), Box::new(LegAngX), Box::new(LegAngY), + Box::new(crate::std::appearance::Appearance), Box::new(crate::std::convert::Int), Box::new(crate::std::extrude::Extrude), + Box::new(crate::std::segment::SegEnd), Box::new(crate::std::segment::SegEndX), Box::new(crate::std::segment::SegEndY), + Box::new(crate::std::segment::SegStart), + Box::new(crate::std::segment::SegStartX), + Box::new(crate::std::segment::SegStartY), Box::new(crate::std::segment::LastSegX), Box::new(crate::std::segment::LastSegY), Box::new(crate::std::segment::SegLen), Box::new(crate::std::segment::SegAng), + Box::new(crate::std::segment::TangentToEnd), Box::new(crate::std::segment::AngleToMatchLengthX), Box::new(crate::std::segment::AngleToMatchLengthY), Box::new(crate::std::shapes::Circle), + Box::new(crate::std::shapes::CircleThreePoint), + Box::new(crate::std::shapes::Polygon), Box::new(crate::std::sketch::LineTo), Box::new(crate::std::sketch::Line), Box::new(crate::std::sketch::XLineTo), @@ -86,6 +91,7 @@ lazy_static! { Box::new(crate::std::sketch::ProfileStart), Box::new(crate::std::sketch::Close), Box::new(crate::std::sketch::Arc), + Box::new(crate::std::sketch::ArcTo), Box::new(crate::std::sketch::TangentialArc), Box::new(crate::std::sketch::TangentialArcTo), Box::new(crate::std::sketch::TangentialArcToRelative), @@ -97,8 +103,11 @@ lazy_static! { Box::new(crate::std::patterns::PatternCircular2D), Box::new(crate::std::patterns::PatternCircular3D), Box::new(crate::std::patterns::PatternTransform), + Box::new(crate::std::patterns::PatternTransform2D), Box::new(crate::std::array::Reduce), Box::new(crate::std::array::Map), + Box::new(crate::std::array::Push), + Box::new(crate::std::array::Pop), Box::new(crate::std::chamfer::Chamfer), Box::new(crate::std::fillet::Fillet), Box::new(crate::std::fillet::GetOppositeEdge), @@ -108,6 +117,7 @@ lazy_static! { Box::new(crate::std::shell::Shell), Box::new(crate::std::shell::Hollow), Box::new(crate::std::revolve::Revolve), + Box::new(crate::std::sweep::Sweep), Box::new(crate::std::loft::Loft), Box::new(crate::std::planes::OffsetPlane), Box::new(crate::std::import::Import), @@ -117,12 +127,14 @@ lazy_static! { Box::new(crate::std::math::Acos), Box::new(crate::std::math::Asin), Box::new(crate::std::math::Atan), + Box::new(crate::std::math::Atan2), Box::new(crate::std::math::Pi), Box::new(crate::std::math::E), Box::new(crate::std::math::Tau), Box::new(crate::std::math::Sqrt), Box::new(crate::std::math::Abs), Box::new(crate::std::math::Rem), + Box::new(crate::std::math::Round), Box::new(crate::std::math::Floor), Box::new(crate::std::math::Ceil), Box::new(crate::std::math::Min), @@ -159,16 +171,12 @@ pub fn get_stdlib_fn(name: &str) -> Option> { } pub struct StdLib { - pub fns: HashMap>, - pub kcl_fns: HashMap>, + pub fns: IndexMap>, } impl std::fmt::Debug for StdLib { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("StdLib") - .field("fns.len()", &self.fns.len()) - .field("kcl_fns.len()", &self.kcl_fns.len()) - .finish() + f.debug_struct("StdLib").field("fns.len()", &self.fns.len()).finish() } } @@ -180,44 +188,28 @@ impl StdLib { .map(|internal_fn| (internal_fn.name(), internal_fn)) .collect(); - let kcl_internal_fns: [Box; 0] = []; - let kcl_fns = kcl_internal_fns - .into_iter() - .map(|internal_fn| (internal_fn.name(), internal_fn)) - .collect(); - - Self { fns, kcl_fns } + Self { fns } } // Get the combined hashmaps. - pub fn combined(&self) -> HashMap> { - let mut combined = self.fns.clone(); - for (k, v) in self.kcl_fns.clone() { - combined.insert(k, v.std_lib()); - } - combined + pub fn combined(&self) -> IndexMap> { + self.fns.clone() } pub fn get(&self, name: &str) -> Option> { self.fns.get(name).cloned() } - pub fn get_kcl(&self, name: &str) -> Option> { - self.kcl_fns.get(name).cloned() - } - pub fn get_either(&self, name: &str) -> FunctionKind { if let Some(f) = self.get(name) { FunctionKind::Core(f) - } else if let Some(f) = self.get_kcl(name) { - FunctionKind::Std(f) } else { FunctionKind::UserDefined } } pub fn contains_key(&self, key: &str) -> bool { - self.fns.contains_key(key) || self.kcl_fns.contains_key(key) + self.fns.contains_key(key) } } @@ -230,7 +222,6 @@ impl Default for StdLib { #[derive(Debug)] pub enum FunctionKind { Core(Box), - Std(Box), UserDefined, } @@ -238,7 +229,7 @@ pub enum FunctionKind { pub async fn leg_length(_exec_state: &mut ExecState, args: Args) -> Result { let (hypotenuse, leg) = args.get_hypotenuse_leg()?; let result = inner_leg_length(hypotenuse, leg); - args.make_user_val_from_f64(result) + Ok(KclValue::from_number(result, vec![args.into()])) } /// Compute the length of the given leg. @@ -258,7 +249,7 @@ fn inner_leg_length(hypotenuse: f64, leg: f64) -> f64 { pub async fn leg_angle_x(_exec_state: &mut ExecState, args: Args) -> Result { let (hypotenuse, leg) = args.get_hypotenuse_leg()?; let result = inner_leg_angle_x(hypotenuse, leg); - args.make_user_val_from_f64(result) + Ok(KclValue::from_number(result, vec![args.into()])) } /// Compute the angle of the given leg for x. @@ -278,7 +269,7 @@ fn inner_leg_angle_x(hypotenuse: f64, leg: f64) -> f64 { pub async fn leg_angle_y(_exec_state: &mut ExecState, args: Args) -> Result { let (hypotenuse, leg) = args.get_hypotenuse_leg()?; let result = inner_leg_angle_y(hypotenuse, leg); - args.make_user_val_from_f64(result) + Ok(KclValue::from_number(result, vec![args.into()])) } /// Compute the angle of the given leg for y. @@ -311,7 +302,7 @@ pub enum Primitive { /// A closure used as an argument to a stdlib function. pub struct FnAsArg<'a> { - pub func: Option<&'a crate::executor::MemoryFunction>, - pub expr: Box, + pub func: Option<&'a crate::execution::MemoryFunction>, + pub expr: crate::parsing::ast::types::BoxNode, pub memory: Box, } diff --git a/src/wasm-lib/kcl/src/std/patterns.rs b/src/wasm-lib/kcl/src/std/patterns.rs index 25c572671..7b916ec5a 100644 --- a/src/wasm-lib/kcl/src/std/patterns.rs +++ b/src/wasm-lib/kcl/src/std/patterns.rs @@ -14,15 +14,17 @@ use kittycad_modeling_cmds::{ }; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use serde_json::Value as JValue; +use uuid::Uuid; +use super::args::Arg; use crate::{ errors::{KclError, KclErrorDetails}, - executor::{ - ExecState, Geometries, Geometry, KclValue, Point3d, Sketch, SketchSet, Solid, SolidSet, SourceRange, UserVal, + execution::{ + ExecState, FunctionParam, Geometries, Geometry, KclObjectFields, KclValue, Point2d, Point3d, Sketch, SketchSet, + Solid, SolidSet, }, - function_param::FunctionParam, - std::{types::Uint, Args}, + std::Args, + SourceRange, }; const MUST_HAVE_ONE_INSTANCE: &str = "There must be at least 1 instance of your geometry"; @@ -36,7 +38,7 @@ pub struct LinearPattern2dData { /// This includes the original entity. For example, if instances is 2, /// there will be two copies -- the original, and one new copy. /// If instances is 1, this has no effect. - pub instances: Uint, + pub instances: u32, /// The distance between each repetition. This can also be referred to as spacing. pub distance: f64, /// The axis of the pattern. This is a 2D vector. @@ -52,45 +54,14 @@ pub struct LinearPattern3dData { /// This includes the original entity. For example, if instances is 2, /// there will be two copies -- the original, and one new copy. /// If instances is 1, this has no effect. - pub instances: Uint, + pub instances: u32, /// The distance between each repetition. This can also be referred to as spacing. pub distance: f64, /// The axis of the pattern. pub axis: [f64; 3], } -pub enum LinearPattern { - ThreeD(LinearPattern3dData), - TwoD(LinearPattern2dData), -} - -impl LinearPattern { - pub fn axis(&self) -> [f64; 3] { - match self { - LinearPattern::TwoD(lp) => [lp.axis[0], lp.axis[1], 0.0], - LinearPattern::ThreeD(lp) => lp.axis, - } - } - - fn repetitions(&self) -> RepetitionsNeeded { - let n = match self { - LinearPattern::TwoD(lp) => lp.instances.u32(), - LinearPattern::ThreeD(lp) => lp.instances.u32(), - }; - RepetitionsNeeded::from(n) - } - - pub fn distance(&self) -> f64 { - match self { - LinearPattern::TwoD(lp) => lp.distance, - LinearPattern::ThreeD(lp) => lp.distance, - } - } -} - -/// A linear pattern -/// Each element in the pattern repeats a particular piece of geometry. -/// The repetitions can be transformed by the `transform` parameter. +/// Repeat some 3D solid, changing each repetition slightly. pub async fn pattern_transform(exec_state: &mut ExecState, args: Args) -> Result { let (num_repetitions, transform, extr) = args.get_pattern_transform_args()?; @@ -111,6 +82,28 @@ pub async fn pattern_transform(exec_state: &mut ExecState, args: Args) -> Result Ok(KclValue::Solids { value: solids }) } +/// Repeat some 2D sketch, changing each repetition slightly. +pub async fn pattern_transform_2d(exec_state: &mut ExecState, args: Args) -> Result { + let (num_repetitions, transform, sketch): (u32, super::FnAsArg<'_>, SketchSet) = + super::args::FromArgs::from_args(&args, 0)?; + + let sketches = inner_pattern_transform_2d( + num_repetitions, + FunctionParam { + inner: transform.func, + fn_expr: transform.expr, + meta: vec![args.source_range.into()], + ctx: args.ctx.clone(), + memory: *transform.memory, + }, + sketch, + exec_state, + &args, + ) + .await?; + Ok(KclValue::Sketches { value: sketches }) +} + /// Repeat a 3-dimensional solid, changing it each time. /// /// Replicates the 3D solid, applying a transformation function to each replica. @@ -153,13 +146,13 @@ pub async fn pattern_transform(exec_state: &mut ExecState, args: Args) -> Result /// /// ```no_run /// // Each instance will be shifted along the X axis. -/// fn transform = (id) => { -/// return { translate: [4 * id, 0, 0] } +/// fn transform(id) { +/// return { translate = [4 * id, 0, 0] } /// } /// /// // Sketch 4 cylinders. -/// const sketch001 = startSketchOn('XZ') -/// |> circle({ center: [0, 0], radius: 2 }, %) +/// sketch001 = startSketchOn('XZ') +/// |> circle({ center = [0, 0], radius = 2 }, %) /// |> extrude(5, %) /// |> patternTransform(4, transform, %) /// ``` @@ -167,26 +160,27 @@ pub async fn pattern_transform(exec_state: &mut ExecState, args: Args) -> Result /// // Each instance will be shifted along the X axis, /// // with a gap between the original (at x = 0) and the first replica /// // (at x = 8). This is because `id` starts at 1. -/// fn transform = (id) => { +/// fn transform(id) { /// return { translate: [4 * (1+id), 0, 0] } /// } /// -/// const sketch001 = startSketchOn('XZ') -/// |> circle({ center: [0, 0], radius: 2 }, %) +/// sketch001 = startSketchOn('XZ') +/// |> circle({ center = [0, 0], radius = 2 }, %) /// |> extrude(5, %) /// |> patternTransform(4, transform, %) /// ``` /// ```no_run -/// fn cube = (length, center) => { -/// let l = length/2 -/// let x = center[0] -/// let y = center[1] -/// let p0 = [-l + x, -l + y] -/// let p1 = [-l + x, l + y] -/// let p2 = [ l + x, l + y] -/// let p3 = [ l + x, -l + y] +/// fn cube(length, center) { +/// l = length/2 +/// x = center[0] +/// y = center[1] +/// p0 = [-l + x, -l + y] +/// p1 = [-l + x, l + y] +/// p2 = [ l + x, l + y] +/// p3 = [ l + x, -l + y] /// -/// return startSketchAt(p0) +/// return startSketchOn('XY') +/// |> startProfileAt(p0, %) /// |> lineTo(p1, %) /// |> lineTo(p2, %) /// |> lineTo(p3, %) @@ -195,37 +189,38 @@ pub async fn pattern_transform(exec_state: &mut ExecState, args: Args) -> Result /// |> extrude(length, %) /// } /// -/// let width = 20 -/// fn transform = (i) => { +/// width = 20 +/// fn transform(i) { /// return { /// // Move down each time. -/// translate: [0, 0, -i * width], +/// translate = [0, 0, -i * width], /// // Make the cube longer, wider and flatter each time. -/// scale: [pow(1.1, i), pow(1.1, i), pow(0.9, i)], +/// scale = [pow(1.1, i), pow(1.1, i), pow(0.9, i)], /// // Turn by 15 degrees each time. -/// rotation: { -/// angle: 15 * i, -/// origin: "local", +/// rotation = { +/// angle = 15 * i, +/// origin = "local", /// } /// } /// } /// -/// let myCubes = +/// myCubes = /// cube(width, [100,0]) /// |> patternTransform(25, transform, %) /// ``` /// /// ```no_run -/// fn cube = (length, center) => { -/// let l = length/2 -/// let x = center[0] -/// let y = center[1] -/// let p0 = [-l + x, -l + y] -/// let p1 = [-l + x, l + y] -/// let p2 = [ l + x, l + y] -/// let p3 = [ l + x, -l + y] +/// fn cube(length, center) { +/// l = length/2 +/// x = center[0] +/// y = center[1] +/// p0 = [-l + x, -l + y] +/// p1 = [-l + x, l + y] +/// p2 = [ l + x, l + y] +/// p3 = [ l + x, -l + y] /// -/// return startSketchAt(p0) +/// return startSketchOn('XY') +/// |> startProfileAt(p0, %) /// |> lineTo(p1, %) /// |> lineTo(p2, %) /// |> lineTo(p3, %) @@ -234,48 +229,68 @@ pub async fn pattern_transform(exec_state: &mut ExecState, args: Args) -> Result /// |> extrude(length, %) /// } /// -/// let width = 20 -/// fn transform = (i) => { +/// width = 20 +/// fn transform(i) { /// return { -/// translate: [0, 0, -i * width], -/// rotation: { -/// angle: 90 * i, +/// translate = [0, 0, -i * width], +/// rotation = { +/// angle = 90 * i, /// // Rotate around the overall scene's origin. -/// origin: "global", +/// origin = "global", /// } /// } /// } -/// let myCubes = +/// myCubes = /// cube(width, [100,100]) /// |> patternTransform(4, transform, %) /// ``` /// ```no_run /// // Parameters -/// const r = 50 // base radius -/// const h = 10 // layer height -/// const t = 0.005 // taper factor [0-1) +/// r = 50 // base radius +/// h = 10 // layer height +/// t = 0.005 // taper factor [0-1) /// // Defines how to modify each layer of the vase. /// // Each replica is shifted up the Z axis, and has a smoothly-varying radius -/// fn transform = (replicaId) => { -/// let scale = r * abs(1 - (t * replicaId)) * (5 + cos(replicaId / 8)) +/// fn transform(replicaId) { +/// scale = r * abs(1 - (t * replicaId)) * (5 + cos(replicaId / 8)) /// return { -/// translate: [0, 0, replicaId * 10], -/// scale: [scale, scale, 0], +/// translate = [0, 0, replicaId * 10], +/// scale = [scale, scale, 0], /// } /// } /// // Each layer is just a pretty thin cylinder. -/// fn layer = () => { +/// fn layer() { /// return startSketchOn("XY") // or some other plane idk -/// |> circle({ center: [0, 0], radius: 1 }, %, $tag1) +/// |> circle({ center = [0, 0], radius = 1 }, %, $tag1) /// |> extrude(h, %) /// } /// // The vase is 100 layers tall. /// // The 100 layers are replica of each other, with a slight transformation applied to each. -/// let vase = layer() |> patternTransform(100, transform, %) +/// vase = layer() |> patternTransform(100, transform, %) +/// ``` +/// ``` +/// fn transform(i) { +/// // Transform functions can return multiple transforms. They'll be applied in order. +/// return [ +/// { translate: [30 * i, 0, 0] }, +/// { rotation: { angle: 45 * i } }, +/// ] +/// } +/// startSketchOn('XY') +/// |> startProfileAt([0, 0], %) +/// |> polygon({ +/// radius: 10, +/// numSides: 4, +/// center: [0, 0], +/// inscribed: false +/// }, %) +/// |> extrude(4, %) +/// |> patternTransform(3, transform, %) /// ``` #[stdlib { - name = "patternTransform", - }] + name = "patternTransform", + feature_tree_operation = true, +}] async fn inner_pattern_transform<'a>( total_instances: u32, transform_function: FunctionParam<'a>, @@ -286,51 +301,96 @@ async fn inner_pattern_transform<'a>( // Build the vec of transforms, one for each repetition. let mut transform = Vec::with_capacity(usize::try_from(total_instances).unwrap()); if total_instances < 1 { - return Err(KclError::Syntax(KclErrorDetails { + return Err(KclError::Semantic(KclErrorDetails { source_ranges: vec![args.source_range], message: MUST_HAVE_ONE_INSTANCE.to_owned(), })); } for i in 1..total_instances { - let t = make_transform(i, &transform_function, args.source_range, exec_state).await?; + let t = make_transform::>(i, &transform_function, args.source_range, exec_state).await?; transform.push(t); } + execute_pattern_transform(transform, solid_set, exec_state, args).await +} + +/// Just like patternTransform, but works on 2D sketches not 3D solids. +/// ```no_run +/// // Each instance will be shifted along the X axis. +/// fn transform(id) { +/// return { translate: [4 * id, 0] } +/// } +/// +/// // Sketch 4 circles. +/// sketch001 = startSketchOn('XZ') +/// |> circle({ center: [0, 0], radius: 2 }, %) +/// |> patternTransform2d(4, transform, %) +/// ``` +#[stdlib { + name = "patternTransform2d", +}] +async fn inner_pattern_transform_2d<'a>( + total_instances: u32, + transform_function: FunctionParam<'a>, + solid_set: SketchSet, + exec_state: &mut ExecState, + args: &'a Args, +) -> Result>, KclError> { + // Build the vec of transforms, one for each repetition. + let mut transform = Vec::with_capacity(usize::try_from(total_instances).unwrap()); + if total_instances < 1 { + return Err(KclError::Semantic(KclErrorDetails { + source_ranges: vec![args.source_range], + message: MUST_HAVE_ONE_INSTANCE.to_owned(), + })); + } + for i in 1..total_instances { + let t = make_transform::>(i, &transform_function, args.source_range, exec_state).await?; + transform.push(t); + } + execute_pattern_transform(transform, solid_set, exec_state, args).await +} + +async fn execute_pattern_transform<'a, T: GeometryTrait>( + transforms: Vec>, + geo_set: T::Set, + exec_state: &mut ExecState, + args: &'a Args, +) -> Result, KclError> { // Flush the batch for our fillets/chamfers if there are any. // If we do not flush these, then you won't be able to pattern something with fillets. // Flush just the fillets/chamfers that apply to these solids. - args.flush_batch_for_solid_set(exec_state, solid_set.clone().into()) - .await?; + T::flush_batch(args, exec_state, geo_set.clone()).await?; + let starting: Vec = geo_set.into(); - let starting_solids: Vec> = solid_set.into(); - - if args.ctx.context_type == crate::executor::ContextType::Mock { - return Ok(starting_solids); + if args.ctx.context_type == crate::execution::ContextType::Mock { + return Ok(starting); } - let mut solids = Vec::new(); - for e in starting_solids { - let new_solids = send_pattern_transform(transform.clone(), &e, exec_state, args).await?; - solids.extend(new_solids); + let mut output = Vec::new(); + for geo in starting { + let new = send_pattern_transform(transforms.clone(), &geo, exec_state, args).await?; + output.extend(new) } - Ok(solids) + Ok(output) } -async fn send_pattern_transform( +async fn send_pattern_transform( // This should be passed via reference, see // https://github.com/KittyCAD/modeling-app/issues/2821 - transform: Vec, - solid: &Solid, + transforms: Vec>, + solid: &T, exec_state: &mut ExecState, args: &Args, -) -> Result>, KclError> { - let id = exec_state.id_generator.next_uuid(); +) -> Result, KclError> { + let id = exec_state.next_uuid(); let resp = args .send_modeling_cmd( id, ModelingCmd::from(mcmd::EntityLinearPatternTransform { - entity_id: solid.id, - transform, + entity_id: solid.id(), + transform: Default::default(), + transforms, }), ) .await?; @@ -345,27 +405,27 @@ async fn send_pattern_transform( })); }; - let mut geometries = vec![Box::new(solid.clone())]; - for id in pattern_info.entity_ids.iter() { + let mut geometries = vec![solid.clone()]; + for id in pattern_info.entity_ids.iter().copied() { let mut new_solid = solid.clone(); - new_solid.id = *id; - geometries.push(Box::new(new_solid)); + new_solid.set_id(id); + geometries.push(new_solid); } Ok(geometries) } -async fn make_transform<'a>( +async fn make_transform<'a, T: GeometryTrait>( i: u32, transform_function: &FunctionParam<'a>, source_range: SourceRange, exec_state: &mut ExecState, -) -> Result { +) -> Result, KclError> { // Call the transform fn for this repetition. - let repetition_num = KclValue::UserVal(UserVal { - value: JValue::Number(i.into()), + let repetition_num = KclValue::Int { + value: i.into(), meta: vec![source_range.into()], - }); - let transform_fn_args = vec![repetition_num]; + }; + let transform_fn_args = vec![Arg::synthetic(repetition_num)]; let transform_fn_return = transform_function.call(exec_state, transform_fn_args).await?; // Unpack the returned transform object. @@ -376,17 +436,42 @@ async fn make_transform<'a>( source_ranges: source_ranges.clone(), }) })?; - let KclValue::UserVal(transform) = transform_fn_return else { - return Err(KclError::Semantic(KclErrorDetails { - message: "Transform function must return a transform object".to_string(), - source_ranges: source_ranges.clone(), - })); + let transforms = match transform_fn_return { + KclValue::Object { value, meta: _ } => vec![value], + KclValue::Array { value, meta: _ } => { + let transforms: Vec<_> = value + .into_iter() + .map(|val| { + val.into_object().ok_or(KclError::Semantic(KclErrorDetails { + message: "Transform function must return a transform object".to_string(), + source_ranges: source_ranges.clone(), + })) + }) + .collect::>()?; + transforms + } + _ => { + return Err(KclError::Semantic(KclErrorDetails { + message: "Transform function must return a transform object".to_string(), + source_ranges: source_ranges.clone(), + })) + } }; + transforms + .into_iter() + .map(|obj| transform_from_obj_fields::(obj, source_ranges.clone())) + .collect() +} + +fn transform_from_obj_fields( + transform: KclObjectFields, + source_ranges: Vec, +) -> Result { // Apply defaults to the transform. - let replicate = match transform.value.get("replicate") { - Some(JValue::Bool(true)) => true, - Some(JValue::Bool(false)) => false, + let replicate = match transform.get("replicate") { + Some(KclValue::Bool { value: true, .. }) => true, + Some(KclValue::Bool { value: false, .. }) => false, Some(_) => { return Err(KclError::Semantic(KclErrorDetails { message: "The 'replicate' key must be a bool".to_string(), @@ -395,25 +480,33 @@ async fn make_transform<'a>( } None => true, }; - let scale = match transform.value.get("scale") { - Some(x) => array_to_point3d(x, source_ranges.clone())?, + + let scale = match transform.get("scale") { + Some(x) => T::array_to_point3d(x, source_ranges.clone())?, None => Point3d { x: 1.0, y: 1.0, z: 1.0 }, }; - let translate = match transform.value.get("translate") { - Some(x) => array_to_point3d(x, source_ranges.clone())?, + + let translate = match transform.get("translate") { + Some(x) => T::array_to_point3d(x, source_ranges.clone())?, None => Point3d { x: 0.0, y: 0.0, z: 0.0 }, }; + let mut rotation = Rotation::default(); - if let Some(rot) = transform.value.get("rotation") { + if let Some(rot) = transform.get("rotation") { + let KclValue::Object { value: rot, meta: _ } = rot else { + return Err(KclError::Semantic(KclErrorDetails { + message: "The 'rotation' key must be an object (with optional fields 'angle', 'axis' and 'origin')" + .to_string(), + source_ranges: source_ranges.clone(), + })); + }; if let Some(axis) = rot.get("axis") { - rotation.axis = array_to_point3d(axis, source_ranges.clone())?.into(); + rotation.axis = T::array_to_point3d(axis, source_ranges.clone())?.into(); } if let Some(angle) = rot.get("angle") { match angle { - JValue::Number(number) => { - if let Some(number) = number.as_f64() { - rotation.angle = Angle::from_degrees(number); - } + KclValue::Number { value: number, meta: _ } => { + rotation.angle = Angle::from_degrees(*number); } _ => { return Err(KclError::Semantic(KclErrorDetails { @@ -425,26 +518,26 @@ async fn make_transform<'a>( } if let Some(origin) = rot.get("origin") { rotation.origin = match origin { - JValue::String(s) if s == "local" => OriginType::Local, - JValue::String(s) if s == "global" => OriginType::Global, + KclValue::String { value: s, meta: _ } if s == "local" => OriginType::Local, + KclValue::String { value: s, meta: _ } if s == "global" => OriginType::Global, other => { - let origin = array_to_point3d(other, source_ranges.clone())?.into(); + let origin = T::array_to_point3d(other, source_ranges.clone())?.into(); OriginType::Custom { origin } } }; } } - let t = Transform { + + Ok(Transform { replicate, scale: scale.into(), translate: translate.into(), rotation, - }; - Ok(t) + }) } -fn array_to_point3d(json: &JValue, source_ranges: Vec) -> Result { - let JValue::Array(arr) = json else { +fn array_to_point3d(val: &KclValue, source_ranges: Vec) -> Result { + let KclValue::Array { value: arr, meta } = val else { return Err(KclError::Semantic(KclErrorDetails { message: "Expected an array of 3 numbers (i.e. a 3D point)".to_string(), source_ranges, @@ -457,28 +550,121 @@ fn array_to_point3d(json: &JValue, source_ranges: Vec) -> Result) -> Result { + let KclValue::Array { value: arr, meta } = val else { + return Err(KclError::Semantic(KclErrorDetails { + message: "Expected an array of 2 numbers (i.e. a 2D point)".to_string(), + source_ranges, + })); + }; + let len = arr.len(); + if len != 2 { + return Err(KclError::Semantic(KclErrorDetails { + message: format!("Expected an array of 2 numbers (i.e. a 2D point) but found {len} items"), + source_ranges, + })); + }; + // Gets an f64 from a KCL value. + let f = |k: &KclValue, component: char| { + use super::args::FromKclValue; + if let Some(value) = f64::from_kcl_val(k) { + Ok(value) + } else { + Err(KclError::Semantic(KclErrorDetails { + message: format!("{component} component of this point was not a number"), + source_ranges: meta.iter().map(|m| m.source_range).collect(), + })) + } + }; + let x = f(&arr[0], 'x')?; + let y = f(&arr[1], 'y')?; + Ok(Point2d { x, y }) +} + +trait GeometryTrait: Clone { + type Set: Into> + Clone; + fn id(&self) -> Uuid; + fn set_id(&mut self, id: Uuid); + fn array_to_point3d(val: &KclValue, source_ranges: Vec) -> Result; + async fn flush_batch(args: &Args, exec_state: &mut ExecState, set: Self::Set) -> Result<(), KclError>; +} + +impl GeometryTrait for Box { + type Set = SketchSet; + fn set_id(&mut self, id: Uuid) { + self.id = id; + } + fn id(&self) -> Uuid { + self.id + } + fn array_to_point3d(val: &KclValue, source_ranges: Vec) -> Result { + let Point2d { x, y } = array_to_point2d(val, source_ranges)?; + Ok(Point3d { x, y, z: 0.0 }) + } + + async fn flush_batch(_: &Args, _: &mut ExecState, _: Self::Set) -> Result<(), KclError> { + Ok(()) + } +} + +impl GeometryTrait for Box { + type Set = SolidSet; + fn set_id(&mut self, id: Uuid) { + self.id = id; + } + + fn id(&self) -> Uuid { + self.id + } + fn array_to_point3d(val: &KclValue, source_ranges: Vec) -> Result { + array_to_point3d(val, source_ranges) + } + + async fn flush_batch(args: &Args, exec_state: &mut ExecState, solid_set: Self::Set) -> Result<(), KclError> { + args.flush_batch_for_solid_set(exec_state, solid_set.into()).await + } +} + #[cfg(test)] mod tests { use super::*; #[test] fn test_array_to_point3d() { - let input = serde_json::json! { - [1.1, 2.2, 3.3] + let input = KclValue::Array { + value: vec![ + KclValue::Number { + value: 1.1, + meta: Default::default(), + }, + KclValue::Number { + value: 2.2, + meta: Default::default(), + }, + KclValue::Number { + value: 3.3, + meta: Default::default(), + }, + ], + meta: Default::default(), }; let expected = Point3d { x: 1.1, y: 2.2, z: 3.3 }; let actual = array_to_point3d(&input, Vec::new()); @@ -507,15 +693,15 @@ pub async fn pattern_linear_2d(exec_state: &mut ExecState, args: Args) -> Result /// of distance between each repetition, some specified number of times. /// /// ```no_run -/// const exampleSketch = startSketchOn('XZ') -/// |> circle({ center: [0, 0], radius: 1 }, %) +/// exampleSketch = startSketchOn('XZ') +/// |> circle({ center = [0, 0], radius = 1 }, %) /// |> patternLinear2d({ -/// axis: [1, 0], -/// instances: 7, -/// distance: 4 +/// axis = [1, 0], +/// instances = 7, +/// distance = 4 /// }, %) /// -/// const example = extrude(1, exampleSketch) +/// example = extrude(1, exampleSketch) /// ``` #[stdlib { name = "patternLinear2d", @@ -526,33 +712,21 @@ async fn inner_pattern_linear_2d( exec_state: &mut ExecState, args: Args, ) -> Result>, KclError> { - let starting_sketches: Vec> = sketch_set.into(); - - if args.ctx.context_type == crate::executor::ContextType::Mock { - return Ok(starting_sketches); - } - - let mut sketches = Vec::new(); - for sketch in starting_sketches.iter() { - let geometries = pattern_linear( - LinearPattern::TwoD(data.clone()), - Geometry::Sketch(sketch.clone()), - exec_state, - args.clone(), - ) - .await?; - - let Geometries::Sketches(new_sketches) = geometries else { - return Err(KclError::Semantic(KclErrorDetails { - message: "Expected a vec of sketches".to_string(), - source_ranges: vec![args.source_range], - })); - }; - - sketches.extend(new_sketches); - } - - Ok(sketches) + let axis = data.axis; + let [x, y] = axis; + let axis_len = f64::sqrt(x * x + y * y); + let normalized_axis = kcmc::shared::Point2d::from([x / axis_len, y / axis_len]); + let transforms: Vec<_> = (1..data.instances) + .map(|i| { + let d = data.distance * (i as f64); + let translate = (normalized_axis * d).with_z(0.0).map(LengthUnit); + vec![Transform { + translate, + ..Default::default() + }] + }) + .collect(); + execute_pattern_transform(transforms, sketch_set, exec_state, &args).await } /// A linear pattern on a 3D model. @@ -576,22 +750,23 @@ pub async fn pattern_linear_3d(exec_state: &mut ExecState, args: Args) -> Result /// of distance between each repetition, some specified number of times. /// /// ```no_run -/// const exampleSketch = startSketchOn('XZ') +/// exampleSketch = startSketchOn('XZ') /// |> startProfileAt([0, 0], %) /// |> line([0, 2], %) /// |> line([3, 1], %) /// |> line([0, -4], %) /// |> close(%) /// -/// const example = extrude(1, exampleSketch) +/// example = extrude(1, exampleSketch) /// |> patternLinear3d({ -/// axis: [1, 0, 1], -/// instances: 7, -/// distance: 6 +/// axis = [1, 0, 1], +/// instances = 7, +/// distance = 6 /// }, %) /// ``` #[stdlib { name = "patternLinear3d", + feature_tree_operation = true, }] async fn inner_pattern_linear_3d( data: LinearPattern3dData, @@ -599,106 +774,21 @@ async fn inner_pattern_linear_3d( exec_state: &mut ExecState, args: Args, ) -> Result>, KclError> { - // Flush the batch for our fillets/chamfers if there are any. - // If we do not flush these, then you won't be able to pattern something with fillets. - // Flush just the fillets/chamfers that apply to these solids. - args.flush_batch_for_solid_set(exec_state, solid_set.clone().into()) - .await?; - - let starting_solids: Vec> = solid_set.into(); - - if args.ctx.context_type == crate::executor::ContextType::Mock { - return Ok(starting_solids); - } - - let mut solids = Vec::new(); - for solid in starting_solids.iter() { - let geometries = pattern_linear( - LinearPattern::ThreeD(data.clone()), - Geometry::Solid(solid.clone()), - exec_state, - args.clone(), - ) - .await?; - - let Geometries::Solids(new_solids) = geometries else { - return Err(KclError::Semantic(KclErrorDetails { - message: "Expected a vec of solids".to_string(), - source_ranges: vec![args.source_range], - })); - }; - - solids.extend(new_solids); - } - - Ok(solids) -} - -async fn pattern_linear( - data: LinearPattern, - geometry: Geometry, - exec_state: &mut ExecState, - args: Args, -) -> Result { - let id = exec_state.id_generator.next_uuid(); - - let num_repetitions = match data.repetitions() { - RepetitionsNeeded::More(n) => n, - RepetitionsNeeded::None => { - return Ok(Geometries::from(geometry)); - } - RepetitionsNeeded::Invalid => { - return Err(KclError::Syntax(KclErrorDetails { - source_ranges: vec![args.source_range], - message: MUST_HAVE_ONE_INSTANCE.to_owned(), - })); - } - }; - - let resp = args - .send_modeling_cmd( - id, - ModelingCmd::from(mcmd::EntityLinearPattern { - axis: kcmc::shared::Point3d::from(data.axis()), - entity_id: geometry.id(), - num_repetitions, - spacing: LengthUnit(data.distance()), - }), - ) - .await?; - - let OkWebSocketResponseData::Modeling { - modeling_response: OkModelingCmdResponse::EntityLinearPattern(pattern_info), - } = &resp - else { - return Err(KclError::Engine(KclErrorDetails { - message: format!("EntityLinearPattern response was not as expected: {:?}", resp), - source_ranges: vec![args.source_range], - })); - }; - - let geometries = match geometry { - Geometry::Sketch(sketch) => { - let mut geometries = vec![sketch.clone()]; - for id in pattern_info.entity_ids.iter() { - let mut new_sketch = sketch.clone(); - new_sketch.id = *id; - geometries.push(new_sketch); - } - Geometries::Sketches(geometries) - } - Geometry::Solid(solid) => { - let mut geometries = vec![solid.clone()]; - for id in pattern_info.entity_ids.iter() { - let mut new_solid = solid.clone(); - new_solid.id = *id; - geometries.push(new_solid); - } - Geometries::Solids(geometries) - } - }; - - Ok(geometries) + let axis = data.axis; + let [x, y, z] = axis; + let axis_len = f64::sqrt(x * x + y * y + z * z); + let normalized_axis = kcmc::shared::Point3d::from([x / axis_len, y / axis_len, z / axis_len]); + let transforms: Vec<_> = (1..data.instances) + .map(|i| { + let d = data.distance * (i as f64); + let translate = (normalized_axis * d).map(LengthUnit); + vec![Transform { + translate, + ..Default::default() + }] + }) + .collect(); + execute_pattern_transform(transforms, solid_set, exec_state, &args).await } /// Data for a circular pattern on a 2D sketch. @@ -710,7 +800,7 @@ pub struct CircularPattern2dData { /// This includes the original entity. For example, if instances is 2, /// there will be two copies -- the original, and one new copy. /// If instances is 1, this has no effect. - pub instances: Uint, + pub instances: u32, /// The center about which to make the pattern. This is a 2D vector. pub center: [f64; 2], /// The arc angle (in degrees) to place the repetitions. Must be greater than 0. @@ -728,7 +818,7 @@ pub struct CircularPattern3dData { /// This includes the original entity. For example, if instances is 2, /// there will be two copies -- the original, and one new copy. /// If instances is 1, this has no effect. - pub instances: Uint, + pub instances: u32, /// The axis around which to make the pattern. This is a 3D vector. pub axis: [f64; 3], /// The center about which to make the pattern. This is a 3D vector. @@ -780,8 +870,8 @@ impl CircularPattern { fn repetitions(&self) -> RepetitionsNeeded { let n = match self { - CircularPattern::TwoD(lp) => lp.instances.u32(), - CircularPattern::ThreeD(lp) => lp.instances.u32(), + CircularPattern::TwoD(lp) => lp.instances, + CircularPattern::ThreeD(lp) => lp.instances, }; RepetitionsNeeded::from(n) } @@ -815,20 +905,20 @@ pub async fn pattern_circular_2d(exec_state: &mut ExecState, args: Args) -> Resu /// solid with respect to the center of the circle is maintained. /// /// ```no_run -/// const exampleSketch = startSketchOn('XZ') +/// exampleSketch = startSketchOn('XZ') /// |> startProfileAt([.5, 25], %) /// |> line([0, 5], %) /// |> line([-1, 0], %) /// |> line([0, -5], %) /// |> close(%) /// |> patternCircular2d({ -/// center: [0, 0], -/// instances: 13, -/// arcDegrees: 360, -/// rotateDuplicates: true +/// center = [0, 0], +/// instances = 13, +/// arcDegrees = 360, +/// rotateDuplicates = true /// }, %) /// -/// const example = extrude(1, exampleSketch) +/// example = extrude(1, exampleSketch) /// ``` #[stdlib { name = "patternCircular2d", @@ -841,7 +931,7 @@ async fn inner_pattern_circular_2d( ) -> Result>, KclError> { let starting_sketches: Vec> = sketch_set.into(); - if args.ctx.context_type == crate::executor::ContextType::Mock { + if args.ctx.context_type == crate::execution::ContextType::Mock { return Ok(starting_sketches); } @@ -882,20 +972,21 @@ pub async fn pattern_circular_3d(exec_state: &mut ExecState, args: Args) -> Resu /// solid with respect to the center of the circle is maintained. /// /// ```no_run -/// const exampleSketch = startSketchOn('XZ') -/// |> circle({ center: [0, 0], radius: 1 }, %) +/// exampleSketch = startSketchOn('XZ') +/// |> circle({ center = [0, 0], radius = 1 }, %) /// -/// const example = extrude(-5, exampleSketch) +/// example = extrude(-5, exampleSketch) /// |> patternCircular3d({ -/// axis: [1, -1, 0], -/// center: [10, -20, 0], -/// instances: 11, -/// arcDegrees: 360, -/// rotateDuplicates: true +/// axis = [1, -1, 0], +/// center = [10, -20, 0], +/// instances = 11, +/// arcDegrees = 360, +/// rotateDuplicates = true /// }, %) /// ``` #[stdlib { name = "patternCircular3d", + feature_tree_operation = true, }] async fn inner_pattern_circular_3d( data: CircularPattern3dData, @@ -911,7 +1002,7 @@ async fn inner_pattern_circular_3d( let starting_solids: Vec> = solid_set.into(); - if args.ctx.context_type == crate::executor::ContextType::Mock { + if args.ctx.context_type == crate::execution::ContextType::Mock { return Ok(starting_solids); } @@ -944,14 +1035,14 @@ async fn pattern_circular( exec_state: &mut ExecState, args: Args, ) -> Result { - let id = exec_state.id_generator.next_uuid(); + let id = exec_state.next_uuid(); let num_repetitions = match data.repetitions() { RepetitionsNeeded::More(n) => n, RepetitionsNeeded::None => { return Ok(Geometries::from(geometry)); } RepetitionsNeeded::Invalid => { - return Err(KclError::Syntax(KclErrorDetails { + return Err(KclError::Semantic(KclErrorDetails { source_ranges: vec![args.source_range], message: MUST_HAVE_ONE_INSTANCE.to_owned(), })); diff --git a/src/wasm-lib/kcl/src/std/planes.rs b/src/wasm-lib/kcl/src/std/planes.rs index 436d19938..bc6c35e51 100644 --- a/src/wasm-lib/kcl/src/std/planes.rs +++ b/src/wasm-lib/kcl/src/std/planes.rs @@ -1,17 +1,20 @@ //! Standard library plane helpers. use derive_docs::stdlib; +use kcmc::{each_cmd as mcmd, length_unit::LengthUnit, shared::Color, ModelingCmd}; +use kittycad_modeling_cmds as kcmc; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use crate::{ errors::KclError, - executor::{ExecState, KclValue, Metadata, Plane, UserVal}, + execution::{ExecState, KclValue, Plane, PlaneType}, std::{sketch::PlaneData, Args}, }; /// One of the standard planes. -#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, JsonSchema)] +#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] +#[ts(export)] #[serde(rename_all = "camelCase")] pub enum StandardPlane { /// The XY plane. @@ -50,15 +53,9 @@ impl From for PlaneData { /// Offset a plane by a distance along its normal. pub async fn offset_plane(exec_state: &mut ExecState, args: Args) -> Result { let (std_plane, offset): (StandardPlane, f64) = args.get_data_and_float()?; - let plane = inner_offset_plane(std_plane, offset, exec_state).await?; - - Ok(KclValue::UserVal(UserVal::new( - vec![Metadata { - source_range: args.source_range, - }], - plane, - ))) + make_offset_plane_in_engine(&plane, exec_state, &args).await?; + Ok(KclValue::Plane(Box::new(plane))) } /// Offset a plane by a distance along its normal. @@ -68,7 +65,7 @@ pub async fn offset_plane(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([-100, 200], %) /// |> line([200, 0], %) /// |> line([0, -200], %) @@ -76,15 +73,15 @@ pub async fn offset_plane(exec_state: &mut ExecState, args: Args) -> Result lineTo([profileStartX(%), profileStartY(%)], %) /// |> close(%) /// -/// const circleSketch = startSketchOn(offsetPlane('XY', 150)) -/// |> circle({ center: [0, 100], radius: 50 }, %) +/// circleSketch = startSketchOn(offsetPlane('XY', 150)) +/// |> circle({ center = [0, 100], radius = 50 }, %) /// /// loft([squareSketch, circleSketch]) /// ``` /// /// ```no_run /// // Loft a square and a circle on the `XZ` plane using offset. -/// const squareSketch = startSketchOn('XZ') +/// squareSketch = startSketchOn('XZ') /// |> startProfileAt([-100, 200], %) /// |> line([200, 0], %) /// |> line([0, -200], %) @@ -92,15 +89,15 @@ pub async fn offset_plane(exec_state: &mut ExecState, args: Args) -> Result lineTo([profileStartX(%), profileStartY(%)], %) /// |> close(%) /// -/// const circleSketch = startSketchOn(offsetPlane('XZ', 150)) -/// |> circle({ center: [0, 100], radius: 50 }, %) +/// circleSketch = startSketchOn(offsetPlane('XZ', 150)) +/// |> circle({ center = [0, 100], radius = 50 }, %) /// /// loft([squareSketch, circleSketch]) /// ``` /// /// ```no_run /// // Loft a square and a circle on the `YZ` plane using offset. -/// const squareSketch = startSketchOn('YZ') +/// squareSketch = startSketchOn('YZ') /// |> startProfileAt([-100, 200], %) /// |> line([200, 0], %) /// |> line([0, -200], %) @@ -108,15 +105,15 @@ pub async fn offset_plane(exec_state: &mut ExecState, args: Args) -> Result lineTo([profileStartX(%), profileStartY(%)], %) /// |> close(%) /// -/// const circleSketch = startSketchOn(offsetPlane('YZ', 150)) -/// |> circle({ center: [0, 100], radius: 50 }, %) +/// circleSketch = startSketchOn(offsetPlane('YZ', 150)) +/// |> circle({ center = [0, 100], radius = 50 }, %) /// /// loft([squareSketch, circleSketch]) /// ``` /// /// ```no_run /// // Loft a square and a circle on the `-XZ` plane using offset. -/// const squareSketch = startSketchOn('-XZ') +/// squareSketch = startSketchOn('-XZ') /// |> startProfileAt([-100, 200], %) /// |> line([200, 0], %) /// |> line([0, -200], %) @@ -124,23 +121,41 @@ pub async fn offset_plane(exec_state: &mut ExecState, args: Args) -> Result lineTo([profileStartX(%), profileStartY(%)], %) /// |> close(%) /// -/// const circleSketch = startSketchOn(offsetPlane('-XZ', -150)) -/// |> circle({ center: [0, 100], radius: 50 }, %) +/// circleSketch = startSketchOn(offsetPlane('-XZ', -150)) +/// |> circle({ center = [0, 100], radius = 50 }, %) /// /// loft([squareSketch, circleSketch]) /// ``` +/// ```no_run +/// // A circle on the XY plane +/// startSketchOn("XY") +/// |> startProfileAt([0, 0], %) +/// |> circle({ radius = 10, center = [0, 0] }, %) +/// +/// // Triangle on the plane 4 units above +/// startSketchOn(offsetPlane("XY", 4)) +/// |> startProfileAt([0, 0], %) +/// |> line([10, 0], %) +/// |> line([0, 10], %) +/// |> close(%) +/// ``` + #[stdlib { name = "offsetPlane", + feature_tree_operation = true, }] async fn inner_offset_plane( std_plane: StandardPlane, offset: f64, exec_state: &mut ExecState, -) -> Result { +) -> Result { // Convert to the plane type. let plane_data: PlaneData = std_plane.into(); // Convert to a plane. let mut plane = Plane::from_plane_data(plane_data, exec_state); + // Though offset planes are derived from standard planes, they are not + // standard planes themselves. + plane.value = PlaneType::Custom; match std_plane { StandardPlane::XY => { @@ -163,10 +178,44 @@ async fn inner_offset_plane( } } - Ok(PlaneData::Plane { - origin: Box::new(plane.origin), - x_axis: Box::new(plane.x_axis), - y_axis: Box::new(plane.y_axis), - z_axis: Box::new(plane.z_axis), - }) + Ok(plane) +} + +// Engine-side effectful creation of an actual plane object. +// offset planes are shown by default, and hidden by default if they +// are used as a sketch plane. That hiding command is sent within inner_start_profile_at +async fn make_offset_plane_in_engine(plane: &Plane, exec_state: &mut ExecState, args: &Args) -> Result<(), KclError> { + // Create new default planes. + let default_size = 100.0; + let color = Color { + r: 0.6, + g: 0.6, + b: 0.6, + a: 0.3, + }; + + args.batch_modeling_cmd( + plane.id, + ModelingCmd::from(mcmd::MakePlane { + clobber: false, + origin: plane.origin.into(), + size: LengthUnit(default_size), + x_axis: plane.x_axis.into(), + y_axis: plane.y_axis.into(), + hide: Some(false), + }), + ) + .await?; + + // Set the color. + args.batch_modeling_cmd( + exec_state.next_uuid(), + ModelingCmd::from(mcmd::PlaneSetColor { + color, + plane_id: plane.id, + }), + ) + .await?; + + Ok(()) } diff --git a/src/wasm-lib/kcl/src/std/polar.rs b/src/wasm-lib/kcl/src/std/polar.rs index f29be1c0c..e559b8573 100644 --- a/src/wasm-lib/kcl/src/std/polar.rs +++ b/src/wasm-lib/kcl/src/std/polar.rs @@ -7,7 +7,7 @@ use serde::{Deserialize, Serialize}; use crate::{ errors::KclError, - executor::{ExecState, KclValue}, + execution::{ExecState, KclValue}, std::Args, }; @@ -34,7 +34,7 @@ pub async fn polar(_exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> line(polar({angle: 30, length: 5}), %, $thing) /// |> line([0, 5], %) @@ -42,7 +42,7 @@ pub async fn polar(_exec_state: &mut ExecState, args: Args) -> Result line([-20, 10], %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "polar", diff --git a/src/wasm-lib/kcl/src/std/revolve.rs b/src/wasm-lib/kcl/src/std/revolve.rs index 5ba5df96b..e617153e7 100644 --- a/src/wasm-lib/kcl/src/std/revolve.rs +++ b/src/wasm-lib/kcl/src/std/revolve.rs @@ -9,7 +9,7 @@ use serde::{Deserialize, Serialize}; use crate::{ errors::{KclError, KclErrorDetails}, - executor::{ExecState, KclValue, Sketch, Solid}, + execution::{ExecState, KclValue, Sketch, Solid}, std::{ extrude::do_post_extrude, fillet::{default_tolerance, EdgeReference}, @@ -113,7 +113,7 @@ pub async fn revolve(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([4, 12], %) /// |> line([2, 0], %) /// |> line([0, -6], %) @@ -123,21 +123,21 @@ pub async fn revolve(exec_state: &mut ExecState, args: Args) -> Result line([0, -5.5], %) /// |> line([-2, 0], %) /// |> close(%) -/// |> revolve({axis: 'y'}, %) // default angle is 360 +/// |> revolve({axis = 'y'}, %) // default angle is 360 /// ``` /// /// ```no_run /// // A donut shape. -/// const sketch001 = startSketchOn('XY') -/// |> circle({ center: [15, 0], radius: 5 }, %) +/// sketch001 = startSketchOn('XY') +/// |> circle({ center = [15, 0], radius = 5 }, %) /// |> revolve({ -/// angle: 360, -/// axis: 'y' +/// angle = 360, +/// axis = 'y' /// }, %) /// ``` /// /// ```no_run -/// const part001 = startSketchOn('XY') +/// part001 = startSketchOn('XY') /// |> startProfileAt([4, 12], %) /// |> line([2, 0], %) /// |> line([0, -6], %) @@ -147,11 +147,11 @@ pub async fn revolve(exec_state: &mut ExecState, args: Args) -> Result line([0, -5.5], %) /// |> line([-2, 0], %) /// |> close(%) -/// |> revolve({axis: 'y', angle: 180}, %) +/// |> revolve({axis = 'y', angle = 180}, %) /// ``` /// /// ```no_run -/// const part001 = startSketchOn('XY') +/// part001 = startSketchOn('XY') /// |> startProfileAt([4, 12], %) /// |> line([2, 0], %) /// |> line([0, -6], %) @@ -161,8 +161,8 @@ pub async fn revolve(exec_state: &mut ExecState, args: Args) -> Result line([0, -5.5], %) /// |> line([-2, 0], %) /// |> close(%) -/// |> revolve({axis: 'y', angle: 180}, %) -/// const part002 = startSketchOn(part001, 'end') +/// |> revolve({axis = 'y', angle = 180}, %) +/// part002 = startSketchOn(part001, 'end') /// |> startProfileAt([4.5, -5], %) /// |> line([0, 5], %) /// |> line([5, 0], %) @@ -172,7 +172,7 @@ pub async fn revolve(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> line([0, 20], %) /// |> line([20, 0], %) @@ -180,16 +180,16 @@ pub async fn revolve(exec_state: &mut ExecState, args: Args) -> Result close(%) /// |> extrude(20, %) /// -/// const sketch001 = startSketchOn(box, "END") -/// |> circle({ center: [10,10], radius: 4 }, %) +/// sketch001 = startSketchOn(box, "END") +/// |> circle({ center = [10,10], radius = 4 }, %) /// |> revolve({ -/// angle: -90, -/// axis: 'y' +/// angle = -90, +/// axis = 'y' /// }, %) /// ``` /// /// ```no_run -/// const box = startSketchOn('XY') +/// box = startSketchOn('XY') /// |> startProfileAt([0, 0], %) /// |> line([0, 20], %) /// |> line([20, 0], %) @@ -197,16 +197,16 @@ pub async fn revolve(exec_state: &mut ExecState, args: Args) -> Result close(%) /// |> extrude(20, %) /// -/// const sketch001 = startSketchOn(box, "END") -/// |> circle({ center: [10,10], radius: 4 }, %) +/// sketch001 = startSketchOn(box, "END") +/// |> circle({ center = [10,10], radius = 4 }, %) /// |> revolve({ -/// angle: 90, -/// axis: getOppositeEdge(revolveAxis) +/// angle = 90, +/// axis = getOppositeEdge(revolveAxis) /// }, %) /// ``` /// /// ```no_run -/// const box = startSketchOn('XY') +/// box = startSketchOn('XY') /// |> startProfileAt([0, 0], %) /// |> line([0, 20], %) /// |> line([20, 0], %) @@ -214,27 +214,27 @@ pub async fn revolve(exec_state: &mut ExecState, args: Args) -> Result close(%) /// |> extrude(20, %) /// -/// const sketch001 = startSketchOn(box, "END") -/// |> circle({ center: [10,10], radius: 4 }, %) +/// sketch001 = startSketchOn(box, "END") +/// |> circle({ center = [10,10], radius = 4 }, %) /// |> revolve({ -/// angle: 90, -/// axis: getOppositeEdge(revolveAxis), +/// angle = 90, +/// axis = getOppositeEdge(revolveAxis), /// tolerance: 0.0001 /// }, %) /// ``` /// /// ```no_run -/// const sketch001 = startSketchOn('XY') +/// sketch001 = startSketchOn('XY') /// |> startProfileAt([10, 0], %) /// |> line([5, -5], %) /// |> line([5, 5], %) /// |> lineTo([profileStartX(%), profileStartY(%)], %) /// |> close(%) /// -/// const part001 = revolve({ -/// axis: { +/// part001 = revolve({ +/// axis = { /// custom: { -/// axis: [0.0, 1.0], +/// axis = [0.0, 1.0], /// origin: [0.0, 0.0] /// } /// } @@ -242,6 +242,7 @@ pub async fn revolve(exec_state: &mut ExecState, args: Args) -> Result { let (axis, origin) = axis.axis_and_origin()?; diff --git a/src/wasm-lib/kcl/src/std/segment.rs b/src/wasm-lib/kcl/src/std/segment.rs index 699955fbe..edb6451ae 100644 --- a/src/wasm-lib/kcl/src/std/segment.rs +++ b/src/wasm-lib/kcl/src/std/segment.rs @@ -2,25 +2,74 @@ use anyhow::Result; use derive_docs::stdlib; +use kittycad_modeling_cmds::shared::Angle; use crate::{ errors::{KclError, KclErrorDetails}, - executor::{ExecState, KclValue, Sketch, TagIdentifier}, + execution::{ExecState, KclValue, Point2d, Sketch, TagIdentifier}, std::{utils::between, Args}, }; +/// Returns the point at the end of the given segment. +pub async fn segment_end(exec_state: &mut ExecState, args: Args) -> Result { + let tag: TagIdentifier = args.get_data()?; + let result = inner_segment_end(&tag, exec_state, args.clone())?; + + args.make_user_val_from_point(result) +} + +/// Compute the ending point of the provided line segment. +/// +/// ```no_run +/// w = 15 +/// cube = startSketchOn('XY') +/// |> startProfileAt([0, 0], %) +/// |> line([w, 0], %, $line1) +/// |> line([0, w], %, $line2) +/// |> line([-w, 0], %, $line3) +/// |> line([0, -w], %, $line4) +/// |> close(%) +/// |> extrude(5, %) +/// +/// fn cylinder(radius, tag) { +/// return startSketchOn('XY') +/// |> startProfileAt([0, 0], %) +/// |> circle({ radius = radius, center = segEnd(tag) }, %) +/// |> extrude(radius, %) +/// } +/// +/// cylinder(1, line1) +/// cylinder(2, line2) +/// cylinder(3, line3) +/// cylinder(4, line4) +/// ``` +#[stdlib { + name = "segEnd", +}] +fn inner_segment_end(tag: &TagIdentifier, exec_state: &mut ExecState, args: Args) -> Result<[f64; 2], KclError> { + let line = args.get_tag_engine_info(exec_state, tag)?; + let path = line.path.clone().ok_or_else(|| { + KclError::Type(KclErrorDetails { + message: format!("Expected a line segment with a path, found `{:?}`", line), + source_ranges: vec![args.source_range], + }) + })?; + + Ok(path.get_base().to) +} + /// Returns the segment end of x. pub async fn segment_end_x(exec_state: &mut ExecState, args: Args) -> Result { let tag: TagIdentifier = args.get_data()?; let result = inner_segment_end_x(&tag, exec_state, args.clone())?; - args.make_user_val_from_f64(result) + Ok(args.make_user_val_from_f64(result)) } /// Compute the ending point of the provided line segment along the 'x' axis. /// /// ```no_run -/// const exampleSketch = startSketchOn('XZ') +/// exampleSketch = startSketchOn('XZ') /// |> startProfileAt([0, 0], %) /// |> line([20, 0], %, $thing) /// |> line([0, 5], %) @@ -28,7 +77,7 @@ pub async fn segment_end_x(exec_state: &mut ExecState, args: Args) -> Result line([-20, 10], %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "segEndX", @@ -50,13 +99,13 @@ pub async fn segment_end_y(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> line([20, 0], %) /// |> line([0, 3], %, $thing) @@ -65,7 +114,7 @@ pub async fn segment_end_y(exec_state: &mut ExecState, args: Args) -> Result line([-10, 0], %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "segEndY", @@ -82,19 +131,139 @@ fn inner_segment_end_y(tag: &TagIdentifier, exec_state: &mut ExecState, args: Ar Ok(path.get_to()[1]) } +/// Returns the point at the start of the given segment. +pub async fn segment_start(exec_state: &mut ExecState, args: Args) -> Result { + let tag: TagIdentifier = args.get_data()?; + let result = inner_segment_start(&tag, exec_state, args.clone())?; + + args.make_user_val_from_point(result) +} + +/// Compute the starting point of the provided line segment. +/// +/// ```no_run +/// w = 15 +/// cube = startSketchOn('XY') +/// |> startProfileAt([0, 0], %) +/// |> line([w, 0], %, $line1) +/// |> line([0, w], %, $line2) +/// |> line([-w, 0], %, $line3) +/// |> line([0, -w], %, $line4) +/// |> close(%) +/// |> extrude(5, %) +/// +/// fn cylinder(radius, tag) { +/// return startSketchOn('XY') +/// |> startProfileAt([0, 0], %) +/// |> circle({ radius = radius, center = segStart(tag) }, %) +/// |> extrude(radius, %) +/// } +/// +/// cylinder(1, line1) +/// cylinder(2, line2) +/// cylinder(3, line3) +/// cylinder(4, line4) +/// ``` +#[stdlib { + name = "segStart", +}] +fn inner_segment_start(tag: &TagIdentifier, exec_state: &mut ExecState, args: Args) -> Result<[f64; 2], KclError> { + let line = args.get_tag_engine_info(exec_state, tag)?; + let path = line.path.clone().ok_or_else(|| { + KclError::Type(KclErrorDetails { + message: format!("Expected a line segment with a path, found `{:?}`", line), + source_ranges: vec![args.source_range], + }) + })?; + + Ok(path.get_from().to_owned()) +} + +/// Returns the segment start of x. +pub async fn segment_start_x(exec_state: &mut ExecState, args: Args) -> Result { + let tag: TagIdentifier = args.get_data()?; + let result = inner_segment_start_x(&tag, exec_state, args.clone())?; + + Ok(args.make_user_val_from_f64(result)) +} + +/// Compute the starting point of the provided line segment along the 'x' axis. +/// +/// ```no_run +/// exampleSketch = startSketchOn('XZ') +/// |> startProfileAt([0, 0], %) +/// |> line([20, 0], %, $thing) +/// |> line([0, 5], %) +/// |> line([20 - segStartX(thing), 0], %) +/// |> line([-20, 10], %) +/// |> close(%) +/// +/// example = extrude(5, exampleSketch) +/// ``` +#[stdlib { + name = "segStartX", +}] +fn inner_segment_start_x(tag: &TagIdentifier, exec_state: &mut ExecState, args: Args) -> Result { + let line = args.get_tag_engine_info(exec_state, tag)?; + let path = line.path.clone().ok_or_else(|| { + KclError::Type(KclErrorDetails { + message: format!("Expected a line segment with a path, found `{:?}`", line), + source_ranges: vec![args.source_range], + }) + })?; + + Ok(path.get_from()[0]) +} + +/// Returns the segment start of y. +pub async fn segment_start_y(exec_state: &mut ExecState, args: Args) -> Result { + let tag: TagIdentifier = args.get_data()?; + let result = inner_segment_start_y(&tag, exec_state, args.clone())?; + + Ok(args.make_user_val_from_f64(result)) +} + +/// Compute the starting point of the provided line segment along the 'y' axis. +/// +/// ```no_run +/// exampleSketch = startSketchOn('XZ') +/// |> startProfileAt([0, 0], %) +/// |> line([20, 0], %) +/// |> line([0, 3], %, $thing) +/// |> line([-10, 0], %) +/// |> line([0, 20-segStartY(thing)], %) +/// |> line([-10, 0], %) +/// |> close(%) +/// +/// example = extrude(5, exampleSketch) +/// ``` +#[stdlib { + name = "segStartY", +}] +fn inner_segment_start_y(tag: &TagIdentifier, exec_state: &mut ExecState, args: Args) -> Result { + let line = args.get_tag_engine_info(exec_state, tag)?; + let path = line.path.clone().ok_or_else(|| { + KclError::Type(KclErrorDetails { + message: format!("Expected a line segment with a path, found `{:?}`", line), + source_ranges: vec![args.source_range], + }) + })?; + + Ok(path.get_from()[1]) +} /// Returns the last segment of x. pub async fn last_segment_x(_exec_state: &mut ExecState, args: Args) -> Result { let sketch = args.get_sketch()?; let result = inner_last_segment_x(sketch, args.clone())?; - args.make_user_val_from_f64(result) + Ok(args.make_user_val_from_f64(result)) } /// Extract the 'x' axis value of the last line segment in the provided 2-d /// sketch. /// /// ```no_run -/// const exampleSketch = startSketchOn("XZ") +/// exampleSketch = startSketchOn("XZ") /// |> startProfileAt([0, 0], %) /// |> line([5, 0], %) /// |> line([20, 5], %) @@ -102,7 +271,7 @@ pub async fn last_segment_x(_exec_state: &mut ExecState, args: Args) -> Result line([-15, 0], %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "lastSegX", @@ -127,14 +296,14 @@ pub async fn last_segment_y(_exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> line([5, 0], %) /// |> line([20, 5], %) @@ -142,7 +311,7 @@ pub async fn last_segment_y(_exec_state: &mut ExecState, args: Args) -> Result line([-15, 0], %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "lastSegY", @@ -166,29 +335,29 @@ fn inner_last_segment_y(sketch: Sketch, args: Args) -> Result { pub async fn segment_length(exec_state: &mut ExecState, args: Args) -> Result { let tag: TagIdentifier = args.get_data()?; let result = inner_segment_length(&tag, exec_state, args.clone())?; - args.make_user_val_from_f64(result) + Ok(args.make_user_val_from_f64(result)) } /// Compute the length of the provided line segment. /// /// ```no_run -/// const exampleSketch = startSketchOn("XZ") +/// exampleSketch = startSketchOn("XZ") /// |> startProfileAt([0, 0], %) /// |> angledLine({ -/// angle: 60, -/// length: 10, +/// angle = 60, +/// length = 10, /// }, %, $thing) /// |> tangentialArc({ -/// offset: -120, -/// radius: 5, +/// offset = -120, +/// radius = 5, /// }, %) /// |> angledLine({ -/// angle: -60, -/// length: segLen(thing), +/// angle = -60, +/// length = segLen(thing), /// }, %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "segLen", @@ -212,13 +381,13 @@ pub async fn segment_angle(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> line([10, 0], %) /// |> line([5, 10], %, $seg01) @@ -228,7 +397,7 @@ pub async fn segment_angle(exec_state: &mut ExecState, args: Args) -> Result angledLine([segAng(seg01), -15], %) /// |> close(%) /// -/// const example = extrude(4, exampleSketch) +/// example = extrude(4, exampleSketch) /// ``` #[stdlib { name = "segAng", @@ -247,17 +416,123 @@ fn inner_segment_angle(tag: &TagIdentifier, exec_state: &mut ExecState, args: Ar Ok(result.to_degrees()) } +/// Returns the angle coming out of the end of the segment in degrees. +pub async fn tangent_to_end(exec_state: &mut ExecState, args: Args) -> Result { + let tag: TagIdentifier = args.get_data()?; + + let result = inner_tangent_to_end(&tag, exec_state, args.clone()).await?; + Ok(args.make_user_val_from_f64(result)) +} + +/// Returns the angle coming out of the end of the segment in degrees. +/// +/// ```no_run +/// // Horizontal pill. +/// pillSketch = startSketchOn('XZ') +/// |> startProfileAt([0, 0], %) +/// |> line([20, 0], %) +/// |> tangentialArcToRelative([0, 10], %, $arc1) +/// |> angledLine({ +/// angle: tangentToEnd(arc1), +/// length: 20, +/// }, %) +/// |> tangentialArcToRelative([0, -10], %) +/// |> close(%) +/// +/// pillExtrude = extrude(10, pillSketch) +/// ``` +/// +/// ```no_run +/// // Vertical pill. Use absolute coordinate for arc. +/// pillSketch = startSketchOn('XZ') +/// |> startProfileAt([0, 0], %) +/// |> line([0, 20], %) +/// |> tangentialArcTo([10, 20], %, $arc1) +/// |> angledLine({ +/// angle: tangentToEnd(arc1), +/// length: 20, +/// }, %) +/// |> tangentialArcToRelative([-10, 0], %) +/// |> close(%) +/// +/// pillExtrude = extrude(10, pillSketch) +/// ``` +/// +/// ```no_run +/// rectangleSketch = startSketchOn('XZ') +/// |> startProfileAt([0, 0], %) +/// |> line([10, 0], %, $seg1) +/// |> angledLine({ +/// angle: tangentToEnd(seg1), +/// length: 10, +/// }, %) +/// |> line([0, 10], %) +/// |> line([-20, 0], %) +/// |> close(%) +/// +/// rectangleExtrude = extrude(10, rectangleSketch) +/// ``` +/// +/// ```no_run +/// bottom = startSketchOn("XY") +/// |> startProfileAt([0, 0], %) +/// |> arcTo({ +/// end: [10, 10], +/// interior: [5, 1] +/// }, %, $arc1) +/// |> angledLine([tangentToEnd(arc1), 20], %) +/// |> close(%) +/// ``` +/// +/// ```no_run +/// circSketch = startSketchOn("XY") +/// |> circle({ center: [0, 0], radius: 3 }, %, $circ) +/// +/// triangleSketch = startSketchOn("XY") +/// |> startProfileAt([-5, 0], %) +/// |> angledLine([tangentToEnd(circ), 10], %) +/// |> line([-15, 0], %) +/// |> close(%) +/// ``` +#[stdlib { + name = "tangentToEnd", +}] +async fn inner_tangent_to_end(tag: &TagIdentifier, exec_state: &mut ExecState, args: Args) -> Result { + let line = args.get_tag_engine_info(exec_state, tag)?; + let path = line.path.clone().ok_or_else(|| { + KclError::Type(KclErrorDetails { + message: format!("Expected a line segment with a path, found `{:?}`", line), + source_ranges: vec![args.source_range], + }) + })?; + + let from = Point2d::from(path.get_to()); + + // Undocumented voodoo from get_tangential_arc_to_info + let tangent_info = path.get_tangential_info(); + let tan_previous_point = tangent_info.tan_previous_point(from.into()); + + // Calculate the end point from the angle and radius. + // atan2 outputs radians. + let previous_end_tangent = Angle::from_radians(f64::atan2( + from.y - tan_previous_point[1], + from.x - tan_previous_point[0], + )); + + Ok(previous_end_tangent.to_degrees()) +} + /// Returns the angle to match the given length for x. pub async fn angle_to_match_length_x(exec_state: &mut ExecState, args: Args) -> Result { let (tag, to, sketch) = args.get_tag_to_number_sketch()?; let result = inner_angle_to_match_length_x(&tag, to, sketch, exec_state, args.clone())?; - args.make_user_val_from_f64(result) + Ok(args.make_user_val_from_f64(result)) } -/// Compute the angle (in degrees) in o +/// Returns the angle to match the given length for x. /// /// ```no_run -/// const sketch001 = startSketchOn('XZ') +/// sketch001 = startSketchOn('XZ') /// |> startProfileAt([0, 0], %) /// |> line([2, 5], %, $seg01) /// |> angledLineToX([ @@ -266,7 +541,7 @@ pub async fn angle_to_match_length_x(exec_state: &mut ExecState, args: Args) -> /// ], %) /// |> close(%) /// -/// const extrusion = extrude(5, sketch001) +/// extrusion = extrude(5, sketch001) /// ``` #[stdlib { name = "angleToMatchLengthX", @@ -314,23 +589,23 @@ fn inner_angle_to_match_length_x( pub async fn angle_to_match_length_y(exec_state: &mut ExecState, args: Args) -> Result { let (tag, to, sketch) = args.get_tag_to_number_sketch()?; let result = inner_angle_to_match_length_y(&tag, to, sketch, exec_state, args.clone())?; - args.make_user_val_from_f64(result) + Ok(args.make_user_val_from_f64(result)) } /// Returns the angle to match the given length for y. /// /// ```no_run -/// const sketch001 = startSketchOn('XZ') +/// sketch001 = startSketchOn('XZ') /// |> startProfileAt([0, 0], %) /// |> line([1, 2], %, $seg01) /// |> angledLine({ -/// angle: angleToMatchLengthY(seg01, 15, %), -/// length: 5, +/// angle = angleToMatchLengthY(seg01, 15, %), +/// length = 5, /// }, %) /// |> yLineTo(0, %) /// |> close(%) /// -/// const extrusion = extrude(5, sketch001) +/// extrusion = extrude(5, sketch001) /// ``` #[stdlib { name = "angleToMatchLengthY", diff --git a/src/wasm-lib/kcl/src/std/shapes.rs b/src/wasm-lib/kcl/src/std/shapes.rs index a1ff5d4ce..456c133db 100644 --- a/src/wasm-lib/kcl/src/std/shapes.rs +++ b/src/wasm-lib/kcl/src/std/shapes.rs @@ -14,10 +14,13 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use crate::{ - ast::types::TagDeclarator, - errors::KclError, - executor::{BasePath, ExecState, GeoMeta, KclValue, Path, Sketch, SketchSurface}, - std::Args, + errors::{KclError, KclErrorDetails}, + execution::{BasePath, ExecState, GeoMeta, KclValue, Path, Sketch, SketchSurface}, + parsing::ast::types::TagNode, + std::{ + utils::{calculate_circle_center, distance}, + Args, + }, }; /// A sketch surface or a sketch. @@ -43,33 +46,35 @@ pub struct CircleData { /// Sketch a circle. pub async fn circle(exec_state: &mut ExecState, args: Args) -> Result { - let (data, sketch_surface_or_group, tag): (CircleData, SketchOrSurface, Option) = + let (data, sketch_surface_or_group, tag): (CircleData, SketchOrSurface, Option) = args.get_circle_args()?; let sketch = inner_circle(data, sketch_surface_or_group, tag, exec_state, args).await?; - Ok(KclValue::new_user_val(sketch.meta.clone(), sketch)) + Ok(KclValue::Sketch { + value: Box::new(sketch), + }) } /// Construct a 2-dimensional circle, of the specified radius, centered at /// the provided (x, y) origin point. /// /// ```no_run -/// const exampleSketch = startSketchOn("-XZ") -/// |> circle({ center: [0, 0], radius: 10 }, %) +/// exampleSketch = startSketchOn("-XZ") +/// |> circle({ center = [0, 0], radius = 10 }, %) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` /// /// ```no_run -/// const exampleSketch = startSketchOn("XZ") +/// exampleSketch = startSketchOn("XZ") /// |> startProfileAt([-15, 0], %) /// |> line([30, 0], %) /// |> line([0, 30], %) /// |> line([-30, 0], %) /// |> close(%) -/// |> hole(circle({ center: [0, 15], radius: 5 }, %), %) +/// |> hole(circle({ center = [0, 15], radius = 5 }, %), %) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "circle", @@ -77,7 +82,7 @@ pub async fn circle(exec_state: &mut ExecState, args: Args) -> Result, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -94,10 +99,11 @@ async fn inner_circle( ) .await?; + let from = [data.center[0] + data.radius, data.center[1]]; let angle_start = Angle::zero(); let angle_end = Angle::turn(); - let id = exec_state.id_generator.next_uuid(); + let id = exec_state.next_uuid(); args.batch_modeling_cmd( id, @@ -116,8 +122,8 @@ async fn inner_circle( let current_path = Path::Circle { base: BasePath { - from: data.center, - to: data.center, + from, + to: from, tag: tag.clone(), geo_meta: GeoMeta { id, @@ -126,7 +132,7 @@ async fn inner_circle( }, radius: data.radius, center: data.center, - ccw: angle_start.to_degrees() < angle_end.to_degrees(), + ccw: angle_start < angle_end, }; let mut new_sketch = sketch.clone(); @@ -141,3 +147,261 @@ async fn inner_circle( Ok(new_sketch) } + +/// Sketch a 3-point circle. +pub async fn circle_three_point(exec_state: &mut ExecState, args: Args) -> Result { + let p1 = args.get_kw_arg("p1")?; + let p2 = args.get_kw_arg("p2")?; + let p3 = args.get_kw_arg("p3")?; + let sketch_surface_or_group = args.get_unlabeled_kw_arg("sketch_surface_or_group")?; + let tag = args.get_kw_arg_opt("tag"); + + let sketch = inner_circle_three_point(p1, p2, p3, sketch_surface_or_group, tag, exec_state, args).await?; + Ok(KclValue::Sketch { + value: Box::new(sketch), + }) +} + +/// Construct a circle derived from 3 points. +/// +/// ```no_run +/// exampleSketch = startSketchOn("XY") +/// |> circleThreePoint(p1 = [10,10], p2 = [20,8], p3 = [15,5]) +/// +/// example = extrude(5, exampleSketch) +/// ``` +#[stdlib { + name = "circleThreePoint", + keywords = true, + unlabeled_first = true, + arg_docs = { + p1 = "1st point to derive the circle.", + p2 = "2nd point to derive the circle.", + p3 = "3rd point to derive the circle.", + sketch_surface_or_group = "Plane or surface to sketch on.", + tag = "Identifier for the circle to reference elsewhere.", + } +}] +async fn inner_circle_three_point( + p1: [f64; 2], + p2: [f64; 2], + p3: [f64; 2], + sketch_surface_or_group: SketchOrSurface, + tag: Option, + exec_state: &mut ExecState, + args: Args, +) -> Result { + let center = calculate_circle_center(p1, p2, p3); + inner_circle( + CircleData { + center, + // It can be the distance to any of the 3 points - they all lay on the circumference. + radius: distance(center.into(), p2.into()), + }, + sketch_surface_or_group, + tag, + exec_state, + args, + ) + .await +} + +/// Type of the polygon +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Default)] +#[ts(export)] +#[serde(rename_all = "lowercase")] +pub enum PolygonType { + #[default] + Inscribed, + Circumscribed, +} + +/// Data for drawing a polygon +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct PolygonData { + /// The radius of the polygon + pub radius: f64, + /// The number of sides in the polygon + pub num_sides: u64, + /// The center point of the polygon + pub center: [f64; 2], + /// The type of the polygon (inscribed or circumscribed) + #[serde(skip)] + pub polygon_type: PolygonType, + /// Whether the polygon is inscribed (true) or circumscribed (false) about a circle with the specified radius + #[serde(default = "default_inscribed")] + pub inscribed: bool, +} + +fn default_inscribed() -> bool { + true +} + +/// Create a regular polygon with the specified number of sides and radius. +pub async fn polygon(exec_state: &mut ExecState, args: Args) -> Result { + let (data, sketch_surface_or_group, tag): (PolygonData, SketchOrSurface, Option) = + args.get_polygon_args()?; + + let sketch = inner_polygon(data, sketch_surface_or_group, tag, exec_state, args).await?; + Ok(KclValue::Sketch { + value: Box::new(sketch), + }) +} + +/// Create a regular polygon with the specified number of sides that is either inscribed or circumscribed around a circle of the specified radius. +/// +/// ```no_run +/// // Create a regular hexagon inscribed in a circle of radius 10 +/// hex = startSketchOn('XY') +/// |> polygon({ +/// radius = 10, +/// numSides = 6, +/// center = [0, 0], +/// inscribed = true, +/// }, %) +/// +/// example = extrude(5, hex) +/// ``` +/// +/// ```no_run +/// // Create a square circumscribed around a circle of radius 5 +/// square = startSketchOn('XY') +/// |> polygon({ +/// radius = 5.0, +/// numSides = 4, +/// center = [10, 10], +/// inscribed = false, +/// }, %) +/// example = extrude(5, square) +/// ``` +#[stdlib { + name = "polygon", +}] +async fn inner_polygon( + data: PolygonData, + sketch_surface_or_group: SketchOrSurface, + tag: Option, + exec_state: &mut ExecState, + args: Args, +) -> Result { + if data.num_sides < 3 { + return Err(KclError::Type(KclErrorDetails { + message: "Polygon must have at least 3 sides".to_string(), + source_ranges: vec![args.source_range], + })); + } + + if data.radius <= 0.0 { + return Err(KclError::Type(KclErrorDetails { + message: "Radius must be greater than 0".to_string(), + source_ranges: vec![args.source_range], + })); + } + + let sketch_surface = match sketch_surface_or_group { + SketchOrSurface::SketchSurface(surface) => surface, + SketchOrSurface::Sketch(group) => group.on, + }; + + let half_angle = std::f64::consts::PI / data.num_sides as f64; + + let radius_to_vertices = match data.polygon_type { + PolygonType::Inscribed => data.radius, + PolygonType::Circumscribed => data.radius / half_angle.cos(), + }; + + let angle_step = 2.0 * std::f64::consts::PI / data.num_sides as f64; + + let vertices: Vec<[f64; 2]> = (0..data.num_sides) + .map(|i| { + let angle = angle_step * i as f64; + [ + data.center[0] + radius_to_vertices * angle.cos(), + data.center[1] + radius_to_vertices * angle.sin(), + ] + }) + .collect(); + + let mut sketch = + crate::std::sketch::inner_start_profile_at(vertices[0], sketch_surface, None, exec_state, args.clone()).await?; + + // Draw all the lines with unique IDs and modified tags + for vertex in vertices.iter().skip(1) { + let from = sketch.current_pen_position()?; + let id = exec_state.next_uuid(); + + args.batch_modeling_cmd( + id, + ModelingCmd::from(mcmd::ExtendPath { + path: sketch.id.into(), + segment: PathSegment::Line { + end: KPoint2d::from(*vertex).with_z(0.0).map(LengthUnit), + relative: false, + }, + }), + ) + .await?; + + let current_path = Path::ToPoint { + base: BasePath { + from: from.into(), + to: *vertex, + tag: tag.clone(), + geo_meta: GeoMeta { + id, + metadata: args.source_range.into(), + }, + }, + }; + + if let Some(tag) = &tag { + sketch.add_tag(tag, ¤t_path); + } + + sketch.paths.push(current_path); + } + + // Close the polygon by connecting back to the first vertex with a new ID + let from = sketch.current_pen_position()?; + let close_id = exec_state.next_uuid(); + + args.batch_modeling_cmd( + close_id, + ModelingCmd::from(mcmd::ExtendPath { + path: sketch.id.into(), + segment: PathSegment::Line { + end: KPoint2d::from(vertices[0]).with_z(0.0).map(LengthUnit), + relative: false, + }, + }), + ) + .await?; + + let current_path = Path::ToPoint { + base: BasePath { + from: from.into(), + to: vertices[0], + tag: tag.clone(), + geo_meta: GeoMeta { + id: close_id, + metadata: args.source_range.into(), + }, + }, + }; + + if let Some(tag) = &tag { + sketch.add_tag(tag, ¤t_path); + } + + sketch.paths.push(current_path); + + args.batch_modeling_cmd( + exec_state.next_uuid(), + ModelingCmd::from(mcmd::ClosePath { path_id: sketch.id }), + ) + .await?; + + Ok(sketch) +} diff --git a/src/wasm-lib/kcl/src/std/shell.rs b/src/wasm-lib/kcl/src/std/shell.rs index 16162beb2..68762ed43 100644 --- a/src/wasm-lib/kcl/src/std/shell.rs +++ b/src/wasm-lib/kcl/src/std/shell.rs @@ -9,7 +9,7 @@ use serde::{Deserialize, Serialize}; use crate::{ errors::{KclError, KclErrorDetails}, - executor::{ExecState, KclValue, Solid, SolidSet}, + execution::{ExecState, KclValue, Solid, SolidSet}, std::{sketch::FaceTag, Args}, }; @@ -38,7 +38,7 @@ pub async fn shell(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([-12, 12], %) /// |> line([24, 0], %) /// |> line([0, -24], %) @@ -48,14 +48,14 @@ pub async fn shell(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([-12, 12], %) /// |> line([24, 0], %) /// |> line([0, -24], %) @@ -65,14 +65,14 @@ pub async fn shell(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([-12, 12], %) /// |> line([24, 0], %) /// |> line([0, -24], %) @@ -82,14 +82,14 @@ pub async fn shell(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([-12, 12], %) /// |> line([24, 0], %) /// |> line([0, -24], %) @@ -99,15 +99,15 @@ pub async fn shell(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([-size, -size], %) /// |> line([2 * size, 0], %) /// |> line([0, 2 * size], %) @@ -115,22 +115,22 @@ pub async fn shell(exec_state: &mut ExecState, args: Args) -> Result close(%) /// |> extrude(65, %) /// -/// const thing1 = startSketchOn(case, 'end') -/// |> circle({ center: [-size / 2, -size / 2], radius: 25 }, %) +/// thing1 = startSketchOn(case, 'end') +/// |> circle({ center = [-size / 2, -size / 2], radius = 25 }, %) /// |> extrude(50, %) /// -/// const thing2 = startSketchOn(case, 'end') -/// |> circle({ center: [size / 2, -size / 2], radius: 25 }, %) +/// thing2 = startSketchOn(case, 'end') +/// |> circle({ center = [size / 2, -size / 2], radius = 25 }, %) /// |> extrude(50, %) /// /// // We put "case" in the shell function to shell the entire object. -/// shell({ faces: ['start'], thickness: 5 }, case) +/// shell({ faces = ['start'], thickness = 5 }, case) /// ``` /// /// ```no_run /// // Shell a sketch on face object on the end face. -/// let size = 100 -/// const case = startSketchOn('XY') +/// size = 100 +/// case = startSketchOn('XY') /// |> startProfileAt([-size, -size], %) /// |> line([2 * size, 0], %) /// |> line([0, 2 * size], %) @@ -138,24 +138,24 @@ pub async fn shell(exec_state: &mut ExecState, args: Args) -> Result close(%) /// |> extrude(65, %) /// -/// const thing1 = startSketchOn(case, 'end') -/// |> circle({ center: [-size / 2, -size / 2], radius: 25 }, %) +/// thing1 = startSketchOn(case, 'end') +/// |> circle({ center = [-size / 2, -size / 2], radius = 25 }, %) /// |> extrude(50, %) /// -/// const thing2 = startSketchOn(case, 'end') -/// |> circle({ center: [size / 2, -size / 2], radius: 25 }, %) +/// thing2 = startSketchOn(case, 'end') +/// |> circle({ center = [size / 2, -size / 2], radius = 25 }, %) /// |> extrude(50, %) /// /// // We put "thing1" in the shell function to shell the end face of the object. -/// shell({ faces: ['end'], thickness: 5 }, thing1) +/// shell({ faces = ['end'], thickness = 5 }, thing1) /// ``` /// /// ```no_run /// // Shell sketched on face objects on the end face, include all sketches to shell /// // the entire object. /// -/// let size = 100 -/// const case = startSketchOn('XY') +/// size = 100 +/// case = startSketchOn('XY') /// |> startProfileAt([-size, -size], %) /// |> line([2 * size, 0], %) /// |> line([0, 2 * size], %) @@ -163,19 +163,20 @@ pub async fn shell(exec_state: &mut ExecState, args: Args) -> Result close(%) /// |> extrude(65, %) /// -/// const thing1 = startSketchOn(case, 'end') -/// |> circle({ center: [-size / 2, -size / 2], radius: 25 }, %) +/// thing1 = startSketchOn(case, 'end') +/// |> circle({ center = [-size / 2, -size / 2], radius = 25 }, %) /// |> extrude(50, %) /// -/// const thing2 = startSketchOn(case, 'end') -/// |> circle({ center: [size / 2, -size / 2], radius: 25 }, %) +/// thing2 = startSketchOn(case, 'end') +/// |> circle({ center = [size / 2, -size / 2], radius = 25 }, %) /// |> extrude(50, %) /// /// // We put "thing1" and "thing2" in the shell function to shell the end face of the object. -/// shell({ faces: ['end'], thickness: 5 }, [thing1, thing2]) +/// shell({ faces = ['end'], thickness = 5 }, [thing1, thing2]) /// ``` #[stdlib { name = "shell", + feature_tree_operation = true, }] async fn inner_shell( data: ShellData, @@ -229,7 +230,7 @@ async fn inner_shell( } args.batch_modeling_cmd( - exec_state.id_generator.next_uuid(), + exec_state.next_uuid(), ModelingCmd::from(mcmd::Solid3dShellFace { hollow: false, face_ids, @@ -257,7 +258,7 @@ pub async fn hollow(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([-12, 12], %) /// |> line([24, 0], %) /// |> line([0, -24], %) @@ -269,7 +270,7 @@ pub async fn hollow(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([-12, 12], %) /// |> line([24, 0], %) /// |> line([0, -24], %) @@ -281,8 +282,8 @@ pub async fn hollow(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([-size, -size], %) /// |> line([2 * size, 0], %) /// |> line([0, 2 * size], %) @@ -290,18 +291,19 @@ pub async fn hollow(exec_state: &mut ExecState, args: Args) -> Result close(%) /// |> extrude(65, %) /// -/// const thing1 = startSketchOn(case, 'end') -/// |> circle({ center: [-size / 2, -size / 2], radius: 25 }, %) +/// thing1 = startSketchOn(case, 'end') +/// |> circle({ center = [-size / 2, -size / 2], radius = 25 }, %) /// |> extrude(50, %) /// -/// const thing2 = startSketchOn(case, 'end') -/// |> circle({ center: [size / 2, -size / 2], radius: 25 }, %) +/// thing2 = startSketchOn(case, 'end') +/// |> circle({ center = [size / 2, -size / 2], radius = 25 }, %) /// |> extrude(50, %) /// /// hollow(0.5, case) /// ``` #[stdlib { name = "hollow", + feature_tree_operation = true, }] async fn inner_hollow( thickness: f64, @@ -314,7 +316,7 @@ async fn inner_hollow( args.flush_batch_for_solid_set(exec_state, solid.clone().into()).await?; args.batch_modeling_cmd( - exec_state.id_generator.next_uuid(), + exec_state.next_uuid(), ModelingCmd::from(mcmd::Solid3dShellFace { hollow: true, face_ids: Vec::new(), // This is empty because we want to hollow the entire object. diff --git a/src/wasm-lib/kcl/src/std/sketch.rs b/src/wasm-lib/kcl/src/std/sketch.rs index b6bc9d9c1..3f7f0fd42 100644 --- a/src/wasm-lib/kcl/src/std/sketch.rs +++ b/src/wasm-lib/kcl/src/std/sketch.rs @@ -1,9 +1,8 @@ //! Functions related to sketching. -use std::collections::HashMap; - use anyhow::Result; use derive_docs::stdlib; +use indexmap::IndexMap; use kcmc::shared::Point2d as KPoint2d; // Point2d is already defined in this pkg, to impl ts_rs traits. use kcmc::{each_cmd as mcmd, length_unit::LengthUnit, shared::Angle, ModelingCmd}; use kittycad_modeling_cmds as kcmc; @@ -13,16 +12,16 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use crate::{ - ast::types::TagDeclarator, errors::{KclError, KclErrorDetails}, - executor::{ + execution::{ BasePath, ExecState, Face, GeoMeta, KclValue, Path, Plane, Point2d, Point3d, Sketch, SketchSet, SketchSurface, - Solid, TagEngineInfo, TagIdentifier, UserVal, + Solid, TagEngineInfo, TagIdentifier, }, + parsing::ast::types::TagNode, std::{ utils::{ - arc_angles, arc_center_and_end, get_tangent_point_from_previous_arc, get_tangential_arc_to_info, - get_x_component, get_y_component, intersection_with_parallel_line, TangentialArcInfoInput, + arc_angles, arc_center_and_end, calculate_circle_center, get_tangential_arc_to_info, get_x_component, + get_y_component, intersection_with_parallel_line, TangentialArcInfoInput, }, Args, }, @@ -94,23 +93,25 @@ pub enum StartOrEnd { /// Draw a line to a point. pub async fn line_to(exec_state: &mut ExecState, args: Args) -> Result { - let (to, sketch, tag): ([f64; 2], Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (to, sketch, tag): ([f64; 2], Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_line_to(to, sketch, tag, exec_state, args).await?; - Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) + Ok(KclValue::Sketch { + value: Box::new(new_sketch), + }) } /// Draw a line from the current origin to some absolute (x, y) point. /// /// ```no_run -/// const exampleSketch = startSketchOn("XZ") +/// exampleSketch = startSketchOn("XZ") /// |> startProfileAt([0, 0], %) /// |> lineTo([10, 0], %) /// |> lineTo([0, 10], %) /// |> lineTo([-10, 0], %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "lineTo", @@ -118,12 +119,12 @@ pub async fn line_to(exec_state: &mut ExecState, args: Args) -> Result, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { let from = sketch.current_pen_position()?; - let id = exec_state.id_generator.next_uuid(); + let id = exec_state.next_uuid(); args.batch_modeling_cmd( id, @@ -161,10 +162,12 @@ async fn inner_line_to( /// Draw a line to a point on the x-axis. pub async fn x_line_to(exec_state: &mut ExecState, args: Args) -> Result { - let (to, sketch, tag): (f64, Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (to, sketch, tag): (f64, Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_x_line_to(to, sketch, tag, exec_state, args).await?; - Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) + Ok(KclValue::Sketch { + value: Box::new(new_sketch), + }) } /// Draw a line parallel to the X axis, that ends at the given X. @@ -172,23 +175,23 @@ pub async fn x_line_to(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> xLineTo(15, %) /// |> angledLine({ -/// angle: 80, -/// length: 15, +/// angle = 80, +/// length = 15, /// }, %) /// |> line([8, -10], %) /// |> xLineTo(40, %) /// |> angledLine({ -/// angle: 135, -/// length: 30, +/// angle = 135, +/// length = 30, /// }, %) /// |> xLineTo(10, %) /// |> close(%) /// -/// const example = extrude(10, exampleSketch) +/// example = extrude(10, exampleSketch) /// ``` #[stdlib { name = "xLineTo", @@ -196,7 +199,7 @@ pub async fn x_line_to(exec_state: &mut ExecState, args: Args) -> Result, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -209,10 +212,12 @@ async fn inner_x_line_to( /// Draw a line to a point on the y-axis. pub async fn y_line_to(exec_state: &mut ExecState, args: Args) -> Result { - let (to, sketch, tag): (f64, Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (to, sketch, tag): (f64, Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_y_line_to(to, sketch, tag, exec_state, args).await?; - Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) + Ok(KclValue::Sketch { + value: Box::new(new_sketch), + }) } /// Draw a line parallel to the Y axis, that ends at the given Y. @@ -220,16 +225,16 @@ pub async fn y_line_to(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> angledLine({ -/// angle: 50, -/// length: 45, +/// angle = 50, +/// length = 45, /// }, %) /// |> yLineTo(0, %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "yLineTo", @@ -237,7 +242,7 @@ pub async fn y_line_to(exec_state: &mut ExecState, args: Args) -> Result, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -249,35 +254,37 @@ async fn inner_y_line_to( /// Draw a line. pub async fn line(exec_state: &mut ExecState, args: Args) -> Result { - let (delta, sketch, tag): ([f64; 2], Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (delta, sketch, tag): ([f64; 2], Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_line(delta, sketch, tag, exec_state, args).await?; - Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) + Ok(KclValue::Sketch { + value: Box::new(new_sketch), + }) } /// Draw a line relative to the current origin to a specified (x, y) away /// from the current position. /// /// ```no_run -/// const exampleSketch = startSketchOn("XZ") +/// exampleSketch = startSketchOn("XZ") /// |> startProfileAt([0, 0], %) /// |> line([25, 15], %) /// |> line([5, -6], %) /// |> line([-10, -10], %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` /// /// ```no_run -/// const exampleSketch = startSketchOn("XZ") +/// exampleSketch = startSketchOn("XZ") /// |> startProfileAt([0, 0], %) /// |> line([10, 0], %) /// |> line([0, 10], %) /// |> line([-10, 0], %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "line", @@ -285,14 +292,14 @@ pub async fn line(exec_state: &mut ExecState, args: Args) -> Result, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { let from = sketch.current_pen_position()?; let to = [from.x + delta[0], from.y + delta[1]]; - let id = exec_state.id_generator.next_uuid(); + let id = exec_state.next_uuid(); args.batch_modeling_cmd( id, @@ -330,33 +337,35 @@ async fn inner_line( /// Draw a line on the x-axis. pub async fn x_line(exec_state: &mut ExecState, args: Args) -> Result { - let (length, sketch, tag): (f64, Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (length, sketch, tag): (f64, Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_x_line(length, sketch, tag, exec_state, args).await?; - Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) + Ok(KclValue::Sketch { + value: Box::new(new_sketch), + }) } /// Draw a line relative to the current origin to a specified distance away /// from the current position along the 'x' axis. /// /// ```no_run -/// const exampleSketch = startSketchOn('XZ') +/// exampleSketch = startSketchOn('XZ') /// |> startProfileAt([0, 0], %) /// |> xLine(15, %) /// |> angledLine({ -/// angle: 80, -/// length: 15, +/// angle = 80, +/// length = 15, /// }, %) /// |> line([8, -10], %) /// |> xLine(10, %) /// |> angledLine({ -/// angle: 120, -/// length: 30, +/// angle = 120, +/// length = 30, /// }, %) /// |> xLine(-15, %) /// |> close(%) /// -/// const example = extrude(10, exampleSketch) +/// example = extrude(10, exampleSketch) /// ``` #[stdlib { name = "xLine", @@ -364,7 +373,7 @@ pub async fn x_line(exec_state: &mut ExecState, args: Args) -> Result, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -373,28 +382,30 @@ async fn inner_x_line( /// Draw a line on the y-axis. pub async fn y_line(exec_state: &mut ExecState, args: Args) -> Result { - let (length, sketch, tag): (f64, Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (length, sketch, tag): (f64, Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_y_line(length, sketch, tag, exec_state, args).await?; - Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) + Ok(KclValue::Sketch { + value: Box::new(new_sketch), + }) } /// Draw a line relative to the current origin to a specified distance away /// from the current position along the 'y' axis. /// /// ```no_run -/// const exampleSketch = startSketchOn('XZ') +/// exampleSketch = startSketchOn('XZ') /// |> startProfileAt([0, 0], %) /// |> yLine(15, %) /// |> angledLine({ -/// angle: 30, -/// length: 15, +/// angle = 30, +/// length = 15, /// }, %) /// |> line([8, -10], %) /// |> yLine(-5, %) /// |> close(%) /// -/// const example = extrude(10, exampleSketch) +/// example = extrude(10, exampleSketch) /// ``` #[stdlib { name = "yLine", @@ -402,7 +413,7 @@ pub async fn y_line(exec_state: &mut ExecState, args: Args) -> Result, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -427,28 +438,30 @@ pub enum AngledLineData { /// Draw an angled line. pub async fn angled_line(exec_state: &mut ExecState, args: Args) -> Result { - let (data, sketch, tag): (AngledLineData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (data, sketch, tag): (AngledLineData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_angled_line(data, sketch, tag, exec_state, args).await?; - Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) + Ok(KclValue::Sketch { + value: Box::new(new_sketch), + }) } /// Draw a line segment relative to the current origin using the polar /// measure of some angle and distance. /// /// ```no_run -/// const exampleSketch = startSketchOn('XZ') +/// exampleSketch = startSketchOn('XZ') /// |> startProfileAt([0, 0], %) /// |> yLineTo(15, %) /// |> angledLine({ -/// angle: 30, -/// length: 15, +/// angle = 30, +/// length = 15, /// }, %) /// |> line([8, -10], %) /// |> yLineTo(0, %) /// |> close(%) /// -/// const example = extrude(10, exampleSketch) +/// example = extrude(10, exampleSketch) /// ``` #[stdlib { name = "angledLine", @@ -456,7 +469,7 @@ pub async fn angled_line(exec_state: &mut ExecState, args: Args) -> Result, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -475,7 +488,7 @@ async fn inner_angled_line( let to: [f64; 2] = [from.x + delta[0], from.y + delta[1]]; - let id = exec_state.id_generator.next_uuid(); + let id = exec_state.next_uuid(); args.batch_modeling_cmd( id, @@ -512,24 +525,26 @@ async fn inner_angled_line( /// Draw an angled line of a given x length. pub async fn angled_line_of_x_length(exec_state: &mut ExecState, args: Args) -> Result { - let (data, sketch, tag): (AngledLineData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (data, sketch, tag): (AngledLineData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_angled_line_of_x_length(data, sketch, tag, exec_state, args).await?; - Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) + Ok(KclValue::Sketch { + value: Box::new(new_sketch), + }) } /// Create a line segment from the current 2-dimensional sketch origin /// along some angle (in degrees) for some relative length in the 'x' dimension. /// /// ```no_run -/// const sketch001 = startSketchOn('XZ') +/// sketch001 = startSketchOn('XZ') /// |> startProfileAt([0, 0], %) -/// |> angledLineOfXLength({ angle: 45, length: 10 }, %, $edge1) -/// |> angledLineOfXLength({ angle: -15, length: 20 }, %, $edge2) +/// |> angledLineOfXLength({ angle = 45, length = 10 }, %, $edge1) +/// |> angledLineOfXLength({ angle = -15, length = 20 }, %, $edge2) /// |> line([0, -5], %) /// |> close(%, $edge3) /// -/// const extrusion = extrude(10, sketch001) +/// extrusion = extrude(10, sketch001) /// ``` #[stdlib { name = "angledLineOfXLength", @@ -537,7 +552,7 @@ pub async fn angled_line_of_x_length(exec_state: &mut ExecState, args: Args) -> async fn inner_angled_line_of_x_length( data: AngledLineData, sketch: Sketch, - tag: Option, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -573,17 +588,19 @@ async fn inner_angled_line_of_x_length( #[serde(rename_all = "camelCase")] pub struct AngledLineToData { /// The angle of the line. - angle: f64, + pub angle: f64, /// The point to draw to. - to: f64, + pub to: f64, } /// Draw an angled line to a given x coordinate. pub async fn angled_line_to_x(exec_state: &mut ExecState, args: Args) -> Result { - let (data, sketch, tag): (AngledLineToData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (data, sketch, tag): (AngledLineToData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_angled_line_to_x(data, sketch, tag, exec_state, args).await?; - Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) + Ok(KclValue::Sketch { + value: Box::new(new_sketch), + }) } /// Create a line segment from the current 2-dimensional sketch origin @@ -591,14 +608,14 @@ pub async fn angled_line_to_x(exec_state: &mut ExecState, args: Args) -> Result< /// in the 'x' dimension. /// /// ```no_run -/// const exampleSketch = startSketchOn('XZ') +/// exampleSketch = startSketchOn('XZ') /// |> startProfileAt([0, 0], %) -/// |> angledLineToX({ angle: 30, to: 10 }, %) +/// |> angledLineToX({ angle = 30, to = 10 }, %) /// |> line([0, 10], %) /// |> line([-10, 0], %) /// |> close(%) /// -/// const example = extrude(10, exampleSketch) +/// example = extrude(10, exampleSketch) /// ``` #[stdlib { name = "angledLineToX", @@ -606,7 +623,7 @@ pub async fn angled_line_to_x(exec_state: &mut ExecState, args: Args) -> Result< async fn inner_angled_line_to_x( data: AngledLineToData, sketch: Sketch, - tag: Option, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -637,27 +654,29 @@ async fn inner_angled_line_to_x( /// Draw an angled line of a given y length. pub async fn angled_line_of_y_length(exec_state: &mut ExecState, args: Args) -> Result { - let (data, sketch, tag): (AngledLineData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (data, sketch, tag): (AngledLineData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_angled_line_of_y_length(data, sketch, tag, exec_state, args).await?; - Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) + Ok(KclValue::Sketch { + value: Box::new(new_sketch), + }) } /// Create a line segment from the current 2-dimensional sketch origin /// along some angle (in degrees) for some relative length in the 'y' dimension. /// /// ```no_run -/// const exampleSketch = startSketchOn('XZ') +/// exampleSketch = startSketchOn('XZ') /// |> startProfileAt([0, 0], %) /// |> line([10, 0], %) -/// |> angledLineOfYLength({ angle: 45, length: 10 }, %) +/// |> angledLineOfYLength({ angle = 45, length = 10 }, %) /// |> line([0, 10], %) -/// |> angledLineOfYLength({ angle: 135, length: 10 }, %) +/// |> angledLineOfYLength({ angle = 135, length = 10 }, %) /// |> line([-10, 0], %) /// |> line([0, -30], %) /// -/// const example = extrude(10, exampleSketch) +/// example = extrude(10, exampleSketch) /// ``` #[stdlib { name = "angledLineOfYLength", @@ -665,7 +684,7 @@ pub async fn angled_line_of_y_length(exec_state: &mut ExecState, args: Args) -> async fn inner_angled_line_of_y_length( data: AngledLineData, sketch: Sketch, - tag: Option, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -697,10 +716,12 @@ async fn inner_angled_line_of_y_length( /// Draw an angled line to a given y coordinate. pub async fn angled_line_to_y(exec_state: &mut ExecState, args: Args) -> Result { - let (data, sketch, tag): (AngledLineToData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (data, sketch, tag): (AngledLineToData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_angled_line_to_y(data, sketch, tag, exec_state, args).await?; - Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) + Ok(KclValue::Sketch { + value: Box::new(new_sketch), + }) } /// Create a line segment from the current 2-dimensional sketch origin @@ -708,14 +729,14 @@ pub async fn angled_line_to_y(exec_state: &mut ExecState, args: Args) -> Result< /// in the 'y' dimension. /// /// ```no_run -/// const exampleSketch = startSketchOn('XZ') +/// exampleSketch = startSketchOn('XZ') /// |> startProfileAt([0, 0], %) -/// |> angledLineToY({ angle: 60, to: 20 }, %) +/// |> angledLineToY({ angle = 60, to = 20 }, %) /// |> line([-20, 0], %) -/// |> angledLineToY({ angle: 70, to: 10 }, %) +/// |> angledLineToY({ angle = 70, to = 10 }, %) /// |> close(%) /// -/// const example = extrude(10, exampleSketch) +/// example = extrude(10, exampleSketch) /// ``` #[stdlib { name = "angledLineToY", @@ -723,7 +744,7 @@ pub async fn angled_line_to_y(exec_state: &mut ExecState, args: Args) -> Result< async fn inner_angled_line_to_y( data: AngledLineToData, sketch: Sketch, - tag: Option, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -768,10 +789,12 @@ pub struct AngledLineThatIntersectsData { /// Draw an angled line that intersects with a given line. pub async fn angled_line_that_intersects(exec_state: &mut ExecState, args: Args) -> Result { - let (data, sketch, tag): (AngledLineThatIntersectsData, Sketch, Option) = + let (data, sketch, tag): (AngledLineThatIntersectsData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_angled_line_that_intersects(data, sketch, tag, exec_state, args).await?; - Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) + Ok(KclValue::Sketch { + value: Box::new(new_sketch), + }) } /// Draw an angled line from the current origin, constructing a line segment @@ -779,19 +802,19 @@ pub async fn angled_line_that_intersects(exec_state: &mut ExecState, args: Args) /// segment. /// /// ```no_run -/// const exampleSketch = startSketchOn('XZ') +/// exampleSketch = startSketchOn('XZ') /// |> startProfileAt([0, 0], %) /// |> lineTo([5, 10], %) /// |> lineTo([-10, 10], %, $lineToIntersect) /// |> lineTo([0, 20], %) /// |> angledLineThatIntersects({ -/// angle: 80, -/// intersectTag: lineToIntersect, -/// offset: 10 +/// angle = 80, +/// intersectTag = lineToIntersect, +/// offset = 10 /// }, %) /// |> close(%) /// -/// const example = extrude(10, exampleSketch) +/// example = extrude(10, exampleSketch) /// ``` #[stdlib { name = "angledLineThatIntersects", @@ -799,7 +822,7 @@ pub async fn angled_line_that_intersects(exec_state: &mut ExecState, args: Args) async fn inner_angled_line_that_intersects( data: AngledLineThatIntersectsData, sketch: Sketch, - tag: Option, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -828,47 +851,50 @@ pub async fn start_sketch_at(exec_state: &mut ExecState, args: Args) -> Result line([10, 0], %) /// |> line([0, 10], %) /// |> line([-10, 0], %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` /// /// ```no_run -/// const exampleSketch = startSketchAt([10, 10]) +/// exampleSketch = startSketchAt([10, 10]) /// |> line([10, 0], %) /// |> line([0, 10], %) /// |> line([-10, 0], %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` /// /// ```no_run -/// const exampleSketch = startSketchAt([-10, 23]) +/// exampleSketch = startSketchAt([-10, 23]) /// |> line([10, 0], %) /// |> line([0, 10], %) /// |> line([-10, 0], %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "startSketchAt", + deprecated = true, }] async fn inner_start_sketch_at(data: [f64; 2], exec_state: &mut ExecState, args: Args) -> Result { // Let's assume it's the XY plane for now, this is just for backwards compatibility. let xy_plane = PlaneData::XY; - let sketch_surface = inner_start_sketch_on(SketchData::Plane(xy_plane), None, exec_state, &args).await?; + let sketch_surface = inner_start_sketch_on(SketchData::PlaneOrientation(xy_plane), None, exec_state, &args).await?; let sketch = inner_start_profile_at(data, sketch_surface, None, exec_state, args).await?; Ok(sketch) } @@ -879,11 +905,12 @@ async fn inner_start_sketch_at(data: [f64; 2], exec_state: &mut ExecState, args: #[ts(export)] #[serde(rename_all = "camelCase", untagged)] pub enum SketchData { - Plane(PlaneData), + PlaneOrientation(PlaneData), + Plane(Box), Solid(Box), } -/// Data for a plane. +/// Orientation data that can be used to construct a plane, not a plane in itself. #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(rename_all = "camelCase")] @@ -911,13 +938,13 @@ pub enum PlaneData { /// Origin of the plane. origin: Box, /// What should the plane’s X axis be? - #[serde(rename = "xAxis", alias = "x_axis")] + #[serde(rename = "xAxis")] x_axis: Box, /// What should the plane’s Y axis be? - #[serde(rename = "yAxis", alias = "y_axis")] + #[serde(rename = "yAxis")] y_axis: Box, /// The z-axis (normal). - #[serde(rename = "zAxis", alias = "z_axis")] + #[serde(rename = "zAxis")] z_axis: Box, }, } @@ -935,65 +962,65 @@ pub async fn start_sketch_on(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> line([10, 0], %) /// |> line([0, 10], %) /// |> line([-10, 0], %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// -/// const exampleSketch002 = startSketchOn(example, 'end') +/// exampleSketch002 = startSketchOn(example, 'end') /// |> startProfileAt([1, 1], %) /// |> line([8, 0], %) /// |> line([0, 8], %) /// |> line([-8, 0], %) /// |> close(%) /// -/// const example002 = extrude(5, exampleSketch002) +/// example002 = extrude(5, exampleSketch002) /// -/// const exampleSketch003 = startSketchOn(example002, 'end') +/// exampleSketch003 = startSketchOn(example002, 'end') /// |> startProfileAt([2, 2], %) /// |> line([6, 0], %) /// |> line([0, 6], %) /// |> line([-6, 0], %) /// |> close(%) /// -/// const example003 = extrude(5, exampleSketch003) +/// example003 = extrude(5, exampleSketch003) /// ``` /// /// ```no_run -/// const exampleSketch = startSketchOn("XY") +/// exampleSketch = startSketchOn("XY") /// |> startProfileAt([0, 0], %) /// |> line([10, 0], %) /// |> line([0, 10], %, $sketchingFace) /// |> line([-10, 0], %) /// |> close(%) /// -/// const example = extrude(10, exampleSketch) +/// example = extrude(10, exampleSketch) /// -/// const exampleSketch002 = startSketchOn(example, sketchingFace) +/// exampleSketch002 = startSketchOn(example, sketchingFace) /// |> startProfileAt([1, 1], %) /// |> line([8, 0], %) /// |> line([0, 8], %) /// |> line([-8, 0], %) /// |> close(%, $sketchingFace002) /// -/// const example002 = extrude(10, exampleSketch002) +/// example002 = extrude(10, exampleSketch002) /// -/// const exampleSketch003 = startSketchOn(example002, sketchingFace002) +/// exampleSketch003 = startSketchOn(example002, sketchingFace002) /// |> startProfileAt([-8, 12], %) /// |> line([0, 6], %) /// |> line([6, 0], %) /// |> line([0, -6], %) /// |> close(%) /// -/// const example003 = extrude(5, exampleSketch003) +/// example003 = extrude(5, exampleSketch003) /// ``` /// /// ```no_run -/// const exampleSketch = startSketchOn('XY') +/// exampleSketch = startSketchOn('XY') /// |> startProfileAt([4, 12], %) /// |> line([2, 0], %) /// |> line([0, -6], %) @@ -1004,25 +1031,25 @@ pub async fn start_sketch_on(exec_state: &mut ExecState, args: Args) -> Result line([-2, 0], %) /// |> close(%) /// -/// const example = revolve({ axis: 'y', angle: 180 }, exampleSketch) +/// example = revolve({ axis: 'y', angle: 180 }, exampleSketch) /// -/// const exampleSketch002 = startSketchOn(example, 'end') +/// exampleSketch002 = startSketchOn(example, 'end') /// |> startProfileAt([4.5, -5], %) /// |> line([0, 5], %) /// |> line([5, 0], %) /// |> line([0, -5], %) /// |> close(%) /// -/// const example002 = extrude(5, exampleSketch002) +/// example002 = extrude(5, exampleSketch002) /// ``` /// /// ```no_run -/// const a1 = startSketchOn({ +/// a1 = startSketchOn({ /// plane: { -/// origin: { x: 0, y: 0, z: 0 }, -/// xAxis: { x: 1, y: 0, z: 0 }, -/// yAxis: { x: 0, y: 1, z: 0 }, -/// zAxis: { x: 0, y: 0, z: 1 } +/// origin = { x = 0, y = 0, z = 0 }, +/// xAxis = { x = 1, y = 0, z = 0 }, +/// yAxis = { x = 0, y = 1, z = 0 }, +/// zAxis = { x = 0, y = 0, z = 1 } /// } /// }) /// |> startProfileAt([0, 0], %) @@ -1035,6 +1062,7 @@ pub async fn start_sketch_on(exec_state: &mut ExecState, args: Args) -> Result Result { match data { - SketchData::Plane(plane_data) => { - let plane = start_sketch_on_plane(plane_data, exec_state, args).await?; + SketchData::PlaneOrientation(plane_data) => { + let plane = make_sketch_plane_from_orientation(plane_data, exec_state, args).await?; Ok(SketchSurface::Plane(plane)) } + SketchData::Plane(plane) => Ok(SketchSurface::Plane(plane)), SketchData::Solid(solid) => { let Some(tag) = tag else { return Err(KclError::Type(KclErrorDetails { @@ -1080,97 +1109,106 @@ async fn start_sketch_on_face( })) } -async fn start_sketch_on_plane( +async fn make_sketch_plane_from_orientation( data: PlaneData, exec_state: &mut ExecState, args: &Args, ) -> Result, KclError> { - let mut plane = Plane::from_plane_data(data.clone(), exec_state); + let plane = Plane::from_plane_data(data.clone(), exec_state); - // Get the default planes. - let default_planes = args - .ctx - .engine - .default_planes(&mut exec_state.id_generator, args.source_range) - .await?; - - plane.id = match data { - PlaneData::XY => default_planes.xy, - PlaneData::XZ => default_planes.xz, - PlaneData::YZ => default_planes.yz, - PlaneData::NegXY => default_planes.neg_xy, - PlaneData::NegXZ => default_planes.neg_xz, - PlaneData::NegYZ => default_planes.neg_yz, + // Create the plane on the fly. + let clobber = false; + let size = LengthUnit(60.0); + let hide = Some(true); + match data { + PlaneData::XY | PlaneData::NegXY | PlaneData::XZ | PlaneData::NegXZ | PlaneData::YZ | PlaneData::NegYZ => { + let x_axis = match data { + PlaneData::NegXY => Point3d::new(-1.0, 0.0, 0.0), + PlaneData::NegXZ => Point3d::new(-1.0, 0.0, 0.0), + PlaneData::NegYZ => Point3d::new(0.0, -1.0, 0.0), + _ => plane.x_axis, + }; + args.batch_modeling_cmd( + plane.id, + ModelingCmd::from(mcmd::MakePlane { + clobber, + origin: plane.origin.into(), + size, + x_axis: x_axis.into(), + y_axis: plane.y_axis.into(), + hide, + }), + ) + .await?; + } PlaneData::Plane { origin, x_axis, y_axis, z_axis: _, } => { - // Create the custom plane on the fly. - let id = exec_state.id_generator.next_uuid(); args.batch_modeling_cmd( - id, + plane.id, ModelingCmd::from(mcmd::MakePlane { - clobber: false, + clobber, origin: (*origin).into(), - size: LengthUnit(60.0), + size, x_axis: (*x_axis).into(), y_axis: (*y_axis).into(), - hide: Some(true), + hide, }), ) .await?; - - id } - }; + } Ok(Box::new(plane)) } /// Start a new profile at a given point. pub async fn start_profile_at(exec_state: &mut ExecState, args: Args) -> Result { - let (start, sketch_surface, tag): ([f64; 2], SketchSurface, Option) = + let (start, sketch_surface, tag): ([f64; 2], SketchSurface, Option) = args.get_data_and_sketch_surface()?; let sketch = inner_start_profile_at(start, sketch_surface, tag, exec_state, args).await?; - Ok(KclValue::new_user_val(sketch.meta.clone(), sketch)) + Ok(KclValue::Sketch { + value: Box::new(sketch), + }) } /// Start a new profile at a given point. /// /// ```no_run -/// const exampleSketch = startSketchOn('XZ') +/// exampleSketch = startSketchOn('XZ') /// |> startProfileAt([0, 0], %) /// |> line([10, 0], %) /// |> line([0, 10], %) /// |> line([-10, 0], %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` /// /// ```no_run -/// const exampleSketch = startSketchOn('-XZ') +/// exampleSketch = startSketchOn('-XZ') /// |> startProfileAt([10, 10], %) /// |> line([10, 0], %) /// |> line([0, 10], %) /// |> line([-10, 0], %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` /// /// ```no_run -/// const exampleSketch = startSketchOn('-XZ') +/// exampleSketch = startSketchOn('-XZ') /// |> startProfileAt([-10, 23], %) /// |> line([10, 0], %) /// |> line([0, 10], %) /// |> line([-10, 0], %) /// |> close(%) /// -/// const example = extrude(5, exampleSketch) +/// example = extrude(5, exampleSketch) /// ``` #[stdlib { name = "startProfileAt", @@ -1178,20 +1216,35 @@ pub async fn start_profile_at(exec_state: &mut ExecState, args: Args) -> Result< pub(crate) async fn inner_start_profile_at( to: [f64; 2], sketch_surface: SketchSurface, - tag: Option, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { - if let SketchSurface::Face(face) = &sketch_surface { - // Flush the batch for our fillets/chamfers if there are any. - // If we do not do these for sketch on face, things will fail with face does not exist. - args.flush_batch_for_solid_set(exec_state, face.solid.clone().into()) + match &sketch_surface { + SketchSurface::Face(face) => { + // Flush the batch for our fillets/chamfers if there are any. + // If we do not do these for sketch on face, things will fail with face does not exist. + args.flush_batch_for_solid_set(exec_state, face.solid.clone().into()) + .await?; + } + SketchSurface::Plane(plane) if !plane.is_standard() => { + // Hide whatever plane we are sketching on. + // This is especially helpful for offset planes, which would be visible otherwise. + args.batch_end_cmd( + exec_state.next_uuid(), + ModelingCmd::from(mcmd::ObjectVisible { + object_id: plane.id, + hidden: true, + }), + ) .await?; + } + _ => {} } // Enter sketch mode on the surface. // We call this here so you can reuse the sketch surface for multiple sketches. - let id = exec_state.id_generator.next_uuid(); + let id = exec_state.next_uuid(); args.batch_modeling_cmd( id, ModelingCmd::from(mcmd::EnableSketchMode { @@ -1209,8 +1262,8 @@ pub(crate) async fn inner_start_profile_at( ) .await?; - let id = exec_state.id_generator.next_uuid(); - let path_id = exec_state.id_generator.next_uuid(); + let id = exec_state.next_uuid(); + let path_id = exec_state.next_uuid(); args.batch_modeling_cmd(path_id, ModelingCmd::from(mcmd::StartPath {})) .await?; @@ -1249,7 +1302,7 @@ pub(crate) async fn inner_start_profile_at( }), surface: None, }); - HashMap::from([(tag.name.to_string(), tag_identifier)]) + IndexMap::from([(tag.name.to_string(), tag_identifier)]) } else { Default::default() }, @@ -1262,18 +1315,18 @@ pub(crate) async fn inner_start_profile_at( pub async fn profile_start_x(_exec_state: &mut ExecState, args: Args) -> Result { let sketch: Sketch = args.get_sketch()?; let x = inner_profile_start_x(sketch)?; - args.make_user_val_from_f64(x) + Ok(args.make_user_val_from_f64(x)) } /// Extract the provided 2-dimensional sketch's profile's origin's 'x' /// value. /// /// ```no_run -/// const sketch001 = startSketchOn('XY') +/// sketch001 = startSketchOn('XY') /// |> startProfileAt([5, 2], %) /// |> angledLine([-26.6, 50], %) /// |> angledLine([90, 50], %) -/// |> angledLineToX({ angle: 30, to: profileStartX(%) }, %) +/// |> angledLineToX({ angle = 30, to = profileStartX(%) }, %) /// ``` #[stdlib { name = "profileStartX" @@ -1286,17 +1339,17 @@ pub(crate) fn inner_profile_start_x(sketch: Sketch) -> Result { pub async fn profile_start_y(_exec_state: &mut ExecState, args: Args) -> Result { let sketch: Sketch = args.get_sketch()?; let x = inner_profile_start_y(sketch)?; - args.make_user_val_from_f64(x) + Ok(args.make_user_val_from_f64(x)) } /// Extract the provided 2-dimensional sketch's profile's origin's 'y' /// value. /// /// ```no_run -/// const sketch001 = startSketchOn('XY') +/// sketch001 = startSketchOn('XY') /// |> startProfileAt([5, 2], %) -/// |> angledLine({ angle: -60, length: 14 }, %) -/// |> angledLineToY({ angle: 30, to: profileStartY(%) }, %) +/// |> angledLine({ angle = -60, length = 14 }, %) +/// |> angledLineToY({ angle = 30, to = profileStartY(%) }, %) /// ``` #[stdlib { name = "profileStartY" @@ -1309,25 +1362,17 @@ pub(crate) fn inner_profile_start_y(sketch: Sketch) -> Result { pub async fn profile_start(_exec_state: &mut ExecState, args: Args) -> Result { let sketch: Sketch = args.get_sketch()?; let point = inner_profile_start(sketch)?; - Ok(KclValue::UserVal(UserVal { - value: serde_json::to_value(point).map_err(|e| { - KclError::Type(KclErrorDetails { - message: format!("Failed to convert point to json: {}", e), - source_ranges: vec![args.source_range], - }) - })?, - meta: Default::default(), - })) + Ok(KclValue::from_point2d(point, args.into())) } /// Extract the provided 2-dimensional sketch's profile's origin /// value. /// /// ```no_run -/// const sketch001 = startSketchOn('XY') +/// sketch001 = startSketchOn('XY') /// |> startProfileAt([5, 2], %) -/// |> angledLine({ angle: 120, length: 50 }, %, $seg01) -/// |> angledLine({ angle: segAng(seg01) + 120, length: 50 }, %) +/// |> angledLine({ angle = 120, length = 50 }, %, $seg01) +/// |> angledLine({ angle = segAng(seg01) + 120, length = 50 }, %) /// |> lineTo(profileStart(%), %) /// |> close(%) /// |> extrude(20, %) @@ -1341,11 +1386,13 @@ pub(crate) fn inner_profile_start(sketch: Sketch) -> Result<[f64; 2], KclError> /// Close the current sketch. pub async fn close(exec_state: &mut ExecState, args: Args) -> Result { - let (sketch, tag): (Sketch, Option) = args.get_sketch_and_optional_tag()?; + let (sketch, tag): (Sketch, Option) = args.get_sketch_and_optional_tag()?; let new_sketch = inner_close(sketch, tag, exec_state, args).await?; - Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) + Ok(KclValue::Sketch { + value: Box::new(new_sketch), + }) } /// Construct a line segment from the current origin back to the profile's @@ -1361,27 +1408,27 @@ pub async fn close(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> line([10, 0], %) /// |> line([0, 10], %) /// |> close(%) /// -/// const example = extrude(10, exampleSketch) +/// example = extrude(10, exampleSketch) /// ``` #[stdlib { name = "close", }] pub(crate) async fn inner_close( sketch: Sketch, - tag: Option, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { let from = sketch.current_pen_position()?; let to: Point2d = sketch.start.from.into(); - let id = exec_state.id_generator.next_uuid(); + let id = exec_state.next_uuid(); args.batch_modeling_cmd(id, ModelingCmd::from(mcmd::ClosePath { path_id: sketch.id })) .await?; @@ -1390,7 +1437,7 @@ pub(crate) async fn inner_close( if let SketchSurface::Plane(_) = sketch.on { // We were on a plane, disable the sketch mode. args.batch_modeling_cmd( - exec_state.id_generator.next_uuid(), + exec_state.next_uuid(), ModelingCmd::SketchModeDisable(mcmd::SketchModeDisable {}), ) .await?; @@ -1426,11 +1473,11 @@ pub enum ArcData { /// Angles and radius with an optional tag. AnglesAndRadius { /// The start angle. - #[serde(rename = "angleStart", alias = "angle_start")] + #[serde(rename = "angleStart")] #[schemars(range(min = -360.0, max = 360.0))] angle_start: f64, /// The end angle. - #[serde(rename = "angleEnd", alias = "angle_end")] + #[serde(rename = "angleEnd")] #[schemars(range(min = -360.0, max = 360.0))] angle_end: f64, /// The radius. @@ -1447,12 +1494,25 @@ pub enum ArcData { }, } +/// Data to draw a three point arc (arcTo). +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct ArcToData { + /// End point of the arc. A point in 3D space + pub end: [f64; 2], + /// Interior point of the arc. A point in 3D space + pub interior: [f64; 2], +} + /// Draw an arc. pub async fn arc(exec_state: &mut ExecState, args: Args) -> Result { - let (data, sketch, tag): (ArcData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (data, sketch, tag): (ArcData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_arc(data, sketch, tag, exec_state, args).await?; - Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) + Ok(KclValue::Sketch { + value: Box::new(new_sketch), + }) } /// Draw a curved line segment along an imaginary circle. @@ -1466,16 +1526,16 @@ pub async fn arc(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> line([10, 0], %) /// |> arc({ -/// angleStart: 0, -/// angleEnd: 280, -/// radius: 16 +/// angleStart = 0, +/// angleEnd = 280, +/// radius = 16 /// }, %) /// |> close(%) -// const example = extrude(10, exampleSketch) +/// example = extrude(10, exampleSketch) /// ``` #[stdlib { name = "arc", @@ -1483,7 +1543,7 @@ pub async fn arc(exec_state: &mut ExecState, args: Args) -> Result, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -1501,7 +1561,7 @@ pub(crate) async fn inner_arc( (center, a_start, a_end, *radius, end) } ArcData::CenterToRadius { center, to, radius } => { - let (angle_start, angle_end) = arc_angles(from, center.into(), to.into(), *radius, args.source_range)?; + let (angle_start, angle_end) = arc_angles(from, to.into(), center.into(), *radius, args.source_range)?; (center.into(), angle_start, angle_end, *radius, to.into()) } }; @@ -1512,8 +1572,9 @@ pub(crate) async fn inner_arc( source_ranges: vec![args.source_range], })); } + let ccw = angle_start < angle_end; - let id = exec_state.id_generator.next_uuid(); + let id = exec_state.next_uuid(); args.batch_modeling_cmd( id, @@ -1542,6 +1603,7 @@ pub(crate) async fn inner_arc( }, center: center.into(), radius, + ccw, }; let mut new_sketch = sketch.clone(); @@ -1554,6 +1616,127 @@ pub(crate) async fn inner_arc( Ok(new_sketch) } +/// Draw a three point arc. +pub async fn arc_to(exec_state: &mut ExecState, args: Args) -> Result { + let (data, sketch, tag): (ArcToData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; + + let new_sketch = inner_arc_to(data, sketch, tag, exec_state, args).await?; + Ok(KclValue::Sketch { + value: Box::new(new_sketch), + }) +} + +/// Draw a 3 point arc. +/// +/// The arc is constructed such that the start point is the current position of the sketch and two more points defined as the end and interior point. +/// The interior point is placed between the start point and end point. The radius of the arc will be controlled by how far the interior point is placed from +/// the start and end. +/// +/// ```no_run +/// exampleSketch = startSketchOn('XZ') +/// |> startProfileAt([0, 0], %) +/// |> arcTo({ +/// end = [10,0], +/// interior = [5,5] +/// }, %) +/// |> close(%) +/// example = extrude(10, exampleSketch) +/// ``` +#[stdlib { + name = "arcTo", +}] +pub(crate) async fn inner_arc_to( + data: ArcToData, + sketch: Sketch, + tag: Option, + exec_state: &mut ExecState, + args: Args, +) -> Result { + let from: Point2d = sketch.current_pen_position()?; + let id = exec_state.next_uuid(); + + // The start point is taken from the path you are extending. + args.batch_modeling_cmd( + id, + ModelingCmd::from(mcmd::ExtendPath { + path: sketch.id.into(), + segment: PathSegment::ArcTo { + end: kcmc::shared::Point3d { + x: LengthUnit(data.end[0]), + y: LengthUnit(data.end[1]), + z: LengthUnit(0.0), + }, + interior: kcmc::shared::Point3d { + x: LengthUnit(data.interior[0]), + y: LengthUnit(data.interior[1]), + z: LengthUnit(0.0), + }, + relative: false, + }, + }), + ) + .await?; + + let start = [from.x, from.y]; + let interior = data.interior; + let end = data.end; + + // compute the center of the circle since we do not have the value returned from the engine + let center = calculate_circle_center(start, interior, end); + + // compute the radius since we do not have the value returned from the engine + // Pick any of the 3 points since they all lie along the circle + let sum_of_square_differences = + (center[0] - start[0] * center[0] - start[0]) + (center[1] - start[1] * center[1] - start[1]); + let radius = sum_of_square_differences.sqrt(); + + let ccw = is_ccw(start, interior, end); + + let current_path = Path::Arc { + base: BasePath { + from: from.into(), + to: data.end, + tag: tag.clone(), + geo_meta: GeoMeta { + id, + metadata: args.source_range.into(), + }, + }, + center, + radius, + ccw, + }; + + let mut new_sketch = sketch.clone(); + if let Some(tag) = &tag { + new_sketch.add_tag(tag, ¤t_path); + } + + new_sketch.paths.push(current_path); + + Ok(new_sketch) +} + +/// Returns true if the three-point arc is counterclockwise. The order of +/// parameters is critical. +/// +/// | end +/// | / +/// | | / interior +/// | / / +/// | | / +/// |/_____________ +/// start +/// +/// If the slope of the line from start to interior is less than the slope of +/// the line from start to end, the arc is counterclockwise. +fn is_ccw(start: [f64; 2], interior: [f64; 2], end: [f64; 2]) -> bool { + let t1 = (interior[0] - start[0]) * (end[1] - start[1]); + let t2 = (end[0] - start[0]) * (interior[1] - start[1]); + // If these terms are equal, the points are collinear. + t1 > t2 +} + /// Data to draw a tangential arc. #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, JsonSchema, ts_rs::TS)] #[ts(export)] @@ -1570,10 +1753,12 @@ pub enum TangentialArcData { /// Draw a tangential arc. pub async fn tangential_arc(exec_state: &mut ExecState, args: Args) -> Result { - let (data, sketch, tag): (TangentialArcData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (data, sketch, tag): (TangentialArcData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_tangential_arc(data, sketch, tag, exec_state, args).await?; - Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) + Ok(KclValue::Sketch { + value: Box::new(new_sketch), + }) } /// Draw a curved line segment along part of an imaginary circle. @@ -1584,20 +1769,20 @@ pub async fn tangential_arc(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> angledLine({ -/// angle: 60, -/// length: 10, +/// angle = 60, +/// length = 10, /// }, %) -/// |> tangentialArc({ radius: 10, offset: -120 }, %) +/// |> tangentialArc({ radius = 10, offset = -120 }, %) /// |> angledLine({ -/// angle: -60, -/// length: 10, +/// angle = -60, +/// length = 10, /// }, %) /// |> close(%) /// -/// const example = extrude(10, exampleSketch) +/// example = extrude(10, exampleSketch) /// ``` #[stdlib { name = "tangentialArc", @@ -1605,20 +1790,16 @@ pub async fn tangential_arc(exec_state: &mut ExecState, args: Args) -> Result, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { let from: Point2d = sketch.current_pen_position()?; // next set of lines is some undocumented voodoo from get_tangential_arc_to_info let tangent_info = sketch.get_tangential_info_from_paths(); //this function desperately needs some documentation - let tan_previous_point = if tangent_info.is_center { - get_tangent_point_from_previous_arc(tangent_info.center_or_tangent_point, tangent_info.ccw, from.into()) - } else { - tangent_info.center_or_tangent_point - }; + let tan_previous_point = tangent_info.tan_previous_point(from.into()); - let id = exec_state.id_generator.next_uuid(); + let id = exec_state.next_uuid(); let (center, to, ccw) = match data { TangentialArcData::RadiusAndOffset { radius, offset } => { @@ -1698,18 +1879,22 @@ fn tan_arc_to(sketch: &Sketch, to: &[f64; 2]) -> ModelingCmd { /// Draw a tangential arc to a specific point. pub async fn tangential_arc_to(exec_state: &mut ExecState, args: Args) -> Result { - let (to, sketch, tag): ([f64; 2], Sketch, Option) = super::args::FromArgs::from_args(&args, 0)?; + let (to, sketch, tag): ([f64; 2], Sketch, Option) = super::args::FromArgs::from_args(&args, 0)?; let new_sketch = inner_tangential_arc_to(to, sketch, tag, exec_state, args).await?; - Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) + Ok(KclValue::Sketch { + value: Box::new(new_sketch), + }) } /// Draw a tangential arc to point some distance away.. pub async fn tangential_arc_to_relative(exec_state: &mut ExecState, args: Args) -> Result { - let (delta, sketch, tag): ([f64; 2], Sketch, Option) = super::args::FromArgs::from_args(&args, 0)?; + let (delta, sketch, tag): ([f64; 2], Sketch, Option) = super::args::FromArgs::from_args(&args, 0)?; let new_sketch = inner_tangential_arc_to_relative(delta, sketch, tag, exec_state, args).await?; - Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) + Ok(KclValue::Sketch { + value: Box::new(new_sketch), + }) } /// Starting at the current sketch's origin, draw a curved line segment along @@ -1717,17 +1902,17 @@ pub async fn tangential_arc_to_relative(exec_state: &mut ExecState, args: Args) /// coordinates. /// /// ```no_run -/// const exampleSketch = startSketchOn('XZ') +/// exampleSketch = startSketchOn('XZ') /// |> startProfileAt([0, 0], %) /// |> angledLine({ -/// angle: 60, -/// length: 10, +/// angle = 60, +/// length = 10, /// }, %) /// |> tangentialArcTo([15, 15], %) /// |> line([10, -15], %) /// |> close(%) /// -/// const example = extrude(10, exampleSketch) +/// example = extrude(10, exampleSketch) /// ``` #[stdlib { name = "tangentialArcTo", @@ -1735,17 +1920,13 @@ pub async fn tangential_arc_to_relative(exec_state: &mut ExecState, args: Args) async fn inner_tangential_arc_to( to: [f64; 2], sketch: Sketch, - tag: Option, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { let from: Point2d = sketch.current_pen_position()?; let tangent_info = sketch.get_tangential_info_from_paths(); - let tan_previous_point = if tangent_info.is_center { - get_tangent_point_from_previous_arc(tangent_info.center_or_tangent_point, tangent_info.ccw, from.into()) - } else { - tangent_info.center_or_tangent_point - }; + let tan_previous_point = tangent_info.tan_previous_point(from.into()); let [to_x, to_y] = to; let result = get_tangential_arc_to_info(TangentialArcInfoInput { arc_start_point: [from.x, from.y], @@ -1755,7 +1936,7 @@ async fn inner_tangential_arc_to( }); let delta = [to_x - from.x, to_y - from.y]; - let id = exec_state.id_generator.next_uuid(); + let id = exec_state.next_uuid(); args.batch_modeling_cmd(id, tan_arc_to(&sketch, &delta)).await?; let current_path = Path::TangentialArcTo { @@ -1787,17 +1968,17 @@ async fn inner_tangential_arc_to( /// distance away. /// /// ```no_run -/// const exampleSketch = startSketchOn('XZ') +/// exampleSketch = startSketchOn('XZ') /// |> startProfileAt([0, 0], %) /// |> angledLine({ -/// angle: 45, -/// length: 10, +/// angle = 45, +/// length = 10, /// }, %) /// |> tangentialArcToRelative([0, -10], %) /// |> line([-10, 0], %) /// |> close(%) /// -/// const example = extrude(10, exampleSketch) +/// example = extrude(10, exampleSketch) /// ``` #[stdlib { name = "tangentialArcToRelative", @@ -1805,17 +1986,15 @@ async fn inner_tangential_arc_to( async fn inner_tangential_arc_to_relative( delta: [f64; 2], sketch: Sketch, - tag: Option, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { let from: Point2d = sketch.current_pen_position()?; + let to = [from.x + delta[0], from.y + delta[1]]; let tangent_info = sketch.get_tangential_info_from_paths(); - let tan_previous_point = if tangent_info.is_center { - get_tangent_point_from_previous_arc(tangent_info.center_or_tangent_point, tangent_info.ccw, from.into()) - } else { - tangent_info.center_or_tangent_point - }; + let tan_previous_point = tangent_info.tan_previous_point(from.into()); + let [dx, dy] = delta; let result = get_tangential_arc_to_info(TangentialArcInfoInput { arc_start_point: [from.x, from.y], @@ -1840,13 +2019,13 @@ async fn inner_tangential_arc_to_relative( })); } - let id = exec_state.id_generator.next_uuid(); + let id = exec_state.next_uuid(); args.batch_modeling_cmd(id, tan_arc_to(&sketch, &delta)).await?; let current_path = Path::TangentialArcTo { base: BasePath { from: from.into(), - to: delta, + to, tag: tag.clone(), geo_meta: GeoMeta { id, @@ -1873,19 +2052,21 @@ async fn inner_tangential_arc_to_relative( #[serde(rename_all = "camelCase")] pub struct BezierData { /// The to point. - to: [f64; 2], + pub to: [f64; 2], /// The first control point. - control1: [f64; 2], + pub control1: [f64; 2], /// The second control point. - control2: [f64; 2], + pub control2: [f64; 2], } /// Draw a bezier curve. pub async fn bezier_curve(exec_state: &mut ExecState, args: Args) -> Result { - let (data, sketch, tag): (BezierData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (data, sketch, tag): (BezierData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_bezier_curve(data, sketch, tag, exec_state, args).await?; - Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) + Ok(KclValue::Sketch { + value: Box::new(new_sketch), + }) } /// Draw a smooth, continuous, curved line segment from the current origin to @@ -1893,18 +2074,18 @@ pub async fn bezier_curve(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> line([0, 10], %) /// |> bezierCurve({ -/// to: [10, 10], -/// control1: [5, 0], -/// control2: [5, 10] +/// to = [10, 10], +/// control1 = [5, 0], +/// control2 = [5, 10] /// }, %) /// |> lineTo([10, 0], %) /// |> close(%) /// -/// const example = extrude(10, exampleSketch) +/// example = extrude(10, exampleSketch) /// ``` #[stdlib { name = "bezierCurve", @@ -1912,7 +2093,7 @@ pub async fn bezier_curve(exec_state: &mut ExecState, args: Args) -> Result, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -1922,7 +2103,7 @@ async fn inner_bezier_curve( let delta = data.to; let to = [from.x + data.to[0], from.y + data.to[1]]; - let id = exec_state.id_generator.next_uuid(); + let id = exec_state.next_uuid(); args.batch_modeling_cmd( id, @@ -1965,42 +2146,45 @@ pub async fn hole(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> line([0, 5], %) /// |> line([5, 0], %) /// |> line([0, -5], %) /// |> close(%) -/// |> hole(circle({ center: [1, 1], radius: .25 }, %), %) -/// |> hole(circle({ center: [1, 4], radius: .25 }, %), %) +/// |> hole(circle({ center = [1, 1], radius = .25 }, %), %) +/// |> hole(circle({ center = [1, 4], radius = .25 }, %), %) /// -/// const example = extrude(1, exampleSketch) +/// example = extrude(1, exampleSketch) /// ``` /// /// ```no_run -/// fn squareHoleSketch = () => { -/// const squareSketch = startSketchOn('-XZ') -/// |> startProfileAt([-1, -1], %) -/// |> line([2, 0], %) -/// |> line([0, 2], %) -/// |> line([-2, 0], %) -/// |> close(%) -/// return squareSketch -/// } +/// fn squareHoleSketch() { +/// squareSketch = startSketchOn('-XZ') +/// |> startProfileAt([-1, -1], %) +/// |> line([2, 0], %) +/// |> line([0, 2], %) +/// |> line([-2, 0], %) +/// |> close(%) +/// return squareSketch +/// } /// -/// const exampleSketch = startSketchOn('-XZ') -/// |> circle({ center: [0, 0], radius: 3 }, %) +/// exampleSketch = startSketchOn('-XZ') +/// |> circle({ center = [0, 0], radius = 3 }, %) /// |> hole(squareHoleSketch(), %) -/// const example = extrude(1, exampleSketch) +/// example = extrude(1, exampleSketch) /// ``` #[stdlib { name = "hole", + feature_tree_operation = true, }] async fn inner_hole( hole_sketch: SketchSet, @@ -2011,7 +2195,7 @@ async fn inner_hole( let hole_sketches: Vec = hole_sketch.into(); for hole_sketch in hole_sketches { args.batch_modeling_cmd( - exec_state.id_generator.next_uuid(), + exec_state.next_uuid(), ModelingCmd::from(mcmd::Solid2dAddHole { object_id: sketch.id, hole_id: hole_sketch.id, @@ -2022,7 +2206,7 @@ async fn inner_hole( // suggestion (mike) // we also hide the source hole since its essentially "consumed" by this operation args.batch_modeling_cmd( - exec_state.id_generator.next_uuid(), + exec_state.next_uuid(), ModelingCmd::from(mcmd::ObjectVisible { object_id: hole_sketch.id, hidden: true, @@ -2039,7 +2223,7 @@ mod tests { use pretty_assertions::assert_eq; - use crate::{executor::TagIdentifier, std::sketch::PlaneData}; + use crate::{execution::TagIdentifier, std::sketch::PlaneData, std::utils::calculate_circle_center}; #[test] fn test_deserialize_plane_data() { @@ -2110,4 +2294,11 @@ mod tests { crate::std::sketch::FaceTag::StartOrEnd(crate::std::sketch::StartOrEnd::Start) ); } + + #[test] + fn test_circle_center() { + let actual = calculate_circle_center([0.0, 0.0], [5.0, 5.0], [10.0, 0.0]); + assert_eq!(actual[0], 5.0); + assert_eq!(actual[1], 0.0); + } } diff --git a/src/wasm-lib/kcl/src/std/sweep.rs b/src/wasm-lib/kcl/src/std/sweep.rs new file mode 100644 index 000000000..02566e2ca --- /dev/null +++ b/src/wasm-lib/kcl/src/std/sweep.rs @@ -0,0 +1,103 @@ +//! Standard library sweep. + +use anyhow::Result; +use derive_docs::stdlib; +use kcmc::{each_cmd as mcmd, length_unit::LengthUnit, ModelingCmd}; +use kittycad_modeling_cmds::{self as kcmc}; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +use crate::{ + errors::KclError, + execution::{ExecState, KclValue, Sketch, Solid}, + std::{extrude::do_post_extrude, fillet::default_tolerance, Args}, +}; + +/// Data for a sweep. +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] +#[ts(export)] +pub struct SweepData { + /// The path to sweep along. + pub path: Sketch, + /// If true, the sweep will be broken up into sub-sweeps (extrusions, revolves, sweeps) based on the trajectory path components. + pub sectional: Option, + /// Tolerance for the sweep operation. + #[serde(default)] + pub tolerance: Option, +} + +/// Extrude a sketch along a path. +pub async fn sweep(exec_state: &mut ExecState, args: Args) -> Result { + let (data, sketch): (SweepData, Sketch) = args.get_data_and_sketch()?; + + let solid = inner_sweep(data, sketch, exec_state, args).await?; + Ok(KclValue::Solid(solid)) +} + +/// Extrude a sketch along a path. +/// +/// This, like extrude, is able to create a 3-dimensional solid from a +/// 2-dimensional sketch. However, unlike extrude, this creates a solid +/// by using the extent of the sketch as its path. This is useful for +/// creating more complex shapes that can't be created with a simple +/// extrusion. +/// +/// ```no_run +/// // Create a pipe using a sweep. +/// +/// // Create a path for the sweep. +/// sweepPath = startSketchOn('XZ') +/// |> startProfileAt([0.05, 0.05], %) +/// |> line([0, 7], %) +/// |> tangentialArc({ +/// offset: 90, +/// radius: 5 +/// }, %) +/// |> line([-3, 0], %) +/// |> tangentialArc({ +/// offset: -90, +/// radius: 5 +/// }, %) +/// |> line([0, 7], %) +/// +/// // Create a hole for the pipe. +/// pipeHole = startSketchOn('XY') +/// |> circle({ +/// center = [0, 0], +/// radius = 1.5, +/// }, %) +/// +/// sweepSketch = startSketchOn('XY') +/// |> circle({ +/// center = [0, 0], +/// radius = 2, +/// }, %) +/// |> hole(pipeHole, %) +/// |> sweep({ +/// path: sweepPath, +/// }, %) +/// ``` +#[stdlib { + name = "sweep", + feature_tree_operation = true, +}] +async fn inner_sweep( + data: SweepData, + sketch: Sketch, + exec_state: &mut ExecState, + args: Args, +) -> Result, KclError> { + let id = exec_state.next_uuid(); + args.batch_modeling_cmd( + id, + ModelingCmd::from(mcmd::Sweep { + target: sketch.id.into(), + trajectory: data.path.id.into(), + sectional: data.sectional.unwrap_or(false), + tolerance: LengthUnit(data.tolerance.unwrap_or(default_tolerance(&args.ctx.settings.units))), + }), + ) + .await?; + + do_post_extrude(sketch, 0.0, exec_state, args).await +} diff --git a/src/wasm-lib/kcl/src/std/types.rs b/src/wasm-lib/kcl/src/std/types.rs index 53ae98916..8b1378917 100644 --- a/src/wasm-lib/kcl/src/std/types.rs +++ b/src/wasm-lib/kcl/src/std/types.rs @@ -1,40 +1 @@ -//! Custom types for various standard library types. -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; - -/// A Uint that allows us to do math but rounds to a uint. -#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Serialize, Deserialize, ts_rs::TS)] -#[ts(export)] -pub struct Uint(f64); - -impl Uint { - pub fn new(value: f64) -> Self { - if value < 0.0 { - panic!("Uint cannot be negative"); - } - Self(value) - } - - pub fn value(&self) -> f64 { - self.0 - } - - pub fn u32(&self) -> u32 { - self.0.round() as u32 - } - - pub fn u64(&self) -> u64 { - self.0.round() as u64 - } -} - -impl JsonSchema for Uint { - fn schema_name() -> String { - "Uint".to_string() - } - - fn json_schema(gen: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema { - gen.subschema_for::() - } -} diff --git a/src/wasm-lib/kcl/src/std/units.rs b/src/wasm-lib/kcl/src/std/units.rs index 2e1ee77a8..540b1051d 100644 --- a/src/wasm-lib/kcl/src/std/units.rs +++ b/src/wasm-lib/kcl/src/std/units.rs @@ -5,7 +5,7 @@ use derive_docs::stdlib; use crate::{ errors::KclError, - executor::{ExecState, KclValue}, + execution::{ExecState, KclValue}, settings::types::UnitLength, std::Args, }; @@ -14,7 +14,7 @@ use crate::{ pub async fn mm(_exec_state: &mut ExecState, args: Args) -> Result { let result = inner_mm(&args)?; - args.make_user_val_from_f64(result) + Ok(args.make_user_val_from_f64(result)) } /// Millimeters conversion factor for current projects units. @@ -34,7 +34,7 @@ pub async fn mm(_exec_state: &mut ExecState, args: Args) -> Result Result { pub async fn inch(_exec_state: &mut ExecState, args: Args) -> Result { let result = inner_inch(&args)?; - args.make_user_val_from_f64(result) + Ok(args.make_user_val_from_f64(result)) } /// Inches conversion factor for current projects units. @@ -75,7 +75,7 @@ pub async fn inch(_exec_state: &mut ExecState, args: Args) -> Result Result { pub async fn ft(_exec_state: &mut ExecState, args: Args) -> Result { let result = inner_ft(&args)?; - args.make_user_val_from_f64(result) + Ok(args.make_user_val_from_f64(result)) } /// Feet conversion factor for current projects units. @@ -117,7 +117,7 @@ pub async fn ft(_exec_state: &mut ExecState, args: Args) -> Result Result { pub async fn m(_exec_state: &mut ExecState, args: Args) -> Result { let result = inner_m(&args)?; - args.make_user_val_from_f64(result) + Ok(args.make_user_val_from_f64(result)) } /// Meters conversion factor for current projects units. @@ -159,7 +159,7 @@ pub async fn m(_exec_state: &mut ExecState, args: Args) -> Result Result { pub async fn cm(_exec_state: &mut ExecState, args: Args) -> Result { let result = inner_cm(&args)?; - args.make_user_val_from_f64(result) + Ok(args.make_user_val_from_f64(result)) } /// Centimeters conversion factor for current projects units. @@ -201,7 +201,7 @@ pub async fn cm(_exec_state: &mut ExecState, args: Args) -> Result Result { pub async fn yd(_exec_state: &mut ExecState, args: Args) -> Result { let result = inner_yd(&args)?; - args.make_user_val_from_f64(result) + Ok(args.make_user_val_from_f64(result)) } /// Yards conversion factor for current projects units. @@ -243,7 +243,7 @@ pub async fn yd(_exec_state: &mut ExecState, args: Args) -> Result f64 { + ((b.x - a.x).powi(2) + (b.y - a.y).powi(2)).sqrt() +} + /// Get the angle between these points pub fn between(a: Point2d, b: Point2d) -> Angle { let x = b.x - a.x; @@ -53,20 +59,6 @@ pub fn delta(from_angle: Angle, to_angle: Angle) -> Angle { Angle::default() } -pub fn clockwise_sign(points: &[Point2d]) -> i32 { - let mut sum = 0.0; - for i in 0..points.len() { - let current_point = points[i]; - let next_point = points[(i + 1) % points.len()]; - sum += (next_point.x - current_point.x) * (next_point.y + current_point.y); - } - if sum >= 0.0 { - 1 - } else { - -1 - } -} - pub fn normalize_rad(angle: f64) -> f64 { let draft = angle % (2.0 * PI); if draft < 0.0 { @@ -76,32 +68,6 @@ pub fn normalize_rad(angle: f64) -> f64 { } } -/// Calculates the distance between two points. -/// -/// # Examples -/// -/// ``` -/// use kcl_lib::executor::Point2d; -/// -/// assert_eq!( -/// kcl_lib::std::utils::distance_between_points(Point2d::ZERO, Point2d { x: 0.0, y: 5.0 }), -/// 5.0 -/// ); -/// assert_eq!( -/// kcl_lib::std::utils::distance_between_points(Point2d::ZERO, Point2d { x: 3.0, y: 4.0 }), -/// 5.0 -/// ); -/// ``` -#[allow(dead_code)] -pub fn distance_between_points(point_a: Point2d, point_b: Point2d) -> f64 { - let x1 = point_a.x; - let y1 = point_a.y; - let x2 = point_b.x; - let y2 = point_b.y; - - ((y2 - y1).powi(2) + (x2 - x1).powi(2)).sqrt() -} - pub fn calculate_intersection_of_two_lines(line1: &[Point2d; 2], line2_angle: f64, line2_point: Point2d) -> Point2d { let line2_point_b = Point2d { x: line2_point.x + f64::cos(line2_angle.to_radians()) * 10.0, @@ -268,13 +234,49 @@ pub fn is_on_circumference(center: Point2d, point: Point2d, radius: f64) -> bool (distance_squared - radius.powi(2)).abs() < 1e-9 } +// Calculate the center of 3 points +// To calculate the center of the 3 point circle 2 perpendicular lines are created +// These perpendicular lines will intersect at the center of the circle. +pub fn calculate_circle_center(p1: [f64; 2], p2: [f64; 2], p3: [f64; 2]) -> [f64; 2] { + // y2 - y1 + let y_2_1 = p2[1] - p1[1]; + // y3 - y2 + let y_3_2 = p3[1] - p2[1]; + // x2 - x1 + let x_2_1 = p2[0] - p1[0]; + // x3 - x2 + let x_3_2 = p3[0] - p2[0]; + + // Slope of two perpendicular lines + let slope_a = y_2_1 / x_2_1; + let slope_b = y_3_2 / x_3_2; + + // Values for line intersection + // y1 - y3 + let y_1_3 = p1[1] - p3[1]; + // x1 + x2 + let x_1_2 = p1[0] + p2[0]; + // x2 + x3 + let x_2_3 = p2[0] + p3[0]; + // y1 + y2 + let y_1_2 = p1[1] + p2[1]; + + // Solve for the intersection of these two lines + let numerator = (slope_a * slope_b * y_1_3) + (slope_b * x_1_2) - (slope_a * x_2_3); + let x = numerator / (2.0 * (slope_b - slope_a)); + + let y = ((-1.0 / slope_a) * (x - (x_1_2 / 2.0))) + (y_1_2 / 2.0); + + [x, y] +} + #[cfg(test)] mod tests { // Here you can bring your functions into scope use pretty_assertions::assert_eq; use super::{get_x_component, get_y_component, Angle}; - use crate::executor::SourceRange; + use crate::SourceRange; static EACH_QUAD: [(i32, [i32; 2]); 12] = [ (-315, [1, 1]), @@ -394,7 +396,7 @@ mod tests { super::Point2d { x: -1.0, y: 1.0 }, super::Point2d { x: -1.0, y: 0.0 }, 1.0, - SourceRange(Default::default()), + SourceRange::default(), ) .unwrap(); assert_eq!(angle_start.to_degrees().round(), 0.0); @@ -405,7 +407,7 @@ mod tests { super::Point2d { x: -2.0, y: 0.0 }, super::Point2d { x: -1.0, y: 0.0 }, 1.0, - SourceRange(Default::default()), + SourceRange::default(), ) .unwrap(); assert_eq!(angle_start.to_degrees().round(), 0.0); @@ -416,7 +418,7 @@ mod tests { super::Point2d { x: -20.0, y: 0.0 }, super::Point2d { x: -10.0, y: 0.0 }, 10.0, - SourceRange(Default::default()), + SourceRange::default(), ) .unwrap(); assert_eq!(angle_start.to_degrees().round(), 0.0); @@ -427,7 +429,7 @@ mod tests { super::Point2d { x: 5.0, y: 5.0 }, super::Point2d { x: 10.0, y: -10.0 }, 10.0, - SourceRange(Default::default()), + SourceRange::default(), ); if let Err(err) = result { @@ -563,6 +565,7 @@ pub struct TangentialArcInfoInput { } /// Structure to hold the output data from calculating tangential arc information. +#[allow(dead_code)] pub struct TangentialArcInfoOutput { /// The center point of the arc. pub center: Coords2d, diff --git a/src/wasm-lib/kcl/src/test_server.rs b/src/wasm-lib/kcl/src/test_server.rs index 9ddc152b7..5e00ed66d 100644 --- a/src/wasm-lib/kcl/src/test_server.rs +++ b/src/wasm-lib/kcl/src/test_server.rs @@ -1,8 +1,12 @@ //! Types used to send data to the test server. +use std::path::PathBuf; + use crate::{ - executor::{ExecutorContext, ExecutorSettings, IdGenerator}, + errors::ExecErrorWithState, + execution::{new_zoo_client, ExecutorContext, ExecutorSettings, Operation, ProgramMemory}, settings::types::UnitLength, + ConnectionError, ExecError, Program, }; #[derive(serde::Deserialize, serde::Serialize)] @@ -14,46 +18,92 @@ pub struct RequestBody { /// Executes a kcl program and takes a snapshot of the result. /// This returns the bytes of the snapshot. -pub async fn execute_and_snapshot(code: &str, units: UnitLength) -> anyhow::Result { - let ctx = new_context(units, true).await?; - do_execute_and_snapshot(&ctx, code).await +pub async fn execute_and_snapshot( + code: &str, + units: UnitLength, + project_directory: Option, +) -> Result { + let ctx = new_context(units, true, project_directory).await?; + let program = Program::parse_no_errs(code)?; + do_execute_and_snapshot(&ctx, program) + .await + .map(|(_state, snap)| snap) + .map_err(|err| err.error) } -pub async fn execute_and_snapshot_no_auth(code: &str, units: UnitLength) -> anyhow::Result { - let ctx = new_context(units, false).await?; - do_execute_and_snapshot(&ctx, code).await +/// Executes a kcl program and takes a snapshot of the result. +/// This returns the bytes of the snapshot. +pub async fn execute_and_snapshot_ast( + ast: Program, + units: UnitLength, + project_directory: Option, +) -> Result<(ProgramMemory, Vec, image::DynamicImage), ExecErrorWithState> { + let ctx = new_context(units, true, project_directory).await?; + do_execute_and_snapshot(&ctx, ast) + .await + .map(|(state, snap)| (state.mod_local.memory, state.mod_local.operations, snap)) } -async fn do_execute_and_snapshot(ctx: &ExecutorContext, code: &str) -> anyhow::Result { - let tokens = crate::token::lexer(code)?; - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast()?; +pub async fn execute_and_snapshot_no_auth( + code: &str, + units: UnitLength, + project_directory: Option, +) -> Result { + let ctx = new_context(units, false, project_directory).await?; + let program = Program::parse_no_errs(code)?; + do_execute_and_snapshot(&ctx, program) + .await + .map(|(_state, snap)| snap) + .map_err(|err| err.error) +} - let snapshot = ctx - .execute_and_prepare_snapshot(&program, IdGenerator::default(), None) - .await?; +async fn do_execute_and_snapshot( + ctx: &ExecutorContext, + program: Program, +) -> Result<(crate::execution::ExecState, image::DynamicImage), ExecErrorWithState> { + let mut exec_state = Default::default(); + let snapshot_png_bytes = ctx + .execute_and_prepare_snapshot(&program, &mut exec_state) + .await + .map_err(|err| ExecErrorWithState::new(err, exec_state.clone()))? + .contents + .0; - // Create a temporary file to write the output to. - let output_file = std::env::temp_dir().join(format!("kcl_output_{}.png", uuid::Uuid::new_v4())); - // Save the snapshot locally, to that temporary file. - std::fs::write(&output_file, snapshot.contents.0)?; // Decode the snapshot, return it. - let img = image::ImageReader::open(output_file).unwrap().decode()?; - Ok(img) + let img = image::ImageReader::new(std::io::Cursor::new(snapshot_png_bytes)) + .with_guessed_format() + .map_err(|e| ExecError::BadPng(e.to_string())) + .and_then(|x| x.decode().map_err(|e| ExecError::BadPng(e.to_string()))) + .map_err(|err| ExecErrorWithState::new(err, exec_state.clone()))?; + Ok((exec_state, img)) } -async fn new_context(units: UnitLength, with_auth: bool) -> anyhow::Result { - let ctx = ExecutorContext::new_with_client( +pub async fn new_context( + units: UnitLength, + with_auth: bool, + project_directory: Option, +) -> Result { + let mut client = new_zoo_client(if with_auth { None } else { Some("bad_token".to_string()) }, None) + .map_err(ConnectionError::CouldNotMakeClient)?; + if !with_auth { + // Use prod, don't override based on env vars. + // We do this so even in the engine repo, tests that need to run with + // no auth can fail in the same way as they would in prod. + client.set_base_url("https://api.zoo.dev".to_string()); + } + + let ctx = ExecutorContext::new( + &client, ExecutorSettings { units, highlight_edges: true, enable_ssao: false, show_grid: false, replay: None, + project_directory, }, - if with_auth { None } else { Some("bad_token".to_string()) }, - None, ) - .await?; + .await + .map_err(ConnectionError::Establishing)?; Ok(ctx) } diff --git a/src/wasm-lib/kcl/src/thread/mod.rs b/src/wasm-lib/kcl/src/thread/mod.rs index c37bab0fb..317ed5600 100644 --- a/src/wasm-lib/kcl/src/thread/mod.rs +++ b/src/wasm-lib/kcl/src/thread/mod.rs @@ -1,13 +1,15 @@ //! An implementation of threads that works in wasm with promises and other platforms with tokio. +#![allow(dead_code)] +#![allow(unused_imports)] #[cfg(not(target_arch = "wasm32"))] -pub mod local; +mod local; #[cfg(not(target_arch = "wasm32"))] pub use local::JoinHandle; #[cfg(target_arch = "wasm32")] #[cfg(not(test))] -pub mod wasm; +mod wasm; #[cfg(target_arch = "wasm32")] #[cfg(not(test))] diff --git a/src/wasm-lib/kcl/src/token.rs b/src/wasm-lib/kcl/src/token.rs deleted file mode 100644 index 7533ffda3..000000000 --- a/src/wasm-lib/kcl/src/token.rs +++ /dev/null @@ -1,254 +0,0 @@ -use std::str::FromStr; - -use anyhow::Result; -use parse_display::{Display, FromStr}; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use tower_lsp::lsp_types::SemanticTokenType; -use winnow::stream::ContainsToken; - -use crate::{ - ast::types::{ItemVisibility, VariableKind}, - errors::KclError, - executor::SourceRange, -}; - -mod tokeniser; - -/// The types of tokens. -#[derive(Debug, PartialEq, Eq, Copy, Clone, Deserialize, Serialize, ts_rs::TS, JsonSchema, FromStr, Display)] -#[cfg_attr(feature = "pyo3", pyo3::pyclass(eq, eq_int))] -#[ts(export)] -#[serde(rename_all = "camelCase")] -#[display(style = "camelCase")] -pub enum TokenType { - /// A number. - Number, - /// A word. - Word, - /// An operator. - Operator, - /// A string. - String, - /// A keyword. - Keyword, - /// A type. - Type, - /// A brace. - Brace, - /// A hash. - Hash, - /// A bang. - Bang, - /// A dollar sign. - Dollar, - /// Whitespace. - Whitespace, - /// A comma. - Comma, - /// A colon. - Colon, - /// A period. - Period, - /// A double period: `..`. - DoublePeriod, - /// A line comment. - LineComment, - /// A block comment. - BlockComment, - /// A function name. - Function, - /// Unknown lexemes. - Unknown, - /// The ? symbol, used for optional values. - QuestionMark, -} - -/// Most KCL tokens correspond to LSP semantic tokens (but not all). -impl TryFrom for SemanticTokenType { - type Error = anyhow::Error; - fn try_from(token_type: TokenType) -> Result { - Ok(match token_type { - TokenType::Number => Self::NUMBER, - TokenType::Word => Self::VARIABLE, - TokenType::Keyword => Self::KEYWORD, - TokenType::Type => Self::TYPE, - TokenType::Operator => Self::OPERATOR, - TokenType::QuestionMark => Self::OPERATOR, - TokenType::String => Self::STRING, - TokenType::Bang => Self::OPERATOR, - TokenType::LineComment => Self::COMMENT, - TokenType::BlockComment => Self::COMMENT, - TokenType::Function => Self::FUNCTION, - TokenType::Whitespace - | TokenType::Brace - | TokenType::Comma - | TokenType::Colon - | TokenType::Period - | TokenType::DoublePeriod - | TokenType::Hash - | TokenType::Dollar - | TokenType::Unknown => { - anyhow::bail!("unsupported token type: {:?}", token_type) - } - }) - } -} - -impl TokenType { - // This is for the lsp server. - // Don't call this function directly in the code use a lazy_static instead - // like we do in the lsp server. - pub fn all_semantic_token_types() -> Result> { - let mut settings = schemars::gen::SchemaSettings::openapi3(); - settings.inline_subschemas = true; - let mut generator = schemars::gen::SchemaGenerator::new(settings); - - let schema = TokenType::json_schema(&mut generator); - let schemars::schema::Schema::Object(o) = &schema else { - anyhow::bail!("expected object schema: {:#?}", schema); - }; - let Some(subschemas) = &o.subschemas else { - anyhow::bail!("expected subschemas: {:#?}", schema); - }; - let Some(one_ofs) = &subschemas.one_of else { - anyhow::bail!("expected one_of: {:#?}", schema); - }; - - let mut semantic_tokens = vec![]; - for one_of in one_ofs { - let schemars::schema::Schema::Object(o) = one_of else { - anyhow::bail!("expected object one_of: {:#?}", one_of); - }; - - let Some(enum_values) = o.enum_values.as_ref() else { - anyhow::bail!("expected enum values: {:#?}", o); - }; - - if enum_values.len() > 1 { - anyhow::bail!("expected only one enum value: {:#?}", o); - } - - if enum_values.is_empty() { - anyhow::bail!("expected at least one enum value: {:#?}", o); - } - - let label = TokenType::from_str(&enum_values[0].to_string().replace('"', ""))?; - if let Ok(semantic_token_type) = SemanticTokenType::try_from(label) { - semantic_tokens.push(semantic_token_type); - } - } - - Ok(semantic_tokens) - } - - pub fn is_whitespace(&self) -> bool { - matches!(self, Self::Whitespace) - } - - pub fn is_comment(&self) -> bool { - matches!(self, Self::LineComment | Self::BlockComment) - } -} - -#[derive(Debug, PartialEq, Eq, Deserialize, Serialize, Clone, ts_rs::TS)] -#[cfg_attr(feature = "pyo3", pyo3::pyclass)] -#[ts(export)] -pub struct Token { - #[serde(rename = "type")] - pub token_type: TokenType, - /// Offset in the source code where this token begins. - pub start: usize, - /// Offset in the source code where this token ends. - pub end: usize, - pub value: String, -} - -impl ContainsToken for (TokenType, &str) { - fn contains_token(&self, token: Token) -> bool { - self.0 == token.token_type && self.1 == token.value - } -} - -impl ContainsToken for TokenType { - fn contains_token(&self, token: Token) -> bool { - *self == token.token_type - } -} - -impl Token { - pub fn from_range(range: std::ops::Range, token_type: TokenType, value: String) -> Self { - Self { - start: range.start, - end: range.end, - value, - token_type, - } - } - pub fn is_code_token(&self) -> bool { - !matches!( - self.token_type, - TokenType::Whitespace | TokenType::LineComment | TokenType::BlockComment - ) - } - - pub fn as_source_range(&self) -> SourceRange { - SourceRange([self.start, self.end]) - } - - pub fn as_source_ranges(&self) -> Vec { - vec![self.as_source_range()] - } - - pub fn visibility_keyword(&self) -> Option { - if !matches!(self.token_type, TokenType::Keyword) { - return None; - } - match self.value.as_str() { - "export" => Some(ItemVisibility::Export), - _ => None, - } - } - - /// Is this token the beginning of a variable/function declaration? - /// If so, what kind? - /// If not, returns None. - pub fn declaration_keyword(&self) -> Option { - if !matches!(self.token_type, TokenType::Keyword) { - return None; - } - Some(match self.value.as_str() { - "fn" => VariableKind::Fn, - "var" | "let" | "const" => VariableKind::Const, - _ => return None, - }) - } -} - -impl From for SourceRange { - fn from(token: Token) -> Self { - Self([token.start, token.end]) - } -} - -impl From<&Token> for SourceRange { - fn from(token: &Token) -> Self { - Self([token.start, token.end]) - } -} - -pub fn lexer(s: &str) -> Result, KclError> { - tokeniser::lexer(s).map_err(From::from) -} - -#[cfg(test)] -mod tests { - use super::*; - - // We have this as a test so we can ensure it never panics with an unwrap in the server. - #[test] - fn test_token_type_to_semantic_token_type() { - let semantic_types = TokenType::all_semantic_token_types().unwrap(); - assert!(!semantic_types.is_empty()); - } -} diff --git a/src/wasm-lib/kcl/src/token/tokeniser.rs b/src/wasm-lib/kcl/src/token/tokeniser.rs deleted file mode 100644 index 589a8d478..000000000 --- a/src/wasm-lib/kcl/src/token/tokeniser.rs +++ /dev/null @@ -1,1609 +0,0 @@ -use winnow::{ - ascii::{digit1, multispace1}, - combinator::{alt, opt, peek, preceded, repeat, terminated}, - error::{ContextError, ParseError}, - prelude::*, - stream::{Location, Stream}, - token::{any, none_of, one_of, take_till, take_until}, - Located, -}; - -use crate::token::{Token, TokenType}; - -pub fn lexer(i: &str) -> Result, ParseError, ContextError>> { - repeat(0.., token).parse(Located::new(i)) -} - -pub fn token(i: &mut Located<&str>) -> PResult { - match winnow::combinator::dispatch! {peek(any); - '"' | '\'' => string, - '/' => alt((line_comment, block_comment, operator)), - '{' | '(' | '[' => brace_start, - '}' | ')' | ']' => brace_end, - ',' => comma, - '?' => question_mark, - '0'..='9' => number, - ':' => colon, - '.' => alt((number, double_period, period)), - '#' => hash, - '$' => dollar, - '!' => alt((operator, bang)), - ' ' | '\t' | '\n' => whitespace, - _ => alt((operator, keyword,type_, word)) - } - .parse_next(i) - { - Ok(token) => Ok(token), - Err(x) => { - // TODO: Handle non ascii cases - if i.len() == 0 || !i.is_ascii() { - return Err(x); - } - - Ok(Token::from_range( - i.location()..i.location() + 1, - TokenType::Unknown, - i.next_slice(1).to_string(), - )) - } - } -} - -fn block_comment(i: &mut Located<&str>) -> PResult { - let inner = ("/*", take_until(0.., "*/"), "*/").take(); - let (value, range) = inner.with_span().parse_next(i)?; - Ok(Token::from_range(range, TokenType::BlockComment, value.to_string())) -} - -fn line_comment(i: &mut Located<&str>) -> PResult { - let inner = (r#"//"#, take_till(0.., ['\n', '\r'])).take(); - let (value, range) = inner.with_span().parse_next(i)?; - Ok(Token::from_range(range, TokenType::LineComment, value.to_string())) -} - -fn number(i: &mut Located<&str>) -> PResult { - let number_parser = alt(( - // Digits before the decimal point. - (digit1, opt(('.', digit1))).map(|_| ()), - // No digits before the decimal point. - ('.', digit1).map(|_| ()), - )); - let (value, range) = number_parser.take().with_span().parse_next(i)?; - Ok(Token::from_range(range, TokenType::Number, value.to_string())) -} - -fn whitespace(i: &mut Located<&str>) -> PResult { - let (value, range) = multispace1.with_span().parse_next(i)?; - Ok(Token::from_range(range, TokenType::Whitespace, value.to_string())) -} - -fn inner_word(i: &mut Located<&str>) -> PResult<()> { - one_of(('a'..='z', 'A'..='Z', '_')).parse_next(i)?; - repeat::<_, _, (), _, _>(0.., one_of(('a'..='z', 'A'..='Z', '0'..='9', '_'))).parse_next(i)?; - Ok(()) -} - -fn word(i: &mut Located<&str>) -> PResult { - let (value, range) = inner_word.take().with_span().parse_next(i)?; - Ok(Token::from_range(range, TokenType::Word, value.to_string())) -} - -fn operator(i: &mut Located<&str>) -> PResult { - let (value, range) = alt(( - ">=", "<=", "==", "=>", "!=", "|>", "*", "+", "-", "/", "%", "=", "<", ">", r"\", "|", "^", - )) - .with_span() - .parse_next(i)?; - Ok(Token::from_range(range, TokenType::Operator, value.to_string())) -} - -fn brace_start(i: &mut Located<&str>) -> PResult { - let (value, range) = alt(('{', '(', '[')).with_span().parse_next(i)?; - Ok(Token::from_range(range, TokenType::Brace, value.to_string())) -} - -fn brace_end(i: &mut Located<&str>) -> PResult { - let (value, range) = alt(('}', ')', ']')).with_span().parse_next(i)?; - Ok(Token::from_range(range, TokenType::Brace, value.to_string())) -} - -fn comma(i: &mut Located<&str>) -> PResult { - let (value, range) = ','.with_span().parse_next(i)?; - Ok(Token::from_range(range, TokenType::Comma, value.to_string())) -} - -fn hash(i: &mut Located<&str>) -> PResult { - let (value, range) = '#'.with_span().parse_next(i)?; - Ok(Token::from_range(range, TokenType::Hash, value.to_string())) -} - -fn bang(i: &mut Located<&str>) -> PResult { - let (value, range) = '!'.with_span().parse_next(i)?; - Ok(Token::from_range(range, TokenType::Bang, value.to_string())) -} - -fn dollar(i: &mut Located<&str>) -> PResult { - let (value, range) = '$'.with_span().parse_next(i)?; - Ok(Token::from_range(range, TokenType::Dollar, value.to_string())) -} - -fn question_mark(i: &mut Located<&str>) -> PResult { - let (value, range) = '?'.with_span().parse_next(i)?; - Ok(Token::from_range(range, TokenType::QuestionMark, value.to_string())) -} - -fn colon(i: &mut Located<&str>) -> PResult { - let (value, range) = ':'.with_span().parse_next(i)?; - Ok(Token::from_range(range, TokenType::Colon, value.to_string())) -} - -fn period(i: &mut Located<&str>) -> PResult { - let (value, range) = '.'.with_span().parse_next(i)?; - Ok(Token::from_range(range, TokenType::Period, value.to_string())) -} - -fn double_period(i: &mut Located<&str>) -> PResult { - let (value, range) = "..".with_span().parse_next(i)?; - Ok(Token::from_range(range, TokenType::DoublePeriod, value.to_string())) -} - -/// Zero or more of either: -/// 1. Any character except " or \ -/// 2. Any character preceded by \ -fn inner_double_quote(i: &mut Located<&str>) -> PResult<()> { - repeat(0.., alt((none_of(('"', '\\')), preceded('\\', winnow::token::any)))).parse_next(i) -} - -/// Zero or more of either: -/// 1. Any character except ' or \ -/// 2. Any character preceded by \ -fn inner_single_quote(i: &mut Located<&str>) -> PResult<()> { - repeat(0.., alt((none_of(('\'', '\\')), preceded('\\', winnow::token::any)))).parse_next(i) -} - -fn string(i: &mut Located<&str>) -> PResult { - let single_quoted_string = ('\'', inner_single_quote.take(), '\''); - let double_quoted_string = ('"', inner_double_quote.take(), '"'); - let either_quoted_string = alt((single_quoted_string.take(), double_quoted_string.take())); - let (value, range): (&str, _) = either_quoted_string.with_span().parse_next(i)?; - Ok(Token::from_range(range, TokenType::String, value.to_string())) -} - -fn import_keyword(i: &mut Located<&str>) -> PResult { - let (value, range) = "import".with_span().parse_next(i)?; - let token_type = peek(alt((' '.map(|_| TokenType::Keyword), '('.map(|_| TokenType::Word)))).parse_next(i)?; - Ok(Token::from_range(range, token_type, value.to_owned())) -} - -fn unambiguous_keywords(i: &mut Located<&str>) -> PResult { - // These are the keywords themselves. - let keyword_candidates = alt(( - "if", "else", "for", "while", "return", "break", "continue", "fn", "let", "mut", "loop", "true", "false", - "nil", "and", "or", "not", "var", "const", "export", - )); - // Look ahead. If any of these characters follow the keyword, then it's not a keyword, it's just - // the start of a normal word. - let keyword = terminated( - keyword_candidates, - peek(none_of(('a'..='z', 'A'..='Z', '-', '_', '0'..='9'))), - ); - let (value, range) = keyword.with_span().parse_next(i)?; - Ok(Token::from_range(range, TokenType::Keyword, value.to_owned())) -} - -fn keyword(i: &mut Located<&str>) -> PResult { - alt((import_keyword, unambiguous_keywords)).parse_next(i) -} - -fn type_(i: &mut Located<&str>) -> PResult { - // These are the types themselves. - let type_candidates = alt(("string", "number", "bool", "sketch", "sketch_surface", "solid")); - // Look ahead. If any of these characters follow the type, then it's not a type, it's just - // the start of a normal word. - let type_ = terminated( - type_candidates, - peek(none_of(('a'..='z', 'A'..='Z', '-', '_', '0'..='9'))), - ); - let (value, range) = type_.with_span().parse_next(i)?; - Ok(Token::from_range(range, TokenType::Type, value.to_owned())) -} - -#[cfg(test)] -mod tests { - use winnow::Located; - - use super::*; - fn assert_parse_err<'i, P, O, E>(mut p: P, s: &'i str) - where - O: std::fmt::Debug, - P: Parser, O, E>, - { - assert!( - p.parse_next(&mut Located::new(s)).is_err(), - "parsed {s} but should have failed" - ); - } - - fn assert_parse_ok<'i, P, O, E>(mut p: P, s: &'i str) - where - E: std::fmt::Debug, - O: std::fmt::Debug, - P: Parser, O, E>, - { - let res = p.parse_next(&mut Located::new(s)); - assert!(res.is_ok(), "failed to parse {s}, got {}", res.unwrap_err()); - } - - #[test] - fn test_number() { - for valid in [ - "1", "1 abc", "1.1", "1.1 abv", "1.1 abv", "1", ".1", "5?", "5 + 6", "5 + a", "5.5", "1abc", - ] { - assert_parse_ok(number, valid); - } - - for invalid in ["a", "?", "?5"] { - assert_parse_err(number, invalid); - } - - assert_eq!( - number.parse(Located::new("0.0000000000")).unwrap().value, - "0.0000000000" - ); - } - - #[test] - fn test_word() { - for valid in ["a", "a ", "a5", "a5a"] { - assert_parse_ok(word, valid); - } - - for invalid in ["5", "5a", "5a5"] { - assert_parse_err(word, invalid); - } - } - - #[test] - fn test_operator() { - for valid in [ - "+", "+ ", "-", "<=", "<= ", ">=", ">= ", "> ", "< ", "| ", "|> ", "^ ", "% ", "+* ", - ] { - assert_parse_ok(operator, valid); - } - - for invalid in ["5 + 5", "a", "a+", "a+5", "5a+5", ", newVar", ","] { - assert_parse_err(operator, invalid); - } - } - - #[test] - fn test_string() { - for valid in [ - "\"\"", - "\"a\"", - "\"a\" ", - "\"a\"5", - "'a'5", - "\"with escaped \\\" backslash\"", - "\'with escaped \\\' backslash\'", - "'c'", - ] { - assert_parse_ok(string, valid); - } - - for invalid in ["\"", "\"a", "a\"", " \"a\"", "5\"a\"", "a + 'str'"] { - assert_parse_err(string, invalid); - } - } - - fn assert_tokens(expected: Vec, actual: Vec) { - assert_eq!( - expected.len(), - actual.len(), - "\nexpected {} tokens, actually got {}", - expected.len(), - actual.len() - ); - - let n = expected.len(); - for i in 0..n { - assert_eq!( - expected[i], actual[i], - "token #{i} (of {n}) does not match.\nExpected:\n{:#?}\nActual:\n{:#?}", - expected[i], actual[i], - ) - } - } - - #[test] - fn test_program0() { - let program = "const a=5"; - let actual = lexer(program).unwrap(); - let expected = vec![ - Token { - token_type: TokenType::Keyword, - value: "const".to_string(), - start: 0, - end: 5, - }, - Token { - token_type: TokenType::Whitespace, - value: " ".to_string(), - start: 5, - end: 6, - }, - Token { - token_type: TokenType::Word, - value: "a".to_string(), - start: 6, - end: 7, - }, - Token { - token_type: TokenType::Operator, - value: "=".to_string(), - start: 7, - end: 8, - }, - Token { - token_type: TokenType::Number, - value: "5".to_string(), - start: 8, - end: 9, - }, - ]; - assert_tokens(expected, actual); - } - - #[test] - fn test_program1() { - let program = "54 + 22500 + 6"; - let actual = lexer(program).unwrap(); - let expected = vec![ - Token { - token_type: TokenType::Number, - value: "54".to_string(), - start: 0, - end: 2, - }, - Token { - token_type: TokenType::Whitespace, - value: " ".to_string(), - start: 2, - end: 3, - }, - Token { - token_type: TokenType::Operator, - value: "+".to_string(), - start: 3, - end: 4, - }, - Token { - token_type: TokenType::Whitespace, - value: " ".to_string(), - start: 4, - end: 5, - }, - Token { - token_type: TokenType::Number, - value: "22500".to_string(), - start: 5, - end: 10, - }, - Token { - token_type: TokenType::Whitespace, - value: " ".to_string(), - start: 10, - end: 11, - }, - Token { - token_type: TokenType::Operator, - value: "+".to_string(), - start: 11, - end: 12, - }, - Token { - token_type: TokenType::Whitespace, - value: " ".to_string(), - start: 12, - end: 13, - }, - Token { - token_type: TokenType::Number, - value: "6".to_string(), - start: 13, - end: 14, - }, - ]; - assert_tokens(expected, actual); - } - #[test] - fn test_program2() { - let program = r#"const part001 = startSketchAt([0.0000000000, 5.0000000000]) - |> line([0.4900857016, -0.0240763666], %) - -const part002 = "part002" -const things = [part001, 0.0] -let blah = 1 -const foo = false -let baz = {a: 1, part001: "thing"} - -fn ghi = (part001) => { - return part001 -} - -show(part001)"#; - - use TokenType::*; - - let expected = vec![ - Token { - token_type: Keyword, - start: 0, - end: 5, - value: "const".to_owned(), - }, - Token { - token_type: Whitespace, - start: 5, - end: 6, - value: " ".to_owned(), - }, - Token { - token_type: Word, - start: 6, - end: 13, - value: "part001".to_owned(), - }, - Token { - token_type: Whitespace, - start: 13, - end: 14, - value: " ".to_owned(), - }, - Token { - token_type: Operator, - start: 14, - end: 15, - value: "=".to_owned(), - }, - Token { - token_type: Whitespace, - start: 15, - end: 16, - value: " ".to_owned(), - }, - Token { - token_type: Word, - start: 16, - end: 29, - value: "startSketchAt".to_owned(), - }, - Token { - token_type: Brace, - start: 29, - end: 30, - value: "(".to_owned(), - }, - Token { - token_type: Brace, - start: 30, - end: 31, - value: "[".to_owned(), - }, - Token { - token_type: Number, - start: 31, - end: 43, - value: "0.0000000000".to_owned(), - }, - Token { - token_type: Comma, - start: 43, - end: 44, - value: ",".to_owned(), - }, - Token { - token_type: Whitespace, - start: 44, - end: 45, - value: " ".to_owned(), - }, - Token { - token_type: Number, - start: 45, - end: 57, - value: "5.0000000000".to_owned(), - }, - Token { - token_type: Brace, - start: 57, - end: 58, - value: "]".to_owned(), - }, - Token { - token_type: Brace, - start: 58, - end: 59, - value: ")".to_owned(), - }, - Token { - token_type: Whitespace, - start: 59, - end: 64, - value: "\n ".to_owned(), - }, - Token { - token_type: Operator, - start: 64, - end: 66, - value: "|>".to_owned(), - }, - Token { - token_type: Whitespace, - start: 66, - end: 67, - value: " ".to_owned(), - }, - Token { - token_type: Word, - start: 67, - end: 71, - value: "line".to_owned(), - }, - Token { - token_type: Brace, - start: 71, - end: 72, - value: "(".to_owned(), - }, - Token { - token_type: Brace, - start: 72, - end: 73, - value: "[".to_owned(), - }, - Token { - token_type: Number, - start: 73, - end: 85, - value: "0.4900857016".to_owned(), - }, - Token { - token_type: Comma, - start: 85, - end: 86, - value: ",".to_owned(), - }, - Token { - token_type: Whitespace, - start: 86, - end: 87, - value: " ".to_owned(), - }, - Token { - token_type: Operator, - start: 87, - end: 88, - value: "-".to_owned(), - }, - Token { - token_type: Number, - start: 88, - end: 100, - value: "0.0240763666".to_owned(), - }, - Token { - token_type: Brace, - start: 100, - end: 101, - value: "]".to_owned(), - }, - Token { - token_type: Comma, - start: 101, - end: 102, - value: ",".to_owned(), - }, - Token { - token_type: Whitespace, - start: 102, - end: 103, - value: " ".to_owned(), - }, - Token { - token_type: Operator, - start: 103, - end: 104, - value: "%".to_owned(), - }, - Token { - token_type: Brace, - start: 104, - end: 105, - value: ")".to_owned(), - }, - Token { - token_type: Whitespace, - start: 105, - end: 107, - value: "\n\n".to_owned(), - }, - Token { - token_type: Keyword, - start: 107, - end: 112, - value: "const".to_owned(), - }, - Token { - token_type: Whitespace, - start: 112, - end: 113, - value: " ".to_owned(), - }, - Token { - token_type: Word, - start: 113, - end: 120, - value: "part002".to_owned(), - }, - Token { - token_type: Whitespace, - start: 120, - end: 121, - value: " ".to_owned(), - }, - Token { - token_type: Operator, - start: 121, - end: 122, - value: "=".to_owned(), - }, - Token { - token_type: Whitespace, - start: 122, - end: 123, - value: " ".to_owned(), - }, - Token { - token_type: String, - start: 123, - end: 132, - value: "\"part002\"".to_owned(), - }, - Token { - token_type: Whitespace, - start: 132, - end: 133, - value: "\n".to_owned(), - }, - Token { - token_type: Keyword, - start: 133, - end: 138, - value: "const".to_owned(), - }, - Token { - token_type: Whitespace, - start: 138, - end: 139, - value: " ".to_owned(), - }, - Token { - token_type: Word, - start: 139, - end: 145, - value: "things".to_owned(), - }, - Token { - token_type: Whitespace, - start: 145, - end: 146, - value: " ".to_owned(), - }, - Token { - token_type: Operator, - start: 146, - end: 147, - value: "=".to_owned(), - }, - Token { - token_type: Whitespace, - start: 147, - end: 148, - value: " ".to_owned(), - }, - Token { - token_type: Brace, - start: 148, - end: 149, - value: "[".to_owned(), - }, - Token { - token_type: Word, - start: 149, - end: 156, - value: "part001".to_owned(), - }, - Token { - token_type: Comma, - start: 156, - end: 157, - value: ",".to_owned(), - }, - Token { - token_type: Whitespace, - start: 157, - end: 158, - value: " ".to_owned(), - }, - Token { - token_type: Number, - start: 158, - end: 161, - value: "0.0".to_owned(), - }, - Token { - token_type: Brace, - start: 161, - end: 162, - value: "]".to_owned(), - }, - Token { - token_type: Whitespace, - start: 162, - end: 163, - value: "\n".to_owned(), - }, - Token { - token_type: Keyword, - start: 163, - end: 166, - value: "let".to_owned(), - }, - Token { - token_type: Whitespace, - start: 166, - end: 167, - value: " ".to_owned(), - }, - Token { - token_type: Word, - start: 167, - end: 171, - value: "blah".to_owned(), - }, - Token { - token_type: Whitespace, - start: 171, - end: 172, - value: " ".to_owned(), - }, - Token { - token_type: Operator, - start: 172, - end: 173, - value: "=".to_owned(), - }, - Token { - token_type: Whitespace, - start: 173, - end: 174, - value: " ".to_owned(), - }, - Token { - token_type: Number, - start: 174, - end: 175, - value: "1".to_owned(), - }, - Token { - token_type: Whitespace, - start: 175, - end: 176, - value: "\n".to_owned(), - }, - Token { - token_type: Keyword, - start: 176, - end: 181, - value: "const".to_owned(), - }, - Token { - token_type: Whitespace, - start: 181, - end: 182, - value: " ".to_owned(), - }, - Token { - token_type: Word, - start: 182, - end: 185, - value: "foo".to_owned(), - }, - Token { - token_type: Whitespace, - start: 185, - end: 186, - value: " ".to_owned(), - }, - Token { - token_type: Operator, - start: 186, - end: 187, - value: "=".to_owned(), - }, - Token { - token_type: Whitespace, - start: 187, - end: 188, - value: " ".to_owned(), - }, - Token { - token_type: Keyword, - start: 188, - end: 193, - value: "false".to_owned(), - }, - Token { - token_type: Whitespace, - start: 193, - end: 194, - value: "\n".to_owned(), - }, - Token { - token_type: Keyword, - start: 194, - end: 197, - value: "let".to_owned(), - }, - Token { - token_type: Whitespace, - start: 197, - end: 198, - value: " ".to_owned(), - }, - Token { - token_type: Word, - start: 198, - end: 201, - value: "baz".to_owned(), - }, - Token { - token_type: Whitespace, - start: 201, - end: 202, - value: " ".to_owned(), - }, - Token { - token_type: Operator, - start: 202, - end: 203, - value: "=".to_owned(), - }, - Token { - token_type: Whitespace, - start: 203, - end: 204, - value: " ".to_owned(), - }, - Token { - token_type: Brace, - start: 204, - end: 205, - value: "{".to_owned(), - }, - Token { - token_type: Word, - start: 205, - end: 206, - value: "a".to_owned(), - }, - Token { - token_type: Colon, - start: 206, - end: 207, - value: ":".to_owned(), - }, - Token { - token_type: Whitespace, - start: 207, - end: 208, - value: " ".to_owned(), - }, - Token { - token_type: Number, - start: 208, - end: 209, - value: "1".to_owned(), - }, - Token { - token_type: Comma, - start: 209, - end: 210, - value: ",".to_owned(), - }, - Token { - token_type: Whitespace, - start: 210, - end: 211, - value: " ".to_owned(), - }, - Token { - token_type: Word, - start: 211, - end: 218, - value: "part001".to_owned(), - }, - Token { - token_type: Colon, - start: 218, - end: 219, - value: ":".to_owned(), - }, - Token { - token_type: Whitespace, - start: 219, - end: 220, - value: " ".to_owned(), - }, - Token { - token_type: String, - start: 220, - end: 227, - value: "\"thing\"".to_owned(), - }, - Token { - token_type: Brace, - start: 227, - end: 228, - value: "}".to_owned(), - }, - Token { - token_type: Whitespace, - start: 228, - end: 230, - value: "\n\n".to_owned(), - }, - Token { - token_type: Keyword, - start: 230, - end: 232, - value: "fn".to_owned(), - }, - Token { - token_type: Whitespace, - start: 232, - end: 233, - value: " ".to_owned(), - }, - Token { - token_type: Word, - start: 233, - end: 236, - value: "ghi".to_owned(), - }, - Token { - token_type: Whitespace, - start: 236, - end: 237, - value: " ".to_owned(), - }, - Token { - token_type: Operator, - start: 237, - end: 238, - value: "=".to_owned(), - }, - Token { - token_type: Whitespace, - start: 238, - end: 239, - value: " ".to_owned(), - }, - Token { - token_type: Brace, - start: 239, - end: 240, - value: "(".to_owned(), - }, - Token { - token_type: Word, - start: 240, - end: 247, - value: "part001".to_owned(), - }, - Token { - token_type: Brace, - start: 247, - end: 248, - value: ")".to_owned(), - }, - Token { - token_type: Whitespace, - start: 248, - end: 249, - value: " ".to_owned(), - }, - Token { - token_type: Operator, - start: 249, - end: 251, - value: "=>".to_owned(), - }, - Token { - token_type: Whitespace, - start: 251, - end: 252, - value: " ".to_owned(), - }, - Token { - token_type: Brace, - start: 252, - end: 253, - value: "{".to_owned(), - }, - Token { - token_type: Whitespace, - start: 253, - end: 256, - value: "\n ".to_owned(), - }, - Token { - token_type: Keyword, - start: 256, - end: 262, - value: "return".to_owned(), - }, - Token { - token_type: Whitespace, - start: 262, - end: 263, - value: " ".to_owned(), - }, - Token { - token_type: Word, - start: 263, - end: 270, - value: "part001".to_owned(), - }, - Token { - token_type: Whitespace, - start: 270, - end: 271, - value: "\n".to_owned(), - }, - Token { - token_type: Brace, - start: 271, - end: 272, - value: "}".to_owned(), - }, - Token { - token_type: Whitespace, - start: 272, - end: 274, - value: "\n\n".to_owned(), - }, - Token { - token_type: Word, - start: 274, - end: 278, - value: "show".to_owned(), - }, - Token { - token_type: Brace, - start: 278, - end: 279, - value: "(".to_owned(), - }, - Token { - token_type: Word, - start: 279, - end: 286, - value: "part001".to_owned(), - }, - Token { - token_type: Brace, - start: 286, - end: 287, - value: ")".to_owned(), - }, - ]; - let actual = lexer(program).unwrap(); - assert_tokens(expected, actual); - } - - #[test] - fn test_program3() { - let program = r#" -// this is a comment -const yo = { a: { b: { c: '123' } } } - -const key = 'c' -const things = "things" - -// this is also a comment"#; - let actual = lexer(program).unwrap(); - use TokenType::*; - let expected = vec![ - Token { - token_type: Whitespace, - start: 0, - end: 1, - value: "\n".to_owned(), - }, - Token { - token_type: LineComment, - start: 1, - end: 21, - value: "// this is a comment".to_owned(), - }, - Token { - token_type: Whitespace, - start: 21, - end: 22, - value: "\n".to_owned(), - }, - Token { - token_type: Keyword, - start: 22, - end: 27, - value: "const".to_owned(), - }, - Token { - token_type: Whitespace, - start: 27, - end: 28, - value: " ".to_owned(), - }, - Token { - token_type: Word, - start: 28, - end: 30, - value: "yo".to_owned(), - }, - Token { - token_type: Whitespace, - start: 30, - end: 31, - value: " ".to_owned(), - }, - Token { - token_type: Operator, - start: 31, - end: 32, - value: "=".to_owned(), - }, - Token { - token_type: Whitespace, - start: 32, - end: 33, - value: " ".to_owned(), - }, - Token { - token_type: Brace, - start: 33, - end: 34, - value: "{".to_owned(), - }, - Token { - token_type: Whitespace, - start: 34, - end: 35, - value: " ".to_owned(), - }, - Token { - token_type: Word, - start: 35, - end: 36, - value: "a".to_owned(), - }, - Token { - token_type: Colon, - start: 36, - end: 37, - value: ":".to_owned(), - }, - Token { - token_type: Whitespace, - start: 37, - end: 38, - value: " ".to_owned(), - }, - Token { - token_type: Brace, - start: 38, - end: 39, - value: "{".to_owned(), - }, - Token { - token_type: Whitespace, - start: 39, - end: 40, - value: " ".to_owned(), - }, - Token { - token_type: Word, - start: 40, - end: 41, - value: "b".to_owned(), - }, - Token { - token_type: Colon, - start: 41, - end: 42, - value: ":".to_owned(), - }, - Token { - token_type: Whitespace, - start: 42, - end: 43, - value: " ".to_owned(), - }, - Token { - token_type: Brace, - start: 43, - end: 44, - value: "{".to_owned(), - }, - Token { - token_type: Whitespace, - start: 44, - end: 45, - value: " ".to_owned(), - }, - Token { - token_type: Word, - start: 45, - end: 46, - value: "c".to_owned(), - }, - Token { - token_type: Colon, - start: 46, - end: 47, - value: ":".to_owned(), - }, - Token { - token_type: Whitespace, - start: 47, - end: 48, - value: " ".to_owned(), - }, - Token { - token_type: String, - start: 48, - end: 53, - value: "'123'".to_owned(), - }, - Token { - token_type: Whitespace, - start: 53, - end: 54, - value: " ".to_owned(), - }, - Token { - token_type: Brace, - start: 54, - end: 55, - value: "}".to_owned(), - }, - Token { - token_type: Whitespace, - start: 55, - end: 56, - value: " ".to_owned(), - }, - Token { - token_type: Brace, - start: 56, - end: 57, - value: "}".to_owned(), - }, - Token { - token_type: Whitespace, - start: 57, - end: 58, - value: " ".to_owned(), - }, - Token { - token_type: Brace, - start: 58, - end: 59, - value: "}".to_owned(), - }, - Token { - token_type: Whitespace, - start: 59, - end: 61, - value: "\n\n".to_owned(), - }, - Token { - token_type: Keyword, - start: 61, - end: 66, - value: "const".to_owned(), - }, - Token { - token_type: Whitespace, - start: 66, - end: 67, - value: " ".to_owned(), - }, - Token { - token_type: Word, - start: 67, - end: 70, - value: "key".to_owned(), - }, - Token { - token_type: Whitespace, - start: 70, - end: 71, - value: " ".to_owned(), - }, - Token { - token_type: Operator, - start: 71, - end: 72, - value: "=".to_owned(), - }, - Token { - token_type: Whitespace, - start: 72, - end: 73, - value: " ".to_owned(), - }, - Token { - token_type: String, - start: 73, - end: 76, - value: "'c'".to_owned(), - }, - Token { - token_type: Whitespace, - start: 76, - end: 77, - value: "\n".to_owned(), - }, - Token { - token_type: Keyword, - start: 77, - end: 82, - value: "const".to_owned(), - }, - Token { - token_type: Whitespace, - start: 82, - end: 83, - value: " ".to_owned(), - }, - Token { - token_type: Word, - start: 83, - end: 89, - value: "things".to_owned(), - }, - Token { - token_type: Whitespace, - start: 89, - end: 90, - value: " ".to_owned(), - }, - Token { - token_type: Operator, - start: 90, - end: 91, - value: "=".to_owned(), - }, - Token { - token_type: Whitespace, - start: 91, - end: 92, - value: " ".to_owned(), - }, - Token { - token_type: String, - start: 92, - end: 100, - value: "\"things\"".to_owned(), - }, - Token { - token_type: Whitespace, - start: 100, - end: 102, - value: "\n\n".to_owned(), - }, - Token { - token_type: LineComment, - start: 102, - end: 127, - value: "// this is also a comment".to_owned(), - }, - ]; - assert_tokens(expected, actual); - } - - #[test] - fn test_program4() { - let program = "const myArray = [0..10]"; - use TokenType::*; - let expected = vec![ - Token { - token_type: Keyword, - start: 0, - end: 5, - value: "const".to_owned(), - }, - Token { - token_type: Whitespace, - start: 5, - end: 6, - value: " ".to_owned(), - }, - Token { - token_type: Word, - start: 6, - end: 13, - value: "myArray".to_owned(), - }, - Token { - token_type: Whitespace, - start: 13, - end: 14, - value: " ".to_owned(), - }, - Token { - token_type: Operator, - start: 14, - end: 15, - value: "=".to_owned(), - }, - Token { - token_type: Whitespace, - start: 15, - end: 16, - value: " ".to_owned(), - }, - Token { - token_type: Brace, - start: 16, - end: 17, - value: "[".to_owned(), - }, - Token { - token_type: Number, - start: 17, - end: 18, - value: "0".to_owned(), - }, - Token { - token_type: DoublePeriod, - start: 18, - end: 20, - value: "..".to_owned(), - }, - Token { - token_type: Number, - start: 20, - end: 22, - value: "10".to_owned(), - }, - Token { - token_type: Brace, - start: 22, - end: 23, - value: "]".to_owned(), - }, - ]; - let actual = lexer(program).unwrap(); - assert_tokens(expected, actual); - } - - #[test] - fn test_kitt() { - let program = include_str!("../../../tests/executor/inputs/kittycad_svg.kcl"); - let actual = lexer(program).unwrap(); - assert_eq!(actual.len(), 5103); - } - #[test] - fn test_pipes_on_pipes() { - let program = include_str!("../../../tests/executor/inputs/pipes_on_pipes.kcl"); - let actual = lexer(program).unwrap(); - assert_eq!(actual.len(), 17841); - } - #[test] - fn test_lexer_negative_word() { - let actual = lexer("-legX").unwrap(); - let expected = vec![ - Token { - token_type: TokenType::Operator, - value: "-".to_string(), - start: 0, - end: 1, - }, - Token { - token_type: TokenType::Word, - value: "legX".to_string(), - start: 1, - end: 5, - }, - ]; - assert_tokens(expected, actual); - } - - #[test] - fn not_eq() { - let actual = lexer("!=").unwrap(); - let expected = vec![Token { - token_type: TokenType::Operator, - value: "!=".to_owned(), - start: 0, - end: 2, - }]; - assert_eq!(actual, expected); - } - - #[test] - fn test_unrecognized_token() { - let actual = lexer("12 ; 8").unwrap(); - let expected = vec![ - Token { - token_type: TokenType::Number, - value: "12".to_string(), - start: 0, - end: 2, - }, - Token { - token_type: TokenType::Whitespace, - value: " ".to_string(), - start: 2, - end: 3, - }, - Token { - token_type: TokenType::Unknown, - value: ";".to_string(), - start: 3, - end: 4, - }, - Token { - token_type: TokenType::Whitespace, - value: " ".to_string(), - start: 4, - end: 5, - }, - Token { - token_type: TokenType::Number, - value: "8".to_string(), - start: 5, - end: 6, - }, - ]; - - assert_tokens(expected, actual); - } - - #[test] - fn import_keyword() { - let actual = lexer("import foo").unwrap(); - let expected = Token { - token_type: TokenType::Keyword, - value: "import".to_owned(), - start: 0, - end: 6, - }; - assert_eq!(actual[0], expected); - } - - #[test] - fn import_function() { - let actual = lexer("import(3)").unwrap(); - let expected = Token { - token_type: TokenType::Word, - value: "import".to_owned(), - start: 0, - end: 6, - }; - assert_eq!(actual[0], expected); - } -} diff --git a/src/wasm-lib/kcl/src/unparser.rs b/src/wasm-lib/kcl/src/unparser.rs index 5bc1e7d48..92469f2f9 100644 --- a/src/wasm-lib/kcl/src/unparser.rs +++ b/src/wasm-lib/kcl/src/unparser.rs @@ -1,27 +1,35 @@ use std::fmt::Write; -use crate::{ +use crate::parsing::{ ast::types::{ ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryOperator, BinaryPart, BodyItem, CallExpression, - Expr, FormatOptions, FunctionExpression, IfExpression, ImportStatement, ItemVisibility, Literal, - LiteralIdentifier, LiteralValue, MemberExpression, MemberObject, NonCodeValue, ObjectExpression, + CallExpressionKw, CommentStyle, DefaultParamVal, Expr, FnArgType, FormatOptions, FunctionExpression, + IfExpression, ImportSelector, ImportStatement, ItemVisibility, LabeledArg, Literal, LiteralIdentifier, + LiteralValue, MemberExpression, MemberObject, Node, NonCodeNode, NonCodeValue, ObjectExpression, Parameter, PipeExpression, Program, TagDeclarator, UnaryExpression, VariableDeclaration, VariableKind, }, - parser::PIPE_OPERATOR, + PIPE_OPERATOR, }; impl Program { pub fn recast(&self, options: &FormatOptions, indentation_level: usize) -> String { let indentation = options.get_indentation(indentation_level); + + let result = self + .shebang + .as_ref() + .map(|sh| format!("{}\n\n", sh.inner.content)) + .unwrap_or_default(); + let result = self .body .iter() - .map(|statement| match statement.clone() { + .map(|body_item| match body_item.clone() { BodyItem::ImportStatement(stmt) => stmt.recast(options, indentation_level), BodyItem::ExpressionStatement(expression_statement) => { expression_statement .expression - .recast(options, indentation_level, false) + .recast(options, indentation_level, ExprContext::Other) } BodyItem::VariableDeclaration(variable_declaration) => { variable_declaration.recast(options, indentation_level) @@ -30,21 +38,24 @@ impl Program { format!( "{}return {}", indentation, - return_statement.argument.recast(options, 0, false) + return_statement + .argument + .recast(options, indentation_level, ExprContext::Other) + .trim_start() ) } }) .enumerate() - .fold(String::new(), |mut output, (index, recast_str)| { + .fold(result, |mut output, (index, recast_str)| { let start_string = if index == 0 { // We need to indent. - if self.non_code_meta.start.is_empty() { + if self.non_code_meta.start_nodes.is_empty() { indentation.to_string() } else { self.non_code_meta - .start + .start_nodes .iter() - .map(|start| start.format(&indentation)) + .map(|start| start.recast(options, indentation_level)) .collect() } } else { @@ -65,7 +76,7 @@ impl Program { .iter() .enumerate() .map(|(i, custom_white_space_or_comment)| { - let formatted = custom_white_space_or_comment.format(&indentation); + let formatted = custom_white_space_or_comment.recast(options, indentation_level); if i == 0 && !formatted.trim().is_empty() { if let NonCodeValue::BlockComment { .. } = custom_white_space_or_comment.value { format!("\n{}", formatted) @@ -104,7 +115,75 @@ impl NonCodeValue { fn should_cause_array_newline(&self) -> bool { match self { Self::InlineComment { .. } => false, - Self::Shebang { .. } | Self::BlockComment { .. } | Self::NewLineBlockComment { .. } | Self::NewLine => true, + Self::BlockComment { .. } | Self::NewLineBlockComment { .. } | Self::NewLine | Self::Annotation { .. } => { + true + } + } + } +} + +impl Node { + fn recast(&self, options: &FormatOptions, indentation_level: usize) -> String { + let indentation = options.get_indentation(indentation_level); + match &self.value { + NonCodeValue::InlineComment { + value, + style: CommentStyle::Line, + } => format!(" // {}\n", value), + NonCodeValue::InlineComment { + value, + style: CommentStyle::Block, + } => format!(" /* {} */", value), + NonCodeValue::BlockComment { value, style } => match style { + CommentStyle::Block => format!("{}/* {} */", indentation, value), + CommentStyle::Line => { + if value.trim().is_empty() { + format!("{}//\n", indentation) + } else { + format!("{}// {}\n", indentation, value.trim()) + } + } + }, + NonCodeValue::NewLineBlockComment { value, style } => { + let add_start_new_line = if self.start == 0 { "" } else { "\n\n" }; + match style { + CommentStyle::Block => format!("{}{}/* {} */\n", add_start_new_line, indentation, value), + CommentStyle::Line => { + if value.trim().is_empty() { + format!("{}{}//\n", add_start_new_line, indentation) + } else { + format!("{}{}// {}\n", add_start_new_line, indentation, value.trim()) + } + } + } + } + NonCodeValue::NewLine => "\n\n".to_string(), + NonCodeValue::Annotation { name, properties } => { + let mut result = "@".to_owned(); + result.push_str(&name.name); + if let Some(properties) = properties { + result.push('('); + result.push_str( + &properties + .iter() + .map(|prop| { + format!( + "{} = {}", + prop.key.name, + prop.value + .recast(options, indentation_level + 1, ExprContext::Other) + .trim() + ) + }) + .collect::>() + .join(", "), + ); + result.push(')'); + result.push('\n'); + } + + result + } } } } @@ -112,41 +191,83 @@ impl NonCodeValue { impl ImportStatement { pub fn recast(&self, options: &FormatOptions, indentation_level: usize) -> String { let indentation = options.get_indentation(indentation_level); - let mut string = format!("{}import ", indentation); - for (i, item) in self.items.iter().enumerate() { - if i > 0 { - string.push_str(", "); - } - string.push_str(&item.name.name); - if let Some(alias) = &item.alias { - // If the alias is the same, don't output it. - if item.name.name != alias.name { - string.push_str(&format!(" as {}", alias.name)); + let vis = if self.visibility == ItemVisibility::Export { + "export " + } else { + "" + }; + let mut string = format!("{}{}import ", vis, indentation); + match &self.selector { + ImportSelector::List { items } => { + for (i, item) in items.iter().enumerate() { + if i > 0 { + string.push_str(", "); + } + string.push_str(&item.name.name); + if let Some(alias) = &item.alias { + // If the alias is the same, don't output it. + if item.name.name != alias.name { + string.push_str(&format!(" as {}", alias.name)); + } + } } + string.push_str(" from "); } + ImportSelector::Glob(_) => string.push_str("* from "), + ImportSelector::None { .. } => {} + } + string.push_str(&format!("\"{}\"", self.path)); + + if let ImportSelector::None { alias: Some(alias) } = &self.selector { + string.push_str(" as "); + string.push_str(&alias.name); } - string.push_str(&format!(" from {}", self.raw_path)); string } } +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +pub(crate) enum ExprContext { + Pipe, + Decl, + Other, +} + impl Expr { - pub(crate) fn recast(&self, options: &FormatOptions, indentation_level: usize, is_in_pipe: bool) -> String { + pub(crate) fn recast(&self, options: &FormatOptions, indentation_level: usize, mut ctxt: ExprContext) -> String { + let is_decl = matches!(ctxt, ExprContext::Decl); + if is_decl { + // Just because this expression is being bound to a variable, doesn't mean that every child + // expression is being bound. So, reset the expression context if necessary. + // This will still preserve the "::Pipe" context though. + ctxt = ExprContext::Other; + } match &self { Expr::BinaryExpression(bin_exp) => bin_exp.recast(options), - Expr::ArrayExpression(array_exp) => array_exp.recast(options, indentation_level, is_in_pipe), - Expr::ArrayRangeExpression(range_exp) => range_exp.recast(options, indentation_level, is_in_pipe), - Expr::ObjectExpression(ref obj_exp) => obj_exp.recast(options, indentation_level, is_in_pipe), + Expr::ArrayExpression(array_exp) => array_exp.recast(options, indentation_level, ctxt), + Expr::ArrayRangeExpression(range_exp) => range_exp.recast(options, indentation_level, ctxt), + Expr::ObjectExpression(ref obj_exp) => obj_exp.recast(options, indentation_level, ctxt), Expr::MemberExpression(mem_exp) => mem_exp.recast(), Expr::Literal(literal) => literal.recast(), - Expr::FunctionExpression(func_exp) => func_exp.recast(options, indentation_level), - Expr::CallExpression(call_exp) => call_exp.recast(options, indentation_level, is_in_pipe), + Expr::FunctionExpression(func_exp) => { + let mut result = if is_decl { String::new() } else { "fn".to_owned() }; + result += &func_exp.recast(options, indentation_level); + result + } + Expr::CallExpression(call_exp) => call_exp.recast(options, indentation_level, ctxt), + Expr::CallExpressionKw(call_exp) => call_exp.recast(options, indentation_level, ctxt), Expr::Identifier(ident) => ident.name.to_string(), Expr::TagDeclarator(tag) => tag.recast(), Expr::PipeExpression(pipe_exp) => pipe_exp.recast(options, indentation_level), Expr::UnaryExpression(unary_exp) => unary_exp.recast(options), - Expr::IfExpression(e) => e.recast(options, indentation_level, is_in_pipe), - Expr::PipeSubstitution(_) => crate::parser::PIPE_SUBSTITUTION_OPERATOR.to_string(), + Expr::IfExpression(e) => e.recast(options, indentation_level, ctxt), + Expr::PipeSubstitution(_) => crate::parsing::PIPE_SUBSTITUTION_OPERATOR.to_string(), + Expr::LabelledExpression(e) => { + let mut result = e.expr.recast(options, indentation_level, ctxt); + result += " as "; + result += &e.label.name; + result + } Expr::None(_) => { unimplemented!("there is no literal None, see https://github.com/KittyCAD/modeling-app/issues/1115") } @@ -160,19 +281,24 @@ impl BinaryPart { BinaryPart::Literal(literal) => literal.recast(), BinaryPart::Identifier(identifier) => identifier.name.to_string(), BinaryPart::BinaryExpression(binary_expression) => binary_expression.recast(options), - BinaryPart::CallExpression(call_expression) => call_expression.recast(options, indentation_level, false), + BinaryPart::CallExpression(call_expression) => { + call_expression.recast(options, indentation_level, ExprContext::Other) + } + BinaryPart::CallExpressionKw(call_expression) => { + call_expression.recast(options, indentation_level, ExprContext::Other) + } BinaryPart::UnaryExpression(unary_expression) => unary_expression.recast(options), BinaryPart::MemberExpression(member_expression) => member_expression.recast(), - BinaryPart::IfExpression(e) => e.recast(options, indentation_level, false), + BinaryPart::IfExpression(e) => e.recast(options, indentation_level, ExprContext::Other), } } } impl CallExpression { - fn recast(&self, options: &FormatOptions, indentation_level: usize, is_in_pipe: bool) -> String { + fn recast(&self, options: &FormatOptions, indentation_level: usize, ctxt: ExprContext) -> String { format!( "{}{}({})", - if is_in_pipe { + if ctxt == ExprContext::Pipe { "".to_string() } else { options.get_indentation(indentation_level) @@ -180,48 +306,80 @@ impl CallExpression { self.callee.name, self.arguments .iter() - .map(|arg| arg.recast(options, indentation_level, is_in_pipe)) + .map(|arg| arg.recast(options, indentation_level, ctxt)) .collect::>() .join(", ") ) } } +impl CallExpressionKw { + fn recast(&self, options: &FormatOptions, indentation_level: usize, ctxt: ExprContext) -> String { + let indent = if ctxt == ExprContext::Pipe { + "".to_string() + } else { + options.get_indentation(indentation_level) + }; + let name = &self.callee.name; + let mut arg_list = if let Some(first_arg) = &self.unlabeled { + vec![first_arg.recast(options, indentation_level, ctxt)] + } else { + Vec::new() + }; + arg_list.extend( + self.arguments + .iter() + .map(|arg| arg.recast(options, indentation_level, ctxt)), + ); + let args = arg_list.join(", "); + format!("{indent}{name}({args})") + } +} + +impl LabeledArg { + fn recast(&self, options: &FormatOptions, indentation_level: usize, ctxt: ExprContext) -> String { + let label = &self.label.name; + let arg = self.arg.recast(options, indentation_level, ctxt); + format!("{label} = {arg}") + } +} + impl VariableDeclaration { pub fn recast(&self, options: &FormatOptions, indentation_level: usize) -> String { let indentation = options.get_indentation(indentation_level); - let output = match self.visibility { + let mut output = match self.visibility { ItemVisibility::Default => String::new(), ItemVisibility::Export => "export ".to_owned(), }; - self.declarations.iter().fold(output, |mut output, declaration| { - let keyword = match self.kind { - VariableKind::Fn => "fn ", - VariableKind::Const => "", - }; - let _ = write!( - output, - "{}{keyword}{} = {}", - indentation, - declaration.id.name, - declaration.init.recast(options, indentation_level, false).trim() - ); - output - }) + + let (keyword, eq) = match self.kind { + VariableKind::Fn => ("fn ", ""), + VariableKind::Const => ("", " = "), + }; + let _ = write!( + output, + "{}{keyword}{}{eq}{}", + indentation, + self.declaration.id.name, + self.declaration + .init + .recast(options, indentation_level, ExprContext::Decl) + .trim() + ); + output } } impl Literal { fn recast(&self) -> String { match self.value { - LiteralValue::Fractional(x) => { - if x.fract() == 0.0 { + LiteralValue::Number(x) => { + if self.raw.contains('.') && x.fract() == 0.0 { format!("{x:?}") } else { self.raw.clone() } } - LiteralValue::IInteger(_) => self.raw.clone(), LiteralValue::String(ref s) => { let quote = if self.raw.trim().starts_with('"') { '"' } else { '\'' }; format!("{quote}{s}{quote}") @@ -239,7 +397,7 @@ impl TagDeclarator { } impl ArrayExpression { - fn recast(&self, options: &FormatOptions, indentation_level: usize, is_in_pipe: bool) -> String { + fn recast(&self, options: &FormatOptions, indentation_level: usize, ctxt: ExprContext) -> String { // Reconstruct the order of items in the array. // An item can be an element (i.e. an expression for a KCL value), // or a non-code item (e.g. a comment) @@ -253,12 +411,12 @@ impl ArrayExpression { .iter() .map(|nc| { found_line_comment |= nc.value.should_cause_array_newline(); - nc.format("") + nc.recast(options, 0) }) .collect::>() } else { let el = elems.next().unwrap(); - let s = format!("{}, ", el.recast(options, 0, false)); + let s = format!("{}, ", el.recast(options, 0, ExprContext::Other)); vec![s] } }) @@ -281,7 +439,7 @@ impl ArrayExpression { } // Otherwise, we format a multi-line representation. - let inner_indentation = if is_in_pipe { + let inner_indentation = if ctxt == ExprContext::Pipe { options.get_indentation_offset_pipe(indentation_level + 1) } else { options.get_indentation(indentation_level + 1) @@ -298,7 +456,7 @@ impl ArrayExpression { .collect::>() .join("") .to_owned(); - let end_indent = if is_in_pipe { + let end_indent = if ctxt == ExprContext::Pipe { options.get_indentation_offset_pipe(indentation_level) } else { options.get_indentation(indentation_level) @@ -316,20 +474,22 @@ fn expr_is_trivial(expr: &Expr) -> bool { Expr::BinaryExpression(_) | Expr::FunctionExpression(_) | Expr::CallExpression(_) + | Expr::CallExpressionKw(_) | Expr::PipeExpression(_) | Expr::ArrayExpression(_) | Expr::ArrayRangeExpression(_) | Expr::ObjectExpression(_) | Expr::MemberExpression(_) | Expr::UnaryExpression(_) - | Expr::IfExpression(_) => false, + | Expr::IfExpression(_) + | Expr::LabelledExpression(_) => false, } } impl ArrayRangeExpression { - fn recast(&self, options: &FormatOptions, _: usize, _: bool) -> String { - let s1 = self.start_element.recast(options, 0, false); - let s2 = self.end_element.recast(options, 0, false); + fn recast(&self, options: &FormatOptions, _: usize, _: ExprContext) -> String { + let s1 = self.start_element.recast(options, 0, ExprContext::Other); + let s2 = self.end_element.recast(options, 0, ExprContext::Other); // Format these items into a one-line array. Put spaces around the `..` if either expression // is non-trivial. This is a bit arbitrary but people seem to like simple ranges to be formatted @@ -346,14 +506,14 @@ impl ArrayRangeExpression { } impl ObjectExpression { - fn recast(&self, options: &FormatOptions, indentation_level: usize, is_in_pipe: bool) -> String { + fn recast(&self, options: &FormatOptions, indentation_level: usize, ctxt: ExprContext) -> String { if self .non_code_meta .non_code_nodes .values() .any(|nc| nc.iter().any(|nc| nc.value.should_cause_array_newline())) { - return self.recast_multi_line(options, indentation_level, is_in_pipe); + return self.recast_multi_line(options, indentation_level, ctxt); } let flat_recast = format!( "{{ {} }}", @@ -361,9 +521,9 @@ impl ObjectExpression { .iter() .map(|prop| { format!( - "{}: {}", + "{} = {}", prop.key.name, - prop.value.recast(options, indentation_level + 1, is_in_pipe).trim() + prop.value.recast(options, indentation_level + 1, ctxt).trim() ) }) .collect::>() @@ -374,12 +534,12 @@ impl ObjectExpression { if !needs_multiple_lines { return flat_recast; } - self.recast_multi_line(options, indentation_level, is_in_pipe) + self.recast_multi_line(options, indentation_level, ctxt) } /// Recast, but always outputs the object with newlines between each property. - fn recast_multi_line(&self, options: &FormatOptions, indentation_level: usize, is_in_pipe: bool) -> String { - let inner_indentation = if is_in_pipe { + fn recast_multi_line(&self, options: &FormatOptions, indentation_level: usize, ctxt: ExprContext) -> String { + let inner_indentation = if ctxt == ExprContext::Pipe { options.get_indentation_offset_pipe(indentation_level + 1) } else { options.get_indentation(indentation_level + 1) @@ -389,21 +549,21 @@ impl ObjectExpression { let format_items: Vec<_> = (0..num_items) .flat_map(|i| { if let Some(noncode) = self.non_code_meta.non_code_nodes.get(&i) { - noncode.iter().map(|nc| nc.format("")).collect::>() + noncode.iter().map(|nc| nc.recast(options, 0)).collect::>() } else { let prop = props.next().unwrap(); // Use a comma unless it's the last item let comma = if i == num_items - 1 { "" } else { ",\n" }; let s = format!( - "{}: {}{comma}", + "{} = {}{comma}", prop.key.name, - prop.value.recast(options, indentation_level + 1, is_in_pipe).trim() + prop.value.recast(options, indentation_level + 1, ctxt).trim() ); vec![s] } }) .collect(); - let end_indent = if is_in_pipe { + let end_indent = if ctxt == ExprContext::Pipe { options.get_indentation_offset_pipe(indentation_level) } else { options.get_indentation(indentation_level) @@ -475,6 +635,7 @@ impl UnaryExpression { | BinaryPart::Identifier(_) | BinaryPart::MemberExpression(_) | BinaryPart::IfExpression(_) + | BinaryPart::CallExpressionKw(_) | BinaryPart::CallExpression(_) => { format!("{}{}", &self.operator, self.argument.recast(options, 0)) } @@ -486,17 +647,17 @@ impl UnaryExpression { } impl IfExpression { - fn recast(&self, options: &FormatOptions, indentation_level: usize, is_in_pipe: bool) -> String { + fn recast(&self, options: &FormatOptions, indentation_level: usize, ctxt: ExprContext) -> String { // We can calculate how many lines this will take, so let's do it and avoid growing the vec. // Total lines = starting lines, else-if lines, ending lines. let n = 2 + (self.else_ifs.len() * 2) + 3; let mut lines = Vec::with_capacity(n); - let cond = self.cond.recast(options, indentation_level, is_in_pipe); + let cond = self.cond.recast(options, indentation_level, ctxt); lines.push((0, format!("if {cond} {{"))); lines.push((1, self.then_val.recast(options, indentation_level + 1))); for else_if in &self.else_ifs { - let cond = else_if.cond.recast(options, indentation_level, is_in_pipe); + let cond = else_if.cond.recast(options, indentation_level, ctxt); lines.push((0, format!("}} else if {cond} {{"))); lines.push((1, else_if.then_val.recast(options, indentation_level + 1))); } @@ -511,7 +672,7 @@ impl IfExpression { } } -impl PipeExpression { +impl Node { fn recast(&self, options: &FormatOptions, indentation_level: usize) -> String { let pipe = self .body @@ -519,15 +680,18 @@ impl PipeExpression { .enumerate() .map(|(index, statement)| { let indentation = options.get_indentation(indentation_level + 1); - let mut s = statement.recast(options, indentation_level + 1, true); + let mut s = statement.recast(options, indentation_level + 1, ExprContext::Pipe); let non_code_meta = self.non_code_meta.clone(); if let Some(non_code_meta_value) = non_code_meta.non_code_nodes.get(&index) { for val in non_code_meta_value { let formatted = if val.end == self.end { - let indentation = options.get_indentation(indentation_level); - val.format(&indentation).trim_end_matches('\n').to_string() + val.recast(options, indentation_level) + .trim_end_matches('\n') + .to_string() } else { - val.format(&indentation).trim_end_matches('\n').to_string() + val.recast(options, indentation_level + 1) + .trim_end_matches('\n') + .to_string() }; if let NonCodeValue::BlockComment { .. } = val.value { s += "\n"; @@ -556,16 +720,65 @@ impl FunctionExpression { // We don't want to end with a new line inside nested functions. let mut new_options = options.clone(); new_options.insert_final_newline = false; - format!( - "({}) => {{\n{}{}\n}}", - self.params - .iter() - .map(|param| param.identifier.name.clone()) - .collect::>() - .join(", "), - options.get_indentation(indentation_level + 1), - self.body.recast(&new_options, indentation_level + 1) - ) + let param_list = self + .params + .iter() + .map(|param| param.recast(options, indentation_level)) + .collect::>() + .join(", "); + let tab0 = options.get_indentation(indentation_level); + let tab1 = options.get_indentation(indentation_level + 1); + let return_type = match &self.return_type { + Some(rt) => format!(": {}", rt.recast(&new_options, indentation_level)), + None => String::new(), + }; + let body = self.body.recast(&new_options, indentation_level + 1); + + format!("({param_list}){return_type} {{\n{tab1}{body}\n{tab0}}}") + } +} + +impl Parameter { + pub fn recast(&self, options: &FormatOptions, indentation_level: usize) -> String { + let at_sign = if self.labeled { "" } else { "@" }; + let identifier = &self.identifier.name; + let question_mark = if self.default_value.is_some() { "?" } else { "" }; + let mut result = format!("{at_sign}{identifier}{question_mark}"); + if let Some(ty) = &self.type_ { + result += ": "; + result += &ty.recast(options, indentation_level); + } + if let Some(DefaultParamVal::Literal(ref literal)) = self.default_value { + let lit = literal.recast(); + result.push_str(&format!(" = {lit}")); + }; + + result + } +} + +impl FnArgType { + pub fn recast(&self, options: &FormatOptions, indentation_level: usize) -> String { + match self { + FnArgType::Primitive(t) => t.to_string(), + FnArgType::Array(t) => format!("{t}[]"), + FnArgType::Object { properties } => { + let mut result = "{".to_owned(); + for p in properties { + result += " "; + result += &p.recast(options, indentation_level); + result += ","; + } + + if result.ends_with(',') { + result.pop(); + result += " "; + } + result += "}"; + + result + } + } } } @@ -573,7 +786,8 @@ impl FunctionExpression { mod tests { use pretty_assertions::assert_eq; - use crate::ast::types::FormatOptions; + use super::*; + use crate::{parsing::ast::types::FormatOptions, source_range::ModuleId}; #[test] fn test_recast_if_else_if_same() { @@ -585,9 +799,7 @@ mod tests { 5 } "#; - let tokens = crate::token::lexer(input).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(input).unwrap(); let output = program.recast(&Default::default(), 0); assert_eq!(output, input); } @@ -600,9 +812,7 @@ mod tests { 5 } "#; - let tokens = crate::token::lexer(input).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(input).unwrap(); let output = program.recast(&Default::default(), 0); assert_eq!(output, input); } @@ -615,10 +825,15 @@ import a, b from "a.kcl" import a as aaa, b from "a.kcl" import a, b as bbb from "a.kcl" import a as aaa, b as bbb from "a.kcl" +import "a_b.kcl" +import "a-b.kcl" as b +import * from "a.kcl" +export import a as aaa from "a.kcl" +export import a, b from "a.kcl" +export import a as aaa, b from "a.kcl" +export import a, b as bbb from "a.kcl" "#; - let tokens = crate::token::lexer(input).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(input).unwrap(); let output = program.recast(&Default::default(), 0); assert_eq!(output, input); } @@ -627,7 +842,7 @@ import a as aaa, b as bbb from "a.kcl" fn test_recast_import_as_same_name() { let input = r#"import a as a from "a.kcl" "#; - let program = crate::parser::parse(input).unwrap(); + let program = crate::parsing::top_level_parse(input).unwrap(); let output = program.recast(&Default::default(), 0); let expected = r#"import a from "a.kcl" "#; @@ -636,13 +851,11 @@ import a as aaa, b as bbb from "a.kcl" #[test] fn test_recast_export_fn() { - let input = r#"export fn a = () => { + let input = r#"export fn a() { return 0 } "#; - let tokens = crate::token::lexer(input).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(input).unwrap(); let output = program.recast(&Default::default(), 0); assert_eq!(output, input); } @@ -657,7 +870,7 @@ s = 1 // s = 1 -> height of Z is 13.4mm // Depth d = 1 -fn rect = (x, y, w, h) => { +fn rect(x, y, w, h) { startSketchOn('XY') |> startProfileAt([x, y], %) |> xLine(w, %) @@ -667,7 +880,7 @@ fn rect = (x, y, w, h) => { |> extrude(d, %) } -fn quad = (x1, y1, x2, y2, x3, y3, x4, y4) => { +fn quad(x1, y1, x2, y2, x3, y3, x4, y4) { startSketchOn('XY') |> startProfileAt([x1, y1], %) |> lineTo([x2, y2], %) @@ -677,7 +890,7 @@ fn quad = (x1, y1, x2, y2, x3, y3, x4, y4) => { |> extrude(d, %) } -fn crosshair = (x, y) => { +fn crosshair(x, y) { startSketchOn('XY') |> startProfileAt([x, y], %) |> yLine(1, %) @@ -687,7 +900,7 @@ fn crosshair = (x, y) => { |> xLine(-2, %) } -fn z = (z_x, z_y) => { +fn z(z_x, z_y) { z_end_w = s * 8.4 z_end_h = s * 3 z_corner = s * 2 @@ -700,7 +913,7 @@ fn z = (z_x, z_y) => { quad(z_x, z_y - z_h + z_corner, z_x + z_w - z_corner, z_y, z_x + z_w, z_y - z_corner, z_x + z_corner, z_y - z_h) } -fn o = (c_x, c_y) => { +fn o(c_x, c_y) { // Outer and inner radii o_r = s * 6.95 i_r = 0.5652173913043478 * o_r @@ -727,15 +940,15 @@ fn o = (c_x, c_y) => { startSketchOn('XY') |> startProfileAt([o_x1, o_y1], %) |> arc({ - radius: o_r, - angle_start: 45 + a, - angle_end: 225 - a + radius = o_r, + angle_start = 45 + a, + angle_end = 225 - a }, %) |> angledLine([45, o_r - i_r], %) |> arc({ - radius: i_r, - angle_start: 225 - a, - angle_end: 45 + a + radius = i_r, + angle_start = 225 - a, + angle_end = 45 + a }, %) |> close(%) |> extrude(d, %) @@ -743,21 +956,21 @@ fn o = (c_x, c_y) => { startSketchOn('XY') |> startProfileAt([o_x2, o_y2], %) |> arc({ - radius: o_r, - angle_start: 225 + a, - angle_end: 360 + 45 - a + radius = o_r, + angle_start = 225 + a, + angle_end = 360 + 45 - a }, %) |> angledLine([225, o_r - i_r], %) |> arc({ - radius: i_r, - angle_start: 45 - a, - angle_end: 225 + a - 360 + radius = i_r, + angle_start = 45 - a, + angle_end = 225 + a - 360 }, %) |> close(%) |> extrude(d, %) } -fn zoo = (x0, y0) => { +fn zoo(x0, y0) { z(x0, y0) o(x0 + s * 20, y0 - (s * 6.7)) o(x0 + s * 35, y0 - (s * 6.7)) @@ -765,9 +978,7 @@ fn zoo = (x0, y0) => { zoo(zoo_x, zoo_y) "#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!(recasted, some_program_string); @@ -806,18 +1017,18 @@ sphere = startSketchOn('XZ') ], %) |> line([sphereDia - 0.1, 0], %) |> arc({ - angle_start: 0, - angle_end: -180, - radius: sphereDia / 2 - 0.05 + angle_start = 0, + angle_end = -180, + radius = sphereDia / 2 - 0.05 }, %) |> close(%) |> revolve({ axis: 'x' }, %) |> patternCircular3d({ - axis: [0, 0, 1], - center: [0, 0, 0], - repetitions: 10, - arcDegrees: 360, - rotateDuplicates: true + axis = [0, 0, 1], + center = [0, 0, 0], + repetitions = 10, + arcDegrees = 360, + rotateDuplicates = true }, %) // Sketch and revolve the outside bearing @@ -836,9 +1047,7 @@ outsideRevolve = startSketchOn('XZ') |> line([overHangLength - thickness, 0], %) |> close(%) |> revolve({ axis: 'y' }, %)"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!( @@ -865,7 +1074,7 @@ insideRevolve = startSketchOn('XZ') |> line([0, -thickness], %) |> line([-overHangLength, 0], %) |> close(%) - |> revolve({ axis: 'y' }, %) + |> revolve({ axis = 'y' }, %) // Sketch and revolve one of the balls and duplicate it using a circular pattern. (This is currently a workaround, we have a bug with rotating on a sketch that touches the rotation axis) sphere = startSketchOn('XZ') @@ -875,18 +1084,18 @@ sphere = startSketchOn('XZ') ], %) |> line([sphereDia - 0.1, 0], %) |> arc({ - angle_start: 0, - angle_end: -180, - radius: sphereDia / 2 - 0.05 + angle_start = 0, + angle_end = -180, + radius = sphereDia / 2 - 0.05 }, %) |> close(%) - |> revolve({ axis: 'x' }, %) + |> revolve({ axis = 'x' }, %) |> patternCircular3d({ - axis: [0, 0, 1], - center: [0, 0, 0], - repetitions: 10, - arcDegrees: 360, - rotateDuplicates: true + axis = [0, 0, 1], + center = [0, 0, 0], + repetitions = 10, + arcDegrees = 360, + rotateDuplicates = true }, %) // Sketch and revolve the outside bearing @@ -904,19 +1113,17 @@ outsideRevolve = startSketchOn('XZ') |> line([0, thickness], %) |> line([overHangLength - thickness, 0], %) |> close(%) - |> revolve({ axis: 'y' }, %) + |> revolve({ axis = 'y' }, %) "# ); } #[test] fn test_recast_fn_in_object() { - let some_program_string = r#"bing = { yo: 55 } -myNestedVar = [{ prop: callExp(bing.yo) }] + let some_program_string = r#"bing = { yo = 55 } +myNestedVar = [{ prop = callExp(bing.yo) }] "#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!(recasted, some_program_string); @@ -924,12 +1131,10 @@ myNestedVar = [{ prop: callExp(bing.yo) }] #[test] fn test_recast_fn_in_array() { - let some_program_string = r#"bing = { yo: 55 } + let some_program_string = r#"bing = { yo = 55 } myNestedVar = [callExp(bing.yo)] "#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!(recasted, some_program_string); @@ -941,9 +1146,7 @@ myNestedVar = [callExp(bing.yo)] ten = 10 bar = [0 + 1 .. ten] "#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!(recasted, some_program_string); @@ -957,14 +1160,12 @@ bar = [0 + 1 .. ten] thing ( 1 ) "#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!( recasted, - r#"fn thing = (x) => { + r#"fn thing(x) { return x + 1 } @@ -973,25 +1174,37 @@ thing(1) ); } + #[test] + fn test_recast_typed_fn() { + let some_program_string = r#"fn thing(x: string, y: bool[]): number { + return x + 1 +} +"#; + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); + + let recasted = program.recast(&Default::default(), 0); + assert_eq!(recasted, some_program_string); + } + #[test] fn test_recast_object_fn_in_array_weird_bracket() { - let some_program_string = r#"bing = { yo: 55 } + let some_program_string = r#"bing = { yo = 55 } myNestedVar = [ { prop: line([bing.yo, 21], sketch001) } ] "#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!( recasted, - r#"bing = { yo: 55 } + r#"bing = { yo = 55 } myNestedVar = [ - { prop: line([bing.yo, 21], sketch001) } + { + prop = line([bing.yo, 21], sketch001) +} ] "# ); @@ -1000,9 +1213,7 @@ myNestedVar = [ #[test] fn test_recast_empty_file() { let some_program_string = r#""#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); // Its VERY important this comes back with zero new lines. @@ -1013,30 +1224,13 @@ myNestedVar = [ fn test_recast_empty_file_new_line() { let some_program_string = r#" "#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); // Its VERY important this comes back with zero new lines. assert_eq!(recasted, r#""#); } - #[test] - fn test_recast_shebang_only() { - let some_program_string = r#"#!/usr/local/env zoo kcl"#; - - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let result = parser.ast(); - - assert!(result.is_err()); - assert_eq!( - result.unwrap_err().to_string(), - r#"syntax: KclErrorDetails { source_ranges: [SourceRange([21, 24])], message: "Unexpected end of file. The compiler expected a function body items (functions are made up of variable declarations, expressions, and return statements, each of those is a possible body item" }"# - ); - } - #[test] fn test_recast_shebang() { let some_program_string = r#"#!/usr/local/env zoo kcl @@ -1048,9 +1242,7 @@ part001 = startSketchOn('XY') |> close(%) "#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!( @@ -1081,9 +1273,7 @@ part001 = startSketchOn('XY') |> close(%) "#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!( @@ -1113,9 +1303,7 @@ part001 = startSketchOn('XY') |> close(%) "#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!( @@ -1135,7 +1323,8 @@ part001 = startSketchOn('XY') #[test] fn test_recast_large_file() { - let some_program_string = r#"// define nts + let some_program_string = r#"@settings(units=mm) +// define nts radius = 6.0 width = 144.0 length = 83.0 @@ -1157,8 +1346,8 @@ fn rectShape = (pos, w, l) => { scarlett_body = rectShape([0, 0], width, length) |> extrude(depth, %) |> fillet({ - radius: radius, - tags: [ + radius = radius, + tags = [ edge2, edge4, getOppositeEdge(edge2), @@ -1169,10 +1358,10 @@ scarlett_body = rectShape([0, 0], width, length) fn bracketSketch = (w, d, t) => { s = startSketchOn({ plane: { - origin: { x: 0, y: length / 2 + thk, z: 0 }, - x_axis: { x: 1, y: 0, z: 0 }, - y_axis: { x: 0, y: 0, z: 1 }, - z_axis: { x: 0, y: 1, z: 0 } + origin: { x = 0, y = length / 2 + thk, z = 0 }, + x_axis: { x = 1, y = 0, z = 0 }, + y_axis: { x = 0, y = 0, z = 1 }, + z_axis: { x = 0, y = 1, z = 0 } } }) |> startProfileAt([-w / 2 - t, d + t], %) @@ -1190,7 +1379,7 @@ fn bracketSketch = (w, d, t) => { bracket_body = bracketSketch(width, depth, thk) |> extrude(length + 10, %) |> fillet({ - radius: radius, + radius = radius, tags: [ getNextAdjacentEdge(edge7), getNextAdjacentEdge(edge2), @@ -1201,10 +1390,10 @@ bracket_body = bracketSketch(width, depth, thk) // build the tabs of the mounting bracket (right side) tabs_r = startSketchOn({ plane: { - origin: { x: 0, y: 0, z: depth + thk }, - x_axis: { x: 1, y: 0, z: 0 }, - y_axis: { x: 0, y: 1, z: 0 }, - z_axis: { x: 0, y: 0, z: 1 } + origin: { x = 0, y = 0, z = depth + thk }, + x_axis: { x = 1, y = 0, z = 0 }, + y_axis: { x = 0, y = 1, z = 0 }, + z_axis: { x = 0, y = 0, z = 1 } } }) |> startProfileAt([width / 2 + thk, length / 2 + thk], %) @@ -1213,25 +1402,25 @@ tabs_r = startSketchOn({ |> line([-10, -5], %) |> close(%) |> hole(circle({ - center: [ + center = [ width / 2 + thk + hole_diam, length / 2 - hole_diam ], - radius: hole_diam / 2 + radius = hole_diam / 2 }, %), %) |> extrude(-thk, %) |> patternLinear3d({ - axis: [0, -1, 0], - repetitions: 1, - distance: length - 10 + axis = [0, -1, 0], + repetitions = 1, + distance = length - 10 }, %) // build the tabs of the mounting bracket (left side) tabs_l = startSketchOn({ plane: { - origin: { x: 0, y: 0, z: depth + thk }, - x_axis: { x: 1, y: 0, z: 0 }, - y_axis: { x: 0, y: 1, z: 0 }, - z_axis: { x: 0, y: 0, z: 1 } + origin = { x = 0, y = 0, z = depth + thk }, + x_axis = { x = 1, y = 0, z = 0 }, + y_axis = { x = 0, y = 1, z = 0 }, + z_axis = { x = 0, y = 0, z = 1 } } }) |> startProfileAt([-width / 2 - thk, length / 2 + thk], %) @@ -1240,28 +1429,27 @@ tabs_l = startSketchOn({ |> line([10, -5], %) |> close(%) |> hole(circle({ - center: [ + center = [ -width / 2 - thk - hole_diam, length / 2 - hole_diam ], - radius: hole_diam / 2 + radius = hole_diam / 2 }, %), %) |> extrude(-thk, %) |> patternLinear3d({ - axis: [0, -1, 0], - repetitions: 1, - distance: length - 10 + axis = [0, -1, 0], + repetitions = 1, + distance = length - 10 }, %) "#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); // Its VERY important this comes back with zero new lines. assert_eq!( recasted, - r#"// define nts + r#"@settings(units = mm) +// define nts radius = 6.0 width = 144.0 length = 83.0 @@ -1269,7 +1457,7 @@ depth = 45.0 thk = 5 hole_diam = 5 // define a rectangular shape func -fn rectShape = (pos, w, l) => { +fn rectShape(pos, w, l) { rr = startSketchOn('xy') |> startProfileAt([pos[0] - (w / 2), pos[1] - (l / 2)], %) |> lineTo([pos[0] + w / 2, pos[1] - (l / 2)], %, $edge1) @@ -1283,8 +1471,8 @@ fn rectShape = (pos, w, l) => { scarlett_body = rectShape([0, 0], width, length) |> extrude(depth, %) |> fillet({ - radius: radius, - tags: [ + radius = radius, + tags = [ edge2, edge4, getOppositeEdge(edge2), @@ -1292,13 +1480,13 @@ scarlett_body = rectShape([0, 0], width, length) ] }, %) // build the bracket sketch around the body -fn bracketSketch = (w, d, t) => { +fn bracketSketch(w, d, t) { s = startSketchOn({ - plane: { - origin: { x: 0, y: length / 2 + thk, z: 0 }, - x_axis: { x: 1, y: 0, z: 0 }, - y_axis: { x: 0, y: 0, z: 1 }, - z_axis: { x: 0, y: 1, z: 0 } + plane = { + origin = { x = 0, y = length / 2 + thk, z = 0 }, + x_axis = { x = 1, y = 0, z = 0 }, + y_axis = { x = 0, y = 0, z = 1 }, + z_axis = { x = 0, y = 1, z = 0 } } }) |> startProfileAt([-w / 2 - t, d + t], %) @@ -1316,8 +1504,8 @@ fn bracketSketch = (w, d, t) => { bracket_body = bracketSketch(width, depth, thk) |> extrude(length + 10, %) |> fillet({ - radius: radius, - tags: [ + radius = radius, + tags = [ getNextAdjacentEdge(edge7), getNextAdjacentEdge(edge2), getNextAdjacentEdge(edge3), @@ -1326,11 +1514,11 @@ bracket_body = bracketSketch(width, depth, thk) }, %) // build the tabs of the mounting bracket (right side) tabs_r = startSketchOn({ - plane: { - origin: { x: 0, y: 0, z: depth + thk }, - x_axis: { x: 1, y: 0, z: 0 }, - y_axis: { x: 0, y: 1, z: 0 }, - z_axis: { x: 0, y: 0, z: 1 } + plane = { + origin = { x = 0, y = 0, z = depth + thk }, + x_axis = { x = 1, y = 0, z = 0 }, + y_axis = { x = 0, y = 1, z = 0 }, + z_axis = { x = 0, y = 0, z = 1 } } }) |> startProfileAt([width / 2 + thk, length / 2 + thk], %) @@ -1339,25 +1527,25 @@ tabs_r = startSketchOn({ |> line([-10, -5], %) |> close(%) |> hole(circle({ - center: [ + center = [ width / 2 + thk + hole_diam, length / 2 - hole_diam ], - radius: hole_diam / 2 + radius = hole_diam / 2 }, %), %) |> extrude(-thk, %) |> patternLinear3d({ - axis: [0, -1, 0], - repetitions: 1, - distance: length - 10 + axis = [0, -1, 0], + repetitions = 1, + distance = length - 10 }, %) // build the tabs of the mounting bracket (left side) tabs_l = startSketchOn({ - plane: { - origin: { x: 0, y: 0, z: depth + thk }, - x_axis: { x: 1, y: 0, z: 0 }, - y_axis: { x: 0, y: 1, z: 0 }, - z_axis: { x: 0, y: 0, z: 1 } + plane = { + origin = { x = 0, y = 0, z = depth + thk }, + x_axis = { x = 1, y = 0, z = 0 }, + y_axis = { x = 0, y = 1, z = 0 }, + z_axis = { x = 0, y = 0, z = 1 } } }) |> startProfileAt([-width / 2 - thk, length / 2 + thk], %) @@ -1366,17 +1554,17 @@ tabs_l = startSketchOn({ |> line([10, -5], %) |> close(%) |> hole(circle({ - center: [ + center = [ -width / 2 - thk - hole_diam, length / 2 - hole_diam ], - radius: hole_diam / 2 + radius = hole_diam / 2 }, %), %) |> extrude(-thk, %) |> patternLinear3d({ - axis: [0, -1, 0], - repetitions: 1, - distance: length - 10 + axis = [0, -1, 0], + repetitions = 1, + distance = length - 10 }, %) "# ); @@ -1393,14 +1581,12 @@ tabs_l = startSketchOn({ |> close(%) |> extrude(scale, %) }"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!( recasted, - r#"fn cube = (pos, scale) => { + r#"fn cube(pos, scale) { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) @@ -1413,15 +1599,35 @@ tabs_l = startSketchOn({ ); } + #[test] + fn test_as() { + let some_program_string = r#"fn cube(pos, scale) { + x = dfsfs + dfsfsd as y + + sg = startSketchOn('XY') + |> startProfileAt(pos, %) as foo + |> line([0, scale], %) + |> line([scale, 0], %) as bar + |> line([0 as baz, -scale] as qux, %) + |> close(%) + |> extrude(scale, %) +} + +cube(0, 0) as cub +"#; + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); + + let recasted = program.recast(&Default::default(), 0); + assert_eq!(recasted, some_program_string,); + } + #[test] fn test_recast_with_bad_indentation() { let some_program_string = r#"part001 = startSketchOn('XY') |> startProfileAt([0.0, 5.0], %) |> line([0.4900857016, -0.0240763666], %) |> line([0.6804562304, 0.9087880491], %)"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!( @@ -1440,9 +1646,7 @@ tabs_l = startSketchOn({ |> startProfileAt([0.0, 5.0], %) |> line([0.4900857016, -0.0240763666], %) // hello world |> line([0.6804562304, 0.9087880491], %)"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!( @@ -1461,9 +1665,7 @@ tabs_l = startSketchOn({ |> line([0.4900857016, -0.0240763666], %) // hello world |> line([0.6804562304, 0.9087880491], %)"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!( @@ -1481,23 +1683,21 @@ tabs_l = startSketchOn({ fn test_recast_comment_in_a_fn_block() { let some_program_string = r#"fn myFn = () => { // this is a comment - yo = { a: { b: { c: '123' } } } /* block + yo = { a = { b = { c = '123' } } } /* block comment */ key = 'c' // this is also a comment return things }"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!( recasted, - r#"fn myFn = () => { + r#"fn myFn() { // this is a comment - yo = { a: { b: { c: '123' } } } /* block + yo = { a = { b = { c = '123' } } } /* block comment */ key = 'c' @@ -1514,9 +1714,7 @@ tabs_l = startSketchOn({ // this is also a comment thing = 'foo' "#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!( @@ -1537,9 +1735,7 @@ key = 'c' // hello thing = 'foo' "#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!( @@ -1567,9 +1763,7 @@ thing = 'c' foo = 'bar' // "#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!( @@ -1595,9 +1789,7 @@ foo = 'bar' // // hello thing = 'foo' "#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!( @@ -1616,9 +1808,7 @@ thing = 'foo' /* comment at start */ mySk1 = startSketchAt([0, 0])"#; - let tokens = crate::token::lexer(test_program).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(test_program).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!( @@ -1648,9 +1838,7 @@ mySk1 = startSketchOn('XY') |> ry(45, %) |> rx(45, %) // one more for good measure"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!( @@ -1681,14 +1869,12 @@ mySk1 = startSketchOn('XY') |> line([0.62, 4.15], %, $seg01) |> line([2.77, -1.24], %) |> angledLineThatIntersects({ - angle: 201, - offset: -1.35, - intersectTag: seg01 + angle = 201, + offset = -1.35, + intersectTag = seg01 }, %) |> line([-0.42, -1.72], %)"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!(recasted.trim(), some_program_string); @@ -1699,10 +1885,10 @@ mySk1 = startSketchOn('XY') let some_program_string = r#"three = 3 yo = { - aStr: 'str', - anum: 2, - identifier: three, - binExp: 4 + 5 + aStr = 'str', + anum = 2, + identifier = three, + binExp = 4 + 5 } yo = [ 1, @@ -1712,9 +1898,7 @@ yo = [ " hey oooooo really long long long" ] "#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!(recasted, some_program_string); @@ -1724,15 +1908,13 @@ yo = [ fn test_recast_new_line_before_comment() { let some_program_string = r#" // this is a comment -yo = { a: { b: { c: '123' } } } +yo = { a = { b = { c = '123' } } } key = 'c' things = "things" // this is also a comment"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); let expected = some_program_string.trim(); @@ -1744,16 +1926,14 @@ things = "things" #[test] fn test_recast_comment_tokens_inside_strings() { let some_program_string = r#"b = { - end: 141, - start: 125, - type: "NonCodeNode", - value: " + end = 141, + start = 125, + type_ = "NonCodeNode", + value = " // a comment " }"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!(recasted.trim(), some_program_string.trim()); @@ -1777,9 +1957,7 @@ part001 = startSketchOn('XY') -angleToMatchLengthY(seg01, myVar, %), myVar ], %) // ln-lineTo-yAbsolute should use angleToMatchLengthY helper"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!(recasted.trim(), some_program_string); @@ -1804,9 +1982,7 @@ part001 = startSketchOn('XY') myVar ], %) // ln-lineTo-yAbsolute should use angleToMatchLengthY helper "#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast( &FormatOptions { @@ -1835,9 +2011,7 @@ fn ghi = (part001) => { return part001 } "#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let mut program = parser.ast().unwrap(); + let mut program = crate::parsing::top_level_parse(some_program_string).unwrap(); program.rename_symbol("mySuperCoolPart", 6); let recasted = program.recast(&Default::default(), 0); @@ -1851,9 +2025,9 @@ part002 = "part002" things = [mySuperCoolPart, 0.0] blah = 1 foo = false -baz = { a: 1, part001: "thing" } +baz = { a = 1, part001 = "thing" } -fn ghi = (part001) => { +fn ghi(part001) { return part001 } "# @@ -1865,15 +2039,13 @@ fn ghi = (part001) => { let some_program_string = r#"fn ghi = (x, y, z) => { return x }"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let mut program = parser.ast().unwrap(); + let mut program = crate::parsing::top_level_parse(some_program_string).unwrap(); program.rename_symbol("newName", 10); let recasted = program.recast(&Default::default(), 0); assert_eq!( recasted, - r#"fn ghi = (newName, y, z) => { + r#"fn ghi(newName, y, z) { return newName } "# @@ -1885,13 +2057,11 @@ fn ghi = (part001) => { let some_program_string = r#"startSketchOn('XY') |> startProfileAt([0, 0], %) |> arc({ - radius: 1, - angle_start: 0, - angle_end: 180, + radius = 1, + angle_start = 0, + angle_end = 180, }, %)"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!( @@ -1899,9 +2069,9 @@ fn ghi = (part001) => { r#"startSketchOn('XY') |> startProfileAt([0, 0], %) |> arc({ - radius: 1, - angle_start: 0, - angle_end: 180 + radius = 1, + angle_start = 0, + angle_end = 180 }, %) "# ); @@ -1921,9 +2091,7 @@ firstExtrude = startSketchOn('XY') |> close(%) |> extrude(h, %) "#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!( @@ -1960,9 +2128,7 @@ firstExtrude = startSketchOn('XY') |> close(%) |> extrude(h, %) "#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!( @@ -1988,9 +2154,7 @@ firstExtrude = startSketchOn('XY') #[tokio::test(flavor = "multi_thread")] async fn test_recast_math_start_negative() { let some_program_string = r#"myVar = -5 + 6"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!(recasted.trim(), some_program_string); @@ -2007,9 +2171,7 @@ startSketchOn('XY') |> line([0, -(5 - thickness)], %) |> line([0, -(5 - 1)], %) |> line([0, -(-5 - 1)], %)"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!(recasted.trim(), some_program_string); @@ -2023,9 +2185,7 @@ FOS = 2 sigmaAllow = 8 width = 20 thickness = sqrt(distance * p * FOS * 6 / (sigmaAllow * width))"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!(recasted.trim(), some_program_string); @@ -2034,14 +2194,30 @@ thickness = sqrt(distance * p * FOS * 6 / (sigmaAllow * width))"#; #[tokio::test(flavor = "multi_thread")] async fn no_vardec_keyword() { let some_program_string = r#"distance = 5"#; - let tokens = crate::token::lexer(some_program_string).unwrap(); - let parser = crate::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!(recasted.trim(), some_program_string); } + #[test] + fn recast_nested_fn() { + let some_program_string = r#"fn f = () => { + return fn() => { + return 1 +} +}"#; + let program = crate::parsing::top_level_parse(some_program_string).unwrap(); + let recasted = program.recast(&Default::default(), 0); + let expected = "\ +fn f() { + return fn() { + return 1 + } +}"; + assert_eq!(recasted.trim(), expected); + } + #[test] fn recast_literal() { use winnow::Parser; @@ -2066,9 +2242,9 @@ thickness = sqrt(distance * p * FOS * 6 / (sigmaAllow * width))"#; .into_iter() .enumerate() { - let tokens = crate::token::lexer(raw).unwrap(); - let literal = crate::parser::parser_impl::unsigned_number_literal - .parse(&tokens) + let tokens = crate::parsing::token::lex(raw, ModuleId::default()).unwrap(); + let literal = crate::parsing::parser::unsigned_number_literal + .parse(tokens.as_slice()) .unwrap(); assert_eq!( literal.recast(), @@ -2083,55 +2259,75 @@ thickness = sqrt(distance * p * FOS * 6 / (sigmaAllow * width))"#; let input = r#" sketch002 = startSketchOn({ plane: { - origin: { x: 1, y: 2, z: 3 }, - x_axis: { x: 4, y: 5, z: 6 }, - y_axis: { x: 7, y: 8, z: 9 }, - z_axis: { x: 10, y: 11, z: 12 } + origin: { x = 1, y = 2, z = 3 }, + x_axis: { x = 4, y = 5, z = 6 }, + y_axis: { x = 7, y = 8, z = 9 }, + z_axis: { x = 10, y = 11, z = 12 } } }) "#; let expected = r#"sketch002 = startSketchOn({ - plane: { - origin: { x: 1, y: 2, z: 3 }, - x_axis: { x: 4, y: 5, z: 6 }, - y_axis: { x: 7, y: 8, z: 9 }, - z_axis: { x: 10, y: 11, z: 12 } + plane = { + origin = { x = 1, y = 2, z = 3 }, + x_axis = { x = 4, y = 5, z = 6 }, + y_axis = { x = 7, y = 8, z = 9 }, + z_axis = { x = 10, y = 11, z = 12 } } }) "#; - let tokens = crate::token::lexer(input).unwrap(); - let p = crate::parser::Parser::new(tokens); - let ast = p.ast().unwrap(); + let ast = crate::parsing::top_level_parse(input).unwrap(); let actual = ast.recast(&FormatOptions::new(), 0); assert_eq!(actual, expected); } + #[test] + fn unparse_fn_unnamed() { + let input = r#"squares_out = reduce(arr, 0, fn(i, squares) { + return 1 +}) +"#; + let ast = crate::parsing::top_level_parse(input).unwrap(); + let actual = ast.recast(&FormatOptions::new(), 0); + assert_eq!(actual, input); + } + + #[test] + fn unparse_fn_named() { + let input = r#"fn f(x) { + return 1 +} +"#; + let ast = crate::parsing::top_level_parse(input).unwrap(); + let actual = ast.recast(&FormatOptions::new(), 0); + assert_eq!(actual, input); + } + #[test] fn recast_objects_with_comments() { use winnow::Parser; for (i, (input, expected, reason)) in [( "\ { - a: 1, - // b: 2, - c: 3 + a = 1, + // b = 2, + c = 3 }", "\ { - a: 1, - // b: 2, - c: 3 + a = 1, + // b = 2, + c = 3 }", "preserves comments", )] .into_iter() .enumerate() { - let tokens = crate::token::lexer(input).unwrap(); - crate::parser::parser_impl::print_tokens(&tokens); - let expr = crate::parser::parser_impl::object.parse(&tokens).unwrap(); + let tokens = crate::parsing::token::lex(input, ModuleId::default()).unwrap(); + crate::parsing::parser::print_tokens(tokens.as_slice()); + let expr = crate::parsing::parser::object.parse(tokens.as_slice()).unwrap(); assert_eq!( - expr.recast(&FormatOptions::new(), 0, false), + expr.recast(&FormatOptions::new(), 0, ExprContext::Other), expected, "failed test {i}, which is testing that recasting {reason}" ); @@ -2225,10 +2421,12 @@ sketch002 = startSketchOn({ .into_iter() .enumerate() { - let tokens = crate::token::lexer(input).unwrap(); - let expr = crate::parser::parser_impl::array_elem_by_elem.parse(&tokens).unwrap(); + let tokens = crate::parsing::token::lex(input, ModuleId::default()).unwrap(); + let expr = crate::parsing::parser::array_elem_by_elem + .parse(tokens.as_slice()) + .unwrap(); assert_eq!( - expr.recast(&FormatOptions::new(), 0, false), + expr.recast(&FormatOptions::new(), 0, ExprContext::Other), expected, "failed test {i}, which is testing that recasting {reason}" ); diff --git a/src/wasm-lib/kcl/src/walk/ast_node.rs b/src/wasm-lib/kcl/src/walk/ast_node.rs index 337ebf49c..80478fa81 100644 --- a/src/wasm-lib/kcl/src/walk/ast_node.rs +++ b/src/wasm-lib/kcl/src/walk/ast_node.rs @@ -1,76 +1,209 @@ use crate::{ - ast::{types, types::ValueMeta}, - executor::SourceRange, + parsing::ast::types::{self, NodeRef}, + source_range::SourceRange, }; /// The "Node" type wraps all the AST elements we're able to find in a KCL /// file. Tokens we walk through will be one of these. -#[derive(Clone, Debug)] +#[derive(Copy, Clone, Debug)] pub enum Node<'a> { - Program(&'a types::Program), + Program(NodeRef<'a, types::Program>), - ImportStatement(&'a types::ImportStatement), - ExpressionStatement(&'a types::ExpressionStatement), - VariableDeclaration(&'a types::VariableDeclaration), - ReturnStatement(&'a types::ReturnStatement), + ImportStatement(NodeRef<'a, types::ImportStatement>), + ExpressionStatement(NodeRef<'a, types::ExpressionStatement>), + VariableDeclaration(NodeRef<'a, types::VariableDeclaration>), + ReturnStatement(NodeRef<'a, types::ReturnStatement>), - VariableDeclarator(&'a types::VariableDeclarator), + VariableDeclarator(NodeRef<'a, types::VariableDeclarator>), - Literal(&'a types::Literal), - TagDeclarator(&'a types::TagDeclarator), - Identifier(&'a types::Identifier), - BinaryExpression(&'a types::BinaryExpression), - FunctionExpression(&'a types::FunctionExpression), - CallExpression(&'a types::CallExpression), - PipeExpression(&'a types::PipeExpression), - PipeSubstitution(&'a types::PipeSubstitution), - ArrayExpression(&'a types::ArrayExpression), - ArrayRangeExpression(&'a types::ArrayRangeExpression), - ObjectExpression(&'a types::ObjectExpression), - MemberExpression(&'a types::MemberExpression), - UnaryExpression(&'a types::UnaryExpression), - IfExpression(&'a types::IfExpression), + Literal(NodeRef<'a, types::Literal>), + TagDeclarator(NodeRef<'a, types::TagDeclarator>), + Identifier(NodeRef<'a, types::Identifier>), + BinaryExpression(NodeRef<'a, types::BinaryExpression>), + FunctionExpression(NodeRef<'a, types::FunctionExpression>), + CallExpression(NodeRef<'a, types::CallExpression>), + CallExpressionKw(NodeRef<'a, types::CallExpressionKw>), + PipeExpression(NodeRef<'a, types::PipeExpression>), + PipeSubstitution(NodeRef<'a, types::PipeSubstitution>), + ArrayExpression(NodeRef<'a, types::ArrayExpression>), + ArrayRangeExpression(NodeRef<'a, types::ArrayRangeExpression>), + ObjectExpression(NodeRef<'a, types::ObjectExpression>), + MemberExpression(NodeRef<'a, types::MemberExpression>), + UnaryExpression(NodeRef<'a, types::UnaryExpression>), + IfExpression(NodeRef<'a, types::IfExpression>), + ElseIf(&'a types::ElseIf), + LabelledExpression(NodeRef<'a, types::LabelledExpression>), Parameter(&'a types::Parameter), - ObjectProperty(&'a types::ObjectProperty), + ObjectProperty(NodeRef<'a, types::ObjectProperty>), - MemberObject(&'a types::MemberObject), - LiteralIdentifier(&'a types::LiteralIdentifier), + KclNone(&'a types::KclNone), } -impl From<&Node<'_>> for SourceRange { - fn from(node: &Node) -> Self { +impl Node<'_> { + /// Return the digest of the [Node], pulling the underlying Digest from + /// the AST types. + /// + /// The Digest type may change over time. + pub fn digest(&self) -> Option<[u8; 32]> { + match self { + Node::Program(n) => n.digest, + Node::ImportStatement(n) => n.digest, + Node::ExpressionStatement(n) => n.digest, + Node::VariableDeclaration(n) => n.digest, + Node::ReturnStatement(n) => n.digest, + Node::VariableDeclarator(n) => n.digest, + Node::Literal(n) => n.digest, + Node::TagDeclarator(n) => n.digest, + Node::Identifier(n) => n.digest, + Node::BinaryExpression(n) => n.digest, + Node::FunctionExpression(n) => n.digest, + Node::CallExpression(n) => n.digest, + Node::CallExpressionKw(n) => n.digest, + Node::PipeExpression(n) => n.digest, + Node::PipeSubstitution(n) => n.digest, + Node::ArrayExpression(n) => n.digest, + Node::ArrayRangeExpression(n) => n.digest, + Node::ObjectExpression(n) => n.digest, + Node::MemberExpression(n) => n.digest, + Node::UnaryExpression(n) => n.digest, + Node::Parameter(p) => p.digest, + Node::ObjectProperty(n) => n.digest, + Node::IfExpression(n) => n.digest, + Node::ElseIf(n) => n.digest, + Node::KclNone(n) => n.digest, + Node::LabelledExpression(n) => n.digest, + } + } +} + +/// Returned during source_range conversion. +#[derive(Debug)] +pub enum AstNodeError { + /// Returned if we try and [SourceRange] a [types::KclNone]. + NoSourceForAKclNone, +} + +impl TryFrom<&Node<'_>> for SourceRange { + type Error = AstNodeError; + + fn try_from(node: &Node) -> Result { + Ok(match node { + Node::Program(n) => SourceRange::from(*n), + Node::ImportStatement(n) => SourceRange::from(*n), + Node::ExpressionStatement(n) => SourceRange::from(*n), + Node::VariableDeclaration(n) => SourceRange::from(*n), + Node::ReturnStatement(n) => SourceRange::from(*n), + Node::VariableDeclarator(n) => SourceRange::from(*n), + Node::Literal(n) => SourceRange::from(*n), + Node::TagDeclarator(n) => SourceRange::from(*n), + Node::Identifier(n) => SourceRange::from(*n), + Node::BinaryExpression(n) => SourceRange::from(*n), + Node::FunctionExpression(n) => SourceRange::from(*n), + Node::CallExpression(n) => SourceRange::from(*n), + Node::CallExpressionKw(n) => SourceRange::from(*n), + Node::PipeExpression(n) => SourceRange::from(*n), + Node::PipeSubstitution(n) => SourceRange::from(*n), + Node::ArrayExpression(n) => SourceRange::from(*n), + Node::ArrayRangeExpression(n) => SourceRange::from(*n), + Node::ObjectExpression(n) => SourceRange::from(*n), + Node::MemberExpression(n) => SourceRange::from(*n), + Node::UnaryExpression(n) => SourceRange::from(*n), + Node::Parameter(p) => SourceRange::from(&p.identifier), + Node::ObjectProperty(n) => SourceRange::from(*n), + Node::IfExpression(n) => SourceRange::from(*n), + Node::LabelledExpression(n) => SourceRange::from(*n), + + // This is broken too + Node::ElseIf(n) => SourceRange::new(n.cond.start(), n.cond.end(), n.cond.module_id()), + + // The KclNone type here isn't an actual node, so it has no + // start/end information. + Node::KclNone(_) => return Err(Self::Error::NoSourceForAKclNone), + }) + } +} + +impl<'tree> From<&'tree types::BodyItem> for Node<'tree> { + fn from(node: &'tree types::BodyItem) -> Self { match node { - Node::Program(p) => SourceRange([p.start, p.end]), - Node::ImportStatement(e) => SourceRange([e.start(), e.end()]), - Node::ExpressionStatement(e) => SourceRange([e.start(), e.end()]), - Node::VariableDeclaration(v) => SourceRange([v.start(), v.end()]), - Node::ReturnStatement(r) => SourceRange([r.start(), r.end()]), - Node::VariableDeclarator(v) => SourceRange([v.start(), v.end()]), - Node::Literal(l) => SourceRange([l.start(), l.end()]), - Node::TagDeclarator(t) => SourceRange([t.start(), t.end()]), - Node::Identifier(i) => SourceRange([i.start(), i.end()]), - Node::BinaryExpression(b) => SourceRange([b.start(), b.end()]), - Node::FunctionExpression(f) => SourceRange([f.start(), f.end()]), - Node::CallExpression(c) => SourceRange([c.start(), c.end()]), - Node::PipeExpression(p) => SourceRange([p.start(), p.end()]), - Node::PipeSubstitution(p) => SourceRange([p.start(), p.end()]), - Node::ArrayExpression(a) => SourceRange([a.start(), a.end()]), - Node::ArrayRangeExpression(a) => SourceRange([a.start(), a.end()]), - Node::ObjectExpression(o) => SourceRange([o.start(), o.end()]), - Node::MemberExpression(m) => SourceRange([m.start(), m.end()]), - Node::UnaryExpression(u) => SourceRange([u.start(), u.end()]), - Node::Parameter(p) => SourceRange([p.identifier.start(), p.identifier.end()]), - Node::ObjectProperty(o) => SourceRange([o.start(), o.end()]), - Node::MemberObject(m) => SourceRange([m.start(), m.end()]), - Node::IfExpression(m) => SourceRange([m.start(), m.end()]), - Node::LiteralIdentifier(l) => SourceRange([l.start(), l.end()]), + types::BodyItem::ImportStatement(v) => v.as_ref().into(), + types::BodyItem::ExpressionStatement(v) => v.into(), + types::BodyItem::VariableDeclaration(v) => v.as_ref().into(), + types::BodyItem::ReturnStatement(v) => v.into(), + } + } +} + +impl<'tree> From<&'tree types::Expr> for Node<'tree> { + fn from(node: &'tree types::Expr) -> Self { + match node { + types::Expr::Literal(lit) => lit.as_ref().into(), + types::Expr::TagDeclarator(tag) => tag.as_ref().into(), + types::Expr::Identifier(id) => id.as_ref().into(), + types::Expr::BinaryExpression(be) => be.as_ref().into(), + types::Expr::FunctionExpression(fe) => fe.as_ref().into(), + types::Expr::CallExpression(ce) => ce.as_ref().into(), + types::Expr::CallExpressionKw(ce) => ce.as_ref().into(), + types::Expr::PipeExpression(pe) => pe.as_ref().into(), + types::Expr::PipeSubstitution(ps) => ps.as_ref().into(), + types::Expr::ArrayExpression(ae) => ae.as_ref().into(), + types::Expr::ArrayRangeExpression(are) => are.as_ref().into(), + types::Expr::ObjectExpression(oe) => oe.as_ref().into(), + types::Expr::MemberExpression(me) => me.as_ref().into(), + types::Expr::UnaryExpression(ue) => ue.as_ref().into(), + types::Expr::IfExpression(e) => e.as_ref().into(), + types::Expr::LabelledExpression(e) => e.as_ref().into(), + types::Expr::None(n) => n.into(), + } + } +} + +impl<'tree> From<&'tree types::BinaryPart> for Node<'tree> { + fn from(node: &'tree types::BinaryPart) -> Self { + match node { + types::BinaryPart::Literal(lit) => lit.as_ref().into(), + types::BinaryPart::Identifier(id) => id.as_ref().into(), + types::BinaryPart::BinaryExpression(be) => be.as_ref().into(), + types::BinaryPart::CallExpression(ce) => ce.as_ref().into(), + types::BinaryPart::CallExpressionKw(ce) => ce.as_ref().into(), + types::BinaryPart::UnaryExpression(ue) => ue.as_ref().into(), + types::BinaryPart::MemberExpression(me) => me.as_ref().into(), + types::BinaryPart::IfExpression(e) => e.as_ref().into(), + } + } +} + +impl<'tree> From<&'tree types::MemberObject> for Node<'tree> { + fn from(node: &'tree types::MemberObject) -> Self { + match node { + types::MemberObject::MemberExpression(me) => me.as_ref().into(), + types::MemberObject::Identifier(id) => id.as_ref().into(), + } + } +} + +impl<'tree> From<&'tree types::LiteralIdentifier> for Node<'tree> { + fn from(node: &'tree types::LiteralIdentifier) -> Self { + match node { + types::LiteralIdentifier::Identifier(id) => id.as_ref().into(), + types::LiteralIdentifier::Literal(lit) => lit.as_ref().into(), } } } macro_rules! impl_from { + ($node:ident, $t: ident) => { + impl<'a> From> for Node<'a> { + fn from(v: NodeRef<'a, types::$t>) -> Self { + Node::$t(v) + } + } + }; +} + +macro_rules! impl_from_ref { ($node:ident, $t: ident) => { impl<'a> From<&'a types::$t> for Node<'a> { fn from(v: &'a types::$t) -> Self { @@ -92,6 +225,7 @@ impl_from!(Node, Identifier); impl_from!(Node, BinaryExpression); impl_from!(Node, FunctionExpression); impl_from!(Node, CallExpression); +impl_from!(Node, CallExpressionKw); impl_from!(Node, PipeExpression); impl_from!(Node, PipeSubstitution); impl_from!(Node, ArrayExpression); @@ -99,8 +233,9 @@ impl_from!(Node, ArrayRangeExpression); impl_from!(Node, ObjectExpression); impl_from!(Node, MemberExpression); impl_from!(Node, UnaryExpression); -impl_from!(Node, Parameter); impl_from!(Node, ObjectProperty); -impl_from!(Node, MemberObject); +impl_from_ref!(Node, Parameter); impl_from!(Node, IfExpression); -impl_from!(Node, LiteralIdentifier); +impl_from!(Node, ElseIf); +impl_from!(Node, LabelledExpression); +impl_from!(Node, KclNone); diff --git a/src/wasm-lib/kcl/src/walk/ast_visitor.rs b/src/wasm-lib/kcl/src/walk/ast_visitor.rs new file mode 100644 index 000000000..95025a63a --- /dev/null +++ b/src/wasm-lib/kcl/src/walk/ast_visitor.rs @@ -0,0 +1,199 @@ +use anyhow::Result; + +use crate::walk::Node; + +/// Walk-specific trait adding the ability to traverse the KCL AST. +/// +/// This trait is implemented on [Node] to handle the fairly tricky bit of +/// recursing into the AST in a single place, as well as helpers for traversing +/// the tree. for callers to use. +pub trait Visitable<'tree> { + /// Return a `Vec` for all *direct* children of this AST node. This + /// should only contain direct descendants. + fn children(&self) -> Vec>; + + /// Return `self` as a [Node]. Generally speaking, the [Visitable] trait + /// is only going to be implemented on [Node], so this is purely used by + /// helpers that are generic over a [Visitable] and want to deref back + /// into a [Node]. + fn node(&self) -> Node<'tree>; + + /// Call the provided [Visitor] in order to Visit `self`. This will + /// only be called on `self` -- the [Visitor] is responsible for + /// recursing into any children, if desired. + fn visit(&self, visitor: VisitorT) -> Result + where + VisitorT: Visitor<'tree>, + { + visitor.visit_node(self.node()) + } +} + +/// Trait used to enable visiting members of KCL AST. +/// +/// Implementing this trait enables the implementer to be invoked over +/// members of KCL AST by using the [Visitable::visit] function on +/// a [Node]. +pub trait Visitor<'tree> { + /// Error type returned by the [Self::visit] function. + type Error; + + /// Visit a KCL AST [Node]. + /// + /// In general, implementers likely wish to check to see if a Node is what + /// they're looking for, and either descend into that [Node]'s children (by + /// calling [Visitable::children] on [Node] to get children nodes, + /// calling [Visitable::visit] on each node of interest), or perform + /// some action. + fn visit_node(&self, node: Node<'tree>) -> Result; +} + +impl<'a, FnT, ErrorT> Visitor<'a> for FnT +where + FnT: Fn(Node<'a>) -> Result, +{ + type Error = ErrorT; + + fn visit_node(&self, n: Node<'a>) -> Result { + self(n) + } +} + +impl<'tree> Visitable<'tree> for Node<'tree> { + fn node(&self) -> Node<'tree> { + *self + } + + fn children(&self) -> Vec> { + match self { + Node::Program(n) => n.body.iter().map(|node| node.into()).collect(), + Node::ExpressionStatement(n) => { + vec![(&n.expression).into()] + } + Node::BinaryExpression(n) => { + vec![(&n.left).into(), (&n.right).into()] + } + Node::FunctionExpression(n) => { + let mut children = n.params.iter().map(|v| v.into()).collect::>(); + children.push((&n.body).into()); + children + } + Node::CallExpression(n) => { + let mut children = n.arguments.iter().map(|v| v.into()).collect::>(); + children.insert(0, (&n.callee).into()); + children + } + Node::CallExpressionKw(n) => { + let mut children = n.unlabeled.iter().map(|v| v.into()).collect::>(); + + // TODO: this is wrong but it's what the old walk code was doing. + // We likely need a real LabeledArg AST node, but I don't + // want to tango with it since it's a lot deeper than + // adding it to the enum. + children.extend(n.arguments.iter().map(|v| (&v.arg).into()).collect::>()); + children + } + Node::PipeExpression(n) => n.body.iter().map(|v| v.into()).collect(), + Node::ArrayExpression(n) => n.elements.iter().map(|v| v.into()).collect(), + Node::ArrayRangeExpression(n) => { + vec![(&n.start_element).into(), (&n.end_element).into()] + } + Node::ObjectExpression(n) => n.properties.iter().map(|v| v.into()).collect(), + Node::MemberExpression(n) => { + vec![(&n.object).into(), (&n.property).into()] + } + Node::IfExpression(n) => { + let mut children = n.else_ifs.iter().map(|v| v.into()).collect::>(); + children.insert(0, n.cond.as_ref().into()); + children.push(n.final_else.as_ref().into()); + children + } + Node::VariableDeclaration(n) => vec![(&n.declaration).into()], + Node::ReturnStatement(n) => { + vec![(&n.argument).into()] + } + Node::VariableDeclarator(n) => { + vec![(&n.id).into(), (&n.init).into()] + } + Node::UnaryExpression(n) => { + vec![(&n.argument).into()] + } + Node::Parameter(n) => { + vec![(&n.identifier).into()] + } + Node::ObjectProperty(n) => { + vec![(&n.value).into()] + } + Node::ElseIf(n) => { + vec![(&n.cond).into(), n.then_val.as_ref().into()] + } + Node::LabelledExpression(e) => { + vec![(&e.expr).into(), (&e.label).into()] + } + Node::PipeSubstitution(_) + | Node::TagDeclarator(_) + | Node::Identifier(_) + | Node::ImportStatement(_) + | Node::KclNone(_) + | Node::Literal(_) => vec![], + } + } +} + +#[cfg(test)] +mod tests { + use std::sync::Mutex; + + use super::*; + + macro_rules! kcl { + ( $kcl:expr ) => {{ + $crate::parsing::top_level_parse($kcl).unwrap() + }}; + } + + #[test] + fn count_crows() { + let program = kcl!( + "\ +const crow1 = 1 +const crow2 = 2 + +fn crow3() { + const crow4 = 3 + crow5() +} +" + ); + + #[derive(Debug, Default)] + struct CountCrows { + n: Box>, + } + + impl<'tree> Visitor<'tree> for &CountCrows { + type Error = (); + + fn visit_node(&self, node: Node<'tree>) -> Result { + if let Node::VariableDeclarator(vd) = node { + if vd.id.name.starts_with("crow") { + *self.n.lock().unwrap() += 1; + } + } + + for child in node.children().iter() { + if !child.visit(*self)? { + return Ok(false); + } + } + + Ok(true) + } + } + + let prog: Node = (&program).into(); + let count_crows: CountCrows = Default::default(); + Visitable::visit(&prog, &count_crows).unwrap(); + assert_eq!(*count_crows.n.lock().unwrap(), 4); + } +} diff --git a/src/wasm-lib/kcl/src/walk/ast_walk.rs b/src/wasm-lib/kcl/src/walk/ast_walk.rs index 03d872446..ab8d27d54 100644 --- a/src/wasm-lib/kcl/src/walk/ast_walk.rs +++ b/src/wasm-lib/kcl/src/walk/ast_walk.rs @@ -1,312 +1,55 @@ use anyhow::Result; +use super::ast_visitor::{Visitable, Visitor}; use crate::{ - ast::types::{ - BinaryPart, BodyItem, Expr, IfExpression, LiteralIdentifier, MemberExpression, MemberObject, ObjectExpression, - ObjectProperty, Parameter, Program, UnaryExpression, VariableDeclarator, - }, + parsing::ast::types::{NodeRef, Program}, walk::Node, }; -/// Walker is implemented by things that are able to walk an AST tree to -/// produce lints. This trait is implemented automatically for a few of the -/// common types, but can be manually implemented too. +/// *DEPRECATED* Walk trait. +/// +/// This was written before [Visitor], which is the better way to traverse +/// a AST. +/// +/// This trait continues to exist in order to not change all the linter +/// as we refine the walk code. +/// +/// This, internally, uses the new [Visitor] trait, and is only provided as +/// a stub until we migrate all existing code off this trait. pub trait Walker<'a> { - /// Walk will visit every element of the AST. + /// Walk will visit every element of the AST, recursing through the + /// whole tree. fn walk(&self, n: Node<'a>) -> Result; } -impl<'a, FnT> Walker<'a> for FnT +impl<'tree, VisitorT> Walker<'tree> for VisitorT where - FnT: Fn(Node<'a>) -> Result, + VisitorT: Visitor<'tree>, + VisitorT: Clone, + anyhow::Error: From, + VisitorT::Error: Send, + VisitorT::Error: Sync, { - fn walk(&self, n: Node<'a>) -> Result { - self(n) + fn walk(&self, n: Node<'tree>) -> Result { + if !n.visit(self.clone())? { + return Ok(false); + } + for child in n.children() { + if !Self::walk(self, child)? { + return Ok(false); + } + } + Ok(true) } } /// Run the Walker against all [Node]s in a [Program]. -pub fn walk<'a, WalkT>(prog: &'a Program, f: &WalkT) -> Result +pub fn walk<'a, WalkT>(prog: NodeRef<'a, Program>, f: WalkT) -> Result where WalkT: Walker<'a>, { - if !f.walk(prog.into())? { - return Ok(false); - } - - for bi in &prog.body { - if !walk_body_item(bi, f)? { - return Ok(false); - } - } - Ok(true) -} - -fn walk_variable_declarator<'a, WalkT>(node: &'a VariableDeclarator, f: &WalkT) -> Result -where - WalkT: Walker<'a>, -{ - if !f.walk(node.into())? { - return Ok(false); - } - if !f.walk((&node.id).into())? { - return Ok(false); - } - walk_value(&node.init, f) -} - -fn walk_parameter<'a, WalkT>(node: &'a Parameter, f: &WalkT) -> Result -where - WalkT: Walker<'a>, -{ - if !f.walk(node.into())? { - return Ok(false); - } - f.walk((&node.identifier).into()) -} - -fn walk_member_object<'a, WalkT>(node: &'a MemberObject, f: &WalkT) -> Result -where - WalkT: Walker<'a>, -{ - f.walk(node.into()) -} - -fn walk_literal_identifier<'a, WalkT>(node: &'a LiteralIdentifier, f: &WalkT) -> Result -where - WalkT: Walker<'a>, -{ - f.walk(node.into()) -} - -fn walk_member_expression<'a, WalkT>(node: &'a MemberExpression, f: &WalkT) -> Result -where - WalkT: Walker<'a>, -{ - if !f.walk(node.into())? { - return Ok(false); - } - - if !walk_member_object(&node.object, f)? { - return Ok(false); - } - - walk_literal_identifier(&node.property, f) -} - -fn walk_binary_part<'a, WalkT>(node: &'a BinaryPart, f: &WalkT) -> Result -where - WalkT: Walker<'a>, -{ - match node { - BinaryPart::Literal(lit) => f.walk(lit.as_ref().into()), - BinaryPart::Identifier(id) => f.walk(id.as_ref().into()), - BinaryPart::BinaryExpression(be) => f.walk(be.as_ref().into()), - BinaryPart::CallExpression(ce) => f.walk(ce.as_ref().into()), - BinaryPart::UnaryExpression(ue) => walk_unary_expression(ue, f), - BinaryPart::MemberExpression(me) => walk_member_expression(me, f), - BinaryPart::IfExpression(e) => walk_if_expression(e, f), - } -} - -// TODO: Rename this to walk_expr -fn walk_value<'a, WalkT>(node: &'a Expr, f: &WalkT) -> Result -where - WalkT: Walker<'a>, -{ - match node { - Expr::Literal(lit) => f.walk(lit.as_ref().into()), - Expr::TagDeclarator(tag) => f.walk(tag.as_ref().into()), - - Expr::Identifier(id) => { - // sometimes there's a bare Identifier without a Value::Identifier. - f.walk(id.as_ref().into()) - } - - Expr::BinaryExpression(be) => { - if !f.walk(be.as_ref().into())? { - return Ok(false); - } - if !walk_binary_part(&be.left, f)? { - return Ok(false); - } - walk_binary_part(&be.right, f) - } - Expr::FunctionExpression(fe) => { - if !f.walk(fe.as_ref().into())? { - return Ok(false); - } - - for arg in &fe.params { - if !walk_parameter(arg, f)? { - return Ok(false); - } - } - walk(&fe.body, f) - } - Expr::CallExpression(ce) => { - if !f.walk(ce.as_ref().into())? { - return Ok(false); - } - - if !f.walk((&ce.callee).into())? { - return Ok(false); - } - for e in &ce.arguments { - if !walk_value::(e, f)? { - return Ok(false); - } - } - Ok(true) - } - Expr::PipeExpression(pe) => { - if !f.walk(pe.as_ref().into())? { - return Ok(false); - } - - for e in &pe.body { - if !walk_value::(e, f)? { - return Ok(false); - } - } - Ok(true) - } - Expr::PipeSubstitution(ps) => f.walk(ps.as_ref().into()), - Expr::ArrayExpression(ae) => { - if !f.walk(ae.as_ref().into())? { - return Ok(false); - } - for e in &ae.elements { - if !walk_value::(e, f)? { - return Ok(false); - } - } - Ok(true) - } - Expr::ArrayRangeExpression(are) => { - if !f.walk(are.as_ref().into())? { - return Ok(false); - } - if !walk_value::(&are.start_element, f)? { - return Ok(false); - } - if !walk_value::(&are.end_element, f)? { - return Ok(false); - } - Ok(true) - } - Expr::ObjectExpression(oe) => walk_object_expression(oe, f), - Expr::MemberExpression(me) => walk_member_expression(me, f), - Expr::UnaryExpression(ue) => walk_unary_expression(ue, f), - Expr::IfExpression(e) => walk_if_expression(e, f), - Expr::None(_) => Ok(true), - } -} - -/// Walk through an [ObjectProperty]. -fn walk_object_property<'a, WalkT>(node: &'a ObjectProperty, f: &WalkT) -> Result -where - WalkT: Walker<'a>, -{ - if !f.walk(node.into())? { - return Ok(false); - } - walk_value(&node.value, f) -} - -/// Walk through an [ObjectExpression]. -fn walk_object_expression<'a, WalkT>(node: &'a ObjectExpression, f: &WalkT) -> Result -where - WalkT: Walker<'a>, -{ - if !f.walk(node.into())? { - return Ok(false); - } - - for prop in &node.properties { - if !walk_object_property(prop, f)? { - return Ok(false); - } - } - Ok(true) -} - -/// Walk through an [IfExpression]. -fn walk_if_expression<'a, WalkT>(node: &'a IfExpression, f: &WalkT) -> Result -where - WalkT: Walker<'a>, -{ - if !f.walk(node.into())? { - return Ok(false); - } - if !walk_value(&node.cond, f)? { - return Ok(false); - } - - for else_if in &node.else_ifs { - if !walk_value(&else_if.cond, f)? { - return Ok(false); - } - if !walk(&else_if.then_val, f)? { - return Ok(false); - } - } - let final_else = &(*node.final_else); - if !f.walk(final_else.into())? { - return Ok(false); - } - Ok(true) -} - -/// walk through an [UnaryExpression]. -fn walk_unary_expression<'a, WalkT>(node: &'a UnaryExpression, f: &WalkT) -> Result -where - WalkT: Walker<'a>, -{ - if !f.walk(node.into())? { - return Ok(false); - } - walk_binary_part(&node.argument, f) -} - -/// walk through a [BodyItem]. -fn walk_body_item<'a, WalkT>(node: &'a BodyItem, f: &WalkT) -> Result -where - WalkT: Walker<'a>, -{ - // We don't walk a BodyItem since it's an enum itself. - - match node { - BodyItem::ImportStatement(xs) => { - if !f.walk(xs.as_ref().into())? { - return Ok(false); - } - Ok(true) - } - BodyItem::ExpressionStatement(xs) => { - if !f.walk(xs.into())? { - return Ok(false); - } - walk_value(&xs.expression, f) - } - BodyItem::VariableDeclaration(vd) => { - if !f.walk(vd.as_ref().into())? { - return Ok(false); - } - for dec in &vd.declarations { - if !walk_variable_declarator(dec, f)? { - return Ok(false); - } - } - Ok(true) - } - BodyItem::ReturnStatement(rs) => { - if !f.walk(rs.into())? { - return Ok(false); - } - walk_value(&rs.argument, f) - } - } + let prog: Node = prog.into(); + f.walk(prog) } #[cfg(test)] @@ -315,9 +58,7 @@ mod tests { macro_rules! kcl { ( $kcl:expr ) => {{ - let tokens = $crate::token::lexer($kcl).unwrap(); - let parser = $crate::parser::Parser::new(tokens); - parser.ast().unwrap() + $crate::parsing::top_level_parse($kcl).unwrap() }}; } @@ -330,10 +71,10 @@ const bar = 2 " ); - walk(&program, &|node| { + walk(&program, |node| { if let Node::VariableDeclarator(vd) = node { if vd.id.name == "foo" { - return Ok(false); + return Ok::(false); } panic!("walk didn't stop"); } diff --git a/src/wasm-lib/kcl/src/walk/mod.rs b/src/wasm-lib/kcl/src/walk/mod.rs index 7c0ded69c..68e9bc21f 100644 --- a/src/wasm-lib/kcl/src/walk/mod.rs +++ b/src/wasm-lib/kcl/src/walk/mod.rs @@ -1,4 +1,5 @@ mod ast_node; +mod ast_visitor; mod ast_walk; pub use ast_node::Node; diff --git a/src/wasm-lib/kcl/tests/add_lots/ast.snap b/src/wasm-lib/kcl/tests/add_lots/ast.snap new file mode 100644 index 000000000..08931a6c0 --- /dev/null +++ b/src/wasm-lib/kcl/tests/add_lots/ast.snap @@ -0,0 +1,3097 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing add_lots.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 26, + "id": { + "end": 4, + "name": "f", + "start": 3, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "end": 24, + "left": { + "end": 20, + "name": "i", + "start": 19, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "*", + "right": { + "end": 24, + "raw": "2", + "start": 23, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 19, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 24, + "start": 12, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 26, + "start": 8 + }, + "end": 26, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 6, + "name": "i", + "start": 5, + "type": "Identifier" + } + } + ], + "start": 4, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" + }, + "end": 26, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 828, + "id": { + "end": 29, + "name": "x", + "start": 28, + "type": "Identifier" + }, + "init": { + "end": 828, + "left": { + "end": 819, + "left": { + "end": 811, + "left": { + "end": 803, + "left": { + "end": 795, + "left": { + "end": 787, + "left": { + "end": 779, + "left": { + "end": 771, + "left": { + "end": 763, + "left": { + "end": 755, + "left": { + "end": 747, + "left": { + "end": 739, + "left": { + "end": 731, + "left": { + "end": 723, + "left": { + "end": 715, + "left": { + "end": 707, + "left": { + "end": 699, + "left": { + "end": 691, + "left": { + "end": 683, + "left": { + "end": 675, + "left": { + "end": 667, + "left": { + "end": 659, + "left": { + "end": 651, + "left": { + "end": 643, + "left": { + "end": 635, + "left": { + "end": 627, + "left": { + "end": 619, + "left": { + "end": 611, + "left": { + "end": 603, + "left": { + "end": 595, + "left": { + "end": 587, + "left": { + "end": 579, + "left": { + "end": 571, + "left": { + "end": 563, + "left": { + "end": 555, + "left": { + "end": 547, + "left": { + "end": 539, + "left": { + "end": 531, + "left": { + "end": 523, + "left": { + "end": 515, + "left": { + "end": 507, + "left": { + "end": 499, + "left": { + "end": 491, + "left": { + "end": 483, + "left": { + "end": 475, + "left": { + "end": 467, + "left": { + "end": 459, + "left": { + "end": 451, + "left": { + "end": 443, + "left": { + "end": 435, + "left": { + "end": 427, + "left": { + "end": 419, + "left": { + "end": 411, + "left": { + "end": 403, + "left": { + "end": 395, + "left": { + "end": 387, + "left": { + "end": 379, + "left": { + "end": 371, + "left": { + "end": 363, + "left": { + "end": 355, + "left": { + "end": 347, + "left": { + "end": 339, + "left": { + "end": 331, + "left": { + "end": 323, + "left": { + "end": 315, + "left": { + "end": 307, + "left": { + "end": 299, + "left": { + "end": 291, + "left": { + "end": 283, + "left": { + "end": 275, + "left": { + "end": 267, + "left": { + "end": 259, + "left": { + "end": 251, + "left": { + "end": 243, + "left": { + "end": 235, + "left": { + "end": 227, + "left": { + "end": 219, + "left": { + "end": 211, + "left": { + "end": 203, + "left": { + "end": 195, + "left": { + "end": 187, + "left": { + "end": 179, + "left": { + "end": 171, + "left": { + "end": 163, + "left": { + "end": 155, + "left": { + "end": 147, + "left": { + "end": 139, + "left": { + "end": 131, + "left": { + "end": 123, + "left": { + "end": 115, + "left": { + "end": 107, + "left": { + "end": 99, + "left": { + "end": 92, + "left": { + "end": 85, + "left": { + "end": 78, + "left": { + "end": 71, + "left": { + "end": 64, + "left": { + "end": 57, + "left": { + "end": 50, + "left": { + "end": 43, + "left": { + "arguments": [ + { + "end": 35, + "raw": "0", + "start": 34, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "callee": { + "end": 33, + "name": "f", + "start": 32, + "type": "Identifier" + }, + "end": 36, + "start": 32, + "type": "CallExpression", + "type": "CallExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 42, + "raw": "1", + "start": 41, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + ], + "callee": { + "end": 40, + "name": "f", + "start": 39, + "type": "Identifier" + }, + "end": 43, + "start": 39, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 49, + "raw": "2", + "start": 48, + "type": "Literal", + "type": "Literal", + "value": 2.0 + } + ], + "callee": { + "end": 47, + "name": "f", + "start": 46, + "type": "Identifier" + }, + "end": 50, + "start": 46, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 56, + "raw": "3", + "start": 55, + "type": "Literal", + "type": "Literal", + "value": 3.0 + } + ], + "callee": { + "end": 54, + "name": "f", + "start": 53, + "type": "Identifier" + }, + "end": 57, + "start": 53, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 63, + "raw": "4", + "start": 62, + "type": "Literal", + "type": "Literal", + "value": 4.0 + } + ], + "callee": { + "end": 61, + "name": "f", + "start": 60, + "type": "Identifier" + }, + "end": 64, + "start": 60, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 70, + "raw": "5", + "start": 69, + "type": "Literal", + "type": "Literal", + "value": 5.0 + } + ], + "callee": { + "end": 68, + "name": "f", + "start": 67, + "type": "Identifier" + }, + "end": 71, + "start": 67, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 77, + "raw": "6", + "start": 76, + "type": "Literal", + "type": "Literal", + "value": 6.0 + } + ], + "callee": { + "end": 75, + "name": "f", + "start": 74, + "type": "Identifier" + }, + "end": 78, + "start": 74, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 84, + "raw": "7", + "start": 83, + "type": "Literal", + "type": "Literal", + "value": 7.0 + } + ], + "callee": { + "end": 82, + "name": "f", + "start": 81, + "type": "Identifier" + }, + "end": 85, + "start": 81, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 91, + "raw": "8", + "start": 90, + "type": "Literal", + "type": "Literal", + "value": 8.0 + } + ], + "callee": { + "end": 89, + "name": "f", + "start": 88, + "type": "Identifier" + }, + "end": 92, + "start": 88, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 98, + "raw": "9", + "start": 97, + "type": "Literal", + "type": "Literal", + "value": 9.0 + } + ], + "callee": { + "end": 96, + "name": "f", + "start": 95, + "type": "Identifier" + }, + "end": 99, + "start": 95, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 106, + "raw": "10", + "start": 104, + "type": "Literal", + "type": "Literal", + "value": 10.0 + } + ], + "callee": { + "end": 103, + "name": "f", + "start": 102, + "type": "Identifier" + }, + "end": 107, + "start": 102, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 114, + "raw": "11", + "start": 112, + "type": "Literal", + "type": "Literal", + "value": 11.0 + } + ], + "callee": { + "end": 111, + "name": "f", + "start": 110, + "type": "Identifier" + }, + "end": 115, + "start": 110, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 122, + "raw": "12", + "start": 120, + "type": "Literal", + "type": "Literal", + "value": 12.0 + } + ], + "callee": { + "end": 119, + "name": "f", + "start": 118, + "type": "Identifier" + }, + "end": 123, + "start": 118, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 130, + "raw": "13", + "start": 128, + "type": "Literal", + "type": "Literal", + "value": 13.0 + } + ], + "callee": { + "end": 127, + "name": "f", + "start": 126, + "type": "Identifier" + }, + "end": 131, + "start": 126, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 138, + "raw": "14", + "start": 136, + "type": "Literal", + "type": "Literal", + "value": 14.0 + } + ], + "callee": { + "end": 135, + "name": "f", + "start": 134, + "type": "Identifier" + }, + "end": 139, + "start": 134, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 146, + "raw": "15", + "start": 144, + "type": "Literal", + "type": "Literal", + "value": 15.0 + } + ], + "callee": { + "end": 143, + "name": "f", + "start": 142, + "type": "Identifier" + }, + "end": 147, + "start": 142, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 154, + "raw": "16", + "start": 152, + "type": "Literal", + "type": "Literal", + "value": 16.0 + } + ], + "callee": { + "end": 151, + "name": "f", + "start": 150, + "type": "Identifier" + }, + "end": 155, + "start": 150, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 162, + "raw": "17", + "start": 160, + "type": "Literal", + "type": "Literal", + "value": 17.0 + } + ], + "callee": { + "end": 159, + "name": "f", + "start": 158, + "type": "Identifier" + }, + "end": 163, + "start": 158, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 170, + "raw": "18", + "start": 168, + "type": "Literal", + "type": "Literal", + "value": 18.0 + } + ], + "callee": { + "end": 167, + "name": "f", + "start": 166, + "type": "Identifier" + }, + "end": 171, + "start": 166, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 178, + "raw": "19", + "start": 176, + "type": "Literal", + "type": "Literal", + "value": 19.0 + } + ], + "callee": { + "end": 175, + "name": "f", + "start": 174, + "type": "Identifier" + }, + "end": 179, + "start": 174, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 186, + "raw": "20", + "start": 184, + "type": "Literal", + "type": "Literal", + "value": 20.0 + } + ], + "callee": { + "end": 183, + "name": "f", + "start": 182, + "type": "Identifier" + }, + "end": 187, + "start": 182, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 194, + "raw": "21", + "start": 192, + "type": "Literal", + "type": "Literal", + "value": 21.0 + } + ], + "callee": { + "end": 191, + "name": "f", + "start": 190, + "type": "Identifier" + }, + "end": 195, + "start": 190, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 202, + "raw": "22", + "start": 200, + "type": "Literal", + "type": "Literal", + "value": 22.0 + } + ], + "callee": { + "end": 199, + "name": "f", + "start": 198, + "type": "Identifier" + }, + "end": 203, + "start": 198, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 210, + "raw": "23", + "start": 208, + "type": "Literal", + "type": "Literal", + "value": 23.0 + } + ], + "callee": { + "end": 207, + "name": "f", + "start": 206, + "type": "Identifier" + }, + "end": 211, + "start": 206, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 218, + "raw": "24", + "start": 216, + "type": "Literal", + "type": "Literal", + "value": 24.0 + } + ], + "callee": { + "end": 215, + "name": "f", + "start": 214, + "type": "Identifier" + }, + "end": 219, + "start": 214, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 226, + "raw": "25", + "start": 224, + "type": "Literal", + "type": "Literal", + "value": 25.0 + } + ], + "callee": { + "end": 223, + "name": "f", + "start": 222, + "type": "Identifier" + }, + "end": 227, + "start": 222, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 234, + "raw": "26", + "start": 232, + "type": "Literal", + "type": "Literal", + "value": 26.0 + } + ], + "callee": { + "end": 231, + "name": "f", + "start": 230, + "type": "Identifier" + }, + "end": 235, + "start": 230, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 242, + "raw": "27", + "start": 240, + "type": "Literal", + "type": "Literal", + "value": 27.0 + } + ], + "callee": { + "end": 239, + "name": "f", + "start": 238, + "type": "Identifier" + }, + "end": 243, + "start": 238, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 250, + "raw": "28", + "start": 248, + "type": "Literal", + "type": "Literal", + "value": 28.0 + } + ], + "callee": { + "end": 247, + "name": "f", + "start": 246, + "type": "Identifier" + }, + "end": 251, + "start": 246, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 258, + "raw": "29", + "start": 256, + "type": "Literal", + "type": "Literal", + "value": 29.0 + } + ], + "callee": { + "end": 255, + "name": "f", + "start": 254, + "type": "Identifier" + }, + "end": 259, + "start": 254, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 266, + "raw": "30", + "start": 264, + "type": "Literal", + "type": "Literal", + "value": 30.0 + } + ], + "callee": { + "end": 263, + "name": "f", + "start": 262, + "type": "Identifier" + }, + "end": 267, + "start": 262, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 274, + "raw": "31", + "start": 272, + "type": "Literal", + "type": "Literal", + "value": 31.0 + } + ], + "callee": { + "end": 271, + "name": "f", + "start": 270, + "type": "Identifier" + }, + "end": 275, + "start": 270, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 282, + "raw": "32", + "start": 280, + "type": "Literal", + "type": "Literal", + "value": 32.0 + } + ], + "callee": { + "end": 279, + "name": "f", + "start": 278, + "type": "Identifier" + }, + "end": 283, + "start": 278, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 290, + "raw": "33", + "start": 288, + "type": "Literal", + "type": "Literal", + "value": 33.0 + } + ], + "callee": { + "end": 287, + "name": "f", + "start": 286, + "type": "Identifier" + }, + "end": 291, + "start": 286, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 298, + "raw": "34", + "start": 296, + "type": "Literal", + "type": "Literal", + "value": 34.0 + } + ], + "callee": { + "end": 295, + "name": "f", + "start": 294, + "type": "Identifier" + }, + "end": 299, + "start": 294, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 306, + "raw": "35", + "start": 304, + "type": "Literal", + "type": "Literal", + "value": 35.0 + } + ], + "callee": { + "end": 303, + "name": "f", + "start": 302, + "type": "Identifier" + }, + "end": 307, + "start": 302, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 314, + "raw": "36", + "start": 312, + "type": "Literal", + "type": "Literal", + "value": 36.0 + } + ], + "callee": { + "end": 311, + "name": "f", + "start": 310, + "type": "Identifier" + }, + "end": 315, + "start": 310, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 322, + "raw": "37", + "start": 320, + "type": "Literal", + "type": "Literal", + "value": 37.0 + } + ], + "callee": { + "end": 319, + "name": "f", + "start": 318, + "type": "Identifier" + }, + "end": 323, + "start": 318, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 330, + "raw": "38", + "start": 328, + "type": "Literal", + "type": "Literal", + "value": 38.0 + } + ], + "callee": { + "end": 327, + "name": "f", + "start": 326, + "type": "Identifier" + }, + "end": 331, + "start": 326, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 338, + "raw": "39", + "start": 336, + "type": "Literal", + "type": "Literal", + "value": 39.0 + } + ], + "callee": { + "end": 335, + "name": "f", + "start": 334, + "type": "Identifier" + }, + "end": 339, + "start": 334, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 346, + "raw": "40", + "start": 344, + "type": "Literal", + "type": "Literal", + "value": 40.0 + } + ], + "callee": { + "end": 343, + "name": "f", + "start": 342, + "type": "Identifier" + }, + "end": 347, + "start": 342, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 354, + "raw": "41", + "start": 352, + "type": "Literal", + "type": "Literal", + "value": 41.0 + } + ], + "callee": { + "end": 351, + "name": "f", + "start": 350, + "type": "Identifier" + }, + "end": 355, + "start": 350, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 362, + "raw": "42", + "start": 360, + "type": "Literal", + "type": "Literal", + "value": 42.0 + } + ], + "callee": { + "end": 359, + "name": "f", + "start": 358, + "type": "Identifier" + }, + "end": 363, + "start": 358, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 370, + "raw": "43", + "start": 368, + "type": "Literal", + "type": "Literal", + "value": 43.0 + } + ], + "callee": { + "end": 367, + "name": "f", + "start": 366, + "type": "Identifier" + }, + "end": 371, + "start": 366, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 378, + "raw": "44", + "start": 376, + "type": "Literal", + "type": "Literal", + "value": 44.0 + } + ], + "callee": { + "end": 375, + "name": "f", + "start": 374, + "type": "Identifier" + }, + "end": 379, + "start": 374, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 386, + "raw": "45", + "start": 384, + "type": "Literal", + "type": "Literal", + "value": 45.0 + } + ], + "callee": { + "end": 383, + "name": "f", + "start": 382, + "type": "Identifier" + }, + "end": 387, + "start": 382, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 394, + "raw": "46", + "start": 392, + "type": "Literal", + "type": "Literal", + "value": 46.0 + } + ], + "callee": { + "end": 391, + "name": "f", + "start": 390, + "type": "Identifier" + }, + "end": 395, + "start": 390, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 402, + "raw": "47", + "start": 400, + "type": "Literal", + "type": "Literal", + "value": 47.0 + } + ], + "callee": { + "end": 399, + "name": "f", + "start": 398, + "type": "Identifier" + }, + "end": 403, + "start": 398, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 410, + "raw": "48", + "start": 408, + "type": "Literal", + "type": "Literal", + "value": 48.0 + } + ], + "callee": { + "end": 407, + "name": "f", + "start": 406, + "type": "Identifier" + }, + "end": 411, + "start": 406, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 418, + "raw": "49", + "start": 416, + "type": "Literal", + "type": "Literal", + "value": 49.0 + } + ], + "callee": { + "end": 415, + "name": "f", + "start": 414, + "type": "Identifier" + }, + "end": 419, + "start": 414, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 426, + "raw": "50", + "start": 424, + "type": "Literal", + "type": "Literal", + "value": 50.0 + } + ], + "callee": { + "end": 423, + "name": "f", + "start": 422, + "type": "Identifier" + }, + "end": 427, + "start": 422, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 434, + "raw": "51", + "start": 432, + "type": "Literal", + "type": "Literal", + "value": 51.0 + } + ], + "callee": { + "end": 431, + "name": "f", + "start": 430, + "type": "Identifier" + }, + "end": 435, + "start": 430, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 442, + "raw": "52", + "start": 440, + "type": "Literal", + "type": "Literal", + "value": 52.0 + } + ], + "callee": { + "end": 439, + "name": "f", + "start": 438, + "type": "Identifier" + }, + "end": 443, + "start": 438, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 450, + "raw": "53", + "start": 448, + "type": "Literal", + "type": "Literal", + "value": 53.0 + } + ], + "callee": { + "end": 447, + "name": "f", + "start": 446, + "type": "Identifier" + }, + "end": 451, + "start": 446, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 458, + "raw": "54", + "start": 456, + "type": "Literal", + "type": "Literal", + "value": 54.0 + } + ], + "callee": { + "end": 455, + "name": "f", + "start": 454, + "type": "Identifier" + }, + "end": 459, + "start": 454, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 466, + "raw": "55", + "start": 464, + "type": "Literal", + "type": "Literal", + "value": 55.0 + } + ], + "callee": { + "end": 463, + "name": "f", + "start": 462, + "type": "Identifier" + }, + "end": 467, + "start": 462, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 474, + "raw": "56", + "start": 472, + "type": "Literal", + "type": "Literal", + "value": 56.0 + } + ], + "callee": { + "end": 471, + "name": "f", + "start": 470, + "type": "Identifier" + }, + "end": 475, + "start": 470, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 482, + "raw": "57", + "start": 480, + "type": "Literal", + "type": "Literal", + "value": 57.0 + } + ], + "callee": { + "end": 479, + "name": "f", + "start": 478, + "type": "Identifier" + }, + "end": 483, + "start": 478, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 490, + "raw": "58", + "start": 488, + "type": "Literal", + "type": "Literal", + "value": 58.0 + } + ], + "callee": { + "end": 487, + "name": "f", + "start": 486, + "type": "Identifier" + }, + "end": 491, + "start": 486, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 498, + "raw": "59", + "start": 496, + "type": "Literal", + "type": "Literal", + "value": 59.0 + } + ], + "callee": { + "end": 495, + "name": "f", + "start": 494, + "type": "Identifier" + }, + "end": 499, + "start": 494, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 506, + "raw": "60", + "start": 504, + "type": "Literal", + "type": "Literal", + "value": 60.0 + } + ], + "callee": { + "end": 503, + "name": "f", + "start": 502, + "type": "Identifier" + }, + "end": 507, + "start": 502, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 514, + "raw": "61", + "start": 512, + "type": "Literal", + "type": "Literal", + "value": 61.0 + } + ], + "callee": { + "end": 511, + "name": "f", + "start": 510, + "type": "Identifier" + }, + "end": 515, + "start": 510, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 522, + "raw": "62", + "start": 520, + "type": "Literal", + "type": "Literal", + "value": 62.0 + } + ], + "callee": { + "end": 519, + "name": "f", + "start": 518, + "type": "Identifier" + }, + "end": 523, + "start": 518, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 530, + "raw": "63", + "start": 528, + "type": "Literal", + "type": "Literal", + "value": 63.0 + } + ], + "callee": { + "end": 527, + "name": "f", + "start": 526, + "type": "Identifier" + }, + "end": 531, + "start": 526, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 538, + "raw": "64", + "start": 536, + "type": "Literal", + "type": "Literal", + "value": 64.0 + } + ], + "callee": { + "end": 535, + "name": "f", + "start": 534, + "type": "Identifier" + }, + "end": 539, + "start": 534, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 546, + "raw": "65", + "start": 544, + "type": "Literal", + "type": "Literal", + "value": 65.0 + } + ], + "callee": { + "end": 543, + "name": "f", + "start": 542, + "type": "Identifier" + }, + "end": 547, + "start": 542, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 554, + "raw": "66", + "start": 552, + "type": "Literal", + "type": "Literal", + "value": 66.0 + } + ], + "callee": { + "end": 551, + "name": "f", + "start": 550, + "type": "Identifier" + }, + "end": 555, + "start": 550, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 562, + "raw": "67", + "start": 560, + "type": "Literal", + "type": "Literal", + "value": 67.0 + } + ], + "callee": { + "end": 559, + "name": "f", + "start": 558, + "type": "Identifier" + }, + "end": 563, + "start": 558, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 570, + "raw": "68", + "start": 568, + "type": "Literal", + "type": "Literal", + "value": 68.0 + } + ], + "callee": { + "end": 567, + "name": "f", + "start": 566, + "type": "Identifier" + }, + "end": 571, + "start": 566, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 578, + "raw": "69", + "start": 576, + "type": "Literal", + "type": "Literal", + "value": 69.0 + } + ], + "callee": { + "end": 575, + "name": "f", + "start": 574, + "type": "Identifier" + }, + "end": 579, + "start": 574, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 586, + "raw": "70", + "start": 584, + "type": "Literal", + "type": "Literal", + "value": 70.0 + } + ], + "callee": { + "end": 583, + "name": "f", + "start": 582, + "type": "Identifier" + }, + "end": 587, + "start": 582, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 594, + "raw": "71", + "start": 592, + "type": "Literal", + "type": "Literal", + "value": 71.0 + } + ], + "callee": { + "end": 591, + "name": "f", + "start": 590, + "type": "Identifier" + }, + "end": 595, + "start": 590, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 602, + "raw": "72", + "start": 600, + "type": "Literal", + "type": "Literal", + "value": 72.0 + } + ], + "callee": { + "end": 599, + "name": "f", + "start": 598, + "type": "Identifier" + }, + "end": 603, + "start": 598, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 610, + "raw": "73", + "start": 608, + "type": "Literal", + "type": "Literal", + "value": 73.0 + } + ], + "callee": { + "end": 607, + "name": "f", + "start": 606, + "type": "Identifier" + }, + "end": 611, + "start": 606, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 618, + "raw": "74", + "start": 616, + "type": "Literal", + "type": "Literal", + "value": 74.0 + } + ], + "callee": { + "end": 615, + "name": "f", + "start": 614, + "type": "Identifier" + }, + "end": 619, + "start": 614, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 626, + "raw": "75", + "start": 624, + "type": "Literal", + "type": "Literal", + "value": 75.0 + } + ], + "callee": { + "end": 623, + "name": "f", + "start": 622, + "type": "Identifier" + }, + "end": 627, + "start": 622, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 634, + "raw": "76", + "start": 632, + "type": "Literal", + "type": "Literal", + "value": 76.0 + } + ], + "callee": { + "end": 631, + "name": "f", + "start": 630, + "type": "Identifier" + }, + "end": 635, + "start": 630, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 642, + "raw": "77", + "start": 640, + "type": "Literal", + "type": "Literal", + "value": 77.0 + } + ], + "callee": { + "end": 639, + "name": "f", + "start": 638, + "type": "Identifier" + }, + "end": 643, + "start": 638, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 650, + "raw": "78", + "start": 648, + "type": "Literal", + "type": "Literal", + "value": 78.0 + } + ], + "callee": { + "end": 647, + "name": "f", + "start": 646, + "type": "Identifier" + }, + "end": 651, + "start": 646, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 658, + "raw": "79", + "start": 656, + "type": "Literal", + "type": "Literal", + "value": 79.0 + } + ], + "callee": { + "end": 655, + "name": "f", + "start": 654, + "type": "Identifier" + }, + "end": 659, + "start": 654, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 666, + "raw": "80", + "start": 664, + "type": "Literal", + "type": "Literal", + "value": 80.0 + } + ], + "callee": { + "end": 663, + "name": "f", + "start": 662, + "type": "Identifier" + }, + "end": 667, + "start": 662, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 674, + "raw": "81", + "start": 672, + "type": "Literal", + "type": "Literal", + "value": 81.0 + } + ], + "callee": { + "end": 671, + "name": "f", + "start": 670, + "type": "Identifier" + }, + "end": 675, + "start": 670, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 682, + "raw": "82", + "start": 680, + "type": "Literal", + "type": "Literal", + "value": 82.0 + } + ], + "callee": { + "end": 679, + "name": "f", + "start": 678, + "type": "Identifier" + }, + "end": 683, + "start": 678, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 690, + "raw": "83", + "start": 688, + "type": "Literal", + "type": "Literal", + "value": 83.0 + } + ], + "callee": { + "end": 687, + "name": "f", + "start": 686, + "type": "Identifier" + }, + "end": 691, + "start": 686, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 698, + "raw": "84", + "start": 696, + "type": "Literal", + "type": "Literal", + "value": 84.0 + } + ], + "callee": { + "end": 695, + "name": "f", + "start": 694, + "type": "Identifier" + }, + "end": 699, + "start": 694, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 706, + "raw": "85", + "start": 704, + "type": "Literal", + "type": "Literal", + "value": 85.0 + } + ], + "callee": { + "end": 703, + "name": "f", + "start": 702, + "type": "Identifier" + }, + "end": 707, + "start": 702, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 714, + "raw": "86", + "start": 712, + "type": "Literal", + "type": "Literal", + "value": 86.0 + } + ], + "callee": { + "end": 711, + "name": "f", + "start": 710, + "type": "Identifier" + }, + "end": 715, + "start": 710, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 722, + "raw": "87", + "start": 720, + "type": "Literal", + "type": "Literal", + "value": 87.0 + } + ], + "callee": { + "end": 719, + "name": "f", + "start": 718, + "type": "Identifier" + }, + "end": 723, + "start": 718, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 730, + "raw": "88", + "start": 728, + "type": "Literal", + "type": "Literal", + "value": 88.0 + } + ], + "callee": { + "end": 727, + "name": "f", + "start": 726, + "type": "Identifier" + }, + "end": 731, + "start": 726, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 738, + "raw": "89", + "start": 736, + "type": "Literal", + "type": "Literal", + "value": 89.0 + } + ], + "callee": { + "end": 735, + "name": "f", + "start": 734, + "type": "Identifier" + }, + "end": 739, + "start": 734, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 746, + "raw": "90", + "start": 744, + "type": "Literal", + "type": "Literal", + "value": 90.0 + } + ], + "callee": { + "end": 743, + "name": "f", + "start": 742, + "type": "Identifier" + }, + "end": 747, + "start": 742, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 754, + "raw": "91", + "start": 752, + "type": "Literal", + "type": "Literal", + "value": 91.0 + } + ], + "callee": { + "end": 751, + "name": "f", + "start": 750, + "type": "Identifier" + }, + "end": 755, + "start": 750, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 762, + "raw": "92", + "start": 760, + "type": "Literal", + "type": "Literal", + "value": 92.0 + } + ], + "callee": { + "end": 759, + "name": "f", + "start": 758, + "type": "Identifier" + }, + "end": 763, + "start": 758, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 770, + "raw": "93", + "start": 768, + "type": "Literal", + "type": "Literal", + "value": 93.0 + } + ], + "callee": { + "end": 767, + "name": "f", + "start": 766, + "type": "Identifier" + }, + "end": 771, + "start": 766, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 778, + "raw": "94", + "start": 776, + "type": "Literal", + "type": "Literal", + "value": 94.0 + } + ], + "callee": { + "end": 775, + "name": "f", + "start": 774, + "type": "Identifier" + }, + "end": 779, + "start": 774, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 786, + "raw": "95", + "start": 784, + "type": "Literal", + "type": "Literal", + "value": 95.0 + } + ], + "callee": { + "end": 783, + "name": "f", + "start": 782, + "type": "Identifier" + }, + "end": 787, + "start": 782, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 794, + "raw": "96", + "start": 792, + "type": "Literal", + "type": "Literal", + "value": 96.0 + } + ], + "callee": { + "end": 791, + "name": "f", + "start": 790, + "type": "Identifier" + }, + "end": 795, + "start": 790, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 802, + "raw": "97", + "start": 800, + "type": "Literal", + "type": "Literal", + "value": 97.0 + } + ], + "callee": { + "end": 799, + "name": "f", + "start": 798, + "type": "Identifier" + }, + "end": 803, + "start": 798, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 810, + "raw": "98", + "start": 808, + "type": "Literal", + "type": "Literal", + "value": 98.0 + } + ], + "callee": { + "end": 807, + "name": "f", + "start": 806, + "type": "Identifier" + }, + "end": 811, + "start": 806, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 818, + "raw": "99", + "start": 816, + "type": "Literal", + "type": "Literal", + "value": 99.0 + } + ], + "callee": { + "end": 815, + "name": "f", + "start": 814, + "type": "Identifier" + }, + "end": 819, + "start": 814, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "arguments": [ + { + "end": 827, + "raw": "100", + "start": 824, + "type": "Literal", + "type": "Literal", + "value": 100.0 + } + ], + "callee": { + "end": 823, + "name": "f", + "start": 822, + "type": "Identifier" + }, + "end": 828, + "start": 822, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 28, + "type": "VariableDeclarator" + }, + "end": 828, + "kind": "const", + "start": 28, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 867, + "expression": { + "arguments": [ + { + "end": 843, + "name": "x", + "start": 842, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 850, + "raw": "10100", + "start": 845, + "type": "Literal", + "type": "Literal", + "value": 10100.0 + }, + { + "end": 855, + "raw": "0.1", + "start": 852, + "type": "Literal", + "type": "Literal", + "value": 0.1 + }, + { + "end": 866, + "raw": "\"Big sum\"", + "start": 857, + "type": "Literal", + "type": "Literal", + "value": "Big sum" + } + ], + "callee": { + "end": 841, + "name": "assertEqual", + "start": 830, + "type": "Identifier" + }, + "end": 867, + "start": 830, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 830, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 868, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 28, + "start": 26, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "1": [ + { + "end": 830, + "start": 828, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/add_lots/input.kcl b/src/wasm-lib/kcl/tests/add_lots/input.kcl new file mode 100644 index 000000000..9694032cd --- /dev/null +++ b/src/wasm-lib/kcl/tests/add_lots/input.kcl @@ -0,0 +1,7 @@ +fn f(i) { + return i * 2 +} + +x = f(0) + f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) + f(8) + f(9) + f(10) + f(11) + f(12) + f(13) + f(14) + f(15) + f(16) + f(17) + f(18) + f(19) + f(20) + f(21) + f(22) + f(23) + f(24) + f(25) + f(26) + f(27) + f(28) + f(29) + f(30) + f(31) + f(32) + f(33) + f(34) + f(35) + f(36) + f(37) + f(38) + f(39) + f(40) + f(41) + f(42) + f(43) + f(44) + f(45) + f(46) + f(47) + f(48) + f(49) + f(50) + f(51) + f(52) + f(53) + f(54) + f(55) + f(56) + f(57) + f(58) + f(59) + f(60) + f(61) + f(62) + f(63) + f(64) + f(65) + f(66) + f(67) + f(68) + f(69) + f(70) + f(71) + f(72) + f(73) + f(74) + f(75) + f(76) + f(77) + f(78) + f(79) + f(80) + f(81) + f(82) + f(83) + f(84) + f(85) + f(86) + f(87) + f(88) + f(89) + f(90) + f(91) + f(92) + f(93) + f(94) + f(95) + f(96) + f(97) + f(98) + f(99) + f(100) + +assertEqual(x, 10100, 0.1, "Big sum") diff --git a/src/wasm-lib/kcl/tests/add_lots/ops.snap b/src/wasm-lib/kcl/tests/add_lots/ops.snap new file mode 100644 index 000000000..a2efd7a37 --- /dev/null +++ b/src/wasm-lib/kcl/tests/add_lots/ops.snap @@ -0,0 +1,1926 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed add_lots.kcl +snapshot_kind: text +--- +[ + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 32, + 36, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 39, + 43, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 46, + 50, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 53, + 57, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 60, + 64, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 67, + 71, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 74, + 78, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 81, + 85, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 88, + 92, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 95, + 99, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 102, + 107, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 110, + 115, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 118, + 123, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 126, + 131, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 134, + 139, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 142, + 147, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 150, + 155, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 158, + 163, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 166, + 171, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 174, + 179, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 182, + 187, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 190, + 195, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 198, + 203, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 206, + 211, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 214, + 219, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 222, + 227, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 230, + 235, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 238, + 243, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 246, + 251, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 254, + 259, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 262, + 267, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 270, + 275, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 278, + 283, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 286, + 291, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 294, + 299, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 302, + 307, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 310, + 315, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 318, + 323, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 326, + 331, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 334, + 339, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 342, + 347, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 350, + 355, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 358, + 363, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 366, + 371, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 374, + 379, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 382, + 387, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 390, + 395, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 398, + 403, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 406, + 411, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 414, + 419, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 422, + 427, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 430, + 435, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 438, + 443, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 446, + 451, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 454, + 459, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 462, + 467, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 470, + 475, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 478, + 483, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 486, + 491, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 494, + 499, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 502, + 507, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 510, + 515, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 518, + 523, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 526, + 531, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 534, + 539, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 542, + 547, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 550, + 555, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 558, + 563, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 566, + 571, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 574, + 579, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 582, + 587, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 590, + 595, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 598, + 603, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 606, + 611, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 614, + 619, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 622, + 627, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 630, + 635, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 638, + 643, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 646, + 651, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 654, + 659, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 662, + 667, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 670, + 675, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 678, + 683, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 686, + 691, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 694, + 699, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 702, + 707, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 710, + 715, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 718, + 723, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 726, + 731, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 734, + 739, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 742, + 747, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 750, + 755, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 758, + 763, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 766, + 771, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 774, + 779, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 782, + 787, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 790, + 795, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 798, + 803, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 806, + 811, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 814, + 819, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "f", + "functionSourceRange": [ + 4, + 26, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 822, + 828, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + } +] diff --git a/src/wasm-lib/kcl/tests/add_lots/program_memory.snap b/src/wasm-lib/kcl/tests/add_lots/program_memory.snap new file mode 100644 index 000000000..c44bc2a30 --- /dev/null +++ b/src/wasm-lib/kcl/tests/add_lots/program_memory.snap @@ -0,0 +1,1549 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing add_lots.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "f": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "argument": { + "end": 24, + "left": { + "end": 20, + "name": "i", + "start": 19, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "*", + "right": { + "end": 24, + "raw": "2", + "start": 23, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 19, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 24, + "start": 12, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 26, + "start": 8 + }, + "end": 26, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 6, + "name": "i", + "start": 5, + "type": "Identifier" + } + } + ], + "start": 4, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 4, + 26, + 0 + ] + } + ] + }, + "x": { + "type": "Number", + "value": 10100.0, + "__meta": [ + { + "sourceRange": [ + 34, + 35, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 41, + 42, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 48, + 49, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 55, + 56, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 62, + 63, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 69, + 70, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 76, + 77, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 83, + 84, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 90, + 91, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 97, + 98, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 104, + 106, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 112, + 114, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 120, + 122, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 128, + 130, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 136, + 138, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 144, + 146, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 152, + 154, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 160, + 162, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 168, + 170, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 176, + 178, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 184, + 186, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 192, + 194, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 200, + 202, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 208, + 210, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 216, + 218, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 224, + 226, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 232, + 234, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 240, + 242, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 248, + 250, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 256, + 258, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 264, + 266, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 272, + 274, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 280, + 282, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 288, + 290, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 296, + 298, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 304, + 306, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 312, + 314, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 320, + 322, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 328, + 330, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 336, + 338, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 344, + 346, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 352, + 354, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 360, + 362, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 368, + 370, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 376, + 378, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 384, + 386, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 392, + 394, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 400, + 402, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 408, + 410, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 416, + 418, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 424, + 426, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 432, + 434, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 440, + 442, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 448, + 450, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 456, + 458, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 464, + 466, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 472, + 474, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 480, + 482, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 488, + 490, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 496, + 498, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 504, + 506, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 512, + 514, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 520, + 522, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 528, + 530, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 536, + 538, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 544, + 546, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 552, + 554, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 560, + 562, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 568, + 570, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 576, + 578, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 584, + 586, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 592, + 594, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 600, + 602, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 608, + 610, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 616, + 618, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 624, + 626, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 632, + 634, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 640, + 642, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 648, + 650, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 656, + 658, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 664, + 666, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 672, + 674, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 680, + 682, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 688, + 690, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 696, + 698, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 704, + 706, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 712, + 714, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 720, + 722, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 728, + 730, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 736, + 738, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 744, + 746, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 752, + 754, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 760, + 762, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 768, + 770, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 776, + 778, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 784, + 786, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 792, + 794, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 800, + 802, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 808, + 810, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 816, + 818, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + }, + { + "sourceRange": [ + 824, + 827, + 0 + ] + }, + { + "sourceRange": [ + 23, + 24, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/angled_line/ast.snap b/src/wasm-lib/kcl/tests/angled_line/ast.snap new file mode 100644 index 000000000..07c53b119 --- /dev/null +++ b/src/wasm-lib/kcl/tests/angled_line/ast.snap @@ -0,0 +1,420 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing angled_line.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 265, + "id": { + "end": 7, + "name": "part001", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 28, + "raw": "'XY'", + "start": 24, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 23, + "name": "startSketchOn", + "start": 10, + "type": "Identifier" + }, + "end": 29, + "start": 10, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 55, + "raw": "4.83", + "start": 51, + "type": "Literal", + "type": "Literal", + "value": 4.83 + }, + { + "end": 62, + "raw": "12.56", + "start": 57, + "type": "Literal", + "type": "Literal", + "value": 12.56 + } + ], + "end": 63, + "start": 50, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 66, + "start": 65, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 49, + "name": "startProfileAt", + "start": 35, + "type": "Identifier" + }, + "end": 67, + "start": 35, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 83, + "raw": "15.1", + "start": 79, + "type": "Literal", + "type": "Literal", + "value": 15.1 + }, + { + "end": 89, + "raw": "2.48", + "start": 85, + "type": "Literal", + "type": "Literal", + "value": 2.48 + } + ], + "end": 90, + "start": 78, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 93, + "start": 92, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 77, + "name": "line", + "start": 73, + "type": "Identifier" + }, + "end": 94, + "start": 73, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 110, + "raw": "3.15", + "start": 106, + "type": "Literal", + "type": "Literal", + "value": 3.15 + }, + { + "argument": { + "end": 117, + "raw": "9.85", + "start": 113, + "type": "Literal", + "type": "Literal", + "value": 9.85 + }, + "end": 117, + "operator": "-", + "start": 112, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 118, + "start": 105, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 121, + "start": 120, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 129, + "start": 123, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "seg01" + } + ], + "callee": { + "end": 104, + "name": "line", + "start": 100, + "type": "Identifier" + }, + "end": 130, + "start": 100, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 148, + "raw": "15.17", + "start": 143, + "type": "Literal", + "type": "Literal", + "value": 15.17 + }, + "end": 148, + "operator": "-", + "start": 142, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 154, + "raw": "4.1", + "start": 151, + "type": "Literal", + "type": "Literal", + "value": 4.1 + }, + "end": 154, + "operator": "-", + "start": 150, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 155, + "start": 141, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 158, + "start": 157, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 140, + "name": "line", + "start": 136, + "type": "Identifier" + }, + "end": 159, + "start": 136, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "arguments": [ + { + "end": 189, + "name": "seg01", + "start": 184, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 183, + "name": "segAng", + "start": 177, + "type": "Identifier" + }, + "end": 190, + "start": 177, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "end": 197, + "raw": "12.35", + "start": 192, + "type": "Literal", + "type": "Literal", + "value": 12.35 + } + ], + "end": 198, + "start": 176, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 201, + "start": 200, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 175, + "name": "angledLine", + "start": 165, + "type": "Identifier" + }, + "end": 202, + "start": 165, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 220, + "raw": "13.02", + "start": 215, + "type": "Literal", + "type": "Literal", + "value": 13.02 + }, + "end": 220, + "operator": "-", + "start": 214, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 227, + "raw": "10.03", + "start": 222, + "type": "Literal", + "type": "Literal", + "value": 10.03 + } + ], + "end": 228, + "start": 213, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 231, + "start": 230, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 212, + "name": "line", + "start": 208, + "type": "Identifier" + }, + "end": 232, + "start": 208, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 245, + "start": 244, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 243, + "name": "close", + "start": 238, + "type": "Identifier" + }, + "end": 246, + "start": 238, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 261, + "raw": "4", + "start": 260, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + { + "end": 264, + "start": 263, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 259, + "name": "extrude", + "start": 252, + "type": "Identifier" + }, + "end": 265, + "start": 252, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 265, + "start": 10, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 265, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 266, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/angled_line/input.kcl b/src/wasm-lib/kcl/tests/angled_line/input.kcl new file mode 100644 index 000000000..feb624bb0 --- /dev/null +++ b/src/wasm-lib/kcl/tests/angled_line/input.kcl @@ -0,0 +1,9 @@ +part001 = startSketchOn('XY') + |> startProfileAt([4.83, 12.56], %) + |> line([15.1, 2.48], %) + |> line([3.15, -9.85], %, $seg01) + |> line([-15.17, -4.1], %) + |> angledLine([segAng(seg01), 12.35], %) + |> line([-13.02, 10.03], %) + |> close(%) + |> extrude(4, %) diff --git a/src/wasm-lib/kcl/tests/angled_line/ops.snap b/src/wasm-lib/kcl/tests/angled_line/ops.snap new file mode 100644 index 000000000..20e705ede --- /dev/null +++ b/src/wasm-lib/kcl/tests/angled_line/ops.snap @@ -0,0 +1,52 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed angled_line.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 24, + 28, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 10, + 29, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 260, + 261, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 263, + 264, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 252, + 265, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/angled_line/program_memory.snap b/src/wasm-lib/kcl/tests/angled_line/program_memory.snap new file mode 100644 index 000000000..104b34c2e --- /dev/null +++ b/src/wasm-lib/kcl/tests/angled_line/program_memory.snap @@ -0,0 +1,432 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing angled_line.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "part001": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 73, + 94, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 100, + 130, + 0 + ], + "tag": { + "end": 129, + "start": 123, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 159, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 165, + 202, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 208, + 232, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 238, + 246, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 73, + 94, + 0 + ] + }, + "from": [ + 4.83, + 12.56 + ], + "tag": null, + "to": [ + 19.93, + 15.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 100, + 130, + 0 + ] + }, + "from": [ + 19.93, + 15.04 + ], + "tag": { + "end": 129, + "start": 123, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 23.08, + 5.19 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 159, + 0 + ] + }, + "from": [ + 23.08, + 5.19 + ], + "tag": null, + "to": [ + 7.91, + 1.09 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 165, + 202, + 0 + ] + }, + "from": [ + 7.91, + 1.09 + ], + "tag": null, + "to": [ + 11.6718, + -10.6731 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 208, + 232, + 0 + ] + }, + "from": [ + 11.6718, + -10.6731 + ], + "tag": null, + "to": [ + -1.3482, + -0.6431 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 238, + 246, + 0 + ] + }, + "from": [ + -1.3482, + -0.6431 + ], + "tag": null, + "to": [ + 4.83, + 12.56 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 4.83, + 12.56 + ], + "to": [ + 4.83, + 12.56 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35, + 67, + 0 + ] + } + }, + "tags": { + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 100, + 130, + 0 + ] + }, + "from": [ + 19.93, + 15.040000000000001 + ], + "tag": { + "end": 129, + "start": 123, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 23.08, + 5.190000000000001 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 100, + 130, + 0 + ], + "tag": { + "end": 129, + "start": 123, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 123, + 129, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 35, + 67, + 0 + ] + } + ] + }, + "height": 4.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 35, + 67, + 0 + ] + } + ] + }, + "seg01": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 100, + 130, + 0 + ] + }, + "from": [ + 19.93, + 15.040000000000001 + ], + "tag": { + "end": 129, + "start": 123, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 23.08, + 5.190000000000001 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 100, + 130, + 0 + ], + "tag": { + "end": 129, + "start": 123, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 123, + 129, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/angled_line/rendered_model.png b/src/wasm-lib/kcl/tests/angled_line/rendered_model.png new file mode 100644 index 000000000..a63f7f4ce Binary files /dev/null and b/src/wasm-lib/kcl/tests/angled_line/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/argument_error/ast.snap b/src/wasm-lib/kcl/tests/argument_error/ast.snap new file mode 100644 index 000000000..c4610a282 --- /dev/null +++ b/src/wasm-lib/kcl/tests/argument_error/ast.snap @@ -0,0 +1,133 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing argument_error.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 22, + "id": { + "end": 4, + "name": "f", + "start": 3, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "end": 20, + "raw": "5", + "start": 19, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + "end": 20, + "start": 12, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 22, + "start": 8 + }, + "end": 22, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 6, + "name": "i", + "start": 5, + "type": "Identifier" + } + } + ], + "start": 4, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" + }, + "end": 22, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 38, + "expression": { + "arguments": [ + { + "end": 29, + "name": "f", + "start": 28, + "type": "Identifier", + "type": "Identifier" + }, + { + "elements": [ + { + "end": 33, + "raw": "0", + "start": 32, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 36, + "raw": "1", + "start": 35, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + ], + "end": 37, + "start": 31, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + ], + "callee": { + "end": 27, + "name": "map", + "start": 24, + "type": "Identifier" + }, + "end": 38, + "start": 24, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 24, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 39, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 24, + "start": 22, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/argument_error/execution_error.snap b/src/wasm-lib/kcl/tests/argument_error/execution_error.snap new file mode 100644 index 000000000..362b49568 --- /dev/null +++ b/src/wasm-lib/kcl/tests/argument_error/execution_error.snap @@ -0,0 +1,12 @@ +--- +source: kcl/src/simulation_tests.rs +description: Error from executing argument_error.kcl +--- +KCL Type error + + × type: Expected an array but found Function + ╭─[5:5] + 4 │ + 5 │ map(f, [0, 1]) + · ─ + ╰──── diff --git a/src/wasm-lib/kcl/tests/argument_error/input.kcl b/src/wasm-lib/kcl/tests/argument_error/input.kcl new file mode 100644 index 000000000..e9d750548 --- /dev/null +++ b/src/wasm-lib/kcl/tests/argument_error/input.kcl @@ -0,0 +1,5 @@ +fn f(i) { + return 5 +} + +map(f, [0, 1]) diff --git a/src/wasm-lib/kcl/tests/argument_error/ops.snap b/src/wasm-lib/kcl/tests/argument_error/ops.snap new file mode 100644 index 000000000..5088ae7b9 --- /dev/null +++ b/src/wasm-lib/kcl/tests/argument_error/ops.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed argument_error.kcl +snapshot_kind: text +--- +[] diff --git a/src/wasm-lib/kcl/tests/array_elem_pop/ast.snap b/src/wasm-lib/kcl/tests/array_elem_pop/ast.snap new file mode 100644 index 000000000..183e2dd50 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_pop/ast.snap @@ -0,0 +1,377 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing array_elem_pop.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 15, + "id": { + "end": 3, + "name": "arr", + "start": 0, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 8, + "raw": "1", + "start": 7, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 11, + "raw": "2", + "start": 10, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + { + "end": 14, + "raw": "3", + "start": 13, + "type": "Literal", + "type": "Literal", + "value": 3.0 + } + ], + "end": 15, + "start": 6, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 15, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 35, + "id": { + "end": 24, + "name": "new_arr1", + "start": 16, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 34, + "name": "arr", + "start": 31, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 30, + "name": "pop", + "start": 27, + "type": "Identifier" + }, + "end": 35, + "start": 27, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 16, + "type": "VariableDeclarator" + }, + "end": 35, + "kind": "const", + "start": 16, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 60, + "id": { + "end": 44, + "name": "new_arr2", + "start": 36, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 59, + "name": "new_arr1", + "start": 51, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 50, + "name": "pop", + "start": 47, + "type": "Identifier" + }, + "end": 60, + "start": 47, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 36, + "type": "VariableDeclarator" + }, + "end": 60, + "kind": "const", + "start": 36, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 85, + "id": { + "end": 69, + "name": "new_arr3", + "start": 61, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 84, + "name": "new_arr2", + "start": 76, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 75, + "name": "pop", + "start": 72, + "type": "Identifier" + }, + "end": 85, + "start": 72, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 61, + "type": "VariableDeclarator" + }, + "end": 85, + "kind": "const", + "start": 61, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 159, + "expression": { + "arguments": [ + { + "computed": false, + "end": 109, + "object": { + "end": 106, + "name": "new_arr1", + "start": 98, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 108, + "raw": "0", + "start": 107, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "start": 98, + "type": "MemberExpression", + "type": "MemberExpression" + }, + { + "end": 112, + "raw": "1", + "start": 111, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 121, + "raw": "0.00001", + "start": 114, + "type": "Literal", + "type": "Literal", + "value": 0.00001 + }, + { + "end": 158, + "raw": "\"element 0 should not have changed\"", + "start": 123, + "type": "Literal", + "type": "Literal", + "value": "element 0 should not have changed" + } + ], + "callee": { + "end": 97, + "name": "assertEqual", + "start": 86, + "type": "Identifier" + }, + "end": 159, + "start": 86, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 86, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 233, + "expression": { + "arguments": [ + { + "computed": false, + "end": 183, + "object": { + "end": 180, + "name": "new_arr1", + "start": 172, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 182, + "raw": "1", + "start": 181, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 172, + "type": "MemberExpression", + "type": "MemberExpression" + }, + { + "end": 186, + "raw": "2", + "start": 185, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + { + "end": 195, + "raw": "0.00001", + "start": 188, + "type": "Literal", + "type": "Literal", + "value": 0.00001 + }, + { + "end": 232, + "raw": "\"element 1 should not have changed\"", + "start": 197, + "type": "Literal", + "type": "Literal", + "value": "element 1 should not have changed" + } + ], + "callee": { + "end": 171, + "name": "assertEqual", + "start": 160, + "type": "Identifier" + }, + "end": 233, + "start": 160, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 160, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 307, + "expression": { + "arguments": [ + { + "computed": false, + "end": 257, + "object": { + "end": 254, + "name": "new_arr2", + "start": 246, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 256, + "raw": "0", + "start": 255, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "start": 246, + "type": "MemberExpression", + "type": "MemberExpression" + }, + { + "end": 260, + "raw": "1", + "start": 259, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 269, + "raw": "0.00001", + "start": 262, + "type": "Literal", + "type": "Literal", + "value": 0.00001 + }, + { + "end": 306, + "raw": "\"element 0 should not have changed\"", + "start": 271, + "type": "Literal", + "type": "Literal", + "value": "element 0 should not have changed" + } + ], + "callee": { + "end": 245, + "name": "assertEqual", + "start": 234, + "type": "Identifier" + }, + "end": 307, + "start": 234, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 234, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 308, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/array_elem_pop/input.kcl b/src/wasm-lib/kcl/tests/array_elem_pop/input.kcl new file mode 100644 index 000000000..184a6e6e9 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_pop/input.kcl @@ -0,0 +1,7 @@ +arr = [1, 2, 3] +new_arr1 = pop(arr) +new_arr2 = pop(new_arr1) +new_arr3 = pop(new_arr2) +assertEqual(new_arr1[0], 1, 0.00001, "element 0 should not have changed") +assertEqual(new_arr1[1], 2, 0.00001, "element 1 should not have changed") +assertEqual(new_arr2[0], 1, 0.00001, "element 0 should not have changed") diff --git a/src/wasm-lib/kcl/tests/array_elem_pop/ops.snap b/src/wasm-lib/kcl/tests/array_elem_pop/ops.snap new file mode 100644 index 000000000..0642275d0 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_pop/ops.snap @@ -0,0 +1,5 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed array_elem_pop.kcl +--- +[] diff --git a/src/wasm-lib/kcl/tests/array_elem_pop/program_memory.snap b/src/wasm-lib/kcl/tests/array_elem_pop/program_memory.snap new file mode 100644 index 000000000..1f3f62079 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_pop/program_memory.snap @@ -0,0 +1,168 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing array_elem_pop.kcl +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "arr": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 1.0, + "__meta": [ + { + "sourceRange": [ + 7, + 8, + 0 + ] + } + ] + }, + { + "type": "Number", + "value": 2.0, + "__meta": [ + { + "sourceRange": [ + 10, + 11, + 0 + ] + } + ] + }, + { + "type": "Number", + "value": 3.0, + "__meta": [ + { + "sourceRange": [ + 13, + 14, + 0 + ] + } + ] + } + ], + "__meta": [ + { + "sourceRange": [ + 6, + 15, + 0 + ] + } + ] + }, + "new_arr1": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 1.0, + "__meta": [ + { + "sourceRange": [ + 7, + 8, + 0 + ] + } + ] + }, + { + "type": "Number", + "value": 2.0, + "__meta": [ + { + "sourceRange": [ + 10, + 11, + 0 + ] + } + ] + } + ], + "__meta": [ + { + "sourceRange": [ + 27, + 35, + 0 + ] + } + ] + }, + "new_arr2": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 1.0, + "__meta": [ + { + "sourceRange": [ + 7, + 8, + 0 + ] + } + ] + } + ], + "__meta": [ + { + "sourceRange": [ + 47, + 60, + 0 + ] + } + ] + }, + "new_arr3": { + "type": "Array", + "value": [], + "__meta": [ + { + "sourceRange": [ + 72, + 85, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/array_elem_pop_empty_fail/ast.snap b/src/wasm-lib/kcl/tests/array_elem_pop_empty_fail/ast.snap new file mode 100644 index 000000000..37a0e2a9d --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_pop_empty_fail/ast.snap @@ -0,0 +1,76 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing array_elem_pop_empty_fail.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 8, + "id": { + "end": 3, + "name": "arr", + "start": 0, + "type": "Identifier" + }, + "init": { + "elements": [], + "end": 8, + "start": 6, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 8, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 24, + "id": { + "end": 13, + "name": "fail", + "start": 9, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 23, + "name": "arr", + "start": 20, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 19, + "name": "pop", + "start": 16, + "type": "Identifier" + }, + "end": 24, + "start": 16, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 9, + "type": "VariableDeclarator" + }, + "end": 24, + "kind": "const", + "start": 9, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 25, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/array_elem_pop_empty_fail/execution_error.snap b/src/wasm-lib/kcl/tests/array_elem_pop_empty_fail/execution_error.snap new file mode 100644 index 000000000..57faa0fed --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_pop_empty_fail/execution_error.snap @@ -0,0 +1,12 @@ +--- +source: kcl/src/simulation_tests.rs +description: Error from executing array_elem_pop_empty_fail.kcl +--- +KCL Semantic error + + × semantic: Cannot pop from an empty array + ╭─[2:8] + 1 │ arr = [] + 2 │ fail = pop(arr) + · ──────── + ╰──── diff --git a/src/wasm-lib/kcl/tests/array_elem_pop_empty_fail/input.kcl b/src/wasm-lib/kcl/tests/array_elem_pop_empty_fail/input.kcl new file mode 100644 index 000000000..8b1556afd --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_pop_empty_fail/input.kcl @@ -0,0 +1,2 @@ +arr = [] +fail = pop(arr) diff --git a/src/wasm-lib/kcl/tests/array_elem_pop_empty_fail/ops.snap b/src/wasm-lib/kcl/tests/array_elem_pop_empty_fail/ops.snap new file mode 100644 index 000000000..1245f6771 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_pop_empty_fail/ops.snap @@ -0,0 +1,5 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed array_elem_pop_empty_fail.kcl +--- +[] diff --git a/src/wasm-lib/kcl/tests/array_elem_pop_fail/ast.snap b/src/wasm-lib/kcl/tests/array_elem_pop_fail/ast.snap new file mode 100644 index 000000000..715dadef5 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_pop_fail/ast.snap @@ -0,0 +1,141 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing array_elem_pop_fail.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 15, + "id": { + "end": 3, + "name": "arr", + "start": 0, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 8, + "raw": "1", + "start": 7, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 11, + "raw": "2", + "start": 10, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + { + "end": 14, + "raw": "3", + "start": 13, + "type": "Literal", + "type": "Literal", + "value": 3.0 + } + ], + "end": 15, + "start": 6, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 15, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 36, + "id": { + "end": 25, + "name": "pushedArr", + "start": 16, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 35, + "name": "arr", + "start": 32, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 31, + "name": "pop", + "start": 28, + "type": "Identifier" + }, + "end": 36, + "start": 28, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 16, + "type": "VariableDeclarator" + }, + "end": 36, + "kind": "const", + "start": 16, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 56, + "id": { + "end": 41, + "name": "fail", + "start": 37, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 56, + "object": { + "end": 53, + "name": "pushedArr", + "start": 44, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 55, + "raw": "2", + "start": 54, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 44, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 37, + "type": "VariableDeclarator" + }, + "end": 56, + "kind": "const", + "start": 37, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 57, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/array_elem_pop_fail/execution_error.snap b/src/wasm-lib/kcl/tests/array_elem_pop_fail/execution_error.snap new file mode 100644 index 000000000..03aaef211 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_pop_fail/execution_error.snap @@ -0,0 +1,12 @@ +--- +source: kcl/src/simulation_tests.rs +description: Error from executing array_elem_pop_fail.kcl +--- +KCL UndefinedValue error + + × undefined value: The array doesn't have any item at index 2 + ╭─[3:8] + 2 │ pushedArr = pop(arr) + 3 │ fail = pushedArr[2] + · ──────────── + ╰──── diff --git a/src/wasm-lib/kcl/tests/array_elem_pop_fail/input.kcl b/src/wasm-lib/kcl/tests/array_elem_pop_fail/input.kcl new file mode 100644 index 000000000..3f6ad278e --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_pop_fail/input.kcl @@ -0,0 +1,3 @@ +arr = [1, 2, 3] +pushedArr = pop(arr) +fail = pushedArr[2] diff --git a/src/wasm-lib/kcl/tests/array_elem_pop_fail/ops.snap b/src/wasm-lib/kcl/tests/array_elem_pop_fail/ops.snap new file mode 100644 index 000000000..ba03da3b5 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_pop_fail/ops.snap @@ -0,0 +1,5 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed array_elem_pop_fail.kcl +--- +[] diff --git a/src/wasm-lib/kcl/tests/array_elem_push/ast.snap b/src/wasm-lib/kcl/tests/array_elem_push/ast.snap new file mode 100644 index 000000000..b0f5b5fa2 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_push/ast.snap @@ -0,0 +1,750 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing array_elem_push.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 15, + "id": { + "end": 3, + "name": "arr", + "start": 0, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 8, + "raw": "1", + "start": 7, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 11, + "raw": "2", + "start": 10, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + { + "end": 14, + "raw": "3", + "start": 13, + "type": "Literal", + "type": "Literal", + "value": 3.0 + } + ], + "end": 15, + "start": 6, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 15, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 39, + "id": { + "end": 24, + "name": "new_arr1", + "start": 16, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 35, + "name": "arr", + "start": 32, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 38, + "raw": "4", + "start": 37, + "type": "Literal", + "type": "Literal", + "value": 4.0 + } + ], + "callee": { + "end": 31, + "name": "push", + "start": 27, + "type": "Identifier" + }, + "end": 39, + "start": 27, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 16, + "type": "VariableDeclarator" + }, + "end": 39, + "kind": "const", + "start": 16, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 68, + "id": { + "end": 48, + "name": "new_arr2", + "start": 40, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 64, + "name": "new_arr1", + "start": 56, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 67, + "raw": "5", + "start": 66, + "type": "Literal", + "type": "Literal", + "value": 5.0 + } + ], + "callee": { + "end": 55, + "name": "push", + "start": 51, + "type": "Identifier" + }, + "end": 68, + "start": 51, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 40, + "type": "VariableDeclarator" + }, + "end": 68, + "kind": "const", + "start": 40, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 142, + "expression": { + "arguments": [ + { + "computed": false, + "end": 92, + "object": { + "end": 89, + "name": "new_arr1", + "start": 81, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 91, + "raw": "0", + "start": 90, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "start": 81, + "type": "MemberExpression", + "type": "MemberExpression" + }, + { + "end": 95, + "raw": "1", + "start": 94, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 104, + "raw": "0.00001", + "start": 97, + "type": "Literal", + "type": "Literal", + "value": 0.00001 + }, + { + "end": 141, + "raw": "\"element 0 should not have changed\"", + "start": 106, + "type": "Literal", + "type": "Literal", + "value": "element 0 should not have changed" + } + ], + "callee": { + "end": 80, + "name": "assertEqual", + "start": 69, + "type": "Identifier" + }, + "end": 142, + "start": 69, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 69, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 216, + "expression": { + "arguments": [ + { + "computed": false, + "end": 166, + "object": { + "end": 163, + "name": "new_arr1", + "start": 155, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 165, + "raw": "1", + "start": 164, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 155, + "type": "MemberExpression", + "type": "MemberExpression" + }, + { + "end": 169, + "raw": "2", + "start": 168, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + { + "end": 178, + "raw": "0.00001", + "start": 171, + "type": "Literal", + "type": "Literal", + "value": 0.00001 + }, + { + "end": 215, + "raw": "\"element 1 should not have changed\"", + "start": 180, + "type": "Literal", + "type": "Literal", + "value": "element 1 should not have changed" + } + ], + "callee": { + "end": 154, + "name": "assertEqual", + "start": 143, + "type": "Identifier" + }, + "end": 216, + "start": 143, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 143, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 290, + "expression": { + "arguments": [ + { + "computed": false, + "end": 240, + "object": { + "end": 237, + "name": "new_arr1", + "start": 229, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 239, + "raw": "2", + "start": 238, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 229, + "type": "MemberExpression", + "type": "MemberExpression" + }, + { + "end": 243, + "raw": "3", + "start": 242, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + { + "end": 252, + "raw": "0.00001", + "start": 245, + "type": "Literal", + "type": "Literal", + "value": 0.00001 + }, + { + "end": 289, + "raw": "\"element 2 should not have changed\"", + "start": 254, + "type": "Literal", + "type": "Literal", + "value": "element 2 should not have changed" + } + ], + "callee": { + "end": 228, + "name": "assertEqual", + "start": 217, + "type": "Identifier" + }, + "end": 290, + "start": 217, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 217, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 366, + "expression": { + "arguments": [ + { + "computed": false, + "end": 314, + "object": { + "end": 311, + "name": "new_arr1", + "start": 303, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 313, + "raw": "3", + "start": 312, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "start": 303, + "type": "MemberExpression", + "type": "MemberExpression" + }, + { + "end": 317, + "raw": "4", + "start": 316, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + { + "end": 326, + "raw": "0.00001", + "start": 319, + "type": "Literal", + "type": "Literal", + "value": 0.00001 + }, + { + "end": 365, + "raw": "\"4 was added to the end of the array\"", + "start": 328, + "type": "Literal", + "type": "Literal", + "value": "4 was added to the end of the array" + } + ], + "callee": { + "end": 302, + "name": "assertEqual", + "start": 291, + "type": "Identifier" + }, + "end": 366, + "start": 291, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 291, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 440, + "expression": { + "arguments": [ + { + "computed": false, + "end": 390, + "object": { + "end": 387, + "name": "new_arr2", + "start": 379, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 389, + "raw": "0", + "start": 388, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "start": 379, + "type": "MemberExpression", + "type": "MemberExpression" + }, + { + "end": 393, + "raw": "1", + "start": 392, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 402, + "raw": "0.00001", + "start": 395, + "type": "Literal", + "type": "Literal", + "value": 0.00001 + }, + { + "end": 439, + "raw": "\"element 0 should not have changed\"", + "start": 404, + "type": "Literal", + "type": "Literal", + "value": "element 0 should not have changed" + } + ], + "callee": { + "end": 378, + "name": "assertEqual", + "start": 367, + "type": "Identifier" + }, + "end": 440, + "start": 367, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 367, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 514, + "expression": { + "arguments": [ + { + "computed": false, + "end": 464, + "object": { + "end": 461, + "name": "new_arr2", + "start": 453, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 463, + "raw": "1", + "start": 462, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 453, + "type": "MemberExpression", + "type": "MemberExpression" + }, + { + "end": 467, + "raw": "2", + "start": 466, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + { + "end": 476, + "raw": "0.00001", + "start": 469, + "type": "Literal", + "type": "Literal", + "value": 0.00001 + }, + { + "end": 513, + "raw": "\"element 1 should not have changed\"", + "start": 478, + "type": "Literal", + "type": "Literal", + "value": "element 1 should not have changed" + } + ], + "callee": { + "end": 452, + "name": "assertEqual", + "start": 441, + "type": "Identifier" + }, + "end": 514, + "start": 441, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 441, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 588, + "expression": { + "arguments": [ + { + "computed": false, + "end": 538, + "object": { + "end": 535, + "name": "new_arr2", + "start": 527, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 537, + "raw": "2", + "start": 536, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 527, + "type": "MemberExpression", + "type": "MemberExpression" + }, + { + "end": 541, + "raw": "3", + "start": 540, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + { + "end": 550, + "raw": "0.00001", + "start": 543, + "type": "Literal", + "type": "Literal", + "value": 0.00001 + }, + { + "end": 587, + "raw": "\"element 2 should not have changed\"", + "start": 552, + "type": "Literal", + "type": "Literal", + "value": "element 2 should not have changed" + } + ], + "callee": { + "end": 526, + "name": "assertEqual", + "start": 515, + "type": "Identifier" + }, + "end": 588, + "start": 515, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 515, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 664, + "expression": { + "arguments": [ + { + "computed": false, + "end": 612, + "object": { + "end": 609, + "name": "new_arr2", + "start": 601, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 611, + "raw": "3", + "start": 610, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "start": 601, + "type": "MemberExpression", + "type": "MemberExpression" + }, + { + "end": 615, + "raw": "4", + "start": 614, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + { + "end": 624, + "raw": "0.00001", + "start": 617, + "type": "Literal", + "type": "Literal", + "value": 0.00001 + }, + { + "end": 663, + "raw": "\"4 was added to the end of the array\"", + "start": 626, + "type": "Literal", + "type": "Literal", + "value": "4 was added to the end of the array" + } + ], + "callee": { + "end": 600, + "name": "assertEqual", + "start": 589, + "type": "Identifier" + }, + "end": 664, + "start": 589, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 589, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 740, + "expression": { + "arguments": [ + { + "computed": false, + "end": 688, + "object": { + "end": 685, + "name": "new_arr2", + "start": 677, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 687, + "raw": "4", + "start": 686, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "start": 677, + "type": "MemberExpression", + "type": "MemberExpression" + }, + { + "end": 691, + "raw": "5", + "start": 690, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + { + "end": 700, + "raw": "0.00001", + "start": 693, + "type": "Literal", + "type": "Literal", + "value": 0.00001 + }, + { + "end": 739, + "raw": "\"5 was added to the end of the array\"", + "start": 702, + "type": "Literal", + "type": "Literal", + "value": "5 was added to the end of the array" + } + ], + "callee": { + "end": 676, + "name": "assertEqual", + "start": 665, + "type": "Identifier" + }, + "end": 740, + "start": 665, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 665, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 741, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/array_elem_push/input.kcl b/src/wasm-lib/kcl/tests/array_elem_push/input.kcl new file mode 100644 index 000000000..24c5bb7bf --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_push/input.kcl @@ -0,0 +1,12 @@ +arr = [1, 2, 3] +new_arr1 = push(arr, 4) +new_arr2 = push(new_arr1, 5) +assertEqual(new_arr1[0], 1, 0.00001, "element 0 should not have changed") +assertEqual(new_arr1[1], 2, 0.00001, "element 1 should not have changed") +assertEqual(new_arr1[2], 3, 0.00001, "element 2 should not have changed") +assertEqual(new_arr1[3], 4, 0.00001, "4 was added to the end of the array") +assertEqual(new_arr2[0], 1, 0.00001, "element 0 should not have changed") +assertEqual(new_arr2[1], 2, 0.00001, "element 1 should not have changed") +assertEqual(new_arr2[2], 3, 0.00001, "element 2 should not have changed") +assertEqual(new_arr2[3], 4, 0.00001, "4 was added to the end of the array") +assertEqual(new_arr2[4], 5, 0.00001, "5 was added to the end of the array") diff --git a/src/wasm-lib/kcl/tests/array_elem_push/ops.snap b/src/wasm-lib/kcl/tests/array_elem_push/ops.snap new file mode 100644 index 000000000..59f79443c --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_push/ops.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed array_elem_push.kcl +snapshot_kind: text +--- +[] diff --git a/src/wasm-lib/kcl/tests/array_elem_push/program_memory.snap b/src/wasm-lib/kcl/tests/array_elem_push/program_memory.snap new file mode 100644 index 000000000..cfcc5f806 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_push/program_memory.snap @@ -0,0 +1,235 @@ +--- +source: kcl/src/simulation_tests.rs +assertion_line: 92 +description: Program memory after executing array_elem_push.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "arr": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 1.0, + "__meta": [ + { + "sourceRange": [ + 7, + 8, + 0 + ] + } + ] + }, + { + "type": "Number", + "value": 2.0, + "__meta": [ + { + "sourceRange": [ + 10, + 11, + 0 + ] + } + ] + }, + { + "type": "Number", + "value": 3.0, + "__meta": [ + { + "sourceRange": [ + 13, + 14, + 0 + ] + } + ] + } + ], + "__meta": [ + { + "sourceRange": [ + 6, + 15, + 0 + ] + } + ] + }, + "new_arr1": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 1.0, + "__meta": [ + { + "sourceRange": [ + 7, + 8, + 0 + ] + } + ] + }, + { + "type": "Number", + "value": 2.0, + "__meta": [ + { + "sourceRange": [ + 10, + 11, + 0 + ] + } + ] + }, + { + "type": "Number", + "value": 3.0, + "__meta": [ + { + "sourceRange": [ + 13, + 14, + 0 + ] + } + ] + }, + { + "type": "Number", + "value": 4.0, + "__meta": [ + { + "sourceRange": [ + 37, + 38, + 0 + ] + } + ] + } + ], + "__meta": [ + { + "sourceRange": [ + 27, + 39, + 0 + ] + } + ] + }, + "new_arr2": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 1.0, + "__meta": [ + { + "sourceRange": [ + 7, + 8, + 0 + ] + } + ] + }, + { + "type": "Number", + "value": 2.0, + "__meta": [ + { + "sourceRange": [ + 10, + 11, + 0 + ] + } + ] + }, + { + "type": "Number", + "value": 3.0, + "__meta": [ + { + "sourceRange": [ + 13, + 14, + 0 + ] + } + ] + }, + { + "type": "Number", + "value": 4.0, + "__meta": [ + { + "sourceRange": [ + 37, + 38, + 0 + ] + } + ] + }, + { + "type": "Number", + "value": 5.0, + "__meta": [ + { + "sourceRange": [ + 66, + 67, + 0 + ] + } + ] + } + ], + "__meta": [ + { + "sourceRange": [ + 51, + 68, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/array_elem_push_fail/ast.snap b/src/wasm-lib/kcl/tests/array_elem_push_fail/ast.snap new file mode 100644 index 000000000..160874305 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_push_fail/ast.snap @@ -0,0 +1,149 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing array_elem_push_fail.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 15, + "id": { + "end": 3, + "name": "arr", + "start": 0, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 8, + "raw": "1", + "start": 7, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 11, + "raw": "2", + "start": 10, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + { + "end": 14, + "raw": "3", + "start": 13, + "type": "Literal", + "type": "Literal", + "value": 3.0 + } + ], + "end": 15, + "start": 6, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 15, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 40, + "id": { + "end": 25, + "name": "pushedArr", + "start": 16, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 36, + "name": "arr", + "start": 33, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 39, + "raw": "4", + "start": 38, + "type": "Literal", + "type": "Literal", + "value": 4.0 + } + ], + "callee": { + "end": 32, + "name": "push", + "start": 28, + "type": "Identifier" + }, + "end": 40, + "start": 28, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 16, + "type": "VariableDeclarator" + }, + "end": 40, + "kind": "const", + "start": 16, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 54, + "id": { + "end": 45, + "name": "fail", + "start": 41, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 54, + "object": { + "end": 51, + "name": "arr", + "start": 48, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 53, + "raw": "3", + "start": 52, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "start": 48, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 41, + "type": "VariableDeclarator" + }, + "end": 54, + "kind": "const", + "start": 41, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 55, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/array_elem_push_fail/execution_error.snap b/src/wasm-lib/kcl/tests/array_elem_push_fail/execution_error.snap new file mode 100644 index 000000000..6b17c8e81 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_push_fail/execution_error.snap @@ -0,0 +1,12 @@ +--- +source: kcl/src/simulation_tests.rs +description: Error from executing array_elem_push_fail.kcl +--- +KCL UndefinedValue error + + × undefined value: The array doesn't have any item at index 3 + ╭─[3:8] + 2 │ pushedArr = push(arr, 4) + 3 │ fail = arr[3] + · ────── + ╰──── diff --git a/src/wasm-lib/kcl/tests/array_elem_push_fail/input.kcl b/src/wasm-lib/kcl/tests/array_elem_push_fail/input.kcl new file mode 100644 index 000000000..733c22e95 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_push_fail/input.kcl @@ -0,0 +1,3 @@ +arr = [1, 2, 3] +pushedArr = push(arr, 4) +fail = arr[3] diff --git a/src/wasm-lib/kcl/tests/array_elem_push_fail/ops.snap b/src/wasm-lib/kcl/tests/array_elem_push_fail/ops.snap new file mode 100644 index 000000000..ca1847755 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_push_fail/ops.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed array_elem_push_fail.kcl +snapshot_kind: text +--- +[] diff --git a/src/wasm-lib/kcl/tests/array_index_oob/ast.snap b/src/wasm-lib/kcl/tests/array_index_oob/ast.snap new file mode 100644 index 000000000..496a67dcf --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_index_oob/ast.snap @@ -0,0 +1,77 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing array_index_oob.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 8, + "id": { + "end": 3, + "name": "arr", + "start": 0, + "type": "Identifier" + }, + "init": { + "elements": [], + "end": 8, + "start": 6, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 8, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 19, + "id": { + "end": 10, + "name": "x", + "start": 9, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 19, + "object": { + "end": 16, + "name": "arr", + "start": 13, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 18, + "raw": "0", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "start": 13, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 9, + "type": "VariableDeclarator" + }, + "end": 19, + "kind": "const", + "start": 9, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 20, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/array_index_oob/execution_error.snap b/src/wasm-lib/kcl/tests/array_index_oob/execution_error.snap new file mode 100644 index 000000000..619ad04ff --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_index_oob/execution_error.snap @@ -0,0 +1,12 @@ +--- +source: kcl/src/simulation_tests.rs +description: Error from executing array_index_oob.kcl +--- +KCL UndefinedValue error + + × undefined value: The array doesn't have any item at index 0 + ╭─[2:5] + 1 │ arr = [] + 2 │ x = arr[0] + · ────── + ╰──── diff --git a/src/wasm-lib/kcl/tests/array_index_oob/input.kcl b/src/wasm-lib/kcl/tests/array_index_oob/input.kcl new file mode 100644 index 000000000..53a30946b --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_index_oob/input.kcl @@ -0,0 +1,2 @@ +arr = [] +x = arr[0] diff --git a/src/wasm-lib/kcl/tests/array_index_oob/ops.snap b/src/wasm-lib/kcl/tests/array_index_oob/ops.snap new file mode 100644 index 000000000..b4178d102 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_index_oob/ops.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed array_index_oob.kcl +snapshot_kind: text +--- +[] diff --git a/src/wasm-lib/kcl/tests/array_range_expr/ast.snap b/src/wasm-lib/kcl/tests/array_range_expr/ast.snap new file mode 100644 index 000000000..50792185b --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_range_expr/ast.snap @@ -0,0 +1,831 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing array_range_expr.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 11, + "id": { + "end": 2, + "name": "r1", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 11, + "endElement": { + "end": 10, + "raw": "4", + "start": 9, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "endInclusive": true, + "start": 5, + "startElement": { + "end": 7, + "raw": "0", + "start": 6, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "type": "ArrayRangeExpression", + "type": "ArrayRangeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 11, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 70, + "expression": { + "arguments": [ + { + "computed": false, + "end": 29, + "object": { + "end": 26, + "name": "r1", + "start": 24, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 28, + "raw": "4", + "start": 27, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "start": 24, + "type": "MemberExpression", + "type": "MemberExpression" + }, + { + "end": 32, + "raw": "4", + "start": 31, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + { + "end": 41, + "raw": "0.00001", + "start": 34, + "type": "Literal", + "type": "Literal", + "value": 0.00001 + }, + { + "end": 69, + "raw": "\"last element is included\"", + "start": 43, + "type": "Literal", + "type": "Literal", + "value": "last element is included" + } + ], + "callee": { + "end": 23, + "name": "assertEqual", + "start": 12, + "type": "Identifier" + }, + "end": 70, + "start": 12, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 12, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "declaration": { + "end": 80, + "id": { + "end": 76, + "name": "four", + "start": 72, + "type": "Identifier" + }, + "init": { + "end": 80, + "raw": "4", + "start": 79, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "start": 72, + "type": "VariableDeclarator" + }, + "end": 80, + "kind": "const", + "start": 72, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 89, + "id": { + "end": 85, + "name": "zero", + "start": 81, + "type": "Identifier" + }, + "init": { + "end": 89, + "raw": "0", + "start": 88, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "start": 81, + "type": "VariableDeclarator" + }, + "end": 89, + "kind": "const", + "start": 81, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 107, + "id": { + "end": 92, + "name": "r2", + "start": 90, + "type": "Identifier" + }, + "init": { + "end": 107, + "endElement": { + "end": 106, + "name": "four", + "start": 102, + "type": "Identifier", + "type": "Identifier" + }, + "endInclusive": true, + "start": 95, + "startElement": { + "end": 100, + "name": "zero", + "start": 96, + "type": "Identifier", + "type": "Identifier" + }, + "type": "ArrayRangeExpression", + "type": "ArrayRangeExpression" + }, + "start": 90, + "type": "VariableDeclarator" + }, + "end": 107, + "kind": "const", + "start": 90, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 166, + "expression": { + "arguments": [ + { + "computed": false, + "end": 125, + "object": { + "end": 122, + "name": "r2", + "start": 120, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 124, + "raw": "4", + "start": 123, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "start": 120, + "type": "MemberExpression", + "type": "MemberExpression" + }, + { + "end": 128, + "raw": "4", + "start": 127, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + { + "end": 137, + "raw": "0.00001", + "start": 130, + "type": "Literal", + "type": "Literal", + "value": 0.00001 + }, + { + "end": 165, + "raw": "\"last element is included\"", + "start": 139, + "type": "Literal", + "type": "Literal", + "value": "last element is included" + } + ], + "callee": { + "end": 119, + "name": "assertEqual", + "start": 108, + "type": "Identifier" + }, + "end": 166, + "start": 108, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 108, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "declaration": { + "end": 188, + "id": { + "end": 172, + "name": "five", + "start": 168, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 187, + "left": { + "end": 183, + "name": "four", + "start": 179, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 187, + "raw": "1", + "start": 186, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 179, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "callee": { + "end": 178, + "name": "int", + "start": 175, + "type": "Identifier" + }, + "end": 188, + "start": 175, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 168, + "type": "VariableDeclarator" + }, + "end": 188, + "kind": "const", + "start": 168, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 206, + "id": { + "end": 191, + "name": "r3", + "start": 189, + "type": "Identifier" + }, + "init": { + "end": 206, + "endElement": { + "end": 205, + "name": "five", + "start": 201, + "type": "Identifier", + "type": "Identifier" + }, + "endInclusive": true, + "start": 194, + "startElement": { + "end": 199, + "name": "zero", + "start": 195, + "type": "Identifier", + "type": "Identifier" + }, + "type": "ArrayRangeExpression", + "type": "ArrayRangeExpression" + }, + "start": 189, + "type": "VariableDeclarator" + }, + "end": 206, + "kind": "const", + "start": 189, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 275, + "expression": { + "arguments": [ + { + "computed": false, + "end": 224, + "object": { + "end": 221, + "name": "r3", + "start": 219, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 223, + "raw": "4", + "start": 222, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "start": 219, + "type": "MemberExpression", + "type": "MemberExpression" + }, + { + "end": 227, + "raw": "4", + "start": 226, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + { + "end": 236, + "raw": "0.00001", + "start": 229, + "type": "Literal", + "type": "Literal", + "value": 0.00001 + }, + { + "end": 274, + "raw": "\"second-to-last element is included\"", + "start": 238, + "type": "Literal", + "type": "Literal", + "value": "second-to-last element is included" + } + ], + "callee": { + "end": 218, + "name": "assertEqual", + "start": 207, + "type": "Identifier" + }, + "end": 275, + "start": 207, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 207, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 334, + "expression": { + "arguments": [ + { + "computed": false, + "end": 293, + "object": { + "end": 290, + "name": "r3", + "start": 288, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 292, + "raw": "5", + "start": 291, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + "start": 288, + "type": "MemberExpression", + "type": "MemberExpression" + }, + { + "end": 296, + "raw": "5", + "start": 295, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + { + "end": 305, + "raw": "0.00001", + "start": 298, + "type": "Literal", + "type": "Literal", + "value": 0.00001 + }, + { + "end": 333, + "raw": "\"last element is included\"", + "start": 307, + "type": "Literal", + "type": "Literal", + "value": "last element is included" + } + ], + "callee": { + "end": 287, + "name": "assertEqual", + "start": 276, + "type": "Identifier" + }, + "end": 334, + "start": 276, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 276, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "declaration": { + "end": 373, + "id": { + "end": 338, + "name": "r4", + "start": 336, + "type": "Identifier" + }, + "init": { + "end": 373, + "endElement": { + "arguments": [ + { + "end": 371, + "left": { + "end": 367, + "name": "five", + "start": 363, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "-", + "right": { + "end": 371, + "raw": "1", + "start": 370, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 363, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "callee": { + "end": 362, + "name": "int", + "start": 359, + "type": "Identifier" + }, + "end": 372, + "start": 359, + "type": "CallExpression", + "type": "CallExpression" + }, + "endInclusive": true, + "start": 341, + "startElement": { + "arguments": [ + { + "end": 354, + "left": { + "end": 350, + "name": "zero", + "start": 346, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 354, + "raw": "1", + "start": 353, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 346, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "callee": { + "end": 345, + "name": "int", + "start": 342, + "type": "Identifier" + }, + "end": 355, + "start": 342, + "type": "CallExpression", + "type": "CallExpression" + }, + "type": "ArrayRangeExpression", + "type": "ArrayRangeExpression" + }, + "start": 336, + "type": "VariableDeclarator" + }, + "end": 373, + "kind": "const", + "start": 336, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 426, + "expression": { + "arguments": [ + { + "computed": false, + "end": 391, + "object": { + "end": 388, + "name": "r4", + "start": 386, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 390, + "raw": "0", + "start": 389, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "start": 386, + "type": "MemberExpression", + "type": "MemberExpression" + }, + { + "end": 394, + "raw": "1", + "start": 393, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 403, + "raw": "0.00001", + "start": 396, + "type": "Literal", + "type": "Literal", + "value": 0.00001 + }, + { + "end": 425, + "raw": "\"first element is 1\"", + "start": 405, + "type": "Literal", + "type": "Literal", + "value": "first element is 1" + } + ], + "callee": { + "end": 385, + "name": "assertEqual", + "start": 374, + "type": "Identifier" + }, + "end": 426, + "start": 374, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 374, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 488, + "expression": { + "arguments": [ + { + "computed": false, + "end": 444, + "object": { + "end": 441, + "name": "r4", + "start": 439, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 443, + "raw": "2", + "start": 442, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 439, + "type": "MemberExpression", + "type": "MemberExpression" + }, + { + "end": 447, + "raw": "3", + "start": 446, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + { + "end": 456, + "raw": "0.00001", + "start": 449, + "type": "Literal", + "type": "Literal", + "value": 0.00001 + }, + { + "end": 487, + "raw": "\"second-to-last element is 3\"", + "start": 458, + "type": "Literal", + "type": "Literal", + "value": "second-to-last element is 3" + } + ], + "callee": { + "end": 438, + "name": "assertEqual", + "start": 427, + "type": "Identifier" + }, + "end": 488, + "start": 427, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 427, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 540, + "expression": { + "arguments": [ + { + "computed": false, + "end": 506, + "object": { + "end": 503, + "name": "r4", + "start": 501, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 505, + "raw": "3", + "start": 504, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "start": 501, + "type": "MemberExpression", + "type": "MemberExpression" + }, + { + "end": 509, + "raw": "4", + "start": 508, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + { + "end": 518, + "raw": "0.00001", + "start": 511, + "type": "Literal", + "type": "Literal", + "value": 0.00001 + }, + { + "end": 539, + "raw": "\"last element is 4\"", + "start": 520, + "type": "Literal", + "type": "Literal", + "value": "last element is 4" + } + ], + "callee": { + "end": 500, + "name": "assertEqual", + "start": 489, + "type": "Identifier" + }, + "end": 540, + "start": 489, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 489, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 541, + "nonCodeMeta": { + "nonCodeNodes": { + "1": [ + { + "end": 72, + "start": 70, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "5": [ + { + "end": 168, + "start": 166, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "9": [ + { + "end": 336, + "start": 334, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/tests/executor/inputs/no_visuals/array_range_expr.kcl b/src/wasm-lib/kcl/tests/array_range_expr/input.kcl similarity index 100% rename from src/wasm-lib/tests/executor/inputs/no_visuals/array_range_expr.kcl rename to src/wasm-lib/kcl/tests/array_range_expr/input.kcl diff --git a/src/wasm-lib/kcl/tests/array_range_expr/ops.snap b/src/wasm-lib/kcl/tests/array_range_expr/ops.snap new file mode 100644 index 000000000..325cf9193 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_range_expr/ops.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed array_range_expr.kcl +snapshot_kind: text +--- +[] diff --git a/src/wasm-lib/kcl/tests/array_range_expr/program_memory.snap b/src/wasm-lib/kcl/tests/array_range_expr/program_memory.snap new file mode 100644 index 000000000..ff07c8f0a --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_range_expr/program_memory.snap @@ -0,0 +1,392 @@ +--- +source: kcl/src/simulation_tests.rs +assertion_line: 92 +description: Program memory after executing array_range_expr.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "five": { + "type": "Number", + "value": 5.0, + "__meta": [ + { + "sourceRange": [ + 175, + 188, + 0 + ] + } + ] + }, + "four": { + "type": "Number", + "value": 4.0, + "__meta": [ + { + "sourceRange": [ + 79, + 80, + 0 + ] + } + ] + }, + "r1": { + "type": "Array", + "value": [ + { + "type": "Int", + "value": 0, + "__meta": [ + { + "sourceRange": [ + 5, + 11, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": 1, + "__meta": [ + { + "sourceRange": [ + 5, + 11, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": 2, + "__meta": [ + { + "sourceRange": [ + 5, + 11, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": 3, + "__meta": [ + { + "sourceRange": [ + 5, + 11, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": 4, + "__meta": [ + { + "sourceRange": [ + 5, + 11, + 0 + ] + } + ] + } + ], + "__meta": [ + { + "sourceRange": [ + 5, + 11, + 0 + ] + } + ] + }, + "r2": { + "type": "Array", + "value": [ + { + "type": "Int", + "value": 0, + "__meta": [ + { + "sourceRange": [ + 95, + 107, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": 1, + "__meta": [ + { + "sourceRange": [ + 95, + 107, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": 2, + "__meta": [ + { + "sourceRange": [ + 95, + 107, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": 3, + "__meta": [ + { + "sourceRange": [ + 95, + 107, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": 4, + "__meta": [ + { + "sourceRange": [ + 95, + 107, + 0 + ] + } + ] + } + ], + "__meta": [ + { + "sourceRange": [ + 95, + 107, + 0 + ] + } + ] + }, + "r3": { + "type": "Array", + "value": [ + { + "type": "Int", + "value": 0, + "__meta": [ + { + "sourceRange": [ + 194, + 206, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": 1, + "__meta": [ + { + "sourceRange": [ + 194, + 206, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": 2, + "__meta": [ + { + "sourceRange": [ + 194, + 206, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": 3, + "__meta": [ + { + "sourceRange": [ + 194, + 206, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": 4, + "__meta": [ + { + "sourceRange": [ + 194, + 206, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": 5, + "__meta": [ + { + "sourceRange": [ + 194, + 206, + 0 + ] + } + ] + } + ], + "__meta": [ + { + "sourceRange": [ + 194, + 206, + 0 + ] + } + ] + }, + "r4": { + "type": "Array", + "value": [ + { + "type": "Int", + "value": 1, + "__meta": [ + { + "sourceRange": [ + 341, + 373, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": 2, + "__meta": [ + { + "sourceRange": [ + 341, + 373, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": 3, + "__meta": [ + { + "sourceRange": [ + 341, + 373, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": 4, + "__meta": [ + { + "sourceRange": [ + 341, + 373, + 0 + ] + } + ] + } + ], + "__meta": [ + { + "sourceRange": [ + 341, + 373, + 0 + ] + } + ] + }, + "zero": { + "type": "Number", + "value": 0.0, + "__meta": [ + { + "sourceRange": [ + 88, + 89, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/array_range_negative_expr/ast.snap b/src/wasm-lib/kcl/tests/array_range_negative_expr/ast.snap new file mode 100644 index 000000000..d4fa9135a --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_range_negative_expr/ast.snap @@ -0,0 +1,147 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing array_range_negative_expr.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 19, + "id": { + "end": 2, + "name": "xs", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 19, + "endElement": { + "end": 18, + "raw": "5", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + "endInclusive": true, + "start": 5, + "startElement": { + "arguments": [ + { + "argument": { + "end": 12, + "raw": "5", + "start": 11, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + "end": 12, + "operator": "-", + "start": 10, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "callee": { + "end": 9, + "name": "int", + "start": 6, + "type": "Identifier" + }, + "end": 13, + "start": 6, + "type": "CallExpression", + "type": "CallExpression" + }, + "type": "ArrayRangeExpression", + "type": "ArrayRangeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 19, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 72, + "expression": { + "arguments": [ + { + "computed": false, + "end": 37, + "object": { + "end": 34, + "name": "xs", + "start": 32, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 36, + "raw": "0", + "start": 35, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "start": 32, + "type": "MemberExpression", + "type": "MemberExpression" + }, + { + "argument": { + "end": 41, + "raw": "5", + "start": 40, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + "end": 41, + "operator": "-", + "start": 39, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 48, + "raw": "0.001", + "start": 43, + "type": "Literal", + "type": "Literal", + "value": 0.001 + }, + { + "end": 71, + "raw": "\"first element is -5\"", + "start": 50, + "type": "Literal", + "type": "Literal", + "value": "first element is -5" + } + ], + "callee": { + "end": 31, + "name": "assertEqual", + "start": 20, + "type": "Identifier" + }, + "end": 72, + "start": 20, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 20, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 73, + "start": 0 + } +} diff --git a/src/wasm-lib/tests/executor/inputs/no_visuals/array_range_negative_expr.kcl b/src/wasm-lib/kcl/tests/array_range_negative_expr/input.kcl similarity index 72% rename from src/wasm-lib/tests/executor/inputs/no_visuals/array_range_negative_expr.kcl rename to src/wasm-lib/kcl/tests/array_range_negative_expr/input.kcl index afaf12635..5fc7e8d12 100644 --- a/src/wasm-lib/tests/executor/inputs/no_visuals/array_range_negative_expr.kcl +++ b/src/wasm-lib/kcl/tests/array_range_negative_expr/input.kcl @@ -1,2 +1,2 @@ -xs = [int(-5)..5] +xs = [int(-5) .. 5] assertEqual(xs[0], -5, 0.001, "first element is -5") diff --git a/src/wasm-lib/kcl/tests/array_range_negative_expr/ops.snap b/src/wasm-lib/kcl/tests/array_range_negative_expr/ops.snap new file mode 100644 index 000000000..e23225f0e --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_range_negative_expr/ops.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed array_range_negative_expr.kcl +snapshot_kind: text +--- +[] diff --git a/src/wasm-lib/kcl/tests/array_range_negative_expr/program_memory.snap b/src/wasm-lib/kcl/tests/array_range_negative_expr/program_memory.snap new file mode 100644 index 000000000..b44cb8ee6 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_range_negative_expr/program_memory.snap @@ -0,0 +1,194 @@ +--- +source: kcl/src/simulation_tests.rs +assertion_line: 92 +description: Program memory after executing array_range_negative_expr.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "xs": { + "type": "Array", + "value": [ + { + "type": "Int", + "value": -5, + "__meta": [ + { + "sourceRange": [ + 5, + 19, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": -4, + "__meta": [ + { + "sourceRange": [ + 5, + 19, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": -3, + "__meta": [ + { + "sourceRange": [ + 5, + 19, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": -2, + "__meta": [ + { + "sourceRange": [ + 5, + 19, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": -1, + "__meta": [ + { + "sourceRange": [ + 5, + 19, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": 0, + "__meta": [ + { + "sourceRange": [ + 5, + 19, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": 1, + "__meta": [ + { + "sourceRange": [ + 5, + 19, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": 2, + "__meta": [ + { + "sourceRange": [ + 5, + 19, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": 3, + "__meta": [ + { + "sourceRange": [ + 5, + 19, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": 4, + "__meta": [ + { + "sourceRange": [ + 5, + 19, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": 5, + "__meta": [ + { + "sourceRange": [ + 5, + 19, + 0 + ] + } + ] + } + ], + "__meta": [ + { + "sourceRange": [ + 5, + 19, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/ast.snap b/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/ast.snap new file mode 100644 index 000000000..8b761d93d --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/ast.snap @@ -0,0 +1,406 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing basic_fillet_cube_close_opposite.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 279, + "id": { + "end": 7, + "name": "part001", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 28, + "raw": "'XY'", + "start": 24, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 23, + "name": "startSketchOn", + "start": 10, + "type": "Identifier" + }, + "end": 29, + "start": 10, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 52, + "raw": "0", + "start": 51, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 55, + "raw": "0", + "start": 54, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 56, + "start": 50, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 59, + "start": 58, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 49, + "name": "startProfileAt", + "start": 35, + "type": "Identifier" + }, + "end": 60, + "start": 35, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 73, + "raw": "0", + "start": 72, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 77, + "raw": "10", + "start": 75, + "type": "Literal", + "type": "Literal", + "value": 10.0 + } + ], + "end": 78, + "start": 71, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 81, + "start": 80, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "thing" + } + ], + "callee": { + "end": 70, + "name": "line", + "start": 66, + "type": "Identifier" + }, + "end": 90, + "start": 66, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 104, + "raw": "10", + "start": 102, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + { + "end": 107, + "raw": "0", + "start": 106, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 108, + "start": 101, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 111, + "start": 110, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 100, + "name": "line", + "start": 96, + "type": "Identifier" + }, + "end": 112, + "start": 96, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 125, + "raw": "0", + "start": 124, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 130, + "raw": "10", + "start": 128, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + "end": 130, + "operator": "-", + "start": 127, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 131, + "start": 123, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 134, + "start": 133, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 143, + "start": 136, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "thing2" + } + ], + "callee": { + "end": 122, + "name": "line", + "start": 118, + "type": "Identifier" + }, + "end": 144, + "start": 118, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 157, + "start": 156, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 166, + "start": 159, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "thing3" + } + ], + "callee": { + "end": 155, + "name": "close", + "start": 150, + "type": "Identifier" + }, + "end": 167, + "start": 150, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 183, + "raw": "10", + "start": 181, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + { + "end": 186, + "start": 185, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 180, + "name": "extrude", + "start": 173, + "type": "Identifier" + }, + "end": 187, + "start": 173, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 275, + "properties": [ + { + "end": 219, + "key": { + "end": 215, + "name": "radius", + "start": 209, + "type": "Identifier" + }, + "start": 209, + "type": "ObjectProperty", + "value": { + "end": 219, + "raw": "2", + "start": 218, + "type": "Literal", + "type": "Literal", + "value": 2.0 + } + }, + { + "end": 268, + "key": { + "end": 232, + "name": "tags", + "start": 228, + "type": "Identifier" + }, + "start": 228, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 242, + "name": "thing3", + "start": 236, + "type": "Identifier", + "type": "Identifier" + }, + { + "arguments": [ + { + "end": 266, + "name": "thing3", + "start": 260, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 259, + "name": "getOppositeEdge", + "start": 244, + "type": "Identifier" + }, + "end": 267, + "start": 244, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 268, + "start": 235, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "start": 200, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 278, + "start": 277, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 199, + "name": "fillet", + "start": 193, + "type": "Identifier" + }, + "end": 279, + "start": 193, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 279, + "start": 10, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 279, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 280, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/input.kcl b/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/input.kcl new file mode 100644 index 000000000..7eaa95ab7 --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/input.kcl @@ -0,0 +1,11 @@ +part001 = startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line([0, 10], %, $thing) + |> line([10, 0], %) + |> line([0, -10], %, $thing2) + |> close(%, $thing3) + |> extrude(10, %) + |> fillet({ + radius = 2, + tags = [thing3, getOppositeEdge(thing3)] + }, %) diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/ops.snap b/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/ops.snap new file mode 100644 index 000000000..eecba22ef --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/ops.snap @@ -0,0 +1,78 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed basic_fillet_cube_close_opposite.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 24, + 28, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 10, + 29, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 181, + 183, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 185, + 186, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 173, + 187, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 200, + 275, + 0 + ] + }, + "solid": { + "sourceRange": [ + 277, + 278, + 0 + ] + } + }, + "name": "fillet", + "sourceRange": [ + 193, + 279, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/program_memory.snap b/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/program_memory.snap new file mode 100644 index 000000000..b0f985237 --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/program_memory.snap @@ -0,0 +1,644 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing basic_fillet_cube_close_opposite.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "part001": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 96, + 112, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 118, + 144, + 0 + ], + "tag": { + "end": 143, + "start": 136, + "type": "TagDeclarator", + "value": "thing2" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 150, + 167, + 0 + ], + "tag": { + "end": 166, + "start": 159, + "type": "TagDeclarator", + "value": "thing3" + }, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "to": [ + 0.0, + 10.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 96, + 112, + 0 + ] + }, + "from": [ + 0.0, + 10.0 + ], + "tag": null, + "to": [ + 10.0, + 10.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 118, + 144, + 0 + ] + }, + "from": [ + 10.0, + 10.0 + ], + "tag": { + "end": 143, + "start": 136, + "type": "TagDeclarator", + "value": "thing2" + }, + "to": [ + 10.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 150, + 167, + 0 + ] + }, + "from": [ + 10.0, + 0.0 + ], + "tag": { + "end": 166, + "start": 159, + "type": "TagDeclarator", + "value": "thing3" + }, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35, + 60, + 0 + ] + } + }, + "tags": { + "thing": { + "type": "TagIdentifier", + "value": "thing", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "to": [ + 0.0, + 10.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 83, + 89, + 0 + ] + } + ] + }, + "thing2": { + "type": "TagIdentifier", + "value": "thing2", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 118, + 144, + 0 + ] + }, + "from": [ + 10.0, + 10.0 + ], + "tag": { + "end": 143, + "start": 136, + "type": "TagDeclarator", + "value": "thing2" + }, + "to": [ + 10.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 118, + 144, + 0 + ], + "tag": { + "end": 143, + "start": 136, + "type": "TagDeclarator", + "value": "thing2" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 136, + 143, + 0 + ] + } + ] + }, + "thing3": { + "type": "TagIdentifier", + "value": "thing3", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 150, + 167, + 0 + ] + }, + "from": [ + 10.0, + 0.0 + ], + "tag": { + "end": 166, + "start": 159, + "type": "TagDeclarator", + "value": "thing3" + }, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 150, + 167, + 0 + ], + "tag": { + "end": 166, + "start": 159, + "type": "TagDeclarator", + "value": "thing3" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 159, + 166, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 35, + 60, + 0 + ] + } + ] + }, + "height": 10.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "edgeCuts": [ + { + "type": "fillet", + "id": "[uuid]", + "radius": 2.0, + "edgeId": "[uuid]", + "tag": null + }, + { + "type": "fillet", + "id": "[uuid]", + "radius": 2.0, + "edgeId": "[uuid]", + "tag": null + } + ], + "__meta": [ + { + "sourceRange": [ + 35, + 60, + 0 + ] + } + ] + }, + "thing": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "thing", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "to": [ + 0.0, + 10.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 83, + 89, + 0 + ] + } + ] + }, + "thing2": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "thing2", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 118, + 144, + 0 + ] + }, + "from": [ + 10.0, + 10.0 + ], + "tag": { + "end": 143, + "start": 136, + "type": "TagDeclarator", + "value": "thing2" + }, + "to": [ + 10.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 118, + 144, + 0 + ], + "tag": { + "end": 143, + "start": 136, + "type": "TagDeclarator", + "value": "thing2" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 136, + 143, + 0 + ] + } + ] + }, + "thing3": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "thing3", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 150, + 167, + 0 + ] + }, + "from": [ + 10.0, + 0.0 + ], + "tag": { + "end": 166, + "start": 159, + "type": "TagDeclarator", + "value": "thing3" + }, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 150, + 167, + 0 + ], + "tag": { + "end": 166, + "start": 159, + "type": "TagDeclarator", + "value": "thing3" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 159, + 166, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/rendered_model.png b/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/rendered_model.png new file mode 100644 index 000000000..0e9eeead6 Binary files /dev/null and b/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_end/ast.snap b/src/wasm-lib/kcl/tests/basic_fillet_cube_end/ast.snap new file mode 100644 index 000000000..f416cef50 --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_end/ast.snap @@ -0,0 +1,399 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing basic_fillet_cube_end.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 268, + "id": { + "end": 7, + "name": "part001", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 28, + "raw": "'XY'", + "start": 24, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 23, + "name": "startSketchOn", + "start": 10, + "type": "Identifier" + }, + "end": 29, + "start": 10, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 52, + "raw": "0", + "start": 51, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 55, + "raw": "0", + "start": 54, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 56, + "start": 50, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 59, + "start": 58, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 49, + "name": "startProfileAt", + "start": 35, + "type": "Identifier" + }, + "end": 60, + "start": 35, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 73, + "raw": "0", + "start": 72, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 77, + "raw": "10", + "start": 75, + "type": "Literal", + "type": "Literal", + "value": 10.0 + } + ], + "end": 78, + "start": 71, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 81, + "start": 80, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "thing" + } + ], + "callee": { + "end": 70, + "name": "line", + "start": 66, + "type": "Identifier" + }, + "end": 90, + "start": 66, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 104, + "raw": "10", + "start": 102, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + { + "end": 107, + "raw": "0", + "start": 106, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 108, + "start": 101, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 111, + "start": 110, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 100, + "name": "line", + "start": 96, + "type": "Identifier" + }, + "end": 112, + "start": 96, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 125, + "raw": "0", + "start": 124, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 130, + "raw": "10", + "start": 128, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + "end": 130, + "operator": "-", + "start": 127, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 131, + "start": 123, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 134, + "start": 133, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 143, + "start": 136, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "thing2" + } + ], + "callee": { + "end": 122, + "name": "line", + "start": 118, + "type": "Identifier" + }, + "end": 144, + "start": 118, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 157, + "start": 156, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 155, + "name": "close", + "start": 150, + "type": "Identifier" + }, + "end": 158, + "start": 150, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 174, + "raw": "10", + "start": 172, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + { + "end": 177, + "start": 176, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 171, + "name": "extrude", + "start": 164, + "type": "Identifier" + }, + "end": 178, + "start": 164, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 264, + "properties": [ + { + "end": 210, + "key": { + "end": 206, + "name": "radius", + "start": 200, + "type": "Identifier" + }, + "start": 200, + "type": "ObjectProperty", + "value": { + "end": 210, + "raw": "2", + "start": 209, + "type": "Literal", + "type": "Literal", + "value": 2.0 + } + }, + { + "end": 257, + "key": { + "end": 223, + "name": "tags", + "start": 219, + "type": "Identifier" + }, + "start": 219, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 232, + "name": "thing", + "start": 227, + "type": "Identifier", + "type": "Identifier" + }, + { + "arguments": [ + { + "end": 255, + "name": "thing", + "start": 250, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 249, + "name": "getOppositeEdge", + "start": 234, + "type": "Identifier" + }, + "end": 256, + "start": 234, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 257, + "start": 226, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "start": 191, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 267, + "start": 266, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 190, + "name": "fillet", + "start": 184, + "type": "Identifier" + }, + "end": 268, + "start": 184, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 268, + "start": 10, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 268, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 269, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_end/input.kcl b/src/wasm-lib/kcl/tests/basic_fillet_cube_end/input.kcl new file mode 100644 index 000000000..18697cd04 --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_end/input.kcl @@ -0,0 +1,11 @@ +part001 = startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line([0, 10], %, $thing) + |> line([10, 0], %) + |> line([0, -10], %, $thing2) + |> close(%) + |> extrude(10, %) + |> fillet({ + radius = 2, + tags = [thing, getOppositeEdge(thing)] + }, %) diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_end/ops.snap b/src/wasm-lib/kcl/tests/basic_fillet_cube_end/ops.snap new file mode 100644 index 000000000..6e899210a --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_end/ops.snap @@ -0,0 +1,78 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed basic_fillet_cube_end.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 24, + 28, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 10, + 29, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 172, + 174, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 176, + 177, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 164, + 178, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 191, + 264, + 0 + ] + }, + "solid": { + "sourceRange": [ + 266, + 267, + 0 + ] + } + }, + "name": "fillet", + "sourceRange": [ + 184, + 268, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_end/program_memory.snap b/src/wasm-lib/kcl/tests/basic_fillet_cube_end/program_memory.snap new file mode 100644 index 000000000..71e470fb8 --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_end/program_memory.snap @@ -0,0 +1,515 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing basic_fillet_cube_end.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "part001": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 96, + 112, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 118, + 144, + 0 + ], + "tag": { + "end": 143, + "start": 136, + "type": "TagDeclarator", + "value": "thing2" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 150, + 158, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "to": [ + 0.0, + 10.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 96, + 112, + 0 + ] + }, + "from": [ + 0.0, + 10.0 + ], + "tag": null, + "to": [ + 10.0, + 10.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 118, + 144, + 0 + ] + }, + "from": [ + 10.0, + 10.0 + ], + "tag": { + "end": 143, + "start": 136, + "type": "TagDeclarator", + "value": "thing2" + }, + "to": [ + 10.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 150, + 158, + 0 + ] + }, + "from": [ + 10.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35, + 60, + 0 + ] + } + }, + "tags": { + "thing": { + "type": "TagIdentifier", + "value": "thing", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "to": [ + 0.0, + 10.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 83, + 89, + 0 + ] + } + ] + }, + "thing2": { + "type": "TagIdentifier", + "value": "thing2", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 118, + 144, + 0 + ] + }, + "from": [ + 10.0, + 10.0 + ], + "tag": { + "end": 143, + "start": 136, + "type": "TagDeclarator", + "value": "thing2" + }, + "to": [ + 10.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 118, + 144, + 0 + ], + "tag": { + "end": 143, + "start": 136, + "type": "TagDeclarator", + "value": "thing2" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 136, + 143, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 35, + 60, + 0 + ] + } + ] + }, + "height": 10.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "edgeCuts": [ + { + "type": "fillet", + "id": "[uuid]", + "radius": 2.0, + "edgeId": "[uuid]", + "tag": null + }, + { + "type": "fillet", + "id": "[uuid]", + "radius": 2.0, + "edgeId": "[uuid]", + "tag": null + } + ], + "__meta": [ + { + "sourceRange": [ + 35, + 60, + 0 + ] + } + ] + }, + "thing": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "thing", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "to": [ + 0.0, + 10.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 83, + 89, + 0 + ] + } + ] + }, + "thing2": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "thing2", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 118, + 144, + 0 + ] + }, + "from": [ + 10.0, + 10.0 + ], + "tag": { + "end": 143, + "start": 136, + "type": "TagDeclarator", + "value": "thing2" + }, + "to": [ + 10.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 118, + 144, + 0 + ], + "tag": { + "end": 143, + "start": 136, + "type": "TagDeclarator", + "value": "thing2" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 136, + 143, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_end/rendered_model.png b/src/wasm-lib/kcl/tests/basic_fillet_cube_end/rendered_model.png new file mode 100644 index 000000000..14693be28 Binary files /dev/null and b/src/wasm-lib/kcl/tests/basic_fillet_cube_end/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/ast.snap b/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/ast.snap new file mode 100644 index 000000000..6aaffeafd --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/ast.snap @@ -0,0 +1,406 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing basic_fillet_cube_next_adjacent.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 284, + "id": { + "end": 7, + "name": "part001", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 28, + "raw": "'XY'", + "start": 24, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 23, + "name": "startSketchOn", + "start": 10, + "type": "Identifier" + }, + "end": 29, + "start": 10, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 52, + "raw": "0", + "start": 51, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 55, + "raw": "0", + "start": 54, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 56, + "start": 50, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 59, + "start": 58, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 49, + "name": "startProfileAt", + "start": 35, + "type": "Identifier" + }, + "end": 60, + "start": 35, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 73, + "raw": "0", + "start": 72, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 77, + "raw": "10", + "start": 75, + "type": "Literal", + "type": "Literal", + "value": 10.0 + } + ], + "end": 78, + "start": 71, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 81, + "start": 80, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "thing" + } + ], + "callee": { + "end": 70, + "name": "line", + "start": 66, + "type": "Identifier" + }, + "end": 90, + "start": 66, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 104, + "raw": "10", + "start": 102, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + { + "end": 107, + "raw": "0", + "start": 106, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 108, + "start": 101, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 111, + "start": 110, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 120, + "start": 113, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "thing1" + } + ], + "callee": { + "end": 100, + "name": "line", + "start": 96, + "type": "Identifier" + }, + "end": 121, + "start": 96, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 134, + "raw": "0", + "start": 133, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 139, + "raw": "10", + "start": 137, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + "end": 139, + "operator": "-", + "start": 136, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 140, + "start": 132, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 143, + "start": 142, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 152, + "start": 145, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "thing2" + } + ], + "callee": { + "end": 131, + "name": "line", + "start": 127, + "type": "Identifier" + }, + "end": 153, + "start": 127, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 166, + "start": 165, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 175, + "start": 168, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "thing3" + } + ], + "callee": { + "end": 164, + "name": "close", + "start": 159, + "type": "Identifier" + }, + "end": 176, + "start": 159, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 192, + "raw": "10", + "start": 190, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + { + "end": 195, + "start": 194, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 189, + "name": "extrude", + "start": 182, + "type": "Identifier" + }, + "end": 196, + "start": 182, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 280, + "properties": [ + { + "end": 228, + "key": { + "end": 224, + "name": "radius", + "start": 218, + "type": "Identifier" + }, + "start": 218, + "type": "ObjectProperty", + "value": { + "end": 228, + "raw": "2", + "start": 227, + "type": "Literal", + "type": "Literal", + "value": 2.0 + } + }, + { + "end": 273, + "key": { + "end": 241, + "name": "tags", + "start": 237, + "type": "Identifier" + }, + "start": 237, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "arguments": [ + { + "end": 271, + "name": "thing3", + "start": 265, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 264, + "name": "getNextAdjacentEdge", + "start": 245, + "type": "Identifier" + }, + "end": 272, + "start": 245, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 273, + "start": 244, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "start": 209, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 283, + "start": 282, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 208, + "name": "fillet", + "start": 202, + "type": "Identifier" + }, + "end": 284, + "start": 202, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 284, + "start": 10, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 284, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 285, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/input.kcl b/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/input.kcl new file mode 100644 index 000000000..4154a7d3b --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/input.kcl @@ -0,0 +1,11 @@ +part001 = startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line([0, 10], %, $thing) + |> line([10, 0], %, $thing1) + |> line([0, -10], %, $thing2) + |> close(%, $thing3) + |> extrude(10, %) + |> fillet({ + radius = 2, + tags = [getNextAdjacentEdge(thing3)] + }, %) diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/ops.snap b/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/ops.snap new file mode 100644 index 000000000..c39cedb25 --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/ops.snap @@ -0,0 +1,78 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed basic_fillet_cube_next_adjacent.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 24, + 28, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 10, + 29, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 190, + 192, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 194, + 195, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 182, + 196, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 209, + 280, + 0 + ] + }, + "solid": { + "sourceRange": [ + 282, + 283, + 0 + ] + } + }, + "name": "fillet", + "sourceRange": [ + 202, + 284, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/program_memory.snap b/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/program_memory.snap new file mode 100644 index 000000000..e8979c8e8 --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/program_memory.snap @@ -0,0 +1,766 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing basic_fillet_cube_next_adjacent.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "part001": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 96, + 121, + 0 + ], + "tag": { + "end": 120, + "start": 113, + "type": "TagDeclarator", + "value": "thing1" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 127, + 153, + 0 + ], + "tag": { + "end": 152, + "start": 145, + "type": "TagDeclarator", + "value": "thing2" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 159, + 176, + 0 + ], + "tag": { + "end": 175, + "start": 168, + "type": "TagDeclarator", + "value": "thing3" + }, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "to": [ + 0.0, + 10.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 96, + 121, + 0 + ] + }, + "from": [ + 0.0, + 10.0 + ], + "tag": { + "end": 120, + "start": 113, + "type": "TagDeclarator", + "value": "thing1" + }, + "to": [ + 10.0, + 10.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 127, + 153, + 0 + ] + }, + "from": [ + 10.0, + 10.0 + ], + "tag": { + "end": 152, + "start": 145, + "type": "TagDeclarator", + "value": "thing2" + }, + "to": [ + 10.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 159, + 176, + 0 + ] + }, + "from": [ + 10.0, + 0.0 + ], + "tag": { + "end": 175, + "start": 168, + "type": "TagDeclarator", + "value": "thing3" + }, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35, + 60, + 0 + ] + } + }, + "tags": { + "thing": { + "type": "TagIdentifier", + "value": "thing", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "to": [ + 0.0, + 10.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 83, + 89, + 0 + ] + } + ] + }, + "thing1": { + "type": "TagIdentifier", + "value": "thing1", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 96, + 121, + 0 + ] + }, + "from": [ + 0.0, + 10.0 + ], + "tag": { + "end": 120, + "start": 113, + "type": "TagDeclarator", + "value": "thing1" + }, + "to": [ + 10.0, + 10.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 96, + 121, + 0 + ], + "tag": { + "end": 120, + "start": 113, + "type": "TagDeclarator", + "value": "thing1" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 113, + 120, + 0 + ] + } + ] + }, + "thing2": { + "type": "TagIdentifier", + "value": "thing2", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 127, + 153, + 0 + ] + }, + "from": [ + 10.0, + 10.0 + ], + "tag": { + "end": 152, + "start": 145, + "type": "TagDeclarator", + "value": "thing2" + }, + "to": [ + 10.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 127, + 153, + 0 + ], + "tag": { + "end": 152, + "start": 145, + "type": "TagDeclarator", + "value": "thing2" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 145, + 152, + 0 + ] + } + ] + }, + "thing3": { + "type": "TagIdentifier", + "value": "thing3", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 159, + 176, + 0 + ] + }, + "from": [ + 10.0, + 0.0 + ], + "tag": { + "end": 175, + "start": 168, + "type": "TagDeclarator", + "value": "thing3" + }, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 159, + 176, + 0 + ], + "tag": { + "end": 175, + "start": 168, + "type": "TagDeclarator", + "value": "thing3" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 168, + 175, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 35, + 60, + 0 + ] + } + ] + }, + "height": 10.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "edgeCuts": [ + { + "type": "fillet", + "id": "[uuid]", + "radius": 2.0, + "edgeId": "[uuid]", + "tag": null + } + ], + "__meta": [ + { + "sourceRange": [ + 35, + 60, + 0 + ] + } + ] + }, + "thing": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "thing", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "to": [ + 0.0, + 10.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 83, + 89, + 0 + ] + } + ] + }, + "thing1": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "thing1", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 96, + 121, + 0 + ] + }, + "from": [ + 0.0, + 10.0 + ], + "tag": { + "end": 120, + "start": 113, + "type": "TagDeclarator", + "value": "thing1" + }, + "to": [ + 10.0, + 10.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 96, + 121, + 0 + ], + "tag": { + "end": 120, + "start": 113, + "type": "TagDeclarator", + "value": "thing1" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 113, + 120, + 0 + ] + } + ] + }, + "thing2": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "thing2", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 127, + 153, + 0 + ] + }, + "from": [ + 10.0, + 10.0 + ], + "tag": { + "end": 152, + "start": 145, + "type": "TagDeclarator", + "value": "thing2" + }, + "to": [ + 10.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 127, + 153, + 0 + ], + "tag": { + "end": 152, + "start": 145, + "type": "TagDeclarator", + "value": "thing2" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 145, + 152, + 0 + ] + } + ] + }, + "thing3": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "thing3", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 159, + 176, + 0 + ] + }, + "from": [ + 10.0, + 0.0 + ], + "tag": { + "end": 175, + "start": 168, + "type": "TagDeclarator", + "value": "thing3" + }, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 159, + 176, + 0 + ], + "tag": { + "end": 175, + "start": 168, + "type": "TagDeclarator", + "value": "thing3" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 168, + 175, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/rendered_model.png b/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/rendered_model.png new file mode 100644 index 000000000..562ca4b89 Binary files /dev/null and b/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/ast.snap b/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/ast.snap new file mode 100644 index 000000000..20eeafdf0 --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/ast.snap @@ -0,0 +1,406 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing basic_fillet_cube_previous_adjacent.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 288, + "id": { + "end": 7, + "name": "part001", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 28, + "raw": "'XY'", + "start": 24, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 23, + "name": "startSketchOn", + "start": 10, + "type": "Identifier" + }, + "end": 29, + "start": 10, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 52, + "raw": "0", + "start": 51, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 55, + "raw": "0", + "start": 54, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 56, + "start": 50, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 59, + "start": 58, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 49, + "name": "startProfileAt", + "start": 35, + "type": "Identifier" + }, + "end": 60, + "start": 35, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 73, + "raw": "0", + "start": 72, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 77, + "raw": "10", + "start": 75, + "type": "Literal", + "type": "Literal", + "value": 10.0 + } + ], + "end": 78, + "start": 71, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 81, + "start": 80, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "thing" + } + ], + "callee": { + "end": 70, + "name": "line", + "start": 66, + "type": "Identifier" + }, + "end": 90, + "start": 66, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 104, + "raw": "10", + "start": 102, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + { + "end": 107, + "raw": "0", + "start": 106, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 108, + "start": 101, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 111, + "start": 110, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 120, + "start": 113, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "thing1" + } + ], + "callee": { + "end": 100, + "name": "line", + "start": 96, + "type": "Identifier" + }, + "end": 121, + "start": 96, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 134, + "raw": "0", + "start": 133, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 139, + "raw": "10", + "start": 137, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + "end": 139, + "operator": "-", + "start": 136, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 140, + "start": 132, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 143, + "start": 142, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 152, + "start": 145, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "thing2" + } + ], + "callee": { + "end": 131, + "name": "line", + "start": 127, + "type": "Identifier" + }, + "end": 153, + "start": 127, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 166, + "start": 165, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 175, + "start": 168, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "thing3" + } + ], + "callee": { + "end": 164, + "name": "close", + "start": 159, + "type": "Identifier" + }, + "end": 176, + "start": 159, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 192, + "raw": "10", + "start": 190, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + { + "end": 195, + "start": 194, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 189, + "name": "extrude", + "start": 182, + "type": "Identifier" + }, + "end": 196, + "start": 182, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 284, + "properties": [ + { + "end": 228, + "key": { + "end": 224, + "name": "radius", + "start": 218, + "type": "Identifier" + }, + "start": 218, + "type": "ObjectProperty", + "value": { + "end": 228, + "raw": "2", + "start": 227, + "type": "Literal", + "type": "Literal", + "value": 2.0 + } + }, + { + "end": 277, + "key": { + "end": 241, + "name": "tags", + "start": 237, + "type": "Identifier" + }, + "start": 237, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "arguments": [ + { + "end": 275, + "name": "thing3", + "start": 269, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 268, + "name": "getPreviousAdjacentEdge", + "start": 245, + "type": "Identifier" + }, + "end": 276, + "start": 245, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 277, + "start": 244, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "start": 209, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 287, + "start": 286, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 208, + "name": "fillet", + "start": 202, + "type": "Identifier" + }, + "end": 288, + "start": 202, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 288, + "start": 10, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 288, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 289, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/input.kcl b/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/input.kcl new file mode 100644 index 000000000..7e63f9e04 --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/input.kcl @@ -0,0 +1,11 @@ +part001 = startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line([0, 10], %, $thing) + |> line([10, 0], %, $thing1) + |> line([0, -10], %, $thing2) + |> close(%, $thing3) + |> extrude(10, %) + |> fillet({ + radius = 2, + tags = [getPreviousAdjacentEdge(thing3)] + }, %) diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/ops.snap b/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/ops.snap new file mode 100644 index 000000000..c09341460 --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/ops.snap @@ -0,0 +1,78 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed basic_fillet_cube_previous_adjacent.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 24, + 28, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 10, + 29, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 190, + 192, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 194, + 195, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 182, + 196, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 209, + 284, + 0 + ] + }, + "solid": { + "sourceRange": [ + 286, + 287, + 0 + ] + } + }, + "name": "fillet", + "sourceRange": [ + 202, + 288, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/program_memory.snap b/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/program_memory.snap new file mode 100644 index 000000000..bf5f12953 --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/program_memory.snap @@ -0,0 +1,766 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing basic_fillet_cube_previous_adjacent.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "part001": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 96, + 121, + 0 + ], + "tag": { + "end": 120, + "start": 113, + "type": "TagDeclarator", + "value": "thing1" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 127, + 153, + 0 + ], + "tag": { + "end": 152, + "start": 145, + "type": "TagDeclarator", + "value": "thing2" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 159, + 176, + 0 + ], + "tag": { + "end": 175, + "start": 168, + "type": "TagDeclarator", + "value": "thing3" + }, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "to": [ + 0.0, + 10.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 96, + 121, + 0 + ] + }, + "from": [ + 0.0, + 10.0 + ], + "tag": { + "end": 120, + "start": 113, + "type": "TagDeclarator", + "value": "thing1" + }, + "to": [ + 10.0, + 10.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 127, + 153, + 0 + ] + }, + "from": [ + 10.0, + 10.0 + ], + "tag": { + "end": 152, + "start": 145, + "type": "TagDeclarator", + "value": "thing2" + }, + "to": [ + 10.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 159, + 176, + 0 + ] + }, + "from": [ + 10.0, + 0.0 + ], + "tag": { + "end": 175, + "start": 168, + "type": "TagDeclarator", + "value": "thing3" + }, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35, + 60, + 0 + ] + } + }, + "tags": { + "thing": { + "type": "TagIdentifier", + "value": "thing", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "to": [ + 0.0, + 10.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 83, + 89, + 0 + ] + } + ] + }, + "thing1": { + "type": "TagIdentifier", + "value": "thing1", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 96, + 121, + 0 + ] + }, + "from": [ + 0.0, + 10.0 + ], + "tag": { + "end": 120, + "start": 113, + "type": "TagDeclarator", + "value": "thing1" + }, + "to": [ + 10.0, + 10.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 96, + 121, + 0 + ], + "tag": { + "end": 120, + "start": 113, + "type": "TagDeclarator", + "value": "thing1" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 113, + 120, + 0 + ] + } + ] + }, + "thing2": { + "type": "TagIdentifier", + "value": "thing2", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 127, + 153, + 0 + ] + }, + "from": [ + 10.0, + 10.0 + ], + "tag": { + "end": 152, + "start": 145, + "type": "TagDeclarator", + "value": "thing2" + }, + "to": [ + 10.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 127, + 153, + 0 + ], + "tag": { + "end": 152, + "start": 145, + "type": "TagDeclarator", + "value": "thing2" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 145, + 152, + 0 + ] + } + ] + }, + "thing3": { + "type": "TagIdentifier", + "value": "thing3", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 159, + 176, + 0 + ] + }, + "from": [ + 10.0, + 0.0 + ], + "tag": { + "end": 175, + "start": 168, + "type": "TagDeclarator", + "value": "thing3" + }, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 159, + 176, + 0 + ], + "tag": { + "end": 175, + "start": 168, + "type": "TagDeclarator", + "value": "thing3" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 168, + 175, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 35, + 60, + 0 + ] + } + ] + }, + "height": 10.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "edgeCuts": [ + { + "type": "fillet", + "id": "[uuid]", + "radius": 2.0, + "edgeId": "[uuid]", + "tag": null + } + ], + "__meta": [ + { + "sourceRange": [ + 35, + 60, + 0 + ] + } + ] + }, + "thing": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "thing", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "to": [ + 0.0, + 10.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 83, + 89, + 0 + ] + } + ] + }, + "thing1": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "thing1", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 96, + 121, + 0 + ] + }, + "from": [ + 0.0, + 10.0 + ], + "tag": { + "end": 120, + "start": 113, + "type": "TagDeclarator", + "value": "thing1" + }, + "to": [ + 10.0, + 10.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 96, + 121, + 0 + ], + "tag": { + "end": 120, + "start": 113, + "type": "TagDeclarator", + "value": "thing1" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 113, + 120, + 0 + ] + } + ] + }, + "thing2": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "thing2", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 127, + 153, + 0 + ] + }, + "from": [ + 10.0, + 10.0 + ], + "tag": { + "end": 152, + "start": 145, + "type": "TagDeclarator", + "value": "thing2" + }, + "to": [ + 10.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 127, + 153, + 0 + ], + "tag": { + "end": 152, + "start": 145, + "type": "TagDeclarator", + "value": "thing2" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 145, + 152, + 0 + ] + } + ] + }, + "thing3": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "thing3", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 159, + 176, + 0 + ] + }, + "from": [ + 10.0, + 0.0 + ], + "tag": { + "end": 175, + "start": 168, + "type": "TagDeclarator", + "value": "thing3" + }, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 159, + 176, + 0 + ], + "tag": { + "end": 175, + "start": 168, + "type": "TagDeclarator", + "value": "thing3" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 168, + 175, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/rendered_model.png b/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/rendered_model.png new file mode 100644 index 000000000..091962613 Binary files /dev/null and b/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_start/ast.snap b/src/wasm-lib/kcl/tests/basic_fillet_cube_start/ast.snap new file mode 100644 index 000000000..dec681864 --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_start/ast.snap @@ -0,0 +1,385 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing basic_fillet_cube_start.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 233, + "id": { + "end": 7, + "name": "part001", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 28, + "raw": "'XY'", + "start": 24, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 23, + "name": "startSketchOn", + "start": 10, + "type": "Identifier" + }, + "end": 29, + "start": 10, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 52, + "raw": "0", + "start": 51, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 55, + "raw": "0", + "start": 54, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 56, + "start": 50, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 59, + "start": 58, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 49, + "name": "startProfileAt", + "start": 35, + "type": "Identifier" + }, + "end": 60, + "start": 35, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 73, + "raw": "0", + "start": 72, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 77, + "raw": "10", + "start": 75, + "type": "Literal", + "type": "Literal", + "value": 10.0 + } + ], + "end": 78, + "start": 71, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 81, + "start": 80, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "thing" + } + ], + "callee": { + "end": 70, + "name": "line", + "start": 66, + "type": "Identifier" + }, + "end": 90, + "start": 66, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 104, + "raw": "10", + "start": 102, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + { + "end": 107, + "raw": "0", + "start": 106, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 108, + "start": 101, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 111, + "start": 110, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 100, + "name": "line", + "start": 96, + "type": "Identifier" + }, + "end": 112, + "start": 96, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 125, + "raw": "0", + "start": 124, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 130, + "raw": "10", + "start": 128, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + "end": 130, + "operator": "-", + "start": 127, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 131, + "start": 123, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 134, + "start": 133, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 143, + "start": 136, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "thing2" + } + ], + "callee": { + "end": 122, + "name": "line", + "start": 118, + "type": "Identifier" + }, + "end": 144, + "start": 118, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 157, + "start": 156, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 155, + "name": "close", + "start": 150, + "type": "Identifier" + }, + "end": 158, + "start": 150, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 174, + "raw": "10", + "start": 172, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + { + "end": 177, + "start": 176, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 171, + "name": "extrude", + "start": 164, + "type": "Identifier" + }, + "end": 178, + "start": 164, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 229, + "properties": [ + { + "end": 203, + "key": { + "end": 199, + "name": "radius", + "start": 193, + "type": "Identifier" + }, + "start": 193, + "type": "ObjectProperty", + "value": { + "end": 203, + "raw": "2", + "start": 202, + "type": "Literal", + "type": "Literal", + "value": 2.0 + } + }, + { + "end": 227, + "key": { + "end": 209, + "name": "tags", + "start": 205, + "type": "Identifier" + }, + "start": 205, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 218, + "name": "thing", + "start": 213, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 226, + "name": "thing2", + "start": 220, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 227, + "start": 212, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "start": 191, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 232, + "start": 231, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 190, + "name": "fillet", + "start": 184, + "type": "Identifier" + }, + "end": 233, + "start": 184, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 233, + "start": 10, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 233, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 234, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_start/input.kcl b/src/wasm-lib/kcl/tests/basic_fillet_cube_start/input.kcl new file mode 100644 index 000000000..4e1e4fe1b --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_start/input.kcl @@ -0,0 +1,8 @@ +part001 = startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line([0, 10], %, $thing) + |> line([10, 0], %) + |> line([0, -10], %, $thing2) + |> close(%) + |> extrude(10, %) + |> fillet({ radius = 2, tags = [thing, thing2] }, %) diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_start/ops.snap b/src/wasm-lib/kcl/tests/basic_fillet_cube_start/ops.snap new file mode 100644 index 000000000..d29458215 --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_start/ops.snap @@ -0,0 +1,78 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed basic_fillet_cube_start.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 24, + 28, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 10, + 29, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 172, + 174, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 176, + 177, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 164, + 178, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 191, + 229, + 0 + ] + }, + "solid": { + "sourceRange": [ + 231, + 232, + 0 + ] + } + }, + "name": "fillet", + "sourceRange": [ + 184, + 233, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_start/program_memory.snap b/src/wasm-lib/kcl/tests/basic_fillet_cube_start/program_memory.snap new file mode 100644 index 000000000..b71b23d14 --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_start/program_memory.snap @@ -0,0 +1,515 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing basic_fillet_cube_start.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "part001": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 96, + 112, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 118, + 144, + 0 + ], + "tag": { + "end": 143, + "start": 136, + "type": "TagDeclarator", + "value": "thing2" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 150, + 158, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "to": [ + 0.0, + 10.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 96, + 112, + 0 + ] + }, + "from": [ + 0.0, + 10.0 + ], + "tag": null, + "to": [ + 10.0, + 10.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 118, + 144, + 0 + ] + }, + "from": [ + 10.0, + 10.0 + ], + "tag": { + "end": 143, + "start": 136, + "type": "TagDeclarator", + "value": "thing2" + }, + "to": [ + 10.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 150, + 158, + 0 + ] + }, + "from": [ + 10.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35, + 60, + 0 + ] + } + }, + "tags": { + "thing": { + "type": "TagIdentifier", + "value": "thing", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "to": [ + 0.0, + 10.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 83, + 89, + 0 + ] + } + ] + }, + "thing2": { + "type": "TagIdentifier", + "value": "thing2", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 118, + 144, + 0 + ] + }, + "from": [ + 10.0, + 10.0 + ], + "tag": { + "end": 143, + "start": 136, + "type": "TagDeclarator", + "value": "thing2" + }, + "to": [ + 10.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 118, + 144, + 0 + ], + "tag": { + "end": 143, + "start": 136, + "type": "TagDeclarator", + "value": "thing2" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 136, + 143, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 35, + 60, + 0 + ] + } + ] + }, + "height": 10.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "edgeCuts": [ + { + "type": "fillet", + "id": "[uuid]", + "radius": 2.0, + "edgeId": "[uuid]", + "tag": null + }, + { + "type": "fillet", + "id": "[uuid]", + "radius": 2.0, + "edgeId": "[uuid]", + "tag": null + } + ], + "__meta": [ + { + "sourceRange": [ + 35, + 60, + 0 + ] + } + ] + }, + "thing": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "thing", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "to": [ + 0.0, + 10.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66, + 90, + 0 + ], + "tag": { + "end": 89, + "start": 83, + "type": "TagDeclarator", + "value": "thing" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 83, + 89, + 0 + ] + } + ] + }, + "thing2": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "thing2", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 118, + 144, + 0 + ] + }, + "from": [ + 10.0, + 10.0 + ], + "tag": { + "end": 143, + "start": 136, + "type": "TagDeclarator", + "value": "thing2" + }, + "to": [ + 10.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 118, + 144, + 0 + ], + "tag": { + "end": 143, + "start": 136, + "type": "TagDeclarator", + "value": "thing2" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 136, + 143, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_start/rendered_model.png b/src/wasm-lib/kcl/tests/basic_fillet_cube_start/rendered_model.png new file mode 100644 index 000000000..8b46c59cf Binary files /dev/null and b/src/wasm-lib/kcl/tests/basic_fillet_cube_start/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/ast.snap b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/ast.snap new file mode 100644 index 000000000..3d42dd344 --- /dev/null +++ b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/ast.snap @@ -0,0 +1,281 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing big_number_angle_to_match_length_x.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 188, + "id": { + "end": 7, + "name": "part001", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 28, + "raw": "'XY'", + "start": 24, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 23, + "name": "startSketchOn", + "start": 10, + "type": "Identifier" + }, + "end": 29, + "start": 10, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 52, + "raw": "0", + "start": 51, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 55, + "raw": "0", + "start": 54, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 56, + "start": 50, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 59, + "start": 58, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 49, + "name": "startProfileAt", + "start": 35, + "type": "Identifier" + }, + "end": 60, + "start": 35, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 73, + "raw": "1", + "start": 72, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 79, + "raw": "3.82", + "start": 75, + "type": "Literal", + "type": "Literal", + "value": 3.82 + } + ], + "end": 80, + "start": 71, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 83, + "start": 82, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 91, + "start": 85, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "seg01" + } + ], + "callee": { + "end": 70, + "name": "line", + "start": 66, + "type": "Identifier" + }, + "end": 92, + "start": 66, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "arguments": [ + { + "end": 139, + "name": "seg01", + "start": 134, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 142, + "raw": "3", + "start": 141, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + { + "end": 145, + "start": 144, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 133, + "name": "angleToMatchLengthX", + "start": 114, + "type": "Identifier" + }, + "end": 146, + "start": 114, + "type": "CallExpression", + "type": "CallExpression" + }, + "end": 146, + "operator": "-", + "start": 113, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 149, + "raw": "3", + "start": 148, + "type": "Literal", + "type": "Literal", + "value": 3.0 + } + ], + "end": 150, + "start": 112, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 153, + "start": 152, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 111, + "name": "angledLineToX", + "start": 98, + "type": "Identifier" + }, + "end": 154, + "start": 98, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 167, + "start": 166, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 165, + "name": "close", + "start": 160, + "type": "Identifier" + }, + "end": 168, + "start": 160, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 184, + "raw": "10", + "start": 182, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + { + "end": 187, + "start": 186, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 181, + "name": "extrude", + "start": 174, + "type": "Identifier" + }, + "end": 188, + "start": 174, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 188, + "start": 10, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 188, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 189, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/input.kcl b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/input.kcl new file mode 100644 index 000000000..95bea0ad9 --- /dev/null +++ b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/input.kcl @@ -0,0 +1,6 @@ +part001 = startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line([1, 3.82], %, $seg01) + |> angledLineToX([-angleToMatchLengthX(seg01, 3, %), 3], %) + |> close(%) + |> extrude(10, %) diff --git a/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/ops.snap b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/ops.snap new file mode 100644 index 000000000..aa020fc01 --- /dev/null +++ b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/ops.snap @@ -0,0 +1,52 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed big_number_angle_to_match_length_x.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 24, + 28, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 10, + 29, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 182, + 184, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 186, + 187, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 174, + 188, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/program_memory.snap b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/program_memory.snap new file mode 100644 index 000000000..902b80baf --- /dev/null +++ b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/program_memory.snap @@ -0,0 +1,339 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing big_number_angle_to_match_length_x.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "part001": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66, + 92, + 0 + ], + "tag": { + "end": 91, + "start": 85, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 98, + 154, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 160, + 168, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66, + 92, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 91, + "start": 85, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 1.0, + 3.82 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 98, + 154, + 0 + ] + }, + "from": [ + 1.0, + 3.82 + ], + "tag": null, + "to": [ + 3.0, + 0.4152 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 160, + 168, + 0 + ] + }, + "from": [ + 3.0, + 0.4152 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35, + 60, + 0 + ] + } + }, + "tags": { + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66, + 92, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 91, + "start": 85, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 1.0, + 3.82 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66, + 92, + 0 + ], + "tag": { + "end": 91, + "start": 85, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 85, + 91, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 35, + 60, + 0 + ] + } + ] + }, + "height": 10.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 35, + 60, + 0 + ] + } + ] + }, + "seg01": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66, + 92, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 91, + "start": 85, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 1.0, + 3.82 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66, + 92, + 0 + ], + "tag": { + "end": 91, + "start": 85, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 85, + 91, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/rendered_model.png b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/rendered_model.png new file mode 100644 index 000000000..c7864ad3c Binary files /dev/null and b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/ast.snap b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/ast.snap new file mode 100644 index 000000000..77a6ca20a --- /dev/null +++ b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/ast.snap @@ -0,0 +1,281 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing big_number_angle_to_match_length_y.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 188, + "id": { + "end": 7, + "name": "part001", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 28, + "raw": "'XY'", + "start": 24, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 23, + "name": "startSketchOn", + "start": 10, + "type": "Identifier" + }, + "end": 29, + "start": 10, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 52, + "raw": "0", + "start": 51, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 55, + "raw": "0", + "start": 54, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 56, + "start": 50, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 59, + "start": 58, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 49, + "name": "startProfileAt", + "start": 35, + "type": "Identifier" + }, + "end": 60, + "start": 35, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 73, + "raw": "1", + "start": 72, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 79, + "raw": "3.82", + "start": 75, + "type": "Literal", + "type": "Literal", + "value": 3.82 + } + ], + "end": 80, + "start": 71, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 83, + "start": 82, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 91, + "start": 85, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "seg01" + } + ], + "callee": { + "end": 70, + "name": "line", + "start": 66, + "type": "Identifier" + }, + "end": 92, + "start": 66, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "arguments": [ + { + "end": 139, + "name": "seg01", + "start": 134, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 142, + "raw": "3", + "start": 141, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + { + "end": 145, + "start": 144, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 133, + "name": "angleToMatchLengthY", + "start": 114, + "type": "Identifier" + }, + "end": 146, + "start": 114, + "type": "CallExpression", + "type": "CallExpression" + }, + "end": 146, + "operator": "-", + "start": 113, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 149, + "raw": "3", + "start": 148, + "type": "Literal", + "type": "Literal", + "value": 3.0 + } + ], + "end": 150, + "start": 112, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 153, + "start": 152, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 111, + "name": "angledLineToX", + "start": 98, + "type": "Identifier" + }, + "end": 154, + "start": 98, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 167, + "start": 166, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 165, + "name": "close", + "start": 160, + "type": "Identifier" + }, + "end": 168, + "start": 160, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 184, + "raw": "10", + "start": 182, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + { + "end": 187, + "start": 186, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 181, + "name": "extrude", + "start": 174, + "type": "Identifier" + }, + "end": 188, + "start": 174, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 188, + "start": 10, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 188, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 189, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/input.kcl b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/input.kcl new file mode 100644 index 000000000..848ea0af8 --- /dev/null +++ b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/input.kcl @@ -0,0 +1,6 @@ +part001 = startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line([1, 3.82], %, $seg01) + |> angledLineToX([-angleToMatchLengthY(seg01, 3, %), 3], %) + |> close(%) + |> extrude(10, %) diff --git a/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/ops.snap b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/ops.snap new file mode 100644 index 000000000..9ed960732 --- /dev/null +++ b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/ops.snap @@ -0,0 +1,52 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed big_number_angle_to_match_length_y.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 24, + 28, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 10, + 29, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 182, + 184, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 186, + 187, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 174, + 188, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/program_memory.snap b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/program_memory.snap new file mode 100644 index 000000000..4b7bb4c54 --- /dev/null +++ b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/program_memory.snap @@ -0,0 +1,339 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing big_number_angle_to_match_length_y.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "part001": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66, + 92, + 0 + ], + "tag": { + "end": 91, + "start": 85, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 98, + 154, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 160, + 168, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66, + 92, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 91, + "start": 85, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 1.0, + 3.82 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 98, + 154, + 0 + ] + }, + "from": [ + 1.0, + 3.82 + ], + "tag": null, + "to": [ + 3.0, + 3.3954 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 160, + 168, + 0 + ] + }, + "from": [ + 3.0, + 3.3954 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35, + 60, + 0 + ] + } + }, + "tags": { + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66, + 92, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 91, + "start": 85, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 1.0, + 3.82 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66, + 92, + 0 + ], + "tag": { + "end": 91, + "start": 85, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 85, + 91, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 35, + 60, + 0 + ] + } + ] + }, + "height": 10.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 35, + 60, + 0 + ] + } + ] + }, + "seg01": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66, + 92, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 91, + "start": 85, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 1.0, + 3.82 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66, + 92, + 0 + ], + "tag": { + "end": 91, + "start": 85, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 85, + 91, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/rendered_model.png b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/rendered_model.png new file mode 100644 index 000000000..33c9af361 Binary files /dev/null and b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/boolean_logical_and/ast.snap b/src/wasm-lib/kcl/tests/boolean_logical_and/ast.snap new file mode 100644 index 000000000..23eac21ed --- /dev/null +++ b/src/wasm-lib/kcl/tests/boolean_logical_and/ast.snap @@ -0,0 +1,703 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing boolean_logical_and.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 17, + "id": { + "end": 2, + "name": "aa", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 17, + "left": { + "end": 9, + "raw": "true", + "start": 5, + "type": "Literal", + "type": "Literal", + "value": true + }, + "operator": "&", + "right": { + "end": 17, + "raw": "false", + "start": 12, + "type": "Literal", + "type": "Literal", + "value": false + }, + "start": 5, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 17, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 48, + "id": { + "end": 19, + "name": "a", + "start": 18, + "type": "Identifier" + }, + "init": { + "cond": { + "end": 27, + "name": "aa", + "start": 25, + "type": "Identifier", + "type": "Identifier" + }, + "digest": null, + "else_ifs": [], + "end": 48, + "final_else": { + "body": [ + { + "end": 46, + "expression": { + "end": 46, + "raw": "2", + "start": 45, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 45, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 47, + "start": 45 + }, + "start": 22, + "then_val": { + "body": [ + { + "end": 33, + "expression": { + "end": 33, + "raw": "1", + "start": 32, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 32, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 34, + "start": 32 + }, + "type": "IfExpression", + "type": "IfExpression" + }, + "start": 18, + "type": "VariableDeclarator" + }, + "end": 48, + "kind": "const", + "start": 18, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 128, + "expression": { + "arguments": [ + { + "end": 62, + "left": { + "end": 57, + "name": "a", + "start": 56, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "==", + "right": { + "end": 62, + "raw": "2", + "start": 61, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 56, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 127, + "raw": "\"right branch of and is false makes the whole expression false\"", + "start": 64, + "type": "Literal", + "type": "Literal", + "value": "right branch of and is false makes the whole expression false" + } + ], + "callee": { + "end": 55, + "name": "assert", + "start": 49, + "type": "Identifier" + }, + "end": 128, + "start": 49, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 49, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "declaration": { + "end": 147, + "id": { + "end": 132, + "name": "bb", + "start": 130, + "type": "Identifier" + }, + "init": { + "end": 147, + "left": { + "end": 140, + "raw": "false", + "start": 135, + "type": "Literal", + "type": "Literal", + "value": false + }, + "operator": "&", + "right": { + "end": 147, + "raw": "true", + "start": 143, + "type": "Literal", + "type": "Literal", + "value": true + }, + "start": 135, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 130, + "type": "VariableDeclarator" + }, + "end": 147, + "kind": "const", + "start": 130, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 178, + "id": { + "end": 149, + "name": "b", + "start": 148, + "type": "Identifier" + }, + "init": { + "cond": { + "end": 157, + "name": "bb", + "start": 155, + "type": "Identifier", + "type": "Identifier" + }, + "digest": null, + "else_ifs": [], + "end": 178, + "final_else": { + "body": [ + { + "end": 176, + "expression": { + "end": 176, + "raw": "2", + "start": 175, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 175, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 177, + "start": 175 + }, + "start": 152, + "then_val": { + "body": [ + { + "end": 163, + "expression": { + "end": 163, + "raw": "1", + "start": 162, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 162, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 164, + "start": 162 + }, + "type": "IfExpression", + "type": "IfExpression" + }, + "start": 148, + "type": "VariableDeclarator" + }, + "end": 178, + "kind": "const", + "start": 148, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 257, + "expression": { + "arguments": [ + { + "end": 192, + "left": { + "end": 187, + "name": "b", + "start": 186, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "==", + "right": { + "end": 192, + "raw": "2", + "start": 191, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 186, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 256, + "raw": "\"left branch of and is false makes the whole expression false\"", + "start": 194, + "type": "Literal", + "type": "Literal", + "value": "left branch of and is false makes the whole expression false" + } + ], + "callee": { + "end": 185, + "name": "assert", + "start": 179, + "type": "Identifier" + }, + "end": 257, + "start": 179, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 179, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "declaration": { + "end": 275, + "id": { + "end": 261, + "name": "cc", + "start": 259, + "type": "Identifier" + }, + "init": { + "end": 275, + "left": { + "end": 268, + "raw": "true", + "start": 264, + "type": "Literal", + "type": "Literal", + "value": true + }, + "operator": "&", + "right": { + "end": 275, + "raw": "true", + "start": 271, + "type": "Literal", + "type": "Literal", + "value": true + }, + "start": 264, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 259, + "type": "VariableDeclarator" + }, + "end": 275, + "kind": "const", + "start": 259, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 306, + "id": { + "end": 277, + "name": "c", + "start": 276, + "type": "Identifier" + }, + "init": { + "cond": { + "end": 285, + "name": "cc", + "start": 283, + "type": "Identifier", + "type": "Identifier" + }, + "digest": null, + "else_ifs": [], + "end": 306, + "final_else": { + "body": [ + { + "end": 304, + "expression": { + "end": 304, + "raw": "2", + "start": 303, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 303, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 305, + "start": 303 + }, + "start": 280, + "then_val": { + "body": [ + { + "end": 291, + "expression": { + "end": 291, + "raw": "1", + "start": 290, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 290, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 292, + "start": 290 + }, + "type": "IfExpression", + "type": "IfExpression" + }, + "start": 276, + "type": "VariableDeclarator" + }, + "end": 306, + "kind": "const", + "start": 276, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 386, + "expression": { + "arguments": [ + { + "end": 320, + "left": { + "end": 315, + "name": "c", + "start": 314, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "==", + "right": { + "end": 320, + "raw": "1", + "start": 319, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 314, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 385, + "raw": "\"both branches of and are true makes the whole expression true\"", + "start": 322, + "type": "Literal", + "type": "Literal", + "value": "both branches of and are true makes the whole expression true" + } + ], + "callee": { + "end": 313, + "name": "assert", + "start": 307, + "type": "Identifier" + }, + "end": 386, + "start": 307, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 307, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "declaration": { + "end": 406, + "id": { + "end": 390, + "name": "dd", + "start": 388, + "type": "Identifier" + }, + "init": { + "end": 406, + "left": { + "end": 398, + "raw": "false", + "start": 393, + "type": "Literal", + "type": "Literal", + "value": false + }, + "operator": "&", + "right": { + "end": 406, + "raw": "false", + "start": 401, + "type": "Literal", + "type": "Literal", + "value": false + }, + "start": 393, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 388, + "type": "VariableDeclarator" + }, + "end": 406, + "kind": "const", + "start": 388, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 437, + "id": { + "end": 408, + "name": "d", + "start": 407, + "type": "Identifier" + }, + "init": { + "cond": { + "end": 416, + "name": "dd", + "start": 414, + "type": "Identifier", + "type": "Identifier" + }, + "digest": null, + "else_ifs": [], + "end": 437, + "final_else": { + "body": [ + { + "end": 435, + "expression": { + "end": 435, + "raw": "2", + "start": 434, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 434, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 436, + "start": 434 + }, + "start": 411, + "then_val": { + "body": [ + { + "end": 422, + "expression": { + "end": 422, + "raw": "1", + "start": 421, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 421, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 423, + "start": 421 + }, + "type": "IfExpression", + "type": "IfExpression" + }, + "start": 407, + "type": "VariableDeclarator" + }, + "end": 437, + "kind": "const", + "start": 407, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 519, + "expression": { + "arguments": [ + { + "end": 451, + "left": { + "end": 446, + "name": "d", + "start": 445, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "==", + "right": { + "end": 451, + "raw": "2", + "start": 450, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 445, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 518, + "raw": "\"both branches of and are false makes the whole expression false\"", + "start": 453, + "type": "Literal", + "type": "Literal", + "value": "both branches of and are false makes the whole expression false" + } + ], + "callee": { + "end": 444, + "name": "assert", + "start": 438, + "type": "Identifier" + }, + "end": 519, + "start": 438, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 438, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 520, + "nonCodeMeta": { + "nonCodeNodes": { + "2": [ + { + "end": 130, + "start": 128, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "5": [ + { + "end": 259, + "start": 257, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "8": [ + { + "end": 388, + "start": 386, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/boolean_logical_and/input.kcl b/src/wasm-lib/kcl/tests/boolean_logical_and/input.kcl new file mode 100644 index 000000000..887e16825 --- /dev/null +++ b/src/wasm-lib/kcl/tests/boolean_logical_and/input.kcl @@ -0,0 +1,31 @@ +aa = true & false +a = if aa { + 1 +} else { + 2 +} +assert(a == 2, "right branch of and is false makes the whole expression false") + +bb = false & true +b = if bb { + 1 +} else { + 2 +} +assert(b == 2, "left branch of and is false makes the whole expression false") + +cc = true & true +c = if cc { + 1 +} else { + 2 +} +assert(c == 1, "both branches of and are true makes the whole expression true") + +dd = false & false +d = if dd { + 1 +} else { + 2 +} +assert(d == 2, "both branches of and are false makes the whole expression false") diff --git a/src/wasm-lib/kcl/tests/boolean_logical_and/ops.snap b/src/wasm-lib/kcl/tests/boolean_logical_and/ops.snap new file mode 100644 index 000000000..53bd4b62a --- /dev/null +++ b/src/wasm-lib/kcl/tests/boolean_logical_and/ops.snap @@ -0,0 +1,5 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed boolean_logical_and.kcl +--- +[] diff --git a/src/wasm-lib/kcl/tests/boolean_logical_and/program_memory.snap b/src/wasm-lib/kcl/tests/boolean_logical_and/program_memory.snap new file mode 100644 index 000000000..cd6673151 --- /dev/null +++ b/src/wasm-lib/kcl/tests/boolean_logical_and/program_memory.snap @@ -0,0 +1,167 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing boolean_logical_and.kcl +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "a": { + "type": "Number", + "value": 2.0, + "__meta": [ + { + "sourceRange": [ + 45, + 46, + 0 + ] + } + ] + }, + "aa": { + "type": "Bool", + "value": false, + "__meta": [ + { + "sourceRange": [ + 5, + 9, + 0 + ] + }, + { + "sourceRange": [ + 12, + 17, + 0 + ] + } + ] + }, + "b": { + "type": "Number", + "value": 2.0, + "__meta": [ + { + "sourceRange": [ + 175, + 176, + 0 + ] + } + ] + }, + "bb": { + "type": "Bool", + "value": false, + "__meta": [ + { + "sourceRange": [ + 135, + 140, + 0 + ] + }, + { + "sourceRange": [ + 143, + 147, + 0 + ] + } + ] + }, + "c": { + "type": "Number", + "value": 1.0, + "__meta": [ + { + "sourceRange": [ + 290, + 291, + 0 + ] + } + ] + }, + "cc": { + "type": "Bool", + "value": true, + "__meta": [ + { + "sourceRange": [ + 264, + 268, + 0 + ] + }, + { + "sourceRange": [ + 271, + 275, + 0 + ] + } + ] + }, + "d": { + "type": "Number", + "value": 2.0, + "__meta": [ + { + "sourceRange": [ + 434, + 435, + 0 + ] + } + ] + }, + "dd": { + "type": "Bool", + "value": false, + "__meta": [ + { + "sourceRange": [ + 393, + 398, + 0 + ] + }, + { + "sourceRange": [ + 401, + 406, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/boolean_logical_multiple/ast.snap b/src/wasm-lib/kcl/tests/boolean_logical_multiple/ast.snap new file mode 100644 index 000000000..7e171eab5 --- /dev/null +++ b/src/wasm-lib/kcl/tests/boolean_logical_multiple/ast.snap @@ -0,0 +1,422 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing boolean_logical_multiple.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 25, + "id": { + "end": 2, + "name": "ii", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 25, + "left": { + "end": 9, + "raw": "true", + "start": 5, + "type": "Literal", + "type": "Literal", + "value": true + }, + "operator": "|", + "right": { + "end": 25, + "left": { + "end": 17, + "raw": "false", + "start": 12, + "type": "Literal", + "type": "Literal", + "value": false + }, + "operator": "&", + "right": { + "end": 25, + "raw": "false", + "start": 20, + "type": "Literal", + "type": "Literal", + "value": false + }, + "start": 12, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 5, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 25, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 56, + "id": { + "end": 27, + "name": "i", + "start": 26, + "type": "Identifier" + }, + "init": { + "cond": { + "end": 35, + "name": "ii", + "start": 33, + "type": "Identifier", + "type": "Identifier" + }, + "digest": null, + "else_ifs": [], + "end": 56, + "final_else": { + "body": [ + { + "end": 54, + "expression": { + "end": 54, + "raw": "2", + "start": 53, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 53, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 55, + "start": 53 + }, + "start": 30, + "then_val": { + "body": [ + { + "end": 41, + "expression": { + "end": 41, + "raw": "1", + "start": 40, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 40, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 42, + "start": 40 + }, + "type": "IfExpression", + "type": "IfExpression" + }, + "start": 26, + "type": "VariableDeclarator" + }, + "end": 56, + "kind": "const", + "start": 26, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 108, + "expression": { + "arguments": [ + { + "end": 70, + "left": { + "end": 65, + "name": "i", + "start": 64, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "==", + "right": { + "end": 70, + "raw": "1", + "start": 69, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 64, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 107, + "raw": "\"and has higher precedence than or\"", + "start": 72, + "type": "Literal", + "type": "Literal", + "value": "and has higher precedence than or" + } + ], + "callee": { + "end": 63, + "name": "assert", + "start": 57, + "type": "Identifier" + }, + "end": 108, + "start": 57, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 57, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "declaration": { + "end": 151, + "id": { + "end": 112, + "name": "jj", + "start": 110, + "type": "Identifier" + }, + "init": { + "end": 151, + "left": { + "end": 136, + "left": { + "end": 120, + "raw": "false", + "start": 115, + "type": "Literal", + "type": "Literal", + "value": false + }, + "operator": "|", + "right": { + "end": 136, + "left": { + "end": 127, + "raw": "true", + "start": 123, + "type": "Literal", + "type": "Literal", + "value": true + }, + "operator": "&", + "right": { + "argument": { + "end": 136, + "raw": "false", + "start": 131, + "type": "Literal", + "type": "Literal", + "value": false + }, + "end": 136, + "operator": "!", + "start": 130, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "start": 123, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 115, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "|", + "right": { + "end": 151, + "left": { + "end": 144, + "raw": "false", + "start": 139, + "type": "Literal", + "type": "Literal", + "value": false + }, + "operator": "&", + "right": { + "end": 151, + "raw": "true", + "start": 147, + "type": "Literal", + "type": "Literal", + "value": true + }, + "start": 139, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 115, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 110, + "type": "VariableDeclarator" + }, + "end": 151, + "kind": "const", + "start": 110, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 182, + "id": { + "end": 153, + "name": "j", + "start": 152, + "type": "Identifier" + }, + "init": { + "cond": { + "end": 161, + "name": "jj", + "start": 159, + "type": "Identifier", + "type": "Identifier" + }, + "digest": null, + "else_ifs": [], + "end": 182, + "final_else": { + "body": [ + { + "end": 180, + "expression": { + "end": 180, + "raw": "2", + "start": 179, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 179, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 181, + "start": 179 + }, + "start": 156, + "then_val": { + "body": [ + { + "end": 167, + "expression": { + "end": 167, + "raw": "1", + "start": 166, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 166, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 168, + "start": 166 + }, + "type": "IfExpression", + "type": "IfExpression" + }, + "start": 152, + "type": "VariableDeclarator" + }, + "end": 182, + "kind": "const", + "start": 152, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 227, + "expression": { + "arguments": [ + { + "end": 196, + "left": { + "end": 191, + "name": "j", + "start": 190, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "==", + "right": { + "end": 196, + "raw": "1", + "start": 195, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 190, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 226, + "raw": "\"multiple logical operators\"", + "start": 198, + "type": "Literal", + "type": "Literal", + "value": "multiple logical operators" + } + ], + "callee": { + "end": 189, + "name": "assert", + "start": 183, + "type": "Identifier" + }, + "end": 227, + "start": 183, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 183, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 228, + "nonCodeMeta": { + "nonCodeNodes": { + "2": [ + { + "end": 110, + "start": 108, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/boolean_logical_multiple/input.kcl b/src/wasm-lib/kcl/tests/boolean_logical_multiple/input.kcl new file mode 100644 index 000000000..94638b18e --- /dev/null +++ b/src/wasm-lib/kcl/tests/boolean_logical_multiple/input.kcl @@ -0,0 +1,15 @@ +ii = true | false & false +i = if ii { + 1 +} else { + 2 +} +assert(i == 1, "and has higher precedence than or") + +jj = false | true & !false | false & true +j = if jj { + 1 +} else { + 2 +} +assert(j == 1, "multiple logical operators") diff --git a/src/wasm-lib/kcl/tests/boolean_logical_multiple/ops.snap b/src/wasm-lib/kcl/tests/boolean_logical_multiple/ops.snap new file mode 100644 index 000000000..f1a248e96 --- /dev/null +++ b/src/wasm-lib/kcl/tests/boolean_logical_multiple/ops.snap @@ -0,0 +1,5 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed boolean_logical_multiple.kcl +--- +[] diff --git a/src/wasm-lib/kcl/tests/boolean_logical_multiple/program_memory.snap b/src/wasm-lib/kcl/tests/boolean_logical_multiple/program_memory.snap new file mode 100644 index 000000000..e3a5511d1 --- /dev/null +++ b/src/wasm-lib/kcl/tests/boolean_logical_multiple/program_memory.snap @@ -0,0 +1,129 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing boolean_logical_multiple.kcl +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "i": { + "type": "Number", + "value": 1.0, + "__meta": [ + { + "sourceRange": [ + 40, + 41, + 0 + ] + } + ] + }, + "ii": { + "type": "Bool", + "value": true, + "__meta": [ + { + "sourceRange": [ + 5, + 9, + 0 + ] + }, + { + "sourceRange": [ + 12, + 17, + 0 + ] + }, + { + "sourceRange": [ + 20, + 25, + 0 + ] + } + ] + }, + "j": { + "type": "Number", + "value": 1.0, + "__meta": [ + { + "sourceRange": [ + 166, + 167, + 0 + ] + } + ] + }, + "jj": { + "type": "Bool", + "value": true, + "__meta": [ + { + "sourceRange": [ + 115, + 120, + 0 + ] + }, + { + "sourceRange": [ + 123, + 127, + 0 + ] + }, + { + "sourceRange": [ + 130, + 136, + 0 + ] + }, + { + "sourceRange": [ + 139, + 144, + 0 + ] + }, + { + "sourceRange": [ + 147, + 151, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/boolean_logical_or/ast.snap b/src/wasm-lib/kcl/tests/boolean_logical_or/ast.snap new file mode 100644 index 000000000..f3f17aebe --- /dev/null +++ b/src/wasm-lib/kcl/tests/boolean_logical_or/ast.snap @@ -0,0 +1,703 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing boolean_logical_or.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 17, + "id": { + "end": 2, + "name": "aa", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 17, + "left": { + "end": 9, + "raw": "true", + "start": 5, + "type": "Literal", + "type": "Literal", + "value": true + }, + "operator": "|", + "right": { + "end": 17, + "raw": "false", + "start": 12, + "type": "Literal", + "type": "Literal", + "value": false + }, + "start": 5, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 17, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 48, + "id": { + "end": 19, + "name": "a", + "start": 18, + "type": "Identifier" + }, + "init": { + "cond": { + "end": 27, + "name": "aa", + "start": 25, + "type": "Identifier", + "type": "Identifier" + }, + "digest": null, + "else_ifs": [], + "end": 48, + "final_else": { + "body": [ + { + "end": 46, + "expression": { + "end": 46, + "raw": "2", + "start": 45, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 45, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 47, + "start": 45 + }, + "start": 22, + "then_val": { + "body": [ + { + "end": 33, + "expression": { + "end": 33, + "raw": "1", + "start": 32, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 32, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 34, + "start": 32 + }, + "type": "IfExpression", + "type": "IfExpression" + }, + "start": 18, + "type": "VariableDeclarator" + }, + "end": 48, + "kind": "const", + "start": 18, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 124, + "expression": { + "arguments": [ + { + "end": 62, + "left": { + "end": 57, + "name": "a", + "start": 56, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "==", + "right": { + "end": 62, + "raw": "1", + "start": 61, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 56, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 123, + "raw": "\"left branch of or is true makes the whole expression true\"", + "start": 64, + "type": "Literal", + "type": "Literal", + "value": "left branch of or is true makes the whole expression true" + } + ], + "callee": { + "end": 55, + "name": "assert", + "start": 49, + "type": "Identifier" + }, + "end": 124, + "start": 49, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 49, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "declaration": { + "end": 143, + "id": { + "end": 128, + "name": "bb", + "start": 126, + "type": "Identifier" + }, + "init": { + "end": 143, + "left": { + "end": 136, + "raw": "false", + "start": 131, + "type": "Literal", + "type": "Literal", + "value": false + }, + "operator": "|", + "right": { + "end": 143, + "raw": "true", + "start": 139, + "type": "Literal", + "type": "Literal", + "value": true + }, + "start": 131, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 126, + "type": "VariableDeclarator" + }, + "end": 143, + "kind": "const", + "start": 126, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 174, + "id": { + "end": 145, + "name": "b", + "start": 144, + "type": "Identifier" + }, + "init": { + "cond": { + "end": 153, + "name": "bb", + "start": 151, + "type": "Identifier", + "type": "Identifier" + }, + "digest": null, + "else_ifs": [], + "end": 174, + "final_else": { + "body": [ + { + "end": 172, + "expression": { + "end": 172, + "raw": "2", + "start": 171, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 171, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 173, + "start": 171 + }, + "start": 148, + "then_val": { + "body": [ + { + "end": 159, + "expression": { + "end": 159, + "raw": "1", + "start": 158, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 158, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 160, + "start": 158 + }, + "type": "IfExpression", + "type": "IfExpression" + }, + "start": 144, + "type": "VariableDeclarator" + }, + "end": 174, + "kind": "const", + "start": 144, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 251, + "expression": { + "arguments": [ + { + "end": 188, + "left": { + "end": 183, + "name": "b", + "start": 182, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "==", + "right": { + "end": 188, + "raw": "1", + "start": 187, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 182, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 250, + "raw": "\"right branch of or is true makes the whole expression true\"", + "start": 190, + "type": "Literal", + "type": "Literal", + "value": "right branch of or is true makes the whole expression true" + } + ], + "callee": { + "end": 181, + "name": "assert", + "start": 175, + "type": "Identifier" + }, + "end": 251, + "start": 175, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 175, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "declaration": { + "end": 269, + "id": { + "end": 255, + "name": "cc", + "start": 253, + "type": "Identifier" + }, + "init": { + "end": 269, + "left": { + "end": 262, + "raw": "true", + "start": 258, + "type": "Literal", + "type": "Literal", + "value": true + }, + "operator": "|", + "right": { + "end": 269, + "raw": "true", + "start": 265, + "type": "Literal", + "type": "Literal", + "value": true + }, + "start": 258, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 253, + "type": "VariableDeclarator" + }, + "end": 269, + "kind": "const", + "start": 253, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 300, + "id": { + "end": 271, + "name": "c", + "start": 270, + "type": "Identifier" + }, + "init": { + "cond": { + "end": 279, + "name": "cc", + "start": 277, + "type": "Identifier", + "type": "Identifier" + }, + "digest": null, + "else_ifs": [], + "end": 300, + "final_else": { + "body": [ + { + "end": 298, + "expression": { + "end": 298, + "raw": "2", + "start": 297, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 297, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 299, + "start": 297 + }, + "start": 274, + "then_val": { + "body": [ + { + "end": 285, + "expression": { + "end": 285, + "raw": "1", + "start": 284, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 284, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 286, + "start": 284 + }, + "type": "IfExpression", + "type": "IfExpression" + }, + "start": 270, + "type": "VariableDeclarator" + }, + "end": 300, + "kind": "const", + "start": 270, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 379, + "expression": { + "arguments": [ + { + "end": 314, + "left": { + "end": 309, + "name": "c", + "start": 308, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "==", + "right": { + "end": 314, + "raw": "1", + "start": 313, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 308, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 378, + "raw": "\"both branches of or are true makes the whole expression true\"", + "start": 316, + "type": "Literal", + "type": "Literal", + "value": "both branches of or are true makes the whole expression true" + } + ], + "callee": { + "end": 307, + "name": "assert", + "start": 301, + "type": "Identifier" + }, + "end": 379, + "start": 301, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 301, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "declaration": { + "end": 399, + "id": { + "end": 383, + "name": "dd", + "start": 381, + "type": "Identifier" + }, + "init": { + "end": 399, + "left": { + "end": 391, + "raw": "false", + "start": 386, + "type": "Literal", + "type": "Literal", + "value": false + }, + "operator": "|", + "right": { + "end": 399, + "raw": "false", + "start": 394, + "type": "Literal", + "type": "Literal", + "value": false + }, + "start": 386, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 381, + "type": "VariableDeclarator" + }, + "end": 399, + "kind": "const", + "start": 381, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 430, + "id": { + "end": 401, + "name": "d", + "start": 400, + "type": "Identifier" + }, + "init": { + "cond": { + "end": 409, + "name": "dd", + "start": 407, + "type": "Identifier", + "type": "Identifier" + }, + "digest": null, + "else_ifs": [], + "end": 430, + "final_else": { + "body": [ + { + "end": 428, + "expression": { + "end": 428, + "raw": "2", + "start": 427, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 427, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 429, + "start": 427 + }, + "start": 404, + "then_val": { + "body": [ + { + "end": 415, + "expression": { + "end": 415, + "raw": "1", + "start": 414, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 414, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 416, + "start": 414 + }, + "type": "IfExpression", + "type": "IfExpression" + }, + "start": 400, + "type": "VariableDeclarator" + }, + "end": 430, + "kind": "const", + "start": 400, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 511, + "expression": { + "arguments": [ + { + "end": 444, + "left": { + "end": 439, + "name": "d", + "start": 438, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "==", + "right": { + "end": 444, + "raw": "2", + "start": 443, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 438, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 510, + "raw": "\"both branches of or are false makes the whole expression false\"", + "start": 446, + "type": "Literal", + "type": "Literal", + "value": "both branches of or are false makes the whole expression false" + } + ], + "callee": { + "end": 437, + "name": "assert", + "start": 431, + "type": "Identifier" + }, + "end": 511, + "start": 431, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 431, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 512, + "nonCodeMeta": { + "nonCodeNodes": { + "2": [ + { + "end": 126, + "start": 124, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "5": [ + { + "end": 253, + "start": 251, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "8": [ + { + "end": 381, + "start": 379, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/boolean_logical_or/input.kcl b/src/wasm-lib/kcl/tests/boolean_logical_or/input.kcl new file mode 100644 index 000000000..7199be468 --- /dev/null +++ b/src/wasm-lib/kcl/tests/boolean_logical_or/input.kcl @@ -0,0 +1,31 @@ +aa = true | false +a = if aa { + 1 +} else { + 2 +} +assert(a == 1, "left branch of or is true makes the whole expression true") + +bb = false | true +b = if bb { + 1 +} else { + 2 +} +assert(b == 1, "right branch of or is true makes the whole expression true") + +cc = true | true +c = if cc { + 1 +} else { + 2 +} +assert(c == 1, "both branches of or are true makes the whole expression true") + +dd = false | false +d = if dd { + 1 +} else { + 2 +} +assert(d == 2, "both branches of or are false makes the whole expression false") diff --git a/src/wasm-lib/kcl/tests/boolean_logical_or/ops.snap b/src/wasm-lib/kcl/tests/boolean_logical_or/ops.snap new file mode 100644 index 000000000..35345ac8e --- /dev/null +++ b/src/wasm-lib/kcl/tests/boolean_logical_or/ops.snap @@ -0,0 +1,5 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed boolean_logical_or.kcl +--- +[] diff --git a/src/wasm-lib/kcl/tests/boolean_logical_or/program_memory.snap b/src/wasm-lib/kcl/tests/boolean_logical_or/program_memory.snap new file mode 100644 index 000000000..d4ee049ff --- /dev/null +++ b/src/wasm-lib/kcl/tests/boolean_logical_or/program_memory.snap @@ -0,0 +1,167 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing boolean_logical_or.kcl +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "a": { + "type": "Number", + "value": 1.0, + "__meta": [ + { + "sourceRange": [ + 32, + 33, + 0 + ] + } + ] + }, + "aa": { + "type": "Bool", + "value": true, + "__meta": [ + { + "sourceRange": [ + 5, + 9, + 0 + ] + }, + { + "sourceRange": [ + 12, + 17, + 0 + ] + } + ] + }, + "b": { + "type": "Number", + "value": 1.0, + "__meta": [ + { + "sourceRange": [ + 158, + 159, + 0 + ] + } + ] + }, + "bb": { + "type": "Bool", + "value": true, + "__meta": [ + { + "sourceRange": [ + 131, + 136, + 0 + ] + }, + { + "sourceRange": [ + 139, + 143, + 0 + ] + } + ] + }, + "c": { + "type": "Number", + "value": 1.0, + "__meta": [ + { + "sourceRange": [ + 284, + 285, + 0 + ] + } + ] + }, + "cc": { + "type": "Bool", + "value": true, + "__meta": [ + { + "sourceRange": [ + 258, + 262, + 0 + ] + }, + { + "sourceRange": [ + 265, + 269, + 0 + ] + } + ] + }, + "d": { + "type": "Number", + "value": 2.0, + "__meta": [ + { + "sourceRange": [ + 427, + 428, + 0 + ] + } + ] + }, + "dd": { + "type": "Bool", + "value": false, + "__meta": [ + { + "sourceRange": [ + 386, + 391, + 0 + ] + }, + { + "sourceRange": [ + 394, + 399, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/circle_three_point/ast.snap b/src/wasm-lib/kcl/tests/circle_three_point/ast.snap new file mode 100644 index 000000000..f2f1fcdc4 --- /dev/null +++ b/src/wasm-lib/kcl/tests/circle_three_point/ast.snap @@ -0,0 +1,217 @@ +--- +source: kcl/src/simulation_tests.rs +assertion_line: 55 +description: Result of parsing circle_three_point.kcl +snapshot_kind: text +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 98, + "id": { + "end": 9, + "name": "sketch001", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 30, + "raw": "'XY'", + "start": 26, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 25, + "name": "startSketchOn", + "start": 12, + "type": "Identifier" + }, + "end": 31, + "start": 12, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "p1" + }, + "arg": { + "elements": [ + { + "end": 62, + "raw": "25", + "start": 60, + "type": "Literal", + "type": "Literal", + "value": 25.0 + }, + { + "end": 66, + "raw": "25", + "start": 64, + "type": "Literal", + "type": "Literal", + "value": 25.0 + } + ], + "end": 67, + "start": 59, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "p2" + }, + "arg": { + "elements": [ + { + "end": 77, + "raw": "30", + "start": 75, + "type": "Literal", + "type": "Literal", + "value": 30.0 + }, + { + "end": 81, + "raw": "20", + "start": 79, + "type": "Literal", + "type": "Literal", + "value": 20.0 + } + ], + "end": 82, + "start": 74, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "p3" + }, + "arg": { + "elements": [ + { + "end": 92, + "raw": "27", + "start": 90, + "type": "Literal", + "type": "Literal", + "value": 27.0 + }, + { + "end": 96, + "raw": "15", + "start": 94, + "type": "Literal", + "type": "Literal", + "value": 15.0 + } + ], + "end": 97, + "start": 89, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "callee": { + "end": 53, + "name": "circleThreePoint", + "start": 37, + "type": "Identifier" + }, + "end": 98, + "start": 37, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + ], + "end": 98, + "start": 12, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 98, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 131, + "id": { + "end": 106, + "name": "example", + "start": 99, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 119, + "raw": "10", + "start": 117, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + { + "end": 130, + "name": "sketch001", + "start": 121, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 116, + "name": "extrude", + "start": 109, + "type": "Identifier" + }, + "end": 131, + "start": 109, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 99, + "type": "VariableDeclarator" + }, + "end": 131, + "kind": "const", + "start": 99, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 132, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/circle_three_point/input.kcl b/src/wasm-lib/kcl/tests/circle_three_point/input.kcl new file mode 100644 index 000000000..75c37d03b --- /dev/null +++ b/src/wasm-lib/kcl/tests/circle_three_point/input.kcl @@ -0,0 +1,3 @@ +sketch001 = startSketchOn('XY') + |> circleThreePoint(p1 = [25, 25], p2 = [30, 20], p3 = [27, 15]) +example = extrude(10, sketch001) diff --git a/src/wasm-lib/kcl/tests/circle_three_point/ops.snap b/src/wasm-lib/kcl/tests/circle_three_point/ops.snap new file mode 100644 index 000000000..1ecea1ca8 --- /dev/null +++ b/src/wasm-lib/kcl/tests/circle_three_point/ops.snap @@ -0,0 +1,53 @@ +--- +source: kcl/src/simulation_tests.rs +assertion_line: 108 +description: Operations executed circle_three_point.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 26, + 30, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 12, + 31, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 117, + 119, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 121, + 130, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 109, + 131, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/circle_three_point/program_memory.snap b/src/wasm-lib/kcl/tests/circle_three_point/program_memory.snap new file mode 100644 index 000000000..11e6fcadb --- /dev/null +++ b/src/wasm-lib/kcl/tests/circle_three_point/program_memory.snap @@ -0,0 +1,242 @@ +--- +source: kcl/src/simulation_tests.rs +assertion_line: 99 +description: Program memory after executing circle_three_point.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "example": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 37, + 98, + 0 + ], + "tag": null, + "type": "extrudeArc" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 98, + 0 + ] + }, + "ccw": true, + "center": [ + 24.749999999999996, + 19.749999999999996 + ], + "from": [ + 30.0059, + 19.75 + ], + "radius": 5.255949010407163, + "tag": null, + "to": [ + 30.0059, + 19.75 + ], + "type": "Circle" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 30.00594901040716, + 19.749999999999996 + ], + "to": [ + 30.00594901040716, + 19.749999999999996 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 98, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 37, + 98, + 0 + ] + } + ] + }, + "height": 10.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 37, + 98, + 0 + ] + } + ] + }, + "sketch001": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 98, + 0 + ] + }, + "ccw": true, + "center": [ + 24.749999999999996, + 19.749999999999996 + ], + "from": [ + 30.0059, + 19.75 + ], + "radius": 5.255949010407163, + "tag": null, + "to": [ + 30.0059, + 19.75 + ], + "type": "Circle" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 30.00594901040716, + 19.749999999999996 + ], + "to": [ + 30.00594901040716, + 19.749999999999996 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 98, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 37, + 98, + 0 + ] + } + ] + } + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/circle_three_point/rendered_model.png b/src/wasm-lib/kcl/tests/circle_three_point/rendered_model.png new file mode 100644 index 000000000..5a201e4fd Binary files /dev/null and b/src/wasm-lib/kcl/tests/circle_three_point/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/ast.snap b/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/ast.snap new file mode 100644 index 000000000..4bb308935 --- /dev/null +++ b/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/ast.snap @@ -0,0 +1,655 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing circular_pattern3d_a_pattern.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 163, + "id": { + "end": 13, + "name": "exampleSketch", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 34, + "raw": "'XZ'", + "start": 30, + "type": "Literal", + "type": "Literal", + "value": "XZ" + } + ], + "callee": { + "end": 29, + "name": "startSketchOn", + "start": 16, + "type": "Identifier" + }, + "end": 35, + "start": 16, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 58, + "raw": "0", + "start": 57, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 61, + "raw": "0", + "start": 60, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 62, + "start": 56, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 65, + "start": 64, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 55, + "name": "startProfileAt", + "start": 41, + "type": "Identifier" + }, + "end": 66, + "start": 41, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 79, + "raw": "0", + "start": 78, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 82, + "raw": "2", + "start": 81, + "type": "Literal", + "type": "Literal", + "value": 2.0 + } + ], + "end": 83, + "start": 77, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 86, + "start": 85, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 76, + "name": "line", + "start": 72, + "type": "Identifier" + }, + "end": 87, + "start": 72, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 100, + "raw": "3", + "start": 99, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + { + "end": 103, + "raw": "1", + "start": 102, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + ], + "end": 104, + "start": 98, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 107, + "start": 106, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 97, + "name": "line", + "start": 93, + "type": "Identifier" + }, + "end": 108, + "start": 93, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 121, + "raw": "0", + "start": 120, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 125, + "raw": "4", + "start": 124, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "end": 125, + "operator": "-", + "start": 123, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 126, + "start": 119, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 129, + "start": 128, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 118, + "name": "line", + "start": 114, + "type": "Identifier" + }, + "end": 130, + "start": 114, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 143, + "start": 142, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 141, + "name": "close", + "start": 136, + "type": "Identifier" + }, + "end": 144, + "start": 136, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 159, + "raw": "1", + "start": 158, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 162, + "start": 161, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 157, + "name": "extrude", + "start": 150, + "type": "Identifier" + }, + "end": 163, + "start": 150, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 163, + "start": 16, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 163, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 261, + "id": { + "end": 171, + "name": "pattn1", + "start": 165, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 245, + "properties": [ + { + "end": 210, + "key": { + "end": 198, + "name": "axis", + "start": 194, + "type": "Identifier" + }, + "start": 194, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 203, + "raw": "1", + "start": 202, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 206, + "raw": "0", + "start": 205, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 209, + "raw": "0", + "start": 208, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 210, + "start": 201, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "end": 227, + "key": { + "end": 223, + "name": "instances", + "start": 214, + "type": "Identifier" + }, + "start": 214, + "type": "ObjectProperty", + "value": { + "end": 227, + "raw": "7", + "start": 226, + "type": "Literal", + "type": "Literal", + "value": 7.0 + } + }, + { + "end": 243, + "key": { + "end": 239, + "name": "distance", + "start": 231, + "type": "Identifier" + }, + "start": 231, + "type": "ObjectProperty", + "value": { + "end": 243, + "raw": "6", + "start": 242, + "type": "Literal", + "type": "Literal", + "value": 6.0 + } + } + ], + "start": 190, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 260, + "name": "exampleSketch", + "start": 247, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 189, + "name": "patternLinear3d", + "start": 174, + "type": "Identifier" + }, + "end": 261, + "start": 174, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 165, + "type": "VariableDeclarator" + }, + "end": 261, + "kind": "const", + "start": 165, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 415, + "id": { + "end": 269, + "name": "pattn2", + "start": 263, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 406, + "properties": [ + { + "end": 310, + "key": { + "end": 298, + "name": "axis", + "start": 294, + "type": "Identifier" + }, + "start": 294, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 303, + "raw": "0", + "start": 302, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 306, + "raw": "0", + "start": 305, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 309, + "raw": "1", + "start": 308, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + ], + "end": 310, + "start": 301, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "end": 338, + "key": { + "end": 320, + "name": "center", + "start": 314, + "type": "Identifier" + }, + "start": 314, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "argument": { + "end": 327, + "raw": "20", + "start": 325, + "type": "Literal", + "type": "Literal", + "value": 20.0 + }, + "end": 327, + "operator": "-", + "start": 324, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 332, + "raw": "20", + "start": 330, + "type": "Literal", + "type": "Literal", + "value": 20.0 + }, + "end": 332, + "operator": "-", + "start": 329, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 337, + "raw": "20", + "start": 335, + "type": "Literal", + "type": "Literal", + "value": 20.0 + }, + "end": 337, + "operator": "-", + "start": 334, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 338, + "start": 323, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "end": 356, + "key": { + "end": 351, + "name": "instances", + "start": 342, + "type": "Identifier" + }, + "start": 342, + "type": "ObjectProperty", + "value": { + "end": 356, + "raw": "41", + "start": 354, + "type": "Literal", + "type": "Literal", + "value": 41.0 + } + }, + { + "end": 376, + "key": { + "end": 370, + "name": "arcDegrees", + "start": 360, + "type": "Identifier" + }, + "start": 360, + "type": "ObjectProperty", + "value": { + "end": 376, + "raw": "360", + "start": 373, + "type": "Literal", + "type": "Literal", + "value": 360.0 + } + }, + { + "end": 404, + "key": { + "end": 396, + "name": "rotateDuplicates", + "start": 380, + "type": "Identifier" + }, + "start": 380, + "type": "ObjectProperty", + "value": { + "end": 404, + "raw": "false", + "start": 399, + "type": "Literal", + "type": "Literal", + "value": false + } + } + ], + "start": 290, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 414, + "name": "pattn1", + "start": 408, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 289, + "name": "patternCircular3d", + "start": 272, + "type": "Identifier" + }, + "end": 415, + "start": 272, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 263, + "type": "VariableDeclarator" + }, + "end": 415, + "kind": "const", + "start": 263, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 416, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 165, + "start": 163, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "1": [ + { + "end": 263, + "start": 261, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/input.kcl b/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/input.kcl new file mode 100644 index 000000000..72da33df4 --- /dev/null +++ b/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/input.kcl @@ -0,0 +1,21 @@ +exampleSketch = startSketchOn('XZ') + |> startProfileAt([0, 0], %) + |> line([0, 2], %) + |> line([3, 1], %) + |> line([0, -4], %) + |> close(%) + |> extrude(1, %) + +pattn1 = patternLinear3d({ + axis = [1, 0, 0], + instances = 7, + distance = 6 +}, exampleSketch) + +pattn2 = patternCircular3d({ + axis = [0, 0, 1], + center = [-20, -20, -20], + instances = 41, + arcDegrees = 360, + rotateDuplicates = false +}, pattn1) diff --git a/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/ops.snap b/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/ops.snap new file mode 100644 index 000000000..c65a05749 --- /dev/null +++ b/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/ops.snap @@ -0,0 +1,104 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed circular_pattern3d_a_pattern.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 30, + 34, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 16, + 35, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 158, + 159, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 161, + 162, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 150, + 163, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 190, + 245, + 0 + ] + }, + "solid_set": { + "sourceRange": [ + 247, + 260, + 0 + ] + } + }, + "name": "patternLinear3d", + "sourceRange": [ + 174, + 261, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 290, + 406, + 0 + ] + }, + "solid_set": { + "sourceRange": [ + 408, + 414, + 0 + ] + } + }, + "name": "patternCircular3d", + "sourceRange": [ + 272, + 415, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/program_memory.snap b/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/program_memory.snap new file mode 100644 index 000000000..690040530 --- /dev/null +++ b/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/program_memory.snap @@ -0,0 +1,59637 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing circular_pattern3d_a_pattern.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "exampleSketch": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "pattn1": { + "type": "Solids", + "value": [ + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + } + ] + }, + "pattn2": { + "type": "Solids", + "value": [ + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/rendered_model.png b/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/rendered_model.png new file mode 100644 index 000000000..3743d09ae Binary files /dev/null and b/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/comparisons/ast.snap b/src/wasm-lib/kcl/tests/comparisons/ast.snap new file mode 100644 index 000000000..e2fb99488 --- /dev/null +++ b/src/wasm-lib/kcl/tests/comparisons/ast.snap @@ -0,0 +1,647 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing comparisons.kcl +snapshot_kind: text +--- +{ + "Ok": { + "body": [ + { + "end": 26, + "expression": { + "arguments": [ + { + "end": 13, + "left": { + "end": 8, + "raw": "3", + "start": 7, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "operator": "==", + "right": { + "end": 13, + "raw": "3", + "start": 12, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "start": 7, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 25, + "raw": "\"equality\"", + "start": 15, + "type": "Literal", + "type": "Literal", + "value": "equality" + } + ], + "callee": { + "end": 6, + "name": "assert", + "start": 0, + "type": "Identifier" + }, + "end": 26, + "start": 0, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 67, + "expression": { + "arguments": [ + { + "end": 44, + "left": { + "end": 37, + "raw": "3.0", + "start": 34, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "operator": "==", + "right": { + "end": 44, + "raw": "3.0", + "start": 41, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "start": 34, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 66, + "raw": "\"equality of floats\"", + "start": 46, + "type": "Literal", + "type": "Literal", + "value": "equality of floats" + } + ], + "callee": { + "end": 33, + "name": "assert", + "start": 27, + "type": "Identifier" + }, + "end": 67, + "start": 27, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 27, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 98, + "expression": { + "arguments": [ + { + "end": 81, + "left": { + "end": 76, + "raw": "3", + "start": 75, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "operator": "!=", + "right": { + "end": 81, + "raw": "4", + "start": 80, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "start": 75, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 97, + "raw": "\"non-equality\"", + "start": 83, + "type": "Literal", + "type": "Literal", + "value": "non-equality" + } + ], + "callee": { + "end": 74, + "name": "assert", + "start": 68, + "type": "Identifier" + }, + "end": 98, + "start": 68, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 68, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 143, + "expression": { + "arguments": [ + { + "end": 116, + "left": { + "end": 109, + "raw": "3.0", + "start": 106, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "operator": "!=", + "right": { + "end": 116, + "raw": "4.0", + "start": 113, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "start": 106, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 142, + "raw": "\"non-equality of floats\"", + "start": 118, + "type": "Literal", + "type": "Literal", + "value": "non-equality of floats" + } + ], + "callee": { + "end": 105, + "name": "assert", + "start": 99, + "type": "Identifier" + }, + "end": 143, + "start": 99, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 99, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 163, + "expression": { + "arguments": [ + { + "end": 156, + "left": { + "end": 152, + "raw": "3", + "start": 151, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "operator": "<", + "right": { + "end": 156, + "raw": "4", + "start": 155, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "start": 151, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 162, + "raw": "\"lt\"", + "start": 158, + "type": "Literal", + "type": "Literal", + "value": "lt" + } + ], + "callee": { + "end": 150, + "name": "assert", + "start": 144, + "type": "Identifier" + }, + "end": 163, + "start": 144, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 144, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 201, + "expression": { + "arguments": [ + { + "end": 177, + "left": { + "end": 172, + "raw": "3", + "start": 171, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "operator": "<=", + "right": { + "end": 177, + "raw": "4", + "start": 176, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "start": 171, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 200, + "raw": "\"lte but actually lt\"", + "start": 179, + "type": "Literal", + "type": "Literal", + "value": "lte but actually lt" + } + ], + "callee": { + "end": 170, + "name": "assert", + "start": 164, + "type": "Identifier" + }, + "end": 201, + "start": 164, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 164, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 239, + "expression": { + "arguments": [ + { + "end": 215, + "left": { + "end": 210, + "raw": "4", + "start": 209, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "operator": "<=", + "right": { + "end": 215, + "raw": "4", + "start": 214, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "start": 209, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 238, + "raw": "\"lte but actually eq\"", + "start": 217, + "type": "Literal", + "type": "Literal", + "value": "lte but actually eq" + } + ], + "callee": { + "end": 208, + "name": "assert", + "start": 202, + "type": "Identifier" + }, + "end": 239, + "start": 202, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 202, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 259, + "expression": { + "arguments": [ + { + "end": 252, + "left": { + "end": 248, + "raw": "4", + "start": 247, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "operator": ">", + "right": { + "end": 252, + "raw": "3", + "start": 251, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "start": 247, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 258, + "raw": "\"gt\"", + "start": 254, + "type": "Literal", + "type": "Literal", + "value": "gt" + } + ], + "callee": { + "end": 246, + "name": "assert", + "start": 240, + "type": "Identifier" + }, + "end": 259, + "start": 240, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 240, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 297, + "expression": { + "arguments": [ + { + "end": 273, + "left": { + "end": 268, + "raw": "4", + "start": 267, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "operator": ">=", + "right": { + "end": 273, + "raw": "3", + "start": 272, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "start": 267, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 296, + "raw": "\"gte but actually gt\"", + "start": 275, + "type": "Literal", + "type": "Literal", + "value": "gte but actually gt" + } + ], + "callee": { + "end": 266, + "name": "assert", + "start": 260, + "type": "Identifier" + }, + "end": 297, + "start": 260, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 260, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 335, + "expression": { + "arguments": [ + { + "end": 311, + "left": { + "end": 306, + "raw": "3", + "start": 305, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "operator": ">=", + "right": { + "end": 311, + "raw": "3", + "start": 310, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "start": 305, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 334, + "raw": "\"gte but actually eq\"", + "start": 313, + "type": "Literal", + "type": "Literal", + "value": "gte but actually eq" + } + ], + "callee": { + "end": 304, + "name": "assert", + "start": 298, + "type": "Identifier" + }, + "end": 335, + "start": 298, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 298, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 375, + "expression": { + "arguments": [ + { + "end": 354, + "left": { + "end": 347, + "raw": "0.0", + "start": 344, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "operator": "==", + "right": { + "end": 354, + "raw": "0.0", + "start": 351, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "start": 344, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 374, + "raw": "\"equality of zero\"", + "start": 356, + "type": "Literal", + "type": "Literal", + "value": "equality of zero" + } + ], + "callee": { + "end": 343, + "name": "assert", + "start": 337, + "type": "Identifier" + }, + "end": 375, + "start": 337, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 337, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 428, + "expression": { + "arguments": [ + { + "end": 394, + "left": { + "end": 386, + "raw": "0.0", + "start": 383, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "operator": "==", + "right": { + "argument": { + "end": 394, + "raw": "0.0", + "start": 391, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "end": 394, + "operator": "-", + "start": 390, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "start": 383, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 427, + "raw": "\"equality of zero and neg zero\"", + "start": 396, + "type": "Literal", + "type": "Literal", + "value": "equality of zero and neg zero" + } + ], + "callee": { + "end": 382, + "name": "assert", + "start": 376, + "type": "Identifier" + }, + "end": 428, + "start": 376, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 376, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 429, + "nonCodeMeta": { + "nonCodeNodes": { + "9": [ + { + "end": 337, + "start": 335, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/tests/executor/inputs/no_visuals/comparisons.kcl b/src/wasm-lib/kcl/tests/comparisons/input.kcl similarity index 100% rename from src/wasm-lib/tests/executor/inputs/no_visuals/comparisons.kcl rename to src/wasm-lib/kcl/tests/comparisons/input.kcl diff --git a/src/wasm-lib/kcl/tests/comparisons/ops.snap b/src/wasm-lib/kcl/tests/comparisons/ops.snap new file mode 100644 index 000000000..e08f5c5eb --- /dev/null +++ b/src/wasm-lib/kcl/tests/comparisons/ops.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed comparisons.kcl +snapshot_kind: text +--- +[] diff --git a/src/wasm-lib/kcl/tests/comparisons/program_memory.snap b/src/wasm-lib/kcl/tests/comparisons/program_memory.snap new file mode 100644 index 000000000..3ed819d9c --- /dev/null +++ b/src/wasm-lib/kcl/tests/comparisons/program_memory.snap @@ -0,0 +1,36 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing comparisons.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/comparisons_multiple/ast.snap b/src/wasm-lib/kcl/tests/comparisons_multiple/ast.snap new file mode 100644 index 000000000..a0b4dabd2 --- /dev/null +++ b/src/wasm-lib/kcl/tests/comparisons_multiple/ast.snap @@ -0,0 +1,79 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing comparisons_multiple.kcl +snapshot_kind: text +--- +{ + "Ok": { + "body": [ + { + "end": 46, + "expression": { + "arguments": [ + { + "end": 18, + "left": { + "end": 13, + "left": { + "end": 8, + "raw": "3", + "start": 7, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "operator": "==", + "right": { + "end": 13, + "raw": "3", + "start": 12, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "start": 7, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "==", + "right": { + "end": 18, + "raw": "3", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "start": 7, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 45, + "raw": "\"this should not compile\"", + "start": 20, + "type": "Literal", + "type": "Literal", + "value": "this should not compile" + } + ], + "callee": { + "end": 6, + "name": "assert", + "start": 0, + "type": "Identifier" + }, + "end": 46, + "start": 0, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 47, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/comparisons_multiple/execution_error.snap b/src/wasm-lib/kcl/tests/comparisons_multiple/execution_error.snap new file mode 100644 index 000000000..4d1637f22 --- /dev/null +++ b/src/wasm-lib/kcl/tests/comparisons_multiple/execution_error.snap @@ -0,0 +1,11 @@ +--- +source: kcl/src/simulation_tests.rs +description: Error from executing comparisons_multiple.kcl +--- +KCL Semantic error + + × semantic: Expected a number, but found a boolean (true/false value) + ╭──── + 1 │ assert(3 == 3 == 3, "this should not compile") + · ────── + ╰──── diff --git a/src/wasm-lib/kcl/tests/comparisons_multiple/input.kcl b/src/wasm-lib/kcl/tests/comparisons_multiple/input.kcl new file mode 100644 index 000000000..23492e838 --- /dev/null +++ b/src/wasm-lib/kcl/tests/comparisons_multiple/input.kcl @@ -0,0 +1 @@ +assert(3 == 3 == 3, "this should not compile") diff --git a/src/wasm-lib/kcl/tests/comparisons_multiple/ops.snap b/src/wasm-lib/kcl/tests/comparisons_multiple/ops.snap new file mode 100644 index 000000000..77d1d7c66 --- /dev/null +++ b/src/wasm-lib/kcl/tests/comparisons_multiple/ops.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed comparisons_multiple.kcl +snapshot_kind: text +--- +[] diff --git a/src/wasm-lib/kcl/tests/computed_var/ast.snap b/src/wasm-lib/kcl/tests/computed_var/ast.snap new file mode 100644 index 000000000..cd07dac1b --- /dev/null +++ b/src/wasm-lib/kcl/tests/computed_var/ast.snap @@ -0,0 +1,420 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing computed_var.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 56, + "id": { + "end": 40, + "name": "arr", + "start": 37, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 45, + "raw": "0", + "start": 44, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 48, + "raw": "0", + "start": 47, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 51, + "raw": "0", + "start": 50, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 55, + "raw": "10", + "start": 53, + "type": "Literal", + "type": "Literal", + "value": 10.0 + } + ], + "end": 56, + "start": 43, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 37, + "type": "VariableDeclarator" + }, + "end": 56, + "kind": "const", + "start": 37, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 62, + "id": { + "end": 58, + "name": "i", + "start": 57, + "type": "Identifier" + }, + "init": { + "end": 62, + "raw": "3", + "start": 61, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "start": 57, + "type": "VariableDeclarator" + }, + "end": 62, + "kind": "const", + "start": 57, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 75, + "id": { + "end": 66, + "name": "ten", + "start": 63, + "type": "Identifier" + }, + "init": { + "computed": true, + "end": 75, + "object": { + "end": 72, + "name": "arr", + "start": 69, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 74, + "name": "i", + "start": 73, + "type": "Identifier", + "type": "Identifier" + }, + "start": 69, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 63, + "type": "VariableDeclarator" + }, + "end": 75, + "kind": "const", + "start": 63, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 115, + "expression": { + "arguments": [ + { + "end": 92, + "name": "ten", + "start": 89, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 96, + "raw": "10", + "start": 94, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + { + "end": 106, + "raw": "0.000001", + "start": 98, + "type": "Literal", + "type": "Literal", + "value": 0.000001 + }, + { + "end": 114, + "raw": "\"oops\"", + "start": 108, + "type": "Literal", + "type": "Literal", + "value": "oops" + } + ], + "callee": { + "end": 88, + "name": "assertEqual", + "start": 77, + "type": "Identifier" + }, + "end": 115, + "start": 77, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 77, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "declaration": { + "end": 126, + "id": { + "end": 118, + "name": "p", + "start": 117, + "type": "Identifier" + }, + "init": { + "end": 126, + "raw": "\"foo\"", + "start": 121, + "type": "Literal", + "type": "Literal", + "value": "foo" + }, + "start": 117, + "type": "VariableDeclarator" + }, + "end": 126, + "kind": "const", + "start": 117, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 153, + "id": { + "end": 130, + "name": "obj", + "start": 127, + "type": "Identifier" + }, + "init": { + "end": 153, + "properties": [ + { + "end": 142, + "key": { + "end": 138, + "name": "foo", + "start": 135, + "type": "Identifier" + }, + "start": 135, + "type": "ObjectProperty", + "value": { + "end": 142, + "raw": "1", + "start": 141, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + }, + { + "end": 151, + "key": { + "end": 147, + "name": "bar", + "start": 144, + "type": "Identifier" + }, + "start": 144, + "type": "ObjectProperty", + "value": { + "end": 151, + "raw": "0", + "start": 150, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + } + ], + "start": 133, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 127, + "type": "VariableDeclarator" + }, + "end": 153, + "kind": "const", + "start": 127, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 166, + "id": { + "end": 157, + "name": "one", + "start": 154, + "type": "Identifier" + }, + "init": { + "computed": true, + "end": 166, + "object": { + "end": 163, + "name": "obj", + "start": 160, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 165, + "name": "p", + "start": 164, + "type": "Identifier", + "type": "Identifier" + }, + "start": 160, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 154, + "type": "VariableDeclarator" + }, + "end": 166, + "kind": "const", + "start": 154, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 206, + "expression": { + "arguments": [ + { + "end": 183, + "name": "one", + "start": 180, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 186, + "raw": "1", + "start": 185, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 197, + "raw": "0.0000001", + "start": 188, + "type": "Literal", + "type": "Literal", + "value": 0.0000001 + }, + { + "end": 205, + "raw": "\"oops\"", + "start": 199, + "type": "Literal", + "type": "Literal", + "value": "oops" + } + ], + "callee": { + "end": 179, + "name": "assertEqual", + "start": 168, + "type": "Identifier" + }, + "end": 206, + "start": 168, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 168, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 207, + "nonCodeMeta": { + "nonCodeNodes": { + "2": [ + { + "end": 77, + "start": 75, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "3": [ + { + "end": 117, + "start": 115, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "6": [ + { + "end": 168, + "start": 166, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [ + { + "end": 34, + "start": 0, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "This tests computed properties.", + "style": "line" + } + }, + { + "end": 37, + "start": 34, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/computed_var/input.kcl b/src/wasm-lib/kcl/tests/computed_var/input.kcl new file mode 100644 index 000000000..8c16990f2 --- /dev/null +++ b/src/wasm-lib/kcl/tests/computed_var/input.kcl @@ -0,0 +1,14 @@ +// This tests computed properties. + + +arr = [0, 0, 0, 10] +i = 3 +ten = arr[i] + +assertEqual(ten, 10, 0.000001, "oops") + +p = "foo" +obj = { foo = 1, bar = 0 } +one = obj[p] + +assertEqual(one, 1, 0.0000001, "oops") diff --git a/src/wasm-lib/kcl/tests/computed_var/ops.snap b/src/wasm-lib/kcl/tests/computed_var/ops.snap new file mode 100644 index 000000000..a350d00b7 --- /dev/null +++ b/src/wasm-lib/kcl/tests/computed_var/ops.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed computed_var.kcl +snapshot_kind: text +--- +[] diff --git a/src/wasm-lib/kcl/tests/computed_var/program_memory.snap b/src/wasm-lib/kcl/tests/computed_var/program_memory.snap new file mode 100644 index 000000000..e99f38069 --- /dev/null +++ b/src/wasm-lib/kcl/tests/computed_var/program_memory.snap @@ -0,0 +1,195 @@ +--- +source: kcl/src/simulation_tests.rs +assertion_line: 92 +description: Program memory after executing computed_var.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "arr": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "__meta": [ + { + "sourceRange": [ + 44, + 45, + 0 + ] + } + ] + }, + { + "type": "Number", + "value": 0.0, + "__meta": [ + { + "sourceRange": [ + 47, + 48, + 0 + ] + } + ] + }, + { + "type": "Number", + "value": 0.0, + "__meta": [ + { + "sourceRange": [ + 50, + 51, + 0 + ] + } + ] + }, + { + "type": "Number", + "value": 10.0, + "__meta": [ + { + "sourceRange": [ + 53, + 55, + 0 + ] + } + ] + } + ], + "__meta": [ + { + "sourceRange": [ + 43, + 56, + 0 + ] + } + ] + }, + "i": { + "type": "Number", + "value": 3.0, + "__meta": [ + { + "sourceRange": [ + 61, + 62, + 0 + ] + } + ] + }, + "obj": { + "type": "Object", + "value": { + "bar": { + "type": "Number", + "value": 0.0, + "__meta": [ + { + "sourceRange": [ + 150, + 151, + 0 + ] + } + ] + }, + "foo": { + "type": "Number", + "value": 1.0, + "__meta": [ + { + "sourceRange": [ + 141, + 142, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 133, + 153, + 0 + ] + } + ] + }, + "one": { + "type": "Number", + "value": 1.0, + "__meta": [ + { + "sourceRange": [ + 141, + 142, + 0 + ] + } + ] + }, + "p": { + "type": "String", + "value": "foo", + "__meta": [ + { + "sourceRange": [ + 121, + 126, + 0 + ] + } + ] + }, + "ten": { + "type": "Number", + "value": 10.0, + "__meta": [ + { + "sourceRange": [ + 53, + 55, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/computed_var/rendered_model.png b/src/wasm-lib/kcl/tests/computed_var/rendered_model.png new file mode 100644 index 000000000..6148ae432 Binary files /dev/null and b/src/wasm-lib/kcl/tests/computed_var/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/cube/ast.snap b/src/wasm-lib/kcl/tests/cube/ast.snap new file mode 100644 index 000000000..39b2fd424 --- /dev/null +++ b/src/wasm-lib/kcl/tests/cube/ast.snap @@ -0,0 +1,766 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing cube.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 322, + "id": { + "end": 7, + "name": "cube", + "start": 3, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "declaration": { + "end": 42, + "id": { + "end": 29, + "name": "l", + "start": 28, + "type": "Identifier" + }, + "init": { + "end": 42, + "left": { + "end": 38, + "name": "length", + "start": 32, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 42, + "raw": "2", + "start": 41, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 28, + "type": "VariableDeclarator" + }, + "end": 42, + "kind": "const", + "start": 28, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 58, + "id": { + "end": 46, + "name": "x", + "start": 45, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 58, + "object": { + "end": 55, + "name": "center", + "start": 49, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 57, + "raw": "0", + "start": 56, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "start": 49, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 45, + "type": "VariableDeclarator" + }, + "end": 58, + "kind": "const", + "start": 45, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 74, + "id": { + "end": 62, + "name": "y", + "start": 61, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 74, + "object": { + "end": 71, + "name": "center", + "start": 65, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 73, + "raw": "1", + "start": 72, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 65, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 61, + "type": "VariableDeclarator" + }, + "end": 74, + "kind": "const", + "start": 61, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 98, + "id": { + "end": 79, + "name": "p0", + "start": 77, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 89, + "left": { + "argument": { + "end": 85, + "name": "l", + "start": 84, + "type": "Identifier", + "type": "Identifier" + }, + "end": 85, + "operator": "-", + "start": 83, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 89, + "name": "x", + "start": 88, + "type": "Identifier", + "type": "Identifier" + }, + "start": 83, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 97, + "left": { + "argument": { + "end": 93, + "name": "l", + "start": 92, + "type": "Identifier", + "type": "Identifier" + }, + "end": 93, + "operator": "-", + "start": 91, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 97, + "name": "y", + "start": 96, + "type": "Identifier", + "type": "Identifier" + }, + "start": 91, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 98, + "start": 82, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 77, + "type": "VariableDeclarator" + }, + "end": 98, + "kind": "const", + "start": 77, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 121, + "id": { + "end": 103, + "name": "p1", + "start": 101, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 113, + "left": { + "argument": { + "end": 109, + "name": "l", + "start": 108, + "type": "Identifier", + "type": "Identifier" + }, + "end": 109, + "operator": "-", + "start": 107, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 113, + "name": "x", + "start": 112, + "type": "Identifier", + "type": "Identifier" + }, + "start": 107, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 120, + "left": { + "end": 116, + "name": "l", + "start": 115, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 120, + "name": "y", + "start": 119, + "type": "Identifier", + "type": "Identifier" + }, + "start": 115, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 121, + "start": 106, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 101, + "type": "VariableDeclarator" + }, + "end": 121, + "kind": "const", + "start": 101, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 143, + "id": { + "end": 126, + "name": "p2", + "start": 124, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 135, + "left": { + "end": 131, + "name": "l", + "start": 130, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 135, + "name": "x", + "start": 134, + "type": "Identifier", + "type": "Identifier" + }, + "start": 130, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 142, + "left": { + "end": 138, + "name": "l", + "start": 137, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 142, + "name": "y", + "start": 141, + "type": "Identifier", + "type": "Identifier" + }, + "start": 137, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 143, + "start": 129, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 124, + "type": "VariableDeclarator" + }, + "end": 143, + "kind": "const", + "start": 124, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 166, + "id": { + "end": 148, + "name": "p3", + "start": 146, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 157, + "left": { + "end": 153, + "name": "l", + "start": 152, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 157, + "name": "x", + "start": 156, + "type": "Identifier", + "type": "Identifier" + }, + "start": 152, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 165, + "left": { + "argument": { + "end": 161, + "name": "l", + "start": 160, + "type": "Identifier", + "type": "Identifier" + }, + "end": 161, + "operator": "-", + "start": 159, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 165, + "name": "y", + "start": 164, + "type": "Identifier", + "type": "Identifier" + }, + "start": 159, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 166, + "start": 151, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 146, + "type": "VariableDeclarator" + }, + "end": 166, + "kind": "const", + "start": 146, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "argument": { + "body": [ + { + "arguments": [ + { + "end": 193, + "name": "p0", + "start": 191, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 190, + "name": "startSketchAt", + "start": 177, + "type": "Identifier" + }, + "end": 194, + "start": 177, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 211, + "name": "p1", + "start": 209, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 214, + "start": 213, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 208, + "name": "lineTo", + "start": 202, + "type": "Identifier" + }, + "end": 215, + "start": 202, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 232, + "name": "p2", + "start": 230, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 235, + "start": 234, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 229, + "name": "lineTo", + "start": 223, + "type": "Identifier" + }, + "end": 236, + "start": 223, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 253, + "name": "p3", + "start": 251, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 256, + "start": 255, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 250, + "name": "lineTo", + "start": 244, + "type": "Identifier" + }, + "end": 257, + "start": 244, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 274, + "name": "p0", + "start": 272, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 277, + "start": 276, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 271, + "name": "lineTo", + "start": 265, + "type": "Identifier" + }, + "end": 278, + "start": 265, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 293, + "start": 292, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 291, + "name": "close", + "start": 286, + "type": "Identifier" + }, + "end": 294, + "start": 286, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 316, + "name": "length", + "start": 310, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 319, + "start": 318, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 309, + "name": "extrude", + "start": 302, + "type": "Identifier" + }, + "end": 320, + "start": 302, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 320, + "start": 177, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "end": 320, + "start": 170, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 322, + "nonCodeMeta": { + "nonCodeNodes": { + "6": [ + { + "end": 170, + "start": 166, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 24 + }, + "end": 322, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 14, + "name": "length", + "start": 8, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 22, + "name": "center", + "start": 16, + "type": "Identifier" + } + } + ], + "start": 7, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" + }, + "end": 322, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 349, + "id": { + "end": 330, + "name": "myCube", + "start": 324, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 340, + "raw": "40", + "start": 338, + "type": "Literal", + "type": "Literal", + "value": 40.0 + }, + { + "elements": [ + { + "end": 344, + "raw": "0", + "start": 343, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 347, + "raw": "0", + "start": 346, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 348, + "start": 342, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + ], + "callee": { + "end": 337, + "name": "cube", + "start": 333, + "type": "Identifier" + }, + "end": 349, + "start": 333, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 324, + "type": "VariableDeclarator" + }, + "end": 349, + "kind": "const", + "start": 324, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 350, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 324, + "start": 322, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/cube/input.kcl b/src/wasm-lib/kcl/tests/cube/input.kcl new file mode 100644 index 000000000..9ffe56eb2 --- /dev/null +++ b/src/wasm-lib/kcl/tests/cube/input.kcl @@ -0,0 +1,19 @@ +fn cube(length, center) { + l = length / 2 + x = center[0] + y = center[1] + p0 = [-l + x, -l + y] + p1 = [-l + x, l + y] + p2 = [l + x, l + y] + p3 = [l + x, -l + y] + + return startSketchAt(p0) + |> lineTo(p1, %) + |> lineTo(p2, %) + |> lineTo(p3, %) + |> lineTo(p0, %) + |> close(%) + |> extrude(length, %) +} + +myCube = cube(40, [0, 0]) diff --git a/src/wasm-lib/kcl/tests/cube/ops.snap b/src/wasm-lib/kcl/tests/cube/ops.snap new file mode 100644 index 000000000..0198e0d18 --- /dev/null +++ b/src/wasm-lib/kcl/tests/cube/ops.snap @@ -0,0 +1,52 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed cube.kcl +snapshot_kind: text +--- +[ + { + "type": "UserDefinedFunctionCall", + "name": "cube", + "functionSourceRange": [ + 7, + 322, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 333, + 349, + 0 + ] + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 310, + 316, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 318, + 319, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 302, + 320, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "type": "UserDefinedFunctionReturn" + } +] diff --git a/src/wasm-lib/kcl/tests/cube/program_memory.snap b/src/wasm-lib/kcl/tests/cube/program_memory.snap new file mode 100644 index 000000000..ab2d290cc --- /dev/null +++ b/src/wasm-lib/kcl/tests/cube/program_memory.snap @@ -0,0 +1,957 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing cube.kcl +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "cube": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "declaration": { + "end": 42, + "id": { + "end": 29, + "name": "l", + "start": 28, + "type": "Identifier" + }, + "init": { + "end": 42, + "left": { + "end": 38, + "name": "length", + "start": 32, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 42, + "raw": "2", + "start": 41, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 28, + "type": "VariableDeclarator" + }, + "end": 42, + "kind": "const", + "start": 28, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 58, + "id": { + "end": 46, + "name": "x", + "start": 45, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 58, + "object": { + "end": 55, + "name": "center", + "start": 49, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 57, + "raw": "0", + "start": 56, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "start": 49, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 45, + "type": "VariableDeclarator" + }, + "end": 58, + "kind": "const", + "start": 45, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 74, + "id": { + "end": 62, + "name": "y", + "start": 61, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 74, + "object": { + "end": 71, + "name": "center", + "start": 65, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 73, + "raw": "1", + "start": 72, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 65, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 61, + "type": "VariableDeclarator" + }, + "end": 74, + "kind": "const", + "start": 61, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 98, + "id": { + "end": 79, + "name": "p0", + "start": 77, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 89, + "left": { + "argument": { + "end": 85, + "name": "l", + "start": 84, + "type": "Identifier", + "type": "Identifier" + }, + "end": 85, + "operator": "-", + "start": 83, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 89, + "name": "x", + "start": 88, + "type": "Identifier", + "type": "Identifier" + }, + "start": 83, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 97, + "left": { + "argument": { + "end": 93, + "name": "l", + "start": 92, + "type": "Identifier", + "type": "Identifier" + }, + "end": 93, + "operator": "-", + "start": 91, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 97, + "name": "y", + "start": 96, + "type": "Identifier", + "type": "Identifier" + }, + "start": 91, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 98, + "start": 82, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 77, + "type": "VariableDeclarator" + }, + "end": 98, + "kind": "const", + "start": 77, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 121, + "id": { + "end": 103, + "name": "p1", + "start": 101, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 113, + "left": { + "argument": { + "end": 109, + "name": "l", + "start": 108, + "type": "Identifier", + "type": "Identifier" + }, + "end": 109, + "operator": "-", + "start": 107, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 113, + "name": "x", + "start": 112, + "type": "Identifier", + "type": "Identifier" + }, + "start": 107, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 120, + "left": { + "end": 116, + "name": "l", + "start": 115, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 120, + "name": "y", + "start": 119, + "type": "Identifier", + "type": "Identifier" + }, + "start": 115, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 121, + "start": 106, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 101, + "type": "VariableDeclarator" + }, + "end": 121, + "kind": "const", + "start": 101, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 143, + "id": { + "end": 126, + "name": "p2", + "start": 124, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 135, + "left": { + "end": 131, + "name": "l", + "start": 130, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 135, + "name": "x", + "start": 134, + "type": "Identifier", + "type": "Identifier" + }, + "start": 130, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 142, + "left": { + "end": 138, + "name": "l", + "start": 137, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 142, + "name": "y", + "start": 141, + "type": "Identifier", + "type": "Identifier" + }, + "start": 137, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 143, + "start": 129, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 124, + "type": "VariableDeclarator" + }, + "end": 143, + "kind": "const", + "start": 124, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 166, + "id": { + "end": 148, + "name": "p3", + "start": 146, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 157, + "left": { + "end": 153, + "name": "l", + "start": 152, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 157, + "name": "x", + "start": 156, + "type": "Identifier", + "type": "Identifier" + }, + "start": 152, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 165, + "left": { + "argument": { + "end": 161, + "name": "l", + "start": 160, + "type": "Identifier", + "type": "Identifier" + }, + "end": 161, + "operator": "-", + "start": 159, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 165, + "name": "y", + "start": 164, + "type": "Identifier", + "type": "Identifier" + }, + "start": 159, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 166, + "start": 151, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 146, + "type": "VariableDeclarator" + }, + "end": 166, + "kind": "const", + "start": 146, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "argument": { + "body": [ + { + "arguments": [ + { + "end": 193, + "name": "p0", + "start": 191, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 190, + "name": "startSketchAt", + "start": 177, + "type": "Identifier" + }, + "end": 194, + "start": 177, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 211, + "name": "p1", + "start": 209, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 214, + "start": 213, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 208, + "name": "lineTo", + "start": 202, + "type": "Identifier" + }, + "end": 215, + "start": 202, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 232, + "name": "p2", + "start": 230, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 235, + "start": 234, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 229, + "name": "lineTo", + "start": 223, + "type": "Identifier" + }, + "end": 236, + "start": 223, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 253, + "name": "p3", + "start": 251, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 256, + "start": 255, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 250, + "name": "lineTo", + "start": 244, + "type": "Identifier" + }, + "end": 257, + "start": 244, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 274, + "name": "p0", + "start": 272, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 277, + "start": 276, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 271, + "name": "lineTo", + "start": 265, + "type": "Identifier" + }, + "end": 278, + "start": 265, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 293, + "start": 292, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 291, + "name": "close", + "start": 286, + "type": "Identifier" + }, + "end": 294, + "start": 286, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 316, + "name": "length", + "start": 310, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 319, + "start": 318, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 309, + "name": "extrude", + "start": 302, + "type": "Identifier" + }, + "end": 320, + "start": 302, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 320, + "start": 177, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "end": 320, + "start": 170, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 322, + "nonCodeMeta": { + "nonCodeNodes": { + "6": [ + { + "end": 170, + "start": 166, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 24 + }, + "end": 322, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 14, + "name": "length", + "start": 8, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 22, + "name": "center", + "start": 16, + "type": "Identifier" + } + } + ], + "start": 7, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 7, + 322, + 0 + ] + } + ] + }, + "myCube": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 202, + 215, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 223, + 236, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 244, + 257, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 265, + 278, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 202, + 215, + 0 + ] + }, + "from": [ + -20.0, + -20.0 + ], + "tag": null, + "to": [ + -20.0, + 20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 223, + 236, + 0 + ] + }, + "from": [ + -20.0, + 20.0 + ], + "tag": null, + "to": [ + 20.0, + 20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 244, + 257, + 0 + ] + }, + "from": [ + 20.0, + 20.0 + ], + "tag": null, + "to": [ + 20.0, + -20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 265, + 278, + 0 + ] + }, + "from": [ + 20.0, + -20.0 + ], + "tag": null, + "to": [ + -20.0, + -20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 286, + 294, + 0 + ] + }, + "from": [ + -20.0, + -20.0 + ], + "tag": null, + "to": [ + -20.0, + -20.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + -20.0, + -20.0 + ], + "to": [ + -20.0, + -20.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 177, + 194, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 177, + 194, + 0 + ] + } + ] + }, + "height": 40.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 177, + 194, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/cube/rendered_model.png b/src/wasm-lib/kcl/tests/cube/rendered_model.png new file mode 100644 index 000000000..1a74f37b4 Binary files /dev/null and b/src/wasm-lib/kcl/tests/cube/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/double_map_fn/ast.snap b/src/wasm-lib/kcl/tests/double_map_fn/ast.snap new file mode 100644 index 000000000..734b508cd --- /dev/null +++ b/src/wasm-lib/kcl/tests/double_map_fn/ast.snap @@ -0,0 +1,224 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing double_map_fn.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 34, + "id": { + "end": 12, + "name": "increment", + "start": 3, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "end": 32, + "left": { + "end": 28, + "name": "i", + "start": 27, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 32, + "raw": "1", + "start": 31, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 27, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 32, + "start": 20, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 34, + "start": 16 + }, + "end": 34, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 14, + "name": "i", + "start": 13, + "type": "Identifier" + } + } + ], + "start": 12, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" + }, + "end": 34, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 47, + "id": { + "end": 38, + "name": "xs", + "start": 36, + "type": "Identifier" + }, + "init": { + "end": 47, + "endElement": { + "end": 46, + "raw": "2", + "start": 45, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "endInclusive": true, + "start": 41, + "startElement": { + "end": 43, + "raw": "0", + "start": 42, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "type": "ArrayRangeExpression", + "type": "ArrayRangeExpression" + }, + "start": 36, + "type": "VariableDeclarator" + }, + "end": 47, + "kind": "const", + "start": 36, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 101, + "id": { + "end": 50, + "name": "ys", + "start": 48, + "type": "Identifier" + }, + "init": { + "body": [ + { + "end": 55, + "name": "xs", + "start": 53, + "type": "Identifier", + "type": "Identifier" + }, + { + "arguments": [ + { + "end": 66, + "start": 65, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 77, + "name": "increment", + "start": 68, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 64, + "name": "map", + "start": 61, + "type": "Identifier" + }, + "end": 78, + "start": 61, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 89, + "start": 88, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 100, + "name": "increment", + "start": 91, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 87, + "name": "map", + "start": 84, + "type": "Identifier" + }, + "end": 101, + "start": 84, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 101, + "start": 53, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 48, + "type": "VariableDeclarator" + }, + "end": 101, + "kind": "const", + "start": 48, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 102, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 36, + "start": 34, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/double_map_fn/input.kcl b/src/wasm-lib/kcl/tests/double_map_fn/input.kcl new file mode 100644 index 000000000..a972499dc --- /dev/null +++ b/src/wasm-lib/kcl/tests/double_map_fn/input.kcl @@ -0,0 +1,8 @@ +fn increment(i) { + return i + 1 +} + +xs = [0..2] +ys = xs + |> map(%, increment) + |> map(%, increment) diff --git a/src/wasm-lib/kcl/tests/double_map_fn/ops.snap b/src/wasm-lib/kcl/tests/double_map_fn/ops.snap new file mode 100644 index 000000000..09ace48a8 --- /dev/null +++ b/src/wasm-lib/kcl/tests/double_map_fn/ops.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed double_map_fn.kcl +snapshot_kind: text +--- +[] diff --git a/src/wasm-lib/kcl/tests/double_map_fn/program_memory.snap b/src/wasm-lib/kcl/tests/double_map_fn/program_memory.snap new file mode 100644 index 000000000..2d3f6f91c --- /dev/null +++ b/src/wasm-lib/kcl/tests/double_map_fn/program_memory.snap @@ -0,0 +1,277 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing double_map_fn.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "increment": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "argument": { + "end": 32, + "left": { + "end": 28, + "name": "i", + "start": 27, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 32, + "raw": "1", + "start": 31, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 27, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 32, + "start": 20, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 34, + "start": 16 + }, + "end": 34, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 14, + "name": "i", + "start": 13, + "type": "Identifier" + } + } + ], + "start": 12, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 12, + 34, + 0 + ] + } + ] + }, + "xs": { + "type": "Array", + "value": [ + { + "type": "Int", + "value": 0, + "__meta": [ + { + "sourceRange": [ + 41, + 47, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": 1, + "__meta": [ + { + "sourceRange": [ + 41, + 47, + 0 + ] + } + ] + }, + { + "type": "Int", + "value": 2, + "__meta": [ + { + "sourceRange": [ + 41, + 47, + 0 + ] + } + ] + } + ], + "__meta": [ + { + "sourceRange": [ + 41, + 47, + 0 + ] + } + ] + }, + "ys": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 2.0, + "__meta": [ + { + "sourceRange": [ + 41, + 47, + 0 + ] + }, + { + "sourceRange": [ + 31, + 32, + 0 + ] + }, + { + "sourceRange": [ + 31, + 32, + 0 + ] + } + ] + }, + { + "type": "Number", + "value": 3.0, + "__meta": [ + { + "sourceRange": [ + 41, + 47, + 0 + ] + }, + { + "sourceRange": [ + 31, + 32, + 0 + ] + }, + { + "sourceRange": [ + 31, + 32, + 0 + ] + } + ] + }, + { + "type": "Number", + "value": 4.0, + "__meta": [ + { + "sourceRange": [ + 41, + 47, + 0 + ] + }, + { + "sourceRange": [ + 31, + 32, + 0 + ] + }, + { + "sourceRange": [ + 31, + 32, + 0 + ] + } + ] + } + ], + "__meta": [ + { + "sourceRange": [ + 84, + 101, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/fillet-and-shell/ast.snap b/src/wasm-lib/kcl/tests/fillet-and-shell/ast.snap new file mode 100644 index 000000000..c2beb2f0d --- /dev/null +++ b/src/wasm-lib/kcl/tests/fillet-and-shell/ast.snap @@ -0,0 +1,2622 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing fillet-and-shell.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 14, + "id": { + "end": 9, + "name": "rpizWidth", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 14, + "raw": "30", + "start": 12, + "type": "Literal", + "type": "Literal", + "value": 30.0 + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 14, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 30, + "id": { + "end": 25, + "name": "rpizLength", + "start": 15, + "type": "Identifier" + }, + "init": { + "end": 30, + "raw": "65", + "start": 28, + "type": "Literal", + "type": "Literal", + "value": 65.0 + }, + "start": 15, + "type": "VariableDeclarator" + }, + "end": 30, + "kind": "const", + "start": 15, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 49, + "id": { + "end": 45, + "name": "caseThickness", + "start": 32, + "type": "Identifier" + }, + "init": { + "end": 49, + "raw": "1", + "start": 48, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 32, + "type": "VariableDeclarator" + }, + "end": 49, + "kind": "const", + "start": 32, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 61, + "id": { + "end": 57, + "name": "border", + "start": 51, + "type": "Identifier" + }, + "init": { + "end": 61, + "raw": "4", + "start": 60, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "start": 51, + "type": "VariableDeclarator" + }, + "end": 61, + "kind": "const", + "start": 51, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 78, + "id": { + "end": 74, + "name": "screwHeight", + "start": 63, + "type": "Identifier" + }, + "init": { + "end": 78, + "raw": "4", + "start": 77, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "start": 63, + "type": "VariableDeclarator" + }, + "end": 78, + "kind": "const", + "start": 63, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 114, + "id": { + "end": 89, + "name": "caseWidth", + "start": 80, + "type": "Identifier" + }, + "init": { + "end": 114, + "left": { + "end": 101, + "name": "rpizWidth", + "start": 92, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 114, + "left": { + "end": 110, + "name": "border", + "start": 104, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "*", + "right": { + "end": 114, + "raw": "2", + "start": 113, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 104, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 92, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 80, + "type": "VariableDeclarator" + }, + "end": 114, + "kind": "const", + "start": 80, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 151, + "id": { + "end": 125, + "name": "caseLength", + "start": 115, + "type": "Identifier" + }, + "init": { + "end": 151, + "left": { + "end": 138, + "name": "rpizLength", + "start": 128, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 151, + "left": { + "end": 147, + "name": "border", + "start": 141, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "*", + "right": { + "end": 151, + "raw": "2", + "start": 150, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 141, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 128, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 115, + "type": "VariableDeclarator" + }, + "end": 151, + "kind": "const", + "start": 115, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 166, + "id": { + "end": 162, + "name": "caseHeight", + "start": 152, + "type": "Identifier" + }, + "init": { + "end": 166, + "raw": "8", + "start": 165, + "type": "Literal", + "type": "Literal", + "value": 8.0 + }, + "start": 152, + "type": "VariableDeclarator" + }, + "end": 166, + "kind": "const", + "start": 152, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 191, + "id": { + "end": 186, + "name": "widthBetweenScrews", + "start": 168, + "type": "Identifier" + }, + "init": { + "end": 191, + "raw": "23", + "start": 189, + "type": "Literal", + "type": "Literal", + "value": 23.0 + }, + "start": 168, + "type": "VariableDeclarator" + }, + "end": 191, + "kind": "const", + "start": 168, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 220, + "id": { + "end": 211, + "name": "lengthBetweenScrews", + "start": 192, + "type": "Identifier" + }, + "init": { + "end": 220, + "left": { + "end": 216, + "raw": "29", + "start": 214, + "type": "Literal", + "type": "Literal", + "value": 29.0 + }, + "operator": "*", + "right": { + "end": 220, + "raw": "2", + "start": 219, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 214, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 192, + "type": "VariableDeclarator" + }, + "end": 220, + "kind": "const", + "start": 192, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 245, + "id": { + "end": 238, + "name": "miniHdmiDistance", + "start": 222, + "type": "Identifier" + }, + "init": { + "end": 245, + "raw": "12.4", + "start": 241, + "type": "Literal", + "type": "Literal", + "value": 12.4 + }, + "start": 222, + "type": "VariableDeclarator" + }, + "end": 245, + "kind": "const", + "start": 222, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 270, + "id": { + "end": 263, + "name": "microUsb1Distance", + "start": 246, + "type": "Identifier" + }, + "init": { + "end": 270, + "raw": "41.4", + "start": 266, + "type": "Literal", + "type": "Literal", + "value": 41.4 + }, + "start": 246, + "type": "VariableDeclarator" + }, + "end": 270, + "kind": "const", + "start": 246, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 293, + "id": { + "end": 288, + "name": "microUsb2Distance", + "start": 271, + "type": "Identifier" + }, + "init": { + "end": 293, + "raw": "54", + "start": 291, + "type": "Literal", + "type": "Literal", + "value": 54.0 + }, + "start": 271, + "type": "VariableDeclarator" + }, + "end": 293, + "kind": "const", + "start": 271, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 315, + "id": { + "end": 308, + "name": "miniHdmiWidth", + "start": 295, + "type": "Identifier" + }, + "init": { + "end": 315, + "raw": "11.2", + "start": 311, + "type": "Literal", + "type": "Literal", + "value": 11.2 + }, + "start": 295, + "type": "VariableDeclarator" + }, + "end": 315, + "kind": "const", + "start": 295, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 335, + "id": { + "end": 329, + "name": "microUsbWidth", + "start": 316, + "type": "Identifier" + }, + "init": { + "end": 335, + "raw": "7.4", + "start": 332, + "type": "Literal", + "type": "Literal", + "value": 7.4 + }, + "start": 316, + "type": "VariableDeclarator" + }, + "end": 335, + "kind": "const", + "start": 316, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 356, + "id": { + "end": 352, + "name": "connectorPadding", + "start": 336, + "type": "Identifier" + }, + "init": { + "end": 356, + "raw": "4", + "start": 355, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "start": 336, + "type": "VariableDeclarator" + }, + "end": 356, + "kind": "const", + "start": 336, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 741, + "id": { + "end": 370, + "name": "miniHdmiHole", + "start": 358, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "elements": [ + { + "end": 397, + "raw": "0", + "start": 396, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 452, + "left": { + "end": 431, + "left": { + "end": 412, + "name": "border", + "start": 406, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 431, + "name": "miniHdmiDistance", + "start": 415, + "type": "Identifier", + "type": "Identifier" + }, + "start": 406, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "-", + "right": { + "end": 452, + "left": { + "end": 448, + "name": "miniHdmiWidth", + "start": 435, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 452, + "raw": "2", + "start": 451, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 435, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 406, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 460, + "start": 387, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + ], + "callee": { + "end": 386, + "name": "startSketchAt", + "start": 373, + "type": "Identifier" + }, + "end": 461, + "start": 373, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 484, + "raw": "0", + "start": 483, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 538, + "left": { + "end": 518, + "left": { + "end": 499, + "name": "border", + "start": 493, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 518, + "name": "miniHdmiDistance", + "start": 502, + "type": "Identifier", + "type": "Identifier" + }, + "start": 493, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "end": 538, + "left": { + "end": 534, + "name": "miniHdmiWidth", + "start": 521, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 538, + "raw": "2", + "start": 537, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 521, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 493, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 545, + "start": 474, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 548, + "start": 547, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 473, + "name": "lineTo", + "start": 467, + "type": "Identifier" + }, + "end": 549, + "start": 467, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 572, + "raw": "1", + "start": 571, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 626, + "left": { + "end": 606, + "left": { + "end": 587, + "name": "border", + "start": 581, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 606, + "name": "miniHdmiDistance", + "start": 590, + "type": "Identifier", + "type": "Identifier" + }, + "start": 581, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "end": 626, + "left": { + "end": 622, + "name": "miniHdmiWidth", + "start": 609, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 626, + "raw": "2", + "start": 625, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 609, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 581, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 633, + "start": 562, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 636, + "start": 635, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 561, + "name": "lineTo", + "start": 555, + "type": "Identifier" + }, + "end": 637, + "start": 555, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 660, + "raw": "1", + "start": 659, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 715, + "left": { + "end": 694, + "left": { + "end": 675, + "name": "border", + "start": 669, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 694, + "name": "miniHdmiDistance", + "start": 678, + "type": "Identifier", + "type": "Identifier" + }, + "start": 669, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "-", + "right": { + "end": 715, + "left": { + "end": 711, + "name": "miniHdmiWidth", + "start": 698, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 715, + "raw": "2", + "start": 714, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 698, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 669, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 723, + "start": 650, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 726, + "start": 725, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 649, + "name": "lineTo", + "start": 643, + "type": "Identifier" + }, + "end": 727, + "start": 643, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 740, + "start": 739, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 738, + "name": "close", + "start": 733, + "type": "Identifier" + }, + "end": 741, + "start": 733, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 741, + "start": 373, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 358, + "type": "VariableDeclarator" + }, + "end": 741, + "kind": "const", + "start": 358, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 1193, + "id": { + "end": 747, + "name": "case", + "start": 743, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 768, + "raw": "'XY'", + "start": 764, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 763, + "name": "startSketchOn", + "start": 750, + "type": "Identifier" + }, + "end": 769, + "start": 750, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 792, + "raw": "0", + "start": 791, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 795, + "raw": "0", + "start": 794, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 796, + "start": 790, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 799, + "start": 798, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 789, + "name": "startProfileAt", + "start": 775, + "type": "Identifier" + }, + "end": 800, + "start": 775, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 823, + "name": "caseWidth", + "start": 814, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 826, + "raw": "0", + "start": 825, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 827, + "start": 813, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 830, + "start": 829, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 838, + "start": 832, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "edge1" + } + ], + "callee": { + "end": 812, + "name": "lineTo", + "start": 806, + "type": "Identifier" + }, + "end": 839, + "start": 806, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 862, + "name": "caseWidth", + "start": 853, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 874, + "name": "caseLength", + "start": 864, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 875, + "start": 852, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 878, + "start": 877, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 886, + "start": 880, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "edge2" + } + ], + "callee": { + "end": 851, + "name": "lineTo", + "start": 845, + "type": "Identifier" + }, + "end": 887, + "start": 845, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 902, + "raw": "0", + "start": 901, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 914, + "name": "caseLength", + "start": 904, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 915, + "start": 900, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 918, + "start": 917, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 926, + "start": 920, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "edge3" + } + ], + "callee": { + "end": 899, + "name": "lineTo", + "start": 893, + "type": "Identifier" + }, + "end": 927, + "start": 893, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 940, + "start": 939, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 948, + "start": 942, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "edge4" + } + ], + "callee": { + "end": 938, + "name": "close", + "start": 933, + "type": "Identifier" + }, + "end": 949, + "start": 933, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 973, + "name": "caseHeight", + "start": 963, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 976, + "start": 975, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 962, + "name": "extrude", + "start": 955, + "type": "Identifier" + }, + "end": 977, + "start": 955, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1189, + "properties": [ + { + "end": 1009, + "key": { + "end": 1005, + "name": "radius", + "start": 999, + "type": "Identifier" + }, + "start": 999, + "type": "ObjectProperty", + "value": { + "end": 1009, + "raw": "1", + "start": 1008, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + }, + { + "end": 1182, + "key": { + "end": 1022, + "name": "tags", + "start": 1018, + "type": "Identifier" + }, + "start": 1018, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "arguments": [ + { + "end": 1061, + "name": "edge1", + "start": 1056, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 1055, + "name": "getNextAdjacentEdge", + "start": 1036, + "type": "Identifier" + }, + "end": 1062, + "start": 1036, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1098, + "name": "edge2", + "start": 1093, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 1092, + "name": "getNextAdjacentEdge", + "start": 1073, + "type": "Identifier" + }, + "end": 1099, + "start": 1073, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1135, + "name": "edge3", + "start": 1130, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 1129, + "name": "getNextAdjacentEdge", + "start": 1110, + "type": "Identifier" + }, + "end": 1136, + "start": 1110, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1172, + "name": "edge4", + "start": 1167, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 1166, + "name": "getNextAdjacentEdge", + "start": 1147, + "type": "Identifier" + }, + "end": 1173, + "start": 1147, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 1182, + "start": 1025, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "start": 990, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 1192, + "start": 1191, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 989, + "name": "fillet", + "start": 983, + "type": "Identifier" + }, + "end": 1193, + "start": 983, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 1193, + "start": 750, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 743, + "type": "VariableDeclarator" + }, + "end": 1193, + "kind": "const", + "start": 743, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 1442, + "id": { + "end": 1206, + "name": "m25Screw", + "start": 1198, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "declaration": { + "end": 1425, + "id": { + "end": 1230, + "name": "screw", + "start": 1225, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 1251, + "raw": "\"XY\"", + "start": 1247, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 1246, + "name": "startSketchOn", + "start": 1233, + "type": "Identifier" + }, + "end": 1252, + "start": 1233, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1277, + "raw": "0", + "start": 1276, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 1280, + "raw": "0", + "start": 1279, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 1281, + "start": 1275, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1284, + "start": 1283, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1274, + "name": "startProfileAt", + "start": 1260, + "type": "Identifier" + }, + "end": 1285, + "start": 1260, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1333, + "properties": [ + { + "end": 1317, + "key": { + "end": 1308, + "name": "center", + "start": 1302, + "type": "Identifier" + }, + "start": 1302, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 1313, + "name": "x", + "start": 1312, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 1316, + "name": "y", + "start": 1315, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 1317, + "start": 1311, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "end": 1331, + "key": { + "end": 1325, + "name": "radius", + "start": 1319, + "type": "Identifier" + }, + "start": 1319, + "type": "ObjectProperty", + "value": { + "end": 1331, + "raw": "2.5", + "start": 1328, + "type": "Literal", + "type": "Literal", + "value": 2.5 + } + } + ], + "start": 1300, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 1336, + "start": 1335, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1299, + "name": "circle", + "start": 1293, + "type": "Identifier" + }, + "end": 1337, + "start": 1293, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "arguments": [ + { + "end": 1391, + "properties": [ + { + "end": 1374, + "key": { + "end": 1365, + "name": "center", + "start": 1359, + "type": "Identifier" + }, + "start": 1359, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 1370, + "name": "x", + "start": 1369, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 1373, + "name": "y", + "start": 1372, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 1374, + "start": 1368, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "end": 1389, + "key": { + "end": 1382, + "name": "radius", + "start": 1376, + "type": "Identifier" + }, + "start": 1376, + "type": "ObjectProperty", + "value": { + "end": 1389, + "raw": "1.25", + "start": 1385, + "type": "Literal", + "type": "Literal", + "value": 1.25 + } + } + ], + "start": 1357, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 1394, + "start": 1393, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1356, + "name": "circle", + "start": 1350, + "type": "Identifier" + }, + "end": 1395, + "start": 1350, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "end": 1398, + "start": 1397, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1349, + "name": "hole", + "start": 1345, + "type": "Identifier" + }, + "end": 1399, + "start": 1345, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1421, + "name": "height", + "start": 1415, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 1424, + "start": 1423, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1414, + "name": "extrude", + "start": 1407, + "type": "Identifier" + }, + "end": 1425, + "start": 1407, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 1425, + "start": 1233, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 1225, + "type": "VariableDeclarator" + }, + "end": 1425, + "kind": "const", + "start": 1225, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "argument": { + "end": 1440, + "name": "screw", + "start": 1435, + "type": "Identifier", + "type": "Identifier" + }, + "end": 1440, + "start": 1428, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 1442, + "start": 1221 + }, + "end": 1442, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 1208, + "name": "x", + "start": 1207, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 1211, + "name": "y", + "start": 1210, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 1219, + "name": "height", + "start": 1213, + "type": "Identifier" + } + } + ], + "start": 1206, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 1198, + "type": "VariableDeclarator" + }, + "end": 1442, + "kind": "fn", + "start": 1195, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 1573, + "expression": { + "arguments": [ + { + "end": 1501, + "left": { + "end": 1475, + "left": { + "end": 1459, + "name": "border", + "start": 1453, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 1475, + "left": { + "end": 1471, + "name": "rpizWidth", + "start": 1462, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 1475, + "raw": "2", + "start": 1474, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 1462, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 1453, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "-", + "right": { + "end": 1501, + "left": { + "end": 1497, + "name": "widthBetweenScrews", + "start": 1479, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 1501, + "raw": "2", + "start": 1500, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 1479, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 1453, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 1558, + "left": { + "end": 1531, + "left": { + "end": 1514, + "left": { + "end": 1505, + "raw": "0", + "start": 1504, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "operator": "+", + "right": { + "end": 1514, + "name": "border", + "start": 1508, + "type": "Identifier", + "type": "Identifier" + }, + "start": 1504, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "end": 1531, + "left": { + "end": 1527, + "name": "rpizLength", + "start": 1517, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 1531, + "raw": "2", + "start": 1530, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 1517, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 1504, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "-", + "right": { + "end": 1558, + "left": { + "end": 1554, + "name": "lengthBetweenScrews", + "start": 1535, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 1558, + "raw": "2", + "start": 1557, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 1535, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 1504, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 1572, + "name": "screwHeight", + "start": 1561, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 1452, + "name": "m25Screw", + "start": 1444, + "type": "Identifier" + }, + "end": 1573, + "start": 1444, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 1444, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 1702, + "expression": { + "arguments": [ + { + "end": 1632, + "left": { + "end": 1606, + "left": { + "end": 1590, + "name": "border", + "start": 1584, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 1606, + "left": { + "end": 1602, + "name": "rpizWidth", + "start": 1593, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 1606, + "raw": "2", + "start": 1605, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 1593, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 1584, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "-", + "right": { + "end": 1632, + "left": { + "end": 1628, + "name": "widthBetweenScrews", + "start": 1610, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 1632, + "raw": "2", + "start": 1631, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 1610, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 1584, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 1688, + "left": { + "end": 1662, + "left": { + "end": 1645, + "left": { + "end": 1636, + "raw": "0", + "start": 1635, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "operator": "+", + "right": { + "end": 1645, + "name": "border", + "start": 1639, + "type": "Identifier", + "type": "Identifier" + }, + "start": 1635, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "end": 1662, + "left": { + "end": 1658, + "name": "rpizLength", + "start": 1648, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 1662, + "raw": "2", + "start": 1661, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 1648, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 1635, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "end": 1688, + "left": { + "end": 1684, + "name": "lengthBetweenScrews", + "start": 1665, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 1688, + "raw": "2", + "start": 1687, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 1665, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 1635, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 1701, + "name": "screwHeight", + "start": 1690, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 1583, + "name": "m25Screw", + "start": 1575, + "type": "Identifier" + }, + "end": 1702, + "start": 1575, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 1575, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 1829, + "expression": { + "arguments": [ + { + "end": 1760, + "left": { + "end": 1735, + "left": { + "end": 1719, + "name": "border", + "start": 1713, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 1735, + "left": { + "end": 1731, + "name": "rpizWidth", + "start": 1722, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 1735, + "raw": "2", + "start": 1734, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 1722, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 1713, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "end": 1760, + "left": { + "end": 1756, + "name": "widthBetweenScrews", + "start": 1738, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 1760, + "raw": "2", + "start": 1759, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 1738, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 1713, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 1815, + "left": { + "end": 1789, + "left": { + "end": 1772, + "left": { + "end": 1763, + "raw": "0", + "start": 1762, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "operator": "+", + "right": { + "end": 1772, + "name": "border", + "start": 1766, + "type": "Identifier", + "type": "Identifier" + }, + "start": 1762, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "end": 1789, + "left": { + "end": 1785, + "name": "rpizLength", + "start": 1775, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 1789, + "raw": "2", + "start": 1788, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 1775, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 1762, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "end": 1815, + "left": { + "end": 1811, + "name": "lengthBetweenScrews", + "start": 1792, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 1815, + "raw": "2", + "start": 1814, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 1792, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 1762, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 1828, + "name": "screwHeight", + "start": 1817, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 1712, + "name": "m25Screw", + "start": 1704, + "type": "Identifier" + }, + "end": 1829, + "start": 1704, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 1704, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 1958, + "expression": { + "arguments": [ + { + "end": 1887, + "left": { + "end": 1862, + "left": { + "end": 1846, + "name": "border", + "start": 1840, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 1862, + "left": { + "end": 1858, + "name": "rpizWidth", + "start": 1849, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 1862, + "raw": "2", + "start": 1861, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 1849, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 1840, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "end": 1887, + "left": { + "end": 1883, + "name": "widthBetweenScrews", + "start": 1865, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 1887, + "raw": "2", + "start": 1886, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 1865, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 1840, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 1943, + "left": { + "end": 1916, + "left": { + "end": 1899, + "left": { + "end": 1890, + "raw": "0", + "start": 1889, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "operator": "+", + "right": { + "end": 1899, + "name": "border", + "start": 1893, + "type": "Identifier", + "type": "Identifier" + }, + "start": 1889, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "end": 1916, + "left": { + "end": 1912, + "name": "rpizLength", + "start": 1902, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 1916, + "raw": "2", + "start": 1915, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 1902, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 1889, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "-", + "right": { + "end": 1943, + "left": { + "end": 1939, + "name": "lengthBetweenScrews", + "start": 1920, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 1943, + "raw": "2", + "start": 1942, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 1920, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 1889, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 1957, + "name": "screwHeight", + "start": 1946, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 1839, + "name": "m25Screw", + "start": 1831, + "type": "Identifier" + }, + "end": 1958, + "start": 1831, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 1831, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 2023, + "expression": { + "arguments": [ + { + "end": 2016, + "properties": [ + { + "end": 1985, + "key": { + "end": 1975, + "name": "faces", + "start": 1970, + "type": "Identifier" + }, + "start": 1970, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 1984, + "raw": "'end'", + "start": 1979, + "type": "Literal", + "type": "Literal", + "value": "end" + } + ], + "end": 1985, + "start": 1978, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "end": 2014, + "key": { + "end": 1998, + "name": "thickness", + "start": 1989, + "type": "Identifier" + }, + "start": 1989, + "type": "ObjectProperty", + "value": { + "end": 2014, + "name": "caseThickness", + "start": 2001, + "type": "Identifier", + "type": "Identifier" + } + } + ], + "start": 1966, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 2022, + "name": "case", + "start": 2018, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 1965, + "name": "shell", + "start": 1960, + "type": "Identifier" + }, + "end": 2023, + "start": 1960, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 1960, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 2024, + "nonCodeMeta": { + "nonCodeNodes": { + "1": [ + { + "end": 32, + "start": 30, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "2": [ + { + "end": 51, + "start": 49, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "3": [ + { + "end": 63, + "start": 61, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "4": [ + { + "end": 80, + "start": 78, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "7": [ + { + "end": 168, + "start": 166, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "9": [ + { + "end": 222, + "start": 220, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "12": [ + { + "end": 295, + "start": 293, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "15": [ + { + "end": 358, + "start": 356, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "16": [ + { + "end": 743, + "start": 741, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "17": [ + { + "end": 1195, + "start": 1193, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "18": [ + { + "end": 1444, + "start": 1442, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "19": [ + { + "end": 1575, + "start": 1573, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "20": [ + { + "end": 1704, + "start": 1702, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "21": [ + { + "end": 1831, + "start": 1829, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "22": [ + { + "end": 1960, + "start": 1958, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/fillet-and-shell/input.kcl b/src/wasm-lib/kcl/tests/fillet-and-shell/input.kcl new file mode 100644 index 000000000..aec596f7a --- /dev/null +++ b/src/wasm-lib/kcl/tests/fillet-and-shell/input.kcl @@ -0,0 +1,80 @@ +rpizWidth = 30 +rpizLength = 65 + +caseThickness = 1 + +border = 4 + +screwHeight = 4 + +caseWidth = rpizWidth + border * 2 +caseLength = rpizLength + border * 2 +caseHeight = 8 + +widthBetweenScrews = 23 +lengthBetweenScrews = 29 * 2 + +miniHdmiDistance = 12.4 +microUsb1Distance = 41.4 +microUsb2Distance = 54 + +miniHdmiWidth = 11.2 +microUsbWidth = 7.4 +connectorPadding = 4 + +miniHdmiHole = startSketchAt([ + 0, + border + miniHdmiDistance - (miniHdmiWidth / 2) + ]) + |> lineTo([ + 0, + border + miniHdmiDistance + miniHdmiWidth / 2 + ], %) + |> lineTo([ + 1, + border + miniHdmiDistance + miniHdmiWidth / 2 + ], %) + |> lineTo([ + 1, + border + miniHdmiDistance - (miniHdmiWidth / 2) + ], %) + |> close(%) + +case = startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> lineTo([caseWidth, 0], %, $edge1) + |> lineTo([caseWidth, caseLength], %, $edge2) + |> lineTo([0, caseLength], %, $edge3) + |> close(%, $edge4) + |> extrude(caseHeight, %) + |> fillet({ + radius = 1, + tags = [ + getNextAdjacentEdge(edge1), + getNextAdjacentEdge(edge2), + getNextAdjacentEdge(edge3), + getNextAdjacentEdge(edge4) + ] + }, %) + +fn m25Screw(x, y, height) { + screw = startSketchOn("XY") + |> startProfileAt([0, 0], %) + |> circle({ center = [x, y], radius = 2.5 }, %) + |> hole(circle({ center = [x, y], radius = 1.25 }, %), %) + |> extrude(height, %) + return screw +} + +m25Screw(border + rpizWidth / 2 - (widthBetweenScrews / 2), 0 + border + rpizLength / 2 - (lengthBetweenScrews / 2), screwHeight) + +m25Screw(border + rpizWidth / 2 - (widthBetweenScrews / 2), 0 + border + rpizLength / 2 + lengthBetweenScrews / 2, screwHeight) + +m25Screw(border + rpizWidth / 2 + widthBetweenScrews / 2, 0 + border + rpizLength / 2 + lengthBetweenScrews / 2, screwHeight) + +m25Screw(border + rpizWidth / 2 + widthBetweenScrews / 2, 0 + border + rpizLength / 2 - (lengthBetweenScrews / 2), screwHeight) + +shell({ + faces = ['end'], + thickness = caseThickness +}, case) diff --git a/src/wasm-lib/kcl/tests/fillet-and-shell/ops.snap b/src/wasm-lib/kcl/tests/fillet-and-shell/ops.snap new file mode 100644 index 000000000..803f891ec --- /dev/null +++ b/src/wasm-lib/kcl/tests/fillet-and-shell/ops.snap @@ -0,0 +1,464 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed fillet-and-shell.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 764, + 768, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 750, + 769, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 963, + 973, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 975, + 976, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 955, + 977, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 990, + 1189, + 0 + ] + }, + "solid": { + "sourceRange": [ + 1191, + 1192, + 0 + ] + } + }, + "name": "fillet", + "sourceRange": [ + 983, + 1193, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "type": "UserDefinedFunctionCall", + "name": "m25Screw", + "functionSourceRange": [ + 1206, + 1442, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 1444, + 1573, + 0 + ] + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 1247, + 1251, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 1233, + 1252, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "hole_sketch": { + "sourceRange": [ + 1350, + 1395, + 0 + ] + }, + "sketch": { + "sourceRange": [ + 1397, + 1398, + 0 + ] + } + }, + "name": "hole", + "sourceRange": [ + 1345, + 1399, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 1415, + 1421, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 1423, + 1424, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 1407, + 1425, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "m25Screw", + "functionSourceRange": [ + 1206, + 1442, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 1575, + 1702, + 0 + ] + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 1247, + 1251, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 1233, + 1252, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "hole_sketch": { + "sourceRange": [ + 1350, + 1395, + 0 + ] + }, + "sketch": { + "sourceRange": [ + 1397, + 1398, + 0 + ] + } + }, + "name": "hole", + "sourceRange": [ + 1345, + 1399, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 1415, + 1421, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 1423, + 1424, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 1407, + 1425, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "m25Screw", + "functionSourceRange": [ + 1206, + 1442, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 1704, + 1829, + 0 + ] + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 1247, + 1251, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 1233, + 1252, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "hole_sketch": { + "sourceRange": [ + 1350, + 1395, + 0 + ] + }, + "sketch": { + "sourceRange": [ + 1397, + 1398, + 0 + ] + } + }, + "name": "hole", + "sourceRange": [ + 1345, + 1399, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 1415, + 1421, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 1423, + 1424, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 1407, + 1425, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "m25Screw", + "functionSourceRange": [ + 1206, + 1442, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 1831, + 1958, + 0 + ] + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 1247, + 1251, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 1233, + 1252, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "hole_sketch": { + "sourceRange": [ + 1350, + 1395, + 0 + ] + }, + "sketch": { + "sourceRange": [ + 1397, + 1398, + 0 + ] + } + }, + "name": "hole", + "sourceRange": [ + 1345, + 1399, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 1415, + 1421, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 1423, + 1424, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 1407, + 1425, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 1966, + 2016, + 0 + ] + }, + "solid_set": { + "sourceRange": [ + 2018, + 2022, + 0 + ] + } + }, + "name": "shell", + "sourceRange": [ + 1960, + 2023, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/fillet-and-shell/program_memory.snap b/src/wasm-lib/kcl/tests/fillet-and-shell/program_memory.snap new file mode 100644 index 000000000..321b5878b --- /dev/null +++ b/src/wasm-lib/kcl/tests/fillet-and-shell/program_memory.snap @@ -0,0 +1,2704 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing fillet-and-shell.kcl +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "border": { + "type": "Number", + "value": 4.0, + "__meta": [ + { + "sourceRange": [ + 60, + 61, + 0 + ] + } + ] + }, + "case": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 806, + 839, + 0 + ], + "tag": { + "end": 838, + "start": 832, + "type": "TagDeclarator", + "value": "edge1" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 845, + 887, + 0 + ], + "tag": { + "end": 886, + "start": 880, + "type": "TagDeclarator", + "value": "edge2" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 893, + 927, + 0 + ], + "tag": { + "end": 926, + "start": 920, + "type": "TagDeclarator", + "value": "edge3" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 933, + 949, + 0 + ], + "tag": { + "end": 948, + "start": 942, + "type": "TagDeclarator", + "value": "edge4" + }, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 806, + 839, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 838, + "start": 832, + "type": "TagDeclarator", + "value": "edge1" + }, + "to": [ + 38.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 845, + 887, + 0 + ] + }, + "from": [ + 38.0, + 0.0 + ], + "tag": { + "end": 886, + "start": 880, + "type": "TagDeclarator", + "value": "edge2" + }, + "to": [ + 38.0, + 73.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 893, + 927, + 0 + ] + }, + "from": [ + 38.0, + 73.0 + ], + "tag": { + "end": 926, + "start": 920, + "type": "TagDeclarator", + "value": "edge3" + }, + "to": [ + 0.0, + 73.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 933, + 949, + 0 + ] + }, + "from": [ + 0.0, + 73.0 + ], + "tag": { + "end": 948, + "start": 942, + "type": "TagDeclarator", + "value": "edge4" + }, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 775, + 800, + 0 + ] + } + }, + "tags": { + "edge1": { + "type": "TagIdentifier", + "value": "edge1", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 806, + 839, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 838, + "start": 832, + "type": "TagDeclarator", + "value": "edge1" + }, + "to": [ + 38.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 806, + 839, + 0 + ], + "tag": { + "end": 838, + "start": 832, + "type": "TagDeclarator", + "value": "edge1" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 832, + 838, + 0 + ] + } + ] + }, + "edge2": { + "type": "TagIdentifier", + "value": "edge2", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 845, + 887, + 0 + ] + }, + "from": [ + 38.0, + 0.0 + ], + "tag": { + "end": 886, + "start": 880, + "type": "TagDeclarator", + "value": "edge2" + }, + "to": [ + 38.0, + 73.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 845, + 887, + 0 + ], + "tag": { + "end": 886, + "start": 880, + "type": "TagDeclarator", + "value": "edge2" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 880, + 886, + 0 + ] + } + ] + }, + "edge3": { + "type": "TagIdentifier", + "value": "edge3", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 893, + 927, + 0 + ] + }, + "from": [ + 38.0, + 73.0 + ], + "tag": { + "end": 926, + "start": 920, + "type": "TagDeclarator", + "value": "edge3" + }, + "to": [ + 0.0, + 73.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 893, + 927, + 0 + ], + "tag": { + "end": 926, + "start": 920, + "type": "TagDeclarator", + "value": "edge3" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 920, + 926, + 0 + ] + } + ] + }, + "edge4": { + "type": "TagIdentifier", + "value": "edge4", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 933, + 949, + 0 + ] + }, + "from": [ + 0.0, + 73.0 + ], + "tag": { + "end": 948, + "start": 942, + "type": "TagDeclarator", + "value": "edge4" + }, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 933, + 949, + 0 + ], + "tag": { + "end": 948, + "start": 942, + "type": "TagDeclarator", + "value": "edge4" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 942, + 948, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 775, + 800, + 0 + ] + } + ] + }, + "height": 8.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "edgeCuts": [ + { + "type": "fillet", + "id": "[uuid]", + "radius": 1.0, + "edgeId": "[uuid]", + "tag": null + }, + { + "type": "fillet", + "id": "[uuid]", + "radius": 1.0, + "edgeId": "[uuid]", + "tag": null + }, + { + "type": "fillet", + "id": "[uuid]", + "radius": 1.0, + "edgeId": "[uuid]", + "tag": null + }, + { + "type": "fillet", + "id": "[uuid]", + "radius": 1.0, + "edgeId": "[uuid]", + "tag": null + } + ], + "__meta": [ + { + "sourceRange": [ + 775, + 800, + 0 + ] + } + ] + }, + "caseHeight": { + "type": "Number", + "value": 8.0, + "__meta": [ + { + "sourceRange": [ + 165, + 166, + 0 + ] + } + ] + }, + "caseLength": { + "type": "Number", + "value": 73.0, + "__meta": [ + { + "sourceRange": [ + 28, + 30, + 0 + ] + }, + { + "sourceRange": [ + 60, + 61, + 0 + ] + }, + { + "sourceRange": [ + 150, + 151, + 0 + ] + } + ] + }, + "caseThickness": { + "type": "Number", + "value": 1.0, + "__meta": [ + { + "sourceRange": [ + 48, + 49, + 0 + ] + } + ] + }, + "caseWidth": { + "type": "Number", + "value": 38.0, + "__meta": [ + { + "sourceRange": [ + 12, + 14, + 0 + ] + }, + { + "sourceRange": [ + 60, + 61, + 0 + ] + }, + { + "sourceRange": [ + 113, + 114, + 0 + ] + } + ] + }, + "connectorPadding": { + "type": "Number", + "value": 4.0, + "__meta": [ + { + "sourceRange": [ + 355, + 356, + 0 + ] + } + ] + }, + "edge1": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "edge1", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 806, + 839, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 838, + "start": 832, + "type": "TagDeclarator", + "value": "edge1" + }, + "to": [ + 38.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 806, + 839, + 0 + ], + "tag": { + "end": 838, + "start": 832, + "type": "TagDeclarator", + "value": "edge1" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 832, + 838, + 0 + ] + } + ] + }, + "edge2": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "edge2", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 845, + 887, + 0 + ] + }, + "from": [ + 38.0, + 0.0 + ], + "tag": { + "end": 886, + "start": 880, + "type": "TagDeclarator", + "value": "edge2" + }, + "to": [ + 38.0, + 73.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 845, + 887, + 0 + ], + "tag": { + "end": 886, + "start": 880, + "type": "TagDeclarator", + "value": "edge2" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 880, + 886, + 0 + ] + } + ] + }, + "edge3": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "edge3", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 893, + 927, + 0 + ] + }, + "from": [ + 38.0, + 73.0 + ], + "tag": { + "end": 926, + "start": 920, + "type": "TagDeclarator", + "value": "edge3" + }, + "to": [ + 0.0, + 73.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 893, + 927, + 0 + ], + "tag": { + "end": 926, + "start": 920, + "type": "TagDeclarator", + "value": "edge3" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 920, + 926, + 0 + ] + } + ] + }, + "edge4": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "edge4", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 933, + 949, + 0 + ] + }, + "from": [ + 0.0, + 73.0 + ], + "tag": { + "end": 948, + "start": 942, + "type": "TagDeclarator", + "value": "edge4" + }, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 933, + 949, + 0 + ], + "tag": { + "end": 948, + "start": 942, + "type": "TagDeclarator", + "value": "edge4" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 942, + 948, + 0 + ] + } + ] + }, + "lengthBetweenScrews": { + "type": "Number", + "value": 58.0, + "__meta": [ + { + "sourceRange": [ + 214, + 216, + 0 + ] + }, + { + "sourceRange": [ + 219, + 220, + 0 + ] + } + ] + }, + "m25Screw": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "declaration": { + "end": 1425, + "id": { + "end": 1230, + "name": "screw", + "start": 1225, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 1251, + "raw": "\"XY\"", + "start": 1247, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 1246, + "name": "startSketchOn", + "start": 1233, + "type": "Identifier" + }, + "end": 1252, + "start": 1233, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1277, + "raw": "0", + "start": 1276, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 1280, + "raw": "0", + "start": 1279, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 1281, + "start": 1275, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1284, + "start": 1283, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1274, + "name": "startProfileAt", + "start": 1260, + "type": "Identifier" + }, + "end": 1285, + "start": 1260, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1333, + "properties": [ + { + "end": 1317, + "key": { + "end": 1308, + "name": "center", + "start": 1302, + "type": "Identifier" + }, + "start": 1302, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 1313, + "name": "x", + "start": 1312, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 1316, + "name": "y", + "start": 1315, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 1317, + "start": 1311, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "end": 1331, + "key": { + "end": 1325, + "name": "radius", + "start": 1319, + "type": "Identifier" + }, + "start": 1319, + "type": "ObjectProperty", + "value": { + "end": 1331, + "raw": "2.5", + "start": 1328, + "type": "Literal", + "type": "Literal", + "value": 2.5 + } + } + ], + "start": 1300, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 1336, + "start": 1335, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1299, + "name": "circle", + "start": 1293, + "type": "Identifier" + }, + "end": 1337, + "start": 1293, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "arguments": [ + { + "end": 1391, + "properties": [ + { + "end": 1374, + "key": { + "end": 1365, + "name": "center", + "start": 1359, + "type": "Identifier" + }, + "start": 1359, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 1370, + "name": "x", + "start": 1369, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 1373, + "name": "y", + "start": 1372, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 1374, + "start": 1368, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "end": 1389, + "key": { + "end": 1382, + "name": "radius", + "start": 1376, + "type": "Identifier" + }, + "start": 1376, + "type": "ObjectProperty", + "value": { + "end": 1389, + "raw": "1.25", + "start": 1385, + "type": "Literal", + "type": "Literal", + "value": 1.25 + } + } + ], + "start": 1357, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 1394, + "start": 1393, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1356, + "name": "circle", + "start": 1350, + "type": "Identifier" + }, + "end": 1395, + "start": 1350, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "end": 1398, + "start": 1397, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1349, + "name": "hole", + "start": 1345, + "type": "Identifier" + }, + "end": 1399, + "start": 1345, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1421, + "name": "height", + "start": 1415, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 1424, + "start": 1423, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1414, + "name": "extrude", + "start": 1407, + "type": "Identifier" + }, + "end": 1425, + "start": 1407, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 1425, + "start": 1233, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 1225, + "type": "VariableDeclarator" + }, + "end": 1425, + "kind": "const", + "start": 1225, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "argument": { + "end": 1440, + "name": "screw", + "start": 1435, + "type": "Identifier", + "type": "Identifier" + }, + "end": 1440, + "start": 1428, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 1442, + "start": 1221 + }, + "end": 1442, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 1208, + "name": "x", + "start": 1207, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 1211, + "name": "y", + "start": 1210, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 1219, + "name": "height", + "start": 1213, + "type": "Identifier" + } + } + ], + "start": 1206, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "border": { + "type": "Number", + "value": 4.0, + "__meta": [ + { + "sourceRange": [ + 60, + 61, + 0 + ] + } + ] + }, + "case": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 806, + 839, + 0 + ], + "tag": { + "end": 838, + "start": 832, + "type": "TagDeclarator", + "value": "edge1" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 845, + 887, + 0 + ], + "tag": { + "end": 886, + "start": 880, + "type": "TagDeclarator", + "value": "edge2" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 893, + 927, + 0 + ], + "tag": { + "end": 926, + "start": 920, + "type": "TagDeclarator", + "value": "edge3" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 933, + 949, + 0 + ], + "tag": { + "end": 948, + "start": 942, + "type": "TagDeclarator", + "value": "edge4" + }, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 806, + 839, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 838, + "start": 832, + "type": "TagDeclarator", + "value": "edge1" + }, + "to": [ + 38.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 845, + 887, + 0 + ] + }, + "from": [ + 38.0, + 0.0 + ], + "tag": { + "end": 886, + "start": 880, + "type": "TagDeclarator", + "value": "edge2" + }, + "to": [ + 38.0, + 73.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 893, + 927, + 0 + ] + }, + "from": [ + 38.0, + 73.0 + ], + "tag": { + "end": 926, + "start": 920, + "type": "TagDeclarator", + "value": "edge3" + }, + "to": [ + 0.0, + 73.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 933, + 949, + 0 + ] + }, + "from": [ + 0.0, + 73.0 + ], + "tag": { + "end": 948, + "start": 942, + "type": "TagDeclarator", + "value": "edge4" + }, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 775, + 800, + 0 + ] + } + }, + "tags": { + "edge1": { + "type": "TagIdentifier", + "value": "edge1", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 806, + 839, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 838, + "start": 832, + "type": "TagDeclarator", + "value": "edge1" + }, + "to": [ + 38.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 806, + 839, + 0 + ], + "tag": { + "end": 838, + "start": 832, + "type": "TagDeclarator", + "value": "edge1" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 832, + 838, + 0 + ] + } + ] + }, + "edge2": { + "type": "TagIdentifier", + "value": "edge2", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 845, + 887, + 0 + ] + }, + "from": [ + 38.0, + 0.0 + ], + "tag": { + "end": 886, + "start": 880, + "type": "TagDeclarator", + "value": "edge2" + }, + "to": [ + 38.0, + 73.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 845, + 887, + 0 + ], + "tag": { + "end": 886, + "start": 880, + "type": "TagDeclarator", + "value": "edge2" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 880, + 886, + 0 + ] + } + ] + }, + "edge3": { + "type": "TagIdentifier", + "value": "edge3", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 893, + 927, + 0 + ] + }, + "from": [ + 38.0, + 73.0 + ], + "tag": { + "end": 926, + "start": 920, + "type": "TagDeclarator", + "value": "edge3" + }, + "to": [ + 0.0, + 73.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 893, + 927, + 0 + ], + "tag": { + "end": 926, + "start": 920, + "type": "TagDeclarator", + "value": "edge3" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 920, + 926, + 0 + ] + } + ] + }, + "edge4": { + "type": "TagIdentifier", + "value": "edge4", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 933, + 949, + 0 + ] + }, + "from": [ + 0.0, + 73.0 + ], + "tag": { + "end": 948, + "start": 942, + "type": "TagDeclarator", + "value": "edge4" + }, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 933, + 949, + 0 + ], + "tag": { + "end": 948, + "start": 942, + "type": "TagDeclarator", + "value": "edge4" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 942, + 948, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 775, + 800, + 0 + ] + } + ] + }, + "height": 8.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "edgeCuts": [ + { + "type": "fillet", + "id": "[uuid]", + "radius": 1.0, + "edgeId": "[uuid]", + "tag": null + }, + { + "type": "fillet", + "id": "[uuid]", + "radius": 1.0, + "edgeId": "[uuid]", + "tag": null + }, + { + "type": "fillet", + "id": "[uuid]", + "radius": 1.0, + "edgeId": "[uuid]", + "tag": null + }, + { + "type": "fillet", + "id": "[uuid]", + "radius": 1.0, + "edgeId": "[uuid]", + "tag": null + } + ], + "__meta": [ + { + "sourceRange": [ + 775, + 800, + 0 + ] + } + ] + }, + "caseHeight": { + "type": "Number", + "value": 8.0, + "__meta": [ + { + "sourceRange": [ + 165, + 166, + 0 + ] + } + ] + }, + "caseLength": { + "type": "Number", + "value": 73.0, + "__meta": [ + { + "sourceRange": [ + 28, + 30, + 0 + ] + }, + { + "sourceRange": [ + 60, + 61, + 0 + ] + }, + { + "sourceRange": [ + 150, + 151, + 0 + ] + } + ] + }, + "caseThickness": { + "type": "Number", + "value": 1.0, + "__meta": [ + { + "sourceRange": [ + 48, + 49, + 0 + ] + } + ] + }, + "caseWidth": { + "type": "Number", + "value": 38.0, + "__meta": [ + { + "sourceRange": [ + 12, + 14, + 0 + ] + }, + { + "sourceRange": [ + 60, + 61, + 0 + ] + }, + { + "sourceRange": [ + 113, + 114, + 0 + ] + } + ] + }, + "connectorPadding": { + "type": "Number", + "value": 4.0, + "__meta": [ + { + "sourceRange": [ + 355, + 356, + 0 + ] + } + ] + }, + "edge1": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "edge1", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 806, + 839, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 838, + "start": 832, + "type": "TagDeclarator", + "value": "edge1" + }, + "to": [ + 38.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 806, + 839, + 0 + ], + "tag": { + "end": 838, + "start": 832, + "type": "TagDeclarator", + "value": "edge1" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 832, + 838, + 0 + ] + } + ] + }, + "edge2": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "edge2", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 845, + 887, + 0 + ] + }, + "from": [ + 38.0, + 0.0 + ], + "tag": { + "end": 886, + "start": 880, + "type": "TagDeclarator", + "value": "edge2" + }, + "to": [ + 38.0, + 73.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 845, + 887, + 0 + ], + "tag": { + "end": 886, + "start": 880, + "type": "TagDeclarator", + "value": "edge2" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 880, + 886, + 0 + ] + } + ] + }, + "edge3": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "edge3", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 893, + 927, + 0 + ] + }, + "from": [ + 38.0, + 73.0 + ], + "tag": { + "end": 926, + "start": 920, + "type": "TagDeclarator", + "value": "edge3" + }, + "to": [ + 0.0, + 73.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 893, + 927, + 0 + ], + "tag": { + "end": 926, + "start": 920, + "type": "TagDeclarator", + "value": "edge3" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 920, + 926, + 0 + ] + } + ] + }, + "edge4": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "edge4", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 933, + 949, + 0 + ] + }, + "from": [ + 0.0, + 73.0 + ], + "tag": { + "end": 948, + "start": 942, + "type": "TagDeclarator", + "value": "edge4" + }, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 933, + 949, + 0 + ], + "tag": { + "end": 948, + "start": 942, + "type": "TagDeclarator", + "value": "edge4" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 942, + 948, + 0 + ] + } + ] + }, + "lengthBetweenScrews": { + "type": "Number", + "value": 58.0, + "__meta": [ + { + "sourceRange": [ + 214, + 216, + 0 + ] + }, + { + "sourceRange": [ + 219, + 220, + 0 + ] + } + ] + }, + "microUsb1Distance": { + "type": "Number", + "value": 41.4, + "__meta": [ + { + "sourceRange": [ + 266, + 270, + 0 + ] + } + ] + }, + "microUsb2Distance": { + "type": "Number", + "value": 54.0, + "__meta": [ + { + "sourceRange": [ + 291, + 293, + 0 + ] + } + ] + }, + "microUsbWidth": { + "type": "Number", + "value": 7.4, + "__meta": [ + { + "sourceRange": [ + 332, + 335, + 0 + ] + } + ] + }, + "miniHdmiDistance": { + "type": "Number", + "value": 12.4, + "__meta": [ + { + "sourceRange": [ + 241, + 245, + 0 + ] + } + ] + }, + "miniHdmiHole": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 467, + 549, + 0 + ] + }, + "from": [ + 0.0, + 10.8 + ], + "tag": null, + "to": [ + 0.0, + 22.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 555, + 637, + 0 + ] + }, + "from": [ + 0.0, + 22.0 + ], + "tag": null, + "to": [ + 1.0, + 22.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 643, + 727, + 0 + ] + }, + "from": [ + 1.0, + 22.0 + ], + "tag": null, + "to": [ + 1.0, + 10.8 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 733, + 741, + 0 + ] + }, + "from": [ + 1.0, + 10.8 + ], + "tag": null, + "to": [ + 0.0, + 10.8 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 10.799999999999999 + ], + "to": [ + 0.0, + 10.799999999999999 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 373, + 461, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 373, + 461, + 0 + ] + } + ] + } + }, + "miniHdmiWidth": { + "type": "Number", + "value": 11.2, + "__meta": [ + { + "sourceRange": [ + 311, + 315, + 0 + ] + } + ] + }, + "rpizLength": { + "type": "Number", + "value": 65.0, + "__meta": [ + { + "sourceRange": [ + 28, + 30, + 0 + ] + } + ] + }, + "rpizWidth": { + "type": "Number", + "value": 30.0, + "__meta": [ + { + "sourceRange": [ + 12, + 14, + 0 + ] + } + ] + }, + "screwHeight": { + "type": "Number", + "value": 4.0, + "__meta": [ + { + "sourceRange": [ + 77, + 78, + 0 + ] + } + ] + }, + "widthBetweenScrews": { + "type": "Number", + "value": 23.0, + "__meta": [ + { + "sourceRange": [ + 189, + 191, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 1206, + 1442, + 0 + ] + } + ] + }, + "microUsb1Distance": { + "type": "Number", + "value": 41.4, + "__meta": [ + { + "sourceRange": [ + 266, + 270, + 0 + ] + } + ] + }, + "microUsb2Distance": { + "type": "Number", + "value": 54.0, + "__meta": [ + { + "sourceRange": [ + 291, + 293, + 0 + ] + } + ] + }, + "microUsbWidth": { + "type": "Number", + "value": 7.4, + "__meta": [ + { + "sourceRange": [ + 332, + 335, + 0 + ] + } + ] + }, + "miniHdmiDistance": { + "type": "Number", + "value": 12.4, + "__meta": [ + { + "sourceRange": [ + 241, + 245, + 0 + ] + } + ] + }, + "miniHdmiHole": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 467, + 549, + 0 + ] + }, + "from": [ + 0.0, + 10.8 + ], + "tag": null, + "to": [ + 0.0, + 22.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 555, + 637, + 0 + ] + }, + "from": [ + 0.0, + 22.0 + ], + "tag": null, + "to": [ + 1.0, + 22.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 643, + 727, + 0 + ] + }, + "from": [ + 1.0, + 22.0 + ], + "tag": null, + "to": [ + 1.0, + 10.8 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 733, + 741, + 0 + ] + }, + "from": [ + 1.0, + 10.8 + ], + "tag": null, + "to": [ + 0.0, + 10.8 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 10.799999999999999 + ], + "to": [ + 0.0, + 10.799999999999999 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 373, + 461, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 373, + 461, + 0 + ] + } + ] + } + }, + "miniHdmiWidth": { + "type": "Number", + "value": 11.2, + "__meta": [ + { + "sourceRange": [ + 311, + 315, + 0 + ] + } + ] + }, + "rpizLength": { + "type": "Number", + "value": 65.0, + "__meta": [ + { + "sourceRange": [ + 28, + 30, + 0 + ] + } + ] + }, + "rpizWidth": { + "type": "Number", + "value": 30.0, + "__meta": [ + { + "sourceRange": [ + 12, + 14, + 0 + ] + } + ] + }, + "screwHeight": { + "type": "Number", + "value": 4.0, + "__meta": [ + { + "sourceRange": [ + 77, + 78, + 0 + ] + } + ] + }, + "widthBetweenScrews": { + "type": "Number", + "value": 23.0, + "__meta": [ + { + "sourceRange": [ + 189, + 191, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/fillet-and-shell/rendered_model.png b/src/wasm-lib/kcl/tests/fillet-and-shell/rendered_model.png new file mode 100644 index 000000000..4675971c2 Binary files /dev/null and b/src/wasm-lib/kcl/tests/fillet-and-shell/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/function_sketch/ast.snap b/src/wasm-lib/kcl/tests/function_sketch/ast.snap new file mode 100644 index 000000000..0ac3fa787 --- /dev/null +++ b/src/wasm-lib/kcl/tests/function_sketch/ast.snap @@ -0,0 +1,445 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing function_sketch.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 205, + "id": { + "end": 6, + "name": "box", + "start": 3, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "declaration": { + "end": 187, + "id": { + "end": 25, + "name": "myBox", + "start": 20, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 46, + "raw": "'XY'", + "start": 42, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 41, + "name": "startSketchOn", + "start": 28, + "type": "Identifier" + }, + "end": 47, + "start": 28, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 72, + "raw": "0", + "start": 71, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 75, + "raw": "0", + "start": 74, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 76, + "start": 70, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 79, + "start": 78, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 69, + "name": "startProfileAt", + "start": 55, + "type": "Identifier" + }, + "end": 80, + "start": 55, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 95, + "raw": "0", + "start": 94, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 98, + "name": "l", + "start": 97, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 99, + "start": 93, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 102, + "start": 101, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 92, + "name": "line", + "start": 88, + "type": "Identifier" + }, + "end": 103, + "start": 88, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 118, + "name": "w", + "start": 117, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 121, + "raw": "0", + "start": 120, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 122, + "start": 116, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 125, + "start": 124, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 115, + "name": "line", + "start": 111, + "type": "Identifier" + }, + "end": 126, + "start": 111, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 141, + "raw": "0", + "start": 140, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 145, + "name": "l", + "start": 144, + "type": "Identifier", + "type": "Identifier" + }, + "end": 145, + "operator": "-", + "start": 143, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 146, + "start": 139, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 149, + "start": 148, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 138, + "name": "line", + "start": 134, + "type": "Identifier" + }, + "end": 150, + "start": 134, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 165, + "start": 164, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 163, + "name": "close", + "start": 158, + "type": "Identifier" + }, + "end": 166, + "start": 158, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 183, + "name": "h", + "start": 182, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 186, + "start": 185, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 181, + "name": "extrude", + "start": 174, + "type": "Identifier" + }, + "end": 187, + "start": 174, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 187, + "start": 28, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 20, + "type": "VariableDeclarator" + }, + "end": 187, + "kind": "const", + "start": 20, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "argument": { + "end": 203, + "name": "myBox", + "start": 198, + "type": "Identifier", + "type": "Identifier" + }, + "end": 203, + "start": 191, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 205, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 191, + "start": 187, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 16 + }, + "end": 205, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 8, + "name": "h", + "start": 7, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 11, + "name": "l", + "start": 10, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 14, + "name": "w", + "start": 13, + "type": "Identifier" + } + } + ], + "start": 6, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" + }, + "end": 205, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 228, + "id": { + "end": 212, + "name": "fnBox", + "start": 207, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 220, + "raw": "3", + "start": 219, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + { + "end": 223, + "raw": "6", + "start": 222, + "type": "Literal", + "type": "Literal", + "value": 6.0 + }, + { + "end": 227, + "raw": "10", + "start": 225, + "type": "Literal", + "type": "Literal", + "value": 10.0 + } + ], + "callee": { + "end": 218, + "name": "box", + "start": 215, + "type": "Identifier" + }, + "end": 228, + "start": 215, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 207, + "type": "VariableDeclarator" + }, + "end": 228, + "kind": "const", + "start": 207, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 229, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 207, + "start": 205, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/function_sketch/input.kcl b/src/wasm-lib/kcl/tests/function_sketch/input.kcl new file mode 100644 index 000000000..946e7fee0 --- /dev/null +++ b/src/wasm-lib/kcl/tests/function_sketch/input.kcl @@ -0,0 +1,13 @@ +fn box(h, l, w) { + myBox = startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line([0, l], %) + |> line([w, 0], %) + |> line([0, -l], %) + |> close(%) + |> extrude(h, %) + + return myBox +} + +fnBox = box(3, 6, 10) diff --git a/src/wasm-lib/kcl/tests/function_sketch/ops.snap b/src/wasm-lib/kcl/tests/function_sketch/ops.snap new file mode 100644 index 000000000..b6a1ec80f --- /dev/null +++ b/src/wasm-lib/kcl/tests/function_sketch/ops.snap @@ -0,0 +1,71 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed function_sketch.kcl +snapshot_kind: text +--- +[ + { + "type": "UserDefinedFunctionCall", + "name": "box", + "functionSourceRange": [ + 6, + 205, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 215, + 228, + 0 + ] + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 42, + 46, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 28, + 47, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 182, + 183, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 185, + 186, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 174, + 187, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "type": "UserDefinedFunctionReturn" + } +] diff --git a/src/wasm-lib/kcl/tests/function_sketch/program_memory.snap b/src/wasm-lib/kcl/tests/function_sketch/program_memory.snap new file mode 100644 index 000000000..25b2c46eb --- /dev/null +++ b/src/wasm-lib/kcl/tests/function_sketch/program_memory.snap @@ -0,0 +1,624 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing function_sketch.kcl +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "box": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "declaration": { + "end": 187, + "id": { + "end": 25, + "name": "myBox", + "start": 20, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 46, + "raw": "'XY'", + "start": 42, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 41, + "name": "startSketchOn", + "start": 28, + "type": "Identifier" + }, + "end": 47, + "start": 28, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 72, + "raw": "0", + "start": 71, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 75, + "raw": "0", + "start": 74, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 76, + "start": 70, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 79, + "start": 78, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 69, + "name": "startProfileAt", + "start": 55, + "type": "Identifier" + }, + "end": 80, + "start": 55, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 95, + "raw": "0", + "start": 94, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 98, + "name": "l", + "start": 97, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 99, + "start": 93, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 102, + "start": 101, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 92, + "name": "line", + "start": 88, + "type": "Identifier" + }, + "end": 103, + "start": 88, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 118, + "name": "w", + "start": 117, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 121, + "raw": "0", + "start": 120, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 122, + "start": 116, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 125, + "start": 124, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 115, + "name": "line", + "start": 111, + "type": "Identifier" + }, + "end": 126, + "start": 111, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 141, + "raw": "0", + "start": 140, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 145, + "name": "l", + "start": 144, + "type": "Identifier", + "type": "Identifier" + }, + "end": 145, + "operator": "-", + "start": 143, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 146, + "start": 139, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 149, + "start": 148, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 138, + "name": "line", + "start": 134, + "type": "Identifier" + }, + "end": 150, + "start": 134, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 165, + "start": 164, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 163, + "name": "close", + "start": 158, + "type": "Identifier" + }, + "end": 166, + "start": 158, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 183, + "name": "h", + "start": 182, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 186, + "start": 185, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 181, + "name": "extrude", + "start": 174, + "type": "Identifier" + }, + "end": 187, + "start": 174, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 187, + "start": 28, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 20, + "type": "VariableDeclarator" + }, + "end": 187, + "kind": "const", + "start": 20, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "argument": { + "end": 203, + "name": "myBox", + "start": 198, + "type": "Identifier", + "type": "Identifier" + }, + "end": 203, + "start": 191, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 205, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 191, + "start": 187, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 16 + }, + "end": 205, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 8, + "name": "h", + "start": 7, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 11, + "name": "l", + "start": 10, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 14, + "name": "w", + "start": 13, + "type": "Identifier" + } + } + ], + "start": 6, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 6, + 205, + 0 + ] + } + ] + }, + "fnBox": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 88, + 103, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 111, + 126, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 134, + 150, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 158, + 166, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 88, + 103, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 6.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 111, + 126, + 0 + ] + }, + "from": [ + 0.0, + 6.0 + ], + "tag": null, + "to": [ + 10.0, + 6.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 134, + 150, + 0 + ] + }, + "from": [ + 10.0, + 6.0 + ], + "tag": null, + "to": [ + 10.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 158, + 166, + 0 + ] + }, + "from": [ + 10.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 55, + 80, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 55, + 80, + 0 + ] + } + ] + }, + "height": 3.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 55, + 80, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/function_sketch/rendered_model.png b/src/wasm-lib/kcl/tests/function_sketch/rendered_model.png new file mode 100644 index 000000000..4c8ccaa36 Binary files /dev/null and b/src/wasm-lib/kcl/tests/function_sketch/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/function_sketch_with_position/ast.snap b/src/wasm-lib/kcl/tests/function_sketch_with_position/ast.snap new file mode 100644 index 000000000..877fc13f4 --- /dev/null +++ b/src/wasm-lib/kcl/tests/function_sketch_with_position/ast.snap @@ -0,0 +1,461 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing function_sketch_with_position.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 203, + "id": { + "end": 6, + "name": "box", + "start": 3, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "declaration": { + "end": 185, + "id": { + "end": 28, + "name": "myBox", + "start": 23, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 49, + "raw": "'XY'", + "start": 45, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 44, + "name": "startSketchOn", + "start": 31, + "type": "Identifier" + }, + "end": 50, + "start": 31, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 74, + "name": "p", + "start": 73, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 77, + "start": 76, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 72, + "name": "startProfileAt", + "start": 58, + "type": "Identifier" + }, + "end": 78, + "start": 58, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 93, + "raw": "0", + "start": 92, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 96, + "name": "l", + "start": 95, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 97, + "start": 91, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 100, + "start": 99, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 90, + "name": "line", + "start": 86, + "type": "Identifier" + }, + "end": 101, + "start": 86, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 116, + "name": "w", + "start": 115, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 119, + "raw": "0", + "start": 118, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 120, + "start": 114, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 123, + "start": 122, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 113, + "name": "line", + "start": 109, + "type": "Identifier" + }, + "end": 124, + "start": 109, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 139, + "raw": "0", + "start": 138, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 143, + "name": "l", + "start": 142, + "type": "Identifier", + "type": "Identifier" + }, + "end": 143, + "operator": "-", + "start": 141, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 144, + "start": 137, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 147, + "start": 146, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 136, + "name": "line", + "start": 132, + "type": "Identifier" + }, + "end": 148, + "start": 132, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 163, + "start": 162, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 161, + "name": "close", + "start": 156, + "type": "Identifier" + }, + "end": 164, + "start": 156, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 181, + "name": "h", + "start": 180, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 184, + "start": 183, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 179, + "name": "extrude", + "start": 172, + "type": "Identifier" + }, + "end": 185, + "start": 172, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 185, + "start": 31, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 23, + "type": "VariableDeclarator" + }, + "end": 185, + "kind": "const", + "start": 23, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "argument": { + "end": 201, + "name": "myBox", + "start": 196, + "type": "Identifier", + "type": "Identifier" + }, + "end": 201, + "start": 189, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 203, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 189, + "start": 185, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 19 + }, + "end": 203, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 8, + "name": "p", + "start": 7, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 11, + "name": "h", + "start": 10, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 14, + "name": "l", + "start": 13, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 17, + "name": "w", + "start": 16, + "type": "Identifier" + } + } + ], + "start": 6, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" + }, + "end": 203, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 234, + "id": { + "end": 210, + "name": "thing", + "start": 205, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "elements": [ + { + "end": 219, + "raw": "0", + "start": 218, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 222, + "raw": "0", + "start": 221, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 223, + "start": 217, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 226, + "raw": "3", + "start": 225, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + { + "end": 229, + "raw": "6", + "start": 228, + "type": "Literal", + "type": "Literal", + "value": 6.0 + }, + { + "end": 233, + "raw": "10", + "start": 231, + "type": "Literal", + "type": "Literal", + "value": 10.0 + } + ], + "callee": { + "end": 216, + "name": "box", + "start": 213, + "type": "Identifier" + }, + "end": 234, + "start": 213, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 205, + "type": "VariableDeclarator" + }, + "end": 234, + "kind": "const", + "start": 205, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 235, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 205, + "start": 203, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/function_sketch_with_position/input.kcl b/src/wasm-lib/kcl/tests/function_sketch_with_position/input.kcl new file mode 100644 index 000000000..58451b733 --- /dev/null +++ b/src/wasm-lib/kcl/tests/function_sketch_with_position/input.kcl @@ -0,0 +1,13 @@ +fn box(p, h, l, w) { + myBox = startSketchOn('XY') + |> startProfileAt(p, %) + |> line([0, l], %) + |> line([w, 0], %) + |> line([0, -l], %) + |> close(%) + |> extrude(h, %) + + return myBox +} + +thing = box([0, 0], 3, 6, 10) diff --git a/src/wasm-lib/kcl/tests/function_sketch_with_position/ops.snap b/src/wasm-lib/kcl/tests/function_sketch_with_position/ops.snap new file mode 100644 index 000000000..34d78971c --- /dev/null +++ b/src/wasm-lib/kcl/tests/function_sketch_with_position/ops.snap @@ -0,0 +1,71 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed function_sketch_with_position.kcl +snapshot_kind: text +--- +[ + { + "type": "UserDefinedFunctionCall", + "name": "box", + "functionSourceRange": [ + 6, + 203, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 213, + 234, + 0 + ] + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 45, + 49, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 31, + 50, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 180, + 181, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 183, + 184, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 172, + 185, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "type": "UserDefinedFunctionReturn" + } +] diff --git a/src/wasm-lib/kcl/tests/function_sketch_with_position/program_memory.snap b/src/wasm-lib/kcl/tests/function_sketch_with_position/program_memory.snap new file mode 100644 index 000000000..83e326dfd --- /dev/null +++ b/src/wasm-lib/kcl/tests/function_sketch_with_position/program_memory.snap @@ -0,0 +1,616 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing function_sketch_with_position.kcl +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "box": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "declaration": { + "end": 185, + "id": { + "end": 28, + "name": "myBox", + "start": 23, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 49, + "raw": "'XY'", + "start": 45, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 44, + "name": "startSketchOn", + "start": 31, + "type": "Identifier" + }, + "end": 50, + "start": 31, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 74, + "name": "p", + "start": 73, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 77, + "start": 76, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 72, + "name": "startProfileAt", + "start": 58, + "type": "Identifier" + }, + "end": 78, + "start": 58, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 93, + "raw": "0", + "start": 92, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 96, + "name": "l", + "start": 95, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 97, + "start": 91, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 100, + "start": 99, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 90, + "name": "line", + "start": 86, + "type": "Identifier" + }, + "end": 101, + "start": 86, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 116, + "name": "w", + "start": 115, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 119, + "raw": "0", + "start": 118, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 120, + "start": 114, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 123, + "start": 122, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 113, + "name": "line", + "start": 109, + "type": "Identifier" + }, + "end": 124, + "start": 109, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 139, + "raw": "0", + "start": 138, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 143, + "name": "l", + "start": 142, + "type": "Identifier", + "type": "Identifier" + }, + "end": 143, + "operator": "-", + "start": 141, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 144, + "start": 137, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 147, + "start": 146, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 136, + "name": "line", + "start": 132, + "type": "Identifier" + }, + "end": 148, + "start": 132, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 163, + "start": 162, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 161, + "name": "close", + "start": 156, + "type": "Identifier" + }, + "end": 164, + "start": 156, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 181, + "name": "h", + "start": 180, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 184, + "start": 183, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 179, + "name": "extrude", + "start": 172, + "type": "Identifier" + }, + "end": 185, + "start": 172, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 185, + "start": 31, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 23, + "type": "VariableDeclarator" + }, + "end": 185, + "kind": "const", + "start": 23, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "argument": { + "end": 201, + "name": "myBox", + "start": 196, + "type": "Identifier", + "type": "Identifier" + }, + "end": 201, + "start": 189, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 203, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 189, + "start": 185, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 19 + }, + "end": 203, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 8, + "name": "p", + "start": 7, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 11, + "name": "h", + "start": 10, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 14, + "name": "l", + "start": 13, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 17, + "name": "w", + "start": 16, + "type": "Identifier" + } + } + ], + "start": 6, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 6, + 203, + 0 + ] + } + ] + }, + "thing": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 86, + 101, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 109, + 124, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 132, + 148, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 156, + 164, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 86, + 101, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 6.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 109, + 124, + 0 + ] + }, + "from": [ + 0.0, + 6.0 + ], + "tag": null, + "to": [ + 10.0, + 6.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 132, + 148, + 0 + ] + }, + "from": [ + 10.0, + 6.0 + ], + "tag": null, + "to": [ + 10.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 156, + 164, + 0 + ] + }, + "from": [ + 10.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 58, + 78, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 58, + 78, + 0 + ] + } + ] + }, + "height": 3.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 58, + 78, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/function_sketch_with_position/rendered_model.png b/src/wasm-lib/kcl/tests/function_sketch_with_position/rendered_model.png new file mode 100644 index 000000000..4c8ccaa36 Binary files /dev/null and b/src/wasm-lib/kcl/tests/function_sketch_with_position/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/helix_ccw/ast.snap b/src/wasm-lib/kcl/tests/helix_ccw/ast.snap new file mode 100644 index 000000000..5a71ddf43 --- /dev/null +++ b/src/wasm-lib/kcl/tests/helix_ccw/ast.snap @@ -0,0 +1,255 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing helix_ccw.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 188, + "id": { + "end": 7, + "name": "part001", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 28, + "raw": "'XY'", + "start": 24, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 23, + "name": "startSketchOn", + "start": 10, + "type": "Identifier" + }, + "end": 29, + "start": 10, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 74, + "properties": [ + { + "end": 59, + "key": { + "end": 50, + "name": "center", + "start": 44, + "type": "Identifier" + }, + "start": 44, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 55, + "raw": "5", + "start": 54, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + { + "end": 58, + "raw": "5", + "start": 57, + "type": "Literal", + "type": "Literal", + "value": 5.0 + } + ], + "end": 59, + "start": 53, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "end": 72, + "key": { + "end": 67, + "name": "radius", + "start": 61, + "type": "Identifier" + }, + "start": 61, + "type": "ObjectProperty", + "value": { + "end": 72, + "raw": "10", + "start": 70, + "type": "Literal", + "type": "Literal", + "value": 10.0 + } + } + ], + "start": 42, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 77, + "start": 76, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 41, + "name": "circle", + "start": 35, + "type": "Identifier" + }, + "end": 78, + "start": 35, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 94, + "raw": "10", + "start": 92, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + { + "end": 97, + "start": 96, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 91, + "name": "extrude", + "start": 84, + "type": "Identifier" + }, + "end": 98, + "start": 84, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 184, + "properties": [ + { + "end": 135, + "key": { + "end": 130, + "name": "revolutions", + "start": 119, + "type": "Identifier" + }, + "start": 119, + "type": "ObjectProperty", + "value": { + "end": 135, + "raw": "16", + "start": 133, + "type": "Literal", + "type": "Literal", + "value": 16.0 + } + }, + { + "end": 158, + "key": { + "end": 154, + "name": "angleStart", + "start": 144, + "type": "Identifier" + }, + "start": 144, + "type": "ObjectProperty", + "value": { + "end": 158, + "raw": "0", + "start": 157, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + }, + { + "end": 177, + "key": { + "end": 170, + "name": "ccw", + "start": 167, + "type": "Identifier" + }, + "start": 167, + "type": "ObjectProperty", + "value": { + "end": 177, + "raw": "true", + "start": 173, + "type": "Literal", + "type": "Literal", + "value": true + } + } + ], + "start": 110, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 187, + "start": 186, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 109, + "name": "helix", + "start": 104, + "type": "Identifier" + }, + "end": 188, + "start": 104, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 188, + "start": 10, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 188, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 189, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/helix_ccw/input.kcl b/src/wasm-lib/kcl/tests/helix_ccw/input.kcl new file mode 100644 index 000000000..ba66117ae --- /dev/null +++ b/src/wasm-lib/kcl/tests/helix_ccw/input.kcl @@ -0,0 +1,8 @@ +part001 = startSketchOn('XY') + |> circle({ center = [5, 5], radius = 10 }, %) + |> extrude(10, %) + |> helix({ + revolutions = 16, + angleStart = 0, + ccw = true + }, %) diff --git a/src/wasm-lib/kcl/tests/helix_ccw/ops.snap b/src/wasm-lib/kcl/tests/helix_ccw/ops.snap new file mode 100644 index 000000000..3e7c513ce --- /dev/null +++ b/src/wasm-lib/kcl/tests/helix_ccw/ops.snap @@ -0,0 +1,78 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed helix_ccw.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 24, + 28, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 10, + 29, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 92, + 94, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 96, + 97, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 84, + 98, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 110, + 184, + 0 + ] + }, + "solid": { + "sourceRange": [ + 186, + 187, + 0 + ] + } + }, + "name": "helix", + "sourceRange": [ + 104, + 188, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/helix_ccw/program_memory.snap b/src/wasm-lib/kcl/tests/helix_ccw/program_memory.snap new file mode 100644 index 000000000..55b2a67e7 --- /dev/null +++ b/src/wasm-lib/kcl/tests/helix_ccw/program_memory.snap @@ -0,0 +1,153 @@ +--- +source: kcl/src/simulation_tests.rs +assertion_line: 105 +description: Program memory after executing helix_ccw.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "part001": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 35, + 78, + 0 + ], + "tag": null, + "type": "extrudeArc" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35, + 78, + 0 + ] + }, + "ccw": true, + "center": [ + 5.0, + 5.0 + ], + "from": [ + 15.0, + 5.0 + ], + "radius": 10.0, + "tag": null, + "to": [ + 15.0, + 5.0 + ], + "type": "Circle" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 15.0, + 5.0 + ], + "to": [ + 15.0, + 5.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35, + 78, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 35, + 78, + 0 + ] + } + ] + }, + "height": 10.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 35, + 78, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/helix_ccw/rendered_model.png b/src/wasm-lib/kcl/tests/helix_ccw/rendered_model.png new file mode 100644 index 000000000..139eabe76 Binary files /dev/null and b/src/wasm-lib/kcl/tests/helix_ccw/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/i_shape/ast.snap b/src/wasm-lib/kcl/tests/i_shape/ast.snap new file mode 100644 index 000000000..8df680676 --- /dev/null +++ b/src/wasm-lib/kcl/tests/i_shape/ast.snap @@ -0,0 +1,2393 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing i_shape.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 48, + "id": { + "end": 21, + "name": "d_wrist_circumference", + "start": 0, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 29, + "raw": "22.8", + "start": 25, + "type": "Literal", + "type": "Literal", + "value": 22.8 + }, + { + "end": 35, + "raw": "10.7", + "start": 31, + "type": "Literal", + "type": "Literal", + "value": 10.7 + }, + { + "end": 41, + "raw": "16.4", + "start": 37, + "type": "Literal", + "type": "Literal", + "value": 16.4 + }, + { + "end": 47, + "raw": "18.5", + "start": 43, + "type": "Literal", + "type": "Literal", + "value": 18.5 + } + ], + "end": 48, + "start": 24, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 48, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 162, + "id": { + "end": 54, + "name": "width", + "start": 49, + "type": "Identifier" + }, + "init": { + "end": 162, + "left": { + "end": 135, + "left": { + "end": 108, + "left": { + "computed": false, + "end": 81, + "object": { + "end": 78, + "name": "d_wrist_circumference", + "start": 57, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 80, + "raw": "0", + "start": 79, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "start": 57, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "operator": "+", + "right": { + "computed": false, + "end": 108, + "object": { + "end": 105, + "name": "d_wrist_circumference", + "start": 84, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 107, + "raw": "1", + "start": 106, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 84, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 57, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "computed": false, + "end": 135, + "object": { + "end": 132, + "name": "d_wrist_circumference", + "start": 111, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 134, + "raw": "2", + "start": 133, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 111, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 57, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "computed": false, + "end": 162, + "object": { + "end": 159, + "name": "d_wrist_circumference", + "start": 138, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 161, + "raw": "3", + "start": 160, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "start": 138, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 57, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 49, + "type": "VariableDeclarator" + }, + "end": 162, + "kind": "const", + "start": 49, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 177, + "id": { + "end": 169, + "name": "length", + "start": 163, + "type": "Identifier" + }, + "init": { + "end": 177, + "raw": "120.0", + "start": 172, + "type": "Literal", + "type": "Literal", + "value": 120.0 + }, + "start": 163, + "type": "VariableDeclarator" + }, + "end": 177, + "kind": "const", + "start": 163, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 199, + "id": { + "end": 192, + "name": "hand_thickness", + "start": 178, + "type": "Identifier" + }, + "init": { + "end": 199, + "raw": "24.0", + "start": 195, + "type": "Literal", + "type": "Literal", + "value": 24.0 + }, + "start": 178, + "type": "VariableDeclarator" + }, + "end": 199, + "kind": "const", + "start": 178, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 219, + "id": { + "end": 213, + "name": "corner_radius", + "start": 200, + "type": "Identifier" + }, + "init": { + "end": 219, + "raw": "5.0", + "start": 216, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + "start": 200, + "type": "VariableDeclarator" + }, + "end": 219, + "kind": "const", + "start": 200, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 1886, + "id": { + "end": 396, + "name": "brace_base", + "start": 386, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "elements": [ + { + "end": 427, + "name": "corner_radius", + "start": 414, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 430, + "raw": "0", + "start": 429, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 431, + "start": 413, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + ], + "callee": { + "end": 412, + "name": "startSketchAt", + "start": 399, + "type": "Identifier" + }, + "end": 432, + "start": 399, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 465, + "left": { + "end": 449, + "name": "width", + "start": 444, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "-", + "right": { + "end": 465, + "name": "corner_radius", + "start": 452, + "type": "Identifier", + "type": "Identifier" + }, + "start": 444, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 470, + "raw": "0.0", + "start": 467, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 471, + "start": 443, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 474, + "start": 473, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 442, + "name": "line", + "start": 438, + "type": "Identifier" + }, + "end": 475, + "start": 438, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 519, + "name": "corner_radius", + "start": 506, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 534, + "name": "corner_radius", + "start": 521, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 535, + "start": 505, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 538, + "start": 537, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 504, + "name": "tangentialArcToRelative", + "start": 481, + "type": "Identifier" + }, + "end": 539, + "start": 481, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 571, + "left": { + "end": 555, + "raw": "25.0", + "start": 551, + "type": "Literal", + "type": "Literal", + "value": 25.0 + }, + "operator": "-", + "right": { + "end": 571, + "name": "corner_radius", + "start": 558, + "type": "Identifier", + "type": "Identifier" + }, + "start": 551, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 574, + "start": 573, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 550, + "name": "yLine", + "start": 545, + "type": "Identifier" + }, + "end": 575, + "start": 545, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 620, + "name": "corner_radius", + "start": 607, + "type": "Identifier", + "type": "Identifier" + }, + "end": 620, + "operator": "-", + "start": 606, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 635, + "name": "corner_radius", + "start": 622, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 636, + "start": 605, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 639, + "start": 638, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 604, + "name": "tangentialArcToRelative", + "start": 581, + "type": "Identifier" + }, + "end": 640, + "start": 581, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "argument": { + "end": 699, + "left": { + "computed": false, + "end": 678, + "object": { + "end": 675, + "name": "d_wrist_circumference", + "start": 654, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 677, + "raw": "0", + "start": 676, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "start": 654, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "operator": "-", + "right": { + "end": 699, + "left": { + "end": 695, + "name": "corner_radius", + "start": 682, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "*", + "right": { + "end": 699, + "raw": "2", + "start": 698, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 682, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 654, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 699, + "operator": "-", + "start": 652, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 704, + "start": 703, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 651, + "name": "xLine", + "start": 646, + "type": "Identifier" + }, + "end": 705, + "start": 646, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 750, + "name": "corner_radius", + "start": 737, + "type": "Identifier", + "type": "Identifier" + }, + "end": 750, + "operator": "-", + "start": 736, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 765, + "name": "corner_radius", + "start": 752, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 766, + "start": 735, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 769, + "start": 768, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 734, + "name": "tangentialArcToRelative", + "start": 711, + "type": "Identifier" + }, + "end": 770, + "start": 711, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 823, + "left": { + "end": 802, + "left": { + "end": 795, + "left": { + "end": 788, + "name": "length", + "start": 782, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "-", + "right": { + "end": 795, + "raw": "25.0", + "start": 791, + "type": "Literal", + "type": "Literal", + "value": 25.0 + }, + "start": 782, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "-", + "right": { + "end": 802, + "raw": "23.0", + "start": 798, + "type": "Literal", + "type": "Literal", + "value": 23.0 + }, + "start": 782, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "-", + "right": { + "end": 823, + "left": { + "end": 819, + "name": "corner_radius", + "start": 806, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "*", + "right": { + "end": 823, + "raw": "2", + "start": 822, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 806, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 782, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 827, + "start": 826, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 781, + "name": "yLine", + "start": 776, + "type": "Identifier" + }, + "end": 828, + "start": 776, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 872, + "name": "corner_radius", + "start": 859, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 887, + "name": "corner_radius", + "start": 874, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 888, + "start": 858, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 891, + "start": 890, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 857, + "name": "tangentialArcToRelative", + "start": 834, + "type": "Identifier" + }, + "end": 892, + "start": 834, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 929, + "left": { + "end": 908, + "raw": "15.0", + "start": 904, + "type": "Literal", + "type": "Literal", + "value": 15.0 + }, + "operator": "-", + "right": { + "end": 929, + "left": { + "end": 925, + "name": "corner_radius", + "start": 912, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "*", + "right": { + "end": 929, + "raw": "2", + "start": 928, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 912, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 904, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 933, + "start": 932, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 903, + "name": "xLine", + "start": 898, + "type": "Identifier" + }, + "end": 934, + "start": 898, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 978, + "name": "corner_radius", + "start": 965, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 993, + "name": "corner_radius", + "start": 980, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 994, + "start": 964, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 997, + "start": 996, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 963, + "name": "tangentialArcToRelative", + "start": 940, + "type": "Identifier" + }, + "end": 998, + "start": 940, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1030, + "left": { + "end": 1014, + "raw": "23.0", + "start": 1010, + "type": "Literal", + "type": "Literal", + "value": 23.0 + }, + "operator": "-", + "right": { + "end": 1030, + "name": "corner_radius", + "start": 1017, + "type": "Identifier", + "type": "Identifier" + }, + "start": 1010, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 1033, + "start": 1032, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1009, + "name": "yLine", + "start": 1004, + "type": "Identifier" + }, + "end": 1034, + "start": 1004, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 1079, + "name": "corner_radius", + "start": 1066, + "type": "Identifier", + "type": "Identifier" + }, + "end": 1079, + "operator": "-", + "start": 1065, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 1094, + "name": "corner_radius", + "start": 1081, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 1095, + "start": 1064, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1098, + "start": 1097, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1063, + "name": "tangentialArcToRelative", + "start": 1040, + "type": "Identifier" + }, + "end": 1099, + "start": 1040, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "argument": { + "end": 1162, + "left": { + "end": 1141, + "left": { + "end": 1134, + "left": { + "end": 1127, + "name": "hand_thickness", + "start": 1113, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 1134, + "raw": "15.0", + "start": 1130, + "type": "Literal", + "type": "Literal", + "value": 15.0 + }, + "start": 1113, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "end": 1141, + "raw": "15.0", + "start": 1137, + "type": "Literal", + "type": "Literal", + "value": 15.0 + }, + "start": 1113, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "-", + "right": { + "end": 1162, + "left": { + "end": 1158, + "name": "corner_radius", + "start": 1145, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "*", + "right": { + "end": 1162, + "raw": "2", + "start": 1161, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 1145, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 1113, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 1162, + "operator": "-", + "start": 1111, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 1167, + "start": 1166, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1110, + "name": "xLine", + "start": 1105, + "type": "Identifier" + }, + "end": 1168, + "start": 1105, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 1213, + "name": "corner_radius", + "start": 1200, + "type": "Identifier", + "type": "Identifier" + }, + "end": 1213, + "operator": "-", + "start": 1199, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 1229, + "name": "corner_radius", + "start": 1216, + "type": "Identifier", + "type": "Identifier" + }, + "end": 1229, + "operator": "-", + "start": 1215, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1230, + "start": 1198, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1233, + "start": 1232, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1197, + "name": "tangentialArcToRelative", + "start": 1174, + "type": "Identifier" + }, + "end": 1234, + "start": 1174, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "argument": { + "end": 1268, + "left": { + "end": 1252, + "raw": "23.0", + "start": 1248, + "type": "Literal", + "type": "Literal", + "value": 23.0 + }, + "operator": "-", + "right": { + "end": 1268, + "name": "corner_radius", + "start": 1255, + "type": "Identifier", + "type": "Identifier" + }, + "start": 1248, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 1268, + "operator": "-", + "start": 1246, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 1272, + "start": 1271, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1245, + "name": "yLine", + "start": 1240, + "type": "Identifier" + }, + "end": 1273, + "start": 1240, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1317, + "name": "corner_radius", + "start": 1304, + "type": "Identifier", + "type": "Identifier" + }, + { + "argument": { + "end": 1333, + "name": "corner_radius", + "start": 1320, + "type": "Identifier", + "type": "Identifier" + }, + "end": 1333, + "operator": "-", + "start": 1319, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1334, + "start": 1303, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1337, + "start": 1336, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1302, + "name": "tangentialArcToRelative", + "start": 1279, + "type": "Identifier" + }, + "end": 1338, + "start": 1279, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1375, + "left": { + "end": 1354, + "raw": "15.0", + "start": 1350, + "type": "Literal", + "type": "Literal", + "value": 15.0 + }, + "operator": "-", + "right": { + "end": 1375, + "left": { + "end": 1371, + "name": "corner_radius", + "start": 1358, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "*", + "right": { + "end": 1375, + "raw": "2", + "start": 1374, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 1358, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 1350, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 1379, + "start": 1378, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1349, + "name": "xLine", + "start": 1344, + "type": "Identifier" + }, + "end": 1380, + "start": 1344, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1424, + "name": "corner_radius", + "start": 1411, + "type": "Identifier", + "type": "Identifier" + }, + { + "argument": { + "end": 1440, + "name": "corner_radius", + "start": 1427, + "type": "Identifier", + "type": "Identifier" + }, + "end": 1440, + "operator": "-", + "start": 1426, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1441, + "start": 1410, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1444, + "start": 1443, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1409, + "name": "tangentialArcToRelative", + "start": 1386, + "type": "Identifier" + }, + "end": 1445, + "start": 1386, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "argument": { + "end": 1500, + "left": { + "end": 1479, + "left": { + "end": 1472, + "left": { + "end": 1465, + "name": "length", + "start": 1459, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "-", + "right": { + "end": 1472, + "raw": "25.0", + "start": 1468, + "type": "Literal", + "type": "Literal", + "value": 25.0 + }, + "start": 1459, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "-", + "right": { + "end": 1479, + "raw": "23.0", + "start": 1475, + "type": "Literal", + "type": "Literal", + "value": 23.0 + }, + "start": 1459, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "-", + "right": { + "end": 1500, + "left": { + "end": 1496, + "name": "corner_radius", + "start": 1483, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "*", + "right": { + "end": 1500, + "raw": "2", + "start": 1499, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 1483, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 1459, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 1500, + "operator": "-", + "start": 1457, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 1505, + "start": 1504, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1456, + "name": "yLine", + "start": 1451, + "type": "Identifier" + }, + "end": 1506, + "start": 1451, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 1551, + "name": "corner_radius", + "start": 1538, + "type": "Identifier", + "type": "Identifier" + }, + "end": 1551, + "operator": "-", + "start": 1537, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 1567, + "name": "corner_radius", + "start": 1554, + "type": "Identifier", + "type": "Identifier" + }, + "end": 1567, + "operator": "-", + "start": 1553, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1568, + "start": 1536, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1571, + "start": 1570, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1535, + "name": "tangentialArcToRelative", + "start": 1512, + "type": "Identifier" + }, + "end": 1572, + "start": 1512, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "argument": { + "end": 1697, + "left": { + "end": 1681, + "left": { + "end": 1664, + "left": { + "end": 1637, + "left": { + "computed": false, + "end": 1610, + "object": { + "end": 1607, + "name": "d_wrist_circumference", + "start": 1586, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 1609, + "raw": "1", + "start": 1608, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 1586, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "operator": "+", + "right": { + "computed": false, + "end": 1637, + "object": { + "end": 1634, + "name": "d_wrist_circumference", + "start": 1613, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 1636, + "raw": "2", + "start": 1635, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 1613, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 1586, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "computed": false, + "end": 1664, + "object": { + "end": 1661, + "name": "d_wrist_circumference", + "start": 1640, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 1663, + "raw": "3", + "start": 1662, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "start": 1640, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 1586, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "-", + "right": { + "end": 1681, + "name": "hand_thickness", + "start": 1667, + "type": "Identifier", + "type": "Identifier" + }, + "start": 1586, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "-", + "right": { + "end": 1697, + "name": "corner_radius", + "start": 1684, + "type": "Identifier", + "type": "Identifier" + }, + "start": 1586, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 1697, + "operator": "-", + "start": 1584, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 1701, + "start": 1700, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1583, + "name": "xLine", + "start": 1578, + "type": "Identifier" + }, + "end": 1702, + "start": 1578, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 1747, + "name": "corner_radius", + "start": 1734, + "type": "Identifier", + "type": "Identifier" + }, + "end": 1747, + "operator": "-", + "start": 1733, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 1763, + "name": "corner_radius", + "start": 1750, + "type": "Identifier", + "type": "Identifier" + }, + "end": 1763, + "operator": "-", + "start": 1749, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1764, + "start": 1732, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1767, + "start": 1766, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1731, + "name": "tangentialArcToRelative", + "start": 1708, + "type": "Identifier" + }, + "end": 1768, + "start": 1708, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "argument": { + "end": 1802, + "left": { + "end": 1786, + "raw": "25.0", + "start": 1782, + "type": "Literal", + "type": "Literal", + "value": 25.0 + }, + "operator": "-", + "right": { + "end": 1802, + "name": "corner_radius", + "start": 1789, + "type": "Identifier", + "type": "Identifier" + }, + "start": 1782, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 1802, + "operator": "-", + "start": 1780, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 1806, + "start": 1805, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1779, + "name": "yLine", + "start": 1774, + "type": "Identifier" + }, + "end": 1807, + "start": 1774, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1851, + "name": "corner_radius", + "start": 1838, + "type": "Identifier", + "type": "Identifier" + }, + { + "argument": { + "end": 1867, + "name": "corner_radius", + "start": 1854, + "type": "Identifier", + "type": "Identifier" + }, + "end": 1867, + "operator": "-", + "start": 1853, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1868, + "start": 1837, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1871, + "start": 1870, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1836, + "name": "tangentialArcToRelative", + "start": 1813, + "type": "Identifier" + }, + "end": 1872, + "start": 1813, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1885, + "start": 1884, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1883, + "name": "close", + "start": 1878, + "type": "Identifier" + }, + "end": 1886, + "start": 1878, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 1886, + "start": 399, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 386, + "type": "VariableDeclarator" + }, + "end": 1886, + "kind": "const", + "start": 386, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 2317, + "id": { + "end": 1893, + "name": "inner", + "start": 1888, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "elements": [ + { + "end": 1912, + "raw": "0", + "start": 1911, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 1915, + "raw": "0", + "start": 1914, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 1916, + "start": 1910, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + ], + "callee": { + "end": 1909, + "name": "startSketchAt", + "start": 1896, + "type": "Identifier" + }, + "end": 1917, + "start": 1896, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1932, + "raw": "1.0", + "start": 1929, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 1935, + "start": 1934, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1928, + "name": "xLine", + "start": 1923, + "type": "Identifier" + }, + "end": 1936, + "start": 1923, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1980, + "name": "corner_radius", + "start": 1967, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 1995, + "name": "corner_radius", + "start": 1982, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 1996, + "start": 1966, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1999, + "start": 1998, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1965, + "name": "tangentialArcToRelative", + "start": 1942, + "type": "Identifier" + }, + "end": 2000, + "start": 1942, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 2037, + "left": { + "end": 2016, + "raw": "25.0", + "start": 2012, + "type": "Literal", + "type": "Literal", + "value": 25.0 + }, + "operator": "-", + "right": { + "end": 2037, + "left": { + "end": 2033, + "name": "corner_radius", + "start": 2020, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "*", + "right": { + "end": 2037, + "raw": "2", + "start": 2036, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 2020, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 2012, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 2041, + "start": 2040, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2011, + "name": "yLine", + "start": 2006, + "type": "Identifier" + }, + "end": 2042, + "start": 2006, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 2087, + "name": "corner_radius", + "start": 2074, + "type": "Identifier", + "type": "Identifier" + }, + "end": 2087, + "operator": "-", + "start": 2073, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 2102, + "name": "corner_radius", + "start": 2089, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 2103, + "start": 2072, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2106, + "start": 2105, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2071, + "name": "tangentialArcToRelative", + "start": 2048, + "type": "Identifier" + }, + "end": 2107, + "start": 2048, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "argument": { + "end": 2123, + "raw": "1.0", + "start": 2120, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "end": 2123, + "operator": "-", + "start": 2119, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 2126, + "start": 2125, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2118, + "name": "xLine", + "start": 2113, + "type": "Identifier" + }, + "end": 2127, + "start": 2113, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 2172, + "name": "corner_radius", + "start": 2159, + "type": "Identifier", + "type": "Identifier" + }, + "end": 2172, + "operator": "-", + "start": 2158, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 2188, + "name": "corner_radius", + "start": 2175, + "type": "Identifier", + "type": "Identifier" + }, + "end": 2188, + "operator": "-", + "start": 2174, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2189, + "start": 2157, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2192, + "start": 2191, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2156, + "name": "tangentialArcToRelative", + "start": 2133, + "type": "Identifier" + }, + "end": 2193, + "start": 2133, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "argument": { + "end": 2232, + "left": { + "end": 2211, + "raw": "25.0", + "start": 2207, + "type": "Literal", + "type": "Literal", + "value": 25.0 + }, + "operator": "-", + "right": { + "end": 2232, + "left": { + "end": 2228, + "name": "corner_radius", + "start": 2215, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "*", + "right": { + "end": 2232, + "raw": "2", + "start": 2231, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 2215, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 2207, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 2232, + "operator": "-", + "start": 2205, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 2237, + "start": 2236, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2204, + "name": "yLine", + "start": 2199, + "type": "Identifier" + }, + "end": 2238, + "start": 2199, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2282, + "name": "corner_radius", + "start": 2269, + "type": "Identifier", + "type": "Identifier" + }, + { + "argument": { + "end": 2298, + "name": "corner_radius", + "start": 2285, + "type": "Identifier", + "type": "Identifier" + }, + "end": 2298, + "operator": "-", + "start": 2284, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2299, + "start": 2268, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2302, + "start": 2301, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2267, + "name": "tangentialArcToRelative", + "start": 2244, + "type": "Identifier" + }, + "end": 2303, + "start": 2244, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 2316, + "start": 2315, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2314, + "name": "close", + "start": 2309, + "type": "Identifier" + }, + "end": 2317, + "start": 2309, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 2317, + "start": 1896, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 1888, + "type": "VariableDeclarator" + }, + "end": 2317, + "kind": "const", + "start": 1888, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 2378, + "id": { + "end": 2324, + "name": "final", + "start": 2319, + "type": "Identifier" + }, + "init": { + "body": [ + { + "end": 2337, + "name": "brace_base", + "start": 2327, + "type": "Identifier", + "type": "Identifier" + }, + { + "arguments": [ + { + "end": 2353, + "name": "inner", + "start": 2348, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 2356, + "start": 2355, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2347, + "name": "hole", + "start": 2343, + "type": "Identifier" + }, + "end": 2357, + "start": 2343, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 2374, + "raw": "3.0", + "start": 2371, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + { + "end": 2377, + "start": 2376, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2370, + "name": "extrude", + "start": 2363, + "type": "Identifier" + }, + "end": 2378, + "start": 2363, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 2378, + "start": 2327, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 2319, + "type": "VariableDeclarator" + }, + "end": 2378, + "kind": "const", + "start": 2319, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 2379, + "nonCodeMeta": { + "nonCodeNodes": { + "4": [ + { + "end": 274, + "start": 219, + "type": "NonCodeNode", + "value": { + "type": "newLineBlockComment", + "value": "At first I thought this was going to be symmetric,", + "style": "line" + } + }, + { + "end": 327, + "start": 275, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "but I measured intentionally to not be symmetric,", + "style": "line" + } + }, + { + "end": 385, + "start": 328, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "because your wrist isn't a perfect cylindrical surface", + "style": "line" + } + } + ], + "5": [ + { + "end": 1888, + "start": 1886, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "6": [ + { + "end": 2319, + "start": 2317, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/i_shape/input.kcl b/src/wasm-lib/kcl/tests/i_shape/input.kcl new file mode 100644 index 000000000..d78412c54 --- /dev/null +++ b/src/wasm-lib/kcl/tests/i_shape/input.kcl @@ -0,0 +1,50 @@ +d_wrist_circumference = [22.8, 10.7, 16.4, 18.5] +width = d_wrist_circumference[0] + d_wrist_circumference[1] + d_wrist_circumference[2] + d_wrist_circumference[3] +length = 120.0 +hand_thickness = 24.0 +corner_radius = 5.0 + +// At first I thought this was going to be symmetric, +// but I measured intentionally to not be symmetric, +// because your wrist isn't a perfect cylindrical surface +brace_base = startSketchAt([corner_radius, 0]) + |> line([width - corner_radius, 0.0], %) + |> tangentialArcToRelative([corner_radius, corner_radius], %) + |> yLine(25.0 - corner_radius, %) + |> tangentialArcToRelative([-corner_radius, corner_radius], %) + |> xLine(-(d_wrist_circumference[0] - (corner_radius * 2)), %) + |> tangentialArcToRelative([-corner_radius, corner_radius], %) + |> yLine(length - 25.0 - 23.0 - (corner_radius * 2), %) + |> tangentialArcToRelative([corner_radius, corner_radius], %) + |> xLine(15.0 - (corner_radius * 2), %) + |> tangentialArcToRelative([corner_radius, corner_radius], %) + |> yLine(23.0 - corner_radius, %) + |> tangentialArcToRelative([-corner_radius, corner_radius], %) + |> xLine(-(hand_thickness + 15.0 + 15.0 - (corner_radius * 2)), %) + |> tangentialArcToRelative([-corner_radius, -corner_radius], %) + |> yLine(-(23.0 - corner_radius), %) + |> tangentialArcToRelative([corner_radius, -corner_radius], %) + |> xLine(15.0 - (corner_radius * 2), %) + |> tangentialArcToRelative([corner_radius, -corner_radius], %) + |> yLine(-(length - 25.0 - 23.0 - (corner_radius * 2)), %) + |> tangentialArcToRelative([-corner_radius, -corner_radius], %) + |> xLine(-(d_wrist_circumference[1] + d_wrist_circumference[2] + d_wrist_circumference[3] - hand_thickness - corner_radius), %) + |> tangentialArcToRelative([-corner_radius, -corner_radius], %) + |> yLine(-(25.0 - corner_radius), %) + |> tangentialArcToRelative([corner_radius, -corner_radius], %) + |> close(%) + +inner = startSketchAt([0, 0]) + |> xLine(1.0, %) + |> tangentialArcToRelative([corner_radius, corner_radius], %) + |> yLine(25.0 - (corner_radius * 2), %) + |> tangentialArcToRelative([-corner_radius, corner_radius], %) + |> xLine(-1.0, %) + |> tangentialArcToRelative([-corner_radius, -corner_radius], %) + |> yLine(-(25.0 - (corner_radius * 2)), %) + |> tangentialArcToRelative([corner_radius, -corner_radius], %) + |> close(%) + +final = brace_base + |> hole(inner, %) + |> extrude(3.0, %) diff --git a/src/wasm-lib/kcl/tests/i_shape/ops.snap b/src/wasm-lib/kcl/tests/i_shape/ops.snap new file mode 100644 index 000000000..dee92ade6 --- /dev/null +++ b/src/wasm-lib/kcl/tests/i_shape/ops.snap @@ -0,0 +1,59 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed i_shape.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "hole_sketch": { + "sourceRange": [ + 2348, + 2353, + 0 + ] + }, + "sketch": { + "sourceRange": [ + 2355, + 2356, + 0 + ] + } + }, + "name": "hole", + "sourceRange": [ + 2343, + 2357, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 2371, + 2374, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 2376, + 2377, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 2363, + 2378, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/i_shape/program_memory.snap b/src/wasm-lib/kcl/tests/i_shape/program_memory.snap new file mode 100644 index 000000000..5bb72ea2c --- /dev/null +++ b/src/wasm-lib/kcl/tests/i_shape/program_memory.snap @@ -0,0 +1,1964 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing i_shape.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "brace_base": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 438, + 475, + 0 + ] + }, + "from": [ + 5.0, + 0.0 + ], + "tag": null, + "to": [ + 68.4, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 481, + 539, + 0 + ] + }, + "ccw": true, + "center": [ + 68.4, + 5.0 + ], + "from": [ + 68.4, + 0.0 + ], + "tag": null, + "to": [ + 73.4, + 5.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 545, + 575, + 0 + ] + }, + "from": [ + 73.4, + 5.0 + ], + "tag": null, + "to": [ + 73.4, + 25.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 581, + 640, + 0 + ] + }, + "ccw": true, + "center": [ + 68.4, + 25.0 + ], + "from": [ + 73.4, + 25.0 + ], + "tag": null, + "to": [ + 68.4, + 30.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 646, + 705, + 0 + ] + }, + "from": [ + 68.4, + 30.0 + ], + "tag": null, + "to": [ + 55.6, + 30.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 711, + 770, + 0 + ] + }, + "ccw": false, + "center": [ + 55.60000000000001, + 35.0 + ], + "from": [ + 55.6, + 30.0 + ], + "tag": null, + "to": [ + 50.6, + 35.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 776, + 828, + 0 + ] + }, + "from": [ + 50.6, + 35.0 + ], + "tag": null, + "to": [ + 50.6, + 97.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 834, + 892, + 0 + ] + }, + "ccw": false, + "center": [ + 55.60000000000001, + 97.0 + ], + "from": [ + 50.6, + 97.0 + ], + "tag": null, + "to": [ + 55.6, + 102.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 898, + 934, + 0 + ] + }, + "from": [ + 55.6, + 102.0 + ], + "tag": null, + "to": [ + 60.6, + 102.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 940, + 998, + 0 + ] + }, + "ccw": true, + "center": [ + 60.60000000000001, + 107.0 + ], + "from": [ + 60.6, + 102.0 + ], + "tag": null, + "to": [ + 65.6, + 107.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1004, + 1034, + 0 + ] + }, + "from": [ + 65.6, + 107.0 + ], + "tag": null, + "to": [ + 65.6, + 125.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1040, + 1099, + 0 + ] + }, + "ccw": true, + "center": [ + 60.60000000000001, + 125.0 + ], + "from": [ + 65.6, + 125.0 + ], + "tag": null, + "to": [ + 60.6, + 130.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1105, + 1168, + 0 + ] + }, + "from": [ + 60.6, + 130.0 + ], + "tag": null, + "to": [ + 16.6, + 130.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1174, + 1234, + 0 + ] + }, + "ccw": true, + "center": [ + 16.60000000000001, + 125.0 + ], + "from": [ + 16.6, + 130.0 + ], + "tag": null, + "to": [ + 11.6, + 125.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1240, + 1273, + 0 + ] + }, + "from": [ + 11.6, + 125.0 + ], + "tag": null, + "to": [ + 11.6, + 107.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1279, + 1338, + 0 + ] + }, + "ccw": true, + "center": [ + 16.60000000000001, + 107.0 + ], + "from": [ + 11.6, + 107.0 + ], + "tag": null, + "to": [ + 16.6, + 102.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1344, + 1380, + 0 + ] + }, + "from": [ + 16.6, + 102.0 + ], + "tag": null, + "to": [ + 21.6, + 102.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1386, + 1445, + 0 + ] + }, + "ccw": false, + "center": [ + 21.60000000000001, + 97.0 + ], + "from": [ + 21.6, + 102.0 + ], + "tag": null, + "to": [ + 26.6, + 97.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1451, + 1506, + 0 + ] + }, + "from": [ + 26.6, + 97.0 + ], + "tag": null, + "to": [ + 26.6, + 35.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1512, + 1572, + 0 + ] + }, + "ccw": false, + "center": [ + 21.60000000000001, + 35.0 + ], + "from": [ + 26.6, + 35.0 + ], + "tag": null, + "to": [ + 21.6, + 30.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1578, + 1702, + 0 + ] + }, + "from": [ + 21.6, + 30.0 + ], + "tag": null, + "to": [ + 5.0, + 30.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1708, + 1768, + 0 + ] + }, + "ccw": true, + "center": [ + 5.000000000000014, + 25.0 + ], + "from": [ + 5.0, + 30.0 + ], + "tag": null, + "to": [ + 0.0, + 25.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1774, + 1807, + 0 + ] + }, + "from": [ + 0.0, + 25.0 + ], + "tag": null, + "to": [ + 0.0, + 5.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1813, + 1872, + 0 + ] + }, + "ccw": true, + "center": [ + 5.000000000000014, + 5.0 + ], + "from": [ + 0.0, + 5.0 + ], + "tag": null, + "to": [ + 5.0, + 0.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1878, + 1886, + 0 + ] + }, + "from": [ + 5.0, + 0.0 + ], + "tag": null, + "to": [ + 5.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 5.0, + 0.0 + ], + "to": [ + 5.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 399, + 432, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 399, + 432, + 0 + ] + } + ] + } + }, + "corner_radius": { + "type": "Number", + "value": 5.0, + "__meta": [ + { + "sourceRange": [ + 216, + 219, + 0 + ] + } + ] + }, + "d_wrist_circumference": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 22.8, + "__meta": [ + { + "sourceRange": [ + 25, + 29, + 0 + ] + } + ] + }, + { + "type": "Number", + "value": 10.7, + "__meta": [ + { + "sourceRange": [ + 31, + 35, + 0 + ] + } + ] + }, + { + "type": "Number", + "value": 16.4, + "__meta": [ + { + "sourceRange": [ + 37, + 41, + 0 + ] + } + ] + }, + { + "type": "Number", + "value": 18.5, + "__meta": [ + { + "sourceRange": [ + 43, + 47, + 0 + ] + } + ] + } + ], + "__meta": [ + { + "sourceRange": [ + 24, + 48, + 0 + ] + } + ] + }, + "final": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 438, + 475, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 481, + 539, + 0 + ], + "tag": null, + "type": "extrudeArc" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 545, + 575, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 581, + 640, + 0 + ], + "tag": null, + "type": "extrudeArc" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 646, + 705, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 711, + 770, + 0 + ], + "tag": null, + "type": "extrudeArc" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 776, + 828, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 834, + 892, + 0 + ], + "tag": null, + "type": "extrudeArc" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 898, + 934, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 940, + 998, + 0 + ], + "tag": null, + "type": "extrudeArc" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1004, + 1034, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1040, + 1099, + 0 + ], + "tag": null, + "type": "extrudeArc" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1105, + 1168, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1174, + 1234, + 0 + ], + "tag": null, + "type": "extrudeArc" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1240, + 1273, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1279, + 1338, + 0 + ], + "tag": null, + "type": "extrudeArc" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1344, + 1380, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1386, + 1445, + 0 + ], + "tag": null, + "type": "extrudeArc" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1451, + 1506, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1512, + 1572, + 0 + ], + "tag": null, + "type": "extrudeArc" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1578, + 1702, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1708, + 1768, + 0 + ], + "tag": null, + "type": "extrudeArc" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1774, + 1807, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1813, + 1872, + 0 + ], + "tag": null, + "type": "extrudeArc" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 438, + 475, + 0 + ] + }, + "from": [ + 5.0, + 0.0 + ], + "tag": null, + "to": [ + 68.4, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 481, + 539, + 0 + ] + }, + "ccw": true, + "center": [ + 68.4, + 5.0 + ], + "from": [ + 68.4, + 0.0 + ], + "tag": null, + "to": [ + 73.4, + 5.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 545, + 575, + 0 + ] + }, + "from": [ + 73.4, + 5.0 + ], + "tag": null, + "to": [ + 73.4, + 25.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 581, + 640, + 0 + ] + }, + "ccw": true, + "center": [ + 68.4, + 25.0 + ], + "from": [ + 73.4, + 25.0 + ], + "tag": null, + "to": [ + 68.4, + 30.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 646, + 705, + 0 + ] + }, + "from": [ + 68.4, + 30.0 + ], + "tag": null, + "to": [ + 55.6, + 30.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 711, + 770, + 0 + ] + }, + "ccw": false, + "center": [ + 55.60000000000001, + 35.0 + ], + "from": [ + 55.6, + 30.0 + ], + "tag": null, + "to": [ + 50.6, + 35.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 776, + 828, + 0 + ] + }, + "from": [ + 50.6, + 35.0 + ], + "tag": null, + "to": [ + 50.6, + 97.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 834, + 892, + 0 + ] + }, + "ccw": false, + "center": [ + 55.60000000000001, + 97.0 + ], + "from": [ + 50.6, + 97.0 + ], + "tag": null, + "to": [ + 55.6, + 102.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 898, + 934, + 0 + ] + }, + "from": [ + 55.6, + 102.0 + ], + "tag": null, + "to": [ + 60.6, + 102.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 940, + 998, + 0 + ] + }, + "ccw": true, + "center": [ + 60.60000000000001, + 107.0 + ], + "from": [ + 60.6, + 102.0 + ], + "tag": null, + "to": [ + 65.6, + 107.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1004, + 1034, + 0 + ] + }, + "from": [ + 65.6, + 107.0 + ], + "tag": null, + "to": [ + 65.6, + 125.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1040, + 1099, + 0 + ] + }, + "ccw": true, + "center": [ + 60.60000000000001, + 125.0 + ], + "from": [ + 65.6, + 125.0 + ], + "tag": null, + "to": [ + 60.6, + 130.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1105, + 1168, + 0 + ] + }, + "from": [ + 60.6, + 130.0 + ], + "tag": null, + "to": [ + 16.6, + 130.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1174, + 1234, + 0 + ] + }, + "ccw": true, + "center": [ + 16.60000000000001, + 125.0 + ], + "from": [ + 16.6, + 130.0 + ], + "tag": null, + "to": [ + 11.6, + 125.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1240, + 1273, + 0 + ] + }, + "from": [ + 11.6, + 125.0 + ], + "tag": null, + "to": [ + 11.6, + 107.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1279, + 1338, + 0 + ] + }, + "ccw": true, + "center": [ + 16.60000000000001, + 107.0 + ], + "from": [ + 11.6, + 107.0 + ], + "tag": null, + "to": [ + 16.6, + 102.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1344, + 1380, + 0 + ] + }, + "from": [ + 16.6, + 102.0 + ], + "tag": null, + "to": [ + 21.6, + 102.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1386, + 1445, + 0 + ] + }, + "ccw": false, + "center": [ + 21.60000000000001, + 97.0 + ], + "from": [ + 21.6, + 102.0 + ], + "tag": null, + "to": [ + 26.6, + 97.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1451, + 1506, + 0 + ] + }, + "from": [ + 26.6, + 97.0 + ], + "tag": null, + "to": [ + 26.6, + 35.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1512, + 1572, + 0 + ] + }, + "ccw": false, + "center": [ + 21.60000000000001, + 35.0 + ], + "from": [ + 26.6, + 35.0 + ], + "tag": null, + "to": [ + 21.6, + 30.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1578, + 1702, + 0 + ] + }, + "from": [ + 21.6, + 30.0 + ], + "tag": null, + "to": [ + 5.0, + 30.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1708, + 1768, + 0 + ] + }, + "ccw": true, + "center": [ + 5.000000000000014, + 25.0 + ], + "from": [ + 5.0, + 30.0 + ], + "tag": null, + "to": [ + 0.0, + 25.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1774, + 1807, + 0 + ] + }, + "from": [ + 0.0, + 25.0 + ], + "tag": null, + "to": [ + 0.0, + 5.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1813, + 1872, + 0 + ] + }, + "ccw": true, + "center": [ + 5.000000000000014, + 5.0 + ], + "from": [ + 0.0, + 5.0 + ], + "tag": null, + "to": [ + 5.0, + 0.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1878, + 1886, + 0 + ] + }, + "from": [ + 5.0, + 0.0 + ], + "tag": null, + "to": [ + 5.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 5.0, + 0.0 + ], + "to": [ + 5.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 399, + 432, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 399, + 432, + 0 + ] + } + ] + }, + "height": 3.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 399, + 432, + 0 + ] + } + ] + }, + "hand_thickness": { + "type": "Number", + "value": 24.0, + "__meta": [ + { + "sourceRange": [ + 195, + 199, + 0 + ] + } + ] + }, + "inner": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1923, + 1936, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 1.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1942, + 2000, + 0 + ] + }, + "ccw": true, + "center": [ + 1.0, + 5.0 + ], + "from": [ + 1.0, + 0.0 + ], + "tag": null, + "to": [ + 6.0, + 5.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2006, + 2042, + 0 + ] + }, + "from": [ + 6.0, + 5.0 + ], + "tag": null, + "to": [ + 6.0, + 20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2048, + 2107, + 0 + ] + }, + "ccw": true, + "center": [ + 1.0, + 20.0 + ], + "from": [ + 6.0, + 20.0 + ], + "tag": null, + "to": [ + 1.0, + 25.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2113, + 2127, + 0 + ] + }, + "from": [ + 1.0, + 25.0 + ], + "tag": null, + "to": [ + 0.0, + 25.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2133, + 2193, + 0 + ] + }, + "ccw": true, + "center": [ + 0.0, + 20.0 + ], + "from": [ + 0.0, + 25.0 + ], + "tag": null, + "to": [ + -5.0, + 20.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2199, + 2238, + 0 + ] + }, + "from": [ + -5.0, + 20.0 + ], + "tag": null, + "to": [ + -5.0, + 5.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2244, + 2303, + 0 + ] + }, + "ccw": true, + "center": [ + 0.0, + 5.0 + ], + "from": [ + -5.0, + 5.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2309, + 2317, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1896, + 1917, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 1896, + 1917, + 0 + ] + } + ] + } + }, + "length": { + "type": "Number", + "value": 120.0, + "__meta": [ + { + "sourceRange": [ + 172, + 177, + 0 + ] + } + ] + }, + "width": { + "type": "Number", + "value": 68.4, + "__meta": [ + { + "sourceRange": [ + 25, + 29, + 0 + ] + }, + { + "sourceRange": [ + 31, + 35, + 0 + ] + }, + { + "sourceRange": [ + 37, + 41, + 0 + ] + }, + { + "sourceRange": [ + 43, + 47, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/i_shape/rendered_model.png b/src/wasm-lib/kcl/tests/i_shape/rendered_model.png new file mode 100644 index 000000000..38cd058f5 Binary files /dev/null and b/src/wasm-lib/kcl/tests/i_shape/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/if_else/ast.snap b/src/wasm-lib/kcl/tests/if_else/ast.snap new file mode 100644 index 000000000..dc7fba9f1 --- /dev/null +++ b/src/wasm-lib/kcl/tests/if_else/ast.snap @@ -0,0 +1,536 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing if_else.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 101, + "id": { + "end": 49, + "name": "a", + "start": 48, + "type": "Identifier" + }, + "init": { + "cond": { + "end": 59, + "raw": "true", + "start": 55, + "type": "Literal", + "type": "Literal", + "value": true + }, + "digest": null, + "else_ifs": [ + { + "cond": { + "end": 80, + "raw": "true", + "start": 76, + "type": "Literal", + "type": "Literal", + "value": true + }, + "digest": null, + "end": 88, + "start": 68, + "then_val": { + "body": [ + { + "end": 86, + "expression": { + "end": 86, + "raw": "4", + "start": 85, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "start": 85, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 87, + "start": 81 + }, + "type": "ElseIf" + } + ], + "end": 101, + "final_else": { + "body": [ + { + "end": 99, + "expression": { + "end": 99, + "raw": "5", + "start": 98, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + "start": 98, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 100, + "start": 98 + }, + "start": 52, + "then_val": { + "body": [ + { + "end": 65, + "expression": { + "end": 65, + "raw": "3", + "start": 64, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "start": 64, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 66, + "start": 64 + }, + "type": "IfExpression", + "type": "IfExpression" + }, + "start": 48, + "type": "VariableDeclarator" + }, + "end": 101, + "kind": "const", + "start": 48, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 159, + "expression": { + "arguments": [ + { + "end": 115, + "name": "a", + "start": 114, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 118, + "raw": "3", + "start": 117, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + { + "end": 125, + "raw": "0.001", + "start": 120, + "type": "Literal", + "type": "Literal", + "value": 0.001 + }, + { + "end": 158, + "raw": "\"the 'if' branch gets returned\"", + "start": 127, + "type": "Literal", + "type": "Literal", + "value": "the 'if' branch gets returned" + } + ], + "callee": { + "end": 113, + "name": "assertEqual", + "start": 102, + "type": "Identifier" + }, + "end": 159, + "start": 102, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 102, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "declaration": { + "end": 215, + "id": { + "end": 162, + "name": "b", + "start": 161, + "type": "Identifier" + }, + "init": { + "cond": { + "end": 173, + "raw": "false", + "start": 168, + "type": "Literal", + "type": "Literal", + "value": false + }, + "digest": null, + "else_ifs": [ + { + "cond": { + "end": 194, + "raw": "true", + "start": 190, + "type": "Literal", + "type": "Literal", + "value": true + }, + "digest": null, + "end": 202, + "start": 182, + "then_val": { + "body": [ + { + "end": 200, + "expression": { + "end": 200, + "raw": "4", + "start": 199, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "start": 199, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 201, + "start": 195 + }, + "type": "ElseIf" + } + ], + "end": 215, + "final_else": { + "body": [ + { + "end": 213, + "expression": { + "end": 213, + "raw": "5", + "start": 212, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + "start": 212, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 214, + "start": 212 + }, + "start": 165, + "then_val": { + "body": [ + { + "end": 179, + "expression": { + "end": 179, + "raw": "3", + "start": 178, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "start": 178, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 180, + "start": 178 + }, + "type": "IfExpression", + "type": "IfExpression" + }, + "start": 161, + "type": "VariableDeclarator" + }, + "end": 215, + "kind": "const", + "start": 161, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 278, + "expression": { + "arguments": [ + { + "end": 229, + "name": "b", + "start": 228, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 232, + "raw": "4", + "start": 231, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + { + "end": 239, + "raw": "0.001", + "start": 234, + "type": "Literal", + "type": "Literal", + "value": 0.001 + }, + { + "end": 277, + "raw": "\"the 'else if' branch gets returned\"", + "start": 241, + "type": "Literal", + "type": "Literal", + "value": "the 'else if' branch gets returned" + } + ], + "callee": { + "end": 227, + "name": "assertEqual", + "start": 216, + "type": "Identifier" + }, + "end": 278, + "start": 216, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 216, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "declaration": { + "end": 335, + "id": { + "end": 281, + "name": "c", + "start": 280, + "type": "Identifier" + }, + "init": { + "cond": { + "end": 292, + "raw": "false", + "start": 287, + "type": "Literal", + "type": "Literal", + "value": false + }, + "digest": null, + "else_ifs": [ + { + "cond": { + "end": 314, + "raw": "false", + "start": 309, + "type": "Literal", + "type": "Literal", + "value": false + }, + "digest": null, + "end": 322, + "start": 301, + "then_val": { + "body": [ + { + "end": 320, + "expression": { + "end": 320, + "raw": "4", + "start": 319, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "start": 319, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 321, + "start": 315 + }, + "type": "ElseIf" + } + ], + "end": 335, + "final_else": { + "body": [ + { + "end": 333, + "expression": { + "end": 333, + "raw": "5", + "start": 332, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + "start": 332, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 334, + "start": 332 + }, + "start": 284, + "then_val": { + "body": [ + { + "end": 298, + "expression": { + "end": 298, + "raw": "3", + "start": 297, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "start": 297, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 299, + "start": 297 + }, + "type": "IfExpression", + "type": "IfExpression" + }, + "start": 280, + "type": "VariableDeclarator" + }, + "end": 335, + "kind": "const", + "start": 280, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 395, + "expression": { + "arguments": [ + { + "end": 349, + "name": "c", + "start": 348, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 352, + "raw": "5", + "start": 351, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + { + "end": 359, + "raw": "0.001", + "start": 354, + "type": "Literal", + "type": "Literal", + "value": 0.001 + }, + { + "end": 394, + "raw": "\"the 'else' branch gets returned\"", + "start": 361, + "type": "Literal", + "type": "Literal", + "value": "the 'else' branch gets returned" + } + ], + "callee": { + "end": 347, + "name": "assertEqual", + "start": 336, + "type": "Identifier" + }, + "end": 395, + "start": 336, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 336, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 396, + "nonCodeMeta": { + "nonCodeNodes": { + "1": [ + { + "end": 161, + "start": 159, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "3": [ + { + "end": 280, + "start": 278, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [ + { + "end": 45, + "start": 0, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "This tests evaluating if-else expressions.", + "style": "line" + } + }, + { + "end": 48, + "start": 45, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/tests/executor/inputs/no_visuals/if_else.kcl b/src/wasm-lib/kcl/tests/if_else/input.kcl similarity index 86% rename from src/wasm-lib/tests/executor/inputs/no_visuals/if_else.kcl rename to src/wasm-lib/kcl/tests/if_else/input.kcl index 6f48c59ab..e57aede34 100644 --- a/src/wasm-lib/tests/executor/inputs/no_visuals/if_else.kcl +++ b/src/wasm-lib/kcl/tests/if_else/input.kcl @@ -1,6 +1,7 @@ // This tests evaluating if-else expressions. -let a = if true { + +a = if true { 3 } else if true { 4 @@ -9,7 +10,7 @@ let a = if true { } assertEqual(a, 3, 0.001, "the 'if' branch gets returned") -let b = if false { +b = if false { 3 } else if true { 4 @@ -18,7 +19,7 @@ let b = if false { } assertEqual(b, 4, 0.001, "the 'else if' branch gets returned") -let c = if false { +c = if false { 3 } else if false { 4 diff --git a/src/wasm-lib/kcl/tests/if_else/ops.snap b/src/wasm-lib/kcl/tests/if_else/ops.snap new file mode 100644 index 000000000..83102e725 --- /dev/null +++ b/src/wasm-lib/kcl/tests/if_else/ops.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed if_else.kcl +snapshot_kind: text +--- +[] diff --git a/src/wasm-lib/kcl/tests/if_else/program_memory.snap b/src/wasm-lib/kcl/tests/if_else/program_memory.snap new file mode 100644 index 000000000..893780bb0 --- /dev/null +++ b/src/wasm-lib/kcl/tests/if_else/program_memory.snap @@ -0,0 +1,76 @@ +--- +source: kcl/src/simulation_tests.rs +assertion_line: 92 +description: Program memory after executing if_else.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "a": { + "type": "Number", + "value": 3.0, + "__meta": [ + { + "sourceRange": [ + 64, + 65, + 0 + ] + } + ] + }, + "b": { + "type": "Number", + "value": 4.0, + "__meta": [ + { + "sourceRange": [ + 199, + 200, + 0 + ] + } + ] + }, + "c": { + "type": "Number", + "value": 5.0, + "__meta": [ + { + "sourceRange": [ + 332, + 333, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/import_constant/ast.snap b/src/wasm-lib/kcl/tests/import_constant/ast.snap new file mode 100644 index 000000000..bbdef2d57 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_constant/ast.snap @@ -0,0 +1,36 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing import_constant.kcl +--- +{ + "Ok": { + "body": [ + { + "end": 39, + "path": "export_constant.kcl", + "selector": { + "type": "List", + "items": [ + { + "alias": null, + "end": 12, + "name": { + "end": 12, + "name": "three", + "start": 7, + "type": "Identifier" + }, + "start": 7, + "type": "ImportItem" + } + ] + }, + "start": 0, + "type": "ImportStatement", + "type": "ImportStatement" + } + ], + "end": 40, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/import_constant/export_constant.kcl b/src/wasm-lib/kcl/tests/import_constant/export_constant.kcl new file mode 100644 index 000000000..471bcd1cc --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_constant/export_constant.kcl @@ -0,0 +1 @@ +export three = 3 diff --git a/src/wasm-lib/kcl/tests/import_constant/input.kcl b/src/wasm-lib/kcl/tests/import_constant/input.kcl new file mode 100644 index 000000000..f9411745e --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_constant/input.kcl @@ -0,0 +1 @@ +import three from "export_constant.kcl" diff --git a/src/wasm-lib/kcl/tests/import_constant/ops.snap b/src/wasm-lib/kcl/tests/import_constant/ops.snap new file mode 100644 index 000000000..ae24f1453 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_constant/ops.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed import_constant.kcl +snapshot_kind: text +--- +[] diff --git a/src/wasm-lib/kcl/tests/import_constant/program_memory.snap b/src/wasm-lib/kcl/tests/import_constant/program_memory.snap new file mode 100644 index 000000000..4a9aa4360 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_constant/program_memory.snap @@ -0,0 +1,48 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing import_constant.kcl +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "three": { + "type": "Number", + "value": 3.0, + "__meta": [ + { + "sourceRange": [ + 15, + 16, + 1 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/import_cycle1/ast.snap b/src/wasm-lib/kcl/tests/import_cycle1/ast.snap new file mode 100644 index 000000000..30e3cb377 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_cycle1/ast.snap @@ -0,0 +1,117 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing import_cycle1.kcl +--- +{ + "Ok": { + "body": [ + { + "end": 35, + "path": "import_cycle2.kcl", + "selector": { + "type": "List", + "items": [ + { + "alias": null, + "end": 10, + "name": { + "end": 10, + "name": "two", + "start": 7, + "type": "Identifier" + }, + "start": 7, + "type": "ImportItem" + } + ] + }, + "start": 0, + "type": "ImportStatement", + "type": "ImportStatement" + }, + { + "declaration": { + "end": 75, + "id": { + "end": 50, + "name": "one", + "start": 47, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "end": 73, + "left": { + "arguments": [], + "callee": { + "end": 67, + "name": "two", + "start": 64, + "type": "Identifier" + }, + "end": 69, + "start": 64, + "type": "CallExpression", + "type": "CallExpression" + }, + "operator": "-", + "right": { + "end": 73, + "raw": "1", + "start": 72, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 64, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 73, + "start": 57, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 75, + "start": 53 + }, + "end": 75, + "params": [], + "start": 50, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 47, + "type": "VariableDeclarator" + }, + "end": 75, + "kind": "fn", + "start": 37, + "type": "VariableDeclaration", + "type": "VariableDeclaration", + "visibility": "export" + } + ], + "end": 76, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 37, + "start": 35, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/import_cycle1/execution_error.snap b/src/wasm-lib/kcl/tests/import_cycle1/execution_error.snap new file mode 100644 index 000000000..4f916af8a --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_cycle1/execution_error.snap @@ -0,0 +1,14 @@ +--- +source: kcl/src/simulation_tests.rs +description: Error from executing import_cycle1.kcl +--- +KCL ImportCycle error + + × import cycle: circular import of modules is not allowed: tests/ + │ import_cycle1/import_cycle2.kcl -> tests/import_cycle1/import_cycle3.kcl + │ -> tests/import_cycle1/input.kcl -> tests/import_cycle1/import_cycle2.kcl + ╭─[1:1] + 1 │ import two from "import_cycle2.kcl" + · ─────────────────────────────────── + 2 │ + ╰──── diff --git a/src/wasm-lib/kcl/tests/import_cycle1/import_cycle2.kcl b/src/wasm-lib/kcl/tests/import_cycle1/import_cycle2.kcl new file mode 100644 index 000000000..16eb70527 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_cycle1/import_cycle2.kcl @@ -0,0 +1,3 @@ +import three from "import_cycle3.kcl" + +export fn two = () => { return three() - 1 } diff --git a/src/wasm-lib/kcl/tests/import_cycle1/import_cycle3.kcl b/src/wasm-lib/kcl/tests/import_cycle1/import_cycle3.kcl new file mode 100644 index 000000000..4c6e484c0 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_cycle1/import_cycle3.kcl @@ -0,0 +1,3 @@ +import one from "input.kcl" + +export fn three = () => { return one() + one() + one() } diff --git a/src/wasm-lib/kcl/tests/import_cycle1/input.kcl b/src/wasm-lib/kcl/tests/import_cycle1/input.kcl new file mode 100644 index 000000000..ea561354e --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_cycle1/input.kcl @@ -0,0 +1,5 @@ +import two from "import_cycle2.kcl" + +export fn one() { + return two() - 1 +} diff --git a/src/wasm-lib/kcl/tests/import_cycle1/ops.snap b/src/wasm-lib/kcl/tests/import_cycle1/ops.snap new file mode 100644 index 000000000..b8fe46136 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_cycle1/ops.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed import_cycle1.kcl +snapshot_kind: text +--- +[] diff --git a/src/wasm-lib/kcl/tests/import_export/ast.snap b/src/wasm-lib/kcl/tests/import_export/ast.snap new file mode 100644 index 000000000..c25c6808d --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_export/ast.snap @@ -0,0 +1,36 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing import_export.kcl +--- +{ + "Ok": { + "body": [ + { + "end": 32, + "path": "export_1.kcl", + "selector": { + "type": "List", + "items": [ + { + "alias": null, + "end": 12, + "name": { + "end": 12, + "name": "three", + "start": 7, + "type": "Identifier" + }, + "start": 7, + "type": "ImportItem" + } + ] + }, + "start": 0, + "type": "ImportStatement", + "type": "ImportStatement" + } + ], + "end": 33, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/import_export/export_1.kcl b/src/wasm-lib/kcl/tests/import_export/export_1.kcl new file mode 100644 index 000000000..f3ac5edab --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_export/export_1.kcl @@ -0,0 +1 @@ +export import three from "export_2.kcl" diff --git a/src/wasm-lib/kcl/tests/import_export/export_2.kcl b/src/wasm-lib/kcl/tests/import_export/export_2.kcl new file mode 100644 index 000000000..471bcd1cc --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_export/export_2.kcl @@ -0,0 +1 @@ +export three = 3 diff --git a/src/wasm-lib/kcl/tests/import_export/input.kcl b/src/wasm-lib/kcl/tests/import_export/input.kcl new file mode 100644 index 000000000..4c577c8da --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_export/input.kcl @@ -0,0 +1 @@ +import three from "export_1.kcl" diff --git a/src/wasm-lib/kcl/tests/import_export/ops.snap b/src/wasm-lib/kcl/tests/import_export/ops.snap new file mode 100644 index 000000000..42bd1da25 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_export/ops.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed import_export.kcl +snapshot_kind: text +--- +[] diff --git a/src/wasm-lib/kcl/tests/import_export/program_memory.snap b/src/wasm-lib/kcl/tests/import_export/program_memory.snap new file mode 100644 index 000000000..98b7ee837 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_export/program_memory.snap @@ -0,0 +1,48 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing import_export.kcl +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "three": { + "type": "Number", + "value": 3.0, + "__meta": [ + { + "sourceRange": [ + 15, + 16, + 2 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/import_glob/ast.snap b/src/wasm-lib/kcl/tests/import_glob/ast.snap new file mode 100644 index 000000000..adb68e2c4 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_glob/ast.snap @@ -0,0 +1,24 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing import_glob.kcl +--- +{ + "Ok": { + "body": [ + { + "end": 35, + "path": "export_constant.kcl", + "selector": { + "end": 8, + "start": 7, + "type": "Glob" + }, + "start": 0, + "type": "ImportStatement", + "type": "ImportStatement" + } + ], + "end": 36, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/import_glob/export_constant.kcl b/src/wasm-lib/kcl/tests/import_glob/export_constant.kcl new file mode 100644 index 000000000..29b77f7b1 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_glob/export_constant.kcl @@ -0,0 +1,5 @@ +export three = 3 + +export fn foo() { + return 42 +} diff --git a/src/wasm-lib/kcl/tests/import_glob/input.kcl b/src/wasm-lib/kcl/tests/import_glob/input.kcl new file mode 100644 index 000000000..f1ec57476 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_glob/input.kcl @@ -0,0 +1 @@ +import * from "export_constant.kcl" diff --git a/src/wasm-lib/kcl/tests/import_glob/ops.snap b/src/wasm-lib/kcl/tests/import_glob/ops.snap new file mode 100644 index 000000000..0db7d2bc2 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_glob/ops.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed import_glob.kcl +snapshot_kind: text +--- +[] diff --git a/src/wasm-lib/kcl/tests/import_glob/program_memory.snap b/src/wasm-lib/kcl/tests/import_glob/program_memory.snap new file mode 100644 index 000000000..016a6d764 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_glob/program_memory.snap @@ -0,0 +1,134 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing import_glob.kcl +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "foo": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "argument": { + "end": 47, + "moduleId": 1, + "raw": "42", + "start": 45, + "type": "Literal", + "type": "Literal", + "value": 42.0 + }, + "end": 47, + "moduleId": 1, + "start": 38, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 49, + "moduleId": 1, + "start": 34 + }, + "end": 49, + "moduleId": 1, + "params": [], + "start": 31, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "three": { + "type": "Number", + "value": 3.0, + "__meta": [ + { + "sourceRange": [ + 15, + 16, + 1 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 31, + 49, + 1 + ] + } + ] + }, + "three": { + "type": "Number", + "value": 3.0, + "__meta": [ + { + "sourceRange": [ + 15, + 16, + 1 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/import_side_effect/ast.snap b/src/wasm-lib/kcl/tests/import_side_effect/ast.snap new file mode 100644 index 000000000..451ec8bd4 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_side_effect/ast.snap @@ -0,0 +1,36 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing import_side_effect.kcl +--- +{ + "Ok": { + "body": [ + { + "end": 40, + "path": "export_side_effect.kcl", + "selector": { + "type": "List", + "items": [ + { + "alias": null, + "end": 10, + "name": { + "end": 10, + "name": "foo", + "start": 7, + "type": "Identifier" + }, + "start": 7, + "type": "ImportItem" + } + ] + }, + "start": 0, + "type": "ImportStatement", + "type": "ImportStatement" + } + ], + "end": 41, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/import_side_effect/execution_error.snap b/src/wasm-lib/kcl/tests/import_side_effect/execution_error.snap new file mode 100644 index 000000000..278cc7eac --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_side_effect/execution_error.snap @@ -0,0 +1,14 @@ +--- +source: kcl/src/simulation_tests.rs +description: Error from executing import_side_effect.kcl +--- +KCL Semantic error + + × semantic: Error loading imported file. Open it to view more details. + │ tests/import_side_effect/export_side_effect.kcl: Cannot send modeling + │ commands while importing. Wrap your code in a function if you want to + │ import the file. + ╭──── + 1 │ import foo from "export_side_effect.kcl" + · ──────────────────────────────────────── + ╰──── diff --git a/src/wasm-lib/kcl/tests/import_side_effect/export_side_effect.kcl b/src/wasm-lib/kcl/tests/import_side_effect/export_side_effect.kcl new file mode 100644 index 000000000..2a2d6b7d4 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_side_effect/export_side_effect.kcl @@ -0,0 +1,5 @@ +export fn foo = () => { return 0 } + +// This interacts with the engine. +part001 = startSketchOn('XY') + |> startProfileAt([0, 0], %) diff --git a/src/wasm-lib/kcl/tests/import_side_effect/input.kcl b/src/wasm-lib/kcl/tests/import_side_effect/input.kcl new file mode 100644 index 000000000..d4f6de6a0 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_side_effect/input.kcl @@ -0,0 +1 @@ +import foo from "export_side_effect.kcl" diff --git a/src/wasm-lib/kcl/tests/import_side_effect/ops.snap b/src/wasm-lib/kcl/tests/import_side_effect/ops.snap new file mode 100644 index 000000000..d6327de12 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_side_effect/ops.snap @@ -0,0 +1,5 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed import_side_effect.kcl +--- +[] diff --git a/src/wasm-lib/kcl/tests/import_whole/ast.snap b/src/wasm-lib/kcl/tests/import_whole/ast.snap new file mode 100644 index 000000000..123b3996d --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_whole/ast.snap @@ -0,0 +1,150 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing import_whole.kcl +--- +{ + "Ok": { + "body": [ + { + "end": 32, + "path": "exported_mod.kcl", + "selector": { + "type": "None", + "alias": { + "end": 32, + "name": "foo", + "start": 29, + "type": "Identifier" + } + }, + "start": 0, + "type": "ImportStatement", + "type": "ImportStatement" + }, + { + "declaration": { + "end": 96, + "id": { + "end": 37, + "name": "bar", + "start": 34, + "type": "Identifier" + }, + "init": { + "body": [ + { + "end": 43, + "name": "foo", + "start": 40, + "type": "Identifier", + "type": "Identifier" + }, + { + "arguments": [ + { + "end": 92, + "properties": [ + { + "end": 72, + "key": { + "end": 62, + "name": "faces", + "start": 57, + "type": "Identifier" + }, + "start": 57, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 71, + "raw": "'end'", + "start": 66, + "type": "Literal", + "type": "Literal", + "value": "end" + } + ], + "end": 72, + "start": 65, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "end": 90, + "key": { + "end": 83, + "name": "thickness", + "start": 74, + "type": "Identifier" + }, + "start": 74, + "type": "ObjectProperty", + "value": { + "end": 90, + "raw": "0.25", + "start": 86, + "type": "Literal", + "type": "Literal", + "value": 0.25 + } + } + ], + "start": 55, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 95, + "start": 94, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 54, + "name": "shell", + "start": 49, + "type": "Identifier" + }, + "end": 96, + "start": 49, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 96, + "start": 40, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 34, + "type": "VariableDeclarator" + }, + "end": 96, + "kind": "const", + "start": 34, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 97, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 34, + "start": 32, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/import_whole/exported_mod.kcl b/src/wasm-lib/kcl/tests/import_whole/exported_mod.kcl new file mode 100644 index 000000000..a803a59fc --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_whole/exported_mod.kcl @@ -0,0 +1,3 @@ +startSketchOn('XY') + |> circle({ center = [5, 5], radius = 10 }, %) + |> extrude(10, %) diff --git a/src/wasm-lib/kcl/tests/import_whole/input.kcl b/src/wasm-lib/kcl/tests/import_whole/input.kcl new file mode 100644 index 000000000..48ec0647a --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_whole/input.kcl @@ -0,0 +1,4 @@ +import "exported_mod.kcl" as foo + +bar = foo + |> shell({ faces = ['end'], thickness = 0.25 }, %) diff --git a/src/wasm-lib/kcl/tests/import_whole/ops.snap b/src/wasm-lib/kcl/tests/import_whole/ops.snap new file mode 100644 index 000000000..276b9d484 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_whole/ops.snap @@ -0,0 +1,32 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed import_whole.kcl +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 55, + 92, + 0 + ] + }, + "solid_set": { + "sourceRange": [ + 94, + 95, + 0 + ] + } + }, + "name": "shell", + "sourceRange": [ + 49, + 96, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/import_whole/program_memory.snap b/src/wasm-lib/kcl/tests/import_whole/program_memory.snap new file mode 100644 index 000000000..7795e95ce --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_whole/program_memory.snap @@ -0,0 +1,164 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing import_whole.kcl +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "bar": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 25, + 68, + 1 + ], + "tag": null, + "type": "extrudeArc" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 25, + 68, + 1 + ] + }, + "ccw": true, + "center": [ + 5.0, + 5.0 + ], + "from": [ + 15.0, + 5.0 + ], + "radius": 10.0, + "tag": null, + "to": [ + 15.0, + 5.0 + ], + "type": "Circle" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 15.0, + 5.0 + ], + "to": [ + 15.0, + 5.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 25, + 68, + 1 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 25, + 68, + 1 + ] + } + ] + }, + "height": 10.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 25, + 68, + 1 + ] + } + ] + }, + "foo": { + "type": "Module", + "value": 1, + "__meta": [ + { + "sourceRange": [ + 0, + 32, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/index_of_array/ast.snap b/src/wasm-lib/kcl/tests/index_of_array/ast.snap new file mode 100644 index 000000000..00306f5f7 --- /dev/null +++ b/src/wasm-lib/kcl/tests/index_of_array/ast.snap @@ -0,0 +1,452 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing index_of_array.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 53, + "id": { + "end": 38, + "name": "arr", + "start": 35, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 44, + "raw": "90", + "start": 42, + "type": "Literal", + "type": "Literal", + "value": 90.0 + }, + { + "end": 48, + "raw": "91", + "start": 46, + "type": "Literal", + "type": "Literal", + "value": 91.0 + }, + { + "end": 52, + "raw": "92", + "start": 50, + "type": "Literal", + "type": "Literal", + "value": 92.0 + } + ], + "end": 53, + "start": 41, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 35, + "type": "VariableDeclarator" + }, + "end": 53, + "kind": "const", + "start": 35, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 97, + "id": { + "end": 88, + "name": "result0", + "start": 81, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 97, + "object": { + "end": 94, + "name": "arr", + "start": 91, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 96, + "raw": "1", + "start": 95, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 91, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 81, + "type": "VariableDeclarator" + }, + "end": 97, + "kind": "const", + "start": 81, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 157, + "expression": { + "arguments": [ + { + "end": 125, + "name": "result0", + "start": 118, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 129, + "raw": "91", + "start": 127, + "type": "Literal", + "type": "Literal", + "value": 91.0 + }, + { + "end": 156, + "raw": "\"Literal property lookup\"", + "start": 131, + "type": "Literal", + "type": "Literal", + "value": "Literal property lookup" + } + ], + "callee": { + "end": 117, + "name": "assertLessThanOrEq", + "start": 99, + "type": "Identifier" + }, + "end": 157, + "start": 99, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 99, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 219, + "expression": { + "arguments": [ + { + "end": 187, + "name": "result0", + "start": 180, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 191, + "raw": "91", + "start": 189, + "type": "Literal", + "type": "Literal", + "value": 91.0 + }, + { + "end": 218, + "raw": "\"Literal property lookup\"", + "start": 193, + "type": "Literal", + "type": "Literal", + "value": "Literal property lookup" + } + ], + "callee": { + "end": 179, + "name": "assertGreaterThanOrEq", + "start": 158, + "type": "Identifier" + }, + "end": 219, + "start": 158, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 158, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "declaration": { + "end": 262, + "id": { + "end": 249, + "name": "i", + "start": 248, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 261, + "left": { + "end": 257, + "raw": "1", + "start": 256, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "operator": "+", + "right": { + "end": 261, + "raw": "0", + "start": 260, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "start": 256, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "callee": { + "end": 255, + "name": "int", + "start": 252, + "type": "Identifier" + }, + "end": 262, + "start": 252, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 248, + "type": "VariableDeclarator" + }, + "end": 262, + "kind": "const", + "start": 248, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 279, + "id": { + "end": 270, + "name": "result1", + "start": 263, + "type": "Identifier" + }, + "init": { + "computed": true, + "end": 279, + "object": { + "end": 276, + "name": "arr", + "start": 273, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 278, + "name": "i", + "start": 277, + "type": "Identifier", + "type": "Identifier" + }, + "start": 273, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 263, + "type": "VariableDeclarator" + }, + "end": 279, + "kind": "const", + "start": 263, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 340, + "expression": { + "arguments": [ + { + "end": 307, + "name": "result1", + "start": 300, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 311, + "raw": "91", + "start": 309, + "type": "Literal", + "type": "Literal", + "value": 91.0 + }, + { + "end": 339, + "raw": "\"Computed property lookup\"", + "start": 313, + "type": "Literal", + "type": "Literal", + "value": "Computed property lookup" + } + ], + "callee": { + "end": 299, + "name": "assertLessThanOrEq", + "start": 281, + "type": "Identifier" + }, + "end": 340, + "start": 281, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 281, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 403, + "expression": { + "arguments": [ + { + "end": 370, + "name": "result1", + "start": 363, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 374, + "raw": "91", + "start": 372, + "type": "Literal", + "type": "Literal", + "value": 91.0 + }, + { + "end": 402, + "raw": "\"Computed property lookup\"", + "start": 376, + "type": "Literal", + "type": "Literal", + "value": "Computed property lookup" + } + ], + "callee": { + "end": 362, + "name": "assertGreaterThanOrEq", + "start": 341, + "type": "Identifier" + }, + "end": 403, + "start": 341, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 341, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 404, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 78, + "start": 53, + "type": "NonCodeNode", + "value": { + "type": "newLineBlockComment", + "value": "Test: literal index.", + "style": "line" + } + }, + { + "end": 81, + "start": 78, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "1": [ + { + "end": 99, + "start": 97, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "3": [ + { + "end": 245, + "start": 219, + "type": "NonCodeNode", + "value": { + "type": "newLineBlockComment", + "value": "Test: computed index.", + "style": "line" + } + }, + { + "end": 248, + "start": 245, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "5": [ + { + "end": 281, + "start": 279, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [ + { + "end": 32, + "start": 0, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "This tests indexing an array.", + "style": "line" + } + }, + { + "end": 35, + "start": 32, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/tests/executor/inputs/no_visuals/index_of_array.kcl b/src/wasm-lib/kcl/tests/index_of_array/input.kcl similarity index 77% rename from src/wasm-lib/tests/executor/inputs/no_visuals/index_of_array.kcl rename to src/wasm-lib/kcl/tests/index_of_array/input.kcl index 19d2d35be..a52c5c90a 100644 --- a/src/wasm-lib/tests/executor/inputs/no_visuals/index_of_array.kcl +++ b/src/wasm-lib/kcl/tests/index_of_array/input.kcl @@ -1,18 +1,21 @@ // This tests indexing an array. -const array = [90, 91, 92] + +arr = [90, 91, 92] // Test: literal index. -const result0 = array[1] + +result0 = arr[1] assertLessThanOrEq(result0, 91, "Literal property lookup") assertGreaterThanOrEq(result0, 91, "Literal property lookup") // Test: computed index. -const i = int(1 + 0) -const result1 = array[i] + +i = int(1 + 0) +result1 = arr[i] assertLessThanOrEq(result1, 91, "Computed property lookup") assertGreaterThanOrEq(result1, 91, "Computed property lookup") diff --git a/src/wasm-lib/kcl/tests/index_of_array/ops.snap b/src/wasm-lib/kcl/tests/index_of_array/ops.snap new file mode 100644 index 000000000..a73eb1401 --- /dev/null +++ b/src/wasm-lib/kcl/tests/index_of_array/ops.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed index_of_array.kcl +snapshot_kind: text +--- +[] diff --git a/src/wasm-lib/kcl/tests/index_of_array/program_memory.snap b/src/wasm-lib/kcl/tests/index_of_array/program_memory.snap new file mode 100644 index 000000000..f37e3f684 --- /dev/null +++ b/src/wasm-lib/kcl/tests/index_of_array/program_memory.snap @@ -0,0 +1,129 @@ +--- +source: kcl/src/simulation_tests.rs +assertion_line: 92 +description: Program memory after executing index_of_array.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "arr": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 90.0, + "__meta": [ + { + "sourceRange": [ + 42, + 44, + 0 + ] + } + ] + }, + { + "type": "Number", + "value": 91.0, + "__meta": [ + { + "sourceRange": [ + 46, + 48, + 0 + ] + } + ] + }, + { + "type": "Number", + "value": 92.0, + "__meta": [ + { + "sourceRange": [ + 50, + 52, + 0 + ] + } + ] + } + ], + "__meta": [ + { + "sourceRange": [ + 41, + 53, + 0 + ] + } + ] + }, + "i": { + "type": "Number", + "value": 1.0, + "__meta": [ + { + "sourceRange": [ + 252, + 262, + 0 + ] + } + ] + }, + "result0": { + "type": "Number", + "value": 91.0, + "__meta": [ + { + "sourceRange": [ + 46, + 48, + 0 + ] + } + ] + }, + "result1": { + "type": "Number", + "value": 91.0, + "__meta": [ + { + "sourceRange": [ + 46, + 48, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/invalid_index_fractional/ast.snap b/src/wasm-lib/kcl/tests/invalid_index_fractional/ast.snap new file mode 100644 index 000000000..54d9be0bd --- /dev/null +++ b/src/wasm-lib/kcl/tests/invalid_index_fractional/ast.snap @@ -0,0 +1,102 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing invalid_index_fractional.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 15, + "id": { + "end": 3, + "name": "arr", + "start": 0, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 8, + "raw": "1", + "start": 7, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 11, + "raw": "2", + "start": 10, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + { + "end": 14, + "raw": "3", + "start": 13, + "type": "Literal", + "type": "Literal", + "value": 3.0 + } + ], + "end": 15, + "start": 6, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 15, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 28, + "id": { + "end": 17, + "name": "x", + "start": 16, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 28, + "object": { + "end": 23, + "name": "arr", + "start": 20, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 27, + "raw": "1.2", + "start": 24, + "type": "Literal", + "type": "Literal", + "value": 1.2 + }, + "start": 20, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 16, + "type": "VariableDeclarator" + }, + "end": 28, + "kind": "const", + "start": 16, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 29, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/invalid_index_fractional/execution_error.snap b/src/wasm-lib/kcl/tests/invalid_index_fractional/execution_error.snap new file mode 100644 index 000000000..b82d33aff --- /dev/null +++ b/src/wasm-lib/kcl/tests/invalid_index_fractional/execution_error.snap @@ -0,0 +1,12 @@ +--- +source: kcl/src/simulation_tests.rs +description: Error from executing invalid_index_fractional.kcl +--- +KCL Semantic error + + × semantic: 1.2 is not a valid index, indices must be whole numbers >= 0 + ╭─[2:5] + 1 │ arr = [1, 2, 3] + 2 │ x = arr[1.2] + · ──────── + ╰──── diff --git a/src/wasm-lib/kcl/tests/invalid_index_fractional/input.kcl b/src/wasm-lib/kcl/tests/invalid_index_fractional/input.kcl new file mode 100644 index 000000000..4f2a3483e --- /dev/null +++ b/src/wasm-lib/kcl/tests/invalid_index_fractional/input.kcl @@ -0,0 +1,2 @@ +arr = [1, 2, 3] +x = arr[1.2] diff --git a/src/wasm-lib/kcl/tests/invalid_index_fractional/ops.snap b/src/wasm-lib/kcl/tests/invalid_index_fractional/ops.snap new file mode 100644 index 000000000..7d6f926ba --- /dev/null +++ b/src/wasm-lib/kcl/tests/invalid_index_fractional/ops.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed invalid_index_fractional.kcl +snapshot_kind: text +--- +[] diff --git a/src/wasm-lib/kcl/tests/invalid_index_negative/ast.snap b/src/wasm-lib/kcl/tests/invalid_index_negative/ast.snap new file mode 100644 index 000000000..8aefa42a4 --- /dev/null +++ b/src/wasm-lib/kcl/tests/invalid_index_negative/ast.snap @@ -0,0 +1,134 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing invalid_index_negative.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 15, + "id": { + "end": 3, + "name": "arr", + "start": 0, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 8, + "raw": "1", + "start": 7, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 11, + "raw": "2", + "start": 10, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + { + "end": 14, + "raw": "3", + "start": 13, + "type": "Literal", + "type": "Literal", + "value": 3.0 + } + ], + "end": 15, + "start": 6, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 15, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 22, + "id": { + "end": 17, + "name": "i", + "start": 16, + "type": "Identifier" + }, + "init": { + "argument": { + "end": 22, + "raw": "1", + "start": 21, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "end": 22, + "operator": "-", + "start": 20, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "start": 16, + "type": "VariableDeclarator" + }, + "end": 22, + "kind": "const", + "start": 16, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 33, + "id": { + "end": 24, + "name": "x", + "start": 23, + "type": "Identifier" + }, + "init": { + "computed": true, + "end": 33, + "object": { + "end": 30, + "name": "arr", + "start": 27, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 32, + "name": "i", + "start": 31, + "type": "Identifier", + "type": "Identifier" + }, + "start": 27, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 23, + "type": "VariableDeclarator" + }, + "end": 33, + "kind": "const", + "start": 23, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 34, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/invalid_index_negative/execution_error.snap b/src/wasm-lib/kcl/tests/invalid_index_negative/execution_error.snap new file mode 100644 index 000000000..11408c6a6 --- /dev/null +++ b/src/wasm-lib/kcl/tests/invalid_index_negative/execution_error.snap @@ -0,0 +1,12 @@ +--- +source: kcl/src/simulation_tests.rs +description: Error from executing invalid_index_negative.kcl +--- +KCL Semantic error + + × semantic: '-1' is negative, so you can't index an array with it + ╭─[3:5] + 2 │ i = -1 + 3 │ x = arr[i] + · ────── + ╰──── diff --git a/src/wasm-lib/kcl/tests/invalid_index_negative/input.kcl b/src/wasm-lib/kcl/tests/invalid_index_negative/input.kcl new file mode 100644 index 000000000..457374509 --- /dev/null +++ b/src/wasm-lib/kcl/tests/invalid_index_negative/input.kcl @@ -0,0 +1,3 @@ +arr = [1, 2, 3] +i = -1 +x = arr[i] diff --git a/src/wasm-lib/kcl/tests/invalid_index_negative/ops.snap b/src/wasm-lib/kcl/tests/invalid_index_negative/ops.snap new file mode 100644 index 000000000..ac27f404b --- /dev/null +++ b/src/wasm-lib/kcl/tests/invalid_index_negative/ops.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed invalid_index_negative.kcl +snapshot_kind: text +--- +[] diff --git a/src/wasm-lib/kcl/tests/invalid_index_str/ast.snap b/src/wasm-lib/kcl/tests/invalid_index_str/ast.snap new file mode 100644 index 000000000..1745a77ed --- /dev/null +++ b/src/wasm-lib/kcl/tests/invalid_index_str/ast.snap @@ -0,0 +1,102 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing invalid_index_str.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 15, + "id": { + "end": 3, + "name": "arr", + "start": 0, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 8, + "raw": "1", + "start": 7, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 11, + "raw": "2", + "start": 10, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + { + "end": 14, + "raw": "3", + "start": 13, + "type": "Literal", + "type": "Literal", + "value": 3.0 + } + ], + "end": 15, + "start": 6, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 15, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 28, + "id": { + "end": 17, + "name": "x", + "start": 16, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 28, + "object": { + "end": 23, + "name": "arr", + "start": 20, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 27, + "raw": "\"s\"", + "start": 24, + "type": "Literal", + "type": "Literal", + "value": "s" + }, + "start": 20, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 16, + "type": "VariableDeclarator" + }, + "end": 28, + "kind": "const", + "start": 16, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 29, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/invalid_index_str/execution_error.snap b/src/wasm-lib/kcl/tests/invalid_index_str/execution_error.snap new file mode 100644 index 000000000..9d69dcb56 --- /dev/null +++ b/src/wasm-lib/kcl/tests/invalid_index_str/execution_error.snap @@ -0,0 +1,13 @@ +--- +source: kcl/src/simulation_tests.rs +description: Error from executing invalid_index_str.kcl +--- +KCL Semantic error + + × semantic: Only integers >= 0 can be used as the index of an array, but + │ you're using a string + ╭─[2:5] + 1 │ arr = [1, 2, 3] + 2 │ x = arr["s"] + · ──────── + ╰──── diff --git a/src/wasm-lib/kcl/tests/invalid_index_str/input.kcl b/src/wasm-lib/kcl/tests/invalid_index_str/input.kcl new file mode 100644 index 000000000..20781cd73 --- /dev/null +++ b/src/wasm-lib/kcl/tests/invalid_index_str/input.kcl @@ -0,0 +1,2 @@ +arr = [1, 2, 3] +x = arr["s"] diff --git a/src/wasm-lib/kcl/tests/invalid_index_str/ops.snap b/src/wasm-lib/kcl/tests/invalid_index_str/ops.snap new file mode 100644 index 000000000..4e42a5dee --- /dev/null +++ b/src/wasm-lib/kcl/tests/invalid_index_str/ops.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed invalid_index_str.kcl +snapshot_kind: text +--- +[] diff --git a/src/wasm-lib/kcl/tests/invalid_member_object/ast.snap b/src/wasm-lib/kcl/tests/invalid_member_object/ast.snap new file mode 100644 index 000000000..bb5538c3d --- /dev/null +++ b/src/wasm-lib/kcl/tests/invalid_member_object/ast.snap @@ -0,0 +1,78 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing invalid_member_object.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 9, + "id": { + "end": 3, + "name": "num", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 9, + "raw": "999", + "start": 6, + "type": "Literal", + "type": "Literal", + "value": 999.0 + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 9, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 20, + "id": { + "end": 11, + "name": "x", + "start": 10, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 20, + "object": { + "end": 17, + "name": "num", + "start": 14, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 19, + "raw": "3", + "start": 18, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "start": 14, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 10, + "type": "VariableDeclarator" + }, + "end": 20, + "kind": "const", + "start": 10, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 21, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/invalid_member_object/execution_error.snap b/src/wasm-lib/kcl/tests/invalid_member_object/execution_error.snap new file mode 100644 index 000000000..54ae4b460 --- /dev/null +++ b/src/wasm-lib/kcl/tests/invalid_member_object/execution_error.snap @@ -0,0 +1,13 @@ +--- +source: kcl/src/simulation_tests.rs +description: Error from executing invalid_member_object.kcl +--- +KCL Semantic error + + × semantic: Only arrays and objects can be indexed, but you're trying to + │ index a number + ╭─[2:5] + 1 │ num = 999 + 2 │ x = num[3] + · ────── + ╰──── diff --git a/src/wasm-lib/kcl/tests/invalid_member_object/input.kcl b/src/wasm-lib/kcl/tests/invalid_member_object/input.kcl new file mode 100644 index 000000000..1875c80bf --- /dev/null +++ b/src/wasm-lib/kcl/tests/invalid_member_object/input.kcl @@ -0,0 +1,2 @@ +num = 999 +x = num[3] diff --git a/src/wasm-lib/kcl/tests/invalid_member_object/ops.snap b/src/wasm-lib/kcl/tests/invalid_member_object/ops.snap new file mode 100644 index 000000000..63c24b270 --- /dev/null +++ b/src/wasm-lib/kcl/tests/invalid_member_object/ops.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed invalid_member_object.kcl +snapshot_kind: text +--- +[] diff --git a/src/wasm-lib/kcl/tests/invalid_member_object_prop/ast.snap b/src/wasm-lib/kcl/tests/invalid_member_object_prop/ast.snap new file mode 100644 index 000000000..5144e7588 --- /dev/null +++ b/src/wasm-lib/kcl/tests/invalid_member_object_prop/ast.snap @@ -0,0 +1,78 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing invalid_member_object_prop.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 8, + "id": { + "end": 1, + "name": "b", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 8, + "raw": "true", + "start": 4, + "type": "Literal", + "type": "Literal", + "value": true + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 8, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 26, + "id": { + "end": 10, + "name": "x", + "start": 9, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 26, + "object": { + "end": 14, + "name": "b", + "start": 13, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 25, + "raw": "\"property\"", + "start": 15, + "type": "Literal", + "type": "Literal", + "value": "property" + }, + "start": 13, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 9, + "type": "VariableDeclarator" + }, + "end": 26, + "kind": "const", + "start": 9, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 27, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/invalid_member_object_prop/execution_error.snap b/src/wasm-lib/kcl/tests/invalid_member_object_prop/execution_error.snap new file mode 100644 index 000000000..ffc717e12 --- /dev/null +++ b/src/wasm-lib/kcl/tests/invalid_member_object_prop/execution_error.snap @@ -0,0 +1,13 @@ +--- +source: kcl/src/simulation_tests.rs +description: Error from executing invalid_member_object_prop.kcl +--- +KCL Semantic error + + × semantic: Only arrays and objects can be indexed, but you're trying to + │ index a boolean (true/false value) + ╭─[2:5] + 1 │ b = true + 2 │ x = b["property"] + · ───────────── + ╰──── diff --git a/src/wasm-lib/kcl/tests/invalid_member_object_prop/input.kcl b/src/wasm-lib/kcl/tests/invalid_member_object_prop/input.kcl new file mode 100644 index 000000000..7585a3495 --- /dev/null +++ b/src/wasm-lib/kcl/tests/invalid_member_object_prop/input.kcl @@ -0,0 +1,2 @@ +b = true +x = b["property"] diff --git a/src/wasm-lib/kcl/tests/invalid_member_object_prop/ops.snap b/src/wasm-lib/kcl/tests/invalid_member_object_prop/ops.snap new file mode 100644 index 000000000..c94efac38 --- /dev/null +++ b/src/wasm-lib/kcl/tests/invalid_member_object_prop/ops.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed invalid_member_object_prop.kcl +snapshot_kind: text +--- +[] diff --git a/src/wasm-lib/kcl/tests/kittycad_svg/ast.snap b/src/wasm-lib/kcl/tests/kittycad_svg/ast.snap new file mode 100644 index 000000000..53abff7be --- /dev/null +++ b/src/wasm-lib/kcl/tests/kittycad_svg/ast.snap @@ -0,0 +1,17870 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing kittycad_svg.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 15831, + "id": { + "end": 3, + "name": "svg", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 24, + "raw": "'XY'", + "start": 20, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 19, + "name": "startSketchOn", + "start": 6, + "type": "Identifier" + }, + "end": 25, + "start": 6, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 48, + "raw": "0", + "start": 47, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 51, + "raw": "0", + "start": 50, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 52, + "start": 46, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 55, + "start": 54, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 45, + "name": "startProfileAt", + "start": 31, + "type": "Identifier" + }, + "end": 56, + "start": 31, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 74, + "raw": "2.52", + "start": 70, + "type": "Literal", + "type": "Literal", + "value": 2.52 + }, + { + "argument": { + "end": 82, + "raw": "26.04", + "start": 77, + "type": "Literal", + "type": "Literal", + "value": 26.04 + }, + "end": 82, + "operator": "-", + "start": 76, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 83, + "start": 69, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 86, + "start": 85, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 68, + "name": "lineTo", + "start": 62, + "type": "Identifier" + }, + "end": 87, + "start": 62, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 121, + "raw": "2.52", + "start": 117, + "type": "Literal", + "type": "Literal", + "value": 2.52 + }, + { + "argument": { + "end": 128, + "raw": "25.2", + "start": 124, + "type": "Literal", + "type": "Literal", + "value": 25.2 + }, + "end": 128, + "operator": "-", + "start": 123, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 129, + "start": 116, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 132, + "start": 131, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 115, + "name": "lineTo", + "start": 109, + "type": "Identifier" + }, + "end": 133, + "start": 109, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 175, + "raw": "0.84", + "start": 171, + "type": "Literal", + "type": "Literal", + "value": 0.84 + }, + { + "argument": { + "end": 182, + "raw": "25.2", + "start": 178, + "type": "Literal", + "type": "Literal", + "value": 25.2 + }, + "end": 182, + "operator": "-", + "start": 177, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 183, + "start": 170, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 186, + "start": 185, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 169, + "name": "lineTo", + "start": 163, + "type": "Identifier" + }, + "end": 187, + "start": 163, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 231, + "raw": "0.84", + "start": 227, + "type": "Literal", + "type": "Literal", + "value": 0.84 + }, + { + "argument": { + "end": 239, + "raw": "24.36", + "start": 234, + "type": "Literal", + "type": "Literal", + "value": 24.36 + }, + "end": 239, + "operator": "-", + "start": 233, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 240, + "start": 226, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 243, + "start": 242, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 225, + "name": "lineTo", + "start": 219, + "type": "Identifier" + }, + "end": 244, + "start": 219, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 283, + "raw": "0", + "start": 282, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 291, + "raw": "24.36", + "start": 286, + "type": "Literal", + "type": "Literal", + "value": 24.36 + }, + "end": 291, + "operator": "-", + "start": 285, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 292, + "start": 281, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 295, + "start": 294, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 280, + "name": "lineTo", + "start": 274, + "type": "Identifier" + }, + "end": 296, + "start": 274, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 337, + "raw": "0", + "start": 336, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 344, + "raw": "6.72", + "start": 340, + "type": "Literal", + "type": "Literal", + "value": 6.72 + }, + "end": 344, + "operator": "-", + "start": 339, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 345, + "start": 335, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 348, + "start": 347, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 334, + "name": "lineTo", + "start": 328, + "type": "Identifier" + }, + "end": 349, + "start": 328, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 391, + "raw": "0.84", + "start": 387, + "type": "Literal", + "type": "Literal", + "value": 0.84 + }, + { + "argument": { + "end": 398, + "raw": "6.72", + "start": 394, + "type": "Literal", + "type": "Literal", + "value": 6.72 + }, + "end": 398, + "operator": "-", + "start": 393, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 399, + "start": 386, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 402, + "start": 401, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 385, + "name": "lineTo", + "start": 379, + "type": "Identifier" + }, + "end": 403, + "start": 379, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 447, + "raw": "0.84", + "start": 443, + "type": "Literal", + "type": "Literal", + "value": 0.84 + }, + { + "argument": { + "end": 454, + "raw": "5.88", + "start": 450, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + "end": 454, + "operator": "-", + "start": 449, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 455, + "start": 442, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 458, + "start": 457, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 441, + "name": "lineTo", + "start": 435, + "type": "Identifier" + }, + "end": 459, + "start": 435, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 501, + "raw": "1.68", + "start": 497, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + { + "argument": { + "end": 508, + "raw": "5.88", + "start": 504, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + "end": 508, + "operator": "-", + "start": 503, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 509, + "start": 496, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 512, + "start": 511, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 495, + "name": "lineTo", + "start": 489, + "type": "Identifier" + }, + "end": 513, + "start": 489, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 557, + "raw": "1.68", + "start": 553, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + { + "argument": { + "end": 564, + "raw": "5.04", + "start": 560, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 564, + "operator": "-", + "start": 559, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 565, + "start": 552, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 568, + "start": 567, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 551, + "name": "lineTo", + "start": 545, + "type": "Identifier" + }, + "end": 569, + "start": 545, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 611, + "raw": "2.52", + "start": 607, + "type": "Literal", + "type": "Literal", + "value": 2.52 + }, + { + "argument": { + "end": 618, + "raw": "5.04", + "start": 614, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 618, + "operator": "-", + "start": 613, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 619, + "start": 606, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 622, + "start": 621, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 605, + "name": "lineTo", + "start": 599, + "type": "Identifier" + }, + "end": 623, + "start": 599, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 667, + "raw": "2.52", + "start": 663, + "type": "Literal", + "type": "Literal", + "value": 2.52 + }, + { + "argument": { + "end": 673, + "raw": "4.2", + "start": 670, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + "end": 673, + "operator": "-", + "start": 669, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 674, + "start": 662, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 677, + "start": 676, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 661, + "name": "lineTo", + "start": 655, + "type": "Identifier" + }, + "end": 678, + "start": 655, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 720, + "raw": "3.36", + "start": 716, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + { + "argument": { + "end": 726, + "raw": "4.2", + "start": 723, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + "end": 726, + "operator": "-", + "start": 722, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 727, + "start": 715, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 730, + "start": 729, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 714, + "name": "lineTo", + "start": 708, + "type": "Identifier" + }, + "end": 731, + "start": 708, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 775, + "raw": "3.36", + "start": 771, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + { + "argument": { + "end": 782, + "raw": "3.36", + "start": 778, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + "end": 782, + "operator": "-", + "start": 777, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 783, + "start": 770, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 786, + "start": 785, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 769, + "name": "lineTo", + "start": 763, + "type": "Identifier" + }, + "end": 787, + "start": 763, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 830, + "raw": "17.64", + "start": 825, + "type": "Literal", + "type": "Literal", + "value": 17.64 + }, + { + "argument": { + "end": 837, + "raw": "3.36", + "start": 833, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + "end": 837, + "operator": "-", + "start": 832, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 838, + "start": 824, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 841, + "start": 840, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 823, + "name": "lineTo", + "start": 817, + "type": "Identifier" + }, + "end": 842, + "start": 817, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 887, + "raw": "17.64", + "start": 882, + "type": "Literal", + "type": "Literal", + "value": 17.64 + }, + { + "argument": { + "end": 893, + "raw": "4.2", + "start": 890, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + "end": 893, + "operator": "-", + "start": 889, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 894, + "start": 881, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 897, + "start": 896, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 880, + "name": "lineTo", + "start": 874, + "type": "Identifier" + }, + "end": 898, + "start": 874, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 941, + "raw": "18.48", + "start": 936, + "type": "Literal", + "type": "Literal", + "value": 18.48 + }, + { + "argument": { + "end": 947, + "raw": "4.2", + "start": 944, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + "end": 947, + "operator": "-", + "start": 943, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 948, + "start": 935, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 951, + "start": 950, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 934, + "name": "lineTo", + "start": 928, + "type": "Identifier" + }, + "end": 952, + "start": 928, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 997, + "raw": "18.48", + "start": 992, + "type": "Literal", + "type": "Literal", + "value": 18.48 + }, + { + "argument": { + "end": 1004, + "raw": "5.04", + "start": 1000, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 1004, + "operator": "-", + "start": 999, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1005, + "start": 991, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1008, + "start": 1007, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 990, + "name": "lineTo", + "start": 984, + "type": "Identifier" + }, + "end": 1009, + "start": 984, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1053, + "raw": "19.32", + "start": 1048, + "type": "Literal", + "type": "Literal", + "value": 19.32 + }, + { + "argument": { + "end": 1060, + "raw": "5.04", + "start": 1056, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 1060, + "operator": "-", + "start": 1055, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1061, + "start": 1047, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1064, + "start": 1063, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1046, + "name": "lineTo", + "start": 1040, + "type": "Identifier" + }, + "end": 1065, + "start": 1040, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1110, + "raw": "19.32", + "start": 1105, + "type": "Literal", + "type": "Literal", + "value": 19.32 + }, + { + "argument": { + "end": 1117, + "raw": "5.88", + "start": 1113, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + "end": 1117, + "operator": "-", + "start": 1112, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1118, + "start": 1104, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1121, + "start": 1120, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1103, + "name": "lineTo", + "start": 1097, + "type": "Identifier" + }, + "end": 1122, + "start": 1097, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1166, + "raw": "20.16", + "start": 1161, + "type": "Literal", + "type": "Literal", + "value": 20.16 + }, + { + "argument": { + "end": 1173, + "raw": "5.88", + "start": 1169, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + "end": 1173, + "operator": "-", + "start": 1168, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1174, + "start": 1160, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1177, + "start": 1176, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1159, + "name": "lineTo", + "start": 1153, + "type": "Identifier" + }, + "end": 1178, + "start": 1153, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1223, + "raw": "20.16", + "start": 1218, + "type": "Literal", + "type": "Literal", + "value": 20.16 + }, + { + "argument": { + "end": 1230, + "raw": "6.72", + "start": 1226, + "type": "Literal", + "type": "Literal", + "value": 6.72 + }, + "end": 1230, + "operator": "-", + "start": 1225, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1231, + "start": 1217, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1234, + "start": 1233, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1216, + "name": "lineTo", + "start": 1210, + "type": "Identifier" + }, + "end": 1235, + "start": 1210, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1275, + "raw": "21", + "start": 1273, + "type": "Literal", + "type": "Literal", + "value": 21.0 + }, + { + "argument": { + "end": 1282, + "raw": "6.72", + "start": 1278, + "type": "Literal", + "type": "Literal", + "value": 6.72 + }, + "end": 1282, + "operator": "-", + "start": 1277, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1283, + "start": 1272, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1286, + "start": 1285, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1271, + "name": "lineTo", + "start": 1265, + "type": "Identifier" + }, + "end": 1287, + "start": 1265, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1329, + "raw": "21", + "start": 1327, + "type": "Literal", + "type": "Literal", + "value": 21.0 + }, + { + "argument": { + "end": 1337, + "raw": "24.36", + "start": 1332, + "type": "Literal", + "type": "Literal", + "value": 24.36 + }, + "end": 1337, + "operator": "-", + "start": 1331, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1338, + "start": 1326, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1341, + "start": 1340, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1325, + "name": "lineTo", + "start": 1319, + "type": "Identifier" + }, + "end": 1342, + "start": 1319, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1386, + "raw": "20.16", + "start": 1381, + "type": "Literal", + "type": "Literal", + "value": 20.16 + }, + { + "argument": { + "end": 1394, + "raw": "24.36", + "start": 1389, + "type": "Literal", + "type": "Literal", + "value": 24.36 + }, + "end": 1394, + "operator": "-", + "start": 1388, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1395, + "start": 1380, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1398, + "start": 1397, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1379, + "name": "lineTo", + "start": 1373, + "type": "Identifier" + }, + "end": 1399, + "start": 1373, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1444, + "raw": "20.16", + "start": 1439, + "type": "Literal", + "type": "Literal", + "value": 20.16 + }, + { + "argument": { + "end": 1451, + "raw": "25.2", + "start": 1447, + "type": "Literal", + "type": "Literal", + "value": 25.2 + }, + "end": 1451, + "operator": "-", + "start": 1446, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1452, + "start": 1438, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1455, + "start": 1454, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1437, + "name": "lineTo", + "start": 1431, + "type": "Identifier" + }, + "end": 1456, + "start": 1431, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1500, + "raw": "18.48", + "start": 1495, + "type": "Literal", + "type": "Literal", + "value": 18.48 + }, + { + "argument": { + "end": 1507, + "raw": "25.2", + "start": 1503, + "type": "Literal", + "type": "Literal", + "value": 25.2 + }, + "end": 1507, + "operator": "-", + "start": 1502, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1508, + "start": 1494, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1511, + "start": 1510, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1493, + "name": "lineTo", + "start": 1487, + "type": "Identifier" + }, + "end": 1512, + "start": 1487, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1557, + "raw": "18.48", + "start": 1552, + "type": "Literal", + "type": "Literal", + "value": 18.48 + }, + { + "argument": { + "end": 1565, + "raw": "26.04", + "start": 1560, + "type": "Literal", + "type": "Literal", + "value": 26.04 + }, + "end": 1565, + "operator": "-", + "start": 1559, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1566, + "start": 1551, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1569, + "start": 1568, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1550, + "name": "lineTo", + "start": 1544, + "type": "Identifier" + }, + "end": 1570, + "start": 1544, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1614, + "raw": "15.96", + "start": 1609, + "type": "Literal", + "type": "Literal", + "value": 15.96 + }, + { + "argument": { + "end": 1622, + "raw": "26.04", + "start": 1617, + "type": "Literal", + "type": "Literal", + "value": 26.04 + }, + "end": 1622, + "operator": "-", + "start": 1616, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1623, + "start": 1608, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1626, + "start": 1625, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1607, + "name": "lineTo", + "start": 1601, + "type": "Identifier" + }, + "end": 1627, + "start": 1601, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1672, + "raw": "15.96", + "start": 1667, + "type": "Literal", + "type": "Literal", + "value": 15.96 + }, + { + "argument": { + "end": 1680, + "raw": "26.88", + "start": 1675, + "type": "Literal", + "type": "Literal", + "value": 26.88 + }, + "end": 1680, + "operator": "-", + "start": 1674, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1681, + "start": 1666, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1684, + "start": 1683, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1665, + "name": "lineTo", + "start": 1659, + "type": "Identifier" + }, + "end": 1685, + "start": 1659, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1728, + "raw": "16.8", + "start": 1724, + "type": "Literal", + "type": "Literal", + "value": 16.8 + }, + { + "argument": { + "end": 1736, + "raw": "26.88", + "start": 1731, + "type": "Literal", + "type": "Literal", + "value": 26.88 + }, + "end": 1736, + "operator": "-", + "start": 1730, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1737, + "start": 1723, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1740, + "start": 1739, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1722, + "name": "lineTo", + "start": 1716, + "type": "Identifier" + }, + "end": 1741, + "start": 1716, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1785, + "raw": "16.8", + "start": 1781, + "type": "Literal", + "type": "Literal", + "value": 16.8 + }, + { + "argument": { + "end": 1793, + "raw": "28.56", + "start": 1788, + "type": "Literal", + "type": "Literal", + "value": 28.56 + }, + "end": 1793, + "operator": "-", + "start": 1787, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1794, + "start": 1780, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1797, + "start": 1796, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1779, + "name": "lineTo", + "start": 1773, + "type": "Identifier" + }, + "end": 1798, + "start": 1773, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1842, + "raw": "11.76", + "start": 1837, + "type": "Literal", + "type": "Literal", + "value": 11.76 + }, + { + "argument": { + "end": 1850, + "raw": "28.56", + "start": 1845, + "type": "Literal", + "type": "Literal", + "value": 28.56 + }, + "end": 1850, + "operator": "-", + "start": 1844, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1851, + "start": 1836, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1854, + "start": 1853, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1835, + "name": "lineTo", + "start": 1829, + "type": "Identifier" + }, + "end": 1855, + "start": 1829, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1900, + "raw": "11.76", + "start": 1895, + "type": "Literal", + "type": "Literal", + "value": 11.76 + }, + { + "argument": { + "end": 1908, + "raw": "26.88", + "start": 1903, + "type": "Literal", + "type": "Literal", + "value": 26.88 + }, + "end": 1908, + "operator": "-", + "start": 1902, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1909, + "start": 1894, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1912, + "start": 1911, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1893, + "name": "lineTo", + "start": 1887, + "type": "Identifier" + }, + "end": 1913, + "start": 1887, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1955, + "raw": "12.6", + "start": 1951, + "type": "Literal", + "type": "Literal", + "value": 12.6 + }, + { + "argument": { + "end": 1963, + "raw": "26.88", + "start": 1958, + "type": "Literal", + "type": "Literal", + "value": 26.88 + }, + "end": 1963, + "operator": "-", + "start": 1957, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1964, + "start": 1950, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1967, + "start": 1966, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1949, + "name": "lineTo", + "start": 1943, + "type": "Identifier" + }, + "end": 1968, + "start": 1943, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2012, + "raw": "12.6", + "start": 2008, + "type": "Literal", + "type": "Literal", + "value": 12.6 + }, + { + "argument": { + "end": 2020, + "raw": "26.04", + "start": 2015, + "type": "Literal", + "type": "Literal", + "value": 26.04 + }, + "end": 2020, + "operator": "-", + "start": 2014, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2021, + "start": 2007, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2024, + "start": 2023, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2006, + "name": "lineTo", + "start": 2000, + "type": "Identifier" + }, + "end": 2025, + "start": 2000, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2066, + "raw": "8.4", + "start": 2063, + "type": "Literal", + "type": "Literal", + "value": 8.4 + }, + { + "argument": { + "end": 2074, + "raw": "26.04", + "start": 2069, + "type": "Literal", + "type": "Literal", + "value": 26.04 + }, + "end": 2074, + "operator": "-", + "start": 2068, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2075, + "start": 2062, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2078, + "start": 2077, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2061, + "name": "lineTo", + "start": 2055, + "type": "Identifier" + }, + "end": 2079, + "start": 2055, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2122, + "raw": "8.4", + "start": 2119, + "type": "Literal", + "type": "Literal", + "value": 8.4 + }, + { + "argument": { + "end": 2130, + "raw": "26.88", + "start": 2125, + "type": "Literal", + "type": "Literal", + "value": 26.88 + }, + "end": 2130, + "operator": "-", + "start": 2124, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2131, + "start": 2118, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2134, + "start": 2133, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2117, + "name": "lineTo", + "start": 2111, + "type": "Identifier" + }, + "end": 2135, + "start": 2111, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2178, + "raw": "9.24", + "start": 2174, + "type": "Literal", + "type": "Literal", + "value": 9.24 + }, + { + "argument": { + "end": 2186, + "raw": "26.88", + "start": 2181, + "type": "Literal", + "type": "Literal", + "value": 26.88 + }, + "end": 2186, + "operator": "-", + "start": 2180, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2187, + "start": 2173, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2190, + "start": 2189, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2172, + "name": "lineTo", + "start": 2166, + "type": "Identifier" + }, + "end": 2191, + "start": 2166, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2235, + "raw": "9.24", + "start": 2231, + "type": "Literal", + "type": "Literal", + "value": 9.24 + }, + { + "argument": { + "end": 2243, + "raw": "28.56", + "start": 2238, + "type": "Literal", + "type": "Literal", + "value": 28.56 + }, + "end": 2243, + "operator": "-", + "start": 2237, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2244, + "start": 2230, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2247, + "start": 2246, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2229, + "name": "lineTo", + "start": 2223, + "type": "Identifier" + }, + "end": 2248, + "start": 2223, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2290, + "raw": "4.2", + "start": 2287, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + { + "argument": { + "end": 2298, + "raw": "28.56", + "start": 2293, + "type": "Literal", + "type": "Literal", + "value": 28.56 + }, + "end": 2298, + "operator": "-", + "start": 2292, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2299, + "start": 2286, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2302, + "start": 2301, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2285, + "name": "lineTo", + "start": 2279, + "type": "Identifier" + }, + "end": 2303, + "start": 2279, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2346, + "raw": "4.2", + "start": 2343, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + { + "argument": { + "end": 2354, + "raw": "26.88", + "start": 2349, + "type": "Literal", + "type": "Literal", + "value": 26.88 + }, + "end": 2354, + "operator": "-", + "start": 2348, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2355, + "start": 2342, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2358, + "start": 2357, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2341, + "name": "lineTo", + "start": 2335, + "type": "Identifier" + }, + "end": 2359, + "start": 2335, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2402, + "raw": "5.04", + "start": 2398, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + { + "argument": { + "end": 2410, + "raw": "26.88", + "start": 2405, + "type": "Literal", + "type": "Literal", + "value": 26.88 + }, + "end": 2410, + "operator": "-", + "start": 2404, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2411, + "start": 2397, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2414, + "start": 2413, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2396, + "name": "lineTo", + "start": 2390, + "type": "Identifier" + }, + "end": 2415, + "start": 2390, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2459, + "raw": "5.04", + "start": 2455, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + { + "argument": { + "end": 2467, + "raw": "26.04", + "start": 2462, + "type": "Literal", + "type": "Literal", + "value": 26.04 + }, + "end": 2467, + "operator": "-", + "start": 2461, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2468, + "start": 2454, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2471, + "start": 2470, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2453, + "name": "lineTo", + "start": 2447, + "type": "Identifier" + }, + "end": 2472, + "start": 2447, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2519, + "raw": "0.839996", + "start": 2511, + "type": "Literal", + "type": "Literal", + "value": 0.839996 + }, + { + "argument": { + "end": 2527, + "raw": "20.58", + "start": 2522, + "type": "Literal", + "type": "Literal", + "value": 20.58 + }, + "end": 2527, + "operator": "-", + "start": 2521, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2528, + "start": 2510, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2531, + "start": 2530, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2509, + "name": "lineTo", + "start": 2503, + "type": "Identifier" + }, + "end": 2532, + "start": 2503, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2570, + "raw": "0.839996", + "start": 2562, + "type": "Literal", + "type": "Literal", + "value": 0.839996 + }, + { + "argument": { + "end": 2578, + "raw": "24.36", + "start": 2573, + "type": "Literal", + "type": "Literal", + "value": 24.36 + }, + "end": 2578, + "operator": "-", + "start": 2572, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2579, + "start": 2561, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2582, + "start": 2581, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2560, + "name": "lineTo", + "start": 2554, + "type": "Identifier" + }, + "end": 2583, + "start": 2554, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2626, + "raw": "2.52", + "start": 2622, + "type": "Literal", + "type": "Literal", + "value": 2.52 + }, + { + "argument": { + "end": 2634, + "raw": "24.36", + "start": 2629, + "type": "Literal", + "type": "Literal", + "value": 24.36 + }, + "end": 2634, + "operator": "-", + "start": 2628, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2635, + "start": 2621, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2638, + "start": 2637, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2620, + "name": "lineTo", + "start": 2614, + "type": "Identifier" + }, + "end": 2639, + "start": 2614, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2683, + "raw": "2.52", + "start": 2679, + "type": "Literal", + "type": "Literal", + "value": 2.52 + }, + { + "argument": { + "end": 2690, + "raw": "25.2", + "start": 2686, + "type": "Literal", + "type": "Literal", + "value": 25.2 + }, + "end": 2690, + "operator": "-", + "start": 2685, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2691, + "start": 2678, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2694, + "start": 2693, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2677, + "name": "lineTo", + "start": 2671, + "type": "Identifier" + }, + "end": 2695, + "start": 2671, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2739, + "raw": "18.48", + "start": 2734, + "type": "Literal", + "type": "Literal", + "value": 18.48 + }, + { + "argument": { + "end": 2746, + "raw": "25.2", + "start": 2742, + "type": "Literal", + "type": "Literal", + "value": 25.2 + }, + "end": 2746, + "operator": "-", + "start": 2741, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2747, + "start": 2733, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2750, + "start": 2749, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2732, + "name": "lineTo", + "start": 2726, + "type": "Identifier" + }, + "end": 2751, + "start": 2726, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2796, + "raw": "18.48", + "start": 2791, + "type": "Literal", + "type": "Literal", + "value": 18.48 + }, + { + "argument": { + "end": 2804, + "raw": "24.36", + "start": 2799, + "type": "Literal", + "type": "Literal", + "value": 24.36 + }, + "end": 2804, + "operator": "-", + "start": 2798, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2805, + "start": 2790, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2808, + "start": 2807, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2789, + "name": "lineTo", + "start": 2783, + "type": "Identifier" + }, + "end": 2809, + "start": 2783, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2853, + "raw": "20.16", + "start": 2848, + "type": "Literal", + "type": "Literal", + "value": 20.16 + }, + { + "argument": { + "end": 2861, + "raw": "24.36", + "start": 2856, + "type": "Literal", + "type": "Literal", + "value": 24.36 + }, + "end": 2861, + "operator": "-", + "start": 2855, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2862, + "start": 2847, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2865, + "start": 2864, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2846, + "name": "lineTo", + "start": 2840, + "type": "Identifier" + }, + "end": 2866, + "start": 2840, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2911, + "raw": "20.16", + "start": 2906, + "type": "Literal", + "type": "Literal", + "value": 20.16 + }, + { + "argument": { + "end": 2919, + "raw": "20.58", + "start": 2914, + "type": "Literal", + "type": "Literal", + "value": 20.58 + }, + "end": 2919, + "operator": "-", + "start": 2913, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2920, + "start": 2905, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2923, + "start": 2922, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2904, + "name": "lineTo", + "start": 2898, + "type": "Identifier" + }, + "end": 2924, + "start": 2898, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2984, + "raw": "7.56", + "start": 2980, + "type": "Literal", + "type": "Literal", + "value": 7.56 + }, + { + "argument": { + "end": 2992, + "raw": "24.36", + "start": 2987, + "type": "Literal", + "type": "Literal", + "value": 24.36 + }, + "end": 2992, + "operator": "-", + "start": 2986, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2993, + "start": 2979, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2996, + "start": 2995, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2978, + "name": "lineTo", + "start": 2972, + "type": "Identifier" + }, + "end": 2997, + "start": 2972, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 3031, + "raw": "7.56", + "start": 3027, + "type": "Literal", + "type": "Literal", + "value": 7.56 + }, + { + "argument": { + "end": 3039, + "raw": "22.68", + "start": 3034, + "type": "Literal", + "type": "Literal", + "value": 22.68 + }, + "end": 3039, + "operator": "-", + "start": 3033, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 3040, + "start": 3026, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3043, + "start": 3042, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3025, + "name": "lineTo", + "start": 3019, + "type": "Identifier" + }, + "end": 3044, + "start": 3019, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 3088, + "raw": "13.44", + "start": 3083, + "type": "Literal", + "type": "Literal", + "value": 13.44 + }, + { + "argument": { + "end": 3096, + "raw": "22.68", + "start": 3091, + "type": "Literal", + "type": "Literal", + "value": 22.68 + }, + "end": 3096, + "operator": "-", + "start": 3090, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 3097, + "start": 3082, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3100, + "start": 3099, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3081, + "name": "lineTo", + "start": 3075, + "type": "Identifier" + }, + "end": 3101, + "start": 3075, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 3146, + "raw": "13.44", + "start": 3141, + "type": "Literal", + "type": "Literal", + "value": 13.44 + }, + { + "argument": { + "end": 3154, + "raw": "24.36", + "start": 3149, + "type": "Literal", + "type": "Literal", + "value": 24.36 + }, + "end": 3154, + "operator": "-", + "start": 3148, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 3155, + "start": 3140, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3158, + "start": 3157, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3139, + "name": "lineTo", + "start": 3133, + "type": "Identifier" + }, + "end": 3159, + "start": 3133, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 3202, + "raw": "1.68", + "start": 3198, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + { + "argument": { + "end": 3210, + "raw": "22.68", + "start": 3205, + "type": "Literal", + "type": "Literal", + "value": 22.68 + }, + "end": 3210, + "operator": "-", + "start": 3204, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 3211, + "start": 3197, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3214, + "start": 3213, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3196, + "name": "lineTo", + "start": 3190, + "type": "Identifier" + }, + "end": 3215, + "start": 3190, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 3249, + "raw": "1.68", + "start": 3245, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + { + "argument": { + "end": 3257, + "raw": "21.84", + "start": 3252, + "type": "Literal", + "type": "Literal", + "value": 21.84 + }, + "end": 3257, + "operator": "-", + "start": 3251, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 3258, + "start": 3244, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3261, + "start": 3260, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3243, + "name": "lineTo", + "start": 3237, + "type": "Identifier" + }, + "end": 3262, + "start": 3237, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 3305, + "raw": "5.88", + "start": 3301, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + { + "argument": { + "end": 3313, + "raw": "21.84", + "start": 3308, + "type": "Literal", + "type": "Literal", + "value": 21.84 + }, + "end": 3313, + "operator": "-", + "start": 3307, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 3314, + "start": 3300, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3317, + "start": 3316, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3299, + "name": "lineTo", + "start": 3293, + "type": "Identifier" + }, + "end": 3318, + "start": 3293, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 3362, + "raw": "5.88", + "start": 3358, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + { + "argument": { + "end": 3370, + "raw": "22.68", + "start": 3365, + "type": "Literal", + "type": "Literal", + "value": 22.68 + }, + "end": 3370, + "operator": "-", + "start": 3364, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 3371, + "start": 3357, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3374, + "start": 3373, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3356, + "name": "lineTo", + "start": 3350, + "type": "Identifier" + }, + "end": 3375, + "start": 3350, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 3418, + "raw": "3.36", + "start": 3414, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + { + "argument": { + "end": 3426, + "raw": "24.36", + "start": 3421, + "type": "Literal", + "type": "Literal", + "value": 24.36 + }, + "end": 3426, + "operator": "-", + "start": 3420, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 3427, + "start": 3413, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3430, + "start": 3429, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3412, + "name": "lineTo", + "start": 3406, + "type": "Identifier" + }, + "end": 3431, + "start": 3406, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 3465, + "raw": "3.36", + "start": 3461, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + { + "argument": { + "end": 3473, + "raw": "23.52", + "start": 3468, + "type": "Literal", + "type": "Literal", + "value": 23.52 + }, + "end": 3473, + "operator": "-", + "start": 3467, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 3474, + "start": 3460, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3477, + "start": 3476, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3459, + "name": "lineTo", + "start": 3453, + "type": "Identifier" + }, + "end": 3478, + "start": 3453, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 3521, + "raw": "5.88", + "start": 3517, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + { + "argument": { + "end": 3529, + "raw": "23.52", + "start": 3524, + "type": "Literal", + "type": "Literal", + "value": 23.52 + }, + "end": 3529, + "operator": "-", + "start": 3523, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 3530, + "start": 3516, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3533, + "start": 3532, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3515, + "name": "lineTo", + "start": 3509, + "type": "Identifier" + }, + "end": 3534, + "start": 3509, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 3578, + "raw": "5.88", + "start": 3574, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + { + "argument": { + "end": 3586, + "raw": "24.36", + "start": 3581, + "type": "Literal", + "type": "Literal", + "value": 24.36 + }, + "end": 3586, + "operator": "-", + "start": 3580, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 3587, + "start": 3573, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3590, + "start": 3589, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3572, + "name": "lineTo", + "start": 3566, + "type": "Identifier" + }, + "end": 3591, + "start": 3566, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 3635, + "raw": "15.12", + "start": 3630, + "type": "Literal", + "type": "Literal", + "value": 15.12 + }, + { + "argument": { + "end": 3643, + "raw": "22.68", + "start": 3638, + "type": "Literal", + "type": "Literal", + "value": 22.68 + }, + "end": 3643, + "operator": "-", + "start": 3637, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 3644, + "start": 3629, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3647, + "start": 3646, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3628, + "name": "lineTo", + "start": 3622, + "type": "Identifier" + }, + "end": 3648, + "start": 3622, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 3683, + "raw": "15.12", + "start": 3678, + "type": "Literal", + "type": "Literal", + "value": 15.12 + }, + { + "argument": { + "end": 3691, + "raw": "21.84", + "start": 3686, + "type": "Literal", + "type": "Literal", + "value": 21.84 + }, + "end": 3691, + "operator": "-", + "start": 3685, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 3692, + "start": 3677, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3695, + "start": 3694, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3676, + "name": "lineTo", + "start": 3670, + "type": "Identifier" + }, + "end": 3696, + "start": 3670, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 3753, + "raw": "15.959999999999999", + "start": 3735, + "type": "Literal", + "type": "Literal", + "value": 15.959999999999999 + }, + { + "argument": { + "end": 3761, + "raw": "21.84", + "start": 3756, + "type": "Literal", + "type": "Literal", + "value": 21.84 + }, + "end": 3761, + "operator": "-", + "start": 3755, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 3762, + "start": 3734, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3765, + "start": 3764, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3733, + "name": "lineTo", + "start": 3727, + "type": "Identifier" + }, + "end": 3766, + "start": 3727, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 3824, + "raw": "15.959999999999999", + "start": 3806, + "type": "Literal", + "type": "Literal", + "value": 15.959999999999999 + }, + { + "argument": { + "end": 3832, + "raw": "22.68", + "start": 3827, + "type": "Literal", + "type": "Literal", + "value": 22.68 + }, + "end": 3832, + "operator": "-", + "start": 3826, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 3833, + "start": 3805, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3836, + "start": 3835, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3804, + "name": "lineTo", + "start": 3798, + "type": "Identifier" + }, + "end": 3837, + "start": 3798, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 3880, + "raw": "16.8", + "start": 3876, + "type": "Literal", + "type": "Literal", + "value": 16.8 + }, + { + "argument": { + "end": 3888, + "raw": "22.68", + "start": 3883, + "type": "Literal", + "type": "Literal", + "value": 22.68 + }, + "end": 3888, + "operator": "-", + "start": 3882, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 3889, + "start": 3875, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3892, + "start": 3891, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3874, + "name": "lineTo", + "start": 3868, + "type": "Identifier" + }, + "end": 3893, + "start": 3868, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 3927, + "raw": "16.8", + "start": 3923, + "type": "Literal", + "type": "Literal", + "value": 16.8 + }, + { + "argument": { + "end": 3935, + "raw": "21.84", + "start": 3930, + "type": "Literal", + "type": "Literal", + "value": 21.84 + }, + "end": 3935, + "operator": "-", + "start": 3929, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 3936, + "start": 3922, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3939, + "start": 3938, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3921, + "name": "lineTo", + "start": 3915, + "type": "Identifier" + }, + "end": 3940, + "start": 3915, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 3984, + "raw": "17.64", + "start": 3979, + "type": "Literal", + "type": "Literal", + "value": 17.64 + }, + { + "argument": { + "end": 3992, + "raw": "21.84", + "start": 3987, + "type": "Literal", + "type": "Literal", + "value": 21.84 + }, + "end": 3992, + "operator": "-", + "start": 3986, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 3993, + "start": 3978, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3996, + "start": 3995, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3977, + "name": "lineTo", + "start": 3971, + "type": "Identifier" + }, + "end": 3997, + "start": 3971, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 4042, + "raw": "17.64", + "start": 4037, + "type": "Literal", + "type": "Literal", + "value": 17.64 + }, + { + "argument": { + "end": 4050, + "raw": "22.68", + "start": 4045, + "type": "Literal", + "type": "Literal", + "value": 22.68 + }, + "end": 4050, + "operator": "-", + "start": 4044, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 4051, + "start": 4036, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4054, + "start": 4053, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4035, + "name": "lineTo", + "start": 4029, + "type": "Identifier" + }, + "end": 4055, + "start": 4029, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 4099, + "raw": "18.48", + "start": 4094, + "type": "Literal", + "type": "Literal", + "value": 18.48 + }, + { + "argument": { + "end": 4107, + "raw": "22.68", + "start": 4102, + "type": "Literal", + "type": "Literal", + "value": 22.68 + }, + "end": 4107, + "operator": "-", + "start": 4101, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 4108, + "start": 4093, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4111, + "start": 4110, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4092, + "name": "lineTo", + "start": 4086, + "type": "Identifier" + }, + "end": 4112, + "start": 4086, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 4147, + "raw": "18.48", + "start": 4142, + "type": "Literal", + "type": "Literal", + "value": 18.48 + }, + { + "argument": { + "end": 4155, + "raw": "21.84", + "start": 4150, + "type": "Literal", + "type": "Literal", + "value": 21.84 + }, + "end": 4155, + "operator": "-", + "start": 4149, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 4156, + "start": 4141, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4159, + "start": 4158, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4140, + "name": "lineTo", + "start": 4134, + "type": "Identifier" + }, + "end": 4160, + "start": 4134, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 4204, + "raw": "19.32", + "start": 4199, + "type": "Literal", + "type": "Literal", + "value": 19.32 + }, + { + "argument": { + "end": 4212, + "raw": "21.84", + "start": 4207, + "type": "Literal", + "type": "Literal", + "value": 21.84 + }, + "end": 4212, + "operator": "-", + "start": 4206, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 4213, + "start": 4198, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4216, + "start": 4215, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4197, + "name": "lineTo", + "start": 4191, + "type": "Identifier" + }, + "end": 4217, + "start": 4191, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 4262, + "raw": "19.32", + "start": 4257, + "type": "Literal", + "type": "Literal", + "value": 19.32 + }, + { + "argument": { + "end": 4270, + "raw": "22.68", + "start": 4265, + "type": "Literal", + "type": "Literal", + "value": 22.68 + }, + "end": 4270, + "operator": "-", + "start": 4264, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 4271, + "start": 4256, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4274, + "start": 4273, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4255, + "name": "lineTo", + "start": 4249, + "type": "Identifier" + }, + "end": 4275, + "start": 4249, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 4319, + "raw": "15.12", + "start": 4314, + "type": "Literal", + "type": "Literal", + "value": 15.12 + }, + { + "argument": { + "end": 4327, + "raw": "24.36", + "start": 4322, + "type": "Literal", + "type": "Literal", + "value": 24.36 + }, + "end": 4327, + "operator": "-", + "start": 4321, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 4328, + "start": 4313, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4331, + "start": 4330, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4312, + "name": "lineTo", + "start": 4306, + "type": "Identifier" + }, + "end": 4332, + "start": 4306, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 4367, + "raw": "15.12", + "start": 4362, + "type": "Literal", + "type": "Literal", + "value": 15.12 + }, + { + "argument": { + "end": 4375, + "raw": "23.52", + "start": 4370, + "type": "Literal", + "type": "Literal", + "value": 23.52 + }, + "end": 4375, + "operator": "-", + "start": 4369, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 4376, + "start": 4361, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4379, + "start": 4378, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4360, + "name": "lineTo", + "start": 4354, + "type": "Identifier" + }, + "end": 4380, + "start": 4354, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 4424, + "raw": "17.64", + "start": 4419, + "type": "Literal", + "type": "Literal", + "value": 17.64 + }, + { + "argument": { + "end": 4432, + "raw": "23.52", + "start": 4427, + "type": "Literal", + "type": "Literal", + "value": 23.52 + }, + "end": 4432, + "operator": "-", + "start": 4426, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 4433, + "start": 4418, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4436, + "start": 4435, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4417, + "name": "lineTo", + "start": 4411, + "type": "Identifier" + }, + "end": 4437, + "start": 4411, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 4482, + "raw": "17.64", + "start": 4477, + "type": "Literal", + "type": "Literal", + "value": 17.64 + }, + { + "argument": { + "end": 4490, + "raw": "24.36", + "start": 4485, + "type": "Literal", + "type": "Literal", + "value": 24.36 + }, + "end": 4490, + "operator": "-", + "start": 4484, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 4491, + "start": 4476, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4494, + "start": 4493, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4475, + "name": "lineTo", + "start": 4469, + "type": "Identifier" + }, + "end": 4495, + "start": 4469, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 4539, + "raw": "18.48", + "start": 4534, + "type": "Literal", + "type": "Literal", + "value": 18.48 + }, + { + "argument": { + "end": 4546, + "raw": "5.88", + "start": 4542, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + "end": 4546, + "operator": "-", + "start": 4541, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 4547, + "start": 4533, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4550, + "start": 4549, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4532, + "name": "lineTo", + "start": 4526, + "type": "Identifier" + }, + "end": 4551, + "start": 4526, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 4586, + "raw": "18.48", + "start": 4581, + "type": "Literal", + "type": "Literal", + "value": 18.48 + }, + { + "argument": { + "end": 4593, + "raw": "5.04", + "start": 4589, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 4593, + "operator": "-", + "start": 4588, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 4594, + "start": 4580, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4597, + "start": 4596, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4579, + "name": "lineTo", + "start": 4573, + "type": "Identifier" + }, + "end": 4598, + "start": 4573, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 4641, + "raw": "17.64", + "start": 4636, + "type": "Literal", + "type": "Literal", + "value": 17.64 + }, + { + "argument": { + "end": 4648, + "raw": "5.04", + "start": 4644, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 4648, + "operator": "-", + "start": 4643, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 4649, + "start": 4635, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4652, + "start": 4651, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4634, + "name": "lineTo", + "start": 4628, + "type": "Identifier" + }, + "end": 4653, + "start": 4628, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 4698, + "raw": "17.64", + "start": 4693, + "type": "Literal", + "type": "Literal", + "value": 17.64 + }, + { + "argument": { + "end": 4704, + "raw": "4.2", + "start": 4701, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + "end": 4704, + "operator": "-", + "start": 4700, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 4705, + "start": 4692, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4708, + "start": 4707, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4691, + "name": "lineTo", + "start": 4685, + "type": "Identifier" + }, + "end": 4709, + "start": 4685, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 4751, + "raw": "3.36", + "start": 4747, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + { + "argument": { + "end": 4757, + "raw": "4.2", + "start": 4754, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + "end": 4757, + "operator": "-", + "start": 4753, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 4758, + "start": 4746, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4761, + "start": 4760, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4745, + "name": "lineTo", + "start": 4739, + "type": "Identifier" + }, + "end": 4762, + "start": 4739, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 4806, + "raw": "3.36", + "start": 4802, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + { + "argument": { + "end": 4813, + "raw": "5.04", + "start": 4809, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 4813, + "operator": "-", + "start": 4808, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 4814, + "start": 4801, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4817, + "start": 4816, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4800, + "name": "lineTo", + "start": 4794, + "type": "Identifier" + }, + "end": 4818, + "start": 4794, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 4860, + "raw": "2.52", + "start": 4856, + "type": "Literal", + "type": "Literal", + "value": 2.52 + }, + { + "argument": { + "end": 4867, + "raw": "5.04", + "start": 4863, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 4867, + "operator": "-", + "start": 4862, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 4868, + "start": 4855, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4871, + "start": 4870, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4854, + "name": "lineTo", + "start": 4848, + "type": "Identifier" + }, + "end": 4872, + "start": 4848, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 4916, + "raw": "2.52", + "start": 4912, + "type": "Literal", + "type": "Literal", + "value": 2.52 + }, + { + "argument": { + "end": 4923, + "raw": "5.88", + "start": 4919, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + "end": 4923, + "operator": "-", + "start": 4918, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 4924, + "start": 4911, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4927, + "start": 4926, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4910, + "name": "lineTo", + "start": 4904, + "type": "Identifier" + }, + "end": 4928, + "start": 4904, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 4970, + "raw": "1.68", + "start": 4966, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + { + "argument": { + "end": 4977, + "raw": "5.88", + "start": 4973, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + "end": 4977, + "operator": "-", + "start": 4972, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 4978, + "start": 4965, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4981, + "start": 4980, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4964, + "name": "lineTo", + "start": 4958, + "type": "Identifier" + }, + "end": 4982, + "start": 4958, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5026, + "raw": "1.68", + "start": 5022, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + { + "argument": { + "end": 5033, + "raw": "6.72", + "start": 5029, + "type": "Literal", + "type": "Literal", + "value": 6.72 + }, + "end": 5033, + "operator": "-", + "start": 5028, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 5034, + "start": 5021, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5037, + "start": 5036, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5020, + "name": "lineTo", + "start": 5014, + "type": "Identifier" + }, + "end": 5038, + "start": 5014, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5084, + "raw": "0.839996", + "start": 5076, + "type": "Literal", + "type": "Literal", + "value": 0.839996 + }, + { + "argument": { + "end": 5091, + "raw": "6.72", + "start": 5087, + "type": "Literal", + "type": "Literal", + "value": 6.72 + }, + "end": 5091, + "operator": "-", + "start": 5086, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 5092, + "start": 5075, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5095, + "start": 5094, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5074, + "name": "lineTo", + "start": 5068, + "type": "Identifier" + }, + "end": 5096, + "start": 5068, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5144, + "raw": "0.839996", + "start": 5136, + "type": "Literal", + "type": "Literal", + "value": 0.839996 + }, + { + "argument": { + "end": 5150, + "raw": "8.4", + "start": 5147, + "type": "Literal", + "type": "Literal", + "value": 8.4 + }, + "end": 5150, + "operator": "-", + "start": 5146, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 5151, + "start": 5135, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5154, + "start": 5153, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5134, + "name": "lineTo", + "start": 5128, + "type": "Identifier" + }, + "end": 5155, + "start": 5128, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5198, + "raw": "20.16", + "start": 5193, + "type": "Literal", + "type": "Literal", + "value": 20.16 + }, + { + "argument": { + "end": 5204, + "raw": "8.4", + "start": 5201, + "type": "Literal", + "type": "Literal", + "value": 8.4 + }, + "end": 5204, + "operator": "-", + "start": 5200, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 5205, + "start": 5192, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5208, + "start": 5207, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5191, + "name": "lineTo", + "start": 5185, + "type": "Identifier" + }, + "end": 5209, + "start": 5185, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5254, + "raw": "20.16", + "start": 5249, + "type": "Literal", + "type": "Literal", + "value": 20.16 + }, + { + "argument": { + "end": 5261, + "raw": "6.72", + "start": 5257, + "type": "Literal", + "type": "Literal", + "value": 6.72 + }, + "end": 5261, + "operator": "-", + "start": 5256, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 5262, + "start": 5248, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5265, + "start": 5264, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5247, + "name": "lineTo", + "start": 5241, + "type": "Identifier" + }, + "end": 5266, + "start": 5241, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5309, + "raw": "19.32", + "start": 5304, + "type": "Literal", + "type": "Literal", + "value": 19.32 + }, + { + "argument": { + "end": 5316, + "raw": "6.72", + "start": 5312, + "type": "Literal", + "type": "Literal", + "value": 6.72 + }, + "end": 5316, + "operator": "-", + "start": 5311, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 5317, + "start": 5303, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5320, + "start": 5319, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5302, + "name": "lineTo", + "start": 5296, + "type": "Identifier" + }, + "end": 5321, + "start": 5296, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5366, + "raw": "19.32", + "start": 5361, + "type": "Literal", + "type": "Literal", + "value": 19.32 + }, + { + "argument": { + "end": 5373, + "raw": "5.88", + "start": 5369, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + "end": 5373, + "operator": "-", + "start": 5368, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 5374, + "start": 5360, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5377, + "start": 5376, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5359, + "name": "lineTo", + "start": 5353, + "type": "Identifier" + }, + "end": 5378, + "start": 5353, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5421, + "raw": "20.16", + "start": 5416, + "type": "Literal", + "type": "Literal", + "value": 20.16 + }, + { + "argument": { + "end": 5428, + "raw": "7.56", + "start": 5424, + "type": "Literal", + "type": "Literal", + "value": 7.56 + }, + "end": 5428, + "operator": "-", + "start": 5423, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 5429, + "start": 5415, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5432, + "start": 5431, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5414, + "name": "lineTo", + "start": 5408, + "type": "Identifier" + }, + "end": 5433, + "start": 5408, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5471, + "raw": "0.839996", + "start": 5463, + "type": "Literal", + "type": "Literal", + "value": 0.839996 + }, + { + "argument": { + "end": 5478, + "raw": "7.56", + "start": 5474, + "type": "Literal", + "type": "Literal", + "value": 7.56 + }, + "end": 5478, + "operator": "-", + "start": 5473, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 5479, + "start": 5462, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5482, + "start": 5481, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5461, + "name": "lineTo", + "start": 5455, + "type": "Identifier" + }, + "end": 5483, + "start": 5455, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5531, + "raw": "0.839996", + "start": 5523, + "type": "Literal", + "type": "Literal", + "value": 0.839996 + }, + { + "argument": { + "end": 5539, + "raw": "19.32", + "start": 5534, + "type": "Literal", + "type": "Literal", + "value": 19.32 + }, + "end": 5539, + "operator": "-", + "start": 5533, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 5540, + "start": 5522, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5543, + "start": 5542, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5521, + "name": "lineTo", + "start": 5515, + "type": "Identifier" + }, + "end": 5544, + "start": 5515, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5587, + "raw": "20.16", + "start": 5582, + "type": "Literal", + "type": "Literal", + "value": 20.16 + }, + { + "argument": { + "end": 5595, + "raw": "19.32", + "start": 5590, + "type": "Literal", + "type": "Literal", + "value": 19.32 + }, + "end": 5595, + "operator": "-", + "start": 5589, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 5596, + "start": 5581, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5599, + "start": 5598, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5580, + "name": "lineTo", + "start": 5574, + "type": "Identifier" + }, + "end": 5600, + "start": 5574, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5644, + "raw": "3.36", + "start": 5640, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + { + "argument": { + "end": 5652, + "raw": "10.08", + "start": 5647, + "type": "Literal", + "type": "Literal", + "value": 10.08 + }, + "end": 5652, + "operator": "-", + "start": 5646, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 5653, + "start": 5639, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5656, + "start": 5655, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5638, + "name": "lineTo", + "start": 5632, + "type": "Identifier" + }, + "end": 5657, + "start": 5632, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5691, + "raw": "3.36", + "start": 5687, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + { + "argument": { + "end": 5701, + "raw": "9.24001", + "start": 5694, + "type": "Literal", + "type": "Literal", + "value": 9.24001 + }, + "end": 5701, + "operator": "-", + "start": 5693, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 5702, + "start": 5686, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5705, + "start": 5704, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5685, + "name": "lineTo", + "start": 5679, + "type": "Identifier" + }, + "end": 5706, + "start": 5679, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5749, + "raw": "17.64", + "start": 5744, + "type": "Literal", + "type": "Literal", + "value": 17.64 + }, + { + "argument": { + "end": 5759, + "raw": "9.24001", + "start": 5752, + "type": "Literal", + "type": "Literal", + "value": 9.24001 + }, + "end": 5759, + "operator": "-", + "start": 5751, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 5760, + "start": 5743, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5763, + "start": 5762, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5742, + "name": "lineTo", + "start": 5736, + "type": "Identifier" + }, + "end": 5764, + "start": 5736, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5809, + "raw": "17.64", + "start": 5804, + "type": "Literal", + "type": "Literal", + "value": 17.64 + }, + { + "argument": { + "end": 5817, + "raw": "10.08", + "start": 5812, + "type": "Literal", + "type": "Literal", + "value": 10.08 + }, + "end": 5817, + "operator": "-", + "start": 5811, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 5818, + "start": 5803, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5821, + "start": 5820, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5802, + "name": "lineTo", + "start": 5796, + "type": "Identifier" + }, + "end": 5822, + "start": 5796, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5865, + "raw": "18.48", + "start": 5860, + "type": "Literal", + "type": "Literal", + "value": 18.48 + }, + { + "argument": { + "end": 5873, + "raw": "10.08", + "start": 5868, + "type": "Literal", + "type": "Literal", + "value": 10.08 + }, + "end": 5873, + "operator": "-", + "start": 5867, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 5874, + "start": 5859, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5877, + "start": 5876, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5858, + "name": "lineTo", + "start": 5852, + "type": "Identifier" + }, + "end": 5878, + "start": 5852, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5923, + "raw": "18.48", + "start": 5918, + "type": "Literal", + "type": "Literal", + "value": 18.48 + }, + { + "argument": { + "end": 5930, + "raw": "16.8", + "start": 5926, + "type": "Literal", + "type": "Literal", + "value": 16.8 + }, + "end": 5930, + "operator": "-", + "start": 5925, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 5931, + "start": 5917, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5934, + "start": 5933, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5916, + "name": "lineTo", + "start": 5910, + "type": "Identifier" + }, + "end": 5935, + "start": 5910, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5979, + "raw": "17.64", + "start": 5974, + "type": "Literal", + "type": "Literal", + "value": 17.64 + }, + { + "argument": { + "end": 5986, + "raw": "16.8", + "start": 5982, + "type": "Literal", + "type": "Literal", + "value": 16.8 + }, + "end": 5986, + "operator": "-", + "start": 5981, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 5987, + "start": 5973, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5990, + "start": 5989, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5972, + "name": "lineTo", + "start": 5966, + "type": "Identifier" + }, + "end": 5991, + "start": 5966, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 6036, + "raw": "17.64", + "start": 6031, + "type": "Literal", + "type": "Literal", + "value": 17.64 + }, + { + "argument": { + "end": 6044, + "raw": "17.64", + "start": 6039, + "type": "Literal", + "type": "Literal", + "value": 17.64 + }, + "end": 6044, + "operator": "-", + "start": 6038, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 6045, + "start": 6030, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6048, + "start": 6047, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6029, + "name": "lineTo", + "start": 6023, + "type": "Identifier" + }, + "end": 6049, + "start": 6023, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 6092, + "raw": "3.36", + "start": 6088, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + { + "argument": { + "end": 6100, + "raw": "17.64", + "start": 6095, + "type": "Literal", + "type": "Literal", + "value": 17.64 + }, + "end": 6100, + "operator": "-", + "start": 6094, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 6101, + "start": 6087, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6104, + "start": 6103, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6086, + "name": "lineTo", + "start": 6080, + "type": "Identifier" + }, + "end": 6105, + "start": 6080, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 6149, + "raw": "3.36", + "start": 6145, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + { + "argument": { + "end": 6156, + "raw": "16.8", + "start": 6152, + "type": "Literal", + "type": "Literal", + "value": 16.8 + }, + "end": 6156, + "operator": "-", + "start": 6151, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 6157, + "start": 6144, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6160, + "start": 6159, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6143, + "name": "lineTo", + "start": 6137, + "type": "Identifier" + }, + "end": 6161, + "start": 6137, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 6203, + "raw": "2.52", + "start": 6199, + "type": "Literal", + "type": "Literal", + "value": 2.52 + }, + { + "argument": { + "end": 6210, + "raw": "16.8", + "start": 6206, + "type": "Literal", + "type": "Literal", + "value": 16.8 + }, + "end": 6210, + "operator": "-", + "start": 6205, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 6211, + "start": 6198, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6214, + "start": 6213, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6197, + "name": "lineTo", + "start": 6191, + "type": "Identifier" + }, + "end": 6215, + "start": 6191, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 6259, + "raw": "2.52", + "start": 6255, + "type": "Literal", + "type": "Literal", + "value": 2.52 + }, + { + "argument": { + "end": 6280, + "raw": "10.080000000000002", + "start": 6262, + "type": "Literal", + "type": "Literal", + "value": 10.080000000000002 + }, + "end": 6280, + "operator": "-", + "start": 6261, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 6281, + "start": 6254, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6284, + "start": 6283, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6253, + "name": "lineTo", + "start": 6247, + "type": "Identifier" + }, + "end": 6285, + "start": 6247, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 6329, + "raw": "13.44", + "start": 6324, + "type": "Literal", + "type": "Literal", + "value": 13.44 + }, + { + "argument": { + "end": 6337, + "raw": "10.92", + "start": 6332, + "type": "Literal", + "type": "Literal", + "value": 10.92 + }, + "end": 6337, + "operator": "-", + "start": 6331, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 6338, + "start": 6323, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6341, + "start": 6340, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6322, + "name": "lineTo", + "start": 6316, + "type": "Identifier" + }, + "end": 6342, + "start": 6316, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 6377, + "raw": "13.44", + "start": 6372, + "type": "Literal", + "type": "Literal", + "value": 13.44 + }, + { + "argument": { + "end": 6385, + "raw": "10.08", + "start": 6380, + "type": "Literal", + "type": "Literal", + "value": 10.08 + }, + "end": 6385, + "operator": "-", + "start": 6379, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 6386, + "start": 6371, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6389, + "start": 6388, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6370, + "name": "lineTo", + "start": 6364, + "type": "Identifier" + }, + "end": 6390, + "start": 6364, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 6434, + "raw": "15.12", + "start": 6429, + "type": "Literal", + "type": "Literal", + "value": 15.12 + }, + { + "argument": { + "end": 6442, + "raw": "10.08", + "start": 6437, + "type": "Literal", + "type": "Literal", + "value": 10.08 + }, + "end": 6442, + "operator": "-", + "start": 6436, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 6443, + "start": 6428, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6446, + "start": 6445, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6427, + "name": "lineTo", + "start": 6421, + "type": "Identifier" + }, + "end": 6447, + "start": 6421, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 6492, + "raw": "15.12", + "start": 6487, + "type": "Literal", + "type": "Literal", + "value": 15.12 + }, + { + "argument": { + "end": 6500, + "raw": "13.44", + "start": 6495, + "type": "Literal", + "type": "Literal", + "value": 13.44 + }, + "end": 6500, + "operator": "-", + "start": 6494, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 6501, + "start": 6486, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6504, + "start": 6503, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6485, + "name": "lineTo", + "start": 6479, + "type": "Identifier" + }, + "end": 6505, + "start": 6479, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 6549, + "raw": "14.28", + "start": 6544, + "type": "Literal", + "type": "Literal", + "value": 14.28 + }, + { + "argument": { + "end": 6557, + "raw": "13.44", + "start": 6552, + "type": "Literal", + "type": "Literal", + "value": 13.44 + }, + "end": 6557, + "operator": "-", + "start": 6551, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 6558, + "start": 6543, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6561, + "start": 6560, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6542, + "name": "lineTo", + "start": 6536, + "type": "Identifier" + }, + "end": 6562, + "start": 6536, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 6606, + "raw": "9.24", + "start": 6602, + "type": "Literal", + "type": "Literal", + "value": 9.24 + }, + { + "argument": { + "end": 6614, + "raw": "13.44", + "start": 6609, + "type": "Literal", + "type": "Literal", + "value": 13.44 + }, + "end": 6614, + "operator": "-", + "start": 6608, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 6615, + "start": 6601, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6618, + "start": 6617, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6600, + "name": "lineTo", + "start": 6594, + "type": "Identifier" + }, + "end": 6619, + "start": 6594, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 6654, + "raw": "11.76", + "start": 6649, + "type": "Literal", + "type": "Literal", + "value": 11.76 + }, + { + "argument": { + "end": 6662, + "raw": "13.44", + "start": 6657, + "type": "Literal", + "type": "Literal", + "value": 13.44 + }, + "end": 6662, + "operator": "-", + "start": 6656, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 6663, + "start": 6648, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6666, + "start": 6665, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6647, + "name": "lineTo", + "start": 6641, + "type": "Identifier" + }, + "end": 6667, + "start": 6641, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 6712, + "raw": "11.76", + "start": 6707, + "type": "Literal", + "type": "Literal", + "value": 11.76 + }, + { + "argument": { + "end": 6720, + "raw": "14.28", + "start": 6715, + "type": "Literal", + "type": "Literal", + "value": 14.28 + }, + "end": 6720, + "operator": "-", + "start": 6714, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 6721, + "start": 6706, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6724, + "start": 6723, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6705, + "name": "lineTo", + "start": 6699, + "type": "Identifier" + }, + "end": 6725, + "start": 6699, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 6769, + "raw": "10.92", + "start": 6764, + "type": "Literal", + "type": "Literal", + "value": 10.92 + }, + { + "argument": { + "end": 6777, + "raw": "14.28", + "start": 6772, + "type": "Literal", + "type": "Literal", + "value": 14.28 + }, + "end": 6777, + "operator": "-", + "start": 6771, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 6778, + "start": 6763, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6781, + "start": 6780, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6762, + "name": "lineTo", + "start": 6756, + "type": "Identifier" + }, + "end": 6782, + "start": 6756, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 6832, + "raw": "10.92", + "start": 6827, + "type": "Literal", + "type": "Literal", + "value": 10.92 + }, + { + "argument": { + "end": 6853, + "raw": "15.959999999999999", + "start": 6835, + "type": "Literal", + "type": "Literal", + "value": 15.959999999999999 + }, + "end": 6853, + "operator": "-", + "start": 6834, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 6854, + "start": 6826, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6857, + "start": 6856, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6825, + "name": "lineTo", + "start": 6819, + "type": "Identifier" + }, + "end": 6858, + "start": 6819, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 6902, + "raw": "13.44", + "start": 6897, + "type": "Literal", + "type": "Literal", + "value": 13.44 + }, + { + "argument": { + "end": 6923, + "raw": "15.959999999999999", + "start": 6905, + "type": "Literal", + "type": "Literal", + "value": 15.959999999999999 + }, + "end": 6923, + "operator": "-", + "start": 6904, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 6924, + "start": 6896, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6927, + "start": 6926, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6895, + "name": "lineTo", + "start": 6889, + "type": "Identifier" + }, + "end": 6928, + "start": 6889, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 6973, + "raw": "13.44", + "start": 6968, + "type": "Literal", + "type": "Literal", + "value": 13.44 + }, + { + "argument": { + "end": 6981, + "raw": "15.12", + "start": 6976, + "type": "Literal", + "type": "Literal", + "value": 15.12 + }, + "end": 6981, + "operator": "-", + "start": 6975, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 6982, + "start": 6967, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6985, + "start": 6984, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6966, + "name": "lineTo", + "start": 6960, + "type": "Identifier" + }, + "end": 6986, + "start": 6960, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 7030, + "raw": "14.28", + "start": 7025, + "type": "Literal", + "type": "Literal", + "value": 14.28 + }, + { + "argument": { + "end": 7038, + "raw": "15.12", + "start": 7033, + "type": "Literal", + "type": "Literal", + "value": 15.12 + }, + "end": 7038, + "operator": "-", + "start": 7032, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 7039, + "start": 7024, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7042, + "start": 7041, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7023, + "name": "lineTo", + "start": 7017, + "type": "Identifier" + }, + "end": 7043, + "start": 7017, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 7088, + "raw": "14.28", + "start": 7083, + "type": "Literal", + "type": "Literal", + "value": 14.28 + }, + { + "argument": { + "end": 7109, + "raw": "15.959999999999999", + "start": 7091, + "type": "Literal", + "type": "Literal", + "value": 15.959999999999999 + }, + "end": 7109, + "operator": "-", + "start": 7090, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 7110, + "start": 7082, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7113, + "start": 7112, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7081, + "name": "lineTo", + "start": 7075, + "type": "Identifier" + }, + "end": 7114, + "start": 7075, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 7158, + "raw": "13.44", + "start": 7153, + "type": "Literal", + "type": "Literal", + "value": 13.44 + }, + { + "argument": { + "end": 7179, + "raw": "15.959999999999999", + "start": 7161, + "type": "Literal", + "type": "Literal", + "value": 15.959999999999999 + }, + "end": 7179, + "operator": "-", + "start": 7160, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 7180, + "start": 7152, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7183, + "start": 7182, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7151, + "name": "lineTo", + "start": 7145, + "type": "Identifier" + }, + "end": 7184, + "start": 7145, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 7229, + "raw": "13.44", + "start": 7224, + "type": "Literal", + "type": "Literal", + "value": 13.44 + }, + { + "argument": { + "end": 7236, + "raw": "16.8", + "start": 7232, + "type": "Literal", + "type": "Literal", + "value": 16.8 + }, + "end": 7236, + "operator": "-", + "start": 7231, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 7237, + "start": 7223, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7240, + "start": 7239, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7222, + "name": "lineTo", + "start": 7216, + "type": "Identifier" + }, + "end": 7241, + "start": 7216, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 7283, + "raw": "7.56", + "start": 7279, + "type": "Literal", + "type": "Literal", + "value": 7.56 + }, + { + "argument": { + "end": 7290, + "raw": "16.8", + "start": 7286, + "type": "Literal", + "type": "Literal", + "value": 16.8 + }, + "end": 7290, + "operator": "-", + "start": 7285, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 7291, + "start": 7278, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7294, + "start": 7293, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7277, + "name": "lineTo", + "start": 7271, + "type": "Identifier" + }, + "end": 7295, + "start": 7271, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 7339, + "raw": "7.56", + "start": 7335, + "type": "Literal", + "type": "Literal", + "value": 7.56 + }, + { + "argument": { + "end": 7347, + "raw": "15.96", + "start": 7342, + "type": "Literal", + "type": "Literal", + "value": 15.96 + }, + "end": 7347, + "operator": "-", + "start": 7341, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 7348, + "start": 7334, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7351, + "start": 7350, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7333, + "name": "lineTo", + "start": 7327, + "type": "Identifier" + }, + "end": 7352, + "start": 7327, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 7394, + "raw": "6.72", + "start": 7390, + "type": "Literal", + "type": "Literal", + "value": 6.72 + }, + { + "argument": { + "end": 7402, + "raw": "15.96", + "start": 7397, + "type": "Literal", + "type": "Literal", + "value": 15.96 + }, + "end": 7402, + "operator": "-", + "start": 7396, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 7403, + "start": 7389, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7406, + "start": 7405, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7388, + "name": "lineTo", + "start": 7382, + "type": "Identifier" + }, + "end": 7407, + "start": 7382, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 7451, + "raw": "6.72", + "start": 7447, + "type": "Literal", + "type": "Literal", + "value": 6.72 + }, + { + "argument": { + "end": 7472, + "raw": "15.120000000000001", + "start": 7454, + "type": "Literal", + "type": "Literal", + "value": 15.120000000000001 + }, + "end": 7472, + "operator": "-", + "start": 7453, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 7473, + "start": 7446, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7476, + "start": 7475, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7445, + "name": "lineTo", + "start": 7439, + "type": "Identifier" + }, + "end": 7477, + "start": 7439, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 7520, + "raw": "7.56", + "start": 7516, + "type": "Literal", + "type": "Literal", + "value": 7.56 + }, + { + "argument": { + "end": 7541, + "raw": "15.120000000000001", + "start": 7523, + "type": "Literal", + "type": "Literal", + "value": 15.120000000000001 + }, + "end": 7541, + "operator": "-", + "start": 7522, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 7542, + "start": 7515, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7545, + "start": 7544, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7514, + "name": "lineTo", + "start": 7508, + "type": "Identifier" + }, + "end": 7546, + "start": 7508, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 7590, + "raw": "7.56", + "start": 7586, + "type": "Literal", + "type": "Literal", + "value": 7.56 + }, + { + "argument": { + "end": 7598, + "raw": "15.96", + "start": 7593, + "type": "Literal", + "type": "Literal", + "value": 15.96 + }, + "end": 7598, + "operator": "-", + "start": 7592, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 7599, + "start": 7585, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7602, + "start": 7601, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7584, + "name": "lineTo", + "start": 7578, + "type": "Identifier" + }, + "end": 7603, + "start": 7578, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 7647, + "raw": "10.08", + "start": 7642, + "type": "Literal", + "type": "Literal", + "value": 10.08 + }, + { + "argument": { + "end": 7655, + "raw": "15.96", + "start": 7650, + "type": "Literal", + "type": "Literal", + "value": 15.96 + }, + "end": 7655, + "operator": "-", + "start": 7649, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 7656, + "start": 7641, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7659, + "start": 7658, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7640, + "name": "lineTo", + "start": 7634, + "type": "Identifier" + }, + "end": 7660, + "start": 7634, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 7705, + "raw": "10.08", + "start": 7700, + "type": "Literal", + "type": "Literal", + "value": 10.08 + }, + { + "argument": { + "end": 7713, + "raw": "14.28", + "start": 7708, + "type": "Literal", + "type": "Literal", + "value": 14.28 + }, + "end": 7713, + "operator": "-", + "start": 7707, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 7714, + "start": 7699, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7717, + "start": 7716, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7698, + "name": "lineTo", + "start": 7692, + "type": "Identifier" + }, + "end": 7718, + "start": 7692, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 7760, + "raw": "9.24", + "start": 7756, + "type": "Literal", + "type": "Literal", + "value": 9.24 + }, + { + "argument": { + "end": 7768, + "raw": "14.28", + "start": 7763, + "type": "Literal", + "type": "Literal", + "value": 14.28 + }, + "end": 7768, + "operator": "-", + "start": 7762, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 7769, + "start": 7755, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7772, + "start": 7771, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7754, + "name": "lineTo", + "start": 7748, + "type": "Identifier" + }, + "end": 7773, + "start": 7748, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 7817, + "raw": "7.56", + "start": 7813, + "type": "Literal", + "type": "Literal", + "value": 7.56 + }, + { + "argument": { + "end": 7824, + "raw": "12.6", + "start": 7820, + "type": "Literal", + "type": "Literal", + "value": 12.6 + }, + "end": 7824, + "operator": "-", + "start": 7819, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 7825, + "start": 7812, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7828, + "start": 7827, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7811, + "name": "lineTo", + "start": 7805, + "type": "Identifier" + }, + "end": 7829, + "start": 7805, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 7863, + "raw": "7.56", + "start": 7859, + "type": "Literal", + "type": "Literal", + "value": 7.56 + }, + { + "argument": { + "end": 7871, + "raw": "11.76", + "start": 7866, + "type": "Literal", + "type": "Literal", + "value": 11.76 + }, + "end": 7871, + "operator": "-", + "start": 7865, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 7872, + "start": 7858, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7875, + "start": 7874, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7857, + "name": "lineTo", + "start": 7851, + "type": "Identifier" + }, + "end": 7876, + "start": 7851, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 7918, + "raw": "5.04", + "start": 7914, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + { + "argument": { + "end": 7926, + "raw": "11.76", + "start": 7921, + "type": "Literal", + "type": "Literal", + "value": 11.76 + }, + "end": 7926, + "operator": "-", + "start": 7920, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 7927, + "start": 7913, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7930, + "start": 7929, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7912, + "name": "lineTo", + "start": 7906, + "type": "Identifier" + }, + "end": 7931, + "start": 7906, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 7975, + "raw": "5.04", + "start": 7971, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + { + "argument": { + "end": 7982, + "raw": "12.6", + "start": 7978, + "type": "Literal", + "type": "Literal", + "value": 12.6 + }, + "end": 7982, + "operator": "-", + "start": 7977, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 7983, + "start": 7970, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7986, + "start": 7985, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7969, + "name": "lineTo", + "start": 7963, + "type": "Identifier" + }, + "end": 7987, + "start": 7963, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 8028, + "raw": "4.2", + "start": 8025, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + { + "argument": { + "end": 8035, + "raw": "12.6", + "start": 8031, + "type": "Literal", + "type": "Literal", + "value": 12.6 + }, + "end": 8035, + "operator": "-", + "start": 8030, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 8036, + "start": 8024, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8039, + "start": 8038, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8023, + "name": "lineTo", + "start": 8017, + "type": "Identifier" + }, + "end": 8040, + "start": 8017, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 8083, + "raw": "4.2", + "start": 8080, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + { + "argument": { + "end": 8091, + "raw": "11.76", + "start": 8086, + "type": "Literal", + "type": "Literal", + "value": 11.76 + }, + "end": 8091, + "operator": "-", + "start": 8085, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 8092, + "start": 8079, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8095, + "start": 8094, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8078, + "name": "lineTo", + "start": 8072, + "type": "Identifier" + }, + "end": 8096, + "start": 8072, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 8139, + "raw": "5.04", + "start": 8135, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + { + "argument": { + "end": 8147, + "raw": "11.76", + "start": 8142, + "type": "Literal", + "type": "Literal", + "value": 11.76 + }, + "end": 8147, + "operator": "-", + "start": 8141, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 8148, + "start": 8134, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8151, + "start": 8150, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8133, + "name": "lineTo", + "start": 8127, + "type": "Identifier" + }, + "end": 8152, + "start": 8127, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 8196, + "raw": "5.04", + "start": 8192, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + { + "argument": { + "end": 8204, + "raw": "10.92", + "start": 8199, + "type": "Literal", + "type": "Literal", + "value": 10.92 + }, + "end": 8204, + "operator": "-", + "start": 8198, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 8205, + "start": 8191, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8208, + "start": 8207, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8190, + "name": "lineTo", + "start": 8184, + "type": "Identifier" + }, + "end": 8209, + "start": 8184, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 8266, + "raw": "7.5600000000000005", + "start": 8248, + "type": "Literal", + "type": "Literal", + "value": 7.5600000000000005 + }, + { + "argument": { + "end": 8274, + "raw": "10.92", + "start": 8269, + "type": "Literal", + "type": "Literal", + "value": 10.92 + }, + "end": 8274, + "operator": "-", + "start": 8268, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 8275, + "start": 8247, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8278, + "start": 8277, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8246, + "name": "lineTo", + "start": 8240, + "type": "Identifier" + }, + "end": 8279, + "start": 8240, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 8337, + "raw": "7.5600000000000005", + "start": 8319, + "type": "Literal", + "type": "Literal", + "value": 7.5600000000000005 + }, + { + "argument": { + "end": 8345, + "raw": "11.76", + "start": 8340, + "type": "Literal", + "type": "Literal", + "value": 11.76 + }, + "end": 8345, + "operator": "-", + "start": 8339, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 8346, + "start": 8318, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8349, + "start": 8348, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8317, + "name": "lineTo", + "start": 8311, + "type": "Identifier" + }, + "end": 8350, + "start": 8311, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 8392, + "raw": "8.4", + "start": 8389, + "type": "Literal", + "type": "Literal", + "value": 8.4 + }, + { + "argument": { + "end": 8400, + "raw": "11.76", + "start": 8395, + "type": "Literal", + "type": "Literal", + "value": 11.76 + }, + "end": 8400, + "operator": "-", + "start": 8394, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 8401, + "start": 8388, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8404, + "start": 8403, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8387, + "name": "lineTo", + "start": 8381, + "type": "Identifier" + }, + "end": 8405, + "start": 8381, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 8448, + "raw": "8.4", + "start": 8445, + "type": "Literal", + "type": "Literal", + "value": 8.4 + }, + { + "argument": { + "end": 8455, + "raw": "12.6", + "start": 8451, + "type": "Literal", + "type": "Literal", + "value": 12.6 + }, + "end": 8455, + "operator": "-", + "start": 8450, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 8456, + "start": 8444, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8459, + "start": 8458, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8443, + "name": "lineTo", + "start": 8437, + "type": "Identifier" + }, + "end": 8460, + "start": 8437, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 8503, + "raw": "3.36", + "start": 8499, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + { + "argument": { + "end": 8510, + "raw": "5.88", + "start": 8506, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + "end": 8510, + "operator": "-", + "start": 8505, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 8511, + "start": 8498, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8514, + "start": 8513, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8497, + "name": "lineTo", + "start": 8491, + "type": "Identifier" + }, + "end": 8515, + "start": 8491, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 8549, + "raw": "3.36", + "start": 8545, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + { + "argument": { + "end": 8556, + "raw": "5.04", + "start": 8552, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 8556, + "operator": "-", + "start": 8551, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 8557, + "start": 8544, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8560, + "start": 8559, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8543, + "name": "lineTo", + "start": 8537, + "type": "Identifier" + }, + "end": 8561, + "start": 8537, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 8602, + "raw": "4.2", + "start": 8599, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + { + "argument": { + "end": 8609, + "raw": "5.04", + "start": 8605, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 8609, + "operator": "-", + "start": 8604, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 8610, + "start": 8598, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8613, + "start": 8612, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8597, + "name": "lineTo", + "start": 8591, + "type": "Identifier" + }, + "end": 8614, + "start": 8591, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 8657, + "raw": "4.2", + "start": 8654, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + { + "argument": { + "end": 8664, + "raw": "3.36", + "start": 8660, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + "end": 8664, + "operator": "-", + "start": 8659, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 8665, + "start": 8653, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8668, + "start": 8667, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8652, + "name": "lineTo", + "start": 8646, + "type": "Identifier" + }, + "end": 8669, + "start": 8646, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 8711, + "raw": "5.04", + "start": 8707, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + { + "argument": { + "end": 8718, + "raw": "3.36", + "start": 8714, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + "end": 8718, + "operator": "-", + "start": 8713, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 8719, + "start": 8706, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8722, + "start": 8721, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8705, + "name": "lineTo", + "start": 8699, + "type": "Identifier" + }, + "end": 8723, + "start": 8699, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 8767, + "raw": "5.04", + "start": 8763, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + { + "argument": { + "end": 8774, + "raw": "1.68", + "start": 8770, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + "end": 8774, + "operator": "-", + "start": 8769, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 8775, + "start": 8762, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8778, + "start": 8777, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8761, + "name": "lineTo", + "start": 8755, + "type": "Identifier" + }, + "end": 8779, + "start": 8755, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 8821, + "raw": "5.88", + "start": 8817, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + { + "argument": { + "end": 8828, + "raw": "1.68", + "start": 8824, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + "end": 8828, + "operator": "-", + "start": 8823, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 8829, + "start": 8816, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8832, + "start": 8831, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8815, + "name": "lineTo", + "start": 8809, + "type": "Identifier" + }, + "end": 8833, + "start": 8809, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 8877, + "raw": "5.88", + "start": 8873, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + { + "argument": { + "end": 8890, + "raw": "0.83999599", + "start": 8880, + "type": "Literal", + "type": "Literal", + "value": 0.83999599 + }, + "end": 8890, + "operator": "-", + "start": 8879, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 8891, + "start": 8872, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8894, + "start": 8893, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8871, + "name": "lineTo", + "start": 8865, + "type": "Identifier" + }, + "end": 8895, + "start": 8865, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 8937, + "raw": "6.72", + "start": 8933, + "type": "Literal", + "type": "Literal", + "value": 6.72 + }, + { + "argument": { + "end": 8950, + "raw": "0.83999599", + "start": 8940, + "type": "Literal", + "type": "Literal", + "value": 0.83999599 + }, + "end": 8950, + "operator": "-", + "start": 8939, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 8951, + "start": 8932, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8954, + "start": 8953, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8931, + "name": "lineTo", + "start": 8925, + "type": "Identifier" + }, + "end": 8955, + "start": 8925, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 8999, + "raw": "6.72", + "start": 8995, + "type": "Literal", + "type": "Literal", + "value": 6.72 + }, + { + "argument": { + "end": 9006, + "raw": "1.68", + "start": 9002, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + "end": 9006, + "operator": "-", + "start": 9001, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 9007, + "start": 8994, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9010, + "start": 9009, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8993, + "name": "lineTo", + "start": 8987, + "type": "Identifier" + }, + "end": 9011, + "start": 8987, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 9053, + "raw": "7.56", + "start": 9049, + "type": "Literal", + "type": "Literal", + "value": 7.56 + }, + { + "argument": { + "end": 9060, + "raw": "1.68", + "start": 9056, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + "end": 9060, + "operator": "-", + "start": 9055, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 9061, + "start": 9048, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9064, + "start": 9063, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9047, + "name": "lineTo", + "start": 9041, + "type": "Identifier" + }, + "end": 9065, + "start": 9041, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 9109, + "raw": "7.56", + "start": 9105, + "type": "Literal", + "type": "Literal", + "value": 7.56 + }, + { + "argument": { + "end": 9116, + "raw": "3.36", + "start": 9112, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + "end": 9116, + "operator": "-", + "start": 9111, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 9117, + "start": 9104, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9120, + "start": 9119, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9103, + "name": "lineTo", + "start": 9097, + "type": "Identifier" + }, + "end": 9121, + "start": 9097, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 9162, + "raw": "8.4", + "start": 9159, + "type": "Literal", + "type": "Literal", + "value": 8.4 + }, + { + "argument": { + "end": 9169, + "raw": "3.36", + "start": 9165, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + "end": 9169, + "operator": "-", + "start": 9164, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 9170, + "start": 9158, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9173, + "start": 9172, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9157, + "name": "lineTo", + "start": 9151, + "type": "Identifier" + }, + "end": 9174, + "start": 9151, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 9217, + "raw": "8.4", + "start": 9214, + "type": "Literal", + "type": "Literal", + "value": 8.4 + }, + { + "argument": { + "end": 9224, + "raw": "5.04", + "start": 9220, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 9224, + "operator": "-", + "start": 9219, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 9225, + "start": 9213, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9228, + "start": 9227, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9212, + "name": "lineTo", + "start": 9206, + "type": "Identifier" + }, + "end": 9229, + "start": 9206, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 9272, + "raw": "9.24", + "start": 9268, + "type": "Literal", + "type": "Literal", + "value": 9.24 + }, + { + "argument": { + "end": 9279, + "raw": "5.04", + "start": 9275, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 9279, + "operator": "-", + "start": 9274, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 9280, + "start": 9267, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9283, + "start": 9282, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9266, + "name": "lineTo", + "start": 9260, + "type": "Identifier" + }, + "end": 9284, + "start": 9260, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 9328, + "raw": "9.24", + "start": 9324, + "type": "Literal", + "type": "Literal", + "value": 9.24 + }, + { + "argument": { + "end": 9335, + "raw": "5.88", + "start": 9331, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + "end": 9335, + "operator": "-", + "start": 9330, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 9336, + "start": 9323, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9339, + "start": 9338, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9322, + "name": "lineTo", + "start": 9316, + "type": "Identifier" + }, + "end": 9340, + "start": 9316, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 9384, + "raw": "17.64", + "start": 9379, + "type": "Literal", + "type": "Literal", + "value": 17.64 + }, + { + "argument": { + "end": 9391, + "raw": "5.04", + "start": 9387, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 9391, + "operator": "-", + "start": 9386, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 9392, + "start": 9378, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9395, + "start": 9394, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9377, + "name": "lineTo", + "start": 9371, + "type": "Identifier" + }, + "end": 9396, + "start": 9371, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 9431, + "raw": "17.64", + "start": 9426, + "type": "Literal", + "type": "Literal", + "value": 17.64 + }, + { + "argument": { + "end": 9438, + "raw": "5.88", + "start": 9434, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + "end": 9438, + "operator": "-", + "start": 9433, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 9439, + "start": 9425, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9442, + "start": 9441, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9424, + "name": "lineTo", + "start": 9418, + "type": "Identifier" + }, + "end": 9443, + "start": 9418, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 9486, + "raw": "11.76", + "start": 9481, + "type": "Literal", + "type": "Literal", + "value": 11.76 + }, + { + "argument": { + "end": 9493, + "raw": "5.88", + "start": 9489, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + "end": 9493, + "operator": "-", + "start": 9488, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 9494, + "start": 9480, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9497, + "start": 9496, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9479, + "name": "lineTo", + "start": 9473, + "type": "Identifier" + }, + "end": 9498, + "start": 9473, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 9543, + "raw": "11.76", + "start": 9538, + "type": "Literal", + "type": "Literal", + "value": 11.76 + }, + { + "argument": { + "end": 9550, + "raw": "5.04", + "start": 9546, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 9550, + "operator": "-", + "start": 9545, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 9551, + "start": 9537, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9554, + "start": 9553, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9536, + "name": "lineTo", + "start": 9530, + "type": "Identifier" + }, + "end": 9555, + "start": 9530, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 9597, + "raw": "12.6", + "start": 9593, + "type": "Literal", + "type": "Literal", + "value": 12.6 + }, + { + "argument": { + "end": 9604, + "raw": "5.04", + "start": 9600, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 9604, + "operator": "-", + "start": 9599, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 9605, + "start": 9592, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9608, + "start": 9607, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9591, + "name": "lineTo", + "start": 9585, + "type": "Identifier" + }, + "end": 9609, + "start": 9585, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 9653, + "raw": "12.6", + "start": 9649, + "type": "Literal", + "type": "Literal", + "value": 12.6 + }, + { + "argument": { + "end": 9660, + "raw": "3.36", + "start": 9656, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + "end": 9660, + "operator": "-", + "start": 9655, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 9661, + "start": 9648, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9664, + "start": 9663, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9647, + "name": "lineTo", + "start": 9641, + "type": "Identifier" + }, + "end": 9665, + "start": 9641, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 9708, + "raw": "13.44", + "start": 9703, + "type": "Literal", + "type": "Literal", + "value": 13.44 + }, + { + "argument": { + "end": 9715, + "raw": "3.36", + "start": 9711, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + "end": 9715, + "operator": "-", + "start": 9710, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 9716, + "start": 9702, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9719, + "start": 9718, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9701, + "name": "lineTo", + "start": 9695, + "type": "Identifier" + }, + "end": 9720, + "start": 9695, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 9765, + "raw": "13.44", + "start": 9760, + "type": "Literal", + "type": "Literal", + "value": 13.44 + }, + { + "argument": { + "end": 9772, + "raw": "1.68", + "start": 9768, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + "end": 9772, + "operator": "-", + "start": 9767, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 9773, + "start": 9759, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9776, + "start": 9775, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9758, + "name": "lineTo", + "start": 9752, + "type": "Identifier" + }, + "end": 9777, + "start": 9752, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 9820, + "raw": "14.28", + "start": 9815, + "type": "Literal", + "type": "Literal", + "value": 14.28 + }, + { + "argument": { + "end": 9827, + "raw": "1.68", + "start": 9823, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + "end": 9827, + "operator": "-", + "start": 9822, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 9828, + "start": 9814, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9831, + "start": 9830, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9813, + "name": "lineTo", + "start": 9807, + "type": "Identifier" + }, + "end": 9832, + "start": 9807, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 9877, + "raw": "14.28", + "start": 9872, + "type": "Literal", + "type": "Literal", + "value": 14.28 + }, + { + "argument": { + "end": 9890, + "raw": "0.83999599", + "start": 9880, + "type": "Literal", + "type": "Literal", + "value": 0.83999599 + }, + "end": 9890, + "operator": "-", + "start": 9879, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 9891, + "start": 9871, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9894, + "start": 9893, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9870, + "name": "lineTo", + "start": 9864, + "type": "Identifier" + }, + "end": 9895, + "start": 9864, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 9938, + "raw": "15.12", + "start": 9933, + "type": "Literal", + "type": "Literal", + "value": 15.12 + }, + { + "argument": { + "end": 9951, + "raw": "0.83999599", + "start": 9941, + "type": "Literal", + "type": "Literal", + "value": 0.83999599 + }, + "end": 9951, + "operator": "-", + "start": 9940, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 9952, + "start": 9932, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9955, + "start": 9954, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9931, + "name": "lineTo", + "start": 9925, + "type": "Identifier" + }, + "end": 9956, + "start": 9925, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 10001, + "raw": "15.12", + "start": 9996, + "type": "Literal", + "type": "Literal", + "value": 15.12 + }, + { + "argument": { + "end": 10008, + "raw": "1.68", + "start": 10004, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + "end": 10008, + "operator": "-", + "start": 10003, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 10009, + "start": 9995, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10012, + "start": 10011, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9994, + "name": "lineTo", + "start": 9988, + "type": "Identifier" + }, + "end": 10013, + "start": 9988, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 10069, + "raw": "15.959999999999999", + "start": 10051, + "type": "Literal", + "type": "Literal", + "value": 15.959999999999999 + }, + { + "argument": { + "end": 10076, + "raw": "1.68", + "start": 10072, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + "end": 10076, + "operator": "-", + "start": 10071, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 10077, + "start": 10050, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10080, + "start": 10079, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10049, + "name": "lineTo", + "start": 10043, + "type": "Identifier" + }, + "end": 10081, + "start": 10043, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 10139, + "raw": "15.959999999999999", + "start": 10121, + "type": "Literal", + "type": "Literal", + "value": 15.959999999999999 + }, + { + "argument": { + "end": 10146, + "raw": "3.36", + "start": 10142, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + "end": 10146, + "operator": "-", + "start": 10141, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 10147, + "start": 10120, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10150, + "start": 10149, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10119, + "name": "lineTo", + "start": 10113, + "type": "Identifier" + }, + "end": 10151, + "start": 10113, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 10194, + "raw": "16.8", + "start": 10190, + "type": "Literal", + "type": "Literal", + "value": 16.8 + }, + { + "argument": { + "end": 10201, + "raw": "3.36", + "start": 10197, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + "end": 10201, + "operator": "-", + "start": 10196, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 10202, + "start": 10189, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10205, + "start": 10204, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10188, + "name": "lineTo", + "start": 10182, + "type": "Identifier" + }, + "end": 10206, + "start": 10182, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 10250, + "raw": "16.8", + "start": 10246, + "type": "Literal", + "type": "Literal", + "value": 16.8 + }, + { + "argument": { + "end": 10257, + "raw": "5.04", + "start": 10253, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 10257, + "operator": "-", + "start": 10252, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 10258, + "start": 10245, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10261, + "start": 10260, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10244, + "name": "lineTo", + "start": 10238, + "type": "Identifier" + }, + "end": 10262, + "start": 10238, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 10306, + "raw": "13.44", + "start": 10301, + "type": "Literal", + "type": "Literal", + "value": 13.44 + }, + { + "argument": { + "end": 10313, + "raw": "1.68", + "start": 10309, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + "end": 10313, + "operator": "-", + "start": 10308, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 10314, + "start": 10300, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10317, + "start": 10316, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10299, + "name": "lineTo", + "start": 10293, + "type": "Identifier" + }, + "end": 10318, + "start": 10293, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 10353, + "raw": "13.44", + "start": 10348, + "type": "Literal", + "type": "Literal", + "value": 13.44 + }, + { + "argument": { + "end": 10357, + "raw": "0", + "start": 10356, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "end": 10357, + "operator": "-", + "start": 10355, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 10358, + "start": 10347, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10361, + "start": 10360, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10346, + "name": "lineTo", + "start": 10340, + "type": "Identifier" + }, + "end": 10362, + "start": 10340, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 10418, + "raw": "15.959999999999999", + "start": 10400, + "type": "Literal", + "type": "Literal", + "value": 15.959999999999999 + }, + { + "argument": { + "end": 10422, + "raw": "0", + "start": 10421, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "end": 10422, + "operator": "-", + "start": 10420, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 10423, + "start": 10399, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10426, + "start": 10425, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10398, + "name": "lineTo", + "start": 10392, + "type": "Identifier" + }, + "end": 10427, + "start": 10392, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 10485, + "raw": "15.959999999999999", + "start": 10467, + "type": "Literal", + "type": "Literal", + "value": 15.959999999999999 + }, + { + "argument": { + "end": 10492, + "raw": "1.68", + "start": 10488, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + "end": 10492, + "operator": "-", + "start": 10487, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 10493, + "start": 10466, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10496, + "start": 10495, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10465, + "name": "lineTo", + "start": 10459, + "type": "Identifier" + }, + "end": 10497, + "start": 10459, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 10540, + "raw": "16.8", + "start": 10536, + "type": "Literal", + "type": "Literal", + "value": 16.8 + }, + { + "argument": { + "end": 10547, + "raw": "1.68", + "start": 10543, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + "end": 10547, + "operator": "-", + "start": 10542, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 10548, + "start": 10535, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10551, + "start": 10550, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10534, + "name": "lineTo", + "start": 10528, + "type": "Identifier" + }, + "end": 10552, + "start": 10528, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 10596, + "raw": "16.8", + "start": 10592, + "type": "Literal", + "type": "Literal", + "value": 16.8 + }, + { + "argument": { + "end": 10603, + "raw": "3.36", + "start": 10599, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + "end": 10603, + "operator": "-", + "start": 10598, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 10604, + "start": 10591, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10607, + "start": 10606, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10590, + "name": "lineTo", + "start": 10584, + "type": "Identifier" + }, + "end": 10608, + "start": 10584, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 10652, + "raw": "17.64", + "start": 10647, + "type": "Literal", + "type": "Literal", + "value": 17.64 + }, + { + "argument": { + "end": 10659, + "raw": "3.36", + "start": 10655, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + "end": 10659, + "operator": "-", + "start": 10654, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 10660, + "start": 10646, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10663, + "start": 10662, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10645, + "name": "lineTo", + "start": 10639, + "type": "Identifier" + }, + "end": 10664, + "start": 10639, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 10709, + "raw": "17.64", + "start": 10704, + "type": "Literal", + "type": "Literal", + "value": 17.64 + }, + { + "argument": { + "end": 10716, + "raw": "4.62", + "start": 10712, + "type": "Literal", + "type": "Literal", + "value": 4.62 + }, + "end": 10716, + "operator": "-", + "start": 10711, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 10717, + "start": 10703, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10720, + "start": 10719, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10702, + "name": "lineTo", + "start": 10696, + "type": "Identifier" + }, + "end": 10721, + "start": 10696, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 10763, + "raw": "16.8", + "start": 10759, + "type": "Literal", + "type": "Literal", + "value": 16.8 + }, + { + "argument": { + "end": 10770, + "raw": "4.62", + "start": 10766, + "type": "Literal", + "type": "Literal", + "value": 4.62 + }, + "end": 10770, + "operator": "-", + "start": 10765, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 10771, + "start": 10758, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10774, + "start": 10773, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10757, + "name": "lineTo", + "start": 10751, + "type": "Identifier" + }, + "end": 10775, + "start": 10751, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 10819, + "raw": "16.8", + "start": 10815, + "type": "Literal", + "type": "Literal", + "value": 16.8 + }, + { + "argument": { + "end": 10826, + "raw": "3.36", + "start": 10822, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + "end": 10826, + "operator": "-", + "start": 10821, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 10827, + "start": 10814, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10830, + "start": 10829, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10813, + "name": "lineTo", + "start": 10807, + "type": "Identifier" + }, + "end": 10831, + "start": 10807, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 10874, + "raw": "15.96", + "start": 10869, + "type": "Literal", + "type": "Literal", + "value": 15.96 + }, + { + "argument": { + "end": 10881, + "raw": "3.36", + "start": 10877, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + "end": 10881, + "operator": "-", + "start": 10876, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 10882, + "start": 10868, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10885, + "start": 10884, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10867, + "name": "lineTo", + "start": 10861, + "type": "Identifier" + }, + "end": 10886, + "start": 10861, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 10931, + "raw": "15.96", + "start": 10926, + "type": "Literal", + "type": "Literal", + "value": 15.96 + }, + { + "argument": { + "end": 10938, + "raw": "1.68", + "start": 10934, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + "end": 10938, + "operator": "-", + "start": 10933, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 10939, + "start": 10925, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10942, + "start": 10941, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10924, + "name": "lineTo", + "start": 10918, + "type": "Identifier" + }, + "end": 10943, + "start": 10918, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 10986, + "raw": "15.12", + "start": 10981, + "type": "Literal", + "type": "Literal", + "value": 15.12 + }, + { + "argument": { + "end": 10993, + "raw": "1.68", + "start": 10989, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + "end": 10993, + "operator": "-", + "start": 10988, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 10994, + "start": 10980, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10997, + "start": 10996, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10979, + "name": "lineTo", + "start": 10973, + "type": "Identifier" + }, + "end": 10998, + "start": 10973, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 11043, + "raw": "15.12", + "start": 11038, + "type": "Literal", + "type": "Literal", + "value": 15.12 + }, + { + "argument": { + "end": 11056, + "raw": "0.83999999", + "start": 11046, + "type": "Literal", + "type": "Literal", + "value": 0.83999999 + }, + "end": 11056, + "operator": "-", + "start": 11045, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 11057, + "start": 11037, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11060, + "start": 11059, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11036, + "name": "lineTo", + "start": 11030, + "type": "Identifier" + }, + "end": 11061, + "start": 11030, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 11104, + "raw": "14.28", + "start": 11099, + "type": "Literal", + "type": "Literal", + "value": 14.28 + }, + { + "argument": { + "end": 11117, + "raw": "0.83999999", + "start": 11107, + "type": "Literal", + "type": "Literal", + "value": 0.83999999 + }, + "end": 11117, + "operator": "-", + "start": 11106, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 11118, + "start": 11098, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11121, + "start": 11120, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11097, + "name": "lineTo", + "start": 11091, + "type": "Identifier" + }, + "end": 11122, + "start": 11091, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 11167, + "raw": "14.28", + "start": 11162, + "type": "Literal", + "type": "Literal", + "value": 14.28 + }, + { + "argument": { + "end": 11174, + "raw": "1.68", + "start": 11170, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + "end": 11174, + "operator": "-", + "start": 11169, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 11175, + "start": 11161, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11178, + "start": 11177, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11160, + "name": "lineTo", + "start": 11154, + "type": "Identifier" + }, + "end": 11179, + "start": 11154, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 11222, + "raw": "13.44", + "start": 11217, + "type": "Literal", + "type": "Literal", + "value": 13.44 + }, + { + "argument": { + "end": 11229, + "raw": "1.68", + "start": 11225, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + "end": 11229, + "operator": "-", + "start": 11224, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 11230, + "start": 11216, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11233, + "start": 11232, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11215, + "name": "lineTo", + "start": 11209, + "type": "Identifier" + }, + "end": 11234, + "start": 11209, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 11279, + "raw": "13.44", + "start": 11274, + "type": "Literal", + "type": "Literal", + "value": 13.44 + }, + { + "argument": { + "end": 11286, + "raw": "3.36", + "start": 11282, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + "end": 11286, + "operator": "-", + "start": 11281, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 11287, + "start": 11273, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11290, + "start": 11289, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11272, + "name": "lineTo", + "start": 11266, + "type": "Identifier" + }, + "end": 11291, + "start": 11266, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 11333, + "raw": "12.6", + "start": 11329, + "type": "Literal", + "type": "Literal", + "value": 12.6 + }, + { + "argument": { + "end": 11340, + "raw": "3.36", + "start": 11336, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + "end": 11340, + "operator": "-", + "start": 11335, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 11341, + "start": 11328, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11344, + "start": 11343, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11327, + "name": "lineTo", + "start": 11321, + "type": "Identifier" + }, + "end": 11345, + "start": 11321, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 11389, + "raw": "12.6", + "start": 11385, + "type": "Literal", + "type": "Literal", + "value": 12.6 + }, + { + "argument": { + "end": 11396, + "raw": "4.62", + "start": 11392, + "type": "Literal", + "type": "Literal", + "value": 4.62 + }, + "end": 11396, + "operator": "-", + "start": 11391, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 11397, + "start": 11384, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11400, + "start": 11399, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11383, + "name": "lineTo", + "start": 11377, + "type": "Identifier" + }, + "end": 11401, + "start": 11377, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 11444, + "raw": "11.76", + "start": 11439, + "type": "Literal", + "type": "Literal", + "value": 11.76 + }, + { + "argument": { + "end": 11451, + "raw": "4.62", + "start": 11447, + "type": "Literal", + "type": "Literal", + "value": 4.62 + }, + "end": 11451, + "operator": "-", + "start": 11446, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 11452, + "start": 11438, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11455, + "start": 11454, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11437, + "name": "lineTo", + "start": 11431, + "type": "Identifier" + }, + "end": 11456, + "start": 11431, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 11501, + "raw": "11.76", + "start": 11496, + "type": "Literal", + "type": "Literal", + "value": 11.76 + }, + { + "argument": { + "end": 11508, + "raw": "3.36", + "start": 11504, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + "end": 11508, + "operator": "-", + "start": 11503, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 11509, + "start": 11495, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11512, + "start": 11511, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11494, + "name": "lineTo", + "start": 11488, + "type": "Identifier" + }, + "end": 11513, + "start": 11488, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 11555, + "raw": "12.6", + "start": 11551, + "type": "Literal", + "type": "Literal", + "value": 12.6 + }, + { + "argument": { + "end": 11562, + "raw": "3.36", + "start": 11558, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + "end": 11562, + "operator": "-", + "start": 11557, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 11563, + "start": 11550, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11566, + "start": 11565, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11549, + "name": "lineTo", + "start": 11543, + "type": "Identifier" + }, + "end": 11567, + "start": 11543, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 11611, + "raw": "12.6", + "start": 11607, + "type": "Literal", + "type": "Literal", + "value": 12.6 + }, + { + "argument": { + "end": 11618, + "raw": "1.68", + "start": 11614, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + "end": 11618, + "operator": "-", + "start": 11613, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 11619, + "start": 11606, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11622, + "start": 11621, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11605, + "name": "lineTo", + "start": 11599, + "type": "Identifier" + }, + "end": 11623, + "start": 11599, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 11665, + "raw": "5.04", + "start": 11661, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + { + "argument": { + "end": 11672, + "raw": "1.68", + "start": 11668, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + "end": 11672, + "operator": "-", + "start": 11667, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 11673, + "start": 11660, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11676, + "start": 11675, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11659, + "name": "lineTo", + "start": 11653, + "type": "Identifier" + }, + "end": 11677, + "start": 11653, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 11711, + "raw": "5.04", + "start": 11707, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + { + "argument": { + "end": 11715, + "raw": "0", + "start": 11714, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "end": 11715, + "operator": "-", + "start": 11713, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 11716, + "start": 11706, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11719, + "start": 11718, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11705, + "name": "lineTo", + "start": 11699, + "type": "Identifier" + }, + "end": 11720, + "start": 11699, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 11762, + "raw": "7.56", + "start": 11758, + "type": "Literal", + "type": "Literal", + "value": 7.56 + }, + { + "argument": { + "end": 11766, + "raw": "0", + "start": 11765, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "end": 11766, + "operator": "-", + "start": 11764, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 11767, + "start": 11757, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11770, + "start": 11769, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11756, + "name": "lineTo", + "start": 11750, + "type": "Identifier" + }, + "end": 11771, + "start": 11750, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 11815, + "raw": "7.56", + "start": 11811, + "type": "Literal", + "type": "Literal", + "value": 7.56 + }, + { + "argument": { + "end": 11822, + "raw": "1.68", + "start": 11818, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + "end": 11822, + "operator": "-", + "start": 11817, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 11823, + "start": 11810, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11826, + "start": 11825, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11809, + "name": "lineTo", + "start": 11803, + "type": "Identifier" + }, + "end": 11827, + "start": 11803, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 11868, + "raw": "8.4", + "start": 11865, + "type": "Literal", + "type": "Literal", + "value": 8.4 + }, + { + "argument": { + "end": 11875, + "raw": "1.68", + "start": 11871, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + "end": 11875, + "operator": "-", + "start": 11870, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 11876, + "start": 11864, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11879, + "start": 11878, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11863, + "name": "lineTo", + "start": 11857, + "type": "Identifier" + }, + "end": 11880, + "start": 11857, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 11923, + "raw": "8.4", + "start": 11920, + "type": "Literal", + "type": "Literal", + "value": 8.4 + }, + { + "argument": { + "end": 11930, + "raw": "3.36", + "start": 11926, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + "end": 11930, + "operator": "-", + "start": 11925, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 11931, + "start": 11919, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11934, + "start": 11933, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11918, + "name": "lineTo", + "start": 11912, + "type": "Identifier" + }, + "end": 11935, + "start": 11912, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 11977, + "raw": "9.24", + "start": 11973, + "type": "Literal", + "type": "Literal", + "value": 9.24 + }, + { + "argument": { + "end": 11984, + "raw": "3.36", + "start": 11980, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + "end": 11984, + "operator": "-", + "start": 11979, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 11985, + "start": 11972, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11988, + "start": 11987, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11971, + "name": "lineTo", + "start": 11965, + "type": "Identifier" + }, + "end": 11989, + "start": 11965, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 12033, + "raw": "9.24", + "start": 12029, + "type": "Literal", + "type": "Literal", + "value": 9.24 + }, + { + "argument": { + "end": 12040, + "raw": "4.62", + "start": 12036, + "type": "Literal", + "type": "Literal", + "value": 4.62 + }, + "end": 12040, + "operator": "-", + "start": 12035, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 12041, + "start": 12028, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12044, + "start": 12043, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12027, + "name": "lineTo", + "start": 12021, + "type": "Identifier" + }, + "end": 12045, + "start": 12021, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 12086, + "raw": "8.4", + "start": 12083, + "type": "Literal", + "type": "Literal", + "value": 8.4 + }, + { + "argument": { + "end": 12093, + "raw": "4.62", + "start": 12089, + "type": "Literal", + "type": "Literal", + "value": 4.62 + }, + "end": 12093, + "operator": "-", + "start": 12088, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 12094, + "start": 12082, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12097, + "start": 12096, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12081, + "name": "lineTo", + "start": 12075, + "type": "Identifier" + }, + "end": 12098, + "start": 12075, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 12141, + "raw": "8.4", + "start": 12138, + "type": "Literal", + "type": "Literal", + "value": 8.4 + }, + { + "argument": { + "end": 12148, + "raw": "3.36", + "start": 12144, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + "end": 12148, + "operator": "-", + "start": 12143, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 12149, + "start": 12137, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12152, + "start": 12151, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12136, + "name": "lineTo", + "start": 12130, + "type": "Identifier" + }, + "end": 12153, + "start": 12130, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 12195, + "raw": "7.56", + "start": 12191, + "type": "Literal", + "type": "Literal", + "value": 7.56 + }, + { + "argument": { + "end": 12202, + "raw": "3.36", + "start": 12198, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + "end": 12202, + "operator": "-", + "start": 12197, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 12203, + "start": 12190, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12206, + "start": 12205, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12189, + "name": "lineTo", + "start": 12183, + "type": "Identifier" + }, + "end": 12207, + "start": 12183, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 12251, + "raw": "7.56", + "start": 12247, + "type": "Literal", + "type": "Literal", + "value": 7.56 + }, + { + "argument": { + "end": 12258, + "raw": "1.68", + "start": 12254, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + "end": 12258, + "operator": "-", + "start": 12253, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 12259, + "start": 12246, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12262, + "start": 12261, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12245, + "name": "lineTo", + "start": 12239, + "type": "Identifier" + }, + "end": 12263, + "start": 12239, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 12305, + "raw": "6.72", + "start": 12301, + "type": "Literal", + "type": "Literal", + "value": 6.72 + }, + { + "argument": { + "end": 12312, + "raw": "1.68", + "start": 12308, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + "end": 12312, + "operator": "-", + "start": 12307, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 12313, + "start": 12300, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12316, + "start": 12315, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12299, + "name": "lineTo", + "start": 12293, + "type": "Identifier" + }, + "end": 12317, + "start": 12293, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 12361, + "raw": "6.72", + "start": 12357, + "type": "Literal", + "type": "Literal", + "value": 6.72 + }, + { + "argument": { + "end": 12374, + "raw": "0.83999999", + "start": 12364, + "type": "Literal", + "type": "Literal", + "value": 0.83999999 + }, + "end": 12374, + "operator": "-", + "start": 12363, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 12375, + "start": 12356, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12378, + "start": 12377, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12355, + "name": "lineTo", + "start": 12349, + "type": "Identifier" + }, + "end": 12379, + "start": 12349, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 12421, + "raw": "5.88", + "start": 12417, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + { + "argument": { + "end": 12434, + "raw": "0.83999999", + "start": 12424, + "type": "Literal", + "type": "Literal", + "value": 0.83999999 + }, + "end": 12434, + "operator": "-", + "start": 12423, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 12435, + "start": 12416, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12438, + "start": 12437, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12415, + "name": "lineTo", + "start": 12409, + "type": "Identifier" + }, + "end": 12439, + "start": 12409, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 12483, + "raw": "5.88", + "start": 12479, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + { + "argument": { + "end": 12490, + "raw": "1.68", + "start": 12486, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + "end": 12490, + "operator": "-", + "start": 12485, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 12491, + "start": 12478, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12494, + "start": 12493, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12477, + "name": "lineTo", + "start": 12471, + "type": "Identifier" + }, + "end": 12495, + "start": 12471, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 12537, + "raw": "5.04", + "start": 12533, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + { + "argument": { + "end": 12544, + "raw": "1.68", + "start": 12540, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + "end": 12544, + "operator": "-", + "start": 12539, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 12545, + "start": 12532, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12548, + "start": 12547, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12531, + "name": "lineTo", + "start": 12525, + "type": "Identifier" + }, + "end": 12549, + "start": 12525, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 12593, + "raw": "5.04", + "start": 12589, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + { + "argument": { + "end": 12600, + "raw": "3.36", + "start": 12596, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + "end": 12600, + "operator": "-", + "start": 12595, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 12601, + "start": 12588, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12604, + "start": 12603, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12587, + "name": "lineTo", + "start": 12581, + "type": "Identifier" + }, + "end": 12605, + "start": 12581, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 12646, + "raw": "4.2", + "start": 12643, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + { + "argument": { + "end": 12653, + "raw": "3.36", + "start": 12649, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + "end": 12653, + "operator": "-", + "start": 12648, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 12654, + "start": 12642, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12657, + "start": 12656, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12641, + "name": "lineTo", + "start": 12635, + "type": "Identifier" + }, + "end": 12658, + "start": 12635, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 12701, + "raw": "4.2", + "start": 12698, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + { + "argument": { + "end": 12708, + "raw": "4.62", + "start": 12704, + "type": "Literal", + "type": "Literal", + "value": 4.62 + }, + "end": 12708, + "operator": "-", + "start": 12703, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 12709, + "start": 12697, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12712, + "start": 12711, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12696, + "name": "lineTo", + "start": 12690, + "type": "Identifier" + }, + "end": 12713, + "start": 12690, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 12755, + "raw": "3.36", + "start": 12751, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + { + "argument": { + "end": 12762, + "raw": "4.62", + "start": 12758, + "type": "Literal", + "type": "Literal", + "value": 4.62 + }, + "end": 12762, + "operator": "-", + "start": 12757, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 12763, + "start": 12750, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12766, + "start": 12765, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12749, + "name": "lineTo", + "start": 12743, + "type": "Identifier" + }, + "end": 12767, + "start": 12743, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 12811, + "raw": "3.36", + "start": 12807, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + { + "argument": { + "end": 12818, + "raw": "3.36", + "start": 12814, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + "end": 12818, + "operator": "-", + "start": 12813, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 12819, + "start": 12806, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12822, + "start": 12821, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12805, + "name": "lineTo", + "start": 12799, + "type": "Identifier" + }, + "end": 12823, + "start": 12799, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 12864, + "raw": "4.2", + "start": 12861, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + { + "argument": { + "end": 12871, + "raw": "3.36", + "start": 12867, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + "end": 12871, + "operator": "-", + "start": 12866, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 12872, + "start": 12860, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12875, + "start": 12874, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12859, + "name": "lineTo", + "start": 12853, + "type": "Identifier" + }, + "end": 12876, + "start": 12853, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 12919, + "raw": "4.2", + "start": 12916, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + { + "argument": { + "end": 12926, + "raw": "1.68", + "start": 12922, + "type": "Literal", + "type": "Literal", + "value": 1.68 + }, + "end": 12926, + "operator": "-", + "start": 12921, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 12927, + "start": 12915, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12930, + "start": 12929, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12914, + "name": "lineTo", + "start": 12908, + "type": "Identifier" + }, + "end": 12931, + "start": 12908, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 12974, + "raw": "13.44", + "start": 12969, + "type": "Literal", + "type": "Literal", + "value": 13.44 + }, + { + "argument": { + "end": 12981, + "raw": "5.88", + "start": 12977, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + "end": 12981, + "operator": "-", + "start": 12976, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 12982, + "start": 12968, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12985, + "start": 12984, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12967, + "name": "lineTo", + "start": 12961, + "type": "Identifier" + }, + "end": 12986, + "start": 12961, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 13021, + "raw": "13.44", + "start": 13016, + "type": "Literal", + "type": "Literal", + "value": 13.44 + }, + { + "argument": { + "end": 13028, + "raw": "5.04", + "start": 13024, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 13028, + "operator": "-", + "start": 13023, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 13029, + "start": 13015, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13032, + "start": 13031, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13014, + "name": "lineTo", + "start": 13008, + "type": "Identifier" + }, + "end": 13033, + "start": 13008, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 13076, + "raw": "14.28", + "start": 13071, + "type": "Literal", + "type": "Literal", + "value": 14.28 + }, + { + "argument": { + "end": 13083, + "raw": "5.04", + "start": 13079, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 13083, + "operator": "-", + "start": 13078, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 13084, + "start": 13070, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13087, + "start": 13086, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13069, + "name": "lineTo", + "start": 13063, + "type": "Identifier" + }, + "end": 13088, + "start": 13063, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 13133, + "raw": "14.28", + "start": 13128, + "type": "Literal", + "type": "Literal", + "value": 14.28 + }, + { + "argument": { + "end": 13139, + "raw": "4.2", + "start": 13136, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + "end": 13139, + "operator": "-", + "start": 13135, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 13140, + "start": 13127, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13143, + "start": 13142, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13126, + "name": "lineTo", + "start": 13120, + "type": "Identifier" + }, + "end": 13144, + "start": 13120, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 13187, + "raw": "15.12", + "start": 13182, + "type": "Literal", + "type": "Literal", + "value": 15.12 + }, + { + "argument": { + "end": 13193, + "raw": "4.2", + "start": 13190, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + "end": 13193, + "operator": "-", + "start": 13189, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 13194, + "start": 13181, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13197, + "start": 13196, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13180, + "name": "lineTo", + "start": 13174, + "type": "Identifier" + }, + "end": 13198, + "start": 13174, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 13243, + "raw": "15.12", + "start": 13238, + "type": "Literal", + "type": "Literal", + "value": 15.12 + }, + { + "argument": { + "end": 13250, + "raw": "5.04", + "start": 13246, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 13250, + "operator": "-", + "start": 13245, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 13251, + "start": 13237, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13254, + "start": 13253, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13236, + "name": "lineTo", + "start": 13230, + "type": "Identifier" + }, + "end": 13255, + "start": 13230, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 13312, + "raw": "15.959999999999999", + "start": 13294, + "type": "Literal", + "type": "Literal", + "value": 15.959999999999999 + }, + { + "argument": { + "end": 13319, + "raw": "5.04", + "start": 13315, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 13319, + "operator": "-", + "start": 13314, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 13320, + "start": 13293, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13323, + "start": 13322, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13292, + "name": "lineTo", + "start": 13286, + "type": "Identifier" + }, + "end": 13324, + "start": 13286, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 13382, + "raw": "15.959999999999999", + "start": 13364, + "type": "Literal", + "type": "Literal", + "value": 15.959999999999999 + }, + { + "argument": { + "end": 13389, + "raw": "5.88", + "start": 13385, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + "end": 13389, + "operator": "-", + "start": 13384, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 13390, + "start": 13363, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13393, + "start": 13392, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13362, + "name": "lineTo", + "start": 13356, + "type": "Identifier" + }, + "end": 13394, + "start": 13356, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 13437, + "raw": "5.88", + "start": 13433, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + { + "argument": { + "end": 13444, + "raw": "5.04", + "start": 13440, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 13444, + "operator": "-", + "start": 13439, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 13445, + "start": 13432, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13448, + "start": 13447, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13431, + "name": "lineTo", + "start": 13425, + "type": "Identifier" + }, + "end": 13449, + "start": 13425, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 13483, + "raw": "5.88", + "start": 13479, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + { + "argument": { + "end": 13489, + "raw": "4.2", + "start": 13486, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + "end": 13489, + "operator": "-", + "start": 13485, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 13490, + "start": 13478, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13493, + "start": 13492, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13477, + "name": "lineTo", + "start": 13471, + "type": "Identifier" + }, + "end": 13494, + "start": 13471, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 13536, + "raw": "6.72", + "start": 13532, + "type": "Literal", + "type": "Literal", + "value": 6.72 + }, + { + "argument": { + "end": 13542, + "raw": "4.2", + "start": 13539, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + "end": 13542, + "operator": "-", + "start": 13538, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 13543, + "start": 13531, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13546, + "start": 13545, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13530, + "name": "lineTo", + "start": 13524, + "type": "Identifier" + }, + "end": 13547, + "start": 13524, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 13591, + "raw": "6.72", + "start": 13587, + "type": "Literal", + "type": "Literal", + "value": 6.72 + }, + { + "argument": { + "end": 13598, + "raw": "5.04", + "start": 13594, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 13598, + "operator": "-", + "start": 13593, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 13599, + "start": 13586, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13602, + "start": 13601, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13585, + "name": "lineTo", + "start": 13579, + "type": "Identifier" + }, + "end": 13603, + "start": 13579, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 13645, + "raw": "7.56", + "start": 13641, + "type": "Literal", + "type": "Literal", + "value": 7.56 + }, + { + "argument": { + "end": 13652, + "raw": "5.04", + "start": 13648, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 13652, + "operator": "-", + "start": 13647, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 13653, + "start": 13640, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13656, + "start": 13655, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13639, + "name": "lineTo", + "start": 13633, + "type": "Identifier" + }, + "end": 13657, + "start": 13633, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 13701, + "raw": "7.56", + "start": 13697, + "type": "Literal", + "type": "Literal", + "value": 7.56 + }, + { + "argument": { + "end": 13708, + "raw": "5.88", + "start": 13704, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + "end": 13708, + "operator": "-", + "start": 13703, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 13709, + "start": 13696, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13712, + "start": 13711, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13695, + "name": "lineTo", + "start": 13689, + "type": "Identifier" + }, + "end": 13713, + "start": 13689, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 13755, + "raw": "5.04", + "start": 13751, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + { + "argument": { + "end": 13762, + "raw": "5.88", + "start": 13758, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + "end": 13762, + "operator": "-", + "start": 13757, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 13763, + "start": 13750, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13766, + "start": 13765, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13749, + "name": "lineTo", + "start": 13743, + "type": "Identifier" + }, + "end": 13767, + "start": 13743, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 13811, + "raw": "5.04", + "start": 13807, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + { + "argument": { + "end": 13818, + "raw": "5.04", + "start": 13814, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 13818, + "operator": "-", + "start": 13813, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 13819, + "start": 13806, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13822, + "start": 13821, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13805, + "name": "lineTo", + "start": 13799, + "type": "Identifier" + }, + "end": 13823, + "start": 13799, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 13866, + "raw": "17.64", + "start": 13861, + "type": "Literal", + "type": "Literal", + "value": 17.64 + }, + { + "argument": { + "end": 13873, + "raw": "5.88", + "start": 13869, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + "end": 13873, + "operator": "-", + "start": 13868, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 13874, + "start": 13860, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13877, + "start": 13876, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13859, + "name": "lineTo", + "start": 13853, + "type": "Identifier" + }, + "end": 13878, + "start": 13853, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 13913, + "raw": "17.64", + "start": 13908, + "type": "Literal", + "type": "Literal", + "value": 17.64 + }, + { + "argument": { + "end": 13920, + "raw": "5.04", + "start": 13916, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 13920, + "operator": "-", + "start": 13915, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 13921, + "start": 13907, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13924, + "start": 13923, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13906, + "name": "lineTo", + "start": 13900, + "type": "Identifier" + }, + "end": 13925, + "start": 13900, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 13967, + "raw": "16.8", + "start": 13963, + "type": "Literal", + "type": "Literal", + "value": 16.8 + }, + { + "argument": { + "end": 13974, + "raw": "5.04", + "start": 13970, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 13974, + "operator": "-", + "start": 13969, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 13975, + "start": 13962, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13978, + "start": 13977, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13961, + "name": "lineTo", + "start": 13955, + "type": "Identifier" + }, + "end": 13979, + "start": 13955, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14023, + "raw": "16.8", + "start": 14019, + "type": "Literal", + "type": "Literal", + "value": 16.8 + }, + { + "argument": { + "end": 14029, + "raw": "4.2", + "start": 14026, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + "end": 14029, + "operator": "-", + "start": 14025, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 14030, + "start": 14018, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14033, + "start": 14032, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14017, + "name": "lineTo", + "start": 14011, + "type": "Identifier" + }, + "end": 14034, + "start": 14011, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14077, + "raw": "17.64", + "start": 14072, + "type": "Literal", + "type": "Literal", + "value": 17.64 + }, + { + "argument": { + "end": 14083, + "raw": "4.2", + "start": 14080, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + "end": 14083, + "operator": "-", + "start": 14079, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 14084, + "start": 14071, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14087, + "start": 14086, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14070, + "name": "lineTo", + "start": 14064, + "type": "Identifier" + }, + "end": 14088, + "start": 14064, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14133, + "raw": "17.64", + "start": 14128, + "type": "Literal", + "type": "Literal", + "value": 17.64 + }, + { + "argument": { + "end": 14140, + "raw": "5.04", + "start": 14136, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 14140, + "operator": "-", + "start": 14135, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 14141, + "start": 14127, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14144, + "start": 14143, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14126, + "name": "lineTo", + "start": 14120, + "type": "Identifier" + }, + "end": 14145, + "start": 14120, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14189, + "raw": "18.48", + "start": 14184, + "type": "Literal", + "type": "Literal", + "value": 18.48 + }, + { + "argument": { + "end": 14196, + "raw": "5.04", + "start": 14192, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 14196, + "operator": "-", + "start": 14191, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 14197, + "start": 14183, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14200, + "start": 14199, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14182, + "name": "lineTo", + "start": 14176, + "type": "Identifier" + }, + "end": 14201, + "start": 14176, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14246, + "raw": "18.48", + "start": 14241, + "type": "Literal", + "type": "Literal", + "value": 18.48 + }, + { + "argument": { + "end": 14253, + "raw": "5.88", + "start": 14249, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + "end": 14253, + "operator": "-", + "start": 14248, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 14254, + "start": 14240, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14257, + "start": 14256, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14239, + "name": "lineTo", + "start": 14233, + "type": "Identifier" + }, + "end": 14258, + "start": 14233, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14301, + "raw": "3.36", + "start": 14297, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + { + "argument": { + "end": 14308, + "raw": "5.04", + "start": 14304, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 14308, + "operator": "-", + "start": 14303, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 14309, + "start": 14296, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14312, + "start": 14311, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14295, + "name": "lineTo", + "start": 14289, + "type": "Identifier" + }, + "end": 14313, + "start": 14289, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14347, + "raw": "3.36", + "start": 14343, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + { + "argument": { + "end": 14354, + "raw": "5.88", + "start": 14350, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + "end": 14354, + "operator": "-", + "start": 14349, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 14355, + "start": 14342, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14358, + "start": 14357, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14341, + "name": "lineTo", + "start": 14335, + "type": "Identifier" + }, + "end": 14359, + "start": 14335, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14401, + "raw": "2.52", + "start": 14397, + "type": "Literal", + "type": "Literal", + "value": 2.52 + }, + { + "argument": { + "end": 14408, + "raw": "5.88", + "start": 14404, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + "end": 14408, + "operator": "-", + "start": 14403, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 14409, + "start": 14396, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14412, + "start": 14411, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14395, + "name": "lineTo", + "start": 14389, + "type": "Identifier" + }, + "end": 14413, + "start": 14389, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14457, + "raw": "2.52", + "start": 14453, + "type": "Literal", + "type": "Literal", + "value": 2.52 + }, + { + "argument": { + "end": 14464, + "raw": "5.04", + "start": 14460, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 14464, + "operator": "-", + "start": 14459, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 14465, + "start": 14452, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14468, + "start": 14467, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14451, + "name": "lineTo", + "start": 14445, + "type": "Identifier" + }, + "end": 14469, + "start": 14445, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14511, + "raw": "3.36", + "start": 14507, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + { + "argument": { + "end": 14518, + "raw": "5.04", + "start": 14514, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 14518, + "operator": "-", + "start": 14513, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 14519, + "start": 14506, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14522, + "start": 14521, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14505, + "name": "lineTo", + "start": 14499, + "type": "Identifier" + }, + "end": 14523, + "start": 14499, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14567, + "raw": "3.36", + "start": 14563, + "type": "Literal", + "type": "Literal", + "value": 3.36 + }, + { + "argument": { + "end": 14573, + "raw": "4.2", + "start": 14570, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + "end": 14573, + "operator": "-", + "start": 14569, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 14574, + "start": 14562, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14577, + "start": 14576, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14561, + "name": "lineTo", + "start": 14555, + "type": "Identifier" + }, + "end": 14578, + "start": 14555, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14619, + "raw": "4.2", + "start": 14616, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + { + "argument": { + "end": 14625, + "raw": "4.2", + "start": 14622, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + "end": 14625, + "operator": "-", + "start": 14621, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 14626, + "start": 14615, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14629, + "start": 14628, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14614, + "name": "lineTo", + "start": 14608, + "type": "Identifier" + }, + "end": 14630, + "start": 14608, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14673, + "raw": "4.2", + "start": 14670, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + { + "argument": { + "end": 14680, + "raw": "5.04", + "start": 14676, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 14680, + "operator": "-", + "start": 14675, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 14681, + "start": 14669, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14684, + "start": 14683, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14668, + "name": "lineTo", + "start": 14662, + "type": "Identifier" + }, + "end": 14685, + "start": 14662, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14727, + "raw": "8.4", + "start": 14724, + "type": "Literal", + "type": "Literal", + "value": 8.4 + }, + { + "argument": { + "end": 14733, + "raw": "4.2", + "start": 14730, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + "end": 14733, + "operator": "-", + "start": 14729, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 14734, + "start": 14723, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14737, + "start": 14736, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14722, + "name": "lineTo", + "start": 14716, + "type": "Identifier" + }, + "end": 14738, + "start": 14716, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14772, + "raw": "9.24", + "start": 14768, + "type": "Literal", + "type": "Literal", + "value": 9.24 + }, + { + "argument": { + "end": 14778, + "raw": "4.2", + "start": 14775, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + "end": 14778, + "operator": "-", + "start": 14774, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 14779, + "start": 14767, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14782, + "start": 14781, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14766, + "name": "lineTo", + "start": 14760, + "type": "Identifier" + }, + "end": 14783, + "start": 14760, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14827, + "raw": "9.24", + "start": 14823, + "type": "Literal", + "type": "Literal", + "value": 9.24 + }, + { + "argument": { + "end": 14834, + "raw": "5.04", + "start": 14830, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 14834, + "operator": "-", + "start": 14829, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 14835, + "start": 14822, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14838, + "start": 14837, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14821, + "name": "lineTo", + "start": 14815, + "type": "Identifier" + }, + "end": 14839, + "start": 14815, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14883, + "raw": "10.08", + "start": 14878, + "type": "Literal", + "type": "Literal", + "value": 10.08 + }, + { + "argument": { + "end": 14890, + "raw": "5.04", + "start": 14886, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 14890, + "operator": "-", + "start": 14885, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 14891, + "start": 14877, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14894, + "start": 14893, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14876, + "name": "lineTo", + "start": 14870, + "type": "Identifier" + }, + "end": 14895, + "start": 14870, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14940, + "raw": "10.08", + "start": 14935, + "type": "Literal", + "type": "Literal", + "value": 10.08 + }, + { + "argument": { + "end": 14947, + "raw": "5.88", + "start": 14943, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + "end": 14947, + "operator": "-", + "start": 14942, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 14948, + "start": 14934, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14951, + "start": 14950, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14933, + "name": "lineTo", + "start": 14927, + "type": "Identifier" + }, + "end": 14952, + "start": 14927, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14994, + "raw": "9.24", + "start": 14990, + "type": "Literal", + "type": "Literal", + "value": 9.24 + }, + { + "argument": { + "end": 15001, + "raw": "5.88", + "start": 14997, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + "end": 15001, + "operator": "-", + "start": 14996, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 15002, + "start": 14989, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15005, + "start": 15004, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14988, + "name": "lineTo", + "start": 14982, + "type": "Identifier" + }, + "end": 15006, + "start": 14982, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 15050, + "raw": "9.24", + "start": 15046, + "type": "Literal", + "type": "Literal", + "value": 9.24 + }, + { + "argument": { + "end": 15057, + "raw": "5.04", + "start": 15053, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 15057, + "operator": "-", + "start": 15052, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 15058, + "start": 15045, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15061, + "start": 15060, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15044, + "name": "lineTo", + "start": 15038, + "type": "Identifier" + }, + "end": 15062, + "start": 15038, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 15103, + "raw": "8.4", + "start": 15100, + "type": "Literal", + "type": "Literal", + "value": 8.4 + }, + { + "argument": { + "end": 15110, + "raw": "5.04", + "start": 15106, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 15110, + "operator": "-", + "start": 15105, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 15111, + "start": 15099, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15114, + "start": 15113, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15098, + "name": "lineTo", + "start": 15092, + "type": "Identifier" + }, + "end": 15115, + "start": 15092, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 15160, + "raw": "11.76", + "start": 15155, + "type": "Literal", + "type": "Literal", + "value": 11.76 + }, + { + "argument": { + "end": 15166, + "raw": "4.2", + "start": 15163, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + "end": 15166, + "operator": "-", + "start": 15162, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 15167, + "start": 15154, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15170, + "start": 15169, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15153, + "name": "lineTo", + "start": 15147, + "type": "Identifier" + }, + "end": 15171, + "start": 15147, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 15205, + "raw": "12.6", + "start": 15201, + "type": "Literal", + "type": "Literal", + "value": 12.6 + }, + { + "argument": { + "end": 15211, + "raw": "4.2", + "start": 15208, + "type": "Literal", + "type": "Literal", + "value": 4.2 + }, + "end": 15211, + "operator": "-", + "start": 15207, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 15212, + "start": 15200, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15215, + "start": 15214, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15199, + "name": "lineTo", + "start": 15193, + "type": "Identifier" + }, + "end": 15216, + "start": 15193, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 15260, + "raw": "12.6", + "start": 15256, + "type": "Literal", + "type": "Literal", + "value": 12.6 + }, + { + "argument": { + "end": 15267, + "raw": "5.04", + "start": 15263, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 15267, + "operator": "-", + "start": 15262, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 15268, + "start": 15255, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15271, + "start": 15270, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15254, + "name": "lineTo", + "start": 15248, + "type": "Identifier" + }, + "end": 15272, + "start": 15248, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 15315, + "raw": "11.76", + "start": 15310, + "type": "Literal", + "type": "Literal", + "value": 11.76 + }, + { + "argument": { + "end": 15322, + "raw": "5.04", + "start": 15318, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 15322, + "operator": "-", + "start": 15317, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 15323, + "start": 15309, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15326, + "start": 15325, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15308, + "name": "lineTo", + "start": 15302, + "type": "Identifier" + }, + "end": 15327, + "start": 15302, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 15372, + "raw": "11.76", + "start": 15367, + "type": "Literal", + "type": "Literal", + "value": 11.76 + }, + { + "argument": { + "end": 15379, + "raw": "5.88", + "start": 15375, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + "end": 15379, + "operator": "-", + "start": 15374, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 15380, + "start": 15366, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15383, + "start": 15382, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15365, + "name": "lineTo", + "start": 15359, + "type": "Identifier" + }, + "end": 15384, + "start": 15359, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 15427, + "raw": "10.92", + "start": 15422, + "type": "Literal", + "type": "Literal", + "value": 10.92 + }, + { + "argument": { + "end": 15434, + "raw": "5.88", + "start": 15430, + "type": "Literal", + "type": "Literal", + "value": 5.88 + }, + "end": 15434, + "operator": "-", + "start": 15429, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 15435, + "start": 15421, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15438, + "start": 15437, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15420, + "name": "lineTo", + "start": 15414, + "type": "Identifier" + }, + "end": 15439, + "start": 15414, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 15484, + "raw": "10.92", + "start": 15479, + "type": "Literal", + "type": "Literal", + "value": 10.92 + }, + { + "argument": { + "end": 15491, + "raw": "5.04", + "start": 15487, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 15491, + "operator": "-", + "start": 15486, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 15492, + "start": 15478, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15495, + "start": 15494, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15477, + "name": "lineTo", + "start": 15471, + "type": "Identifier" + }, + "end": 15496, + "start": 15471, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 15539, + "raw": "11.76", + "start": 15534, + "type": "Literal", + "type": "Literal", + "value": 11.76 + }, + { + "argument": { + "end": 15546, + "raw": "5.04", + "start": 15542, + "type": "Literal", + "type": "Literal", + "value": 5.04 + }, + "end": 15546, + "operator": "-", + "start": 15541, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 15547, + "start": 15533, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15550, + "start": 15549, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15532, + "name": "lineTo", + "start": 15526, + "type": "Identifier" + }, + "end": 15551, + "start": 15526, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 15596, + "raw": "14.28", + "start": 15591, + "type": "Literal", + "type": "Literal", + "value": 14.28 + }, + { + "argument": { + "end": 15604, + "raw": "10.92", + "start": 15599, + "type": "Literal", + "type": "Literal", + "value": 10.92 + }, + "end": 15604, + "operator": "-", + "start": 15598, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 15605, + "start": 15590, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15608, + "start": 15607, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15589, + "name": "lineTo", + "start": 15583, + "type": "Identifier" + }, + "end": 15609, + "start": 15583, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 15644, + "raw": "13.44", + "start": 15639, + "type": "Literal", + "type": "Literal", + "value": 13.44 + }, + { + "argument": { + "end": 15652, + "raw": "10.92", + "start": 15647, + "type": "Literal", + "type": "Literal", + "value": 10.92 + }, + "end": 15652, + "operator": "-", + "start": 15646, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 15653, + "start": 15638, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15656, + "start": 15655, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15637, + "name": "lineTo", + "start": 15631, + "type": "Identifier" + }, + "end": 15657, + "start": 15631, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 15702, + "raw": "13.44", + "start": 15697, + "type": "Literal", + "type": "Literal", + "value": 13.44 + }, + { + "argument": { + "end": 15710, + "raw": "13.44", + "start": 15705, + "type": "Literal", + "type": "Literal", + "value": 13.44 + }, + "end": 15710, + "operator": "-", + "start": 15704, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 15711, + "start": 15696, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15714, + "start": 15713, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15695, + "name": "lineTo", + "start": 15689, + "type": "Identifier" + }, + "end": 15715, + "start": 15689, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 15759, + "raw": "14.28", + "start": 15754, + "type": "Literal", + "type": "Literal", + "value": 14.28 + }, + { + "argument": { + "end": 15767, + "raw": "13.44", + "start": 15762, + "type": "Literal", + "type": "Literal", + "value": 13.44 + }, + "end": 15767, + "operator": "-", + "start": 15761, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 15768, + "start": 15753, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15771, + "start": 15770, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15752, + "name": "lineTo", + "start": 15746, + "type": "Identifier" + }, + "end": 15772, + "start": 15746, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 15811, + "start": 15810, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15809, + "name": "close", + "start": 15804, + "type": "Identifier" + }, + "end": 15812, + "start": 15804, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 15827, + "raw": "1", + "start": 15826, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 15830, + "start": 15829, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15825, + "name": "extrude", + "start": 15818, + "type": "Identifier" + }, + "end": 15831, + "start": 15818, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 15831, + "nonCodeMeta": { + "nonCodeNodes": { + "2": [ + { + "end": 103, + "start": 87, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "MoveAbsolute", + "style": "line" + } + } + ], + "3": [ + { + "end": 157, + "start": 133, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "4": [ + { + "end": 213, + "start": 187, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "5": [ + { + "end": 268, + "start": 244, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "6": [ + { + "end": 322, + "start": 296, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "7": [ + { + "end": 373, + "start": 349, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "8": [ + { + "end": 429, + "start": 403, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "9": [ + { + "end": 483, + "start": 459, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "10": [ + { + "end": 539, + "start": 513, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "11": [ + { + "end": 593, + "start": 569, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "12": [ + { + "end": 649, + "start": 623, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "13": [ + { + "end": 702, + "start": 678, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "14": [ + { + "end": 757, + "start": 731, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "15": [ + { + "end": 811, + "start": 787, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "16": [ + { + "end": 868, + "start": 842, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "17": [ + { + "end": 922, + "start": 898, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "18": [ + { + "end": 978, + "start": 952, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "19": [ + { + "end": 1034, + "start": 1009, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "20": [ + { + "end": 1091, + "start": 1065, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "21": [ + { + "end": 1147, + "start": 1122, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "22": [ + { + "end": 1204, + "start": 1178, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "23": [ + { + "end": 1259, + "start": 1235, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "24": [ + { + "end": 1313, + "start": 1287, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "25": [ + { + "end": 1367, + "start": 1342, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "26": [ + { + "end": 1425, + "start": 1399, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "27": [ + { + "end": 1481, + "start": 1456, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "28": [ + { + "end": 1538, + "start": 1512, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "29": [ + { + "end": 1595, + "start": 1570, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "30": [ + { + "end": 1653, + "start": 1627, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "31": [ + { + "end": 1710, + "start": 1685, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "32": [ + { + "end": 1767, + "start": 1741, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "33": [ + { + "end": 1823, + "start": 1798, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "34": [ + { + "end": 1881, + "start": 1855, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "35": [ + { + "end": 1937, + "start": 1913, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "36": [ + { + "end": 1994, + "start": 1968, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "37": [ + { + "end": 2049, + "start": 2025, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "38": [ + { + "end": 2105, + "start": 2079, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "39": [ + { + "end": 2160, + "start": 2135, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "40": [ + { + "end": 2217, + "start": 2191, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "41": [ + { + "end": 2273, + "start": 2248, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "42": [ + { + "end": 2329, + "start": 2303, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "43": [ + { + "end": 2384, + "start": 2359, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "44": [ + { + "end": 2441, + "start": 2415, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "45": [ + { + "end": 2497, + "start": 2472, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "46": [ + { + "end": 2548, + "start": 2532, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "MoveRelative", + "style": "line" + } + } + ], + "47": [ + { + "end": 2608, + "start": 2583, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "48": [ + { + "end": 2665, + "start": 2639, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "49": [ + { + "end": 2720, + "start": 2695, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "50": [ + { + "end": 2777, + "start": 2751, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "51": [ + { + "end": 2834, + "start": 2809, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "52": [ + { + "end": 2892, + "start": 2866, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "53": [ + { + "end": 2948, + "start": 2924, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + }, + { + "end": 2966, + "start": 2950, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "StopAbsolute", + "style": "line" + } + } + ], + "54": [ + { + "end": 3013, + "start": 2997, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "MoveAbsolute", + "style": "line" + } + } + ], + "55": [ + { + "end": 3069, + "start": 3044, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "56": [ + { + "end": 3127, + "start": 3101, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "57": [ + { + "end": 3184, + "start": 3159, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "58": [ + { + "end": 3231, + "start": 3215, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "MoveRelative", + "style": "line" + } + } + ], + "59": [ + { + "end": 3287, + "start": 3262, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "60": [ + { + "end": 3344, + "start": 3318, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "61": [ + { + "end": 3400, + "start": 3375, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "62": [ + { + "end": 3447, + "start": 3431, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "MoveRelative", + "style": "line" + } + } + ], + "63": [ + { + "end": 3503, + "start": 3478, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "64": [ + { + "end": 3560, + "start": 3534, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "65": [ + { + "end": 3616, + "start": 3591, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "66": [ + { + "end": 3664, + "start": 3648, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "MoveRelative", + "style": "line" + } + } + ], + "67": [ + { + "end": 3721, + "start": 3696, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "68": [ + { + "end": 3792, + "start": 3766, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "69": [ + { + "end": 3862, + "start": 3837, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "70": [ + { + "end": 3909, + "start": 3893, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "MoveRelative", + "style": "line" + } + } + ], + "71": [ + { + "end": 3965, + "start": 3940, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "72": [ + { + "end": 4023, + "start": 3997, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "73": [ + { + "end": 4080, + "start": 4055, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "74": [ + { + "end": 4128, + "start": 4112, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "MoveRelative", + "style": "line" + } + } + ], + "75": [ + { + "end": 4185, + "start": 4160, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "76": [ + { + "end": 4243, + "start": 4217, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "77": [ + { + "end": 4300, + "start": 4275, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "78": [ + { + "end": 4348, + "start": 4332, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "MoveRelative", + "style": "line" + } + } + ], + "79": [ + { + "end": 4405, + "start": 4380, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "80": [ + { + "end": 4463, + "start": 4437, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "81": [ + { + "end": 4520, + "start": 4495, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "82": [ + { + "end": 4567, + "start": 4551, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "MoveAbsolute", + "style": "line" + } + } + ], + "83": [ + { + "end": 4622, + "start": 4598, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "84": [ + { + "end": 4679, + "start": 4653, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "85": [ + { + "end": 4733, + "start": 4709, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "86": [ + { + "end": 4788, + "start": 4762, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "87": [ + { + "end": 4842, + "start": 4818, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "88": [ + { + "end": 4898, + "start": 4872, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "89": [ + { + "end": 4952, + "start": 4928, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "90": [ + { + "end": 5008, + "start": 4982, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "91": [ + { + "end": 5062, + "start": 5038, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "92": [ + { + "end": 5122, + "start": 5096, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "93": [ + { + "end": 5179, + "start": 5155, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "94": [ + { + "end": 5235, + "start": 5209, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "95": [ + { + "end": 5290, + "start": 5266, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "96": [ + { + "end": 5347, + "start": 5321, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "97": [ + { + "end": 5402, + "start": 5378, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "98": [ + { + "end": 5449, + "start": 5433, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "MoveAbsolute", + "style": "line" + } + } + ], + "99": [ + { + "end": 5509, + "start": 5483, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "100": [ + { + "end": 5568, + "start": 5544, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "101": [ + { + "end": 5626, + "start": 5600, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "102": [ + { + "end": 5673, + "start": 5657, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "MoveAbsolute", + "style": "line" + } + } + ], + "103": [ + { + "end": 5730, + "start": 5706, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "104": [ + { + "end": 5790, + "start": 5764, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "105": [ + { + "end": 5846, + "start": 5822, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "106": [ + { + "end": 5904, + "start": 5878, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "107": [ + { + "end": 5960, + "start": 5935, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "108": [ + { + "end": 6017, + "start": 5991, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "109": [ + { + "end": 6074, + "start": 6049, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "110": [ + { + "end": 6131, + "start": 6105, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "111": [ + { + "end": 6185, + "start": 6161, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "112": [ + { + "end": 6241, + "start": 6215, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "113": [ + { + "end": 6310, + "start": 6285, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "114": [ + { + "end": 6358, + "start": 6342, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "MoveRelative", + "style": "line" + } + } + ], + "115": [ + { + "end": 6415, + "start": 6390, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "116": [ + { + "end": 6473, + "start": 6447, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "117": [ + { + "end": 6530, + "start": 6505, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "118": [ + { + "end": 6588, + "start": 6562, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "119": [ + { + "end": 6635, + "start": 6619, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "MoveRelative", + "style": "line" + } + } + ], + "120": [ + { + "end": 6693, + "start": 6667, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "121": [ + { + "end": 6750, + "start": 6725, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "122": [ + { + "end": 6813, + "start": 6782, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative here", + "style": "line" + } + } + ], + "123": [ + { + "end": 6883, + "start": 6858, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "124": [ + { + "end": 6954, + "start": 6928, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "125": [ + { + "end": 7011, + "start": 6986, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "126": [ + { + "end": 7069, + "start": 7043, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "127": [ + { + "end": 7139, + "start": 7114, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "128": [ + { + "end": 7210, + "start": 7184, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "129": [ + { + "end": 7265, + "start": 7241, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "130": [ + { + "end": 7321, + "start": 7295, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "131": [ + { + "end": 7376, + "start": 7352, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "132": [ + { + "end": 7433, + "start": 7407, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "133": [ + { + "end": 7502, + "start": 7477, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "134": [ + { + "end": 7572, + "start": 7546, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "135": [ + { + "end": 7628, + "start": 7603, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "136": [ + { + "end": 7686, + "start": 7660, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "137": [ + { + "end": 7742, + "start": 7718, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "138": [ + { + "end": 7799, + "start": 7773, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "139": [ + { + "end": 7845, + "start": 7829, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "MoveAbsolute", + "style": "line" + } + } + ], + "140": [ + { + "end": 7900, + "start": 7876, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "141": [ + { + "end": 7957, + "start": 7931, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "142": [ + { + "end": 8011, + "start": 7987, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "143": [ + { + "end": 8066, + "start": 8040, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "144": [ + { + "end": 8121, + "start": 8096, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "145": [ + { + "end": 8178, + "start": 8152, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "146": [ + { + "end": 8234, + "start": 8209, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "147": [ + { + "end": 8305, + "start": 8279, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "148": [ + { + "end": 8375, + "start": 8350, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "149": [ + { + "end": 8431, + "start": 8405, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "150": [ + { + "end": 8485, + "start": 8460, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "151": [ + { + "end": 8531, + "start": 8515, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "MoveAbsolute", + "style": "line" + } + } + ], + "152": [ + { + "end": 8585, + "start": 8561, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "153": [ + { + "end": 8640, + "start": 8614, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "154": [ + { + "end": 8693, + "start": 8669, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "155": [ + { + "end": 8749, + "start": 8723, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "156": [ + { + "end": 8803, + "start": 8779, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "157": [ + { + "end": 8859, + "start": 8833, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "158": [ + { + "end": 8919, + "start": 8895, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "159": [ + { + "end": 8981, + "start": 8955, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "160": [ + { + "end": 9035, + "start": 9011, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "161": [ + { + "end": 9091, + "start": 9065, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "162": [ + { + "end": 9145, + "start": 9121, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "163": [ + { + "end": 9200, + "start": 9174, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "164": [ + { + "end": 9254, + "start": 9229, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "165": [ + { + "end": 9310, + "start": 9284, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "166": [ + { + "end": 9365, + "start": 9340, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "167": [ + { + "end": 9412, + "start": 9396, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "MoveAbsolute", + "style": "line" + } + } + ], + "168": [ + { + "end": 9467, + "start": 9443, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "169": [ + { + "end": 9524, + "start": 9498, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "170": [ + { + "end": 9579, + "start": 9555, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "171": [ + { + "end": 9635, + "start": 9609, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "172": [ + { + "end": 9689, + "start": 9665, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "173": [ + { + "end": 9746, + "start": 9720, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "174": [ + { + "end": 9801, + "start": 9777, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "175": [ + { + "end": 9858, + "start": 9832, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "176": [ + { + "end": 9919, + "start": 9895, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "177": [ + { + "end": 9982, + "start": 9956, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "178": [ + { + "end": 10037, + "start": 10013, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "179": [ + { + "end": 10107, + "start": 10081, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "180": [ + { + "end": 10176, + "start": 10151, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "181": [ + { + "end": 10232, + "start": 10206, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "182": [ + { + "end": 10287, + "start": 10262, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "183": [ + { + "end": 10334, + "start": 10318, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "MoveAbsolute", + "style": "line" + } + } + ], + "184": [ + { + "end": 10386, + "start": 10362, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "185": [ + { + "end": 10453, + "start": 10427, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "186": [ + { + "end": 10522, + "start": 10497, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "187": [ + { + "end": 10578, + "start": 10552, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "188": [ + { + "end": 10633, + "start": 10608, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "189": [ + { + "end": 10690, + "start": 10664, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "190": [ + { + "end": 10745, + "start": 10721, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "191": [ + { + "end": 10801, + "start": 10775, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "192": [ + { + "end": 10855, + "start": 10831, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "193": [ + { + "end": 10912, + "start": 10886, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "194": [ + { + "end": 10967, + "start": 10943, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "195": [ + { + "end": 11024, + "start": 10998, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "196": [ + { + "end": 11085, + "start": 11061, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "197": [ + { + "end": 11148, + "start": 11122, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "198": [ + { + "end": 11203, + "start": 11179, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "199": [ + { + "end": 11260, + "start": 11234, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "200": [ + { + "end": 11315, + "start": 11291, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "201": [ + { + "end": 11371, + "start": 11345, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "202": [ + { + "end": 11425, + "start": 11401, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "203": [ + { + "end": 11482, + "start": 11456, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "204": [ + { + "end": 11537, + "start": 11513, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "205": [ + { + "end": 11593, + "start": 11567, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "206": [ + { + "end": 11647, + "start": 11623, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "207": [ + { + "end": 11693, + "start": 11677, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "MoveAbsolute", + "style": "line" + } + } + ], + "208": [ + { + "end": 11744, + "start": 11720, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "209": [ + { + "end": 11797, + "start": 11771, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "210": [ + { + "end": 11851, + "start": 11827, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "211": [ + { + "end": 11906, + "start": 11880, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "212": [ + { + "end": 11959, + "start": 11935, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "213": [ + { + "end": 12015, + "start": 11989, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "214": [ + { + "end": 12069, + "start": 12045, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "215": [ + { + "end": 12124, + "start": 12098, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "216": [ + { + "end": 12177, + "start": 12153, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "217": [ + { + "end": 12233, + "start": 12207, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "218": [ + { + "end": 12287, + "start": 12263, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "219": [ + { + "end": 12343, + "start": 12317, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "220": [ + { + "end": 12403, + "start": 12379, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "221": [ + { + "end": 12465, + "start": 12439, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "222": [ + { + "end": 12519, + "start": 12495, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "223": [ + { + "end": 12575, + "start": 12549, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "224": [ + { + "end": 12629, + "start": 12605, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "225": [ + { + "end": 12684, + "start": 12658, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "226": [ + { + "end": 12737, + "start": 12713, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "227": [ + { + "end": 12793, + "start": 12767, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "228": [ + { + "end": 12847, + "start": 12823, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "229": [ + { + "end": 12902, + "start": 12876, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "230": [ + { + "end": 12955, + "start": 12931, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "231": [ + { + "end": 13002, + "start": 12986, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "MoveAbsolute", + "style": "line" + } + } + ], + "232": [ + { + "end": 13057, + "start": 13033, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "233": [ + { + "end": 13114, + "start": 13088, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "234": [ + { + "end": 13168, + "start": 13144, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "235": [ + { + "end": 13224, + "start": 13198, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "236": [ + { + "end": 13280, + "start": 13255, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "237": [ + { + "end": 13350, + "start": 13324, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "238": [ + { + "end": 13419, + "start": 13394, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "239": [ + { + "end": 13465, + "start": 13449, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "MoveAbsolute", + "style": "line" + } + } + ], + "240": [ + { + "end": 13518, + "start": 13494, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "241": [ + { + "end": 13573, + "start": 13547, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "242": [ + { + "end": 13627, + "start": 13603, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "243": [ + { + "end": 13683, + "start": 13657, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "244": [ + { + "end": 13737, + "start": 13713, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "245": [ + { + "end": 13793, + "start": 13767, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "246": [ + { + "end": 13847, + "start": 13823, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "247": [ + { + "end": 13894, + "start": 13878, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "MoveAbsolute", + "style": "line" + } + } + ], + "248": [ + { + "end": 13949, + "start": 13925, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "249": [ + { + "end": 14005, + "start": 13979, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "250": [ + { + "end": 14058, + "start": 14034, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "251": [ + { + "end": 14114, + "start": 14088, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "252": [ + { + "end": 14170, + "start": 14145, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "253": [ + { + "end": 14227, + "start": 14201, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "254": [ + { + "end": 14283, + "start": 14258, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "255": [ + { + "end": 14329, + "start": 14313, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "MoveAbsolute", + "style": "line" + } + } + ], + "256": [ + { + "end": 14383, + "start": 14359, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "257": [ + { + "end": 14439, + "start": 14413, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "258": [ + { + "end": 14493, + "start": 14469, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "259": [ + { + "end": 14549, + "start": 14523, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "260": [ + { + "end": 14602, + "start": 14578, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "261": [ + { + "end": 14656, + "start": 14630, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "262": [ + { + "end": 14710, + "start": 14685, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "263": [ + { + "end": 14754, + "start": 14738, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "MoveRelative", + "style": "line" + } + } + ], + "264": [ + { + "end": 14809, + "start": 14783, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "265": [ + { + "end": 14864, + "start": 14839, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "266": [ + { + "end": 14921, + "start": 14895, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "267": [ + { + "end": 14976, + "start": 14952, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "268": [ + { + "end": 15032, + "start": 15006, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "269": [ + { + "end": 15086, + "start": 15062, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "270": [ + { + "end": 15141, + "start": 15115, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "271": [ + { + "end": 15187, + "start": 15171, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "MoveAbsolute", + "style": "line" + } + } + ], + "272": [ + { + "end": 15242, + "start": 15216, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "273": [ + { + "end": 15296, + "start": 15272, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "274": [ + { + "end": 15353, + "start": 15327, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "275": [ + { + "end": 15408, + "start": 15384, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "276": [ + { + "end": 15465, + "start": 15439, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineAbsolute", + "style": "line" + } + } + ], + "277": [ + { + "end": 15520, + "start": 15496, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineAbsolute", + "style": "line" + } + } + ], + "278": [ + { + "end": 15577, + "start": 15551, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "279": [ + { + "end": 15625, + "start": 15609, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "MoveRelative", + "style": "line" + } + } + ], + "280": [ + { + "end": 15683, + "start": 15657, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ], + "281": [ + { + "end": 15740, + "start": 15715, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "VerticalLineHorizonal", + "style": "line" + } + } + ], + "282": [ + { + "end": 15798, + "start": 15772, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "HorizontalLineRelative", + "style": "line" + } + } + ] + }, + "startNodes": [] + }, + "start": 6, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 15831, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 15832, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/kittycad_svg/input.kcl b/src/wasm-lib/kcl/tests/kittycad_svg/input.kcl new file mode 100644 index 000000000..400ade825 --- /dev/null +++ b/src/wasm-lib/kcl/tests/kittycad_svg/input.kcl @@ -0,0 +1,286 @@ +svg = startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> lineTo([2.52, -26.04], %) // MoveAbsolute + |> lineTo([2.52, -25.2], %) // VerticalLineAbsolute + |> lineTo([0.84, -25.2], %) // HorizontalLineAbsolute + |> lineTo([0.84, -24.36], %) // VerticalLineAbsolute + |> lineTo([0, -24.36], %) // HorizontalLineAbsolute + |> lineTo([0, -6.72], %) // VerticalLineAbsolute + |> lineTo([0.84, -6.72], %) // HorizontalLineAbsolute + |> lineTo([0.84, -5.88], %) // VerticalLineAbsolute + |> lineTo([1.68, -5.88], %) // HorizontalLineAbsolute + |> lineTo([1.68, -5.04], %) // VerticalLineAbsolute + |> lineTo([2.52, -5.04], %) // HorizontalLineAbsolute + |> lineTo([2.52, -4.2], %) // VerticalLineAbsolute + |> lineTo([3.36, -4.2], %) // HorizontalLineAbsolute + |> lineTo([3.36, -3.36], %) // VerticalLineAbsolute + |> lineTo([17.64, -3.36], %) // HorizontalLineAbsolute + |> lineTo([17.64, -4.2], %) // VerticalLineAbsolute + |> lineTo([18.48, -4.2], %) // HorizontalLineRelative + |> lineTo([18.48, -5.04], %) // VerticalLineHorizonal + |> lineTo([19.32, -5.04], %) // HorizontalLineRelative + |> lineTo([19.32, -5.88], %) // VerticalLineHorizonal + |> lineTo([20.16, -5.88], %) // HorizontalLineRelative + |> lineTo([20.16, -6.72], %) // VerticalLineAbsolute + |> lineTo([21, -6.72], %) // HorizontalLineAbsolute + |> lineTo([21, -24.36], %) // VerticalLineHorizonal + |> lineTo([20.16, -24.36], %) // HorizontalLineRelative + |> lineTo([20.16, -25.2], %) // VerticalLineHorizonal + |> lineTo([18.48, -25.2], %) // HorizontalLineRelative + |> lineTo([18.48, -26.04], %) // VerticalLineHorizonal + |> lineTo([15.96, -26.04], %) // HorizontalLineRelative + |> lineTo([15.96, -26.88], %) // VerticalLineHorizonal + |> lineTo([16.8, -26.88], %) // HorizontalLineRelative + |> lineTo([16.8, -28.56], %) // VerticalLineHorizonal + |> lineTo([11.76, -28.56], %) // HorizontalLineAbsolute + |> lineTo([11.76, -26.88], %) // VerticalLineAbsolute + |> lineTo([12.6, -26.88], %) // HorizontalLineAbsolute + |> lineTo([12.6, -26.04], %) // VerticalLineAbsolute + |> lineTo([8.4, -26.04], %) // HorizontalLineAbsolute + |> lineTo([8.4, -26.88], %) // VerticalLineHorizonal + |> lineTo([9.24, -26.88], %) // HorizontalLineRelative + |> lineTo([9.24, -28.56], %) // VerticalLineHorizonal + |> lineTo([4.2, -28.56], %) // HorizontalLineAbsolute + |> lineTo([4.2, -26.88], %) // VerticalLineHorizonal + |> lineTo([5.04, -26.88], %) // HorizontalLineRelative + |> lineTo([5.04, -26.04], %) // VerticalLineHorizonal + |> lineTo([0.839996, -20.58], %) // MoveRelative + |> lineTo([0.839996, -24.36], %) // VerticalLineHorizonal + |> lineTo([2.52, -24.36], %) // HorizontalLineAbsolute + |> lineTo([2.52, -25.2], %) // VerticalLineHorizonal + |> lineTo([18.48, -25.2], %) // HorizontalLineRelative + |> lineTo([18.48, -24.36], %) // VerticalLineHorizonal + |> lineTo([20.16, -24.36], %) // HorizontalLineRelative + |> lineTo([20.16, -20.58], %) // VerticalLineAbsolute + // StopAbsolute + |> lineTo([7.56, -24.36], %) // MoveAbsolute + |> lineTo([7.56, -22.68], %) // VerticalLineHorizonal + |> lineTo([13.44, -22.68], %) // HorizontalLineRelative + |> lineTo([13.44, -24.36], %) // VerticalLineHorizonal + |> lineTo([1.68, -22.68], %) // MoveRelative + |> lineTo([1.68, -21.84], %) // VerticalLineHorizonal + |> lineTo([5.88, -21.84], %) // HorizontalLineRelative + |> lineTo([5.88, -22.68], %) // VerticalLineHorizonal + |> lineTo([3.36, -24.36], %) // MoveRelative + |> lineTo([3.36, -23.52], %) // VerticalLineHorizonal + |> lineTo([5.88, -23.52], %) // HorizontalLineRelative + |> lineTo([5.88, -24.36], %) // VerticalLineHorizonal + |> lineTo([15.12, -22.68], %) // MoveRelative + |> lineTo([15.12, -21.84], %) // VerticalLineHorizonal + |> lineTo([15.959999999999999, -21.84], %) // HorizontalLineRelative + |> lineTo([15.959999999999999, -22.68], %) // VerticalLineHorizonal + |> lineTo([16.8, -22.68], %) // MoveRelative + |> lineTo([16.8, -21.84], %) // VerticalLineHorizonal + |> lineTo([17.64, -21.84], %) // HorizontalLineRelative + |> lineTo([17.64, -22.68], %) // VerticalLineHorizonal + |> lineTo([18.48, -22.68], %) // MoveRelative + |> lineTo([18.48, -21.84], %) // VerticalLineHorizonal + |> lineTo([19.32, -21.84], %) // HorizontalLineRelative + |> lineTo([19.32, -22.68], %) // VerticalLineHorizonal + |> lineTo([15.12, -24.36], %) // MoveRelative + |> lineTo([15.12, -23.52], %) // VerticalLineHorizonal + |> lineTo([17.64, -23.52], %) // HorizontalLineRelative + |> lineTo([17.64, -24.36], %) // VerticalLineHorizonal + |> lineTo([18.48, -5.88], %) // MoveAbsolute + |> lineTo([18.48, -5.04], %) // VerticalLineAbsolute + |> lineTo([17.64, -5.04], %) // HorizontalLineAbsolute + |> lineTo([17.64, -4.2], %) // VerticalLineAbsolute + |> lineTo([3.36, -4.2], %) // HorizontalLineAbsolute + |> lineTo([3.36, -5.04], %) // VerticalLineAbsolute + |> lineTo([2.52, -5.04], %) // HorizontalLineAbsolute + |> lineTo([2.52, -5.88], %) // VerticalLineAbsolute + |> lineTo([1.68, -5.88], %) // HorizontalLineAbsolute + |> lineTo([1.68, -6.72], %) // VerticalLineAbsolute + |> lineTo([0.839996, -6.72], %) // HorizontalLineAbsolute + |> lineTo([0.839996, -8.4], %) // VerticalLineAbsolute + |> lineTo([20.16, -8.4], %) // HorizontalLineAbsolute + |> lineTo([20.16, -6.72], %) // VerticalLineAbsolute + |> lineTo([19.32, -6.72], %) // HorizontalLineAbsolute + |> lineTo([19.32, -5.88], %) // VerticalLineAbsolute + |> lineTo([20.16, -7.56], %) // MoveAbsolute + |> lineTo([0.839996, -7.56], %) // HorizontalLineAbsolute + |> lineTo([0.839996, -19.32], %) // VerticalLineAbsolute + |> lineTo([20.16, -19.32], %) // HorizontalLineAbsolute + |> lineTo([3.36, -10.08], %) // MoveAbsolute + |> lineTo([3.36, -9.24001], %) // VerticalLineAbsolute + |> lineTo([17.64, -9.24001], %) // HorizontalLineAbsolute + |> lineTo([17.64, -10.08], %) // VerticalLineAbsolute + |> lineTo([18.48, -10.08], %) // HorizontalLineRelative + |> lineTo([18.48, -16.8], %) // VerticalLineHorizonal + |> lineTo([17.64, -16.8], %) // HorizontalLineRelative + |> lineTo([17.64, -17.64], %) // VerticalLineHorizonal + |> lineTo([3.36, -17.64], %) // HorizontalLineAbsolute + |> lineTo([3.36, -16.8], %) // VerticalLineAbsolute + |> lineTo([2.52, -16.8], %) // HorizontalLineAbsolute + |> lineTo([2.52, -10.080000000000002], %) // VerticalLineHorizonal + |> lineTo([13.44, -10.92], %) // MoveRelative + |> lineTo([13.44, -10.08], %) // VerticalLineHorizonal + |> lineTo([15.12, -10.08], %) // HorizontalLineRelative + |> lineTo([15.12, -13.44], %) // VerticalLineHorizonal + |> lineTo([14.28, -13.44], %) // HorizontalLineRelative + |> lineTo([9.24, -13.44], %) // MoveRelative + |> lineTo([11.76, -13.44], %) // HorizontalLineRelative + |> lineTo([11.76, -14.28], %) // VerticalLineHorizonal + |> lineTo([10.92, -14.28], %) // HorizontalLineRelative here + |> lineTo([10.92, -15.959999999999999], %) // VerticalLineHorizonal + |> lineTo([13.44, -15.959999999999999], %) // HorizontalLineRelative + |> lineTo([13.44, -15.12], %) // VerticalLineHorizonal + |> lineTo([14.28, -15.12], %) // HorizontalLineRelative + |> lineTo([14.28, -15.959999999999999], %) // VerticalLineHorizonal + |> lineTo([13.44, -15.959999999999999], %) // HorizontalLineAbsolute + |> lineTo([13.44, -16.8], %) // VerticalLineAbsolute + |> lineTo([7.56, -16.8], %) // HorizontalLineAbsolute + |> lineTo([7.56, -15.96], %) // VerticalLineAbsolute + |> lineTo([6.72, -15.96], %) // HorizontalLineAbsolute + |> lineTo([6.72, -15.120000000000001], %) // VerticalLineHorizonal + |> lineTo([7.56, -15.120000000000001], %) // HorizontalLineRelative + |> lineTo([7.56, -15.96], %) // VerticalLineHorizonal + |> lineTo([10.08, -15.96], %) // HorizontalLineRelative + |> lineTo([10.08, -14.28], %) // VerticalLineAbsolute + |> lineTo([9.24, -14.28], %) // HorizontalLineAbsolute + |> lineTo([7.56, -12.6], %) // MoveAbsolute + |> lineTo([7.56, -11.76], %) // VerticalLineAbsolute + |> lineTo([5.04, -11.76], %) // HorizontalLineAbsolute + |> lineTo([5.04, -12.6], %) // VerticalLineAbsolute + |> lineTo([4.2, -12.6], %) // HorizontalLineAbsolute + |> lineTo([4.2, -11.76], %) // VerticalLineHorizonal + |> lineTo([5.04, -11.76], %) // HorizontalLineRelative + |> lineTo([5.04, -10.92], %) // VerticalLineHorizonal + |> lineTo([7.5600000000000005, -10.92], %) // HorizontalLineRelative + |> lineTo([7.5600000000000005, -11.76], %) // VerticalLineHorizonal + |> lineTo([8.4, -11.76], %) // HorizontalLineAbsolute + |> lineTo([8.4, -12.6], %) // VerticalLineHorizonal + |> lineTo([3.36, -5.88], %) // MoveAbsolute + |> lineTo([3.36, -5.04], %) // VerticalLineAbsolute + |> lineTo([4.2, -5.04], %) // HorizontalLineAbsolute + |> lineTo([4.2, -3.36], %) // VerticalLineAbsolute + |> lineTo([5.04, -3.36], %) // HorizontalLineAbsolute + |> lineTo([5.04, -1.68], %) // VerticalLineAbsolute + |> lineTo([5.88, -1.68], %) // HorizontalLineAbsolute + |> lineTo([5.88, -0.83999599], %) // VerticalLineAbsolute + |> lineTo([6.72, -0.83999599], %) // HorizontalLineAbsolute + |> lineTo([6.72, -1.68], %) // VerticalLineAbsolute + |> lineTo([7.56, -1.68], %) // HorizontalLineAbsolute + |> lineTo([7.56, -3.36], %) // VerticalLineAbsolute + |> lineTo([8.4, -3.36], %) // HorizontalLineAbsolute + |> lineTo([8.4, -5.04], %) // VerticalLineHorizonal + |> lineTo([9.24, -5.04], %) // HorizontalLineRelative + |> lineTo([9.24, -5.88], %) // VerticalLineHorizonal + |> lineTo([17.64, -5.04], %) // MoveAbsolute + |> lineTo([17.64, -5.88], %) // VerticalLineAbsolute + |> lineTo([11.76, -5.88], %) // HorizontalLineAbsolute + |> lineTo([11.76, -5.04], %) // VerticalLineAbsolute + |> lineTo([12.6, -5.04], %) // HorizontalLineAbsolute + |> lineTo([12.6, -3.36], %) // VerticalLineAbsolute + |> lineTo([13.44, -3.36], %) // HorizontalLineRelative + |> lineTo([13.44, -1.68], %) // VerticalLineAbsolute + |> lineTo([14.28, -1.68], %) // HorizontalLineRelative + |> lineTo([14.28, -0.83999599], %) // VerticalLineAbsolute + |> lineTo([15.12, -0.83999599], %) // HorizontalLineRelative + |> lineTo([15.12, -1.68], %) // VerticalLineAbsolute + |> lineTo([15.959999999999999, -1.68], %) // HorizontalLineRelative + |> lineTo([15.959999999999999, -3.36], %) // VerticalLineHorizonal + |> lineTo([16.8, -3.36], %) // HorizontalLineRelative + |> lineTo([16.8, -5.04], %) // VerticalLineHorizonal + |> lineTo([13.44, -1.68], %) // MoveAbsolute + |> lineTo([13.44, -0], %) // VerticalLineAbsolute + |> lineTo([15.959999999999999, -0], %) // HorizontalLineRelative + |> lineTo([15.959999999999999, -1.68], %) // VerticalLineHorizonal + |> lineTo([16.8, -1.68], %) // HorizontalLineRelative + |> lineTo([16.8, -3.36], %) // VerticalLineHorizonal + |> lineTo([17.64, -3.36], %) // HorizontalLineRelative + |> lineTo([17.64, -4.62], %) // VerticalLineAbsolute + |> lineTo([16.8, -4.62], %) // HorizontalLineAbsolute + |> lineTo([16.8, -3.36], %) // VerticalLineAbsolute + |> lineTo([15.96, -3.36], %) // HorizontalLineAbsolute + |> lineTo([15.96, -1.68], %) // VerticalLineAbsolute + |> lineTo([15.12, -1.68], %) // HorizontalLineAbsolute + |> lineTo([15.12, -0.83999999], %) // VerticalLineAbsolute + |> lineTo([14.28, -0.83999999], %) // HorizontalLineAbsolute + |> lineTo([14.28, -1.68], %) // VerticalLineAbsolute + |> lineTo([13.44, -1.68], %) // HorizontalLineAbsolute + |> lineTo([13.44, -3.36], %) // VerticalLineAbsolute + |> lineTo([12.6, -3.36], %) // HorizontalLineAbsolute + |> lineTo([12.6, -4.62], %) // VerticalLineAbsolute + |> lineTo([11.76, -4.62], %) // HorizontalLineAbsolute + |> lineTo([11.76, -3.36], %) // VerticalLineAbsolute + |> lineTo([12.6, -3.36], %) // HorizontalLineAbsolute + |> lineTo([12.6, -1.68], %) // VerticalLineAbsolute + |> lineTo([5.04, -1.68], %) // MoveAbsolute + |> lineTo([5.04, -0], %) // VerticalLineAbsolute + |> lineTo([7.56, -0], %) // HorizontalLineAbsolute + |> lineTo([7.56, -1.68], %) // VerticalLineAbsolute + |> lineTo([8.4, -1.68], %) // HorizontalLineAbsolute + |> lineTo([8.4, -3.36], %) // VerticalLineAbsolute + |> lineTo([9.24, -3.36], %) // HorizontalLineAbsolute + |> lineTo([9.24, -4.62], %) // VerticalLineAbsolute + |> lineTo([8.4, -4.62], %) // HorizontalLineAbsolute + |> lineTo([8.4, -3.36], %) // VerticalLineAbsolute + |> lineTo([7.56, -3.36], %) // HorizontalLineAbsolute + |> lineTo([7.56, -1.68], %) // VerticalLineAbsolute + |> lineTo([6.72, -1.68], %) // HorizontalLineAbsolute + |> lineTo([6.72, -0.83999999], %) // VerticalLineAbsolute + |> lineTo([5.88, -0.83999999], %) // HorizontalLineAbsolute + |> lineTo([5.88, -1.68], %) // VerticalLineAbsolute + |> lineTo([5.04, -1.68], %) // HorizontalLineAbsolute + |> lineTo([5.04, -3.36], %) // VerticalLineAbsolute + |> lineTo([4.2, -3.36], %) // HorizontalLineAbsolute + |> lineTo([4.2, -4.62], %) // VerticalLineAbsolute + |> lineTo([3.36, -4.62], %) // HorizontalLineAbsolute + |> lineTo([3.36, -3.36], %) // VerticalLineAbsolute + |> lineTo([4.2, -3.36], %) // HorizontalLineAbsolute + |> lineTo([4.2, -1.68], %) // VerticalLineAbsolute + |> lineTo([13.44, -5.88], %) // MoveAbsolute + |> lineTo([13.44, -5.04], %) // VerticalLineAbsolute + |> lineTo([14.28, -5.04], %) // HorizontalLineRelative + |> lineTo([14.28, -4.2], %) // VerticalLineAbsolute + |> lineTo([15.12, -4.2], %) // HorizontalLineRelative + |> lineTo([15.12, -5.04], %) // VerticalLineHorizonal + |> lineTo([15.959999999999999, -5.04], %) // HorizontalLineRelative + |> lineTo([15.959999999999999, -5.88], %) // VerticalLineHorizonal + |> lineTo([5.88, -5.04], %) // MoveAbsolute + |> lineTo([5.88, -4.2], %) // VerticalLineAbsolute + |> lineTo([6.72, -4.2], %) // HorizontalLineAbsolute + |> lineTo([6.72, -5.04], %) // VerticalLineAbsolute + |> lineTo([7.56, -5.04], %) // HorizontalLineAbsolute + |> lineTo([7.56, -5.88], %) // VerticalLineAbsolute + |> lineTo([5.04, -5.88], %) // HorizontalLineAbsolute + |> lineTo([5.04, -5.04], %) // VerticalLineAbsolute + |> lineTo([17.64, -5.88], %) // MoveAbsolute + |> lineTo([17.64, -5.04], %) // VerticalLineAbsolute + |> lineTo([16.8, -5.04], %) // HorizontalLineAbsolute + |> lineTo([16.8, -4.2], %) // VerticalLineAbsolute + |> lineTo([17.64, -4.2], %) // HorizontalLineRelative + |> lineTo([17.64, -5.04], %) // VerticalLineHorizonal + |> lineTo([18.48, -5.04], %) // HorizontalLineRelative + |> lineTo([18.48, -5.88], %) // VerticalLineHorizonal + |> lineTo([3.36, -5.04], %) // MoveAbsolute + |> lineTo([3.36, -5.88], %) // VerticalLineAbsolute + |> lineTo([2.52, -5.88], %) // HorizontalLineAbsolute + |> lineTo([2.52, -5.04], %) // VerticalLineAbsolute + |> lineTo([3.36, -5.04], %) // HorizontalLineAbsolute + |> lineTo([3.36, -4.2], %) // VerticalLineAbsolute + |> lineTo([4.2, -4.2], %) // HorizontalLineAbsolute + |> lineTo([4.2, -5.04], %) // VerticalLineHorizonal + |> lineTo([8.4, -4.2], %) // MoveRelative + |> lineTo([9.24, -4.2], %) // HorizontalLineRelative + |> lineTo([9.24, -5.04], %) // VerticalLineHorizonal + |> lineTo([10.08, -5.04], %) // HorizontalLineRelative + |> lineTo([10.08, -5.88], %) // VerticalLineAbsolute + |> lineTo([9.24, -5.88], %) // HorizontalLineAbsolute + |> lineTo([9.24, -5.04], %) // VerticalLineAbsolute + |> lineTo([8.4, -5.04], %) // HorizontalLineAbsolute + |> lineTo([11.76, -4.2], %) // MoveAbsolute + |> lineTo([12.6, -4.2], %) // HorizontalLineAbsolute + |> lineTo([12.6, -5.04], %) // VerticalLineAbsolute + |> lineTo([11.76, -5.04], %) // HorizontalLineAbsolute + |> lineTo([11.76, -5.88], %) // VerticalLineAbsolute + |> lineTo([10.92, -5.88], %) // HorizontalLineAbsolute + |> lineTo([10.92, -5.04], %) // VerticalLineAbsolute + |> lineTo([11.76, -5.04], %) // HorizontalLineRelative + |> lineTo([14.28, -10.92], %) // MoveRelative + |> lineTo([13.44, -10.92], %) // HorizontalLineRelative + |> lineTo([13.44, -13.44], %) // VerticalLineHorizonal + |> lineTo([14.28, -13.44], %) // HorizontalLineRelative + |> close(%) + |> extrude(1, %) diff --git a/src/wasm-lib/kcl/tests/kittycad_svg/ops.snap b/src/wasm-lib/kcl/tests/kittycad_svg/ops.snap new file mode 100644 index 000000000..452af00e4 --- /dev/null +++ b/src/wasm-lib/kcl/tests/kittycad_svg/ops.snap @@ -0,0 +1,52 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed kittycad_svg.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 20, + 24, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 6, + 25, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 15826, + 15827, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 15829, + 15830, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 15818, + 15831, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/kittycad_svg/program_memory.snap b/src/wasm-lib/kcl/tests/kittycad_svg/program_memory.snap new file mode 100644 index 000000000..31bc35de6 --- /dev/null +++ b/src/wasm-lib/kcl/tests/kittycad_svg/program_memory.snap @@ -0,0 +1,8847 @@ +--- +source: kcl/src/simulation_tests.rs +assertion_line: 92 +description: Program memory after executing kittycad_svg.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "svg": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 62, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 109, + 133, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 163, + 187, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 219, + 244, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 274, + 296, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 328, + 349, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 379, + 403, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 435, + 459, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 489, + 513, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 545, + 569, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 599, + 623, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 655, + 678, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 708, + 731, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 763, + 787, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 817, + 842, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 874, + 898, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 928, + 952, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 984, + 1009, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1040, + 1065, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1097, + 1122, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1153, + 1178, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1210, + 1235, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1265, + 1287, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1319, + 1342, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1373, + 1399, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1431, + 1456, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1487, + 1512, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1544, + 1570, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1601, + 1627, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1659, + 1685, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1716, + 1741, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1773, + 1798, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1829, + 1855, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1887, + 1913, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1943, + 1968, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2000, + 2025, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2055, + 2079, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2111, + 2135, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2166, + 2191, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2223, + 2248, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2279, + 2303, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2335, + 2359, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2390, + 2415, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2447, + 2472, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2503, + 2532, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2554, + 2583, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2614, + 2639, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2671, + 2695, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2726, + 2751, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2783, + 2809, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2840, + 2866, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2898, + 2924, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2972, + 2997, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3019, + 3044, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3075, + 3101, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3133, + 3159, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3190, + 3215, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3237, + 3262, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3293, + 3318, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3350, + 3375, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3406, + 3431, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3453, + 3478, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3509, + 3534, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3566, + 3591, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3622, + 3648, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3670, + 3696, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3727, + 3766, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3798, + 3837, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3868, + 3893, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3915, + 3940, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3971, + 3997, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4029, + 4055, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4086, + 4112, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4134, + 4160, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4191, + 4217, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4249, + 4275, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4306, + 4332, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4354, + 4380, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4411, + 4437, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4469, + 4495, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4526, + 4551, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4573, + 4598, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4628, + 4653, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4685, + 4709, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4739, + 4762, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4794, + 4818, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4848, + 4872, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4904, + 4928, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4958, + 4982, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5014, + 5038, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5068, + 5096, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5128, + 5155, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5185, + 5209, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5241, + 5266, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5296, + 5321, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5353, + 5378, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5408, + 5433, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5455, + 5483, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5515, + 5544, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5574, + 5600, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5632, + 5657, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5679, + 5706, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5736, + 5764, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5796, + 5822, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5852, + 5878, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5910, + 5935, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5966, + 5991, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6023, + 6049, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6080, + 6105, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6137, + 6161, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6191, + 6215, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6247, + 6285, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6316, + 6342, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6364, + 6390, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6421, + 6447, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6479, + 6505, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6594, + 6619, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6641, + 6667, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6699, + 6725, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6756, + 6782, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6819, + 6858, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6889, + 6928, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6960, + 6986, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7017, + 7043, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7075, + 7114, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7145, + 7184, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7216, + 7241, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7271, + 7295, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7327, + 7352, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7382, + 7407, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7439, + 7477, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7508, + 7546, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7578, + 7603, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7634, + 7660, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7692, + 7718, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7748, + 7773, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7805, + 7829, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7851, + 7876, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7906, + 7931, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7963, + 7987, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8017, + 8040, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8072, + 8096, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8127, + 8152, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8184, + 8209, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8240, + 8279, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8311, + 8350, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8381, + 8405, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8437, + 8460, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8491, + 8515, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8537, + 8561, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8591, + 8614, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8646, + 8669, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8699, + 8723, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8755, + 8779, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8809, + 8833, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8865, + 8895, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8925, + 8955, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8987, + 9011, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9041, + 9065, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9097, + 9121, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9151, + 9174, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9206, + 9229, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9260, + 9284, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9316, + 9340, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9371, + 9396, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9418, + 9443, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9473, + 9498, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9530, + 9555, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9585, + 9609, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9641, + 9665, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9695, + 9720, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9752, + 9777, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9807, + 9832, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9864, + 9895, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9925, + 9956, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9988, + 10013, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10043, + 10081, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10113, + 10151, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10182, + 10206, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10238, + 10262, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10293, + 10318, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10340, + 10362, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10392, + 10427, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10459, + 10497, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10528, + 10552, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10584, + 10608, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10639, + 10664, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10696, + 10721, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10751, + 10775, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10807, + 10831, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10861, + 10886, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10918, + 10943, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10973, + 10998, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11030, + 11061, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11091, + 11122, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11154, + 11179, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11209, + 11234, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11266, + 11291, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11321, + 11345, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11377, + 11401, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11431, + 11456, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11488, + 11513, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11543, + 11567, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11599, + 11623, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11653, + 11677, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11699, + 11720, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11750, + 11771, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11803, + 11827, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11857, + 11880, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11912, + 11935, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11965, + 11989, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12021, + 12045, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12075, + 12098, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12130, + 12153, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12183, + 12207, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12239, + 12263, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12293, + 12317, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12349, + 12379, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12409, + 12439, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12471, + 12495, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12525, + 12549, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12581, + 12605, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12635, + 12658, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12690, + 12713, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12743, + 12767, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12799, + 12823, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12853, + 12876, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12908, + 12931, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12961, + 12986, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13008, + 13033, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13063, + 13088, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13120, + 13144, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13174, + 13198, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13230, + 13255, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13286, + 13324, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13356, + 13394, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13425, + 13449, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13471, + 13494, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13524, + 13547, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13579, + 13603, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13633, + 13657, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13689, + 13713, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13743, + 13767, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13799, + 13823, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13853, + 13878, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13900, + 13925, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13955, + 13979, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14011, + 14034, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14064, + 14088, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14120, + 14145, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14176, + 14201, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14233, + 14258, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14289, + 14313, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14335, + 14359, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14389, + 14413, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14445, + 14469, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14499, + 14523, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14555, + 14578, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14608, + 14630, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14662, + 14685, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14716, + 14738, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14760, + 14783, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14815, + 14839, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14870, + 14895, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14927, + 14952, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14982, + 15006, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15038, + 15062, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15092, + 15115, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15147, + 15171, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15193, + 15216, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15248, + 15272, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15302, + 15327, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15359, + 15384, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15414, + 15439, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15471, + 15496, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15526, + 15551, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15583, + 15609, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15631, + 15657, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15689, + 15715, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15746, + 15772, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15804, + 15812, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 62, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 2.52, + -26.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 109, + 133, + 0 + ] + }, + "from": [ + 2.52, + -26.04 + ], + "tag": null, + "to": [ + 2.52, + -25.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 163, + 187, + 0 + ] + }, + "from": [ + 2.52, + -25.2 + ], + "tag": null, + "to": [ + 0.84, + -25.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 219, + 244, + 0 + ] + }, + "from": [ + 0.84, + -25.2 + ], + "tag": null, + "to": [ + 0.84, + -24.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 274, + 296, + 0 + ] + }, + "from": [ + 0.84, + -24.36 + ], + "tag": null, + "to": [ + 0.0, + -24.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 328, + 349, + 0 + ] + }, + "from": [ + 0.0, + -24.36 + ], + "tag": null, + "to": [ + 0.0, + -6.72 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 379, + 403, + 0 + ] + }, + "from": [ + 0.0, + -6.72 + ], + "tag": null, + "to": [ + 0.84, + -6.72 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 435, + 459, + 0 + ] + }, + "from": [ + 0.84, + -6.72 + ], + "tag": null, + "to": [ + 0.84, + -5.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 489, + 513, + 0 + ] + }, + "from": [ + 0.84, + -5.88 + ], + "tag": null, + "to": [ + 1.68, + -5.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 545, + 569, + 0 + ] + }, + "from": [ + 1.68, + -5.88 + ], + "tag": null, + "to": [ + 1.68, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 599, + 623, + 0 + ] + }, + "from": [ + 1.68, + -5.04 + ], + "tag": null, + "to": [ + 2.52, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 655, + 678, + 0 + ] + }, + "from": [ + 2.52, + -5.04 + ], + "tag": null, + "to": [ + 2.52, + -4.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 708, + 731, + 0 + ] + }, + "from": [ + 2.52, + -4.2 + ], + "tag": null, + "to": [ + 3.36, + -4.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 763, + 787, + 0 + ] + }, + "from": [ + 3.36, + -4.2 + ], + "tag": null, + "to": [ + 3.36, + -3.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 817, + 842, + 0 + ] + }, + "from": [ + 3.36, + -3.36 + ], + "tag": null, + "to": [ + 17.64, + -3.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 874, + 898, + 0 + ] + }, + "from": [ + 17.64, + -3.36 + ], + "tag": null, + "to": [ + 17.64, + -4.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 928, + 952, + 0 + ] + }, + "from": [ + 17.64, + -4.2 + ], + "tag": null, + "to": [ + 18.48, + -4.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 984, + 1009, + 0 + ] + }, + "from": [ + 18.48, + -4.2 + ], + "tag": null, + "to": [ + 18.48, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1040, + 1065, + 0 + ] + }, + "from": [ + 18.48, + -5.04 + ], + "tag": null, + "to": [ + 19.32, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1097, + 1122, + 0 + ] + }, + "from": [ + 19.32, + -5.04 + ], + "tag": null, + "to": [ + 19.32, + -5.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1153, + 1178, + 0 + ] + }, + "from": [ + 19.32, + -5.88 + ], + "tag": null, + "to": [ + 20.16, + -5.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1210, + 1235, + 0 + ] + }, + "from": [ + 20.16, + -5.88 + ], + "tag": null, + "to": [ + 20.16, + -6.72 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1265, + 1287, + 0 + ] + }, + "from": [ + 20.16, + -6.72 + ], + "tag": null, + "to": [ + 21.0, + -6.72 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1319, + 1342, + 0 + ] + }, + "from": [ + 21.0, + -6.72 + ], + "tag": null, + "to": [ + 21.0, + -24.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1373, + 1399, + 0 + ] + }, + "from": [ + 21.0, + -24.36 + ], + "tag": null, + "to": [ + 20.16, + -24.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1431, + 1456, + 0 + ] + }, + "from": [ + 20.16, + -24.36 + ], + "tag": null, + "to": [ + 20.16, + -25.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1487, + 1512, + 0 + ] + }, + "from": [ + 20.16, + -25.2 + ], + "tag": null, + "to": [ + 18.48, + -25.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1544, + 1570, + 0 + ] + }, + "from": [ + 18.48, + -25.2 + ], + "tag": null, + "to": [ + 18.48, + -26.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1601, + 1627, + 0 + ] + }, + "from": [ + 18.48, + -26.04 + ], + "tag": null, + "to": [ + 15.96, + -26.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1659, + 1685, + 0 + ] + }, + "from": [ + 15.96, + -26.04 + ], + "tag": null, + "to": [ + 15.96, + -26.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1716, + 1741, + 0 + ] + }, + "from": [ + 15.96, + -26.88 + ], + "tag": null, + "to": [ + 16.8, + -26.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1773, + 1798, + 0 + ] + }, + "from": [ + 16.8, + -26.88 + ], + "tag": null, + "to": [ + 16.8, + -28.56 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1829, + 1855, + 0 + ] + }, + "from": [ + 16.8, + -28.56 + ], + "tag": null, + "to": [ + 11.76, + -28.56 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1887, + 1913, + 0 + ] + }, + "from": [ + 11.76, + -28.56 + ], + "tag": null, + "to": [ + 11.76, + -26.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1943, + 1968, + 0 + ] + }, + "from": [ + 11.76, + -26.88 + ], + "tag": null, + "to": [ + 12.6, + -26.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2000, + 2025, + 0 + ] + }, + "from": [ + 12.6, + -26.88 + ], + "tag": null, + "to": [ + 12.6, + -26.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2055, + 2079, + 0 + ] + }, + "from": [ + 12.6, + -26.04 + ], + "tag": null, + "to": [ + 8.4, + -26.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2111, + 2135, + 0 + ] + }, + "from": [ + 8.4, + -26.04 + ], + "tag": null, + "to": [ + 8.4, + -26.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2166, + 2191, + 0 + ] + }, + "from": [ + 8.4, + -26.88 + ], + "tag": null, + "to": [ + 9.24, + -26.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2223, + 2248, + 0 + ] + }, + "from": [ + 9.24, + -26.88 + ], + "tag": null, + "to": [ + 9.24, + -28.56 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2279, + 2303, + 0 + ] + }, + "from": [ + 9.24, + -28.56 + ], + "tag": null, + "to": [ + 4.2, + -28.56 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2335, + 2359, + 0 + ] + }, + "from": [ + 4.2, + -28.56 + ], + "tag": null, + "to": [ + 4.2, + -26.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2390, + 2415, + 0 + ] + }, + "from": [ + 4.2, + -26.88 + ], + "tag": null, + "to": [ + 5.04, + -26.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2447, + 2472, + 0 + ] + }, + "from": [ + 5.04, + -26.88 + ], + "tag": null, + "to": [ + 5.04, + -26.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2503, + 2532, + 0 + ] + }, + "from": [ + 5.04, + -26.04 + ], + "tag": null, + "to": [ + 0.84, + -20.58 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2554, + 2583, + 0 + ] + }, + "from": [ + 0.84, + -20.58 + ], + "tag": null, + "to": [ + 0.84, + -24.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2614, + 2639, + 0 + ] + }, + "from": [ + 0.84, + -24.36 + ], + "tag": null, + "to": [ + 2.52, + -24.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2671, + 2695, + 0 + ] + }, + "from": [ + 2.52, + -24.36 + ], + "tag": null, + "to": [ + 2.52, + -25.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2726, + 2751, + 0 + ] + }, + "from": [ + 2.52, + -25.2 + ], + "tag": null, + "to": [ + 18.48, + -25.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2783, + 2809, + 0 + ] + }, + "from": [ + 18.48, + -25.2 + ], + "tag": null, + "to": [ + 18.48, + -24.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2840, + 2866, + 0 + ] + }, + "from": [ + 18.48, + -24.36 + ], + "tag": null, + "to": [ + 20.16, + -24.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2898, + 2924, + 0 + ] + }, + "from": [ + 20.16, + -24.36 + ], + "tag": null, + "to": [ + 20.16, + -20.58 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2972, + 2997, + 0 + ] + }, + "from": [ + 20.16, + -20.58 + ], + "tag": null, + "to": [ + 7.56, + -24.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3019, + 3044, + 0 + ] + }, + "from": [ + 7.56, + -24.36 + ], + "tag": null, + "to": [ + 7.56, + -22.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3075, + 3101, + 0 + ] + }, + "from": [ + 7.56, + -22.68 + ], + "tag": null, + "to": [ + 13.44, + -22.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3133, + 3159, + 0 + ] + }, + "from": [ + 13.44, + -22.68 + ], + "tag": null, + "to": [ + 13.44, + -24.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3190, + 3215, + 0 + ] + }, + "from": [ + 13.44, + -24.36 + ], + "tag": null, + "to": [ + 1.68, + -22.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3237, + 3262, + 0 + ] + }, + "from": [ + 1.68, + -22.68 + ], + "tag": null, + "to": [ + 1.68, + -21.84 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3293, + 3318, + 0 + ] + }, + "from": [ + 1.68, + -21.84 + ], + "tag": null, + "to": [ + 5.88, + -21.84 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3350, + 3375, + 0 + ] + }, + "from": [ + 5.88, + -21.84 + ], + "tag": null, + "to": [ + 5.88, + -22.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3406, + 3431, + 0 + ] + }, + "from": [ + 5.88, + -22.68 + ], + "tag": null, + "to": [ + 3.36, + -24.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3453, + 3478, + 0 + ] + }, + "from": [ + 3.36, + -24.36 + ], + "tag": null, + "to": [ + 3.36, + -23.52 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3509, + 3534, + 0 + ] + }, + "from": [ + 3.36, + -23.52 + ], + "tag": null, + "to": [ + 5.88, + -23.52 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3566, + 3591, + 0 + ] + }, + "from": [ + 5.88, + -23.52 + ], + "tag": null, + "to": [ + 5.88, + -24.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3622, + 3648, + 0 + ] + }, + "from": [ + 5.88, + -24.36 + ], + "tag": null, + "to": [ + 15.12, + -22.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3670, + 3696, + 0 + ] + }, + "from": [ + 15.12, + -22.68 + ], + "tag": null, + "to": [ + 15.12, + -21.84 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3727, + 3766, + 0 + ] + }, + "from": [ + 15.12, + -21.84 + ], + "tag": null, + "to": [ + 15.96, + -21.84 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3798, + 3837, + 0 + ] + }, + "from": [ + 15.96, + -21.84 + ], + "tag": null, + "to": [ + 15.96, + -22.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3868, + 3893, + 0 + ] + }, + "from": [ + 15.96, + -22.68 + ], + "tag": null, + "to": [ + 16.8, + -22.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3915, + 3940, + 0 + ] + }, + "from": [ + 16.8, + -22.68 + ], + "tag": null, + "to": [ + 16.8, + -21.84 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3971, + 3997, + 0 + ] + }, + "from": [ + 16.8, + -21.84 + ], + "tag": null, + "to": [ + 17.64, + -21.84 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4029, + 4055, + 0 + ] + }, + "from": [ + 17.64, + -21.84 + ], + "tag": null, + "to": [ + 17.64, + -22.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4086, + 4112, + 0 + ] + }, + "from": [ + 17.64, + -22.68 + ], + "tag": null, + "to": [ + 18.48, + -22.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4134, + 4160, + 0 + ] + }, + "from": [ + 18.48, + -22.68 + ], + "tag": null, + "to": [ + 18.48, + -21.84 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4191, + 4217, + 0 + ] + }, + "from": [ + 18.48, + -21.84 + ], + "tag": null, + "to": [ + 19.32, + -21.84 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4249, + 4275, + 0 + ] + }, + "from": [ + 19.32, + -21.84 + ], + "tag": null, + "to": [ + 19.32, + -22.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4306, + 4332, + 0 + ] + }, + "from": [ + 19.32, + -22.68 + ], + "tag": null, + "to": [ + 15.12, + -24.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4354, + 4380, + 0 + ] + }, + "from": [ + 15.12, + -24.36 + ], + "tag": null, + "to": [ + 15.12, + -23.52 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4411, + 4437, + 0 + ] + }, + "from": [ + 15.12, + -23.52 + ], + "tag": null, + "to": [ + 17.64, + -23.52 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4469, + 4495, + 0 + ] + }, + "from": [ + 17.64, + -23.52 + ], + "tag": null, + "to": [ + 17.64, + -24.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4526, + 4551, + 0 + ] + }, + "from": [ + 17.64, + -24.36 + ], + "tag": null, + "to": [ + 18.48, + -5.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4573, + 4598, + 0 + ] + }, + "from": [ + 18.48, + -5.88 + ], + "tag": null, + "to": [ + 18.48, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4628, + 4653, + 0 + ] + }, + "from": [ + 18.48, + -5.04 + ], + "tag": null, + "to": [ + 17.64, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4685, + 4709, + 0 + ] + }, + "from": [ + 17.64, + -5.04 + ], + "tag": null, + "to": [ + 17.64, + -4.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4739, + 4762, + 0 + ] + }, + "from": [ + 17.64, + -4.2 + ], + "tag": null, + "to": [ + 3.36, + -4.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4794, + 4818, + 0 + ] + }, + "from": [ + 3.36, + -4.2 + ], + "tag": null, + "to": [ + 3.36, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4848, + 4872, + 0 + ] + }, + "from": [ + 3.36, + -5.04 + ], + "tag": null, + "to": [ + 2.52, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4904, + 4928, + 0 + ] + }, + "from": [ + 2.52, + -5.04 + ], + "tag": null, + "to": [ + 2.52, + -5.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4958, + 4982, + 0 + ] + }, + "from": [ + 2.52, + -5.88 + ], + "tag": null, + "to": [ + 1.68, + -5.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5014, + 5038, + 0 + ] + }, + "from": [ + 1.68, + -5.88 + ], + "tag": null, + "to": [ + 1.68, + -6.72 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5068, + 5096, + 0 + ] + }, + "from": [ + 1.68, + -6.72 + ], + "tag": null, + "to": [ + 0.84, + -6.72 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5128, + 5155, + 0 + ] + }, + "from": [ + 0.84, + -6.72 + ], + "tag": null, + "to": [ + 0.84, + -8.4 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5185, + 5209, + 0 + ] + }, + "from": [ + 0.84, + -8.4 + ], + "tag": null, + "to": [ + 20.16, + -8.4 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5241, + 5266, + 0 + ] + }, + "from": [ + 20.16, + -8.4 + ], + "tag": null, + "to": [ + 20.16, + -6.72 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5296, + 5321, + 0 + ] + }, + "from": [ + 20.16, + -6.72 + ], + "tag": null, + "to": [ + 19.32, + -6.72 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5353, + 5378, + 0 + ] + }, + "from": [ + 19.32, + -6.72 + ], + "tag": null, + "to": [ + 19.32, + -5.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5408, + 5433, + 0 + ] + }, + "from": [ + 19.32, + -5.88 + ], + "tag": null, + "to": [ + 20.16, + -7.56 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5455, + 5483, + 0 + ] + }, + "from": [ + 20.16, + -7.56 + ], + "tag": null, + "to": [ + 0.84, + -7.56 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5515, + 5544, + 0 + ] + }, + "from": [ + 0.84, + -7.56 + ], + "tag": null, + "to": [ + 0.84, + -19.32 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5574, + 5600, + 0 + ] + }, + "from": [ + 0.84, + -19.32 + ], + "tag": null, + "to": [ + 20.16, + -19.32 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5632, + 5657, + 0 + ] + }, + "from": [ + 20.16, + -19.32 + ], + "tag": null, + "to": [ + 3.36, + -10.08 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5679, + 5706, + 0 + ] + }, + "from": [ + 3.36, + -10.08 + ], + "tag": null, + "to": [ + 3.36, + -9.24 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5736, + 5764, + 0 + ] + }, + "from": [ + 3.36, + -9.24 + ], + "tag": null, + "to": [ + 17.64, + -9.24 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5796, + 5822, + 0 + ] + }, + "from": [ + 17.64, + -9.24 + ], + "tag": null, + "to": [ + 17.64, + -10.08 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5852, + 5878, + 0 + ] + }, + "from": [ + 17.64, + -10.08 + ], + "tag": null, + "to": [ + 18.48, + -10.08 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5910, + 5935, + 0 + ] + }, + "from": [ + 18.48, + -10.08 + ], + "tag": null, + "to": [ + 18.48, + -16.8 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5966, + 5991, + 0 + ] + }, + "from": [ + 18.48, + -16.8 + ], + "tag": null, + "to": [ + 17.64, + -16.8 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6023, + 6049, + 0 + ] + }, + "from": [ + 17.64, + -16.8 + ], + "tag": null, + "to": [ + 17.64, + -17.64 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6080, + 6105, + 0 + ] + }, + "from": [ + 17.64, + -17.64 + ], + "tag": null, + "to": [ + 3.36, + -17.64 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6137, + 6161, + 0 + ] + }, + "from": [ + 3.36, + -17.64 + ], + "tag": null, + "to": [ + 3.36, + -16.8 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6191, + 6215, + 0 + ] + }, + "from": [ + 3.36, + -16.8 + ], + "tag": null, + "to": [ + 2.52, + -16.8 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6247, + 6285, + 0 + ] + }, + "from": [ + 2.52, + -16.8 + ], + "tag": null, + "to": [ + 2.52, + -10.08 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6316, + 6342, + 0 + ] + }, + "from": [ + 2.52, + -10.08 + ], + "tag": null, + "to": [ + 13.44, + -10.92 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6364, + 6390, + 0 + ] + }, + "from": [ + 13.44, + -10.92 + ], + "tag": null, + "to": [ + 13.44, + -10.08 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6421, + 6447, + 0 + ] + }, + "from": [ + 13.44, + -10.08 + ], + "tag": null, + "to": [ + 15.12, + -10.08 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6479, + 6505, + 0 + ] + }, + "from": [ + 15.12, + -10.08 + ], + "tag": null, + "to": [ + 15.12, + -13.44 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6536, + 6562, + 0 + ] + }, + "from": [ + 15.12, + -13.44 + ], + "tag": null, + "to": [ + 14.28, + -13.44 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6594, + 6619, + 0 + ] + }, + "from": [ + 14.28, + -13.44 + ], + "tag": null, + "to": [ + 9.24, + -13.44 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6641, + 6667, + 0 + ] + }, + "from": [ + 9.24, + -13.44 + ], + "tag": null, + "to": [ + 11.76, + -13.44 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6699, + 6725, + 0 + ] + }, + "from": [ + 11.76, + -13.44 + ], + "tag": null, + "to": [ + 11.76, + -14.28 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6756, + 6782, + 0 + ] + }, + "from": [ + 11.76, + -14.28 + ], + "tag": null, + "to": [ + 10.92, + -14.28 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6819, + 6858, + 0 + ] + }, + "from": [ + 10.92, + -14.28 + ], + "tag": null, + "to": [ + 10.92, + -15.96 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6889, + 6928, + 0 + ] + }, + "from": [ + 10.92, + -15.96 + ], + "tag": null, + "to": [ + 13.44, + -15.96 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6960, + 6986, + 0 + ] + }, + "from": [ + 13.44, + -15.96 + ], + "tag": null, + "to": [ + 13.44, + -15.12 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7017, + 7043, + 0 + ] + }, + "from": [ + 13.44, + -15.12 + ], + "tag": null, + "to": [ + 14.28, + -15.12 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7075, + 7114, + 0 + ] + }, + "from": [ + 14.28, + -15.12 + ], + "tag": null, + "to": [ + 14.28, + -15.96 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7145, + 7184, + 0 + ] + }, + "from": [ + 14.28, + -15.96 + ], + "tag": null, + "to": [ + 13.44, + -15.96 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7216, + 7241, + 0 + ] + }, + "from": [ + 13.44, + -15.96 + ], + "tag": null, + "to": [ + 13.44, + -16.8 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7271, + 7295, + 0 + ] + }, + "from": [ + 13.44, + -16.8 + ], + "tag": null, + "to": [ + 7.56, + -16.8 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7327, + 7352, + 0 + ] + }, + "from": [ + 7.56, + -16.8 + ], + "tag": null, + "to": [ + 7.56, + -15.96 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7382, + 7407, + 0 + ] + }, + "from": [ + 7.56, + -15.96 + ], + "tag": null, + "to": [ + 6.72, + -15.96 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7439, + 7477, + 0 + ] + }, + "from": [ + 6.72, + -15.96 + ], + "tag": null, + "to": [ + 6.72, + -15.12 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7508, + 7546, + 0 + ] + }, + "from": [ + 6.72, + -15.12 + ], + "tag": null, + "to": [ + 7.56, + -15.12 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7578, + 7603, + 0 + ] + }, + "from": [ + 7.56, + -15.12 + ], + "tag": null, + "to": [ + 7.56, + -15.96 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7634, + 7660, + 0 + ] + }, + "from": [ + 7.56, + -15.96 + ], + "tag": null, + "to": [ + 10.08, + -15.96 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7692, + 7718, + 0 + ] + }, + "from": [ + 10.08, + -15.96 + ], + "tag": null, + "to": [ + 10.08, + -14.28 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7748, + 7773, + 0 + ] + }, + "from": [ + 10.08, + -14.28 + ], + "tag": null, + "to": [ + 9.24, + -14.28 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7805, + 7829, + 0 + ] + }, + "from": [ + 9.24, + -14.28 + ], + "tag": null, + "to": [ + 7.56, + -12.6 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7851, + 7876, + 0 + ] + }, + "from": [ + 7.56, + -12.6 + ], + "tag": null, + "to": [ + 7.56, + -11.76 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7906, + 7931, + 0 + ] + }, + "from": [ + 7.56, + -11.76 + ], + "tag": null, + "to": [ + 5.04, + -11.76 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7963, + 7987, + 0 + ] + }, + "from": [ + 5.04, + -11.76 + ], + "tag": null, + "to": [ + 5.04, + -12.6 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8017, + 8040, + 0 + ] + }, + "from": [ + 5.04, + -12.6 + ], + "tag": null, + "to": [ + 4.2, + -12.6 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8072, + 8096, + 0 + ] + }, + "from": [ + 4.2, + -12.6 + ], + "tag": null, + "to": [ + 4.2, + -11.76 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8127, + 8152, + 0 + ] + }, + "from": [ + 4.2, + -11.76 + ], + "tag": null, + "to": [ + 5.04, + -11.76 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8184, + 8209, + 0 + ] + }, + "from": [ + 5.04, + -11.76 + ], + "tag": null, + "to": [ + 5.04, + -10.92 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8240, + 8279, + 0 + ] + }, + "from": [ + 5.04, + -10.92 + ], + "tag": null, + "to": [ + 7.56, + -10.92 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8311, + 8350, + 0 + ] + }, + "from": [ + 7.56, + -10.92 + ], + "tag": null, + "to": [ + 7.56, + -11.76 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8381, + 8405, + 0 + ] + }, + "from": [ + 7.56, + -11.76 + ], + "tag": null, + "to": [ + 8.4, + -11.76 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8437, + 8460, + 0 + ] + }, + "from": [ + 8.4, + -11.76 + ], + "tag": null, + "to": [ + 8.4, + -12.6 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8491, + 8515, + 0 + ] + }, + "from": [ + 8.4, + -12.6 + ], + "tag": null, + "to": [ + 3.36, + -5.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8537, + 8561, + 0 + ] + }, + "from": [ + 3.36, + -5.88 + ], + "tag": null, + "to": [ + 3.36, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8591, + 8614, + 0 + ] + }, + "from": [ + 3.36, + -5.04 + ], + "tag": null, + "to": [ + 4.2, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8646, + 8669, + 0 + ] + }, + "from": [ + 4.2, + -5.04 + ], + "tag": null, + "to": [ + 4.2, + -3.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8699, + 8723, + 0 + ] + }, + "from": [ + 4.2, + -3.36 + ], + "tag": null, + "to": [ + 5.04, + -3.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8755, + 8779, + 0 + ] + }, + "from": [ + 5.04, + -3.36 + ], + "tag": null, + "to": [ + 5.04, + -1.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8809, + 8833, + 0 + ] + }, + "from": [ + 5.04, + -1.68 + ], + "tag": null, + "to": [ + 5.88, + -1.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8865, + 8895, + 0 + ] + }, + "from": [ + 5.88, + -1.68 + ], + "tag": null, + "to": [ + 5.88, + -0.84 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8925, + 8955, + 0 + ] + }, + "from": [ + 5.88, + -0.84 + ], + "tag": null, + "to": [ + 6.72, + -0.84 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8987, + 9011, + 0 + ] + }, + "from": [ + 6.72, + -0.84 + ], + "tag": null, + "to": [ + 6.72, + -1.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9041, + 9065, + 0 + ] + }, + "from": [ + 6.72, + -1.68 + ], + "tag": null, + "to": [ + 7.56, + -1.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9097, + 9121, + 0 + ] + }, + "from": [ + 7.56, + -1.68 + ], + "tag": null, + "to": [ + 7.56, + -3.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9151, + 9174, + 0 + ] + }, + "from": [ + 7.56, + -3.36 + ], + "tag": null, + "to": [ + 8.4, + -3.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9206, + 9229, + 0 + ] + }, + "from": [ + 8.4, + -3.36 + ], + "tag": null, + "to": [ + 8.4, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9260, + 9284, + 0 + ] + }, + "from": [ + 8.4, + -5.04 + ], + "tag": null, + "to": [ + 9.24, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9316, + 9340, + 0 + ] + }, + "from": [ + 9.24, + -5.04 + ], + "tag": null, + "to": [ + 9.24, + -5.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9371, + 9396, + 0 + ] + }, + "from": [ + 9.24, + -5.88 + ], + "tag": null, + "to": [ + 17.64, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9418, + 9443, + 0 + ] + }, + "from": [ + 17.64, + -5.04 + ], + "tag": null, + "to": [ + 17.64, + -5.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9473, + 9498, + 0 + ] + }, + "from": [ + 17.64, + -5.88 + ], + "tag": null, + "to": [ + 11.76, + -5.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9530, + 9555, + 0 + ] + }, + "from": [ + 11.76, + -5.88 + ], + "tag": null, + "to": [ + 11.76, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9585, + 9609, + 0 + ] + }, + "from": [ + 11.76, + -5.04 + ], + "tag": null, + "to": [ + 12.6, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9641, + 9665, + 0 + ] + }, + "from": [ + 12.6, + -5.04 + ], + "tag": null, + "to": [ + 12.6, + -3.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9695, + 9720, + 0 + ] + }, + "from": [ + 12.6, + -3.36 + ], + "tag": null, + "to": [ + 13.44, + -3.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9752, + 9777, + 0 + ] + }, + "from": [ + 13.44, + -3.36 + ], + "tag": null, + "to": [ + 13.44, + -1.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9807, + 9832, + 0 + ] + }, + "from": [ + 13.44, + -1.68 + ], + "tag": null, + "to": [ + 14.28, + -1.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9864, + 9895, + 0 + ] + }, + "from": [ + 14.28, + -1.68 + ], + "tag": null, + "to": [ + 14.28, + -0.84 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9925, + 9956, + 0 + ] + }, + "from": [ + 14.28, + -0.84 + ], + "tag": null, + "to": [ + 15.12, + -0.84 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9988, + 10013, + 0 + ] + }, + "from": [ + 15.12, + -0.84 + ], + "tag": null, + "to": [ + 15.12, + -1.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10043, + 10081, + 0 + ] + }, + "from": [ + 15.12, + -1.68 + ], + "tag": null, + "to": [ + 15.96, + -1.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10113, + 10151, + 0 + ] + }, + "from": [ + 15.96, + -1.68 + ], + "tag": null, + "to": [ + 15.96, + -3.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10182, + 10206, + 0 + ] + }, + "from": [ + 15.96, + -3.36 + ], + "tag": null, + "to": [ + 16.8, + -3.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10238, + 10262, + 0 + ] + }, + "from": [ + 16.8, + -3.36 + ], + "tag": null, + "to": [ + 16.8, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10293, + 10318, + 0 + ] + }, + "from": [ + 16.8, + -5.04 + ], + "tag": null, + "to": [ + 13.44, + -1.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10340, + 10362, + 0 + ] + }, + "from": [ + 13.44, + -1.68 + ], + "tag": null, + "to": [ + 13.44, + -0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10392, + 10427, + 0 + ] + }, + "from": [ + 13.44, + -0.0 + ], + "tag": null, + "to": [ + 15.96, + -0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10459, + 10497, + 0 + ] + }, + "from": [ + 15.96, + -0.0 + ], + "tag": null, + "to": [ + 15.96, + -1.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10528, + 10552, + 0 + ] + }, + "from": [ + 15.96, + -1.68 + ], + "tag": null, + "to": [ + 16.8, + -1.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10584, + 10608, + 0 + ] + }, + "from": [ + 16.8, + -1.68 + ], + "tag": null, + "to": [ + 16.8, + -3.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10639, + 10664, + 0 + ] + }, + "from": [ + 16.8, + -3.36 + ], + "tag": null, + "to": [ + 17.64, + -3.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10696, + 10721, + 0 + ] + }, + "from": [ + 17.64, + -3.36 + ], + "tag": null, + "to": [ + 17.64, + -4.62 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10751, + 10775, + 0 + ] + }, + "from": [ + 17.64, + -4.62 + ], + "tag": null, + "to": [ + 16.8, + -4.62 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10807, + 10831, + 0 + ] + }, + "from": [ + 16.8, + -4.62 + ], + "tag": null, + "to": [ + 16.8, + -3.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10861, + 10886, + 0 + ] + }, + "from": [ + 16.8, + -3.36 + ], + "tag": null, + "to": [ + 15.96, + -3.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10918, + 10943, + 0 + ] + }, + "from": [ + 15.96, + -3.36 + ], + "tag": null, + "to": [ + 15.96, + -1.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10973, + 10998, + 0 + ] + }, + "from": [ + 15.96, + -1.68 + ], + "tag": null, + "to": [ + 15.12, + -1.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11030, + 11061, + 0 + ] + }, + "from": [ + 15.12, + -1.68 + ], + "tag": null, + "to": [ + 15.12, + -0.84 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11091, + 11122, + 0 + ] + }, + "from": [ + 15.12, + -0.84 + ], + "tag": null, + "to": [ + 14.28, + -0.84 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11154, + 11179, + 0 + ] + }, + "from": [ + 14.28, + -0.84 + ], + "tag": null, + "to": [ + 14.28, + -1.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11209, + 11234, + 0 + ] + }, + "from": [ + 14.28, + -1.68 + ], + "tag": null, + "to": [ + 13.44, + -1.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11266, + 11291, + 0 + ] + }, + "from": [ + 13.44, + -1.68 + ], + "tag": null, + "to": [ + 13.44, + -3.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11321, + 11345, + 0 + ] + }, + "from": [ + 13.44, + -3.36 + ], + "tag": null, + "to": [ + 12.6, + -3.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11377, + 11401, + 0 + ] + }, + "from": [ + 12.6, + -3.36 + ], + "tag": null, + "to": [ + 12.6, + -4.62 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11431, + 11456, + 0 + ] + }, + "from": [ + 12.6, + -4.62 + ], + "tag": null, + "to": [ + 11.76, + -4.62 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11488, + 11513, + 0 + ] + }, + "from": [ + 11.76, + -4.62 + ], + "tag": null, + "to": [ + 11.76, + -3.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11543, + 11567, + 0 + ] + }, + "from": [ + 11.76, + -3.36 + ], + "tag": null, + "to": [ + 12.6, + -3.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11599, + 11623, + 0 + ] + }, + "from": [ + 12.6, + -3.36 + ], + "tag": null, + "to": [ + 12.6, + -1.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11653, + 11677, + 0 + ] + }, + "from": [ + 12.6, + -1.68 + ], + "tag": null, + "to": [ + 5.04, + -1.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11699, + 11720, + 0 + ] + }, + "from": [ + 5.04, + -1.68 + ], + "tag": null, + "to": [ + 5.04, + -0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11750, + 11771, + 0 + ] + }, + "from": [ + 5.04, + -0.0 + ], + "tag": null, + "to": [ + 7.56, + -0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11803, + 11827, + 0 + ] + }, + "from": [ + 7.56, + -0.0 + ], + "tag": null, + "to": [ + 7.56, + -1.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11857, + 11880, + 0 + ] + }, + "from": [ + 7.56, + -1.68 + ], + "tag": null, + "to": [ + 8.4, + -1.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11912, + 11935, + 0 + ] + }, + "from": [ + 8.4, + -1.68 + ], + "tag": null, + "to": [ + 8.4, + -3.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11965, + 11989, + 0 + ] + }, + "from": [ + 8.4, + -3.36 + ], + "tag": null, + "to": [ + 9.24, + -3.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12021, + 12045, + 0 + ] + }, + "from": [ + 9.24, + -3.36 + ], + "tag": null, + "to": [ + 9.24, + -4.62 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12075, + 12098, + 0 + ] + }, + "from": [ + 9.24, + -4.62 + ], + "tag": null, + "to": [ + 8.4, + -4.62 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12130, + 12153, + 0 + ] + }, + "from": [ + 8.4, + -4.62 + ], + "tag": null, + "to": [ + 8.4, + -3.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12183, + 12207, + 0 + ] + }, + "from": [ + 8.4, + -3.36 + ], + "tag": null, + "to": [ + 7.56, + -3.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12239, + 12263, + 0 + ] + }, + "from": [ + 7.56, + -3.36 + ], + "tag": null, + "to": [ + 7.56, + -1.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12293, + 12317, + 0 + ] + }, + "from": [ + 7.56, + -1.68 + ], + "tag": null, + "to": [ + 6.72, + -1.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12349, + 12379, + 0 + ] + }, + "from": [ + 6.72, + -1.68 + ], + "tag": null, + "to": [ + 6.72, + -0.84 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12409, + 12439, + 0 + ] + }, + "from": [ + 6.72, + -0.84 + ], + "tag": null, + "to": [ + 5.88, + -0.84 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12471, + 12495, + 0 + ] + }, + "from": [ + 5.88, + -0.84 + ], + "tag": null, + "to": [ + 5.88, + -1.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12525, + 12549, + 0 + ] + }, + "from": [ + 5.88, + -1.68 + ], + "tag": null, + "to": [ + 5.04, + -1.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12581, + 12605, + 0 + ] + }, + "from": [ + 5.04, + -1.68 + ], + "tag": null, + "to": [ + 5.04, + -3.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12635, + 12658, + 0 + ] + }, + "from": [ + 5.04, + -3.36 + ], + "tag": null, + "to": [ + 4.2, + -3.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12690, + 12713, + 0 + ] + }, + "from": [ + 4.2, + -3.36 + ], + "tag": null, + "to": [ + 4.2, + -4.62 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12743, + 12767, + 0 + ] + }, + "from": [ + 4.2, + -4.62 + ], + "tag": null, + "to": [ + 3.36, + -4.62 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12799, + 12823, + 0 + ] + }, + "from": [ + 3.36, + -4.62 + ], + "tag": null, + "to": [ + 3.36, + -3.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12853, + 12876, + 0 + ] + }, + "from": [ + 3.36, + -3.36 + ], + "tag": null, + "to": [ + 4.2, + -3.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12908, + 12931, + 0 + ] + }, + "from": [ + 4.2, + -3.36 + ], + "tag": null, + "to": [ + 4.2, + -1.68 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12961, + 12986, + 0 + ] + }, + "from": [ + 4.2, + -1.68 + ], + "tag": null, + "to": [ + 13.44, + -5.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13008, + 13033, + 0 + ] + }, + "from": [ + 13.44, + -5.88 + ], + "tag": null, + "to": [ + 13.44, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13063, + 13088, + 0 + ] + }, + "from": [ + 13.44, + -5.04 + ], + "tag": null, + "to": [ + 14.28, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13120, + 13144, + 0 + ] + }, + "from": [ + 14.28, + -5.04 + ], + "tag": null, + "to": [ + 14.28, + -4.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13174, + 13198, + 0 + ] + }, + "from": [ + 14.28, + -4.2 + ], + "tag": null, + "to": [ + 15.12, + -4.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13230, + 13255, + 0 + ] + }, + "from": [ + 15.12, + -4.2 + ], + "tag": null, + "to": [ + 15.12, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13286, + 13324, + 0 + ] + }, + "from": [ + 15.12, + -5.04 + ], + "tag": null, + "to": [ + 15.96, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13356, + 13394, + 0 + ] + }, + "from": [ + 15.96, + -5.04 + ], + "tag": null, + "to": [ + 15.96, + -5.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13425, + 13449, + 0 + ] + }, + "from": [ + 15.96, + -5.88 + ], + "tag": null, + "to": [ + 5.88, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13471, + 13494, + 0 + ] + }, + "from": [ + 5.88, + -5.04 + ], + "tag": null, + "to": [ + 5.88, + -4.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13524, + 13547, + 0 + ] + }, + "from": [ + 5.88, + -4.2 + ], + "tag": null, + "to": [ + 6.72, + -4.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13579, + 13603, + 0 + ] + }, + "from": [ + 6.72, + -4.2 + ], + "tag": null, + "to": [ + 6.72, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13633, + 13657, + 0 + ] + }, + "from": [ + 6.72, + -5.04 + ], + "tag": null, + "to": [ + 7.56, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13689, + 13713, + 0 + ] + }, + "from": [ + 7.56, + -5.04 + ], + "tag": null, + "to": [ + 7.56, + -5.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13743, + 13767, + 0 + ] + }, + "from": [ + 7.56, + -5.88 + ], + "tag": null, + "to": [ + 5.04, + -5.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13799, + 13823, + 0 + ] + }, + "from": [ + 5.04, + -5.88 + ], + "tag": null, + "to": [ + 5.04, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13853, + 13878, + 0 + ] + }, + "from": [ + 5.04, + -5.04 + ], + "tag": null, + "to": [ + 17.64, + -5.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13900, + 13925, + 0 + ] + }, + "from": [ + 17.64, + -5.88 + ], + "tag": null, + "to": [ + 17.64, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13955, + 13979, + 0 + ] + }, + "from": [ + 17.64, + -5.04 + ], + "tag": null, + "to": [ + 16.8, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14011, + 14034, + 0 + ] + }, + "from": [ + 16.8, + -5.04 + ], + "tag": null, + "to": [ + 16.8, + -4.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14064, + 14088, + 0 + ] + }, + "from": [ + 16.8, + -4.2 + ], + "tag": null, + "to": [ + 17.64, + -4.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14120, + 14145, + 0 + ] + }, + "from": [ + 17.64, + -4.2 + ], + "tag": null, + "to": [ + 17.64, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14176, + 14201, + 0 + ] + }, + "from": [ + 17.64, + -5.04 + ], + "tag": null, + "to": [ + 18.48, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14233, + 14258, + 0 + ] + }, + "from": [ + 18.48, + -5.04 + ], + "tag": null, + "to": [ + 18.48, + -5.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14289, + 14313, + 0 + ] + }, + "from": [ + 18.48, + -5.88 + ], + "tag": null, + "to": [ + 3.36, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14335, + 14359, + 0 + ] + }, + "from": [ + 3.36, + -5.04 + ], + "tag": null, + "to": [ + 3.36, + -5.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14389, + 14413, + 0 + ] + }, + "from": [ + 3.36, + -5.88 + ], + "tag": null, + "to": [ + 2.52, + -5.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14445, + 14469, + 0 + ] + }, + "from": [ + 2.52, + -5.88 + ], + "tag": null, + "to": [ + 2.52, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14499, + 14523, + 0 + ] + }, + "from": [ + 2.52, + -5.04 + ], + "tag": null, + "to": [ + 3.36, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14555, + 14578, + 0 + ] + }, + "from": [ + 3.36, + -5.04 + ], + "tag": null, + "to": [ + 3.36, + -4.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14608, + 14630, + 0 + ] + }, + "from": [ + 3.36, + -4.2 + ], + "tag": null, + "to": [ + 4.2, + -4.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14662, + 14685, + 0 + ] + }, + "from": [ + 4.2, + -4.2 + ], + "tag": null, + "to": [ + 4.2, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14716, + 14738, + 0 + ] + }, + "from": [ + 4.2, + -5.04 + ], + "tag": null, + "to": [ + 8.4, + -4.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14760, + 14783, + 0 + ] + }, + "from": [ + 8.4, + -4.2 + ], + "tag": null, + "to": [ + 9.24, + -4.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14815, + 14839, + 0 + ] + }, + "from": [ + 9.24, + -4.2 + ], + "tag": null, + "to": [ + 9.24, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14870, + 14895, + 0 + ] + }, + "from": [ + 9.24, + -5.04 + ], + "tag": null, + "to": [ + 10.08, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14927, + 14952, + 0 + ] + }, + "from": [ + 10.08, + -5.04 + ], + "tag": null, + "to": [ + 10.08, + -5.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14982, + 15006, + 0 + ] + }, + "from": [ + 10.08, + -5.88 + ], + "tag": null, + "to": [ + 9.24, + -5.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15038, + 15062, + 0 + ] + }, + "from": [ + 9.24, + -5.88 + ], + "tag": null, + "to": [ + 9.24, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15092, + 15115, + 0 + ] + }, + "from": [ + 9.24, + -5.04 + ], + "tag": null, + "to": [ + 8.4, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15147, + 15171, + 0 + ] + }, + "from": [ + 8.4, + -5.04 + ], + "tag": null, + "to": [ + 11.76, + -4.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15193, + 15216, + 0 + ] + }, + "from": [ + 11.76, + -4.2 + ], + "tag": null, + "to": [ + 12.6, + -4.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15248, + 15272, + 0 + ] + }, + "from": [ + 12.6, + -4.2 + ], + "tag": null, + "to": [ + 12.6, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15302, + 15327, + 0 + ] + }, + "from": [ + 12.6, + -5.04 + ], + "tag": null, + "to": [ + 11.76, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15359, + 15384, + 0 + ] + }, + "from": [ + 11.76, + -5.04 + ], + "tag": null, + "to": [ + 11.76, + -5.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15414, + 15439, + 0 + ] + }, + "from": [ + 11.76, + -5.88 + ], + "tag": null, + "to": [ + 10.92, + -5.88 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15471, + 15496, + 0 + ] + }, + "from": [ + 10.92, + -5.88 + ], + "tag": null, + "to": [ + 10.92, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15526, + 15551, + 0 + ] + }, + "from": [ + 10.92, + -5.04 + ], + "tag": null, + "to": [ + 11.76, + -5.04 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15583, + 15609, + 0 + ] + }, + "from": [ + 11.76, + -5.04 + ], + "tag": null, + "to": [ + 14.28, + -10.92 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15631, + 15657, + 0 + ] + }, + "from": [ + 14.28, + -10.92 + ], + "tag": null, + "to": [ + 13.44, + -10.92 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15689, + 15715, + 0 + ] + }, + "from": [ + 13.44, + -10.92 + ], + "tag": null, + "to": [ + 13.44, + -13.44 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15746, + 15772, + 0 + ] + }, + "from": [ + 13.44, + -13.44 + ], + "tag": null, + "to": [ + 14.28, + -13.44 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15804, + 15812, + 0 + ] + }, + "from": [ + 14.28, + -13.44 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 31, + 56, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 31, + 56, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 31, + 56, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/kittycad_svg/rendered_model.png b/src/wasm-lib/kcl/tests/kittycad_svg/rendered_model.png new file mode 100644 index 000000000..4d5ae164e Binary files /dev/null and b/src/wasm-lib/kcl/tests/kittycad_svg/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/kw_fn/ast.snap b/src/wasm-lib/kcl/tests/kw_fn/ast.snap new file mode 100644 index 000000000..04fa337ee --- /dev/null +++ b/src/wasm-lib/kcl/tests/kw_fn/ast.snap @@ -0,0 +1,281 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing kw_fn.kcl +snapshot_kind: text +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 35, + "id": { + "end": 12, + "name": "increment", + "start": 3, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "end": 33, + "left": { + "end": 29, + "name": "x", + "start": 28, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 33, + "raw": "1", + "start": 32, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 28, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 33, + "start": 21, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 35, + "start": 17 + }, + "end": 35, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 15, + "name": "x", + "start": 14, + "type": "Identifier" + }, + "labeled": false + } + ], + "start": 12, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" + }, + "end": 35, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 77, + "id": { + "end": 43, + "name": "add", + "start": 40, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "end": 75, + "left": { + "end": 67, + "name": "x", + "start": 66, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 75, + "name": "delta", + "start": 70, + "type": "Identifier", + "type": "Identifier" + }, + "start": 66, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 75, + "start": 59, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 77, + "start": 55 + }, + "end": 77, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 46, + "name": "x", + "start": 45, + "type": "Identifier" + }, + "labeled": false + }, + { + "type": "Parameter", + "identifier": { + "end": 53, + "name": "delta", + "start": 48, + "type": "Identifier" + } + } + ], + "start": 43, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 40, + "type": "VariableDeclarator" + }, + "end": 77, + "kind": "fn", + "start": 37, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 97, + "id": { + "end": 82, + "name": "two", + "start": 79, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 96, + "raw": "1", + "start": 95, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + ], + "callee": { + "end": 94, + "name": "increment", + "start": 85, + "type": "Identifier" + }, + "end": 97, + "start": 85, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 79, + "type": "VariableDeclarator" + }, + "end": 97, + "kind": "const", + "start": 79, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 123, + "id": { + "end": 103, + "name": "three", + "start": 98, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "delta" + }, + "arg": { + "end": 122, + "raw": "2", + "start": 121, + "type": "Literal", + "type": "Literal", + "value": 2.0 + } + } + ], + "callee": { + "end": 109, + "name": "add", + "start": 106, + "type": "Identifier" + }, + "end": 123, + "start": 106, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "end": 111, + "raw": "1", + "start": 110, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + }, + "start": 98, + "type": "VariableDeclarator" + }, + "end": 123, + "kind": "const", + "start": 98, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 124, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 37, + "start": 35, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "1": [ + { + "end": 79, + "start": 77, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/kw_fn/input.kcl b/src/wasm-lib/kcl/tests/kw_fn/input.kcl new file mode 100644 index 000000000..7d3fd9c04 --- /dev/null +++ b/src/wasm-lib/kcl/tests/kw_fn/input.kcl @@ -0,0 +1,10 @@ +fn increment(@x) { + return x + 1 +} + +fn add(@x, delta) { + return x + delta +} + +two = increment(1) +three = add(1, delta = 2) diff --git a/src/wasm-lib/kcl/tests/kw_fn/ops.snap b/src/wasm-lib/kcl/tests/kw_fn/ops.snap new file mode 100644 index 000000000..1405b7372 --- /dev/null +++ b/src/wasm-lib/kcl/tests/kw_fn/ops.snap @@ -0,0 +1,59 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed kw_fn.kcl +snapshot_kind: text +--- +[ + { + "type": "UserDefinedFunctionCall", + "name": "increment", + "functionSourceRange": [ + 12, + 35, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 85, + 97, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "add", + "functionSourceRange": [ + 43, + 77, + 0 + ], + "unlabeledArg": { + "sourceRange": [ + 110, + 111, + 0 + ] + }, + "labeledArgs": { + "delta": { + "sourceRange": [ + 121, + 122, + 0 + ] + } + }, + "sourceRange": [ + 106, + 123, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + } +] diff --git a/src/wasm-lib/kcl/tests/kw_fn/program_memory.snap b/src/wasm-lib/kcl/tests/kw_fn/program_memory.snap new file mode 100644 index 000000000..0bd1e572a --- /dev/null +++ b/src/wasm-lib/kcl/tests/kw_fn/program_memory.snap @@ -0,0 +1,366 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing kw_fn.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "add": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "argument": { + "end": 75, + "left": { + "end": 67, + "name": "x", + "start": 66, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 75, + "name": "delta", + "start": 70, + "type": "Identifier", + "type": "Identifier" + }, + "start": 66, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 75, + "start": 59, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 77, + "start": 55 + }, + "end": 77, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 46, + "name": "x", + "start": 45, + "type": "Identifier" + }, + "labeled": false + }, + { + "type": "Parameter", + "identifier": { + "end": 53, + "name": "delta", + "start": 48, + "type": "Identifier" + } + } + ], + "start": 43, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "increment": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "argument": { + "end": 33, + "left": { + "end": 29, + "name": "x", + "start": 28, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 33, + "raw": "1", + "start": 32, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 28, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 33, + "start": 21, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 35, + "start": 17 + }, + "end": 35, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 15, + "name": "x", + "start": 14, + "type": "Identifier" + }, + "labeled": false + } + ], + "start": 12, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 12, + 35, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 43, + 77, + 0 + ] + } + ] + }, + "increment": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "argument": { + "end": 33, + "left": { + "end": 29, + "name": "x", + "start": 28, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 33, + "raw": "1", + "start": 32, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 28, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 33, + "start": 21, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 35, + "start": 17 + }, + "end": 35, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 15, + "name": "x", + "start": 14, + "type": "Identifier" + }, + "labeled": false + } + ], + "start": 12, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 12, + 35, + 0 + ] + } + ] + }, + "three": { + "type": "Number", + "value": 3.0, + "__meta": [ + { + "sourceRange": [ + 110, + 111, + 0 + ] + }, + { + "sourceRange": [ + 121, + 122, + 0 + ] + } + ] + }, + "two": { + "type": "Number", + "value": 2.0, + "__meta": [ + { + "sourceRange": [ + 95, + 96, + 0 + ] + }, + { + "sourceRange": [ + 32, + 33, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/kw_fn_too_few_args/ast.snap b/src/wasm-lib/kcl/tests/kw_fn_too_few_args/ast.snap new file mode 100644 index 000000000..4f56e658c --- /dev/null +++ b/src/wasm-lib/kcl/tests/kw_fn_too_few_args/ast.snap @@ -0,0 +1,153 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing kw_fn_too_few_args.kcl +snapshot_kind: text +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 31, + "id": { + "end": 6, + "name": "add", + "start": 3, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "end": 29, + "left": { + "end": 25, + "name": "x", + "start": 24, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 29, + "name": "y", + "start": 28, + "type": "Identifier", + "type": "Identifier" + }, + "start": 24, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 29, + "start": 17, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 31, + "start": 13 + }, + "end": 31, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 8, + "name": "x", + "start": 7, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 11, + "name": "y", + "start": 10, + "type": "Identifier" + } + } + ], + "start": 6, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" + }, + "end": 31, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 51, + "id": { + "end": 38, + "name": "three", + "start": 33, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "x" + }, + "arg": { + "end": 50, + "raw": "1", + "start": 49, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + } + ], + "callee": { + "end": 44, + "name": "add", + "start": 41, + "type": "Identifier" + }, + "end": 51, + "start": 41, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + "start": 33, + "type": "VariableDeclarator" + }, + "end": 51, + "kind": "const", + "start": 33, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 52, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 33, + "start": 31, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/kw_fn_too_few_args/execution_error.snap b/src/wasm-lib/kcl/tests/kw_fn_too_few_args/execution_error.snap new file mode 100644 index 000000000..0f811ae26 --- /dev/null +++ b/src/wasm-lib/kcl/tests/kw_fn_too_few_args/execution_error.snap @@ -0,0 +1,17 @@ +--- +source: kcl/src/simulation_tests.rs +description: Error from executing kw_fn_too_few_args.kcl +snapshot_kind: text +--- +KCL Semantic error + + × semantic: This function requires a parameter y, but you haven't passed + │ it one. + ╭─[1:7] + 1 │ ╭─▶ fn add(x, y) { + 2 │ │ return x + y + 3 │ ╰─▶ } + 4 │ + 5 │ three = add(x = 1) + · ────────── + ╰──── diff --git a/src/wasm-lib/kcl/tests/kw_fn_too_few_args/input.kcl b/src/wasm-lib/kcl/tests/kw_fn_too_few_args/input.kcl new file mode 100644 index 000000000..90ab88d3a --- /dev/null +++ b/src/wasm-lib/kcl/tests/kw_fn_too_few_args/input.kcl @@ -0,0 +1,5 @@ +fn add(x, y) { + return x + y +} + +three = add(x = 1) diff --git a/src/wasm-lib/kcl/tests/kw_fn_too_few_args/ops.snap b/src/wasm-lib/kcl/tests/kw_fn_too_few_args/ops.snap new file mode 100644 index 000000000..b7af42763 --- /dev/null +++ b/src/wasm-lib/kcl/tests/kw_fn_too_few_args/ops.snap @@ -0,0 +1,31 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed kw_fn_too_few_args.kcl +snapshot_kind: text +--- +[ + { + "type": "UserDefinedFunctionCall", + "name": "add", + "functionSourceRange": [ + 6, + 31, + 0 + ], + "unlabeledArg": null, + "labeledArgs": { + "x": { + "sourceRange": [ + 49, + 50, + 0 + ] + } + }, + "sourceRange": [ + 41, + 51, + 0 + ] + } +] diff --git a/src/wasm-lib/kcl/tests/kw_fn_unlabeled_but_has_label/ast.snap b/src/wasm-lib/kcl/tests/kw_fn_unlabeled_but_has_label/ast.snap new file mode 100644 index 000000000..d0dade9bf --- /dev/null +++ b/src/wasm-lib/kcl/tests/kw_fn_unlabeled_but_has_label/ast.snap @@ -0,0 +1,146 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing kw_fn_unlabeled_but_has_label.kcl +snapshot_kind: text +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 29, + "id": { + "end": 6, + "name": "add", + "start": 3, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "end": 27, + "left": { + "end": 23, + "name": "x", + "start": 22, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 27, + "raw": "1", + "start": 26, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 22, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 27, + "start": 15, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 29, + "start": 11 + }, + "end": 29, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 9, + "name": "x", + "start": 8, + "type": "Identifier" + }, + "labeled": false + } + ], + "start": 6, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" + }, + "end": 29, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 47, + "id": { + "end": 34, + "name": "two", + "start": 31, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "x" + }, + "arg": { + "end": 46, + "raw": "1", + "start": 45, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + } + ], + "callee": { + "end": 40, + "name": "add", + "start": 37, + "type": "Identifier" + }, + "end": 47, + "start": 37, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + "start": 31, + "type": "VariableDeclarator" + }, + "end": 47, + "kind": "const", + "start": 31, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 48, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 31, + "start": 29, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/kw_fn_unlabeled_but_has_label/execution_error.snap b/src/wasm-lib/kcl/tests/kw_fn_unlabeled_but_has_label/execution_error.snap new file mode 100644 index 000000000..c871c10f6 --- /dev/null +++ b/src/wasm-lib/kcl/tests/kw_fn_unlabeled_but_has_label/execution_error.snap @@ -0,0 +1,17 @@ +--- +source: kcl/src/simulation_tests.rs +description: Error from executing kw_fn_unlabeled_but_has_label.kcl +snapshot_kind: text +--- +KCL Semantic error + + × semantic: The function does declare a parameter named 'x', but this + │ parameter doesn't use a label. Try removing the `x:` + ╭─[1:7] + 1 │ ╭─▶ fn add(@x) { + 2 │ │ return x + 1 + 3 │ ╰─▶ } + 4 │ + 5 │ two = add(x = 1) + · ────────── + ╰──── diff --git a/src/wasm-lib/kcl/tests/kw_fn_unlabeled_but_has_label/input.kcl b/src/wasm-lib/kcl/tests/kw_fn_unlabeled_but_has_label/input.kcl new file mode 100644 index 000000000..e2edda6c4 --- /dev/null +++ b/src/wasm-lib/kcl/tests/kw_fn_unlabeled_but_has_label/input.kcl @@ -0,0 +1,5 @@ +fn add(@x) { + return x + 1 +} + +two = add(x = 1) diff --git a/src/wasm-lib/kcl/tests/kw_fn_unlabeled_but_has_label/ops.snap b/src/wasm-lib/kcl/tests/kw_fn_unlabeled_but_has_label/ops.snap new file mode 100644 index 000000000..8606ca43f --- /dev/null +++ b/src/wasm-lib/kcl/tests/kw_fn_unlabeled_but_has_label/ops.snap @@ -0,0 +1,31 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed kw_fn_unlabeled_but_has_label.kcl +snapshot_kind: text +--- +[ + { + "type": "UserDefinedFunctionCall", + "name": "add", + "functionSourceRange": [ + 6, + 29, + 0 + ], + "unlabeledArg": null, + "labeledArgs": { + "x": { + "sourceRange": [ + 45, + 46, + 0 + ] + } + }, + "sourceRange": [ + 37, + 47, + 0 + ] + } +] diff --git a/src/wasm-lib/kcl/tests/kw_fn_with_defaults/ast.snap b/src/wasm-lib/kcl/tests/kw_fn_with_defaults/ast.snap new file mode 100644 index 000000000..de831a984 --- /dev/null +++ b/src/wasm-lib/kcl/tests/kw_fn_with_defaults/ast.snap @@ -0,0 +1,207 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing kw_fn_with_defaults.kcl +snapshot_kind: text +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 45, + "id": { + "end": 12, + "name": "increment", + "start": 3, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "end": 43, + "left": { + "end": 38, + "name": "x", + "start": 37, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 43, + "name": "by", + "start": 41, + "type": "Identifier", + "type": "Identifier" + }, + "start": 37, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 43, + "start": 30, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 45, + "start": 26 + }, + "end": 45, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 15, + "name": "x", + "start": 14, + "type": "Identifier" + }, + "labeled": false + }, + { + "type": "Parameter", + "identifier": { + "end": 19, + "name": "by", + "start": 17, + "type": "Identifier" + }, + "default_value": { + "type": "Literal", + "type": "Literal", + "value": 1.0, + "raw": "1" + } + } + ], + "start": 12, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" + }, + "end": 45, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 65, + "id": { + "end": 50, + "name": "two", + "start": 47, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 64, + "raw": "1", + "start": 63, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + ], + "callee": { + "end": 62, + "name": "increment", + "start": 53, + "type": "Identifier" + }, + "end": 65, + "start": 53, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 47, + "type": "VariableDeclarator" + }, + "end": 65, + "kind": "const", + "start": 47, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 99, + "id": { + "end": 75, + "name": "twentyOne", + "start": 66, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "by" + }, + "arg": { + "end": 98, + "raw": "20", + "start": 96, + "type": "Literal", + "type": "Literal", + "value": 20.0 + } + } + ], + "callee": { + "end": 87, + "name": "increment", + "start": 78, + "type": "Identifier" + }, + "end": 99, + "start": 78, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "end": 89, + "raw": "1", + "start": 88, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + }, + "start": 66, + "type": "VariableDeclarator" + }, + "end": 99, + "kind": "const", + "start": 66, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 100, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 47, + "start": 45, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/kw_fn_with_defaults/input.kcl b/src/wasm-lib/kcl/tests/kw_fn_with_defaults/input.kcl new file mode 100644 index 000000000..f1e64f1c6 --- /dev/null +++ b/src/wasm-lib/kcl/tests/kw_fn_with_defaults/input.kcl @@ -0,0 +1,6 @@ +fn increment(@x, by? = 1) { + return x + by +} + +two = increment(1) +twentyOne = increment(1, by = 20) diff --git a/src/wasm-lib/kcl/tests/kw_fn_with_defaults/ops.snap b/src/wasm-lib/kcl/tests/kw_fn_with_defaults/ops.snap new file mode 100644 index 000000000..91c1bda82 --- /dev/null +++ b/src/wasm-lib/kcl/tests/kw_fn_with_defaults/ops.snap @@ -0,0 +1,59 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed kw_fn_with_defaults.kcl +snapshot_kind: text +--- +[ + { + "type": "UserDefinedFunctionCall", + "name": "increment", + "functionSourceRange": [ + 12, + 45, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 53, + 65, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "increment", + "functionSourceRange": [ + 12, + 45, + 0 + ], + "unlabeledArg": { + "sourceRange": [ + 88, + 89, + 0 + ] + }, + "labeledArgs": { + "by": { + "sourceRange": [ + 96, + 98, + 0 + ] + } + }, + "sourceRange": [ + 78, + 99, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + } +] diff --git a/src/wasm-lib/kcl/tests/kw_fn_with_defaults/program_memory.snap b/src/wasm-lib/kcl/tests/kw_fn_with_defaults/program_memory.snap new file mode 100644 index 000000000..7a1af035c --- /dev/null +++ b/src/wasm-lib/kcl/tests/kw_fn_with_defaults/program_memory.snap @@ -0,0 +1,177 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing kw_fn_with_defaults.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "increment": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "argument": { + "end": 43, + "left": { + "end": 38, + "name": "x", + "start": 37, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 43, + "name": "by", + "start": 41, + "type": "Identifier", + "type": "Identifier" + }, + "start": 37, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 43, + "start": 30, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 45, + "start": 26 + }, + "end": 45, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 15, + "name": "x", + "start": 14, + "type": "Identifier" + }, + "labeled": false + }, + { + "type": "Parameter", + "identifier": { + "end": 19, + "name": "by", + "start": 17, + "type": "Identifier" + }, + "default_value": { + "type": "Literal", + "type": "Literal", + "value": 1.0, + "raw": "1" + } + } + ], + "start": 12, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 12, + 45, + 0 + ] + } + ] + }, + "twentyOne": { + "type": "Number", + "value": 21.0, + "__meta": [ + { + "sourceRange": [ + 88, + 89, + 0 + ] + }, + { + "sourceRange": [ + 96, + 98, + 0 + ] + } + ] + }, + "two": { + "type": "Number", + "value": 2.0, + "__meta": [ + { + "sourceRange": [ + 63, + 64, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/ast.snap b/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/ast.snap new file mode 100644 index 000000000..fd67775d3 --- /dev/null +++ b/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/ast.snap @@ -0,0 +1,572 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing linear_pattern3d_a_pattern.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 163, + "id": { + "end": 13, + "name": "exampleSketch", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 34, + "raw": "'XZ'", + "start": 30, + "type": "Literal", + "type": "Literal", + "value": "XZ" + } + ], + "callee": { + "end": 29, + "name": "startSketchOn", + "start": 16, + "type": "Identifier" + }, + "end": 35, + "start": 16, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 58, + "raw": "0", + "start": 57, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 61, + "raw": "0", + "start": 60, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 62, + "start": 56, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 65, + "start": 64, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 55, + "name": "startProfileAt", + "start": 41, + "type": "Identifier" + }, + "end": 66, + "start": 41, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 79, + "raw": "0", + "start": 78, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 82, + "raw": "2", + "start": 81, + "type": "Literal", + "type": "Literal", + "value": 2.0 + } + ], + "end": 83, + "start": 77, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 86, + "start": 85, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 76, + "name": "line", + "start": 72, + "type": "Identifier" + }, + "end": 87, + "start": 72, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 100, + "raw": "3", + "start": 99, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + { + "end": 103, + "raw": "1", + "start": 102, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + ], + "end": 104, + "start": 98, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 107, + "start": 106, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 97, + "name": "line", + "start": 93, + "type": "Identifier" + }, + "end": 108, + "start": 93, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 121, + "raw": "0", + "start": 120, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 125, + "raw": "4", + "start": 124, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + "end": 125, + "operator": "-", + "start": 123, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 126, + "start": 119, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 129, + "start": 128, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 118, + "name": "line", + "start": 114, + "type": "Identifier" + }, + "end": 130, + "start": 114, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 143, + "start": 142, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 141, + "name": "close", + "start": 136, + "type": "Identifier" + }, + "end": 144, + "start": 136, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 159, + "raw": "1", + "start": 158, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 162, + "start": 161, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 157, + "name": "extrude", + "start": 150, + "type": "Identifier" + }, + "end": 163, + "start": 150, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 163, + "start": 16, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 163, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 261, + "id": { + "end": 171, + "name": "pattn1", + "start": 165, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 245, + "properties": [ + { + "end": 210, + "key": { + "end": 198, + "name": "axis", + "start": 194, + "type": "Identifier" + }, + "start": 194, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 203, + "raw": "1", + "start": 202, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 206, + "raw": "0", + "start": 205, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 209, + "raw": "0", + "start": 208, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 210, + "start": 201, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "end": 227, + "key": { + "end": 223, + "name": "instances", + "start": 214, + "type": "Identifier" + }, + "start": 214, + "type": "ObjectProperty", + "value": { + "end": 227, + "raw": "7", + "start": 226, + "type": "Literal", + "type": "Literal", + "value": 7.0 + } + }, + { + "end": 243, + "key": { + "end": 239, + "name": "distance", + "start": 231, + "type": "Identifier" + }, + "start": 231, + "type": "ObjectProperty", + "value": { + "end": 243, + "raw": "6", + "start": 242, + "type": "Literal", + "type": "Literal", + "value": 6.0 + } + } + ], + "start": 190, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 260, + "name": "exampleSketch", + "start": 247, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 189, + "name": "patternLinear3d", + "start": 174, + "type": "Identifier" + }, + "end": 261, + "start": 174, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 165, + "type": "VariableDeclarator" + }, + "end": 261, + "kind": "const", + "start": 165, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 352, + "id": { + "end": 269, + "name": "pattn2", + "start": 263, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 343, + "properties": [ + { + "end": 308, + "key": { + "end": 296, + "name": "axis", + "start": 292, + "type": "Identifier" + }, + "start": 292, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 301, + "raw": "0", + "start": 300, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 304, + "raw": "0", + "start": 303, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 307, + "raw": "1", + "start": 306, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + ], + "end": 308, + "start": 299, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "end": 324, + "key": { + "end": 320, + "name": "distance", + "start": 312, + "type": "Identifier" + }, + "start": 312, + "type": "ObjectProperty", + "value": { + "end": 324, + "raw": "1", + "start": 323, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + }, + { + "end": 341, + "key": { + "end": 337, + "name": "instances", + "start": 328, + "type": "Identifier" + }, + "start": 328, + "type": "ObjectProperty", + "value": { + "end": 341, + "raw": "7", + "start": 340, + "type": "Literal", + "type": "Literal", + "value": 7.0 + } + } + ], + "start": 288, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 351, + "name": "pattn1", + "start": 345, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 287, + "name": "patternLinear3d", + "start": 272, + "type": "Identifier" + }, + "end": 352, + "start": 272, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 263, + "type": "VariableDeclarator" + }, + "end": 352, + "kind": "const", + "start": 263, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 353, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 165, + "start": 163, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "1": [ + { + "end": 263, + "start": 261, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/input.kcl b/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/input.kcl new file mode 100644 index 000000000..dcc57c3df --- /dev/null +++ b/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/input.kcl @@ -0,0 +1,19 @@ +exampleSketch = startSketchOn('XZ') + |> startProfileAt([0, 0], %) + |> line([0, 2], %) + |> line([3, 1], %) + |> line([0, -4], %) + |> close(%) + |> extrude(1, %) + +pattn1 = patternLinear3d({ + axis = [1, 0, 0], + instances = 7, + distance = 6 +}, exampleSketch) + +pattn2 = patternLinear3d({ + axis = [0, 0, 1], + distance = 1, + instances = 7 +}, pattn1) diff --git a/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/ops.snap b/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/ops.snap new file mode 100644 index 000000000..d240694b5 --- /dev/null +++ b/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/ops.snap @@ -0,0 +1,104 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed linear_pattern3d_a_pattern.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 30, + 34, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 16, + 35, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 158, + 159, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 161, + 162, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 150, + 163, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 190, + 245, + 0 + ] + }, + "solid_set": { + "sourceRange": [ + 247, + 260, + 0 + ] + } + }, + "name": "patternLinear3d", + "sourceRange": [ + 174, + 261, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 288, + 343, + 0 + ] + }, + "solid_set": { + "sourceRange": [ + 345, + 351, + 0 + ] + } + }, + "name": "patternLinear3d", + "sourceRange": [ + 272, + 352, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/program_memory.snap b/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/program_memory.snap new file mode 100644 index 000000000..5f00ac548 --- /dev/null +++ b/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/program_memory.snap @@ -0,0 +1,11561 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing linear_pattern3d_a_pattern.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "exampleSketch": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "pattn1": { + "type": "Solids", + "value": [ + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + } + ] + }, + "pattn2": { + "type": "Solids", + "value": [ + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 108, + 0 + ] + }, + "from": [ + 0.0, + 2.0 + ], + "tag": null, + "to": [ + 3.0, + 3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 114, + 130, + 0 + ] + }, + "from": [ + 3.0, + 3.0 + ], + "tag": null, + "to": [ + 3.0, + -1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 136, + 144, + 0 + ] + }, + "from": [ + 3.0, + -1.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41, + 66, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 41, + 66, + 0 + ] + } + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/rendered_model.png b/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/rendered_model.png new file mode 100644 index 000000000..91c58188d Binary files /dev/null and b/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/mike_stress_test/ast.snap b/src/wasm-lib/kcl/tests/mike_stress_test/ast.snap new file mode 100644 index 000000000..b5dba2d15 --- /dev/null +++ b/src/wasm-lib/kcl/tests/mike_stress_test/ast.snap @@ -0,0 +1,50872 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing mike_stress_test.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 74115, + "id": { + "end": 7, + "name": "part001", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 28, + "raw": "'XY'", + "start": 24, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 23, + "name": "startSketchOn", + "start": 10, + "type": "Identifier" + }, + "end": 29, + "start": 10, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 54, + "raw": "0.0", + "start": 51, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 59, + "raw": "0.0", + "start": 56, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 60, + "start": 50, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 63, + "start": 62, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 49, + "name": "startProfileAt", + "start": 35, + "type": "Identifier" + }, + "end": 64, + "start": 35, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 103, + "raw": "0.3670208139314082", + "start": 85, + "type": "Literal", + "type": "Literal", + "value": 0.3670208139314082 + }, + "end": 103, + "operator": "-", + "start": 84, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 131, + "raw": "0.21201331909674526", + "start": 112, + "type": "Literal", + "type": "Literal", + "value": 0.21201331909674526 + } + ], + "end": 138, + "start": 75, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 141, + "start": 140, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 74, + "name": "line", + "start": 70, + "type": "Identifier" + }, + "end": 142, + "start": 70, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 181, + "raw": "0.4707511307971115", + "start": 163, + "type": "Literal", + "type": "Literal", + "value": 0.4707511307971115 + }, + "end": 181, + "operator": "-", + "start": 162, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 208, + "raw": "0.4905279615419764", + "start": 190, + "type": "Literal", + "type": "Literal", + "value": 0.4905279615419764 + } + ], + "end": 215, + "start": 153, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 218, + "start": 217, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 152, + "name": "line", + "start": 148, + "type": "Identifier" + }, + "end": 219, + "start": 148, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 258, + "raw": "0.8328324229085962", + "start": 240, + "type": "Literal", + "type": "Literal", + "value": 0.8328324229085962 + }, + "end": 258, + "operator": "-", + "start": 239, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 285, + "raw": "0.4677492878818803", + "start": 267, + "type": "Literal", + "type": "Literal", + "value": 0.4677492878818803 + } + ], + "end": 292, + "start": 230, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 295, + "start": 294, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 229, + "name": "line", + "start": 225, + "type": "Identifier" + }, + "end": 296, + "start": 225, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 335, + "raw": "0.8111463382182231", + "start": 317, + "type": "Literal", + "type": "Literal", + "value": 0.8111463382182231 + }, + "end": 335, + "operator": "-", + "start": 316, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 364, + "raw": "0.41814807547140576", + "start": 345, + "type": "Literal", + "type": "Literal", + "value": 0.41814807547140576 + }, + "end": 364, + "operator": "-", + "start": 344, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 371, + "start": 307, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 374, + "start": 373, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 306, + "name": "line", + "start": 302, + "type": "Identifier" + }, + "end": 375, + "start": 302, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 414, + "raw": "0.03807684940941125", + "start": 395, + "type": "Literal", + "type": "Literal", + "value": 0.03807684940941125 + }, + { + "end": 442, + "raw": "0.25664826686353326", + "start": 423, + "type": "Literal", + "type": "Literal", + "value": 0.25664826686353326 + } + ], + "end": 449, + "start": 386, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 452, + "start": 451, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 385, + "name": "line", + "start": 381, + "type": "Identifier" + }, + "end": 453, + "start": 381, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 492, + "raw": "0.23950083339596384", + "start": 473, + "type": "Literal", + "type": "Literal", + "value": 0.23950083339596384 + }, + { + "end": 520, + "raw": "0.43693196301855575", + "start": 501, + "type": "Literal", + "type": "Literal", + "value": 0.43693196301855575 + } + ], + "end": 527, + "start": 464, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 530, + "start": 529, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 463, + "name": "line", + "start": 459, + "type": "Identifier" + }, + "end": 531, + "start": 459, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 571, + "raw": "0.16279444820904887", + "start": 552, + "type": "Literal", + "type": "Literal", + "value": 0.16279444820904887 + }, + "end": 571, + "operator": "-", + "start": 551, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 598, + "raw": "0.8064475707664818", + "start": 580, + "type": "Literal", + "type": "Literal", + "value": 0.8064475707664818 + } + ], + "end": 605, + "start": 542, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 608, + "start": 607, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 541, + "name": "line", + "start": 537, + "type": "Identifier" + }, + "end": 609, + "start": 537, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 649, + "raw": "0.08972872009232558", + "start": 630, + "type": "Literal", + "type": "Literal", + "value": 0.08972872009232558 + }, + "end": 649, + "operator": "-", + "start": 629, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 678, + "raw": "0.08887625823751266", + "start": 659, + "type": "Literal", + "type": "Literal", + "value": 0.08887625823751266 + }, + "end": 678, + "operator": "-", + "start": 658, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 685, + "start": 620, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 688, + "start": 687, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 619, + "name": "line", + "start": 615, + "type": "Identifier" + }, + "end": 689, + "start": 615, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 727, + "raw": "0.9203433427102556", + "start": 709, + "type": "Literal", + "type": "Literal", + "value": 0.9203433427102556 + }, + { + "argument": { + "end": 756, + "raw": "0.17343459369697545", + "start": 737, + "type": "Literal", + "type": "Literal", + "value": 0.17343459369697545 + }, + "end": 756, + "operator": "-", + "start": 736, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 763, + "start": 700, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 766, + "start": 765, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 699, + "name": "line", + "start": 695, + "type": "Identifier" + }, + "end": 767, + "start": 695, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 808, + "raw": "0.0017496234414517975", + "start": 787, + "type": "Literal", + "type": "Literal", + "value": 0.0017496234414517975 + }, + { + "argument": { + "end": 836, + "raw": "0.5178508316168335", + "start": 818, + "type": "Literal", + "type": "Literal", + "value": 0.5178508316168335 + }, + "end": 836, + "operator": "-", + "start": 817, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 843, + "start": 778, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 846, + "start": 845, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 777, + "name": "line", + "start": 773, + "type": "Identifier" + }, + "end": 847, + "start": 773, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 885, + "raw": "0.6206263405732759", + "start": 867, + "type": "Literal", + "type": "Literal", + "value": 0.6206263405732759 + }, + { + "argument": { + "end": 913, + "raw": "0.8733399468665124", + "start": 895, + "type": "Literal", + "type": "Literal", + "value": 0.8733399468665124 + }, + "end": 913, + "operator": "-", + "start": 894, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 920, + "start": 858, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 923, + "start": 922, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 857, + "name": "line", + "start": 853, + "type": "Identifier" + }, + "end": 924, + "start": 853, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 963, + "raw": "0.7776386664456383", + "start": 945, + "type": "Literal", + "type": "Literal", + "value": 0.7776386664456383 + }, + "end": 963, + "operator": "-", + "start": 944, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 990, + "raw": "0.7602780485384968", + "start": 972, + "type": "Literal", + "type": "Literal", + "value": 0.7602780485384968 + } + ], + "end": 997, + "start": 935, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1000, + "start": 999, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 934, + "name": "line", + "start": 930, + "type": "Identifier" + }, + "end": 1001, + "start": 930, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1031, + "raw": "0.5439379760788592", + "start": 1013, + "type": "Literal", + "type": "Literal", + "value": 0.5439379760788592 + }, + { + "end": 1051, + "raw": "0.8449177589350552", + "start": 1033, + "type": "Literal", + "type": "Literal", + "value": 0.8449177589350552 + } + ], + "end": 1052, + "start": 1012, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1055, + "start": 1054, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1011, + "name": "line", + "start": 1007, + "type": "Identifier" + }, + "end": 1056, + "start": 1007, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 1096, + "raw": "0.13036646025917076", + "start": 1077, + "type": "Literal", + "type": "Literal", + "value": 0.13036646025917076 + }, + "end": 1096, + "operator": "-", + "start": 1076, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 1125, + "raw": "0.012051713627069693", + "start": 1105, + "type": "Literal", + "type": "Literal", + "value": 0.012051713627069693 + } + ], + "end": 1132, + "start": 1067, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1135, + "start": 1134, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1066, + "name": "line", + "start": 1062, + "type": "Identifier" + }, + "end": 1136, + "start": 1062, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 1175, + "raw": "0.1656465612645519", + "start": 1157, + "type": "Literal", + "type": "Literal", + "value": 0.1656465612645519 + }, + "end": 1175, + "operator": "-", + "start": 1156, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 1204, + "raw": "0.20775229173765486", + "start": 1185, + "type": "Literal", + "type": "Literal", + "value": 0.20775229173765486 + }, + "end": 1204, + "operator": "-", + "start": 1184, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1211, + "start": 1147, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1214, + "start": 1213, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1146, + "name": "line", + "start": 1142, + "type": "Identifier" + }, + "end": 1215, + "start": 1142, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 1254, + "raw": "0.0962723255929061", + "start": 1236, + "type": "Literal", + "type": "Literal", + "value": 0.0962723255929061 + }, + "end": 1254, + "operator": "-", + "start": 1235, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 1283, + "raw": "0.05417797659066137", + "start": 1264, + "type": "Literal", + "type": "Literal", + "value": 0.05417797659066137 + }, + "end": 1283, + "operator": "-", + "start": 1263, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1290, + "start": 1226, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1293, + "start": 1292, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1225, + "name": "line", + "start": 1221, + "type": "Identifier" + }, + "end": 1294, + "start": 1221, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1323, + "raw": "0.902108945498191", + "start": 1306, + "type": "Literal", + "type": "Literal", + "value": 0.902108945498191 + }, + { + "end": 1343, + "raw": "0.3958978534964961", + "start": 1325, + "type": "Literal", + "type": "Literal", + "value": 0.3958978534964961 + } + ], + "end": 1344, + "start": 1305, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1347, + "start": 1346, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1304, + "name": "line", + "start": 1300, + "type": "Identifier" + }, + "end": 1348, + "start": 1300, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1387, + "raw": "0.27997950083139167", + "start": 1368, + "type": "Literal", + "type": "Literal", + "value": 0.27997950083139167 + }, + { + "argument": { + "end": 1416, + "raw": "0.17778188444008958", + "start": 1397, + "type": "Literal", + "type": "Literal", + "value": 0.17778188444008958 + }, + "end": 1416, + "operator": "-", + "start": 1396, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1423, + "start": 1359, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1426, + "start": 1425, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1358, + "name": "line", + "start": 1354, + "type": "Identifier" + }, + "end": 1427, + "start": 1354, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1457, + "raw": "0.5235806061589545", + "start": 1439, + "type": "Literal", + "type": "Literal", + "value": 0.5235806061589545 + }, + { + "end": 1476, + "raw": "0.694318985642328", + "start": 1459, + "type": "Literal", + "type": "Literal", + "value": 0.694318985642328 + } + ], + "end": 1477, + "start": 1438, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1480, + "start": 1479, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1437, + "name": "line", + "start": 1433, + "type": "Identifier" + }, + "end": 1481, + "start": 1433, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1520, + "raw": "0.39140760219992154", + "start": 1501, + "type": "Literal", + "type": "Literal", + "value": 0.39140760219992154 + }, + { + "argument": { + "end": 1548, + "raw": "0.7839795272576484", + "start": 1530, + "type": "Literal", + "type": "Literal", + "value": 0.7839795272576484 + }, + "end": 1548, + "operator": "-", + "start": 1529, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1555, + "start": 1492, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1558, + "start": 1557, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1491, + "name": "line", + "start": 1487, + "type": "Identifier" + }, + "end": 1559, + "start": 1487, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1589, + "raw": "0.8414243527073519", + "start": 1571, + "type": "Literal", + "type": "Literal", + "value": 0.8414243527073519 + }, + { + "end": 1609, + "raw": "0.5395591528940082", + "start": 1591, + "type": "Literal", + "type": "Literal", + "value": 0.5395591528940082 + } + ], + "end": 1610, + "start": 1570, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1613, + "start": 1612, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1569, + "name": "line", + "start": 1565, + "type": "Identifier" + }, + "end": 1614, + "start": 1565, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1652, + "raw": "0.6137667704875602", + "start": 1634, + "type": "Literal", + "type": "Literal", + "value": 0.6137667704875602 + }, + { + "end": 1680, + "raw": "0.22119647516722085", + "start": 1661, + "type": "Literal", + "type": "Literal", + "value": 0.22119647516722085 + } + ], + "end": 1687, + "start": 1625, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1690, + "start": 1689, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1624, + "name": "line", + "start": 1620, + "type": "Identifier" + }, + "end": 1691, + "start": 1620, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1721, + "raw": "0.8830488380766681", + "start": 1703, + "type": "Literal", + "type": "Literal", + "value": 0.8830488380766681 + }, + { + "end": 1741, + "raw": "0.6996724408425232", + "start": 1723, + "type": "Literal", + "type": "Literal", + "value": 0.6996724408425232 + } + ], + "end": 1742, + "start": 1702, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1745, + "start": 1744, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1701, + "name": "line", + "start": 1697, + "type": "Identifier" + }, + "end": 1746, + "start": 1697, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 1786, + "raw": "0.41290485754343953", + "start": 1767, + "type": "Literal", + "type": "Literal", + "value": 0.41290485754343953 + }, + "end": 1786, + "operator": "-", + "start": 1766, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 1814, + "raw": "0.4152647361760933", + "start": 1796, + "type": "Literal", + "type": "Literal", + "value": 0.4152647361760933 + }, + "end": 1814, + "operator": "-", + "start": 1795, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1821, + "start": 1757, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1824, + "start": 1823, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1756, + "name": "line", + "start": 1752, + "type": "Identifier" + }, + "end": 1825, + "start": 1752, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1863, + "raw": "0.5169538755575687", + "start": 1845, + "type": "Literal", + "type": "Literal", + "value": 0.5169538755575687 + }, + { + "argument": { + "end": 1891, + "raw": "0.9085567867302617", + "start": 1873, + "type": "Literal", + "type": "Literal", + "value": 0.9085567867302617 + }, + "end": 1891, + "operator": "-", + "start": 1872, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1898, + "start": 1836, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1901, + "start": 1900, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1835, + "name": "line", + "start": 1831, + "type": "Identifier" + }, + "end": 1902, + "start": 1831, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 1941, + "raw": "0.6716353749059765", + "start": 1923, + "type": "Literal", + "type": "Literal", + "value": 0.6716353749059765 + }, + "end": 1941, + "operator": "-", + "start": 1922, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 1969, + "raw": "0.9605576808879026", + "start": 1951, + "type": "Literal", + "type": "Literal", + "value": 0.9605576808879026 + }, + "end": 1969, + "operator": "-", + "start": 1950, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1976, + "start": 1913, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1979, + "start": 1978, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1912, + "name": "line", + "start": 1908, + "type": "Identifier" + }, + "end": 1980, + "start": 1908, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2020, + "raw": "0.010280170930300203", + "start": 2000, + "type": "Literal", + "type": "Literal", + "value": 0.010280170930300203 + }, + { + "argument": { + "end": 2049, + "raw": "0.37344123662342166", + "start": 2030, + "type": "Literal", + "type": "Literal", + "value": 0.37344123662342166 + }, + "end": 2049, + "operator": "-", + "start": 2029, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2056, + "start": 1991, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2059, + "start": 2058, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1990, + "name": "line", + "start": 1986, + "type": "Identifier" + }, + "end": 2060, + "start": 1986, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2099, + "raw": "0.10357375682791004", + "start": 2080, + "type": "Literal", + "type": "Literal", + "value": 0.10357375682791004 + }, + { + "argument": { + "end": 2128, + "raw": "0.42294321030821425", + "start": 2109, + "type": "Literal", + "type": "Literal", + "value": 0.42294321030821425 + }, + "end": 2128, + "operator": "-", + "start": 2108, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2135, + "start": 2071, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2138, + "start": 2137, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2070, + "name": "line", + "start": 2066, + "type": "Identifier" + }, + "end": 2139, + "start": 2066, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2177, + "raw": "0.4520311575096987", + "start": 2159, + "type": "Literal", + "type": "Literal", + "value": 0.4520311575096987 + }, + { + "argument": { + "end": 2206, + "raw": "0.11232675307600548", + "start": 2187, + "type": "Literal", + "type": "Literal", + "value": 0.11232675307600548 + }, + "end": 2206, + "operator": "-", + "start": 2186, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2213, + "start": 2150, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2216, + "start": 2215, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2149, + "name": "line", + "start": 2145, + "type": "Identifier" + }, + "end": 2217, + "start": 2145, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 2256, + "raw": "0.8821185914380845", + "start": 2238, + "type": "Literal", + "type": "Literal", + "value": 0.8821185914380845 + }, + "end": 2256, + "operator": "-", + "start": 2237, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 2284, + "raw": "0.7155147434939819", + "start": 2266, + "type": "Literal", + "type": "Literal", + "value": 0.7155147434939819 + }, + "end": 2284, + "operator": "-", + "start": 2265, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2291, + "start": 2228, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2294, + "start": 2293, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2227, + "name": "line", + "start": 2223, + "type": "Identifier" + }, + "end": 2295, + "start": 2223, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2325, + "raw": "0.9195487101690416", + "start": 2307, + "type": "Literal", + "type": "Literal", + "value": 0.9195487101690416 + }, + { + "end": 2345, + "raw": "0.2691627465297364", + "start": 2327, + "type": "Literal", + "type": "Literal", + "value": 0.2691627465297364 + } + ], + "end": 2346, + "start": 2306, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2349, + "start": 2348, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2305, + "name": "line", + "start": 2301, + "type": "Identifier" + }, + "end": 2350, + "start": 2301, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2388, + "raw": "0.7098978191546745", + "start": 2370, + "type": "Literal", + "type": "Literal", + "value": 0.7098978191546745 + }, + { + "end": 2416, + "raw": "0.11710004169385968", + "start": 2397, + "type": "Literal", + "type": "Literal", + "value": 0.11710004169385968 + } + ], + "end": 2423, + "start": 2361, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2426, + "start": 2425, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2360, + "name": "line", + "start": 2356, + "type": "Identifier" + }, + "end": 2427, + "start": 2356, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 2467, + "raw": "0.37876368560819995", + "start": 2448, + "type": "Literal", + "type": "Literal", + "value": 0.37876368560819995 + }, + "end": 2467, + "operator": "-", + "start": 2447, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 2494, + "raw": "0.7106729314759084", + "start": 2476, + "type": "Literal", + "type": "Literal", + "value": 0.7106729314759084 + } + ], + "end": 2501, + "start": 2438, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2504, + "start": 2503, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2437, + "name": "line", + "start": 2433, + "type": "Identifier" + }, + "end": 2505, + "start": 2433, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 2545, + "raw": "0.29728126898353335", + "start": 2526, + "type": "Literal", + "type": "Literal", + "value": 0.29728126898353335 + }, + "end": 2545, + "operator": "-", + "start": 2525, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 2574, + "raw": "0.06649734568328003", + "start": 2555, + "type": "Literal", + "type": "Literal", + "value": 0.06649734568328003 + }, + "end": 2574, + "operator": "-", + "start": 2554, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2581, + "start": 2516, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2584, + "start": 2583, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2515, + "name": "line", + "start": 2511, + "type": "Identifier" + }, + "end": 2585, + "start": 2511, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2624, + "raw": "0.22965781558352072", + "start": 2605, + "type": "Literal", + "type": "Literal", + "value": 0.22965781558352072 + }, + { + "argument": { + "end": 2652, + "raw": "0.7601866432836641", + "start": 2634, + "type": "Literal", + "type": "Literal", + "value": 0.7601866432836641 + }, + "end": 2652, + "operator": "-", + "start": 2633, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2659, + "start": 2596, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2662, + "start": 2661, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2595, + "name": "line", + "start": 2591, + "type": "Identifier" + }, + "end": 2663, + "start": 2591, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 2702, + "raw": "0.6356501074317229", + "start": 2684, + "type": "Literal", + "type": "Literal", + "value": 0.6356501074317229 + }, + "end": 2702, + "operator": "-", + "start": 2683, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 2730, + "raw": "0.19458425399338064", + "start": 2711, + "type": "Literal", + "type": "Literal", + "value": 0.19458425399338064 + } + ], + "end": 2737, + "start": 2674, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2740, + "start": 2739, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2673, + "name": "line", + "start": 2669, + "type": "Identifier" + }, + "end": 2741, + "start": 2669, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2771, + "raw": "0.5721251777404546", + "start": 2753, + "type": "Literal", + "type": "Literal", + "value": 0.5721251777404546 + }, + { + "end": 2791, + "raw": "0.2888584097921527", + "start": 2773, + "type": "Literal", + "type": "Literal", + "value": 0.2888584097921527 + } + ], + "end": 2792, + "start": 2752, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2795, + "start": 2794, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2751, + "name": "line", + "start": 2747, + "type": "Identifier" + }, + "end": 2796, + "start": 2747, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 2835, + "raw": "0.9580409549552311", + "start": 2817, + "type": "Literal", + "type": "Literal", + "value": 0.9580409549552311 + }, + "end": 2835, + "operator": "-", + "start": 2816, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 2864, + "raw": "0.02243818192078395", + "start": 2845, + "type": "Literal", + "type": "Literal", + "value": 0.02243818192078395 + }, + "end": 2864, + "operator": "-", + "start": 2844, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2871, + "start": 2807, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2874, + "start": 2873, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2806, + "name": "line", + "start": 2802, + "type": "Identifier" + }, + "end": 2875, + "start": 2802, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2913, + "raw": "0.3299184618602866", + "start": 2895, + "type": "Literal", + "type": "Literal", + "value": 0.3299184618602866 + }, + { + "argument": { + "end": 2941, + "raw": "0.8353726942369875", + "start": 2923, + "type": "Literal", + "type": "Literal", + "value": 0.8353726942369875 + }, + "end": 2941, + "operator": "-", + "start": 2922, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 2948, + "start": 2886, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 2951, + "start": 2950, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2885, + "name": "line", + "start": 2881, + "type": "Identifier" + }, + "end": 2952, + "start": 2881, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 2990, + "raw": "0.7434639386755209", + "start": 2972, + "type": "Literal", + "type": "Literal", + "value": 0.7434639386755209 + }, + { + "argument": { + "end": 3018, + "raw": "0.7919648864138378", + "start": 3000, + "type": "Literal", + "type": "Literal", + "value": 0.7919648864138378 + }, + "end": 3018, + "operator": "-", + "start": 2999, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 3025, + "start": 2963, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3028, + "start": 3027, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 2962, + "name": "line", + "start": 2958, + "type": "Identifier" + }, + "end": 3029, + "start": 2958, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 3059, + "raw": "0.9935751011164615", + "start": 3041, + "type": "Literal", + "type": "Literal", + "value": 0.9935751011164615 + }, + { + "end": 3079, + "raw": "0.9042566468497608", + "start": 3061, + "type": "Literal", + "type": "Literal", + "value": 0.9042566468497608 + } + ], + "end": 3080, + "start": 3040, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3083, + "start": 3082, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3039, + "name": "line", + "start": 3035, + "type": "Identifier" + }, + "end": 3084, + "start": 3035, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 3123, + "raw": "0.5035812884687294", + "start": 3105, + "type": "Literal", + "type": "Literal", + "value": 0.5035812884687294 + }, + "end": 3123, + "operator": "-", + "start": 3104, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 3150, + "raw": "0.5150967434989442", + "start": 3132, + "type": "Literal", + "type": "Literal", + "value": 0.5150967434989442 + } + ], + "end": 3157, + "start": 3095, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3160, + "start": 3159, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3094, + "name": "line", + "start": 3090, + "type": "Identifier" + }, + "end": 3161, + "start": 3090, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 3191, + "raw": "0.5526227215900215", + "start": 3173, + "type": "Literal", + "type": "Literal", + "value": 0.5526227215900215 + }, + { + "end": 3211, + "raw": "0.7612604137272441", + "start": 3193, + "type": "Literal", + "type": "Literal", + "value": 0.7612604137272441 + } + ], + "end": 3212, + "start": 3172, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3215, + "start": 3214, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3171, + "name": "line", + "start": 3167, + "type": "Identifier" + }, + "end": 3216, + "start": 3167, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 3254, + "raw": "0.8593271349126876", + "start": 3236, + "type": "Literal", + "type": "Literal", + "value": 0.8593271349126876 + }, + { + "end": 3282, + "raw": "0.08414894953725849", + "start": 3263, + "type": "Literal", + "type": "Literal", + "value": 0.08414894953725849 + } + ], + "end": 3289, + "start": 3227, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3292, + "start": 3291, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3226, + "name": "line", + "start": 3222, + "type": "Identifier" + }, + "end": 3293, + "start": 3222, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 3332, + "raw": "0.8181049219192864", + "start": 3314, + "type": "Literal", + "type": "Literal", + "value": 0.8181049219192864 + }, + "end": 3332, + "operator": "-", + "start": 3313, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 3359, + "raw": "0.903548131323352", + "start": 3342, + "type": "Literal", + "type": "Literal", + "value": 0.903548131323352 + }, + "end": 3359, + "operator": "-", + "start": 3341, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 3366, + "start": 3304, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3369, + "start": 3368, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3303, + "name": "line", + "start": 3299, + "type": "Identifier" + }, + "end": 3370, + "start": 3299, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 3408, + "raw": "0.3165782044458305", + "start": 3390, + "type": "Literal", + "type": "Literal", + "value": 0.3165782044458305 + }, + { + "argument": { + "end": 3437, + "raw": "0.24189274252014914", + "start": 3418, + "type": "Literal", + "type": "Literal", + "value": 0.24189274252014914 + }, + "end": 3437, + "operator": "-", + "start": 3417, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 3444, + "start": 3381, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3447, + "start": 3446, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3380, + "name": "line", + "start": 3376, + "type": "Identifier" + }, + "end": 3448, + "start": 3376, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 3488, + "raw": "0.44390956414045135", + "start": 3469, + "type": "Literal", + "type": "Literal", + "value": 0.44390956414045135 + }, + "end": 3488, + "operator": "-", + "start": 3468, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 3517, + "raw": "0.25912591535126905", + "start": 3498, + "type": "Literal", + "type": "Literal", + "value": 0.25912591535126905 + }, + "end": 3517, + "operator": "-", + "start": 3497, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 3524, + "start": 3459, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3527, + "start": 3526, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3458, + "name": "line", + "start": 3454, + "type": "Identifier" + }, + "end": 3528, + "start": 3454, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 3567, + "raw": "0.6605165911891009", + "start": 3549, + "type": "Literal", + "type": "Literal", + "value": 0.6605165911891009 + }, + "end": 3567, + "operator": "-", + "start": 3548, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 3596, + "raw": "0.40355115288839194", + "start": 3577, + "type": "Literal", + "type": "Literal", + "value": 0.40355115288839194 + }, + "end": 3596, + "operator": "-", + "start": 3576, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 3603, + "start": 3539, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3606, + "start": 3605, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3538, + "name": "line", + "start": 3534, + "type": "Identifier" + }, + "end": 3607, + "start": 3534, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 3646, + "raw": "0.7170489950180006", + "start": 3628, + "type": "Literal", + "type": "Literal", + "value": 0.7170489950180006 + }, + "end": 3646, + "operator": "-", + "start": 3627, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 3674, + "raw": "0.23454356079651384", + "start": 3655, + "type": "Literal", + "type": "Literal", + "value": 0.23454356079651384 + } + ], + "end": 3681, + "start": 3618, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3684, + "start": 3683, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3617, + "name": "line", + "start": 3613, + "type": "Identifier" + }, + "end": 3685, + "start": 3613, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 3724, + "raw": "0.2568187045379722", + "start": 3706, + "type": "Literal", + "type": "Literal", + "value": 0.2568187045379722 + }, + "end": 3724, + "operator": "-", + "start": 3705, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 3753, + "raw": "0.45031188717601367", + "start": 3734, + "type": "Literal", + "type": "Literal", + "value": 0.45031188717601367 + }, + "end": 3753, + "operator": "-", + "start": 3733, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 3760, + "start": 3696, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3763, + "start": 3762, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3695, + "name": "line", + "start": 3691, + "type": "Identifier" + }, + "end": 3764, + "start": 3691, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 3802, + "raw": "0.6751951211858687", + "start": 3784, + "type": "Literal", + "type": "Literal", + "value": 0.6751951211858687 + }, + { + "argument": { + "end": 3830, + "raw": "0.9709424233465593", + "start": 3812, + "type": "Literal", + "type": "Literal", + "value": 0.9709424233465593 + }, + "end": 3830, + "operator": "-", + "start": 3811, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 3837, + "start": 3775, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3840, + "start": 3839, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3774, + "name": "line", + "start": 3770, + "type": "Identifier" + }, + "end": 3841, + "start": 3770, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 3880, + "raw": "0.5689619842972184", + "start": 3862, + "type": "Literal", + "type": "Literal", + "value": 0.5689619842972184 + }, + "end": 3880, + "operator": "-", + "start": 3861, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 3907, + "raw": "0.5918969913790362", + "start": 3889, + "type": "Literal", + "type": "Literal", + "value": 0.5918969913790362 + } + ], + "end": 3914, + "start": 3852, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3917, + "start": 3916, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3851, + "name": "line", + "start": 3847, + "type": "Identifier" + }, + "end": 3918, + "start": 3847, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 3957, + "raw": "0.8328324229085962", + "start": 3939, + "type": "Literal", + "type": "Literal", + "value": 0.8328324229085962 + }, + "end": 3957, + "operator": "-", + "start": 3938, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 3984, + "raw": "0.4677492878818803", + "start": 3966, + "type": "Literal", + "type": "Literal", + "value": 0.4677492878818803 + } + ], + "end": 3991, + "start": 3929, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 3994, + "start": 3993, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 3928, + "name": "line", + "start": 3924, + "type": "Identifier" + }, + "end": 3995, + "start": 3924, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 4034, + "raw": "0.8111463382182231", + "start": 4016, + "type": "Literal", + "type": "Literal", + "value": 0.8111463382182231 + }, + "end": 4034, + "operator": "-", + "start": 4015, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 4063, + "raw": "0.41814807547140576", + "start": 4044, + "type": "Literal", + "type": "Literal", + "value": 0.41814807547140576 + }, + "end": 4063, + "operator": "-", + "start": 4043, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 4070, + "start": 4006, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4073, + "start": 4072, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4005, + "name": "line", + "start": 4001, + "type": "Identifier" + }, + "end": 4074, + "start": 4001, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 4113, + "raw": "0.03807684940941125", + "start": 4094, + "type": "Literal", + "type": "Literal", + "value": 0.03807684940941125 + }, + { + "end": 4141, + "raw": "0.25664826686353326", + "start": 4122, + "type": "Literal", + "type": "Literal", + "value": 0.25664826686353326 + } + ], + "end": 4148, + "start": 4085, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4151, + "start": 4150, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4084, + "name": "line", + "start": 4080, + "type": "Identifier" + }, + "end": 4152, + "start": 4080, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 4191, + "raw": "0.23950083339596384", + "start": 4172, + "type": "Literal", + "type": "Literal", + "value": 0.23950083339596384 + }, + { + "end": 4219, + "raw": "0.43693196301855575", + "start": 4200, + "type": "Literal", + "type": "Literal", + "value": 0.43693196301855575 + } + ], + "end": 4226, + "start": 4163, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4229, + "start": 4228, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4162, + "name": "line", + "start": 4158, + "type": "Identifier" + }, + "end": 4230, + "start": 4158, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 4270, + "raw": "0.16279444820904887", + "start": 4251, + "type": "Literal", + "type": "Literal", + "value": 0.16279444820904887 + }, + "end": 4270, + "operator": "-", + "start": 4250, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 4297, + "raw": "0.8064475707664818", + "start": 4279, + "type": "Literal", + "type": "Literal", + "value": 0.8064475707664818 + } + ], + "end": 4304, + "start": 4241, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4307, + "start": 4306, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4240, + "name": "line", + "start": 4236, + "type": "Identifier" + }, + "end": 4308, + "start": 4236, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 4348, + "raw": "0.08972872009232558", + "start": 4329, + "type": "Literal", + "type": "Literal", + "value": 0.08972872009232558 + }, + "end": 4348, + "operator": "-", + "start": 4328, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 4377, + "raw": "0.08887625823751266", + "start": 4358, + "type": "Literal", + "type": "Literal", + "value": 0.08887625823751266 + }, + "end": 4377, + "operator": "-", + "start": 4357, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 4384, + "start": 4319, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4387, + "start": 4386, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4318, + "name": "line", + "start": 4314, + "type": "Identifier" + }, + "end": 4388, + "start": 4314, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 4426, + "raw": "0.9203433427102556", + "start": 4408, + "type": "Literal", + "type": "Literal", + "value": 0.9203433427102556 + }, + { + "argument": { + "end": 4455, + "raw": "0.17343459369697545", + "start": 4436, + "type": "Literal", + "type": "Literal", + "value": 0.17343459369697545 + }, + "end": 4455, + "operator": "-", + "start": 4435, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 4462, + "start": 4399, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4465, + "start": 4464, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4398, + "name": "line", + "start": 4394, + "type": "Identifier" + }, + "end": 4466, + "start": 4394, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 4507, + "raw": "0.0017496234414517975", + "start": 4486, + "type": "Literal", + "type": "Literal", + "value": 0.0017496234414517975 + }, + { + "argument": { + "end": 4535, + "raw": "0.5178508316168335", + "start": 4517, + "type": "Literal", + "type": "Literal", + "value": 0.5178508316168335 + }, + "end": 4535, + "operator": "-", + "start": 4516, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 4542, + "start": 4477, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4545, + "start": 4544, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4476, + "name": "line", + "start": 4472, + "type": "Identifier" + }, + "end": 4546, + "start": 4472, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 4584, + "raw": "0.6206263405732759", + "start": 4566, + "type": "Literal", + "type": "Literal", + "value": 0.6206263405732759 + }, + { + "argument": { + "end": 4612, + "raw": "0.8733399468665124", + "start": 4594, + "type": "Literal", + "type": "Literal", + "value": 0.8733399468665124 + }, + "end": 4612, + "operator": "-", + "start": 4593, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 4619, + "start": 4557, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4622, + "start": 4621, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4556, + "name": "line", + "start": 4552, + "type": "Identifier" + }, + "end": 4623, + "start": 4552, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 4662, + "raw": "0.7776386664456383", + "start": 4644, + "type": "Literal", + "type": "Literal", + "value": 0.7776386664456383 + }, + "end": 4662, + "operator": "-", + "start": 4643, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 4689, + "raw": "0.7602780485384968", + "start": 4671, + "type": "Literal", + "type": "Literal", + "value": 0.7602780485384968 + } + ], + "end": 4696, + "start": 4634, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4699, + "start": 4698, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4633, + "name": "line", + "start": 4629, + "type": "Identifier" + }, + "end": 4700, + "start": 4629, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 4730, + "raw": "0.5439379760788592", + "start": 4712, + "type": "Literal", + "type": "Literal", + "value": 0.5439379760788592 + }, + { + "end": 4750, + "raw": "0.8449177589350552", + "start": 4732, + "type": "Literal", + "type": "Literal", + "value": 0.8449177589350552 + } + ], + "end": 4751, + "start": 4711, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4754, + "start": 4753, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4710, + "name": "line", + "start": 4706, + "type": "Identifier" + }, + "end": 4755, + "start": 4706, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 4795, + "raw": "0.13036646025917076", + "start": 4776, + "type": "Literal", + "type": "Literal", + "value": 0.13036646025917076 + }, + "end": 4795, + "operator": "-", + "start": 4775, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 4824, + "raw": "0.012051713627069693", + "start": 4804, + "type": "Literal", + "type": "Literal", + "value": 0.012051713627069693 + } + ], + "end": 4831, + "start": 4766, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4834, + "start": 4833, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4765, + "name": "line", + "start": 4761, + "type": "Identifier" + }, + "end": 4835, + "start": 4761, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 4874, + "raw": "0.1656465612645519", + "start": 4856, + "type": "Literal", + "type": "Literal", + "value": 0.1656465612645519 + }, + "end": 4874, + "operator": "-", + "start": 4855, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 4903, + "raw": "0.20775229173765486", + "start": 4884, + "type": "Literal", + "type": "Literal", + "value": 0.20775229173765486 + }, + "end": 4903, + "operator": "-", + "start": 4883, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 4910, + "start": 4846, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4913, + "start": 4912, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4845, + "name": "line", + "start": 4841, + "type": "Identifier" + }, + "end": 4914, + "start": 4841, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 4953, + "raw": "0.0962723255929061", + "start": 4935, + "type": "Literal", + "type": "Literal", + "value": 0.0962723255929061 + }, + "end": 4953, + "operator": "-", + "start": 4934, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 4982, + "raw": "0.05417797659066137", + "start": 4963, + "type": "Literal", + "type": "Literal", + "value": 0.05417797659066137 + }, + "end": 4982, + "operator": "-", + "start": 4962, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 4989, + "start": 4925, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 4992, + "start": 4991, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 4924, + "name": "line", + "start": 4920, + "type": "Identifier" + }, + "end": 4993, + "start": 4920, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5022, + "raw": "0.902108945498191", + "start": 5005, + "type": "Literal", + "type": "Literal", + "value": 0.902108945498191 + }, + { + "end": 5042, + "raw": "0.3958978534964961", + "start": 5024, + "type": "Literal", + "type": "Literal", + "value": 0.3958978534964961 + } + ], + "end": 5043, + "start": 5004, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5046, + "start": 5045, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5003, + "name": "line", + "start": 4999, + "type": "Identifier" + }, + "end": 5047, + "start": 4999, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5086, + "raw": "0.27997950083139167", + "start": 5067, + "type": "Literal", + "type": "Literal", + "value": 0.27997950083139167 + }, + { + "argument": { + "end": 5115, + "raw": "0.17778188444008958", + "start": 5096, + "type": "Literal", + "type": "Literal", + "value": 0.17778188444008958 + }, + "end": 5115, + "operator": "-", + "start": 5095, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 5122, + "start": 5058, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5125, + "start": 5124, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5057, + "name": "line", + "start": 5053, + "type": "Identifier" + }, + "end": 5126, + "start": 5053, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5156, + "raw": "0.5235806061589545", + "start": 5138, + "type": "Literal", + "type": "Literal", + "value": 0.5235806061589545 + }, + { + "end": 5175, + "raw": "0.694318985642328", + "start": 5158, + "type": "Literal", + "type": "Literal", + "value": 0.694318985642328 + } + ], + "end": 5176, + "start": 5137, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5179, + "start": 5178, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5136, + "name": "line", + "start": 5132, + "type": "Identifier" + }, + "end": 5180, + "start": 5132, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5219, + "raw": "0.39140760219992154", + "start": 5200, + "type": "Literal", + "type": "Literal", + "value": 0.39140760219992154 + }, + { + "argument": { + "end": 5247, + "raw": "0.7839795272576484", + "start": 5229, + "type": "Literal", + "type": "Literal", + "value": 0.7839795272576484 + }, + "end": 5247, + "operator": "-", + "start": 5228, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 5254, + "start": 5191, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5257, + "start": 5256, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5190, + "name": "line", + "start": 5186, + "type": "Identifier" + }, + "end": 5258, + "start": 5186, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5288, + "raw": "0.8414243527073519", + "start": 5270, + "type": "Literal", + "type": "Literal", + "value": 0.8414243527073519 + }, + { + "end": 5308, + "raw": "0.5395591528940082", + "start": 5290, + "type": "Literal", + "type": "Literal", + "value": 0.5395591528940082 + } + ], + "end": 5309, + "start": 5269, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5312, + "start": 5311, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5268, + "name": "line", + "start": 5264, + "type": "Identifier" + }, + "end": 5313, + "start": 5264, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5351, + "raw": "0.6137667704875602", + "start": 5333, + "type": "Literal", + "type": "Literal", + "value": 0.6137667704875602 + }, + { + "end": 5379, + "raw": "0.22119647516722085", + "start": 5360, + "type": "Literal", + "type": "Literal", + "value": 0.22119647516722085 + } + ], + "end": 5386, + "start": 5324, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5389, + "start": 5388, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5323, + "name": "line", + "start": 5319, + "type": "Identifier" + }, + "end": 5390, + "start": 5319, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5420, + "raw": "0.8830488380766681", + "start": 5402, + "type": "Literal", + "type": "Literal", + "value": 0.8830488380766681 + }, + { + "end": 5440, + "raw": "0.6996724408425232", + "start": 5422, + "type": "Literal", + "type": "Literal", + "value": 0.6996724408425232 + } + ], + "end": 5441, + "start": 5401, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5444, + "start": 5443, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5400, + "name": "line", + "start": 5396, + "type": "Identifier" + }, + "end": 5445, + "start": 5396, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 5485, + "raw": "0.41290485754343953", + "start": 5466, + "type": "Literal", + "type": "Literal", + "value": 0.41290485754343953 + }, + "end": 5485, + "operator": "-", + "start": 5465, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 5513, + "raw": "0.4152647361760933", + "start": 5495, + "type": "Literal", + "type": "Literal", + "value": 0.4152647361760933 + }, + "end": 5513, + "operator": "-", + "start": 5494, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 5520, + "start": 5456, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5523, + "start": 5522, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5455, + "name": "line", + "start": 5451, + "type": "Identifier" + }, + "end": 5524, + "start": 5451, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5562, + "raw": "0.5169538755575687", + "start": 5544, + "type": "Literal", + "type": "Literal", + "value": 0.5169538755575687 + }, + { + "argument": { + "end": 5590, + "raw": "0.9085567867302617", + "start": 5572, + "type": "Literal", + "type": "Literal", + "value": 0.9085567867302617 + }, + "end": 5590, + "operator": "-", + "start": 5571, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 5597, + "start": 5535, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5600, + "start": 5599, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5534, + "name": "line", + "start": 5530, + "type": "Identifier" + }, + "end": 5601, + "start": 5530, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5639, + "raw": "0.6751951211858687", + "start": 5621, + "type": "Literal", + "type": "Literal", + "value": 0.6751951211858687 + }, + { + "argument": { + "end": 5667, + "raw": "0.9709424233465593", + "start": 5649, + "type": "Literal", + "type": "Literal", + "value": 0.9709424233465593 + }, + "end": 5667, + "operator": "-", + "start": 5648, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 5674, + "start": 5612, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5677, + "start": 5676, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5611, + "name": "line", + "start": 5607, + "type": "Identifier" + }, + "end": 5678, + "start": 5607, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 5717, + "raw": "0.5689619842972184", + "start": 5699, + "type": "Literal", + "type": "Literal", + "value": 0.5689619842972184 + }, + "end": 5717, + "operator": "-", + "start": 5698, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 5744, + "raw": "0.5918969913790362", + "start": 5726, + "type": "Literal", + "type": "Literal", + "value": 0.5918969913790362 + } + ], + "end": 5751, + "start": 5689, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5754, + "start": 5753, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5688, + "name": "line", + "start": 5684, + "type": "Identifier" + }, + "end": 5755, + "start": 5684, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5793, + "raw": "0.9464450621708211", + "start": 5775, + "type": "Literal", + "type": "Literal", + "value": 0.9464450621708211 + }, + { + "argument": { + "end": 5821, + "raw": "0.2684908127803667", + "start": 5803, + "type": "Literal", + "type": "Literal", + "value": 0.2684908127803667 + }, + "end": 5821, + "operator": "-", + "start": 5802, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 5828, + "start": 5766, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5831, + "start": 5830, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5765, + "name": "line", + "start": 5761, + "type": "Identifier" + }, + "end": 5832, + "start": 5761, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 5862, + "raw": "0.5241732366617591", + "start": 5844, + "type": "Literal", + "type": "Literal", + "value": 0.5241732366617591 + }, + { + "end": 5882, + "raw": "0.9011437416408563", + "start": 5864, + "type": "Literal", + "type": "Literal", + "value": 0.9011437416408563 + } + ], + "end": 5883, + "start": 5843, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5886, + "start": 5885, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5842, + "name": "line", + "start": 5838, + "type": "Identifier" + }, + "end": 5887, + "start": 5838, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 5927, + "raw": "0.14255393713960607", + "start": 5908, + "type": "Literal", + "type": "Literal", + "value": 0.14255393713960607 + }, + "end": 5927, + "operator": "-", + "start": 5907, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 5955, + "raw": "0.5194262624564814", + "start": 5937, + "type": "Literal", + "type": "Literal", + "value": 0.5194262624564814 + }, + "end": 5955, + "operator": "-", + "start": 5936, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 5962, + "start": 5898, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 5965, + "start": 5964, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5897, + "name": "line", + "start": 5893, + "type": "Identifier" + }, + "end": 5966, + "start": 5893, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 6005, + "raw": "0.4287123231350338", + "start": 5987, + "type": "Literal", + "type": "Literal", + "value": 0.4287123231350338 + }, + "end": 6005, + "operator": "-", + "start": 5986, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 6033, + "raw": "0.4223564528725028", + "start": 6015, + "type": "Literal", + "type": "Literal", + "value": 0.4223564528725028 + }, + "end": 6033, + "operator": "-", + "start": 6014, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 6040, + "start": 5977, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6043, + "start": 6042, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 5976, + "name": "line", + "start": 5972, + "type": "Identifier" + }, + "end": 6044, + "start": 5972, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 6084, + "raw": "0.09316367294024519", + "start": 6065, + "type": "Literal", + "type": "Literal", + "value": 0.09316367294024519 + }, + "end": 6084, + "operator": "-", + "start": 6064, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 6112, + "raw": "0.9063127021008246", + "start": 6094, + "type": "Literal", + "type": "Literal", + "value": 0.9063127021008246 + }, + "end": 6112, + "operator": "-", + "start": 6093, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 6119, + "start": 6055, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6122, + "start": 6121, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6054, + "name": "line", + "start": 6050, + "type": "Identifier" + }, + "end": 6123, + "start": 6050, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 6162, + "raw": "0.2767766535558669", + "start": 6144, + "type": "Literal", + "type": "Literal", + "value": 0.2767766535558669 + }, + "end": 6162, + "operator": "-", + "start": 6143, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 6189, + "raw": "0.6816248114129131", + "start": 6171, + "type": "Literal", + "type": "Literal", + "value": 0.6816248114129131 + } + ], + "end": 6196, + "start": 6134, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6199, + "start": 6198, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6133, + "name": "line", + "start": 6129, + "type": "Identifier" + }, + "end": 6200, + "start": 6129, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 6238, + "raw": "0.9796762495562534", + "start": 6220, + "type": "Literal", + "type": "Literal", + "value": 0.9796762495562534 + }, + { + "argument": { + "end": 6266, + "raw": "0.0822145668330625", + "start": 6248, + "type": "Literal", + "type": "Literal", + "value": 0.0822145668330625 + }, + "end": 6266, + "operator": "-", + "start": 6247, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 6273, + "start": 6211, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6276, + "start": 6275, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6210, + "name": "line", + "start": 6206, + "type": "Identifier" + }, + "end": 6277, + "start": 6206, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 6316, + "raw": "0.8666513070867441", + "start": 6298, + "type": "Literal", + "type": "Literal", + "value": 0.8666513070867441 + }, + "end": 6316, + "operator": "-", + "start": 6297, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 6343, + "raw": "0.301053160242023", + "start": 6326, + "type": "Literal", + "type": "Literal", + "value": 0.301053160242023 + }, + "end": 6343, + "operator": "-", + "start": 6325, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 6350, + "start": 6288, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6353, + "start": 6352, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6287, + "name": "line", + "start": 6283, + "type": "Identifier" + }, + "end": 6354, + "start": 6283, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 6391, + "raw": "0.537415656028112", + "start": 6374, + "type": "Literal", + "type": "Literal", + "value": 0.537415656028112 + }, + { + "end": 6420, + "raw": "0.020272692875002774", + "start": 6400, + "type": "Literal", + "type": "Literal", + "value": 0.020272692875002774 + } + ], + "end": 6427, + "start": 6365, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6430, + "start": 6429, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6364, + "name": "line", + "start": 6360, + "type": "Identifier" + }, + "end": 6431, + "start": 6360, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 6469, + "raw": "0.9332396256457531", + "start": 6451, + "type": "Literal", + "type": "Literal", + "value": 0.9332396256457531 + }, + { + "argument": { + "end": 6497, + "raw": "0.6228175690649898", + "start": 6479, + "type": "Literal", + "type": "Literal", + "value": 0.6228175690649898 + }, + "end": 6497, + "operator": "-", + "start": 6478, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 6504, + "start": 6442, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6507, + "start": 6506, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6441, + "name": "line", + "start": 6437, + "type": "Identifier" + }, + "end": 6508, + "start": 6437, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 6547, + "raw": "0.18052415837320734", + "start": 6528, + "type": "Literal", + "type": "Literal", + "value": 0.18052415837320734 + }, + { + "argument": { + "end": 6576, + "raw": "0.36894384647296197", + "start": 6557, + "type": "Literal", + "type": "Literal", + "value": 0.36894384647296197 + }, + "end": 6576, + "operator": "-", + "start": 6556, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 6583, + "start": 6519, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6586, + "start": 6585, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6518, + "name": "line", + "start": 6514, + "type": "Identifier" + }, + "end": 6587, + "start": 6514, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 6617, + "raw": "0.5384372634075449", + "start": 6599, + "type": "Literal", + "type": "Literal", + "value": 0.5384372634075449 + }, + { + "end": 6637, + "raw": "0.2377565050887107", + "start": 6619, + "type": "Literal", + "type": "Literal", + "value": 0.2377565050887107 + } + ], + "end": 6638, + "start": 6598, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6641, + "start": 6640, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6597, + "name": "line", + "start": 6593, + "type": "Identifier" + }, + "end": 6642, + "start": 6593, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 6681, + "raw": "0.39043436929278874", + "start": 6662, + "type": "Literal", + "type": "Literal", + "value": 0.39043436929278874 + }, + { + "end": 6709, + "raw": "0.14273182483160451", + "start": 6690, + "type": "Literal", + "type": "Literal", + "value": 0.14273182483160451 + } + ], + "end": 6716, + "start": 6653, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6719, + "start": 6718, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6652, + "name": "line", + "start": 6648, + "type": "Identifier" + }, + "end": 6720, + "start": 6648, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 6759, + "raw": "0.09782890412897283", + "start": 6740, + "type": "Literal", + "type": "Literal", + "value": 0.09782890412897283 + }, + { + "end": 6786, + "raw": "0.9907667536909659", + "start": 6768, + "type": "Literal", + "type": "Literal", + "value": 0.9907667536909659 + } + ], + "end": 6793, + "start": 6731, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6796, + "start": 6795, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6730, + "name": "line", + "start": 6726, + "type": "Identifier" + }, + "end": 6797, + "start": 6726, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 6835, + "raw": "0.5286610085921146", + "start": 6817, + "type": "Literal", + "type": "Literal", + "value": 0.5286610085921146 + }, + { + "argument": { + "end": 6863, + "raw": "0.7924508308419256", + "start": 6845, + "type": "Literal", + "type": "Literal", + "value": 0.7924508308419256 + }, + "end": 6863, + "operator": "-", + "start": 6844, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 6870, + "start": 6808, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6873, + "start": 6872, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6807, + "name": "line", + "start": 6803, + "type": "Identifier" + }, + "end": 6874, + "start": 6803, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 6912, + "raw": "0.3789978184503342", + "start": 6894, + "type": "Literal", + "type": "Literal", + "value": 0.3789978184503342 + }, + { + "end": 6940, + "raw": "0.12396120576838676", + "start": 6921, + "type": "Literal", + "type": "Literal", + "value": 0.12396120576838676 + } + ], + "end": 6947, + "start": 6885, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 6950, + "start": 6949, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6884, + "name": "line", + "start": 6880, + "type": "Identifier" + }, + "end": 6951, + "start": 6880, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 6990, + "raw": "0.9484912744890612", + "start": 6972, + "type": "Literal", + "type": "Literal", + "value": 0.9484912744890612 + }, + "end": 6990, + "operator": "-", + "start": 6971, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 7017, + "raw": "0.6729649846476855", + "start": 6999, + "type": "Literal", + "type": "Literal", + "value": 0.6729649846476855 + } + ], + "end": 7024, + "start": 6962, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7027, + "start": 7026, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 6961, + "name": "line", + "start": 6957, + "type": "Identifier" + }, + "end": 7028, + "start": 6957, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 7066, + "raw": "0.7451758753425153", + "start": 7048, + "type": "Literal", + "type": "Literal", + "value": 0.7451758753425153 + }, + { + "argument": { + "end": 7095, + "raw": "0.21318737562458967", + "start": 7076, + "type": "Literal", + "type": "Literal", + "value": 0.21318737562458967 + }, + "end": 7095, + "operator": "-", + "start": 7075, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 7102, + "start": 7039, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7105, + "start": 7104, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7038, + "name": "line", + "start": 7034, + "type": "Identifier" + }, + "end": 7106, + "start": 7034, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 7144, + "raw": "0.1873200727251887", + "start": 7126, + "type": "Literal", + "type": "Literal", + "value": 0.1873200727251887 + }, + { + "argument": { + "end": 7173, + "raw": "0.15961374297992448", + "start": 7154, + "type": "Literal", + "type": "Literal", + "value": 0.15961374297992448 + }, + "end": 7173, + "operator": "-", + "start": 7153, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 7180, + "start": 7117, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7183, + "start": 7182, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7116, + "name": "line", + "start": 7112, + "type": "Identifier" + }, + "end": 7184, + "start": 7112, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 7224, + "raw": "0.05729464924537564", + "start": 7205, + "type": "Literal", + "type": "Literal", + "value": 0.05729464924537564 + }, + "end": 7224, + "operator": "-", + "start": 7204, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 7252, + "raw": "0.5436345558508746", + "start": 7234, + "type": "Literal", + "type": "Literal", + "value": 0.5436345558508746 + }, + "end": 7252, + "operator": "-", + "start": 7233, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 7259, + "start": 7195, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7262, + "start": 7261, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7194, + "name": "line", + "start": 7190, + "type": "Identifier" + }, + "end": 7263, + "start": 7190, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 7303, + "raw": "0.09582414374469184", + "start": 7284, + "type": "Literal", + "type": "Literal", + "value": 0.09582414374469184 + }, + "end": 7303, + "operator": "-", + "start": 7283, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 7331, + "raw": "0.7533839681212353", + "start": 7313, + "type": "Literal", + "type": "Literal", + "value": 0.7533839681212353 + }, + "end": 7331, + "operator": "-", + "start": 7312, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 7338, + "start": 7274, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7341, + "start": 7340, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7273, + "name": "line", + "start": 7269, + "type": "Identifier" + }, + "end": 7342, + "start": 7269, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 7382, + "raw": "0.17254116580051848", + "start": 7363, + "type": "Literal", + "type": "Literal", + "value": 0.17254116580051848 + }, + "end": 7382, + "operator": "-", + "start": 7362, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 7410, + "raw": "0.7669113400341137", + "start": 7392, + "type": "Literal", + "type": "Literal", + "value": 0.7669113400341137 + }, + "end": 7410, + "operator": "-", + "start": 7391, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 7417, + "start": 7353, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7420, + "start": 7419, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7352, + "name": "line", + "start": 7348, + "type": "Identifier" + }, + "end": 7421, + "start": 7348, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 7451, + "raw": "0.8944730032887609", + "start": 7433, + "type": "Literal", + "type": "Literal", + "value": 0.8944730032887609 + }, + { + "end": 7471, + "raw": "0.6093318694741408", + "start": 7453, + "type": "Literal", + "type": "Literal", + "value": 0.6093318694741408 + } + ], + "end": 7472, + "start": 7432, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7475, + "start": 7474, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7431, + "name": "line", + "start": 7427, + "type": "Identifier" + }, + "end": 7476, + "start": 7427, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 7515, + "raw": "0.3670208139314082", + "start": 7497, + "type": "Literal", + "type": "Literal", + "value": 0.3670208139314082 + }, + "end": 7515, + "operator": "-", + "start": 7496, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 7543, + "raw": "0.21201331909674526", + "start": 7524, + "type": "Literal", + "type": "Literal", + "value": 0.21201331909674526 + } + ], + "end": 7550, + "start": 7487, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7553, + "start": 7552, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7486, + "name": "line", + "start": 7482, + "type": "Identifier" + }, + "end": 7554, + "start": 7482, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 7593, + "raw": "0.4707511307971115", + "start": 7575, + "type": "Literal", + "type": "Literal", + "value": 0.4707511307971115 + }, + "end": 7593, + "operator": "-", + "start": 7574, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 7620, + "raw": "0.4905279615419764", + "start": 7602, + "type": "Literal", + "type": "Literal", + "value": 0.4905279615419764 + } + ], + "end": 7627, + "start": 7565, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7630, + "start": 7629, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7564, + "name": "line", + "start": 7560, + "type": "Identifier" + }, + "end": 7631, + "start": 7560, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 7670, + "raw": "0.8328324229085962", + "start": 7652, + "type": "Literal", + "type": "Literal", + "value": 0.8328324229085962 + }, + "end": 7670, + "operator": "-", + "start": 7651, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 7697, + "raw": "0.4677492878818803", + "start": 7679, + "type": "Literal", + "type": "Literal", + "value": 0.4677492878818803 + } + ], + "end": 7704, + "start": 7642, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7707, + "start": 7706, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7641, + "name": "line", + "start": 7637, + "type": "Identifier" + }, + "end": 7708, + "start": 7637, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 7747, + "raw": "0.8111463382182231", + "start": 7729, + "type": "Literal", + "type": "Literal", + "value": 0.8111463382182231 + }, + "end": 7747, + "operator": "-", + "start": 7728, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 7776, + "raw": "0.41814807547140576", + "start": 7757, + "type": "Literal", + "type": "Literal", + "value": 0.41814807547140576 + }, + "end": 7776, + "operator": "-", + "start": 7756, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 7783, + "start": 7719, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7786, + "start": 7785, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7718, + "name": "line", + "start": 7714, + "type": "Identifier" + }, + "end": 7787, + "start": 7714, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 7826, + "raw": "0.03807684940941125", + "start": 7807, + "type": "Literal", + "type": "Literal", + "value": 0.03807684940941125 + }, + { + "end": 7854, + "raw": "0.25664826686353326", + "start": 7835, + "type": "Literal", + "type": "Literal", + "value": 0.25664826686353326 + } + ], + "end": 7861, + "start": 7798, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7864, + "start": 7863, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7797, + "name": "line", + "start": 7793, + "type": "Identifier" + }, + "end": 7865, + "start": 7793, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 7904, + "raw": "0.23950083339596384", + "start": 7885, + "type": "Literal", + "type": "Literal", + "value": 0.23950083339596384 + }, + { + "end": 7932, + "raw": "0.43693196301855575", + "start": 7913, + "type": "Literal", + "type": "Literal", + "value": 0.43693196301855575 + } + ], + "end": 7939, + "start": 7876, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 7942, + "start": 7941, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7875, + "name": "line", + "start": 7871, + "type": "Identifier" + }, + "end": 7943, + "start": 7871, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 7983, + "raw": "0.16279444820904887", + "start": 7964, + "type": "Literal", + "type": "Literal", + "value": 0.16279444820904887 + }, + "end": 7983, + "operator": "-", + "start": 7963, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 8010, + "raw": "0.8064475707664818", + "start": 7992, + "type": "Literal", + "type": "Literal", + "value": 0.8064475707664818 + } + ], + "end": 8017, + "start": 7954, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8020, + "start": 8019, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 7953, + "name": "line", + "start": 7949, + "type": "Identifier" + }, + "end": 8021, + "start": 7949, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 8061, + "raw": "0.08972872009232558", + "start": 8042, + "type": "Literal", + "type": "Literal", + "value": 0.08972872009232558 + }, + "end": 8061, + "operator": "-", + "start": 8041, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 8090, + "raw": "0.08887625823751266", + "start": 8071, + "type": "Literal", + "type": "Literal", + "value": 0.08887625823751266 + }, + "end": 8090, + "operator": "-", + "start": 8070, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 8097, + "start": 8032, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8100, + "start": 8099, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8031, + "name": "line", + "start": 8027, + "type": "Identifier" + }, + "end": 8101, + "start": 8027, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 8139, + "raw": "0.9203433427102556", + "start": 8121, + "type": "Literal", + "type": "Literal", + "value": 0.9203433427102556 + }, + { + "argument": { + "end": 8168, + "raw": "0.17343459369697545", + "start": 8149, + "type": "Literal", + "type": "Literal", + "value": 0.17343459369697545 + }, + "end": 8168, + "operator": "-", + "start": 8148, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 8175, + "start": 8112, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8178, + "start": 8177, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8111, + "name": "line", + "start": 8107, + "type": "Identifier" + }, + "end": 8179, + "start": 8107, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 8220, + "raw": "0.0017496234414517975", + "start": 8199, + "type": "Literal", + "type": "Literal", + "value": 0.0017496234414517975 + }, + { + "argument": { + "end": 8248, + "raw": "0.5178508316168335", + "start": 8230, + "type": "Literal", + "type": "Literal", + "value": 0.5178508316168335 + }, + "end": 8248, + "operator": "-", + "start": 8229, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 8255, + "start": 8190, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8258, + "start": 8257, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8189, + "name": "line", + "start": 8185, + "type": "Identifier" + }, + "end": 8259, + "start": 8185, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 8297, + "raw": "0.6206263405732759", + "start": 8279, + "type": "Literal", + "type": "Literal", + "value": 0.6206263405732759 + }, + { + "argument": { + "end": 8325, + "raw": "0.8733399468665124", + "start": 8307, + "type": "Literal", + "type": "Literal", + "value": 0.8733399468665124 + }, + "end": 8325, + "operator": "-", + "start": 8306, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 8332, + "start": 8270, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8335, + "start": 8334, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8269, + "name": "line", + "start": 8265, + "type": "Identifier" + }, + "end": 8336, + "start": 8265, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 8375, + "raw": "0.7776386664456383", + "start": 8357, + "type": "Literal", + "type": "Literal", + "value": 0.7776386664456383 + }, + "end": 8375, + "operator": "-", + "start": 8356, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 8402, + "raw": "0.7602780485384968", + "start": 8384, + "type": "Literal", + "type": "Literal", + "value": 0.7602780485384968 + } + ], + "end": 8409, + "start": 8347, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8412, + "start": 8411, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8346, + "name": "line", + "start": 8342, + "type": "Identifier" + }, + "end": 8413, + "start": 8342, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 8443, + "raw": "0.5439379760788592", + "start": 8425, + "type": "Literal", + "type": "Literal", + "value": 0.5439379760788592 + }, + { + "end": 8463, + "raw": "0.8449177589350552", + "start": 8445, + "type": "Literal", + "type": "Literal", + "value": 0.8449177589350552 + } + ], + "end": 8464, + "start": 8424, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8467, + "start": 8466, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8423, + "name": "line", + "start": 8419, + "type": "Identifier" + }, + "end": 8468, + "start": 8419, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 8508, + "raw": "0.13036646025917076", + "start": 8489, + "type": "Literal", + "type": "Literal", + "value": 0.13036646025917076 + }, + "end": 8508, + "operator": "-", + "start": 8488, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 8537, + "raw": "0.012051713627069693", + "start": 8517, + "type": "Literal", + "type": "Literal", + "value": 0.012051713627069693 + } + ], + "end": 8544, + "start": 8479, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8547, + "start": 8546, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8478, + "name": "line", + "start": 8474, + "type": "Identifier" + }, + "end": 8548, + "start": 8474, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 8587, + "raw": "0.1656465612645519", + "start": 8569, + "type": "Literal", + "type": "Literal", + "value": 0.1656465612645519 + }, + "end": 8587, + "operator": "-", + "start": 8568, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 8616, + "raw": "0.20775229173765486", + "start": 8597, + "type": "Literal", + "type": "Literal", + "value": 0.20775229173765486 + }, + "end": 8616, + "operator": "-", + "start": 8596, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 8623, + "start": 8559, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8626, + "start": 8625, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8558, + "name": "line", + "start": 8554, + "type": "Identifier" + }, + "end": 8627, + "start": 8554, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 8666, + "raw": "0.0962723255929061", + "start": 8648, + "type": "Literal", + "type": "Literal", + "value": 0.0962723255929061 + }, + "end": 8666, + "operator": "-", + "start": 8647, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 8695, + "raw": "0.05417797659066137", + "start": 8676, + "type": "Literal", + "type": "Literal", + "value": 0.05417797659066137 + }, + "end": 8695, + "operator": "-", + "start": 8675, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 8702, + "start": 8638, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8705, + "start": 8704, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8637, + "name": "line", + "start": 8633, + "type": "Identifier" + }, + "end": 8706, + "start": 8633, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 8735, + "raw": "0.902108945498191", + "start": 8718, + "type": "Literal", + "type": "Literal", + "value": 0.902108945498191 + }, + { + "end": 8755, + "raw": "0.3958978534964961", + "start": 8737, + "type": "Literal", + "type": "Literal", + "value": 0.3958978534964961 + } + ], + "end": 8756, + "start": 8717, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8759, + "start": 8758, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8716, + "name": "line", + "start": 8712, + "type": "Identifier" + }, + "end": 8760, + "start": 8712, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 8799, + "raw": "0.27997950083139167", + "start": 8780, + "type": "Literal", + "type": "Literal", + "value": 0.27997950083139167 + }, + { + "argument": { + "end": 8828, + "raw": "0.17778188444008958", + "start": 8809, + "type": "Literal", + "type": "Literal", + "value": 0.17778188444008958 + }, + "end": 8828, + "operator": "-", + "start": 8808, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 8835, + "start": 8771, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8838, + "start": 8837, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8770, + "name": "line", + "start": 8766, + "type": "Identifier" + }, + "end": 8839, + "start": 8766, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 8869, + "raw": "0.5235806061589545", + "start": 8851, + "type": "Literal", + "type": "Literal", + "value": 0.5235806061589545 + }, + { + "end": 8888, + "raw": "0.694318985642328", + "start": 8871, + "type": "Literal", + "type": "Literal", + "value": 0.694318985642328 + } + ], + "end": 8889, + "start": 8850, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8892, + "start": 8891, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8849, + "name": "line", + "start": 8845, + "type": "Identifier" + }, + "end": 8893, + "start": 8845, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 8932, + "raw": "0.39140760219992154", + "start": 8913, + "type": "Literal", + "type": "Literal", + "value": 0.39140760219992154 + }, + { + "argument": { + "end": 8960, + "raw": "0.7839795272576484", + "start": 8942, + "type": "Literal", + "type": "Literal", + "value": 0.7839795272576484 + }, + "end": 8960, + "operator": "-", + "start": 8941, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 8967, + "start": 8904, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 8970, + "start": 8969, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8903, + "name": "line", + "start": 8899, + "type": "Identifier" + }, + "end": 8971, + "start": 8899, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 9001, + "raw": "0.8414243527073519", + "start": 8983, + "type": "Literal", + "type": "Literal", + "value": 0.8414243527073519 + }, + { + "end": 9021, + "raw": "0.5395591528940082", + "start": 9003, + "type": "Literal", + "type": "Literal", + "value": 0.5395591528940082 + } + ], + "end": 9022, + "start": 8982, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9025, + "start": 9024, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 8981, + "name": "line", + "start": 8977, + "type": "Identifier" + }, + "end": 9026, + "start": 8977, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 9064, + "raw": "0.6137667704875602", + "start": 9046, + "type": "Literal", + "type": "Literal", + "value": 0.6137667704875602 + }, + { + "end": 9092, + "raw": "0.22119647516722085", + "start": 9073, + "type": "Literal", + "type": "Literal", + "value": 0.22119647516722085 + } + ], + "end": 9099, + "start": 9037, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9102, + "start": 9101, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9036, + "name": "line", + "start": 9032, + "type": "Identifier" + }, + "end": 9103, + "start": 9032, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 9133, + "raw": "0.8830488380766681", + "start": 9115, + "type": "Literal", + "type": "Literal", + "value": 0.8830488380766681 + }, + { + "end": 9153, + "raw": "0.6996724408425232", + "start": 9135, + "type": "Literal", + "type": "Literal", + "value": 0.6996724408425232 + } + ], + "end": 9154, + "start": 9114, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9157, + "start": 9156, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9113, + "name": "line", + "start": 9109, + "type": "Identifier" + }, + "end": 9158, + "start": 9109, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 9198, + "raw": "0.41290485754343953", + "start": 9179, + "type": "Literal", + "type": "Literal", + "value": 0.41290485754343953 + }, + "end": 9198, + "operator": "-", + "start": 9178, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 9226, + "raw": "0.4152647361760933", + "start": 9208, + "type": "Literal", + "type": "Literal", + "value": 0.4152647361760933 + }, + "end": 9226, + "operator": "-", + "start": 9207, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 9233, + "start": 9169, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9236, + "start": 9235, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9168, + "name": "line", + "start": 9164, + "type": "Identifier" + }, + "end": 9237, + "start": 9164, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 9275, + "raw": "0.5169538755575687", + "start": 9257, + "type": "Literal", + "type": "Literal", + "value": 0.5169538755575687 + }, + { + "argument": { + "end": 9303, + "raw": "0.9085567867302617", + "start": 9285, + "type": "Literal", + "type": "Literal", + "value": 0.9085567867302617 + }, + "end": 9303, + "operator": "-", + "start": 9284, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 9310, + "start": 9248, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9313, + "start": 9312, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9247, + "name": "line", + "start": 9243, + "type": "Identifier" + }, + "end": 9314, + "start": 9243, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 9353, + "raw": "0.6716353749059765", + "start": 9335, + "type": "Literal", + "type": "Literal", + "value": 0.6716353749059765 + }, + "end": 9353, + "operator": "-", + "start": 9334, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 9381, + "raw": "0.9605576808879026", + "start": 9363, + "type": "Literal", + "type": "Literal", + "value": 0.9605576808879026 + }, + "end": 9381, + "operator": "-", + "start": 9362, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 9388, + "start": 9325, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9391, + "start": 9390, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9324, + "name": "line", + "start": 9320, + "type": "Identifier" + }, + "end": 9392, + "start": 9320, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 9432, + "raw": "0.010280170930300203", + "start": 9412, + "type": "Literal", + "type": "Literal", + "value": 0.010280170930300203 + }, + { + "argument": { + "end": 9461, + "raw": "0.37344123662342166", + "start": 9442, + "type": "Literal", + "type": "Literal", + "value": 0.37344123662342166 + }, + "end": 9461, + "operator": "-", + "start": 9441, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 9468, + "start": 9403, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9471, + "start": 9470, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9402, + "name": "line", + "start": 9398, + "type": "Identifier" + }, + "end": 9472, + "start": 9398, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 9511, + "raw": "0.10357375682791004", + "start": 9492, + "type": "Literal", + "type": "Literal", + "value": 0.10357375682791004 + }, + { + "argument": { + "end": 9540, + "raw": "0.42294321030821425", + "start": 9521, + "type": "Literal", + "type": "Literal", + "value": 0.42294321030821425 + }, + "end": 9540, + "operator": "-", + "start": 9520, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 9547, + "start": 9483, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9550, + "start": 9549, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9482, + "name": "line", + "start": 9478, + "type": "Identifier" + }, + "end": 9551, + "start": 9478, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 9589, + "raw": "0.4520311575096987", + "start": 9571, + "type": "Literal", + "type": "Literal", + "value": 0.4520311575096987 + }, + { + "argument": { + "end": 9618, + "raw": "0.11232675307600548", + "start": 9599, + "type": "Literal", + "type": "Literal", + "value": 0.11232675307600548 + }, + "end": 9618, + "operator": "-", + "start": 9598, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 9625, + "start": 9562, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9628, + "start": 9627, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9561, + "name": "line", + "start": 9557, + "type": "Identifier" + }, + "end": 9629, + "start": 9557, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 9668, + "raw": "0.8821185914380845", + "start": 9650, + "type": "Literal", + "type": "Literal", + "value": 0.8821185914380845 + }, + "end": 9668, + "operator": "-", + "start": 9649, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 9696, + "raw": "0.7155147434939819", + "start": 9678, + "type": "Literal", + "type": "Literal", + "value": 0.7155147434939819 + }, + "end": 9696, + "operator": "-", + "start": 9677, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 9703, + "start": 9640, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9706, + "start": 9705, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9639, + "name": "line", + "start": 9635, + "type": "Identifier" + }, + "end": 9707, + "start": 9635, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 9737, + "raw": "0.9195487101690416", + "start": 9719, + "type": "Literal", + "type": "Literal", + "value": 0.9195487101690416 + }, + { + "end": 9757, + "raw": "0.2691627465297364", + "start": 9739, + "type": "Literal", + "type": "Literal", + "value": 0.2691627465297364 + } + ], + "end": 9758, + "start": 9718, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9761, + "start": 9760, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9717, + "name": "line", + "start": 9713, + "type": "Identifier" + }, + "end": 9762, + "start": 9713, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 9800, + "raw": "0.7098978191546745", + "start": 9782, + "type": "Literal", + "type": "Literal", + "value": 0.7098978191546745 + }, + { + "end": 9828, + "raw": "0.11710004169385968", + "start": 9809, + "type": "Literal", + "type": "Literal", + "value": 0.11710004169385968 + } + ], + "end": 9835, + "start": 9773, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9838, + "start": 9837, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9772, + "name": "line", + "start": 9768, + "type": "Identifier" + }, + "end": 9839, + "start": 9768, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 9879, + "raw": "0.37876368560819995", + "start": 9860, + "type": "Literal", + "type": "Literal", + "value": 0.37876368560819995 + }, + "end": 9879, + "operator": "-", + "start": 9859, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 9906, + "raw": "0.7106729314759084", + "start": 9888, + "type": "Literal", + "type": "Literal", + "value": 0.7106729314759084 + } + ], + "end": 9913, + "start": 9850, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9916, + "start": 9915, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9849, + "name": "line", + "start": 9845, + "type": "Identifier" + }, + "end": 9917, + "start": 9845, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 9957, + "raw": "0.29728126898353335", + "start": 9938, + "type": "Literal", + "type": "Literal", + "value": 0.29728126898353335 + }, + "end": 9957, + "operator": "-", + "start": 9937, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 9986, + "raw": "0.06649734568328003", + "start": 9967, + "type": "Literal", + "type": "Literal", + "value": 0.06649734568328003 + }, + "end": 9986, + "operator": "-", + "start": 9966, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 9993, + "start": 9928, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 9996, + "start": 9995, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 9927, + "name": "line", + "start": 9923, + "type": "Identifier" + }, + "end": 9997, + "start": 9923, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 10036, + "raw": "0.22965781558352072", + "start": 10017, + "type": "Literal", + "type": "Literal", + "value": 0.22965781558352072 + }, + { + "argument": { + "end": 10064, + "raw": "0.7601866432836641", + "start": 10046, + "type": "Literal", + "type": "Literal", + "value": 0.7601866432836641 + }, + "end": 10064, + "operator": "-", + "start": 10045, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 10071, + "start": 10008, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10074, + "start": 10073, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10007, + "name": "line", + "start": 10003, + "type": "Identifier" + }, + "end": 10075, + "start": 10003, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 10114, + "raw": "0.6356501074317229", + "start": 10096, + "type": "Literal", + "type": "Literal", + "value": 0.6356501074317229 + }, + "end": 10114, + "operator": "-", + "start": 10095, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 10142, + "raw": "0.19458425399338064", + "start": 10123, + "type": "Literal", + "type": "Literal", + "value": 0.19458425399338064 + } + ], + "end": 10149, + "start": 10086, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10152, + "start": 10151, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10085, + "name": "line", + "start": 10081, + "type": "Identifier" + }, + "end": 10153, + "start": 10081, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 10183, + "raw": "0.5721251777404546", + "start": 10165, + "type": "Literal", + "type": "Literal", + "value": 0.5721251777404546 + }, + { + "end": 10203, + "raw": "0.2888584097921527", + "start": 10185, + "type": "Literal", + "type": "Literal", + "value": 0.2888584097921527 + } + ], + "end": 10204, + "start": 10164, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10207, + "start": 10206, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10163, + "name": "line", + "start": 10159, + "type": "Identifier" + }, + "end": 10208, + "start": 10159, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 10247, + "raw": "0.9580409549552311", + "start": 10229, + "type": "Literal", + "type": "Literal", + "value": 0.9580409549552311 + }, + "end": 10247, + "operator": "-", + "start": 10228, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 10276, + "raw": "0.02243818192078395", + "start": 10257, + "type": "Literal", + "type": "Literal", + "value": 0.02243818192078395 + }, + "end": 10276, + "operator": "-", + "start": 10256, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 10283, + "start": 10219, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10286, + "start": 10285, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10218, + "name": "line", + "start": 10214, + "type": "Identifier" + }, + "end": 10287, + "start": 10214, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 10325, + "raw": "0.3299184618602866", + "start": 10307, + "type": "Literal", + "type": "Literal", + "value": 0.3299184618602866 + }, + { + "argument": { + "end": 10353, + "raw": "0.8353726942369875", + "start": 10335, + "type": "Literal", + "type": "Literal", + "value": 0.8353726942369875 + }, + "end": 10353, + "operator": "-", + "start": 10334, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 10360, + "start": 10298, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10363, + "start": 10362, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10297, + "name": "line", + "start": 10293, + "type": "Identifier" + }, + "end": 10364, + "start": 10293, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 10402, + "raw": "0.7434639386755209", + "start": 10384, + "type": "Literal", + "type": "Literal", + "value": 0.7434639386755209 + }, + { + "argument": { + "end": 10430, + "raw": "0.7919648864138378", + "start": 10412, + "type": "Literal", + "type": "Literal", + "value": 0.7919648864138378 + }, + "end": 10430, + "operator": "-", + "start": 10411, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 10437, + "start": 10375, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10440, + "start": 10439, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10374, + "name": "line", + "start": 10370, + "type": "Identifier" + }, + "end": 10441, + "start": 10370, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 10471, + "raw": "0.9935751011164615", + "start": 10453, + "type": "Literal", + "type": "Literal", + "value": 0.9935751011164615 + }, + { + "end": 10491, + "raw": "0.9042566468497608", + "start": 10473, + "type": "Literal", + "type": "Literal", + "value": 0.9042566468497608 + } + ], + "end": 10492, + "start": 10452, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10495, + "start": 10494, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10451, + "name": "line", + "start": 10447, + "type": "Identifier" + }, + "end": 10496, + "start": 10447, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 10535, + "raw": "0.5035812884687294", + "start": 10517, + "type": "Literal", + "type": "Literal", + "value": 0.5035812884687294 + }, + "end": 10535, + "operator": "-", + "start": 10516, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 10562, + "raw": "0.5150967434989442", + "start": 10544, + "type": "Literal", + "type": "Literal", + "value": 0.5150967434989442 + } + ], + "end": 10569, + "start": 10507, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10572, + "start": 10571, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10506, + "name": "line", + "start": 10502, + "type": "Identifier" + }, + "end": 10573, + "start": 10502, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 10603, + "raw": "0.5526227215900215", + "start": 10585, + "type": "Literal", + "type": "Literal", + "value": 0.5526227215900215 + }, + { + "end": 10623, + "raw": "0.7612604137272441", + "start": 10605, + "type": "Literal", + "type": "Literal", + "value": 0.7612604137272441 + } + ], + "end": 10624, + "start": 10584, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10627, + "start": 10626, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10583, + "name": "line", + "start": 10579, + "type": "Identifier" + }, + "end": 10628, + "start": 10579, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 10666, + "raw": "0.8593271349126876", + "start": 10648, + "type": "Literal", + "type": "Literal", + "value": 0.8593271349126876 + }, + { + "end": 10694, + "raw": "0.08414894953725849", + "start": 10675, + "type": "Literal", + "type": "Literal", + "value": 0.08414894953725849 + } + ], + "end": 10701, + "start": 10639, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10704, + "start": 10703, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10638, + "name": "line", + "start": 10634, + "type": "Identifier" + }, + "end": 10705, + "start": 10634, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 10744, + "raw": "0.8181049219192864", + "start": 10726, + "type": "Literal", + "type": "Literal", + "value": 0.8181049219192864 + }, + "end": 10744, + "operator": "-", + "start": 10725, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 10771, + "raw": "0.903548131323352", + "start": 10754, + "type": "Literal", + "type": "Literal", + "value": 0.903548131323352 + }, + "end": 10771, + "operator": "-", + "start": 10753, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 10778, + "start": 10716, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10781, + "start": 10780, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10715, + "name": "line", + "start": 10711, + "type": "Identifier" + }, + "end": 10782, + "start": 10711, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 10820, + "raw": "0.3165782044458305", + "start": 10802, + "type": "Literal", + "type": "Literal", + "value": 0.3165782044458305 + }, + { + "argument": { + "end": 10849, + "raw": "0.24189274252014914", + "start": 10830, + "type": "Literal", + "type": "Literal", + "value": 0.24189274252014914 + }, + "end": 10849, + "operator": "-", + "start": 10829, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 10856, + "start": 10793, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10859, + "start": 10858, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10792, + "name": "line", + "start": 10788, + "type": "Identifier" + }, + "end": 10860, + "start": 10788, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 10900, + "raw": "0.44390956414045135", + "start": 10881, + "type": "Literal", + "type": "Literal", + "value": 0.44390956414045135 + }, + "end": 10900, + "operator": "-", + "start": 10880, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 10929, + "raw": "0.25912591535126905", + "start": 10910, + "type": "Literal", + "type": "Literal", + "value": 0.25912591535126905 + }, + "end": 10929, + "operator": "-", + "start": 10909, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 10936, + "start": 10871, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 10939, + "start": 10938, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10870, + "name": "line", + "start": 10866, + "type": "Identifier" + }, + "end": 10940, + "start": 10866, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 10979, + "raw": "0.6605165911891009", + "start": 10961, + "type": "Literal", + "type": "Literal", + "value": 0.6605165911891009 + }, + "end": 10979, + "operator": "-", + "start": 10960, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 11008, + "raw": "0.40355115288839194", + "start": 10989, + "type": "Literal", + "type": "Literal", + "value": 0.40355115288839194 + }, + "end": 11008, + "operator": "-", + "start": 10988, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 11015, + "start": 10951, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11018, + "start": 11017, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 10950, + "name": "line", + "start": 10946, + "type": "Identifier" + }, + "end": 11019, + "start": 10946, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 11058, + "raw": "0.7170489950180006", + "start": 11040, + "type": "Literal", + "type": "Literal", + "value": 0.7170489950180006 + }, + "end": 11058, + "operator": "-", + "start": 11039, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 11086, + "raw": "0.23454356079651384", + "start": 11067, + "type": "Literal", + "type": "Literal", + "value": 0.23454356079651384 + } + ], + "end": 11093, + "start": 11030, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11096, + "start": 11095, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11029, + "name": "line", + "start": 11025, + "type": "Identifier" + }, + "end": 11097, + "start": 11025, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 11136, + "raw": "0.2568187045379722", + "start": 11118, + "type": "Literal", + "type": "Literal", + "value": 0.2568187045379722 + }, + "end": 11136, + "operator": "-", + "start": 11117, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 11165, + "raw": "0.45031188717601367", + "start": 11146, + "type": "Literal", + "type": "Literal", + "value": 0.45031188717601367 + }, + "end": 11165, + "operator": "-", + "start": 11145, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 11172, + "start": 11108, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11175, + "start": 11174, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11107, + "name": "line", + "start": 11103, + "type": "Identifier" + }, + "end": 11176, + "start": 11103, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 11214, + "raw": "0.6751951211858687", + "start": 11196, + "type": "Literal", + "type": "Literal", + "value": 0.6751951211858687 + }, + { + "argument": { + "end": 11242, + "raw": "0.9709424233465593", + "start": 11224, + "type": "Literal", + "type": "Literal", + "value": 0.9709424233465593 + }, + "end": 11242, + "operator": "-", + "start": 11223, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 11249, + "start": 11187, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11252, + "start": 11251, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11186, + "name": "line", + "start": 11182, + "type": "Identifier" + }, + "end": 11253, + "start": 11182, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 11292, + "raw": "0.5689619842972184", + "start": 11274, + "type": "Literal", + "type": "Literal", + "value": 0.5689619842972184 + }, + "end": 11292, + "operator": "-", + "start": 11273, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 11319, + "raw": "0.5918969913790362", + "start": 11301, + "type": "Literal", + "type": "Literal", + "value": 0.5918969913790362 + } + ], + "end": 11326, + "start": 11264, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11329, + "start": 11328, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11263, + "name": "line", + "start": 11259, + "type": "Identifier" + }, + "end": 11330, + "start": 11259, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 11369, + "raw": "0.8328324229085962", + "start": 11351, + "type": "Literal", + "type": "Literal", + "value": 0.8328324229085962 + }, + "end": 11369, + "operator": "-", + "start": 11350, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 11396, + "raw": "0.4677492878818803", + "start": 11378, + "type": "Literal", + "type": "Literal", + "value": 0.4677492878818803 + } + ], + "end": 11403, + "start": 11341, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11406, + "start": 11405, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11340, + "name": "line", + "start": 11336, + "type": "Identifier" + }, + "end": 11407, + "start": 11336, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 11446, + "raw": "0.8111463382182231", + "start": 11428, + "type": "Literal", + "type": "Literal", + "value": 0.8111463382182231 + }, + "end": 11446, + "operator": "-", + "start": 11427, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 11475, + "raw": "0.41814807547140576", + "start": 11456, + "type": "Literal", + "type": "Literal", + "value": 0.41814807547140576 + }, + "end": 11475, + "operator": "-", + "start": 11455, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 11482, + "start": 11418, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11485, + "start": 11484, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11417, + "name": "line", + "start": 11413, + "type": "Identifier" + }, + "end": 11486, + "start": 11413, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 11525, + "raw": "0.03807684940941125", + "start": 11506, + "type": "Literal", + "type": "Literal", + "value": 0.03807684940941125 + }, + { + "end": 11553, + "raw": "0.25664826686353326", + "start": 11534, + "type": "Literal", + "type": "Literal", + "value": 0.25664826686353326 + } + ], + "end": 11560, + "start": 11497, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11563, + "start": 11562, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11496, + "name": "line", + "start": 11492, + "type": "Identifier" + }, + "end": 11564, + "start": 11492, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 11603, + "raw": "0.23950083339596384", + "start": 11584, + "type": "Literal", + "type": "Literal", + "value": 0.23950083339596384 + }, + { + "end": 11631, + "raw": "0.43693196301855575", + "start": 11612, + "type": "Literal", + "type": "Literal", + "value": 0.43693196301855575 + } + ], + "end": 11638, + "start": 11575, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11641, + "start": 11640, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11574, + "name": "line", + "start": 11570, + "type": "Identifier" + }, + "end": 11642, + "start": 11570, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 11682, + "raw": "0.16279444820904887", + "start": 11663, + "type": "Literal", + "type": "Literal", + "value": 0.16279444820904887 + }, + "end": 11682, + "operator": "-", + "start": 11662, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 11709, + "raw": "0.8064475707664818", + "start": 11691, + "type": "Literal", + "type": "Literal", + "value": 0.8064475707664818 + } + ], + "end": 11716, + "start": 11653, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11719, + "start": 11718, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11652, + "name": "line", + "start": 11648, + "type": "Identifier" + }, + "end": 11720, + "start": 11648, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 11760, + "raw": "0.08972872009232558", + "start": 11741, + "type": "Literal", + "type": "Literal", + "value": 0.08972872009232558 + }, + "end": 11760, + "operator": "-", + "start": 11740, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 11789, + "raw": "0.08887625823751266", + "start": 11770, + "type": "Literal", + "type": "Literal", + "value": 0.08887625823751266 + }, + "end": 11789, + "operator": "-", + "start": 11769, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 11796, + "start": 11731, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11799, + "start": 11798, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11730, + "name": "line", + "start": 11726, + "type": "Identifier" + }, + "end": 11800, + "start": 11726, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 11838, + "raw": "0.9203433427102556", + "start": 11820, + "type": "Literal", + "type": "Literal", + "value": 0.9203433427102556 + }, + { + "argument": { + "end": 11867, + "raw": "0.17343459369697545", + "start": 11848, + "type": "Literal", + "type": "Literal", + "value": 0.17343459369697545 + }, + "end": 11867, + "operator": "-", + "start": 11847, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 11874, + "start": 11811, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11877, + "start": 11876, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11810, + "name": "line", + "start": 11806, + "type": "Identifier" + }, + "end": 11878, + "start": 11806, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 11919, + "raw": "0.0017496234414517975", + "start": 11898, + "type": "Literal", + "type": "Literal", + "value": 0.0017496234414517975 + }, + { + "argument": { + "end": 11947, + "raw": "0.5178508316168335", + "start": 11929, + "type": "Literal", + "type": "Literal", + "value": 0.5178508316168335 + }, + "end": 11947, + "operator": "-", + "start": 11928, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 11954, + "start": 11889, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 11957, + "start": 11956, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11888, + "name": "line", + "start": 11884, + "type": "Identifier" + }, + "end": 11958, + "start": 11884, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 11996, + "raw": "0.6206263405732759", + "start": 11978, + "type": "Literal", + "type": "Literal", + "value": 0.6206263405732759 + }, + { + "argument": { + "end": 12024, + "raw": "0.8733399468665124", + "start": 12006, + "type": "Literal", + "type": "Literal", + "value": 0.8733399468665124 + }, + "end": 12024, + "operator": "-", + "start": 12005, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 12031, + "start": 11969, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12034, + "start": 12033, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 11968, + "name": "line", + "start": 11964, + "type": "Identifier" + }, + "end": 12035, + "start": 11964, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 12074, + "raw": "0.7776386664456383", + "start": 12056, + "type": "Literal", + "type": "Literal", + "value": 0.7776386664456383 + }, + "end": 12074, + "operator": "-", + "start": 12055, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 12101, + "raw": "0.7602780485384968", + "start": 12083, + "type": "Literal", + "type": "Literal", + "value": 0.7602780485384968 + } + ], + "end": 12108, + "start": 12046, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12111, + "start": 12110, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12045, + "name": "line", + "start": 12041, + "type": "Identifier" + }, + "end": 12112, + "start": 12041, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 12142, + "raw": "0.5439379760788592", + "start": 12124, + "type": "Literal", + "type": "Literal", + "value": 0.5439379760788592 + }, + { + "end": 12162, + "raw": "0.8449177589350552", + "start": 12144, + "type": "Literal", + "type": "Literal", + "value": 0.8449177589350552 + } + ], + "end": 12163, + "start": 12123, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12166, + "start": 12165, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12122, + "name": "line", + "start": 12118, + "type": "Identifier" + }, + "end": 12167, + "start": 12118, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 12207, + "raw": "0.13036646025917076", + "start": 12188, + "type": "Literal", + "type": "Literal", + "value": 0.13036646025917076 + }, + "end": 12207, + "operator": "-", + "start": 12187, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 12236, + "raw": "0.012051713627069693", + "start": 12216, + "type": "Literal", + "type": "Literal", + "value": 0.012051713627069693 + } + ], + "end": 12243, + "start": 12178, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12246, + "start": 12245, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12177, + "name": "line", + "start": 12173, + "type": "Identifier" + }, + "end": 12247, + "start": 12173, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 12286, + "raw": "0.1656465612645519", + "start": 12268, + "type": "Literal", + "type": "Literal", + "value": 0.1656465612645519 + }, + "end": 12286, + "operator": "-", + "start": 12267, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 12315, + "raw": "0.20775229173765486", + "start": 12296, + "type": "Literal", + "type": "Literal", + "value": 0.20775229173765486 + }, + "end": 12315, + "operator": "-", + "start": 12295, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 12322, + "start": 12258, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12325, + "start": 12324, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12257, + "name": "line", + "start": 12253, + "type": "Identifier" + }, + "end": 12326, + "start": 12253, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 12365, + "raw": "0.0962723255929061", + "start": 12347, + "type": "Literal", + "type": "Literal", + "value": 0.0962723255929061 + }, + "end": 12365, + "operator": "-", + "start": 12346, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 12394, + "raw": "0.05417797659066137", + "start": 12375, + "type": "Literal", + "type": "Literal", + "value": 0.05417797659066137 + }, + "end": 12394, + "operator": "-", + "start": 12374, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 12401, + "start": 12337, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12404, + "start": 12403, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12336, + "name": "line", + "start": 12332, + "type": "Identifier" + }, + "end": 12405, + "start": 12332, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 12434, + "raw": "0.902108945498191", + "start": 12417, + "type": "Literal", + "type": "Literal", + "value": 0.902108945498191 + }, + { + "end": 12454, + "raw": "0.3958978534964961", + "start": 12436, + "type": "Literal", + "type": "Literal", + "value": 0.3958978534964961 + } + ], + "end": 12455, + "start": 12416, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12458, + "start": 12457, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12415, + "name": "line", + "start": 12411, + "type": "Identifier" + }, + "end": 12459, + "start": 12411, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 12498, + "raw": "0.27997950083139167", + "start": 12479, + "type": "Literal", + "type": "Literal", + "value": 0.27997950083139167 + }, + { + "argument": { + "end": 12527, + "raw": "0.17778188444008958", + "start": 12508, + "type": "Literal", + "type": "Literal", + "value": 0.17778188444008958 + }, + "end": 12527, + "operator": "-", + "start": 12507, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 12534, + "start": 12470, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12537, + "start": 12536, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12469, + "name": "line", + "start": 12465, + "type": "Identifier" + }, + "end": 12538, + "start": 12465, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 12568, + "raw": "0.5235806061589545", + "start": 12550, + "type": "Literal", + "type": "Literal", + "value": 0.5235806061589545 + }, + { + "end": 12587, + "raw": "0.694318985642328", + "start": 12570, + "type": "Literal", + "type": "Literal", + "value": 0.694318985642328 + } + ], + "end": 12588, + "start": 12549, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12591, + "start": 12590, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12548, + "name": "line", + "start": 12544, + "type": "Identifier" + }, + "end": 12592, + "start": 12544, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 12631, + "raw": "0.39140760219992154", + "start": 12612, + "type": "Literal", + "type": "Literal", + "value": 0.39140760219992154 + }, + { + "argument": { + "end": 12659, + "raw": "0.7839795272576484", + "start": 12641, + "type": "Literal", + "type": "Literal", + "value": 0.7839795272576484 + }, + "end": 12659, + "operator": "-", + "start": 12640, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 12666, + "start": 12603, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12669, + "start": 12668, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12602, + "name": "line", + "start": 12598, + "type": "Identifier" + }, + "end": 12670, + "start": 12598, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 12700, + "raw": "0.8414243527073519", + "start": 12682, + "type": "Literal", + "type": "Literal", + "value": 0.8414243527073519 + }, + { + "end": 12720, + "raw": "0.5395591528940082", + "start": 12702, + "type": "Literal", + "type": "Literal", + "value": 0.5395591528940082 + } + ], + "end": 12721, + "start": 12681, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12724, + "start": 12723, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12680, + "name": "line", + "start": 12676, + "type": "Identifier" + }, + "end": 12725, + "start": 12676, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 12763, + "raw": "0.6137667704875602", + "start": 12745, + "type": "Literal", + "type": "Literal", + "value": 0.6137667704875602 + }, + { + "end": 12791, + "raw": "0.22119647516722085", + "start": 12772, + "type": "Literal", + "type": "Literal", + "value": 0.22119647516722085 + } + ], + "end": 12798, + "start": 12736, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12801, + "start": 12800, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12735, + "name": "line", + "start": 12731, + "type": "Identifier" + }, + "end": 12802, + "start": 12731, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 12832, + "raw": "0.8830488380766681", + "start": 12814, + "type": "Literal", + "type": "Literal", + "value": 0.8830488380766681 + }, + { + "end": 12852, + "raw": "0.6996724408425232", + "start": 12834, + "type": "Literal", + "type": "Literal", + "value": 0.6996724408425232 + } + ], + "end": 12853, + "start": 12813, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12856, + "start": 12855, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12812, + "name": "line", + "start": 12808, + "type": "Identifier" + }, + "end": 12857, + "start": 12808, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 12896, + "raw": "0.3670208139314082", + "start": 12878, + "type": "Literal", + "type": "Literal", + "value": 0.3670208139314082 + }, + "end": 12896, + "operator": "-", + "start": 12877, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 12924, + "raw": "0.21201331909674526", + "start": 12905, + "type": "Literal", + "type": "Literal", + "value": 0.21201331909674526 + } + ], + "end": 12931, + "start": 12868, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 12934, + "start": 12933, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12867, + "name": "line", + "start": 12863, + "type": "Identifier" + }, + "end": 12935, + "start": 12863, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 12974, + "raw": "0.4707511307971115", + "start": 12956, + "type": "Literal", + "type": "Literal", + "value": 0.4707511307971115 + }, + "end": 12974, + "operator": "-", + "start": 12955, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 13001, + "raw": "0.4905279615419764", + "start": 12983, + "type": "Literal", + "type": "Literal", + "value": 0.4905279615419764 + } + ], + "end": 13008, + "start": 12946, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13011, + "start": 13010, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 12945, + "name": "line", + "start": 12941, + "type": "Identifier" + }, + "end": 13012, + "start": 12941, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 13051, + "raw": "0.8328324229085962", + "start": 13033, + "type": "Literal", + "type": "Literal", + "value": 0.8328324229085962 + }, + "end": 13051, + "operator": "-", + "start": 13032, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 13078, + "raw": "0.4677492878818803", + "start": 13060, + "type": "Literal", + "type": "Literal", + "value": 0.4677492878818803 + } + ], + "end": 13085, + "start": 13023, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13088, + "start": 13087, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13022, + "name": "line", + "start": 13018, + "type": "Identifier" + }, + "end": 13089, + "start": 13018, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 13128, + "raw": "0.8111463382182231", + "start": 13110, + "type": "Literal", + "type": "Literal", + "value": 0.8111463382182231 + }, + "end": 13128, + "operator": "-", + "start": 13109, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 13157, + "raw": "0.41814807547140576", + "start": 13138, + "type": "Literal", + "type": "Literal", + "value": 0.41814807547140576 + }, + "end": 13157, + "operator": "-", + "start": 13137, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 13164, + "start": 13100, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13167, + "start": 13166, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13099, + "name": "line", + "start": 13095, + "type": "Identifier" + }, + "end": 13168, + "start": 13095, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 13207, + "raw": "0.03807684940941125", + "start": 13188, + "type": "Literal", + "type": "Literal", + "value": 0.03807684940941125 + }, + { + "end": 13235, + "raw": "0.25664826686353326", + "start": 13216, + "type": "Literal", + "type": "Literal", + "value": 0.25664826686353326 + } + ], + "end": 13242, + "start": 13179, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13245, + "start": 13244, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13178, + "name": "line", + "start": 13174, + "type": "Identifier" + }, + "end": 13246, + "start": 13174, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 13285, + "raw": "0.23950083339596384", + "start": 13266, + "type": "Literal", + "type": "Literal", + "value": 0.23950083339596384 + }, + { + "end": 13313, + "raw": "0.43693196301855575", + "start": 13294, + "type": "Literal", + "type": "Literal", + "value": 0.43693196301855575 + } + ], + "end": 13320, + "start": 13257, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13323, + "start": 13322, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13256, + "name": "line", + "start": 13252, + "type": "Identifier" + }, + "end": 13324, + "start": 13252, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 13364, + "raw": "0.16279444820904887", + "start": 13345, + "type": "Literal", + "type": "Literal", + "value": 0.16279444820904887 + }, + "end": 13364, + "operator": "-", + "start": 13344, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 13391, + "raw": "0.8064475707664818", + "start": 13373, + "type": "Literal", + "type": "Literal", + "value": 0.8064475707664818 + } + ], + "end": 13398, + "start": 13335, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13401, + "start": 13400, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13334, + "name": "line", + "start": 13330, + "type": "Identifier" + }, + "end": 13402, + "start": 13330, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 13442, + "raw": "0.08972872009232558", + "start": 13423, + "type": "Literal", + "type": "Literal", + "value": 0.08972872009232558 + }, + "end": 13442, + "operator": "-", + "start": 13422, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 13471, + "raw": "0.08887625823751266", + "start": 13452, + "type": "Literal", + "type": "Literal", + "value": 0.08887625823751266 + }, + "end": 13471, + "operator": "-", + "start": 13451, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 13478, + "start": 13413, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13481, + "start": 13480, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13412, + "name": "line", + "start": 13408, + "type": "Identifier" + }, + "end": 13482, + "start": 13408, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 13520, + "raw": "0.9203433427102556", + "start": 13502, + "type": "Literal", + "type": "Literal", + "value": 0.9203433427102556 + }, + { + "argument": { + "end": 13549, + "raw": "0.17343459369697545", + "start": 13530, + "type": "Literal", + "type": "Literal", + "value": 0.17343459369697545 + }, + "end": 13549, + "operator": "-", + "start": 13529, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 13556, + "start": 13493, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13559, + "start": 13558, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13492, + "name": "line", + "start": 13488, + "type": "Identifier" + }, + "end": 13560, + "start": 13488, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 13601, + "raw": "0.0017496234414517975", + "start": 13580, + "type": "Literal", + "type": "Literal", + "value": 0.0017496234414517975 + }, + { + "argument": { + "end": 13629, + "raw": "0.5178508316168335", + "start": 13611, + "type": "Literal", + "type": "Literal", + "value": 0.5178508316168335 + }, + "end": 13629, + "operator": "-", + "start": 13610, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 13636, + "start": 13571, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13639, + "start": 13638, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13570, + "name": "line", + "start": 13566, + "type": "Identifier" + }, + "end": 13640, + "start": 13566, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 13678, + "raw": "0.6206263405732759", + "start": 13660, + "type": "Literal", + "type": "Literal", + "value": 0.6206263405732759 + }, + { + "argument": { + "end": 13706, + "raw": "0.8733399468665124", + "start": 13688, + "type": "Literal", + "type": "Literal", + "value": 0.8733399468665124 + }, + "end": 13706, + "operator": "-", + "start": 13687, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 13713, + "start": 13651, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13716, + "start": 13715, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13650, + "name": "line", + "start": 13646, + "type": "Identifier" + }, + "end": 13717, + "start": 13646, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 13756, + "raw": "0.7776386664456383", + "start": 13738, + "type": "Literal", + "type": "Literal", + "value": 0.7776386664456383 + }, + "end": 13756, + "operator": "-", + "start": 13737, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 13783, + "raw": "0.7602780485384968", + "start": 13765, + "type": "Literal", + "type": "Literal", + "value": 0.7602780485384968 + } + ], + "end": 13790, + "start": 13728, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13793, + "start": 13792, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13727, + "name": "line", + "start": 13723, + "type": "Identifier" + }, + "end": 13794, + "start": 13723, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 13824, + "raw": "0.5439379760788592", + "start": 13806, + "type": "Literal", + "type": "Literal", + "value": 0.5439379760788592 + }, + { + "end": 13844, + "raw": "0.8449177589350552", + "start": 13826, + "type": "Literal", + "type": "Literal", + "value": 0.8449177589350552 + } + ], + "end": 13845, + "start": 13805, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13848, + "start": 13847, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13804, + "name": "line", + "start": 13800, + "type": "Identifier" + }, + "end": 13849, + "start": 13800, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 13889, + "raw": "0.13036646025917076", + "start": 13870, + "type": "Literal", + "type": "Literal", + "value": 0.13036646025917076 + }, + "end": 13889, + "operator": "-", + "start": 13869, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 13918, + "raw": "0.012051713627069693", + "start": 13898, + "type": "Literal", + "type": "Literal", + "value": 0.012051713627069693 + } + ], + "end": 13925, + "start": 13860, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 13928, + "start": 13927, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13859, + "name": "line", + "start": 13855, + "type": "Identifier" + }, + "end": 13929, + "start": 13855, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 13968, + "raw": "0.1656465612645519", + "start": 13950, + "type": "Literal", + "type": "Literal", + "value": 0.1656465612645519 + }, + "end": 13968, + "operator": "-", + "start": 13949, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 13997, + "raw": "0.20775229173765486", + "start": 13978, + "type": "Literal", + "type": "Literal", + "value": 0.20775229173765486 + }, + "end": 13997, + "operator": "-", + "start": 13977, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 14004, + "start": 13940, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14007, + "start": 14006, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 13939, + "name": "line", + "start": 13935, + "type": "Identifier" + }, + "end": 14008, + "start": 13935, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 14047, + "raw": "0.0962723255929061", + "start": 14029, + "type": "Literal", + "type": "Literal", + "value": 0.0962723255929061 + }, + "end": 14047, + "operator": "-", + "start": 14028, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 14076, + "raw": "0.05417797659066137", + "start": 14057, + "type": "Literal", + "type": "Literal", + "value": 0.05417797659066137 + }, + "end": 14076, + "operator": "-", + "start": 14056, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 14083, + "start": 14019, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14086, + "start": 14085, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14018, + "name": "line", + "start": 14014, + "type": "Identifier" + }, + "end": 14087, + "start": 14014, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14116, + "raw": "0.902108945498191", + "start": 14099, + "type": "Literal", + "type": "Literal", + "value": 0.902108945498191 + }, + { + "end": 14136, + "raw": "0.3958978534964961", + "start": 14118, + "type": "Literal", + "type": "Literal", + "value": 0.3958978534964961 + } + ], + "end": 14137, + "start": 14098, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14140, + "start": 14139, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14097, + "name": "line", + "start": 14093, + "type": "Identifier" + }, + "end": 14141, + "start": 14093, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14180, + "raw": "0.27997950083139167", + "start": 14161, + "type": "Literal", + "type": "Literal", + "value": 0.27997950083139167 + }, + { + "argument": { + "end": 14209, + "raw": "0.17778188444008958", + "start": 14190, + "type": "Literal", + "type": "Literal", + "value": 0.17778188444008958 + }, + "end": 14209, + "operator": "-", + "start": 14189, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 14216, + "start": 14152, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14219, + "start": 14218, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14151, + "name": "line", + "start": 14147, + "type": "Identifier" + }, + "end": 14220, + "start": 14147, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14250, + "raw": "0.5235806061589545", + "start": 14232, + "type": "Literal", + "type": "Literal", + "value": 0.5235806061589545 + }, + { + "end": 14269, + "raw": "0.694318985642328", + "start": 14252, + "type": "Literal", + "type": "Literal", + "value": 0.694318985642328 + } + ], + "end": 14270, + "start": 14231, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14273, + "start": 14272, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14230, + "name": "line", + "start": 14226, + "type": "Identifier" + }, + "end": 14274, + "start": 14226, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14313, + "raw": "0.39140760219992154", + "start": 14294, + "type": "Literal", + "type": "Literal", + "value": 0.39140760219992154 + }, + { + "argument": { + "end": 14341, + "raw": "0.7839795272576484", + "start": 14323, + "type": "Literal", + "type": "Literal", + "value": 0.7839795272576484 + }, + "end": 14341, + "operator": "-", + "start": 14322, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 14348, + "start": 14285, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14351, + "start": 14350, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14284, + "name": "line", + "start": 14280, + "type": "Identifier" + }, + "end": 14352, + "start": 14280, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14382, + "raw": "0.8414243527073519", + "start": 14364, + "type": "Literal", + "type": "Literal", + "value": 0.8414243527073519 + }, + { + "end": 14402, + "raw": "0.5395591528940082", + "start": 14384, + "type": "Literal", + "type": "Literal", + "value": 0.5395591528940082 + } + ], + "end": 14403, + "start": 14363, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14406, + "start": 14405, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14362, + "name": "line", + "start": 14358, + "type": "Identifier" + }, + "end": 14407, + "start": 14358, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14445, + "raw": "0.6137667704875602", + "start": 14427, + "type": "Literal", + "type": "Literal", + "value": 0.6137667704875602 + }, + { + "end": 14473, + "raw": "0.22119647516722085", + "start": 14454, + "type": "Literal", + "type": "Literal", + "value": 0.22119647516722085 + } + ], + "end": 14480, + "start": 14418, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14483, + "start": 14482, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14417, + "name": "line", + "start": 14413, + "type": "Identifier" + }, + "end": 14484, + "start": 14413, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14514, + "raw": "0.8830488380766681", + "start": 14496, + "type": "Literal", + "type": "Literal", + "value": 0.8830488380766681 + }, + { + "end": 14534, + "raw": "0.6996724408425232", + "start": 14516, + "type": "Literal", + "type": "Literal", + "value": 0.6996724408425232 + } + ], + "end": 14535, + "start": 14495, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14538, + "start": 14537, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14494, + "name": "line", + "start": 14490, + "type": "Identifier" + }, + "end": 14539, + "start": 14490, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 14579, + "raw": "0.41290485754343953", + "start": 14560, + "type": "Literal", + "type": "Literal", + "value": 0.41290485754343953 + }, + "end": 14579, + "operator": "-", + "start": 14559, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 14607, + "raw": "0.4152647361760933", + "start": 14589, + "type": "Literal", + "type": "Literal", + "value": 0.4152647361760933 + }, + "end": 14607, + "operator": "-", + "start": 14588, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 14614, + "start": 14550, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14617, + "start": 14616, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14549, + "name": "line", + "start": 14545, + "type": "Identifier" + }, + "end": 14618, + "start": 14545, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14656, + "raw": "0.5169538755575687", + "start": 14638, + "type": "Literal", + "type": "Literal", + "value": 0.5169538755575687 + }, + { + "argument": { + "end": 14684, + "raw": "0.9085567867302617", + "start": 14666, + "type": "Literal", + "type": "Literal", + "value": 0.9085567867302617 + }, + "end": 14684, + "operator": "-", + "start": 14665, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 14691, + "start": 14629, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14694, + "start": 14693, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14628, + "name": "line", + "start": 14624, + "type": "Identifier" + }, + "end": 14695, + "start": 14624, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 14734, + "raw": "0.6716353749059765", + "start": 14716, + "type": "Literal", + "type": "Literal", + "value": 0.6716353749059765 + }, + "end": 14734, + "operator": "-", + "start": 14715, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 14762, + "raw": "0.9605576808879026", + "start": 14744, + "type": "Literal", + "type": "Literal", + "value": 0.9605576808879026 + }, + "end": 14762, + "operator": "-", + "start": 14743, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 14769, + "start": 14706, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14772, + "start": 14771, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14705, + "name": "line", + "start": 14701, + "type": "Identifier" + }, + "end": 14773, + "start": 14701, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 14813, + "raw": "0.010280170930300203", + "start": 14793, + "type": "Literal", + "type": "Literal", + "value": 0.010280170930300203 + }, + { + "argument": { + "end": 14842, + "raw": "0.37344123662342166", + "start": 14823, + "type": "Literal", + "type": "Literal", + "value": 0.37344123662342166 + }, + "end": 14842, + "operator": "-", + "start": 14822, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 14849, + "start": 14784, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14852, + "start": 14851, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14783, + "name": "line", + "start": 14779, + "type": "Identifier" + }, + "end": 14853, + "start": 14779, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 14892, + "raw": "0.3670208139314082", + "start": 14874, + "type": "Literal", + "type": "Literal", + "value": 0.3670208139314082 + }, + "end": 14892, + "operator": "-", + "start": 14873, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 14920, + "raw": "0.21201331909674526", + "start": 14901, + "type": "Literal", + "type": "Literal", + "value": 0.21201331909674526 + } + ], + "end": 14927, + "start": 14864, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 14930, + "start": 14929, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14863, + "name": "line", + "start": 14859, + "type": "Identifier" + }, + "end": 14931, + "start": 14859, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 14970, + "raw": "0.4707511307971115", + "start": 14952, + "type": "Literal", + "type": "Literal", + "value": 0.4707511307971115 + }, + "end": 14970, + "operator": "-", + "start": 14951, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 14997, + "raw": "0.4905279615419764", + "start": 14979, + "type": "Literal", + "type": "Literal", + "value": 0.4905279615419764 + } + ], + "end": 15004, + "start": 14942, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15007, + "start": 15006, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 14941, + "name": "line", + "start": 14937, + "type": "Identifier" + }, + "end": 15008, + "start": 14937, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 15047, + "raw": "0.8328324229085962", + "start": 15029, + "type": "Literal", + "type": "Literal", + "value": 0.8328324229085962 + }, + "end": 15047, + "operator": "-", + "start": 15028, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 15074, + "raw": "0.4677492878818803", + "start": 15056, + "type": "Literal", + "type": "Literal", + "value": 0.4677492878818803 + } + ], + "end": 15081, + "start": 15019, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15084, + "start": 15083, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15018, + "name": "line", + "start": 15014, + "type": "Identifier" + }, + "end": 15085, + "start": 15014, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 15124, + "raw": "0.8111463382182231", + "start": 15106, + "type": "Literal", + "type": "Literal", + "value": 0.8111463382182231 + }, + "end": 15124, + "operator": "-", + "start": 15105, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 15153, + "raw": "0.41814807547140576", + "start": 15134, + "type": "Literal", + "type": "Literal", + "value": 0.41814807547140576 + }, + "end": 15153, + "operator": "-", + "start": 15133, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 15160, + "start": 15096, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15163, + "start": 15162, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15095, + "name": "line", + "start": 15091, + "type": "Identifier" + }, + "end": 15164, + "start": 15091, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 15203, + "raw": "0.03807684940941125", + "start": 15184, + "type": "Literal", + "type": "Literal", + "value": 0.03807684940941125 + }, + { + "end": 15231, + "raw": "0.25664826686353326", + "start": 15212, + "type": "Literal", + "type": "Literal", + "value": 0.25664826686353326 + } + ], + "end": 15238, + "start": 15175, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15241, + "start": 15240, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15174, + "name": "line", + "start": 15170, + "type": "Identifier" + }, + "end": 15242, + "start": 15170, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 15281, + "raw": "0.23950083339596384", + "start": 15262, + "type": "Literal", + "type": "Literal", + "value": 0.23950083339596384 + }, + { + "end": 15309, + "raw": "0.43693196301855575", + "start": 15290, + "type": "Literal", + "type": "Literal", + "value": 0.43693196301855575 + } + ], + "end": 15316, + "start": 15253, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15319, + "start": 15318, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15252, + "name": "line", + "start": 15248, + "type": "Identifier" + }, + "end": 15320, + "start": 15248, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 15360, + "raw": "0.16279444820904887", + "start": 15341, + "type": "Literal", + "type": "Literal", + "value": 0.16279444820904887 + }, + "end": 15360, + "operator": "-", + "start": 15340, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 15387, + "raw": "0.8064475707664818", + "start": 15369, + "type": "Literal", + "type": "Literal", + "value": 0.8064475707664818 + } + ], + "end": 15394, + "start": 15331, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15397, + "start": 15396, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15330, + "name": "line", + "start": 15326, + "type": "Identifier" + }, + "end": 15398, + "start": 15326, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 15438, + "raw": "0.08972872009232558", + "start": 15419, + "type": "Literal", + "type": "Literal", + "value": 0.08972872009232558 + }, + "end": 15438, + "operator": "-", + "start": 15418, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 15467, + "raw": "0.08887625823751266", + "start": 15448, + "type": "Literal", + "type": "Literal", + "value": 0.08887625823751266 + }, + "end": 15467, + "operator": "-", + "start": 15447, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 15474, + "start": 15409, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15477, + "start": 15476, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15408, + "name": "line", + "start": 15404, + "type": "Identifier" + }, + "end": 15478, + "start": 15404, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 15516, + "raw": "0.9203433427102556", + "start": 15498, + "type": "Literal", + "type": "Literal", + "value": 0.9203433427102556 + }, + { + "argument": { + "end": 15545, + "raw": "0.17343459369697545", + "start": 15526, + "type": "Literal", + "type": "Literal", + "value": 0.17343459369697545 + }, + "end": 15545, + "operator": "-", + "start": 15525, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 15552, + "start": 15489, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15555, + "start": 15554, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15488, + "name": "line", + "start": 15484, + "type": "Identifier" + }, + "end": 15556, + "start": 15484, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 15597, + "raw": "0.0017496234414517975", + "start": 15576, + "type": "Literal", + "type": "Literal", + "value": 0.0017496234414517975 + }, + { + "argument": { + "end": 15625, + "raw": "0.5178508316168335", + "start": 15607, + "type": "Literal", + "type": "Literal", + "value": 0.5178508316168335 + }, + "end": 15625, + "operator": "-", + "start": 15606, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 15632, + "start": 15567, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15635, + "start": 15634, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15566, + "name": "line", + "start": 15562, + "type": "Identifier" + }, + "end": 15636, + "start": 15562, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 15674, + "raw": "0.6206263405732759", + "start": 15656, + "type": "Literal", + "type": "Literal", + "value": 0.6206263405732759 + }, + { + "argument": { + "end": 15702, + "raw": "0.8733399468665124", + "start": 15684, + "type": "Literal", + "type": "Literal", + "value": 0.8733399468665124 + }, + "end": 15702, + "operator": "-", + "start": 15683, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 15709, + "start": 15647, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15712, + "start": 15711, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15646, + "name": "line", + "start": 15642, + "type": "Identifier" + }, + "end": 15713, + "start": 15642, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 15752, + "raw": "0.7776386664456383", + "start": 15734, + "type": "Literal", + "type": "Literal", + "value": 0.7776386664456383 + }, + "end": 15752, + "operator": "-", + "start": 15733, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 15779, + "raw": "0.7602780485384968", + "start": 15761, + "type": "Literal", + "type": "Literal", + "value": 0.7602780485384968 + } + ], + "end": 15786, + "start": 15724, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15789, + "start": 15788, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15723, + "name": "line", + "start": 15719, + "type": "Identifier" + }, + "end": 15790, + "start": 15719, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 15820, + "raw": "0.5439379760788592", + "start": 15802, + "type": "Literal", + "type": "Literal", + "value": 0.5439379760788592 + }, + { + "end": 15840, + "raw": "0.8449177589350552", + "start": 15822, + "type": "Literal", + "type": "Literal", + "value": 0.8449177589350552 + } + ], + "end": 15841, + "start": 15801, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15844, + "start": 15843, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15800, + "name": "line", + "start": 15796, + "type": "Identifier" + }, + "end": 15845, + "start": 15796, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 15885, + "raw": "0.13036646025917076", + "start": 15866, + "type": "Literal", + "type": "Literal", + "value": 0.13036646025917076 + }, + "end": 15885, + "operator": "-", + "start": 15865, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 15914, + "raw": "0.012051713627069693", + "start": 15894, + "type": "Literal", + "type": "Literal", + "value": 0.012051713627069693 + } + ], + "end": 15921, + "start": 15856, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 15924, + "start": 15923, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15855, + "name": "line", + "start": 15851, + "type": "Identifier" + }, + "end": 15925, + "start": 15851, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 15964, + "raw": "0.1656465612645519", + "start": 15946, + "type": "Literal", + "type": "Literal", + "value": 0.1656465612645519 + }, + "end": 15964, + "operator": "-", + "start": 15945, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 15993, + "raw": "0.20775229173765486", + "start": 15974, + "type": "Literal", + "type": "Literal", + "value": 0.20775229173765486 + }, + "end": 15993, + "operator": "-", + "start": 15973, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 16000, + "start": 15936, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 16003, + "start": 16002, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 15935, + "name": "line", + "start": 15931, + "type": "Identifier" + }, + "end": 16004, + "start": 15931, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 16043, + "raw": "0.0962723255929061", + "start": 16025, + "type": "Literal", + "type": "Literal", + "value": 0.0962723255929061 + }, + "end": 16043, + "operator": "-", + "start": 16024, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 16072, + "raw": "0.05417797659066137", + "start": 16053, + "type": "Literal", + "type": "Literal", + "value": 0.05417797659066137 + }, + "end": 16072, + "operator": "-", + "start": 16052, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 16079, + "start": 16015, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 16082, + "start": 16081, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 16014, + "name": "line", + "start": 16010, + "type": "Identifier" + }, + "end": 16083, + "start": 16010, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 16112, + "raw": "0.902108945498191", + "start": 16095, + "type": "Literal", + "type": "Literal", + "value": 0.902108945498191 + }, + { + "end": 16132, + "raw": "0.3958978534964961", + "start": 16114, + "type": "Literal", + "type": "Literal", + "value": 0.3958978534964961 + } + ], + "end": 16133, + "start": 16094, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 16136, + "start": 16135, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 16093, + "name": "line", + "start": 16089, + "type": "Identifier" + }, + "end": 16137, + "start": 16089, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 16176, + "raw": "0.27997950083139167", + "start": 16157, + "type": "Literal", + "type": "Literal", + "value": 0.27997950083139167 + }, + { + "argument": { + "end": 16205, + "raw": "0.17778188444008958", + "start": 16186, + "type": "Literal", + "type": "Literal", + "value": 0.17778188444008958 + }, + "end": 16205, + "operator": "-", + "start": 16185, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 16212, + "start": 16148, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 16215, + "start": 16214, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 16147, + "name": "line", + "start": 16143, + "type": "Identifier" + }, + "end": 16216, + "start": 16143, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 16246, + "raw": "0.5235806061589545", + "start": 16228, + "type": "Literal", + "type": "Literal", + "value": 0.5235806061589545 + }, + { + "end": 16265, + "raw": "0.694318985642328", + "start": 16248, + "type": "Literal", + "type": "Literal", + "value": 0.694318985642328 + } + ], + "end": 16266, + "start": 16227, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 16269, + "start": 16268, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 16226, + "name": "line", + "start": 16222, + "type": "Identifier" + }, + "end": 16270, + "start": 16222, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 16309, + "raw": "0.39140760219992154", + "start": 16290, + "type": "Literal", + "type": "Literal", + "value": 0.39140760219992154 + }, + { + "argument": { + "end": 16337, + "raw": "0.7839795272576484", + "start": 16319, + "type": "Literal", + "type": "Literal", + "value": 0.7839795272576484 + }, + "end": 16337, + "operator": "-", + "start": 16318, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 16344, + "start": 16281, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 16347, + "start": 16346, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 16280, + "name": "line", + "start": 16276, + "type": "Identifier" + }, + "end": 16348, + "start": 16276, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 16378, + "raw": "0.8414243527073519", + "start": 16360, + "type": "Literal", + "type": "Literal", + "value": 0.8414243527073519 + }, + { + "end": 16398, + "raw": "0.5395591528940082", + "start": 16380, + "type": "Literal", + "type": "Literal", + "value": 0.5395591528940082 + } + ], + "end": 16399, + "start": 16359, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 16402, + "start": 16401, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 16358, + "name": "line", + "start": 16354, + "type": "Identifier" + }, + "end": 16403, + "start": 16354, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 16441, + "raw": "0.6137667704875602", + "start": 16423, + "type": "Literal", + "type": "Literal", + "value": 0.6137667704875602 + }, + { + "end": 16469, + "raw": "0.22119647516722085", + "start": 16450, + "type": "Literal", + "type": "Literal", + "value": 0.22119647516722085 + } + ], + "end": 16476, + "start": 16414, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 16479, + "start": 16478, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 16413, + "name": "line", + "start": 16409, + "type": "Identifier" + }, + "end": 16480, + "start": 16409, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 16510, + "raw": "0.8830488380766681", + "start": 16492, + "type": "Literal", + "type": "Literal", + "value": 0.8830488380766681 + }, + { + "end": 16530, + "raw": "0.6996724408425232", + "start": 16512, + "type": "Literal", + "type": "Literal", + "value": 0.6996724408425232 + } + ], + "end": 16531, + "start": 16491, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 16534, + "start": 16533, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 16490, + "name": "line", + "start": 16486, + "type": "Identifier" + }, + "end": 16535, + "start": 16486, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 16575, + "raw": "0.41290485754343953", + "start": 16556, + "type": "Literal", + "type": "Literal", + "value": 0.41290485754343953 + }, + "end": 16575, + "operator": "-", + "start": 16555, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 16603, + "raw": "0.4152647361760933", + "start": 16585, + "type": "Literal", + "type": "Literal", + "value": 0.4152647361760933 + }, + "end": 16603, + "operator": "-", + "start": 16584, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 16610, + "start": 16546, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 16613, + "start": 16612, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 16545, + "name": "line", + "start": 16541, + "type": "Identifier" + }, + "end": 16614, + "start": 16541, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 16652, + "raw": "0.5169538755575687", + "start": 16634, + "type": "Literal", + "type": "Literal", + "value": 0.5169538755575687 + }, + { + "argument": { + "end": 16680, + "raw": "0.9085567867302617", + "start": 16662, + "type": "Literal", + "type": "Literal", + "value": 0.9085567867302617 + }, + "end": 16680, + "operator": "-", + "start": 16661, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 16687, + "start": 16625, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 16690, + "start": 16689, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 16624, + "name": "line", + "start": 16620, + "type": "Identifier" + }, + "end": 16691, + "start": 16620, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 16730, + "raw": "0.6716353749059765", + "start": 16712, + "type": "Literal", + "type": "Literal", + "value": 0.6716353749059765 + }, + "end": 16730, + "operator": "-", + "start": 16711, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 16758, + "raw": "0.9605576808879026", + "start": 16740, + "type": "Literal", + "type": "Literal", + "value": 0.9605576808879026 + }, + "end": 16758, + "operator": "-", + "start": 16739, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 16765, + "start": 16702, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 16768, + "start": 16767, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 16701, + "name": "line", + "start": 16697, + "type": "Identifier" + }, + "end": 16769, + "start": 16697, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 16809, + "raw": "0.010280170930300203", + "start": 16789, + "type": "Literal", + "type": "Literal", + "value": 0.010280170930300203 + }, + { + "argument": { + "end": 16838, + "raw": "0.37344123662342166", + "start": 16819, + "type": "Literal", + "type": "Literal", + "value": 0.37344123662342166 + }, + "end": 16838, + "operator": "-", + "start": 16818, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 16845, + "start": 16780, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 16848, + "start": 16847, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 16779, + "name": "line", + "start": 16775, + "type": "Identifier" + }, + "end": 16849, + "start": 16775, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 16888, + "raw": "0.10357375682791004", + "start": 16869, + "type": "Literal", + "type": "Literal", + "value": 0.10357375682791004 + }, + { + "argument": { + "end": 16917, + "raw": "0.42294321030821425", + "start": 16898, + "type": "Literal", + "type": "Literal", + "value": 0.42294321030821425 + }, + "end": 16917, + "operator": "-", + "start": 16897, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 16924, + "start": 16860, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 16927, + "start": 16926, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 16859, + "name": "line", + "start": 16855, + "type": "Identifier" + }, + "end": 16928, + "start": 16855, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 16966, + "raw": "0.4520311575096987", + "start": 16948, + "type": "Literal", + "type": "Literal", + "value": 0.4520311575096987 + }, + { + "argument": { + "end": 16995, + "raw": "0.11232675307600548", + "start": 16976, + "type": "Literal", + "type": "Literal", + "value": 0.11232675307600548 + }, + "end": 16995, + "operator": "-", + "start": 16975, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 17002, + "start": 16939, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 17005, + "start": 17004, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 16938, + "name": "line", + "start": 16934, + "type": "Identifier" + }, + "end": 17006, + "start": 16934, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 17045, + "raw": "0.8821185914380845", + "start": 17027, + "type": "Literal", + "type": "Literal", + "value": 0.8821185914380845 + }, + "end": 17045, + "operator": "-", + "start": 17026, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 17073, + "raw": "0.7155147434939819", + "start": 17055, + "type": "Literal", + "type": "Literal", + "value": 0.7155147434939819 + }, + "end": 17073, + "operator": "-", + "start": 17054, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 17080, + "start": 17017, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 17083, + "start": 17082, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 17016, + "name": "line", + "start": 17012, + "type": "Identifier" + }, + "end": 17084, + "start": 17012, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 17114, + "raw": "0.9195487101690416", + "start": 17096, + "type": "Literal", + "type": "Literal", + "value": 0.9195487101690416 + }, + { + "end": 17134, + "raw": "0.2691627465297364", + "start": 17116, + "type": "Literal", + "type": "Literal", + "value": 0.2691627465297364 + } + ], + "end": 17135, + "start": 17095, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 17138, + "start": 17137, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 17094, + "name": "line", + "start": 17090, + "type": "Identifier" + }, + "end": 17139, + "start": 17090, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 17177, + "raw": "0.7098978191546745", + "start": 17159, + "type": "Literal", + "type": "Literal", + "value": 0.7098978191546745 + }, + { + "end": 17205, + "raw": "0.11710004169385968", + "start": 17186, + "type": "Literal", + "type": "Literal", + "value": 0.11710004169385968 + } + ], + "end": 17212, + "start": 17150, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 17215, + "start": 17214, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 17149, + "name": "line", + "start": 17145, + "type": "Identifier" + }, + "end": 17216, + "start": 17145, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 17256, + "raw": "0.37876368560819995", + "start": 17237, + "type": "Literal", + "type": "Literal", + "value": 0.37876368560819995 + }, + "end": 17256, + "operator": "-", + "start": 17236, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 17283, + "raw": "0.7106729314759084", + "start": 17265, + "type": "Literal", + "type": "Literal", + "value": 0.7106729314759084 + } + ], + "end": 17290, + "start": 17227, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 17293, + "start": 17292, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 17226, + "name": "line", + "start": 17222, + "type": "Identifier" + }, + "end": 17294, + "start": 17222, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 17334, + "raw": "0.29728126898353335", + "start": 17315, + "type": "Literal", + "type": "Literal", + "value": 0.29728126898353335 + }, + "end": 17334, + "operator": "-", + "start": 17314, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 17363, + "raw": "0.06649734568328003", + "start": 17344, + "type": "Literal", + "type": "Literal", + "value": 0.06649734568328003 + }, + "end": 17363, + "operator": "-", + "start": 17343, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 17370, + "start": 17305, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 17373, + "start": 17372, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 17304, + "name": "line", + "start": 17300, + "type": "Identifier" + }, + "end": 17374, + "start": 17300, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 17413, + "raw": "0.22965781558352072", + "start": 17394, + "type": "Literal", + "type": "Literal", + "value": 0.22965781558352072 + }, + { + "argument": { + "end": 17441, + "raw": "0.7601866432836641", + "start": 17423, + "type": "Literal", + "type": "Literal", + "value": 0.7601866432836641 + }, + "end": 17441, + "operator": "-", + "start": 17422, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 17448, + "start": 17385, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 17451, + "start": 17450, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 17384, + "name": "line", + "start": 17380, + "type": "Identifier" + }, + "end": 17452, + "start": 17380, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 17491, + "raw": "0.6356501074317229", + "start": 17473, + "type": "Literal", + "type": "Literal", + "value": 0.6356501074317229 + }, + "end": 17491, + "operator": "-", + "start": 17472, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 17519, + "raw": "0.19458425399338064", + "start": 17500, + "type": "Literal", + "type": "Literal", + "value": 0.19458425399338064 + } + ], + "end": 17526, + "start": 17463, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 17529, + "start": 17528, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 17462, + "name": "line", + "start": 17458, + "type": "Identifier" + }, + "end": 17530, + "start": 17458, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 17560, + "raw": "0.5721251777404546", + "start": 17542, + "type": "Literal", + "type": "Literal", + "value": 0.5721251777404546 + }, + { + "end": 17580, + "raw": "0.2888584097921527", + "start": 17562, + "type": "Literal", + "type": "Literal", + "value": 0.2888584097921527 + } + ], + "end": 17581, + "start": 17541, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 17584, + "start": 17583, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 17540, + "name": "line", + "start": 17536, + "type": "Identifier" + }, + "end": 17585, + "start": 17536, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 17624, + "raw": "0.9580409549552311", + "start": 17606, + "type": "Literal", + "type": "Literal", + "value": 0.9580409549552311 + }, + "end": 17624, + "operator": "-", + "start": 17605, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 17653, + "raw": "0.02243818192078395", + "start": 17634, + "type": "Literal", + "type": "Literal", + "value": 0.02243818192078395 + }, + "end": 17653, + "operator": "-", + "start": 17633, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 17660, + "start": 17596, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 17663, + "start": 17662, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 17595, + "name": "line", + "start": 17591, + "type": "Identifier" + }, + "end": 17664, + "start": 17591, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 17702, + "raw": "0.3299184618602866", + "start": 17684, + "type": "Literal", + "type": "Literal", + "value": 0.3299184618602866 + }, + { + "argument": { + "end": 17730, + "raw": "0.8353726942369875", + "start": 17712, + "type": "Literal", + "type": "Literal", + "value": 0.8353726942369875 + }, + "end": 17730, + "operator": "-", + "start": 17711, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 17737, + "start": 17675, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 17740, + "start": 17739, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 17674, + "name": "line", + "start": 17670, + "type": "Identifier" + }, + "end": 17741, + "start": 17670, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 17779, + "raw": "0.7434639386755209", + "start": 17761, + "type": "Literal", + "type": "Literal", + "value": 0.7434639386755209 + }, + { + "argument": { + "end": 17807, + "raw": "0.7919648864138378", + "start": 17789, + "type": "Literal", + "type": "Literal", + "value": 0.7919648864138378 + }, + "end": 17807, + "operator": "-", + "start": 17788, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 17814, + "start": 17752, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 17817, + "start": 17816, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 17751, + "name": "line", + "start": 17747, + "type": "Identifier" + }, + "end": 17818, + "start": 17747, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 17848, + "raw": "0.9935751011164615", + "start": 17830, + "type": "Literal", + "type": "Literal", + "value": 0.9935751011164615 + }, + { + "end": 17868, + "raw": "0.9042566468497608", + "start": 17850, + "type": "Literal", + "type": "Literal", + "value": 0.9042566468497608 + } + ], + "end": 17869, + "start": 17829, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 17872, + "start": 17871, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 17828, + "name": "line", + "start": 17824, + "type": "Identifier" + }, + "end": 17873, + "start": 17824, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 17912, + "raw": "0.5035812884687294", + "start": 17894, + "type": "Literal", + "type": "Literal", + "value": 0.5035812884687294 + }, + "end": 17912, + "operator": "-", + "start": 17893, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 17939, + "raw": "0.5150967434989442", + "start": 17921, + "type": "Literal", + "type": "Literal", + "value": 0.5150967434989442 + } + ], + "end": 17946, + "start": 17884, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 17949, + "start": 17948, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 17883, + "name": "line", + "start": 17879, + "type": "Identifier" + }, + "end": 17950, + "start": 17879, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 17980, + "raw": "0.5526227215900215", + "start": 17962, + "type": "Literal", + "type": "Literal", + "value": 0.5526227215900215 + }, + { + "end": 18000, + "raw": "0.7612604137272441", + "start": 17982, + "type": "Literal", + "type": "Literal", + "value": 0.7612604137272441 + } + ], + "end": 18001, + "start": 17961, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 18004, + "start": 18003, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 17960, + "name": "line", + "start": 17956, + "type": "Identifier" + }, + "end": 18005, + "start": 17956, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 18043, + "raw": "0.8593271349126876", + "start": 18025, + "type": "Literal", + "type": "Literal", + "value": 0.8593271349126876 + }, + { + "end": 18071, + "raw": "0.08414894953725849", + "start": 18052, + "type": "Literal", + "type": "Literal", + "value": 0.08414894953725849 + } + ], + "end": 18078, + "start": 18016, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 18081, + "start": 18080, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 18015, + "name": "line", + "start": 18011, + "type": "Identifier" + }, + "end": 18082, + "start": 18011, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 18121, + "raw": "0.8181049219192864", + "start": 18103, + "type": "Literal", + "type": "Literal", + "value": 0.8181049219192864 + }, + "end": 18121, + "operator": "-", + "start": 18102, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 18148, + "raw": "0.903548131323352", + "start": 18131, + "type": "Literal", + "type": "Literal", + "value": 0.903548131323352 + }, + "end": 18148, + "operator": "-", + "start": 18130, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 18155, + "start": 18093, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 18158, + "start": 18157, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 18092, + "name": "line", + "start": 18088, + "type": "Identifier" + }, + "end": 18159, + "start": 18088, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 18197, + "raw": "0.3165782044458305", + "start": 18179, + "type": "Literal", + "type": "Literal", + "value": 0.3165782044458305 + }, + { + "argument": { + "end": 18226, + "raw": "0.24189274252014914", + "start": 18207, + "type": "Literal", + "type": "Literal", + "value": 0.24189274252014914 + }, + "end": 18226, + "operator": "-", + "start": 18206, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 18233, + "start": 18170, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 18236, + "start": 18235, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 18169, + "name": "line", + "start": 18165, + "type": "Identifier" + }, + "end": 18237, + "start": 18165, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 18277, + "raw": "0.44390956414045135", + "start": 18258, + "type": "Literal", + "type": "Literal", + "value": 0.44390956414045135 + }, + "end": 18277, + "operator": "-", + "start": 18257, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 18306, + "raw": "0.25912591535126905", + "start": 18287, + "type": "Literal", + "type": "Literal", + "value": 0.25912591535126905 + }, + "end": 18306, + "operator": "-", + "start": 18286, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 18313, + "start": 18248, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 18316, + "start": 18315, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 18247, + "name": "line", + "start": 18243, + "type": "Identifier" + }, + "end": 18317, + "start": 18243, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 18356, + "raw": "0.6605165911891009", + "start": 18338, + "type": "Literal", + "type": "Literal", + "value": 0.6605165911891009 + }, + "end": 18356, + "operator": "-", + "start": 18337, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 18385, + "raw": "0.40355115288839194", + "start": 18366, + "type": "Literal", + "type": "Literal", + "value": 0.40355115288839194 + }, + "end": 18385, + "operator": "-", + "start": 18365, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 18392, + "start": 18328, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 18395, + "start": 18394, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 18327, + "name": "line", + "start": 18323, + "type": "Identifier" + }, + "end": 18396, + "start": 18323, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 18435, + "raw": "0.7170489950180006", + "start": 18417, + "type": "Literal", + "type": "Literal", + "value": 0.7170489950180006 + }, + "end": 18435, + "operator": "-", + "start": 18416, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 18463, + "raw": "0.23454356079651384", + "start": 18444, + "type": "Literal", + "type": "Literal", + "value": 0.23454356079651384 + } + ], + "end": 18470, + "start": 18407, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 18473, + "start": 18472, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 18406, + "name": "line", + "start": 18402, + "type": "Identifier" + }, + "end": 18474, + "start": 18402, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 18513, + "raw": "0.2568187045379722", + "start": 18495, + "type": "Literal", + "type": "Literal", + "value": 0.2568187045379722 + }, + "end": 18513, + "operator": "-", + "start": 18494, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 18542, + "raw": "0.45031188717601367", + "start": 18523, + "type": "Literal", + "type": "Literal", + "value": 0.45031188717601367 + }, + "end": 18542, + "operator": "-", + "start": 18522, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 18549, + "start": 18485, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 18552, + "start": 18551, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 18484, + "name": "line", + "start": 18480, + "type": "Identifier" + }, + "end": 18553, + "start": 18480, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 18591, + "raw": "0.6751951211858687", + "start": 18573, + "type": "Literal", + "type": "Literal", + "value": 0.6751951211858687 + }, + { + "argument": { + "end": 18619, + "raw": "0.9709424233465593", + "start": 18601, + "type": "Literal", + "type": "Literal", + "value": 0.9709424233465593 + }, + "end": 18619, + "operator": "-", + "start": 18600, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 18626, + "start": 18564, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 18629, + "start": 18628, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 18563, + "name": "line", + "start": 18559, + "type": "Identifier" + }, + "end": 18630, + "start": 18559, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 18669, + "raw": "0.5689619842972184", + "start": 18651, + "type": "Literal", + "type": "Literal", + "value": 0.5689619842972184 + }, + "end": 18669, + "operator": "-", + "start": 18650, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 18696, + "raw": "0.5918969913790362", + "start": 18678, + "type": "Literal", + "type": "Literal", + "value": 0.5918969913790362 + } + ], + "end": 18703, + "start": 18641, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 18706, + "start": 18705, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 18640, + "name": "line", + "start": 18636, + "type": "Identifier" + }, + "end": 18707, + "start": 18636, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 18746, + "raw": "0.8328324229085962", + "start": 18728, + "type": "Literal", + "type": "Literal", + "value": 0.8328324229085962 + }, + "end": 18746, + "operator": "-", + "start": 18727, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 18773, + "raw": "0.4677492878818803", + "start": 18755, + "type": "Literal", + "type": "Literal", + "value": 0.4677492878818803 + } + ], + "end": 18780, + "start": 18718, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 18783, + "start": 18782, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 18717, + "name": "line", + "start": 18713, + "type": "Identifier" + }, + "end": 18784, + "start": 18713, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 18823, + "raw": "0.8111463382182231", + "start": 18805, + "type": "Literal", + "type": "Literal", + "value": 0.8111463382182231 + }, + "end": 18823, + "operator": "-", + "start": 18804, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 18852, + "raw": "0.41814807547140576", + "start": 18833, + "type": "Literal", + "type": "Literal", + "value": 0.41814807547140576 + }, + "end": 18852, + "operator": "-", + "start": 18832, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 18859, + "start": 18795, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 18862, + "start": 18861, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 18794, + "name": "line", + "start": 18790, + "type": "Identifier" + }, + "end": 18863, + "start": 18790, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 18902, + "raw": "0.03807684940941125", + "start": 18883, + "type": "Literal", + "type": "Literal", + "value": 0.03807684940941125 + }, + { + "end": 18930, + "raw": "0.25664826686353326", + "start": 18911, + "type": "Literal", + "type": "Literal", + "value": 0.25664826686353326 + } + ], + "end": 18937, + "start": 18874, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 18940, + "start": 18939, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 18873, + "name": "line", + "start": 18869, + "type": "Identifier" + }, + "end": 18941, + "start": 18869, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 18980, + "raw": "0.23950083339596384", + "start": 18961, + "type": "Literal", + "type": "Literal", + "value": 0.23950083339596384 + }, + { + "end": 19008, + "raw": "0.43693196301855575", + "start": 18989, + "type": "Literal", + "type": "Literal", + "value": 0.43693196301855575 + } + ], + "end": 19015, + "start": 18952, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 19018, + "start": 19017, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 18951, + "name": "line", + "start": 18947, + "type": "Identifier" + }, + "end": 19019, + "start": 18947, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 19059, + "raw": "0.16279444820904887", + "start": 19040, + "type": "Literal", + "type": "Literal", + "value": 0.16279444820904887 + }, + "end": 19059, + "operator": "-", + "start": 19039, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 19086, + "raw": "0.8064475707664818", + "start": 19068, + "type": "Literal", + "type": "Literal", + "value": 0.8064475707664818 + } + ], + "end": 19093, + "start": 19030, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 19096, + "start": 19095, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 19029, + "name": "line", + "start": 19025, + "type": "Identifier" + }, + "end": 19097, + "start": 19025, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 19137, + "raw": "0.08972872009232558", + "start": 19118, + "type": "Literal", + "type": "Literal", + "value": 0.08972872009232558 + }, + "end": 19137, + "operator": "-", + "start": 19117, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 19166, + "raw": "0.08887625823751266", + "start": 19147, + "type": "Literal", + "type": "Literal", + "value": 0.08887625823751266 + }, + "end": 19166, + "operator": "-", + "start": 19146, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 19173, + "start": 19108, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 19176, + "start": 19175, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 19107, + "name": "line", + "start": 19103, + "type": "Identifier" + }, + "end": 19177, + "start": 19103, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 19215, + "raw": "0.9203433427102556", + "start": 19197, + "type": "Literal", + "type": "Literal", + "value": 0.9203433427102556 + }, + { + "argument": { + "end": 19244, + "raw": "0.17343459369697545", + "start": 19225, + "type": "Literal", + "type": "Literal", + "value": 0.17343459369697545 + }, + "end": 19244, + "operator": "-", + "start": 19224, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 19251, + "start": 19188, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 19254, + "start": 19253, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 19187, + "name": "line", + "start": 19183, + "type": "Identifier" + }, + "end": 19255, + "start": 19183, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 19296, + "raw": "0.0017496234414517975", + "start": 19275, + "type": "Literal", + "type": "Literal", + "value": 0.0017496234414517975 + }, + { + "argument": { + "end": 19324, + "raw": "0.5178508316168335", + "start": 19306, + "type": "Literal", + "type": "Literal", + "value": 0.5178508316168335 + }, + "end": 19324, + "operator": "-", + "start": 19305, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 19331, + "start": 19266, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 19334, + "start": 19333, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 19265, + "name": "line", + "start": 19261, + "type": "Identifier" + }, + "end": 19335, + "start": 19261, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 19373, + "raw": "0.6206263405732759", + "start": 19355, + "type": "Literal", + "type": "Literal", + "value": 0.6206263405732759 + }, + { + "argument": { + "end": 19401, + "raw": "0.8733399468665124", + "start": 19383, + "type": "Literal", + "type": "Literal", + "value": 0.8733399468665124 + }, + "end": 19401, + "operator": "-", + "start": 19382, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 19408, + "start": 19346, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 19411, + "start": 19410, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 19345, + "name": "line", + "start": 19341, + "type": "Identifier" + }, + "end": 19412, + "start": 19341, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 19451, + "raw": "0.7776386664456383", + "start": 19433, + "type": "Literal", + "type": "Literal", + "value": 0.7776386664456383 + }, + "end": 19451, + "operator": "-", + "start": 19432, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 19478, + "raw": "0.7602780485384968", + "start": 19460, + "type": "Literal", + "type": "Literal", + "value": 0.7602780485384968 + } + ], + "end": 19485, + "start": 19423, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 19488, + "start": 19487, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 19422, + "name": "line", + "start": 19418, + "type": "Identifier" + }, + "end": 19489, + "start": 19418, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 19519, + "raw": "0.5439379760788592", + "start": 19501, + "type": "Literal", + "type": "Literal", + "value": 0.5439379760788592 + }, + { + "end": 19539, + "raw": "0.8449177589350552", + "start": 19521, + "type": "Literal", + "type": "Literal", + "value": 0.8449177589350552 + } + ], + "end": 19540, + "start": 19500, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 19543, + "start": 19542, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 19499, + "name": "line", + "start": 19495, + "type": "Identifier" + }, + "end": 19544, + "start": 19495, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 19584, + "raw": "0.13036646025917076", + "start": 19565, + "type": "Literal", + "type": "Literal", + "value": 0.13036646025917076 + }, + "end": 19584, + "operator": "-", + "start": 19564, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 19613, + "raw": "0.012051713627069693", + "start": 19593, + "type": "Literal", + "type": "Literal", + "value": 0.012051713627069693 + } + ], + "end": 19620, + "start": 19555, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 19623, + "start": 19622, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 19554, + "name": "line", + "start": 19550, + "type": "Identifier" + }, + "end": 19624, + "start": 19550, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 19663, + "raw": "0.1656465612645519", + "start": 19645, + "type": "Literal", + "type": "Literal", + "value": 0.1656465612645519 + }, + "end": 19663, + "operator": "-", + "start": 19644, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 19692, + "raw": "0.20775229173765486", + "start": 19673, + "type": "Literal", + "type": "Literal", + "value": 0.20775229173765486 + }, + "end": 19692, + "operator": "-", + "start": 19672, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 19699, + "start": 19635, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 19702, + "start": 19701, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 19634, + "name": "line", + "start": 19630, + "type": "Identifier" + }, + "end": 19703, + "start": 19630, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 19742, + "raw": "0.0962723255929061", + "start": 19724, + "type": "Literal", + "type": "Literal", + "value": 0.0962723255929061 + }, + "end": 19742, + "operator": "-", + "start": 19723, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 19771, + "raw": "0.05417797659066137", + "start": 19752, + "type": "Literal", + "type": "Literal", + "value": 0.05417797659066137 + }, + "end": 19771, + "operator": "-", + "start": 19751, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 19778, + "start": 19714, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 19781, + "start": 19780, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 19713, + "name": "line", + "start": 19709, + "type": "Identifier" + }, + "end": 19782, + "start": 19709, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 19811, + "raw": "0.902108945498191", + "start": 19794, + "type": "Literal", + "type": "Literal", + "value": 0.902108945498191 + }, + { + "end": 19831, + "raw": "0.3958978534964961", + "start": 19813, + "type": "Literal", + "type": "Literal", + "value": 0.3958978534964961 + } + ], + "end": 19832, + "start": 19793, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 19835, + "start": 19834, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 19792, + "name": "line", + "start": 19788, + "type": "Identifier" + }, + "end": 19836, + "start": 19788, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 19875, + "raw": "0.27997950083139167", + "start": 19856, + "type": "Literal", + "type": "Literal", + "value": 0.27997950083139167 + }, + { + "argument": { + "end": 19904, + "raw": "0.17778188444008958", + "start": 19885, + "type": "Literal", + "type": "Literal", + "value": 0.17778188444008958 + }, + "end": 19904, + "operator": "-", + "start": 19884, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 19911, + "start": 19847, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 19914, + "start": 19913, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 19846, + "name": "line", + "start": 19842, + "type": "Identifier" + }, + "end": 19915, + "start": 19842, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 19945, + "raw": "0.5235806061589545", + "start": 19927, + "type": "Literal", + "type": "Literal", + "value": 0.5235806061589545 + }, + { + "end": 19964, + "raw": "0.694318985642328", + "start": 19947, + "type": "Literal", + "type": "Literal", + "value": 0.694318985642328 + } + ], + "end": 19965, + "start": 19926, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 19968, + "start": 19967, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 19925, + "name": "line", + "start": 19921, + "type": "Identifier" + }, + "end": 19969, + "start": 19921, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 20008, + "raw": "0.39140760219992154", + "start": 19989, + "type": "Literal", + "type": "Literal", + "value": 0.39140760219992154 + }, + { + "argument": { + "end": 20036, + "raw": "0.7839795272576484", + "start": 20018, + "type": "Literal", + "type": "Literal", + "value": 0.7839795272576484 + }, + "end": 20036, + "operator": "-", + "start": 20017, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 20043, + "start": 19980, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 20046, + "start": 20045, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 19979, + "name": "line", + "start": 19975, + "type": "Identifier" + }, + "end": 20047, + "start": 19975, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 20077, + "raw": "0.8414243527073519", + "start": 20059, + "type": "Literal", + "type": "Literal", + "value": 0.8414243527073519 + }, + { + "end": 20097, + "raw": "0.5395591528940082", + "start": 20079, + "type": "Literal", + "type": "Literal", + "value": 0.5395591528940082 + } + ], + "end": 20098, + "start": 20058, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 20101, + "start": 20100, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 20057, + "name": "line", + "start": 20053, + "type": "Identifier" + }, + "end": 20102, + "start": 20053, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 20140, + "raw": "0.6137667704875602", + "start": 20122, + "type": "Literal", + "type": "Literal", + "value": 0.6137667704875602 + }, + { + "end": 20168, + "raw": "0.22119647516722085", + "start": 20149, + "type": "Literal", + "type": "Literal", + "value": 0.22119647516722085 + } + ], + "end": 20175, + "start": 20113, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 20178, + "start": 20177, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 20112, + "name": "line", + "start": 20108, + "type": "Identifier" + }, + "end": 20179, + "start": 20108, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 20209, + "raw": "0.8830488380766681", + "start": 20191, + "type": "Literal", + "type": "Literal", + "value": 0.8830488380766681 + }, + { + "end": 20229, + "raw": "0.6996724408425232", + "start": 20211, + "type": "Literal", + "type": "Literal", + "value": 0.6996724408425232 + } + ], + "end": 20230, + "start": 20190, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 20233, + "start": 20232, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 20189, + "name": "line", + "start": 20185, + "type": "Identifier" + }, + "end": 20234, + "start": 20185, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 20274, + "raw": "0.41290485754343953", + "start": 20255, + "type": "Literal", + "type": "Literal", + "value": 0.41290485754343953 + }, + "end": 20274, + "operator": "-", + "start": 20254, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 20302, + "raw": "0.4152647361760933", + "start": 20284, + "type": "Literal", + "type": "Literal", + "value": 0.4152647361760933 + }, + "end": 20302, + "operator": "-", + "start": 20283, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 20309, + "start": 20245, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 20312, + "start": 20311, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 20244, + "name": "line", + "start": 20240, + "type": "Identifier" + }, + "end": 20313, + "start": 20240, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 20351, + "raw": "0.5169538755575687", + "start": 20333, + "type": "Literal", + "type": "Literal", + "value": 0.5169538755575687 + }, + { + "argument": { + "end": 20379, + "raw": "0.9085567867302617", + "start": 20361, + "type": "Literal", + "type": "Literal", + "value": 0.9085567867302617 + }, + "end": 20379, + "operator": "-", + "start": 20360, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 20386, + "start": 20324, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 20389, + "start": 20388, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 20323, + "name": "line", + "start": 20319, + "type": "Identifier" + }, + "end": 20390, + "start": 20319, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 20428, + "raw": "0.6751951211858687", + "start": 20410, + "type": "Literal", + "type": "Literal", + "value": 0.6751951211858687 + }, + { + "argument": { + "end": 20456, + "raw": "0.9709424233465593", + "start": 20438, + "type": "Literal", + "type": "Literal", + "value": 0.9709424233465593 + }, + "end": 20456, + "operator": "-", + "start": 20437, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 20463, + "start": 20401, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 20466, + "start": 20465, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 20400, + "name": "line", + "start": 20396, + "type": "Identifier" + }, + "end": 20467, + "start": 20396, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 20506, + "raw": "0.5689619842972184", + "start": 20488, + "type": "Literal", + "type": "Literal", + "value": 0.5689619842972184 + }, + "end": 20506, + "operator": "-", + "start": 20487, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 20533, + "raw": "0.5918969913790362", + "start": 20515, + "type": "Literal", + "type": "Literal", + "value": 0.5918969913790362 + } + ], + "end": 20540, + "start": 20478, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 20543, + "start": 20542, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 20477, + "name": "line", + "start": 20473, + "type": "Identifier" + }, + "end": 20544, + "start": 20473, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 20582, + "raw": "0.9464450621708211", + "start": 20564, + "type": "Literal", + "type": "Literal", + "value": 0.9464450621708211 + }, + { + "argument": { + "end": 20610, + "raw": "0.2684908127803667", + "start": 20592, + "type": "Literal", + "type": "Literal", + "value": 0.2684908127803667 + }, + "end": 20610, + "operator": "-", + "start": 20591, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 20617, + "start": 20555, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 20620, + "start": 20619, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 20554, + "name": "line", + "start": 20550, + "type": "Identifier" + }, + "end": 20621, + "start": 20550, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 20651, + "raw": "0.5241732366617591", + "start": 20633, + "type": "Literal", + "type": "Literal", + "value": 0.5241732366617591 + }, + { + "end": 20671, + "raw": "0.9011437416408563", + "start": 20653, + "type": "Literal", + "type": "Literal", + "value": 0.9011437416408563 + } + ], + "end": 20672, + "start": 20632, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 20675, + "start": 20674, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 20631, + "name": "line", + "start": 20627, + "type": "Identifier" + }, + "end": 20676, + "start": 20627, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 20716, + "raw": "0.14255393713960607", + "start": 20697, + "type": "Literal", + "type": "Literal", + "value": 0.14255393713960607 + }, + "end": 20716, + "operator": "-", + "start": 20696, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 20744, + "raw": "0.5194262624564814", + "start": 20726, + "type": "Literal", + "type": "Literal", + "value": 0.5194262624564814 + }, + "end": 20744, + "operator": "-", + "start": 20725, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 20751, + "start": 20687, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 20754, + "start": 20753, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 20686, + "name": "line", + "start": 20682, + "type": "Identifier" + }, + "end": 20755, + "start": 20682, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 20794, + "raw": "0.4287123231350338", + "start": 20776, + "type": "Literal", + "type": "Literal", + "value": 0.4287123231350338 + }, + "end": 20794, + "operator": "-", + "start": 20775, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 20822, + "raw": "0.4223564528725028", + "start": 20804, + "type": "Literal", + "type": "Literal", + "value": 0.4223564528725028 + }, + "end": 20822, + "operator": "-", + "start": 20803, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 20829, + "start": 20766, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 20832, + "start": 20831, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 20765, + "name": "line", + "start": 20761, + "type": "Identifier" + }, + "end": 20833, + "start": 20761, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 20873, + "raw": "0.09316367294024519", + "start": 20854, + "type": "Literal", + "type": "Literal", + "value": 0.09316367294024519 + }, + "end": 20873, + "operator": "-", + "start": 20853, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 20901, + "raw": "0.9063127021008246", + "start": 20883, + "type": "Literal", + "type": "Literal", + "value": 0.9063127021008246 + }, + "end": 20901, + "operator": "-", + "start": 20882, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 20908, + "start": 20844, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 20911, + "start": 20910, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 20843, + "name": "line", + "start": 20839, + "type": "Identifier" + }, + "end": 20912, + "start": 20839, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 20951, + "raw": "0.2767766535558669", + "start": 20933, + "type": "Literal", + "type": "Literal", + "value": 0.2767766535558669 + }, + "end": 20951, + "operator": "-", + "start": 20932, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 20978, + "raw": "0.6816248114129131", + "start": 20960, + "type": "Literal", + "type": "Literal", + "value": 0.6816248114129131 + } + ], + "end": 20985, + "start": 20923, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 20988, + "start": 20987, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 20922, + "name": "line", + "start": 20918, + "type": "Identifier" + }, + "end": 20989, + "start": 20918, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 21027, + "raw": "0.9796762495562534", + "start": 21009, + "type": "Literal", + "type": "Literal", + "value": 0.9796762495562534 + }, + { + "argument": { + "end": 21055, + "raw": "0.0822145668330625", + "start": 21037, + "type": "Literal", + "type": "Literal", + "value": 0.0822145668330625 + }, + "end": 21055, + "operator": "-", + "start": 21036, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 21062, + "start": 21000, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 21065, + "start": 21064, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 20999, + "name": "line", + "start": 20995, + "type": "Identifier" + }, + "end": 21066, + "start": 20995, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 21105, + "raw": "0.8666513070867441", + "start": 21087, + "type": "Literal", + "type": "Literal", + "value": 0.8666513070867441 + }, + "end": 21105, + "operator": "-", + "start": 21086, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 21132, + "raw": "0.301053160242023", + "start": 21115, + "type": "Literal", + "type": "Literal", + "value": 0.301053160242023 + }, + "end": 21132, + "operator": "-", + "start": 21114, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 21139, + "start": 21077, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 21142, + "start": 21141, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 21076, + "name": "line", + "start": 21072, + "type": "Identifier" + }, + "end": 21143, + "start": 21072, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 21180, + "raw": "0.537415656028112", + "start": 21163, + "type": "Literal", + "type": "Literal", + "value": 0.537415656028112 + }, + { + "end": 21209, + "raw": "0.020272692875002774", + "start": 21189, + "type": "Literal", + "type": "Literal", + "value": 0.020272692875002774 + } + ], + "end": 21216, + "start": 21154, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 21219, + "start": 21218, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 21153, + "name": "line", + "start": 21149, + "type": "Identifier" + }, + "end": 21220, + "start": 21149, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 21258, + "raw": "0.9332396256457531", + "start": 21240, + "type": "Literal", + "type": "Literal", + "value": 0.9332396256457531 + }, + { + "argument": { + "end": 21286, + "raw": "0.6228175690649898", + "start": 21268, + "type": "Literal", + "type": "Literal", + "value": 0.6228175690649898 + }, + "end": 21286, + "operator": "-", + "start": 21267, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 21293, + "start": 21231, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 21296, + "start": 21295, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 21230, + "name": "line", + "start": 21226, + "type": "Identifier" + }, + "end": 21297, + "start": 21226, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 21336, + "raw": "0.18052415837320734", + "start": 21317, + "type": "Literal", + "type": "Literal", + "value": 0.18052415837320734 + }, + { + "argument": { + "end": 21365, + "raw": "0.36894384647296197", + "start": 21346, + "type": "Literal", + "type": "Literal", + "value": 0.36894384647296197 + }, + "end": 21365, + "operator": "-", + "start": 21345, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 21372, + "start": 21308, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 21375, + "start": 21374, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 21307, + "name": "line", + "start": 21303, + "type": "Identifier" + }, + "end": 21376, + "start": 21303, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 21406, + "raw": "0.5384372634075449", + "start": 21388, + "type": "Literal", + "type": "Literal", + "value": 0.5384372634075449 + }, + { + "end": 21426, + "raw": "0.2377565050887107", + "start": 21408, + "type": "Literal", + "type": "Literal", + "value": 0.2377565050887107 + } + ], + "end": 21427, + "start": 21387, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 21430, + "start": 21429, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 21386, + "name": "line", + "start": 21382, + "type": "Identifier" + }, + "end": 21431, + "start": 21382, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 21470, + "raw": "0.39043436929278874", + "start": 21451, + "type": "Literal", + "type": "Literal", + "value": 0.39043436929278874 + }, + { + "end": 21498, + "raw": "0.14273182483160451", + "start": 21479, + "type": "Literal", + "type": "Literal", + "value": 0.14273182483160451 + } + ], + "end": 21505, + "start": 21442, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 21508, + "start": 21507, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 21441, + "name": "line", + "start": 21437, + "type": "Identifier" + }, + "end": 21509, + "start": 21437, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 21548, + "raw": "0.09782890412897283", + "start": 21529, + "type": "Literal", + "type": "Literal", + "value": 0.09782890412897283 + }, + { + "end": 21575, + "raw": "0.9907667536909659", + "start": 21557, + "type": "Literal", + "type": "Literal", + "value": 0.9907667536909659 + } + ], + "end": 21582, + "start": 21520, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 21585, + "start": 21584, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 21519, + "name": "line", + "start": 21515, + "type": "Identifier" + }, + "end": 21586, + "start": 21515, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 21624, + "raw": "0.5286610085921146", + "start": 21606, + "type": "Literal", + "type": "Literal", + "value": 0.5286610085921146 + }, + { + "argument": { + "end": 21652, + "raw": "0.7924508308419256", + "start": 21634, + "type": "Literal", + "type": "Literal", + "value": 0.7924508308419256 + }, + "end": 21652, + "operator": "-", + "start": 21633, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 21659, + "start": 21597, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 21662, + "start": 21661, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 21596, + "name": "line", + "start": 21592, + "type": "Identifier" + }, + "end": 21663, + "start": 21592, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 21701, + "raw": "0.3789978184503342", + "start": 21683, + "type": "Literal", + "type": "Literal", + "value": 0.3789978184503342 + }, + { + "end": 21729, + "raw": "0.12396120576838676", + "start": 21710, + "type": "Literal", + "type": "Literal", + "value": 0.12396120576838676 + } + ], + "end": 21736, + "start": 21674, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 21739, + "start": 21738, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 21673, + "name": "line", + "start": 21669, + "type": "Identifier" + }, + "end": 21740, + "start": 21669, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 21779, + "raw": "0.9484912744890612", + "start": 21761, + "type": "Literal", + "type": "Literal", + "value": 0.9484912744890612 + }, + "end": 21779, + "operator": "-", + "start": 21760, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 21806, + "raw": "0.6729649846476855", + "start": 21788, + "type": "Literal", + "type": "Literal", + "value": 0.6729649846476855 + } + ], + "end": 21813, + "start": 21751, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 21816, + "start": 21815, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 21750, + "name": "line", + "start": 21746, + "type": "Identifier" + }, + "end": 21817, + "start": 21746, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 21855, + "raw": "0.7451758753425153", + "start": 21837, + "type": "Literal", + "type": "Literal", + "value": 0.7451758753425153 + }, + { + "argument": { + "end": 21884, + "raw": "0.21318737562458967", + "start": 21865, + "type": "Literal", + "type": "Literal", + "value": 0.21318737562458967 + }, + "end": 21884, + "operator": "-", + "start": 21864, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 21891, + "start": 21828, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 21894, + "start": 21893, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 21827, + "name": "line", + "start": 21823, + "type": "Identifier" + }, + "end": 21895, + "start": 21823, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 21933, + "raw": "0.1873200727251887", + "start": 21915, + "type": "Literal", + "type": "Literal", + "value": 0.1873200727251887 + }, + { + "argument": { + "end": 21962, + "raw": "0.15961374297992448", + "start": 21943, + "type": "Literal", + "type": "Literal", + "value": 0.15961374297992448 + }, + "end": 21962, + "operator": "-", + "start": 21942, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 21969, + "start": 21906, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 21972, + "start": 21971, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 21905, + "name": "line", + "start": 21901, + "type": "Identifier" + }, + "end": 21973, + "start": 21901, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 22013, + "raw": "0.05729464924537564", + "start": 21994, + "type": "Literal", + "type": "Literal", + "value": 0.05729464924537564 + }, + "end": 22013, + "operator": "-", + "start": 21993, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 22041, + "raw": "0.5436345558508746", + "start": 22023, + "type": "Literal", + "type": "Literal", + "value": 0.5436345558508746 + }, + "end": 22041, + "operator": "-", + "start": 22022, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 22048, + "start": 21984, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 22051, + "start": 22050, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 21983, + "name": "line", + "start": 21979, + "type": "Identifier" + }, + "end": 22052, + "start": 21979, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 22092, + "raw": "0.09582414374469184", + "start": 22073, + "type": "Literal", + "type": "Literal", + "value": 0.09582414374469184 + }, + "end": 22092, + "operator": "-", + "start": 22072, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 22120, + "raw": "0.7533839681212353", + "start": 22102, + "type": "Literal", + "type": "Literal", + "value": 0.7533839681212353 + }, + "end": 22120, + "operator": "-", + "start": 22101, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 22127, + "start": 22063, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 22130, + "start": 22129, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 22062, + "name": "line", + "start": 22058, + "type": "Identifier" + }, + "end": 22131, + "start": 22058, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 22171, + "raw": "0.17254116580051848", + "start": 22152, + "type": "Literal", + "type": "Literal", + "value": 0.17254116580051848 + }, + "end": 22171, + "operator": "-", + "start": 22151, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 22199, + "raw": "0.7669113400341137", + "start": 22181, + "type": "Literal", + "type": "Literal", + "value": 0.7669113400341137 + }, + "end": 22199, + "operator": "-", + "start": 22180, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 22206, + "start": 22142, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 22209, + "start": 22208, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 22141, + "name": "line", + "start": 22137, + "type": "Identifier" + }, + "end": 22210, + "start": 22137, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 22240, + "raw": "0.8944730032887609", + "start": 22222, + "type": "Literal", + "type": "Literal", + "value": 0.8944730032887609 + }, + { + "end": 22260, + "raw": "0.6093318694741408", + "start": 22242, + "type": "Literal", + "type": "Literal", + "value": 0.6093318694741408 + } + ], + "end": 22261, + "start": 22221, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 22264, + "start": 22263, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 22220, + "name": "line", + "start": 22216, + "type": "Identifier" + }, + "end": 22265, + "start": 22216, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 22304, + "raw": "0.3670208139314082", + "start": 22286, + "type": "Literal", + "type": "Literal", + "value": 0.3670208139314082 + }, + "end": 22304, + "operator": "-", + "start": 22285, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 22332, + "raw": "0.21201331909674526", + "start": 22313, + "type": "Literal", + "type": "Literal", + "value": 0.21201331909674526 + } + ], + "end": 22339, + "start": 22276, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 22342, + "start": 22341, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 22275, + "name": "line", + "start": 22271, + "type": "Identifier" + }, + "end": 22343, + "start": 22271, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 22382, + "raw": "0.4707511307971115", + "start": 22364, + "type": "Literal", + "type": "Literal", + "value": 0.4707511307971115 + }, + "end": 22382, + "operator": "-", + "start": 22363, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 22409, + "raw": "0.4905279615419764", + "start": 22391, + "type": "Literal", + "type": "Literal", + "value": 0.4905279615419764 + } + ], + "end": 22416, + "start": 22354, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 22419, + "start": 22418, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 22353, + "name": "line", + "start": 22349, + "type": "Identifier" + }, + "end": 22420, + "start": 22349, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 22459, + "raw": "0.8328324229085962", + "start": 22441, + "type": "Literal", + "type": "Literal", + "value": 0.8328324229085962 + }, + "end": 22459, + "operator": "-", + "start": 22440, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 22486, + "raw": "0.4677492878818803", + "start": 22468, + "type": "Literal", + "type": "Literal", + "value": 0.4677492878818803 + } + ], + "end": 22493, + "start": 22431, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 22496, + "start": 22495, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 22430, + "name": "line", + "start": 22426, + "type": "Identifier" + }, + "end": 22497, + "start": 22426, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 22536, + "raw": "0.8111463382182231", + "start": 22518, + "type": "Literal", + "type": "Literal", + "value": 0.8111463382182231 + }, + "end": 22536, + "operator": "-", + "start": 22517, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 22565, + "raw": "0.41814807547140576", + "start": 22546, + "type": "Literal", + "type": "Literal", + "value": 0.41814807547140576 + }, + "end": 22565, + "operator": "-", + "start": 22545, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 22572, + "start": 22508, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 22575, + "start": 22574, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 22507, + "name": "line", + "start": 22503, + "type": "Identifier" + }, + "end": 22576, + "start": 22503, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 22615, + "raw": "0.03807684940941125", + "start": 22596, + "type": "Literal", + "type": "Literal", + "value": 0.03807684940941125 + }, + { + "end": 22643, + "raw": "0.25664826686353326", + "start": 22624, + "type": "Literal", + "type": "Literal", + "value": 0.25664826686353326 + } + ], + "end": 22650, + "start": 22587, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 22653, + "start": 22652, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 22586, + "name": "line", + "start": 22582, + "type": "Identifier" + }, + "end": 22654, + "start": 22582, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 22693, + "raw": "0.23950083339596384", + "start": 22674, + "type": "Literal", + "type": "Literal", + "value": 0.23950083339596384 + }, + { + "end": 22721, + "raw": "0.43693196301855575", + "start": 22702, + "type": "Literal", + "type": "Literal", + "value": 0.43693196301855575 + } + ], + "end": 22728, + "start": 22665, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 22731, + "start": 22730, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 22664, + "name": "line", + "start": 22660, + "type": "Identifier" + }, + "end": 22732, + "start": 22660, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 22772, + "raw": "0.16279444820904887", + "start": 22753, + "type": "Literal", + "type": "Literal", + "value": 0.16279444820904887 + }, + "end": 22772, + "operator": "-", + "start": 22752, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 22799, + "raw": "0.8064475707664818", + "start": 22781, + "type": "Literal", + "type": "Literal", + "value": 0.8064475707664818 + } + ], + "end": 22806, + "start": 22743, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 22809, + "start": 22808, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 22742, + "name": "line", + "start": 22738, + "type": "Identifier" + }, + "end": 22810, + "start": 22738, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 22850, + "raw": "0.08972872009232558", + "start": 22831, + "type": "Literal", + "type": "Literal", + "value": 0.08972872009232558 + }, + "end": 22850, + "operator": "-", + "start": 22830, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 22879, + "raw": "0.08887625823751266", + "start": 22860, + "type": "Literal", + "type": "Literal", + "value": 0.08887625823751266 + }, + "end": 22879, + "operator": "-", + "start": 22859, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 22886, + "start": 22821, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 22889, + "start": 22888, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 22820, + "name": "line", + "start": 22816, + "type": "Identifier" + }, + "end": 22890, + "start": 22816, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 22928, + "raw": "0.9203433427102556", + "start": 22910, + "type": "Literal", + "type": "Literal", + "value": 0.9203433427102556 + }, + { + "argument": { + "end": 22957, + "raw": "0.17343459369697545", + "start": 22938, + "type": "Literal", + "type": "Literal", + "value": 0.17343459369697545 + }, + "end": 22957, + "operator": "-", + "start": 22937, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 22964, + "start": 22901, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 22967, + "start": 22966, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 22900, + "name": "line", + "start": 22896, + "type": "Identifier" + }, + "end": 22968, + "start": 22896, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 23009, + "raw": "0.0017496234414517975", + "start": 22988, + "type": "Literal", + "type": "Literal", + "value": 0.0017496234414517975 + }, + { + "argument": { + "end": 23037, + "raw": "0.5178508316168335", + "start": 23019, + "type": "Literal", + "type": "Literal", + "value": 0.5178508316168335 + }, + "end": 23037, + "operator": "-", + "start": 23018, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 23044, + "start": 22979, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 23047, + "start": 23046, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 22978, + "name": "line", + "start": 22974, + "type": "Identifier" + }, + "end": 23048, + "start": 22974, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 23086, + "raw": "0.6206263405732759", + "start": 23068, + "type": "Literal", + "type": "Literal", + "value": 0.6206263405732759 + }, + { + "argument": { + "end": 23114, + "raw": "0.8733399468665124", + "start": 23096, + "type": "Literal", + "type": "Literal", + "value": 0.8733399468665124 + }, + "end": 23114, + "operator": "-", + "start": 23095, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 23121, + "start": 23059, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 23124, + "start": 23123, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 23058, + "name": "line", + "start": 23054, + "type": "Identifier" + }, + "end": 23125, + "start": 23054, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 23164, + "raw": "0.7776386664456383", + "start": 23146, + "type": "Literal", + "type": "Literal", + "value": 0.7776386664456383 + }, + "end": 23164, + "operator": "-", + "start": 23145, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 23191, + "raw": "0.7602780485384968", + "start": 23173, + "type": "Literal", + "type": "Literal", + "value": 0.7602780485384968 + } + ], + "end": 23198, + "start": 23136, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 23201, + "start": 23200, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 23135, + "name": "line", + "start": 23131, + "type": "Identifier" + }, + "end": 23202, + "start": 23131, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 23232, + "raw": "0.5439379760788592", + "start": 23214, + "type": "Literal", + "type": "Literal", + "value": 0.5439379760788592 + }, + { + "end": 23252, + "raw": "0.8449177589350552", + "start": 23234, + "type": "Literal", + "type": "Literal", + "value": 0.8449177589350552 + } + ], + "end": 23253, + "start": 23213, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 23256, + "start": 23255, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 23212, + "name": "line", + "start": 23208, + "type": "Identifier" + }, + "end": 23257, + "start": 23208, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 23297, + "raw": "0.13036646025917076", + "start": 23278, + "type": "Literal", + "type": "Literal", + "value": 0.13036646025917076 + }, + "end": 23297, + "operator": "-", + "start": 23277, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 23326, + "raw": "0.012051713627069693", + "start": 23306, + "type": "Literal", + "type": "Literal", + "value": 0.012051713627069693 + } + ], + "end": 23333, + "start": 23268, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 23336, + "start": 23335, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 23267, + "name": "line", + "start": 23263, + "type": "Identifier" + }, + "end": 23337, + "start": 23263, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 23376, + "raw": "0.1656465612645519", + "start": 23358, + "type": "Literal", + "type": "Literal", + "value": 0.1656465612645519 + }, + "end": 23376, + "operator": "-", + "start": 23357, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 23405, + "raw": "0.20775229173765486", + "start": 23386, + "type": "Literal", + "type": "Literal", + "value": 0.20775229173765486 + }, + "end": 23405, + "operator": "-", + "start": 23385, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 23412, + "start": 23348, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 23415, + "start": 23414, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 23347, + "name": "line", + "start": 23343, + "type": "Identifier" + }, + "end": 23416, + "start": 23343, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 23455, + "raw": "0.0962723255929061", + "start": 23437, + "type": "Literal", + "type": "Literal", + "value": 0.0962723255929061 + }, + "end": 23455, + "operator": "-", + "start": 23436, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 23484, + "raw": "0.05417797659066137", + "start": 23465, + "type": "Literal", + "type": "Literal", + "value": 0.05417797659066137 + }, + "end": 23484, + "operator": "-", + "start": 23464, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 23491, + "start": 23427, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 23494, + "start": 23493, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 23426, + "name": "line", + "start": 23422, + "type": "Identifier" + }, + "end": 23495, + "start": 23422, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 23524, + "raw": "0.902108945498191", + "start": 23507, + "type": "Literal", + "type": "Literal", + "value": 0.902108945498191 + }, + { + "end": 23544, + "raw": "0.3958978534964961", + "start": 23526, + "type": "Literal", + "type": "Literal", + "value": 0.3958978534964961 + } + ], + "end": 23545, + "start": 23506, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 23548, + "start": 23547, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 23505, + "name": "line", + "start": 23501, + "type": "Identifier" + }, + "end": 23549, + "start": 23501, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 23588, + "raw": "0.27997950083139167", + "start": 23569, + "type": "Literal", + "type": "Literal", + "value": 0.27997950083139167 + }, + { + "argument": { + "end": 23617, + "raw": "0.17778188444008958", + "start": 23598, + "type": "Literal", + "type": "Literal", + "value": 0.17778188444008958 + }, + "end": 23617, + "operator": "-", + "start": 23597, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 23624, + "start": 23560, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 23627, + "start": 23626, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 23559, + "name": "line", + "start": 23555, + "type": "Identifier" + }, + "end": 23628, + "start": 23555, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 23658, + "raw": "0.5235806061589545", + "start": 23640, + "type": "Literal", + "type": "Literal", + "value": 0.5235806061589545 + }, + { + "end": 23677, + "raw": "0.694318985642328", + "start": 23660, + "type": "Literal", + "type": "Literal", + "value": 0.694318985642328 + } + ], + "end": 23678, + "start": 23639, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 23681, + "start": 23680, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 23638, + "name": "line", + "start": 23634, + "type": "Identifier" + }, + "end": 23682, + "start": 23634, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 23721, + "raw": "0.39140760219992154", + "start": 23702, + "type": "Literal", + "type": "Literal", + "value": 0.39140760219992154 + }, + { + "argument": { + "end": 23749, + "raw": "0.7839795272576484", + "start": 23731, + "type": "Literal", + "type": "Literal", + "value": 0.7839795272576484 + }, + "end": 23749, + "operator": "-", + "start": 23730, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 23756, + "start": 23693, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 23759, + "start": 23758, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 23692, + "name": "line", + "start": 23688, + "type": "Identifier" + }, + "end": 23760, + "start": 23688, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 23790, + "raw": "0.8414243527073519", + "start": 23772, + "type": "Literal", + "type": "Literal", + "value": 0.8414243527073519 + }, + { + "end": 23810, + "raw": "0.5395591528940082", + "start": 23792, + "type": "Literal", + "type": "Literal", + "value": 0.5395591528940082 + } + ], + "end": 23811, + "start": 23771, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 23814, + "start": 23813, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 23770, + "name": "line", + "start": 23766, + "type": "Identifier" + }, + "end": 23815, + "start": 23766, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 23853, + "raw": "0.6137667704875602", + "start": 23835, + "type": "Literal", + "type": "Literal", + "value": 0.6137667704875602 + }, + { + "end": 23881, + "raw": "0.22119647516722085", + "start": 23862, + "type": "Literal", + "type": "Literal", + "value": 0.22119647516722085 + } + ], + "end": 23888, + "start": 23826, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 23891, + "start": 23890, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 23825, + "name": "line", + "start": 23821, + "type": "Identifier" + }, + "end": 23892, + "start": 23821, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 23922, + "raw": "0.8830488380766681", + "start": 23904, + "type": "Literal", + "type": "Literal", + "value": 0.8830488380766681 + }, + { + "end": 23942, + "raw": "0.6996724408425232", + "start": 23924, + "type": "Literal", + "type": "Literal", + "value": 0.6996724408425232 + } + ], + "end": 23943, + "start": 23903, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 23946, + "start": 23945, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 23902, + "name": "line", + "start": 23898, + "type": "Identifier" + }, + "end": 23947, + "start": 23898, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 23987, + "raw": "0.41290485754343953", + "start": 23968, + "type": "Literal", + "type": "Literal", + "value": 0.41290485754343953 + }, + "end": 23987, + "operator": "-", + "start": 23967, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 24015, + "raw": "0.4152647361760933", + "start": 23997, + "type": "Literal", + "type": "Literal", + "value": 0.4152647361760933 + }, + "end": 24015, + "operator": "-", + "start": 23996, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 24022, + "start": 23958, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 24025, + "start": 24024, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 23957, + "name": "line", + "start": 23953, + "type": "Identifier" + }, + "end": 24026, + "start": 23953, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 24064, + "raw": "0.5169538755575687", + "start": 24046, + "type": "Literal", + "type": "Literal", + "value": 0.5169538755575687 + }, + { + "argument": { + "end": 24092, + "raw": "0.9085567867302617", + "start": 24074, + "type": "Literal", + "type": "Literal", + "value": 0.9085567867302617 + }, + "end": 24092, + "operator": "-", + "start": 24073, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 24099, + "start": 24037, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 24102, + "start": 24101, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 24036, + "name": "line", + "start": 24032, + "type": "Identifier" + }, + "end": 24103, + "start": 24032, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 24142, + "raw": "0.6716353749059765", + "start": 24124, + "type": "Literal", + "type": "Literal", + "value": 0.6716353749059765 + }, + "end": 24142, + "operator": "-", + "start": 24123, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 24170, + "raw": "0.9605576808879026", + "start": 24152, + "type": "Literal", + "type": "Literal", + "value": 0.9605576808879026 + }, + "end": 24170, + "operator": "-", + "start": 24151, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 24177, + "start": 24114, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 24180, + "start": 24179, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 24113, + "name": "line", + "start": 24109, + "type": "Identifier" + }, + "end": 24181, + "start": 24109, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 24221, + "raw": "0.010280170930300203", + "start": 24201, + "type": "Literal", + "type": "Literal", + "value": 0.010280170930300203 + }, + { + "argument": { + "end": 24250, + "raw": "0.37344123662342166", + "start": 24231, + "type": "Literal", + "type": "Literal", + "value": 0.37344123662342166 + }, + "end": 24250, + "operator": "-", + "start": 24230, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 24257, + "start": 24192, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 24260, + "start": 24259, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 24191, + "name": "line", + "start": 24187, + "type": "Identifier" + }, + "end": 24261, + "start": 24187, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 24300, + "raw": "0.10357375682791004", + "start": 24281, + "type": "Literal", + "type": "Literal", + "value": 0.10357375682791004 + }, + { + "argument": { + "end": 24329, + "raw": "0.42294321030821425", + "start": 24310, + "type": "Literal", + "type": "Literal", + "value": 0.42294321030821425 + }, + "end": 24329, + "operator": "-", + "start": 24309, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 24336, + "start": 24272, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 24339, + "start": 24338, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 24271, + "name": "line", + "start": 24267, + "type": "Identifier" + }, + "end": 24340, + "start": 24267, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 24378, + "raw": "0.4520311575096987", + "start": 24360, + "type": "Literal", + "type": "Literal", + "value": 0.4520311575096987 + }, + { + "argument": { + "end": 24407, + "raw": "0.11232675307600548", + "start": 24388, + "type": "Literal", + "type": "Literal", + "value": 0.11232675307600548 + }, + "end": 24407, + "operator": "-", + "start": 24387, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 24414, + "start": 24351, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 24417, + "start": 24416, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 24350, + "name": "line", + "start": 24346, + "type": "Identifier" + }, + "end": 24418, + "start": 24346, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 24457, + "raw": "0.8821185914380845", + "start": 24439, + "type": "Literal", + "type": "Literal", + "value": 0.8821185914380845 + }, + "end": 24457, + "operator": "-", + "start": 24438, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 24485, + "raw": "0.7155147434939819", + "start": 24467, + "type": "Literal", + "type": "Literal", + "value": 0.7155147434939819 + }, + "end": 24485, + "operator": "-", + "start": 24466, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 24492, + "start": 24429, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 24495, + "start": 24494, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 24428, + "name": "line", + "start": 24424, + "type": "Identifier" + }, + "end": 24496, + "start": 24424, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 24526, + "raw": "0.9195487101690416", + "start": 24508, + "type": "Literal", + "type": "Literal", + "value": 0.9195487101690416 + }, + { + "end": 24546, + "raw": "0.2691627465297364", + "start": 24528, + "type": "Literal", + "type": "Literal", + "value": 0.2691627465297364 + } + ], + "end": 24547, + "start": 24507, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 24550, + "start": 24549, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 24506, + "name": "line", + "start": 24502, + "type": "Identifier" + }, + "end": 24551, + "start": 24502, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 24589, + "raw": "0.7098978191546745", + "start": 24571, + "type": "Literal", + "type": "Literal", + "value": 0.7098978191546745 + }, + { + "end": 24617, + "raw": "0.11710004169385968", + "start": 24598, + "type": "Literal", + "type": "Literal", + "value": 0.11710004169385968 + } + ], + "end": 24624, + "start": 24562, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 24627, + "start": 24626, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 24561, + "name": "line", + "start": 24557, + "type": "Identifier" + }, + "end": 24628, + "start": 24557, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 24668, + "raw": "0.37876368560819995", + "start": 24649, + "type": "Literal", + "type": "Literal", + "value": 0.37876368560819995 + }, + "end": 24668, + "operator": "-", + "start": 24648, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 24695, + "raw": "0.7106729314759084", + "start": 24677, + "type": "Literal", + "type": "Literal", + "value": 0.7106729314759084 + } + ], + "end": 24702, + "start": 24639, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 24705, + "start": 24704, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 24638, + "name": "line", + "start": 24634, + "type": "Identifier" + }, + "end": 24706, + "start": 24634, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 24746, + "raw": "0.29728126898353335", + "start": 24727, + "type": "Literal", + "type": "Literal", + "value": 0.29728126898353335 + }, + "end": 24746, + "operator": "-", + "start": 24726, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 24775, + "raw": "0.06649734568328003", + "start": 24756, + "type": "Literal", + "type": "Literal", + "value": 0.06649734568328003 + }, + "end": 24775, + "operator": "-", + "start": 24755, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 24782, + "start": 24717, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 24785, + "start": 24784, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 24716, + "name": "line", + "start": 24712, + "type": "Identifier" + }, + "end": 24786, + "start": 24712, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 24825, + "raw": "0.22965781558352072", + "start": 24806, + "type": "Literal", + "type": "Literal", + "value": 0.22965781558352072 + }, + { + "argument": { + "end": 24853, + "raw": "0.7601866432836641", + "start": 24835, + "type": "Literal", + "type": "Literal", + "value": 0.7601866432836641 + }, + "end": 24853, + "operator": "-", + "start": 24834, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 24860, + "start": 24797, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 24863, + "start": 24862, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 24796, + "name": "line", + "start": 24792, + "type": "Identifier" + }, + "end": 24864, + "start": 24792, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 24903, + "raw": "0.6356501074317229", + "start": 24885, + "type": "Literal", + "type": "Literal", + "value": 0.6356501074317229 + }, + "end": 24903, + "operator": "-", + "start": 24884, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 24931, + "raw": "0.19458425399338064", + "start": 24912, + "type": "Literal", + "type": "Literal", + "value": 0.19458425399338064 + } + ], + "end": 24938, + "start": 24875, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 24941, + "start": 24940, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 24874, + "name": "line", + "start": 24870, + "type": "Identifier" + }, + "end": 24942, + "start": 24870, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 24972, + "raw": "0.5721251777404546", + "start": 24954, + "type": "Literal", + "type": "Literal", + "value": 0.5721251777404546 + }, + { + "end": 24992, + "raw": "0.2888584097921527", + "start": 24974, + "type": "Literal", + "type": "Literal", + "value": 0.2888584097921527 + } + ], + "end": 24993, + "start": 24953, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 24996, + "start": 24995, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 24952, + "name": "line", + "start": 24948, + "type": "Identifier" + }, + "end": 24997, + "start": 24948, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 25036, + "raw": "0.9580409549552311", + "start": 25018, + "type": "Literal", + "type": "Literal", + "value": 0.9580409549552311 + }, + "end": 25036, + "operator": "-", + "start": 25017, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 25065, + "raw": "0.02243818192078395", + "start": 25046, + "type": "Literal", + "type": "Literal", + "value": 0.02243818192078395 + }, + "end": 25065, + "operator": "-", + "start": 25045, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 25072, + "start": 25008, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 25075, + "start": 25074, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 25007, + "name": "line", + "start": 25003, + "type": "Identifier" + }, + "end": 25076, + "start": 25003, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 25114, + "raw": "0.3299184618602866", + "start": 25096, + "type": "Literal", + "type": "Literal", + "value": 0.3299184618602866 + }, + { + "argument": { + "end": 25142, + "raw": "0.8353726942369875", + "start": 25124, + "type": "Literal", + "type": "Literal", + "value": 0.8353726942369875 + }, + "end": 25142, + "operator": "-", + "start": 25123, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 25149, + "start": 25087, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 25152, + "start": 25151, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 25086, + "name": "line", + "start": 25082, + "type": "Identifier" + }, + "end": 25153, + "start": 25082, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 25191, + "raw": "0.7434639386755209", + "start": 25173, + "type": "Literal", + "type": "Literal", + "value": 0.7434639386755209 + }, + { + "argument": { + "end": 25219, + "raw": "0.7919648864138378", + "start": 25201, + "type": "Literal", + "type": "Literal", + "value": 0.7919648864138378 + }, + "end": 25219, + "operator": "-", + "start": 25200, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 25226, + "start": 25164, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 25229, + "start": 25228, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 25163, + "name": "line", + "start": 25159, + "type": "Identifier" + }, + "end": 25230, + "start": 25159, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 25260, + "raw": "0.9935751011164615", + "start": 25242, + "type": "Literal", + "type": "Literal", + "value": 0.9935751011164615 + }, + { + "end": 25280, + "raw": "0.9042566468497608", + "start": 25262, + "type": "Literal", + "type": "Literal", + "value": 0.9042566468497608 + } + ], + "end": 25281, + "start": 25241, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 25284, + "start": 25283, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 25240, + "name": "line", + "start": 25236, + "type": "Identifier" + }, + "end": 25285, + "start": 25236, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 25324, + "raw": "0.5035812884687294", + "start": 25306, + "type": "Literal", + "type": "Literal", + "value": 0.5035812884687294 + }, + "end": 25324, + "operator": "-", + "start": 25305, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 25351, + "raw": "0.5150967434989442", + "start": 25333, + "type": "Literal", + "type": "Literal", + "value": 0.5150967434989442 + } + ], + "end": 25358, + "start": 25296, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 25361, + "start": 25360, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 25295, + "name": "line", + "start": 25291, + "type": "Identifier" + }, + "end": 25362, + "start": 25291, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 25392, + "raw": "0.5526227215900215", + "start": 25374, + "type": "Literal", + "type": "Literal", + "value": 0.5526227215900215 + }, + { + "end": 25412, + "raw": "0.7612604137272441", + "start": 25394, + "type": "Literal", + "type": "Literal", + "value": 0.7612604137272441 + } + ], + "end": 25413, + "start": 25373, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 25416, + "start": 25415, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 25372, + "name": "line", + "start": 25368, + "type": "Identifier" + }, + "end": 25417, + "start": 25368, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 25455, + "raw": "0.8593271349126876", + "start": 25437, + "type": "Literal", + "type": "Literal", + "value": 0.8593271349126876 + }, + { + "end": 25483, + "raw": "0.08414894953725849", + "start": 25464, + "type": "Literal", + "type": "Literal", + "value": 0.08414894953725849 + } + ], + "end": 25490, + "start": 25428, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 25493, + "start": 25492, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 25427, + "name": "line", + "start": 25423, + "type": "Identifier" + }, + "end": 25494, + "start": 25423, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 25533, + "raw": "0.8181049219192864", + "start": 25515, + "type": "Literal", + "type": "Literal", + "value": 0.8181049219192864 + }, + "end": 25533, + "operator": "-", + "start": 25514, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 25560, + "raw": "0.903548131323352", + "start": 25543, + "type": "Literal", + "type": "Literal", + "value": 0.903548131323352 + }, + "end": 25560, + "operator": "-", + "start": 25542, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 25567, + "start": 25505, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 25570, + "start": 25569, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 25504, + "name": "line", + "start": 25500, + "type": "Identifier" + }, + "end": 25571, + "start": 25500, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 25609, + "raw": "0.3165782044458305", + "start": 25591, + "type": "Literal", + "type": "Literal", + "value": 0.3165782044458305 + }, + { + "argument": { + "end": 25638, + "raw": "0.24189274252014914", + "start": 25619, + "type": "Literal", + "type": "Literal", + "value": 0.24189274252014914 + }, + "end": 25638, + "operator": "-", + "start": 25618, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 25645, + "start": 25582, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 25648, + "start": 25647, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 25581, + "name": "line", + "start": 25577, + "type": "Identifier" + }, + "end": 25649, + "start": 25577, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 25689, + "raw": "0.44390956414045135", + "start": 25670, + "type": "Literal", + "type": "Literal", + "value": 0.44390956414045135 + }, + "end": 25689, + "operator": "-", + "start": 25669, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 25718, + "raw": "0.25912591535126905", + "start": 25699, + "type": "Literal", + "type": "Literal", + "value": 0.25912591535126905 + }, + "end": 25718, + "operator": "-", + "start": 25698, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 25725, + "start": 25660, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 25728, + "start": 25727, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 25659, + "name": "line", + "start": 25655, + "type": "Identifier" + }, + "end": 25729, + "start": 25655, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 25768, + "raw": "0.6605165911891009", + "start": 25750, + "type": "Literal", + "type": "Literal", + "value": 0.6605165911891009 + }, + "end": 25768, + "operator": "-", + "start": 25749, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 25797, + "raw": "0.40355115288839194", + "start": 25778, + "type": "Literal", + "type": "Literal", + "value": 0.40355115288839194 + }, + "end": 25797, + "operator": "-", + "start": 25777, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 25804, + "start": 25740, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 25807, + "start": 25806, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 25739, + "name": "line", + "start": 25735, + "type": "Identifier" + }, + "end": 25808, + "start": 25735, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 25847, + "raw": "0.7170489950180006", + "start": 25829, + "type": "Literal", + "type": "Literal", + "value": 0.7170489950180006 + }, + "end": 25847, + "operator": "-", + "start": 25828, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 25875, + "raw": "0.23454356079651384", + "start": 25856, + "type": "Literal", + "type": "Literal", + "value": 0.23454356079651384 + } + ], + "end": 25882, + "start": 25819, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 25885, + "start": 25884, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 25818, + "name": "line", + "start": 25814, + "type": "Identifier" + }, + "end": 25886, + "start": 25814, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 25925, + "raw": "0.2568187045379722", + "start": 25907, + "type": "Literal", + "type": "Literal", + "value": 0.2568187045379722 + }, + "end": 25925, + "operator": "-", + "start": 25906, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 25954, + "raw": "0.45031188717601367", + "start": 25935, + "type": "Literal", + "type": "Literal", + "value": 0.45031188717601367 + }, + "end": 25954, + "operator": "-", + "start": 25934, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 25961, + "start": 25897, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 25964, + "start": 25963, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 25896, + "name": "line", + "start": 25892, + "type": "Identifier" + }, + "end": 25965, + "start": 25892, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 26003, + "raw": "0.6751951211858687", + "start": 25985, + "type": "Literal", + "type": "Literal", + "value": 0.6751951211858687 + }, + { + "argument": { + "end": 26031, + "raw": "0.9709424233465593", + "start": 26013, + "type": "Literal", + "type": "Literal", + "value": 0.9709424233465593 + }, + "end": 26031, + "operator": "-", + "start": 26012, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 26038, + "start": 25976, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 26041, + "start": 26040, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 25975, + "name": "line", + "start": 25971, + "type": "Identifier" + }, + "end": 26042, + "start": 25971, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 26081, + "raw": "0.5689619842972184", + "start": 26063, + "type": "Literal", + "type": "Literal", + "value": 0.5689619842972184 + }, + "end": 26081, + "operator": "-", + "start": 26062, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 26108, + "raw": "0.5918969913790362", + "start": 26090, + "type": "Literal", + "type": "Literal", + "value": 0.5918969913790362 + } + ], + "end": 26115, + "start": 26053, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 26118, + "start": 26117, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 26052, + "name": "line", + "start": 26048, + "type": "Identifier" + }, + "end": 26119, + "start": 26048, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 26158, + "raw": "0.8328324229085962", + "start": 26140, + "type": "Literal", + "type": "Literal", + "value": 0.8328324229085962 + }, + "end": 26158, + "operator": "-", + "start": 26139, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 26185, + "raw": "0.4677492878818803", + "start": 26167, + "type": "Literal", + "type": "Literal", + "value": 0.4677492878818803 + } + ], + "end": 26192, + "start": 26130, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 26195, + "start": 26194, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 26129, + "name": "line", + "start": 26125, + "type": "Identifier" + }, + "end": 26196, + "start": 26125, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 26235, + "raw": "0.8111463382182231", + "start": 26217, + "type": "Literal", + "type": "Literal", + "value": 0.8111463382182231 + }, + "end": 26235, + "operator": "-", + "start": 26216, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 26264, + "raw": "0.41814807547140576", + "start": 26245, + "type": "Literal", + "type": "Literal", + "value": 0.41814807547140576 + }, + "end": 26264, + "operator": "-", + "start": 26244, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 26271, + "start": 26207, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 26274, + "start": 26273, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 26206, + "name": "line", + "start": 26202, + "type": "Identifier" + }, + "end": 26275, + "start": 26202, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 26314, + "raw": "0.03807684940941125", + "start": 26295, + "type": "Literal", + "type": "Literal", + "value": 0.03807684940941125 + }, + { + "end": 26342, + "raw": "0.25664826686353326", + "start": 26323, + "type": "Literal", + "type": "Literal", + "value": 0.25664826686353326 + } + ], + "end": 26349, + "start": 26286, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 26352, + "start": 26351, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 26285, + "name": "line", + "start": 26281, + "type": "Identifier" + }, + "end": 26353, + "start": 26281, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 26392, + "raw": "0.23950083339596384", + "start": 26373, + "type": "Literal", + "type": "Literal", + "value": 0.23950083339596384 + }, + { + "end": 26420, + "raw": "0.43693196301855575", + "start": 26401, + "type": "Literal", + "type": "Literal", + "value": 0.43693196301855575 + } + ], + "end": 26427, + "start": 26364, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 26430, + "start": 26429, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 26363, + "name": "line", + "start": 26359, + "type": "Identifier" + }, + "end": 26431, + "start": 26359, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 26471, + "raw": "0.16279444820904887", + "start": 26452, + "type": "Literal", + "type": "Literal", + "value": 0.16279444820904887 + }, + "end": 26471, + "operator": "-", + "start": 26451, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 26498, + "raw": "0.8064475707664818", + "start": 26480, + "type": "Literal", + "type": "Literal", + "value": 0.8064475707664818 + } + ], + "end": 26505, + "start": 26442, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 26508, + "start": 26507, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 26441, + "name": "line", + "start": 26437, + "type": "Identifier" + }, + "end": 26509, + "start": 26437, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 26549, + "raw": "0.08972872009232558", + "start": 26530, + "type": "Literal", + "type": "Literal", + "value": 0.08972872009232558 + }, + "end": 26549, + "operator": "-", + "start": 26529, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 26578, + "raw": "0.08887625823751266", + "start": 26559, + "type": "Literal", + "type": "Literal", + "value": 0.08887625823751266 + }, + "end": 26578, + "operator": "-", + "start": 26558, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 26585, + "start": 26520, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 26588, + "start": 26587, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 26519, + "name": "line", + "start": 26515, + "type": "Identifier" + }, + "end": 26589, + "start": 26515, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 26627, + "raw": "0.9203433427102556", + "start": 26609, + "type": "Literal", + "type": "Literal", + "value": 0.9203433427102556 + }, + { + "argument": { + "end": 26656, + "raw": "0.17343459369697545", + "start": 26637, + "type": "Literal", + "type": "Literal", + "value": 0.17343459369697545 + }, + "end": 26656, + "operator": "-", + "start": 26636, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 26663, + "start": 26600, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 26666, + "start": 26665, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 26599, + "name": "line", + "start": 26595, + "type": "Identifier" + }, + "end": 26667, + "start": 26595, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 26708, + "raw": "0.0017496234414517975", + "start": 26687, + "type": "Literal", + "type": "Literal", + "value": 0.0017496234414517975 + }, + { + "argument": { + "end": 26736, + "raw": "0.5178508316168335", + "start": 26718, + "type": "Literal", + "type": "Literal", + "value": 0.5178508316168335 + }, + "end": 26736, + "operator": "-", + "start": 26717, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 26743, + "start": 26678, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 26746, + "start": 26745, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 26677, + "name": "line", + "start": 26673, + "type": "Identifier" + }, + "end": 26747, + "start": 26673, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 26785, + "raw": "0.6206263405732759", + "start": 26767, + "type": "Literal", + "type": "Literal", + "value": 0.6206263405732759 + }, + { + "argument": { + "end": 26813, + "raw": "0.8733399468665124", + "start": 26795, + "type": "Literal", + "type": "Literal", + "value": 0.8733399468665124 + }, + "end": 26813, + "operator": "-", + "start": 26794, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 26820, + "start": 26758, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 26823, + "start": 26822, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 26757, + "name": "line", + "start": 26753, + "type": "Identifier" + }, + "end": 26824, + "start": 26753, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 26863, + "raw": "0.7776386664456383", + "start": 26845, + "type": "Literal", + "type": "Literal", + "value": 0.7776386664456383 + }, + "end": 26863, + "operator": "-", + "start": 26844, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 26890, + "raw": "0.7602780485384968", + "start": 26872, + "type": "Literal", + "type": "Literal", + "value": 0.7602780485384968 + } + ], + "end": 26897, + "start": 26835, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 26900, + "start": 26899, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 26834, + "name": "line", + "start": 26830, + "type": "Identifier" + }, + "end": 26901, + "start": 26830, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 26931, + "raw": "0.5439379760788592", + "start": 26913, + "type": "Literal", + "type": "Literal", + "value": 0.5439379760788592 + }, + { + "end": 26951, + "raw": "0.8449177589350552", + "start": 26933, + "type": "Literal", + "type": "Literal", + "value": 0.8449177589350552 + } + ], + "end": 26952, + "start": 26912, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 26955, + "start": 26954, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 26911, + "name": "line", + "start": 26907, + "type": "Identifier" + }, + "end": 26956, + "start": 26907, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 26996, + "raw": "0.13036646025917076", + "start": 26977, + "type": "Literal", + "type": "Literal", + "value": 0.13036646025917076 + }, + "end": 26996, + "operator": "-", + "start": 26976, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 27025, + "raw": "0.012051713627069693", + "start": 27005, + "type": "Literal", + "type": "Literal", + "value": 0.012051713627069693 + } + ], + "end": 27032, + "start": 26967, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 27035, + "start": 27034, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 26966, + "name": "line", + "start": 26962, + "type": "Identifier" + }, + "end": 27036, + "start": 26962, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 27075, + "raw": "0.1656465612645519", + "start": 27057, + "type": "Literal", + "type": "Literal", + "value": 0.1656465612645519 + }, + "end": 27075, + "operator": "-", + "start": 27056, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 27104, + "raw": "0.20775229173765486", + "start": 27085, + "type": "Literal", + "type": "Literal", + "value": 0.20775229173765486 + }, + "end": 27104, + "operator": "-", + "start": 27084, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 27111, + "start": 27047, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 27114, + "start": 27113, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 27046, + "name": "line", + "start": 27042, + "type": "Identifier" + }, + "end": 27115, + "start": 27042, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 27154, + "raw": "0.0962723255929061", + "start": 27136, + "type": "Literal", + "type": "Literal", + "value": 0.0962723255929061 + }, + "end": 27154, + "operator": "-", + "start": 27135, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 27183, + "raw": "0.05417797659066137", + "start": 27164, + "type": "Literal", + "type": "Literal", + "value": 0.05417797659066137 + }, + "end": 27183, + "operator": "-", + "start": 27163, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 27190, + "start": 27126, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 27193, + "start": 27192, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 27125, + "name": "line", + "start": 27121, + "type": "Identifier" + }, + "end": 27194, + "start": 27121, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 27223, + "raw": "0.902108945498191", + "start": 27206, + "type": "Literal", + "type": "Literal", + "value": 0.902108945498191 + }, + { + "end": 27243, + "raw": "0.3958978534964961", + "start": 27225, + "type": "Literal", + "type": "Literal", + "value": 0.3958978534964961 + } + ], + "end": 27244, + "start": 27205, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 27247, + "start": 27246, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 27204, + "name": "line", + "start": 27200, + "type": "Identifier" + }, + "end": 27248, + "start": 27200, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 27287, + "raw": "0.27997950083139167", + "start": 27268, + "type": "Literal", + "type": "Literal", + "value": 0.27997950083139167 + }, + { + "argument": { + "end": 27316, + "raw": "0.17778188444008958", + "start": 27297, + "type": "Literal", + "type": "Literal", + "value": 0.17778188444008958 + }, + "end": 27316, + "operator": "-", + "start": 27296, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 27323, + "start": 27259, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 27326, + "start": 27325, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 27258, + "name": "line", + "start": 27254, + "type": "Identifier" + }, + "end": 27327, + "start": 27254, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 27357, + "raw": "0.5235806061589545", + "start": 27339, + "type": "Literal", + "type": "Literal", + "value": 0.5235806061589545 + }, + { + "end": 27376, + "raw": "0.694318985642328", + "start": 27359, + "type": "Literal", + "type": "Literal", + "value": 0.694318985642328 + } + ], + "end": 27377, + "start": 27338, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 27380, + "start": 27379, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 27337, + "name": "line", + "start": 27333, + "type": "Identifier" + }, + "end": 27381, + "start": 27333, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 27420, + "raw": "0.39140760219992154", + "start": 27401, + "type": "Literal", + "type": "Literal", + "value": 0.39140760219992154 + }, + { + "argument": { + "end": 27448, + "raw": "0.7839795272576484", + "start": 27430, + "type": "Literal", + "type": "Literal", + "value": 0.7839795272576484 + }, + "end": 27448, + "operator": "-", + "start": 27429, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 27455, + "start": 27392, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 27458, + "start": 27457, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 27391, + "name": "line", + "start": 27387, + "type": "Identifier" + }, + "end": 27459, + "start": 27387, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 27489, + "raw": "0.8414243527073519", + "start": 27471, + "type": "Literal", + "type": "Literal", + "value": 0.8414243527073519 + }, + { + "end": 27509, + "raw": "0.5395591528940082", + "start": 27491, + "type": "Literal", + "type": "Literal", + "value": 0.5395591528940082 + } + ], + "end": 27510, + "start": 27470, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 27513, + "start": 27512, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 27469, + "name": "line", + "start": 27465, + "type": "Identifier" + }, + "end": 27514, + "start": 27465, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 27552, + "raw": "0.6137667704875602", + "start": 27534, + "type": "Literal", + "type": "Literal", + "value": 0.6137667704875602 + }, + { + "end": 27580, + "raw": "0.22119647516722085", + "start": 27561, + "type": "Literal", + "type": "Literal", + "value": 0.22119647516722085 + } + ], + "end": 27587, + "start": 27525, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 27590, + "start": 27589, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 27524, + "name": "line", + "start": 27520, + "type": "Identifier" + }, + "end": 27591, + "start": 27520, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 27621, + "raw": "0.8830488380766681", + "start": 27603, + "type": "Literal", + "type": "Literal", + "value": 0.8830488380766681 + }, + { + "end": 27641, + "raw": "0.6996724408425232", + "start": 27623, + "type": "Literal", + "type": "Literal", + "value": 0.6996724408425232 + } + ], + "end": 27642, + "start": 27602, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 27645, + "start": 27644, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 27601, + "name": "line", + "start": 27597, + "type": "Identifier" + }, + "end": 27646, + "start": 27597, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 27685, + "raw": "0.3670208139314082", + "start": 27667, + "type": "Literal", + "type": "Literal", + "value": 0.3670208139314082 + }, + "end": 27685, + "operator": "-", + "start": 27666, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 27713, + "raw": "0.21201331909674526", + "start": 27694, + "type": "Literal", + "type": "Literal", + "value": 0.21201331909674526 + } + ], + "end": 27720, + "start": 27657, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 27723, + "start": 27722, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 27656, + "name": "line", + "start": 27652, + "type": "Identifier" + }, + "end": 27724, + "start": 27652, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 27763, + "raw": "0.4707511307971115", + "start": 27745, + "type": "Literal", + "type": "Literal", + "value": 0.4707511307971115 + }, + "end": 27763, + "operator": "-", + "start": 27744, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 27790, + "raw": "0.4905279615419764", + "start": 27772, + "type": "Literal", + "type": "Literal", + "value": 0.4905279615419764 + } + ], + "end": 27797, + "start": 27735, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 27800, + "start": 27799, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 27734, + "name": "line", + "start": 27730, + "type": "Identifier" + }, + "end": 27801, + "start": 27730, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 27840, + "raw": "0.8328324229085962", + "start": 27822, + "type": "Literal", + "type": "Literal", + "value": 0.8328324229085962 + }, + "end": 27840, + "operator": "-", + "start": 27821, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 27867, + "raw": "0.4677492878818803", + "start": 27849, + "type": "Literal", + "type": "Literal", + "value": 0.4677492878818803 + } + ], + "end": 27874, + "start": 27812, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 27877, + "start": 27876, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 27811, + "name": "line", + "start": 27807, + "type": "Identifier" + }, + "end": 27878, + "start": 27807, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 27917, + "raw": "0.8111463382182231", + "start": 27899, + "type": "Literal", + "type": "Literal", + "value": 0.8111463382182231 + }, + "end": 27917, + "operator": "-", + "start": 27898, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 27946, + "raw": "0.41814807547140576", + "start": 27927, + "type": "Literal", + "type": "Literal", + "value": 0.41814807547140576 + }, + "end": 27946, + "operator": "-", + "start": 27926, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 27953, + "start": 27889, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 27956, + "start": 27955, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 27888, + "name": "line", + "start": 27884, + "type": "Identifier" + }, + "end": 27957, + "start": 27884, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 27996, + "raw": "0.03807684940941125", + "start": 27977, + "type": "Literal", + "type": "Literal", + "value": 0.03807684940941125 + }, + { + "end": 28024, + "raw": "0.25664826686353326", + "start": 28005, + "type": "Literal", + "type": "Literal", + "value": 0.25664826686353326 + } + ], + "end": 28031, + "start": 27968, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 28034, + "start": 28033, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 27967, + "name": "line", + "start": 27963, + "type": "Identifier" + }, + "end": 28035, + "start": 27963, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 28074, + "raw": "0.23950083339596384", + "start": 28055, + "type": "Literal", + "type": "Literal", + "value": 0.23950083339596384 + }, + { + "end": 28102, + "raw": "0.43693196301855575", + "start": 28083, + "type": "Literal", + "type": "Literal", + "value": 0.43693196301855575 + } + ], + "end": 28109, + "start": 28046, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 28112, + "start": 28111, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 28045, + "name": "line", + "start": 28041, + "type": "Identifier" + }, + "end": 28113, + "start": 28041, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 28153, + "raw": "0.16279444820904887", + "start": 28134, + "type": "Literal", + "type": "Literal", + "value": 0.16279444820904887 + }, + "end": 28153, + "operator": "-", + "start": 28133, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 28180, + "raw": "0.8064475707664818", + "start": 28162, + "type": "Literal", + "type": "Literal", + "value": 0.8064475707664818 + } + ], + "end": 28187, + "start": 28124, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 28190, + "start": 28189, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 28123, + "name": "line", + "start": 28119, + "type": "Identifier" + }, + "end": 28191, + "start": 28119, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 28231, + "raw": "0.08972872009232558", + "start": 28212, + "type": "Literal", + "type": "Literal", + "value": 0.08972872009232558 + }, + "end": 28231, + "operator": "-", + "start": 28211, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 28260, + "raw": "0.08887625823751266", + "start": 28241, + "type": "Literal", + "type": "Literal", + "value": 0.08887625823751266 + }, + "end": 28260, + "operator": "-", + "start": 28240, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 28267, + "start": 28202, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 28270, + "start": 28269, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 28201, + "name": "line", + "start": 28197, + "type": "Identifier" + }, + "end": 28271, + "start": 28197, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 28309, + "raw": "0.9203433427102556", + "start": 28291, + "type": "Literal", + "type": "Literal", + "value": 0.9203433427102556 + }, + { + "argument": { + "end": 28338, + "raw": "0.17343459369697545", + "start": 28319, + "type": "Literal", + "type": "Literal", + "value": 0.17343459369697545 + }, + "end": 28338, + "operator": "-", + "start": 28318, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 28345, + "start": 28282, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 28348, + "start": 28347, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 28281, + "name": "line", + "start": 28277, + "type": "Identifier" + }, + "end": 28349, + "start": 28277, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 28390, + "raw": "0.0017496234414517975", + "start": 28369, + "type": "Literal", + "type": "Literal", + "value": 0.0017496234414517975 + }, + { + "argument": { + "end": 28418, + "raw": "0.5178508316168335", + "start": 28400, + "type": "Literal", + "type": "Literal", + "value": 0.5178508316168335 + }, + "end": 28418, + "operator": "-", + "start": 28399, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 28425, + "start": 28360, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 28428, + "start": 28427, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 28359, + "name": "line", + "start": 28355, + "type": "Identifier" + }, + "end": 28429, + "start": 28355, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 28467, + "raw": "0.6206263405732759", + "start": 28449, + "type": "Literal", + "type": "Literal", + "value": 0.6206263405732759 + }, + { + "argument": { + "end": 28495, + "raw": "0.8733399468665124", + "start": 28477, + "type": "Literal", + "type": "Literal", + "value": 0.8733399468665124 + }, + "end": 28495, + "operator": "-", + "start": 28476, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 28502, + "start": 28440, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 28505, + "start": 28504, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 28439, + "name": "line", + "start": 28435, + "type": "Identifier" + }, + "end": 28506, + "start": 28435, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 28545, + "raw": "0.7776386664456383", + "start": 28527, + "type": "Literal", + "type": "Literal", + "value": 0.7776386664456383 + }, + "end": 28545, + "operator": "-", + "start": 28526, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 28572, + "raw": "0.7602780485384968", + "start": 28554, + "type": "Literal", + "type": "Literal", + "value": 0.7602780485384968 + } + ], + "end": 28579, + "start": 28517, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 28582, + "start": 28581, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 28516, + "name": "line", + "start": 28512, + "type": "Identifier" + }, + "end": 28583, + "start": 28512, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 28613, + "raw": "0.5439379760788592", + "start": 28595, + "type": "Literal", + "type": "Literal", + "value": 0.5439379760788592 + }, + { + "end": 28633, + "raw": "0.8449177589350552", + "start": 28615, + "type": "Literal", + "type": "Literal", + "value": 0.8449177589350552 + } + ], + "end": 28634, + "start": 28594, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 28637, + "start": 28636, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 28593, + "name": "line", + "start": 28589, + "type": "Identifier" + }, + "end": 28638, + "start": 28589, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 28678, + "raw": "0.13036646025917076", + "start": 28659, + "type": "Literal", + "type": "Literal", + "value": 0.13036646025917076 + }, + "end": 28678, + "operator": "-", + "start": 28658, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 28707, + "raw": "0.012051713627069693", + "start": 28687, + "type": "Literal", + "type": "Literal", + "value": 0.012051713627069693 + } + ], + "end": 28714, + "start": 28649, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 28717, + "start": 28716, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 28648, + "name": "line", + "start": 28644, + "type": "Identifier" + }, + "end": 28718, + "start": 28644, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 28757, + "raw": "0.1656465612645519", + "start": 28739, + "type": "Literal", + "type": "Literal", + "value": 0.1656465612645519 + }, + "end": 28757, + "operator": "-", + "start": 28738, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 28786, + "raw": "0.20775229173765486", + "start": 28767, + "type": "Literal", + "type": "Literal", + "value": 0.20775229173765486 + }, + "end": 28786, + "operator": "-", + "start": 28766, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 28793, + "start": 28729, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 28796, + "start": 28795, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 28728, + "name": "line", + "start": 28724, + "type": "Identifier" + }, + "end": 28797, + "start": 28724, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 28836, + "raw": "0.0962723255929061", + "start": 28818, + "type": "Literal", + "type": "Literal", + "value": 0.0962723255929061 + }, + "end": 28836, + "operator": "-", + "start": 28817, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 28865, + "raw": "0.05417797659066137", + "start": 28846, + "type": "Literal", + "type": "Literal", + "value": 0.05417797659066137 + }, + "end": 28865, + "operator": "-", + "start": 28845, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 28872, + "start": 28808, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 28875, + "start": 28874, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 28807, + "name": "line", + "start": 28803, + "type": "Identifier" + }, + "end": 28876, + "start": 28803, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 28905, + "raw": "0.902108945498191", + "start": 28888, + "type": "Literal", + "type": "Literal", + "value": 0.902108945498191 + }, + { + "end": 28925, + "raw": "0.3958978534964961", + "start": 28907, + "type": "Literal", + "type": "Literal", + "value": 0.3958978534964961 + } + ], + "end": 28926, + "start": 28887, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 28929, + "start": 28928, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 28886, + "name": "line", + "start": 28882, + "type": "Identifier" + }, + "end": 28930, + "start": 28882, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 28969, + "raw": "0.27997950083139167", + "start": 28950, + "type": "Literal", + "type": "Literal", + "value": 0.27997950083139167 + }, + { + "argument": { + "end": 28998, + "raw": "0.17778188444008958", + "start": 28979, + "type": "Literal", + "type": "Literal", + "value": 0.17778188444008958 + }, + "end": 28998, + "operator": "-", + "start": 28978, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 29005, + "start": 28941, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 29008, + "start": 29007, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 28940, + "name": "line", + "start": 28936, + "type": "Identifier" + }, + "end": 29009, + "start": 28936, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 29039, + "raw": "0.5235806061589545", + "start": 29021, + "type": "Literal", + "type": "Literal", + "value": 0.5235806061589545 + }, + { + "end": 29058, + "raw": "0.694318985642328", + "start": 29041, + "type": "Literal", + "type": "Literal", + "value": 0.694318985642328 + } + ], + "end": 29059, + "start": 29020, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 29062, + "start": 29061, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 29019, + "name": "line", + "start": 29015, + "type": "Identifier" + }, + "end": 29063, + "start": 29015, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 29102, + "raw": "0.39140760219992154", + "start": 29083, + "type": "Literal", + "type": "Literal", + "value": 0.39140760219992154 + }, + { + "argument": { + "end": 29130, + "raw": "0.7839795272576484", + "start": 29112, + "type": "Literal", + "type": "Literal", + "value": 0.7839795272576484 + }, + "end": 29130, + "operator": "-", + "start": 29111, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 29137, + "start": 29074, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 29140, + "start": 29139, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 29073, + "name": "line", + "start": 29069, + "type": "Identifier" + }, + "end": 29141, + "start": 29069, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 29171, + "raw": "0.8414243527073519", + "start": 29153, + "type": "Literal", + "type": "Literal", + "value": 0.8414243527073519 + }, + { + "end": 29191, + "raw": "0.5395591528940082", + "start": 29173, + "type": "Literal", + "type": "Literal", + "value": 0.5395591528940082 + } + ], + "end": 29192, + "start": 29152, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 29195, + "start": 29194, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 29151, + "name": "line", + "start": 29147, + "type": "Identifier" + }, + "end": 29196, + "start": 29147, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 29234, + "raw": "0.6137667704875602", + "start": 29216, + "type": "Literal", + "type": "Literal", + "value": 0.6137667704875602 + }, + { + "end": 29262, + "raw": "0.22119647516722085", + "start": 29243, + "type": "Literal", + "type": "Literal", + "value": 0.22119647516722085 + } + ], + "end": 29269, + "start": 29207, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 29272, + "start": 29271, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 29206, + "name": "line", + "start": 29202, + "type": "Identifier" + }, + "end": 29273, + "start": 29202, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 29303, + "raw": "0.8830488380766681", + "start": 29285, + "type": "Literal", + "type": "Literal", + "value": 0.8830488380766681 + }, + { + "end": 29323, + "raw": "0.6996724408425232", + "start": 29305, + "type": "Literal", + "type": "Literal", + "value": 0.6996724408425232 + } + ], + "end": 29324, + "start": 29284, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 29327, + "start": 29326, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 29283, + "name": "line", + "start": 29279, + "type": "Identifier" + }, + "end": 29328, + "start": 29279, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 29368, + "raw": "0.41290485754343953", + "start": 29349, + "type": "Literal", + "type": "Literal", + "value": 0.41290485754343953 + }, + "end": 29368, + "operator": "-", + "start": 29348, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 29396, + "raw": "0.4152647361760933", + "start": 29378, + "type": "Literal", + "type": "Literal", + "value": 0.4152647361760933 + }, + "end": 29396, + "operator": "-", + "start": 29377, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 29403, + "start": 29339, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 29406, + "start": 29405, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 29338, + "name": "line", + "start": 29334, + "type": "Identifier" + }, + "end": 29407, + "start": 29334, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 29445, + "raw": "0.5169538755575687", + "start": 29427, + "type": "Literal", + "type": "Literal", + "value": 0.5169538755575687 + }, + { + "argument": { + "end": 29473, + "raw": "0.9085567867302617", + "start": 29455, + "type": "Literal", + "type": "Literal", + "value": 0.9085567867302617 + }, + "end": 29473, + "operator": "-", + "start": 29454, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 29480, + "start": 29418, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 29483, + "start": 29482, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 29417, + "name": "line", + "start": 29413, + "type": "Identifier" + }, + "end": 29484, + "start": 29413, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 29523, + "raw": "0.6716353749059765", + "start": 29505, + "type": "Literal", + "type": "Literal", + "value": 0.6716353749059765 + }, + "end": 29523, + "operator": "-", + "start": 29504, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 29551, + "raw": "0.9605576808879026", + "start": 29533, + "type": "Literal", + "type": "Literal", + "value": 0.9605576808879026 + }, + "end": 29551, + "operator": "-", + "start": 29532, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 29558, + "start": 29495, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 29561, + "start": 29560, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 29494, + "name": "line", + "start": 29490, + "type": "Identifier" + }, + "end": 29562, + "start": 29490, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 29602, + "raw": "0.010280170930300203", + "start": 29582, + "type": "Literal", + "type": "Literal", + "value": 0.010280170930300203 + }, + { + "argument": { + "end": 29631, + "raw": "0.37344123662342166", + "start": 29612, + "type": "Literal", + "type": "Literal", + "value": 0.37344123662342166 + }, + "end": 29631, + "operator": "-", + "start": 29611, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 29638, + "start": 29573, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 29641, + "start": 29640, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 29572, + "name": "line", + "start": 29568, + "type": "Identifier" + }, + "end": 29642, + "start": 29568, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 29681, + "raw": "0.10357375682791004", + "start": 29662, + "type": "Literal", + "type": "Literal", + "value": 0.10357375682791004 + }, + { + "argument": { + "end": 29710, + "raw": "0.42294321030821425", + "start": 29691, + "type": "Literal", + "type": "Literal", + "value": 0.42294321030821425 + }, + "end": 29710, + "operator": "-", + "start": 29690, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 29717, + "start": 29653, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 29720, + "start": 29719, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 29652, + "name": "line", + "start": 29648, + "type": "Identifier" + }, + "end": 29721, + "start": 29648, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 29759, + "raw": "0.4520311575096987", + "start": 29741, + "type": "Literal", + "type": "Literal", + "value": 0.4520311575096987 + }, + { + "argument": { + "end": 29788, + "raw": "0.11232675307600548", + "start": 29769, + "type": "Literal", + "type": "Literal", + "value": 0.11232675307600548 + }, + "end": 29788, + "operator": "-", + "start": 29768, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 29795, + "start": 29732, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 29798, + "start": 29797, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 29731, + "name": "line", + "start": 29727, + "type": "Identifier" + }, + "end": 29799, + "start": 29727, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 29838, + "raw": "0.8821185914380845", + "start": 29820, + "type": "Literal", + "type": "Literal", + "value": 0.8821185914380845 + }, + "end": 29838, + "operator": "-", + "start": 29819, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 29866, + "raw": "0.7155147434939819", + "start": 29848, + "type": "Literal", + "type": "Literal", + "value": 0.7155147434939819 + }, + "end": 29866, + "operator": "-", + "start": 29847, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 29873, + "start": 29810, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 29876, + "start": 29875, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 29809, + "name": "line", + "start": 29805, + "type": "Identifier" + }, + "end": 29877, + "start": 29805, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 29907, + "raw": "0.9195487101690416", + "start": 29889, + "type": "Literal", + "type": "Literal", + "value": 0.9195487101690416 + }, + { + "end": 29927, + "raw": "0.2691627465297364", + "start": 29909, + "type": "Literal", + "type": "Literal", + "value": 0.2691627465297364 + } + ], + "end": 29928, + "start": 29888, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 29931, + "start": 29930, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 29887, + "name": "line", + "start": 29883, + "type": "Identifier" + }, + "end": 29932, + "start": 29883, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 29970, + "raw": "0.7098978191546745", + "start": 29952, + "type": "Literal", + "type": "Literal", + "value": 0.7098978191546745 + }, + { + "end": 29998, + "raw": "0.11710004169385968", + "start": 29979, + "type": "Literal", + "type": "Literal", + "value": 0.11710004169385968 + } + ], + "end": 30005, + "start": 29943, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 30008, + "start": 30007, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 29942, + "name": "line", + "start": 29938, + "type": "Identifier" + }, + "end": 30009, + "start": 29938, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 30049, + "raw": "0.37876368560819995", + "start": 30030, + "type": "Literal", + "type": "Literal", + "value": 0.37876368560819995 + }, + "end": 30049, + "operator": "-", + "start": 30029, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 30076, + "raw": "0.7106729314759084", + "start": 30058, + "type": "Literal", + "type": "Literal", + "value": 0.7106729314759084 + } + ], + "end": 30083, + "start": 30020, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 30086, + "start": 30085, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 30019, + "name": "line", + "start": 30015, + "type": "Identifier" + }, + "end": 30087, + "start": 30015, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 30127, + "raw": "0.29728126898353335", + "start": 30108, + "type": "Literal", + "type": "Literal", + "value": 0.29728126898353335 + }, + "end": 30127, + "operator": "-", + "start": 30107, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 30156, + "raw": "0.06649734568328003", + "start": 30137, + "type": "Literal", + "type": "Literal", + "value": 0.06649734568328003 + }, + "end": 30156, + "operator": "-", + "start": 30136, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 30163, + "start": 30098, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 30166, + "start": 30165, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 30097, + "name": "line", + "start": 30093, + "type": "Identifier" + }, + "end": 30167, + "start": 30093, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 30206, + "raw": "0.22965781558352072", + "start": 30187, + "type": "Literal", + "type": "Literal", + "value": 0.22965781558352072 + }, + { + "argument": { + "end": 30234, + "raw": "0.7601866432836641", + "start": 30216, + "type": "Literal", + "type": "Literal", + "value": 0.7601866432836641 + }, + "end": 30234, + "operator": "-", + "start": 30215, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 30241, + "start": 30178, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 30244, + "start": 30243, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 30177, + "name": "line", + "start": 30173, + "type": "Identifier" + }, + "end": 30245, + "start": 30173, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 30284, + "raw": "0.6356501074317229", + "start": 30266, + "type": "Literal", + "type": "Literal", + "value": 0.6356501074317229 + }, + "end": 30284, + "operator": "-", + "start": 30265, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 30312, + "raw": "0.19458425399338064", + "start": 30293, + "type": "Literal", + "type": "Literal", + "value": 0.19458425399338064 + } + ], + "end": 30319, + "start": 30256, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 30322, + "start": 30321, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 30255, + "name": "line", + "start": 30251, + "type": "Identifier" + }, + "end": 30323, + "start": 30251, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 30353, + "raw": "0.5721251777404546", + "start": 30335, + "type": "Literal", + "type": "Literal", + "value": 0.5721251777404546 + }, + { + "end": 30373, + "raw": "0.2888584097921527", + "start": 30355, + "type": "Literal", + "type": "Literal", + "value": 0.2888584097921527 + } + ], + "end": 30374, + "start": 30334, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 30377, + "start": 30376, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 30333, + "name": "line", + "start": 30329, + "type": "Identifier" + }, + "end": 30378, + "start": 30329, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 30417, + "raw": "0.9580409549552311", + "start": 30399, + "type": "Literal", + "type": "Literal", + "value": 0.9580409549552311 + }, + "end": 30417, + "operator": "-", + "start": 30398, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 30446, + "raw": "0.02243818192078395", + "start": 30427, + "type": "Literal", + "type": "Literal", + "value": 0.02243818192078395 + }, + "end": 30446, + "operator": "-", + "start": 30426, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 30453, + "start": 30389, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 30456, + "start": 30455, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 30388, + "name": "line", + "start": 30384, + "type": "Identifier" + }, + "end": 30457, + "start": 30384, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 30495, + "raw": "0.3299184618602866", + "start": 30477, + "type": "Literal", + "type": "Literal", + "value": 0.3299184618602866 + }, + { + "argument": { + "end": 30523, + "raw": "0.8353726942369875", + "start": 30505, + "type": "Literal", + "type": "Literal", + "value": 0.8353726942369875 + }, + "end": 30523, + "operator": "-", + "start": 30504, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 30530, + "start": 30468, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 30533, + "start": 30532, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 30467, + "name": "line", + "start": 30463, + "type": "Identifier" + }, + "end": 30534, + "start": 30463, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 30572, + "raw": "0.7434639386755209", + "start": 30554, + "type": "Literal", + "type": "Literal", + "value": 0.7434639386755209 + }, + { + "argument": { + "end": 30600, + "raw": "0.7919648864138378", + "start": 30582, + "type": "Literal", + "type": "Literal", + "value": 0.7919648864138378 + }, + "end": 30600, + "operator": "-", + "start": 30581, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 30607, + "start": 30545, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 30610, + "start": 30609, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 30544, + "name": "line", + "start": 30540, + "type": "Identifier" + }, + "end": 30611, + "start": 30540, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 30641, + "raw": "0.9935751011164615", + "start": 30623, + "type": "Literal", + "type": "Literal", + "value": 0.9935751011164615 + }, + { + "end": 30661, + "raw": "0.9042566468497608", + "start": 30643, + "type": "Literal", + "type": "Literal", + "value": 0.9042566468497608 + } + ], + "end": 30662, + "start": 30622, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 30665, + "start": 30664, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 30621, + "name": "line", + "start": 30617, + "type": "Identifier" + }, + "end": 30666, + "start": 30617, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 30705, + "raw": "0.5035812884687294", + "start": 30687, + "type": "Literal", + "type": "Literal", + "value": 0.5035812884687294 + }, + "end": 30705, + "operator": "-", + "start": 30686, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 30732, + "raw": "0.5150967434989442", + "start": 30714, + "type": "Literal", + "type": "Literal", + "value": 0.5150967434989442 + } + ], + "end": 30739, + "start": 30677, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 30742, + "start": 30741, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 30676, + "name": "line", + "start": 30672, + "type": "Identifier" + }, + "end": 30743, + "start": 30672, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 30773, + "raw": "0.5526227215900215", + "start": 30755, + "type": "Literal", + "type": "Literal", + "value": 0.5526227215900215 + }, + { + "end": 30793, + "raw": "0.7612604137272441", + "start": 30775, + "type": "Literal", + "type": "Literal", + "value": 0.7612604137272441 + } + ], + "end": 30794, + "start": 30754, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 30797, + "start": 30796, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 30753, + "name": "line", + "start": 30749, + "type": "Identifier" + }, + "end": 30798, + "start": 30749, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 30836, + "raw": "0.8593271349126876", + "start": 30818, + "type": "Literal", + "type": "Literal", + "value": 0.8593271349126876 + }, + { + "end": 30864, + "raw": "0.08414894953725849", + "start": 30845, + "type": "Literal", + "type": "Literal", + "value": 0.08414894953725849 + } + ], + "end": 30871, + "start": 30809, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 30874, + "start": 30873, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 30808, + "name": "line", + "start": 30804, + "type": "Identifier" + }, + "end": 30875, + "start": 30804, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 30914, + "raw": "0.8181049219192864", + "start": 30896, + "type": "Literal", + "type": "Literal", + "value": 0.8181049219192864 + }, + "end": 30914, + "operator": "-", + "start": 30895, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 30941, + "raw": "0.903548131323352", + "start": 30924, + "type": "Literal", + "type": "Literal", + "value": 0.903548131323352 + }, + "end": 30941, + "operator": "-", + "start": 30923, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 30948, + "start": 30886, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 30951, + "start": 30950, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 30885, + "name": "line", + "start": 30881, + "type": "Identifier" + }, + "end": 30952, + "start": 30881, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 30990, + "raw": "0.3165782044458305", + "start": 30972, + "type": "Literal", + "type": "Literal", + "value": 0.3165782044458305 + }, + { + "argument": { + "end": 31019, + "raw": "0.24189274252014914", + "start": 31000, + "type": "Literal", + "type": "Literal", + "value": 0.24189274252014914 + }, + "end": 31019, + "operator": "-", + "start": 30999, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 31026, + "start": 30963, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 31029, + "start": 31028, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 30962, + "name": "line", + "start": 30958, + "type": "Identifier" + }, + "end": 31030, + "start": 30958, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 31070, + "raw": "0.44390956414045135", + "start": 31051, + "type": "Literal", + "type": "Literal", + "value": 0.44390956414045135 + }, + "end": 31070, + "operator": "-", + "start": 31050, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 31099, + "raw": "0.25912591535126905", + "start": 31080, + "type": "Literal", + "type": "Literal", + "value": 0.25912591535126905 + }, + "end": 31099, + "operator": "-", + "start": 31079, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 31106, + "start": 31041, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 31109, + "start": 31108, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 31040, + "name": "line", + "start": 31036, + "type": "Identifier" + }, + "end": 31110, + "start": 31036, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 31149, + "raw": "0.6605165911891009", + "start": 31131, + "type": "Literal", + "type": "Literal", + "value": 0.6605165911891009 + }, + "end": 31149, + "operator": "-", + "start": 31130, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 31178, + "raw": "0.40355115288839194", + "start": 31159, + "type": "Literal", + "type": "Literal", + "value": 0.40355115288839194 + }, + "end": 31178, + "operator": "-", + "start": 31158, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 31185, + "start": 31121, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 31188, + "start": 31187, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 31120, + "name": "line", + "start": 31116, + "type": "Identifier" + }, + "end": 31189, + "start": 31116, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 31228, + "raw": "0.7170489950180006", + "start": 31210, + "type": "Literal", + "type": "Literal", + "value": 0.7170489950180006 + }, + "end": 31228, + "operator": "-", + "start": 31209, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 31256, + "raw": "0.23454356079651384", + "start": 31237, + "type": "Literal", + "type": "Literal", + "value": 0.23454356079651384 + } + ], + "end": 31263, + "start": 31200, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 31266, + "start": 31265, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 31199, + "name": "line", + "start": 31195, + "type": "Identifier" + }, + "end": 31267, + "start": 31195, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 31306, + "raw": "0.2568187045379722", + "start": 31288, + "type": "Literal", + "type": "Literal", + "value": 0.2568187045379722 + }, + "end": 31306, + "operator": "-", + "start": 31287, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 31335, + "raw": "0.45031188717601367", + "start": 31316, + "type": "Literal", + "type": "Literal", + "value": 0.45031188717601367 + }, + "end": 31335, + "operator": "-", + "start": 31315, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 31342, + "start": 31278, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 31345, + "start": 31344, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 31277, + "name": "line", + "start": 31273, + "type": "Identifier" + }, + "end": 31346, + "start": 31273, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 31384, + "raw": "0.6751951211858687", + "start": 31366, + "type": "Literal", + "type": "Literal", + "value": 0.6751951211858687 + }, + { + "argument": { + "end": 31412, + "raw": "0.9709424233465593", + "start": 31394, + "type": "Literal", + "type": "Literal", + "value": 0.9709424233465593 + }, + "end": 31412, + "operator": "-", + "start": 31393, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 31419, + "start": 31357, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 31422, + "start": 31421, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 31356, + "name": "line", + "start": 31352, + "type": "Identifier" + }, + "end": 31423, + "start": 31352, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 31462, + "raw": "0.5689619842972184", + "start": 31444, + "type": "Literal", + "type": "Literal", + "value": 0.5689619842972184 + }, + "end": 31462, + "operator": "-", + "start": 31443, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 31489, + "raw": "0.5918969913790362", + "start": 31471, + "type": "Literal", + "type": "Literal", + "value": 0.5918969913790362 + } + ], + "end": 31496, + "start": 31434, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 31499, + "start": 31498, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 31433, + "name": "line", + "start": 31429, + "type": "Identifier" + }, + "end": 31500, + "start": 31429, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 31539, + "raw": "0.8328324229085962", + "start": 31521, + "type": "Literal", + "type": "Literal", + "value": 0.8328324229085962 + }, + "end": 31539, + "operator": "-", + "start": 31520, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 31566, + "raw": "0.4677492878818803", + "start": 31548, + "type": "Literal", + "type": "Literal", + "value": 0.4677492878818803 + } + ], + "end": 31573, + "start": 31511, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 31576, + "start": 31575, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 31510, + "name": "line", + "start": 31506, + "type": "Identifier" + }, + "end": 31577, + "start": 31506, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 31616, + "raw": "0.8111463382182231", + "start": 31598, + "type": "Literal", + "type": "Literal", + "value": 0.8111463382182231 + }, + "end": 31616, + "operator": "-", + "start": 31597, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 31645, + "raw": "0.41814807547140576", + "start": 31626, + "type": "Literal", + "type": "Literal", + "value": 0.41814807547140576 + }, + "end": 31645, + "operator": "-", + "start": 31625, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 31652, + "start": 31588, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 31655, + "start": 31654, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 31587, + "name": "line", + "start": 31583, + "type": "Identifier" + }, + "end": 31656, + "start": 31583, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 31695, + "raw": "0.03807684940941125", + "start": 31676, + "type": "Literal", + "type": "Literal", + "value": 0.03807684940941125 + }, + { + "end": 31723, + "raw": "0.25664826686353326", + "start": 31704, + "type": "Literal", + "type": "Literal", + "value": 0.25664826686353326 + } + ], + "end": 31730, + "start": 31667, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 31733, + "start": 31732, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 31666, + "name": "line", + "start": 31662, + "type": "Identifier" + }, + "end": 31734, + "start": 31662, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 31773, + "raw": "0.23950083339596384", + "start": 31754, + "type": "Literal", + "type": "Literal", + "value": 0.23950083339596384 + }, + { + "end": 31801, + "raw": "0.43693196301855575", + "start": 31782, + "type": "Literal", + "type": "Literal", + "value": 0.43693196301855575 + } + ], + "end": 31808, + "start": 31745, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 31811, + "start": 31810, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 31744, + "name": "line", + "start": 31740, + "type": "Identifier" + }, + "end": 31812, + "start": 31740, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 31852, + "raw": "0.16279444820904887", + "start": 31833, + "type": "Literal", + "type": "Literal", + "value": 0.16279444820904887 + }, + "end": 31852, + "operator": "-", + "start": 31832, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 31879, + "raw": "0.8064475707664818", + "start": 31861, + "type": "Literal", + "type": "Literal", + "value": 0.8064475707664818 + } + ], + "end": 31886, + "start": 31823, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 31889, + "start": 31888, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 31822, + "name": "line", + "start": 31818, + "type": "Identifier" + }, + "end": 31890, + "start": 31818, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 31930, + "raw": "0.08972872009232558", + "start": 31911, + "type": "Literal", + "type": "Literal", + "value": 0.08972872009232558 + }, + "end": 31930, + "operator": "-", + "start": 31910, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 31959, + "raw": "0.08887625823751266", + "start": 31940, + "type": "Literal", + "type": "Literal", + "value": 0.08887625823751266 + }, + "end": 31959, + "operator": "-", + "start": 31939, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 31966, + "start": 31901, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 31969, + "start": 31968, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 31900, + "name": "line", + "start": 31896, + "type": "Identifier" + }, + "end": 31970, + "start": 31896, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 32008, + "raw": "0.9203433427102556", + "start": 31990, + "type": "Literal", + "type": "Literal", + "value": 0.9203433427102556 + }, + { + "argument": { + "end": 32037, + "raw": "0.17343459369697545", + "start": 32018, + "type": "Literal", + "type": "Literal", + "value": 0.17343459369697545 + }, + "end": 32037, + "operator": "-", + "start": 32017, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 32044, + "start": 31981, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 32047, + "start": 32046, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 31980, + "name": "line", + "start": 31976, + "type": "Identifier" + }, + "end": 32048, + "start": 31976, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 32089, + "raw": "0.0017496234414517975", + "start": 32068, + "type": "Literal", + "type": "Literal", + "value": 0.0017496234414517975 + }, + { + "argument": { + "end": 32117, + "raw": "0.5178508316168335", + "start": 32099, + "type": "Literal", + "type": "Literal", + "value": 0.5178508316168335 + }, + "end": 32117, + "operator": "-", + "start": 32098, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 32124, + "start": 32059, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 32127, + "start": 32126, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 32058, + "name": "line", + "start": 32054, + "type": "Identifier" + }, + "end": 32128, + "start": 32054, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 32166, + "raw": "0.6206263405732759", + "start": 32148, + "type": "Literal", + "type": "Literal", + "value": 0.6206263405732759 + }, + { + "argument": { + "end": 32194, + "raw": "0.8733399468665124", + "start": 32176, + "type": "Literal", + "type": "Literal", + "value": 0.8733399468665124 + }, + "end": 32194, + "operator": "-", + "start": 32175, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 32201, + "start": 32139, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 32204, + "start": 32203, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 32138, + "name": "line", + "start": 32134, + "type": "Identifier" + }, + "end": 32205, + "start": 32134, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 32244, + "raw": "0.7776386664456383", + "start": 32226, + "type": "Literal", + "type": "Literal", + "value": 0.7776386664456383 + }, + "end": 32244, + "operator": "-", + "start": 32225, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 32271, + "raw": "0.7602780485384968", + "start": 32253, + "type": "Literal", + "type": "Literal", + "value": 0.7602780485384968 + } + ], + "end": 32278, + "start": 32216, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 32281, + "start": 32280, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 32215, + "name": "line", + "start": 32211, + "type": "Identifier" + }, + "end": 32282, + "start": 32211, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 32312, + "raw": "0.5439379760788592", + "start": 32294, + "type": "Literal", + "type": "Literal", + "value": 0.5439379760788592 + }, + { + "end": 32332, + "raw": "0.8449177589350552", + "start": 32314, + "type": "Literal", + "type": "Literal", + "value": 0.8449177589350552 + } + ], + "end": 32333, + "start": 32293, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 32336, + "start": 32335, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 32292, + "name": "line", + "start": 32288, + "type": "Identifier" + }, + "end": 32337, + "start": 32288, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 32377, + "raw": "0.13036646025917076", + "start": 32358, + "type": "Literal", + "type": "Literal", + "value": 0.13036646025917076 + }, + "end": 32377, + "operator": "-", + "start": 32357, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 32406, + "raw": "0.012051713627069693", + "start": 32386, + "type": "Literal", + "type": "Literal", + "value": 0.012051713627069693 + } + ], + "end": 32413, + "start": 32348, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 32416, + "start": 32415, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 32347, + "name": "line", + "start": 32343, + "type": "Identifier" + }, + "end": 32417, + "start": 32343, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 32456, + "raw": "0.1656465612645519", + "start": 32438, + "type": "Literal", + "type": "Literal", + "value": 0.1656465612645519 + }, + "end": 32456, + "operator": "-", + "start": 32437, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 32485, + "raw": "0.20775229173765486", + "start": 32466, + "type": "Literal", + "type": "Literal", + "value": 0.20775229173765486 + }, + "end": 32485, + "operator": "-", + "start": 32465, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 32492, + "start": 32428, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 32495, + "start": 32494, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 32427, + "name": "line", + "start": 32423, + "type": "Identifier" + }, + "end": 32496, + "start": 32423, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 32535, + "raw": "0.0962723255929061", + "start": 32517, + "type": "Literal", + "type": "Literal", + "value": 0.0962723255929061 + }, + "end": 32535, + "operator": "-", + "start": 32516, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 32564, + "raw": "0.05417797659066137", + "start": 32545, + "type": "Literal", + "type": "Literal", + "value": 0.05417797659066137 + }, + "end": 32564, + "operator": "-", + "start": 32544, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 32571, + "start": 32507, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 32574, + "start": 32573, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 32506, + "name": "line", + "start": 32502, + "type": "Identifier" + }, + "end": 32575, + "start": 32502, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 32604, + "raw": "0.902108945498191", + "start": 32587, + "type": "Literal", + "type": "Literal", + "value": 0.902108945498191 + }, + { + "end": 32624, + "raw": "0.3958978534964961", + "start": 32606, + "type": "Literal", + "type": "Literal", + "value": 0.3958978534964961 + } + ], + "end": 32625, + "start": 32586, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 32628, + "start": 32627, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 32585, + "name": "line", + "start": 32581, + "type": "Identifier" + }, + "end": 32629, + "start": 32581, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 32668, + "raw": "0.27997950083139167", + "start": 32649, + "type": "Literal", + "type": "Literal", + "value": 0.27997950083139167 + }, + { + "argument": { + "end": 32697, + "raw": "0.17778188444008958", + "start": 32678, + "type": "Literal", + "type": "Literal", + "value": 0.17778188444008958 + }, + "end": 32697, + "operator": "-", + "start": 32677, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 32704, + "start": 32640, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 32707, + "start": 32706, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 32639, + "name": "line", + "start": 32635, + "type": "Identifier" + }, + "end": 32708, + "start": 32635, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 32738, + "raw": "0.5235806061589545", + "start": 32720, + "type": "Literal", + "type": "Literal", + "value": 0.5235806061589545 + }, + { + "end": 32757, + "raw": "0.694318985642328", + "start": 32740, + "type": "Literal", + "type": "Literal", + "value": 0.694318985642328 + } + ], + "end": 32758, + "start": 32719, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 32761, + "start": 32760, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 32718, + "name": "line", + "start": 32714, + "type": "Identifier" + }, + "end": 32762, + "start": 32714, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 32801, + "raw": "0.39140760219992154", + "start": 32782, + "type": "Literal", + "type": "Literal", + "value": 0.39140760219992154 + }, + { + "argument": { + "end": 32829, + "raw": "0.7839795272576484", + "start": 32811, + "type": "Literal", + "type": "Literal", + "value": 0.7839795272576484 + }, + "end": 32829, + "operator": "-", + "start": 32810, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 32836, + "start": 32773, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 32839, + "start": 32838, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 32772, + "name": "line", + "start": 32768, + "type": "Identifier" + }, + "end": 32840, + "start": 32768, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 32870, + "raw": "0.8414243527073519", + "start": 32852, + "type": "Literal", + "type": "Literal", + "value": 0.8414243527073519 + }, + { + "end": 32890, + "raw": "0.5395591528940082", + "start": 32872, + "type": "Literal", + "type": "Literal", + "value": 0.5395591528940082 + } + ], + "end": 32891, + "start": 32851, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 32894, + "start": 32893, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 32850, + "name": "line", + "start": 32846, + "type": "Identifier" + }, + "end": 32895, + "start": 32846, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 32933, + "raw": "0.6137667704875602", + "start": 32915, + "type": "Literal", + "type": "Literal", + "value": 0.6137667704875602 + }, + { + "end": 32961, + "raw": "0.22119647516722085", + "start": 32942, + "type": "Literal", + "type": "Literal", + "value": 0.22119647516722085 + } + ], + "end": 32968, + "start": 32906, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 32971, + "start": 32970, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 32905, + "name": "line", + "start": 32901, + "type": "Identifier" + }, + "end": 32972, + "start": 32901, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 33012, + "raw": "0.09582414374469184", + "start": 32993, + "type": "Literal", + "type": "Literal", + "value": 0.09582414374469184 + }, + "end": 33012, + "operator": "-", + "start": 32992, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 33040, + "raw": "0.7533839681212353", + "start": 33022, + "type": "Literal", + "type": "Literal", + "value": 0.7533839681212353 + }, + "end": 33040, + "operator": "-", + "start": 33021, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 33047, + "start": 32983, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 33050, + "start": 33049, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 32982, + "name": "line", + "start": 32978, + "type": "Identifier" + }, + "end": 33051, + "start": 32978, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 33091, + "raw": "0.17254116580051848", + "start": 33072, + "type": "Literal", + "type": "Literal", + "value": 0.17254116580051848 + }, + "end": 33091, + "operator": "-", + "start": 33071, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 33119, + "raw": "0.7669113400341137", + "start": 33101, + "type": "Literal", + "type": "Literal", + "value": 0.7669113400341137 + }, + "end": 33119, + "operator": "-", + "start": 33100, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 33126, + "start": 33062, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 33129, + "start": 33128, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 33061, + "name": "line", + "start": 33057, + "type": "Identifier" + }, + "end": 33130, + "start": 33057, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 33160, + "raw": "0.8944730032887609", + "start": 33142, + "type": "Literal", + "type": "Literal", + "value": 0.8944730032887609 + }, + { + "end": 33180, + "raw": "0.6093318694741408", + "start": 33162, + "type": "Literal", + "type": "Literal", + "value": 0.6093318694741408 + } + ], + "end": 33181, + "start": 33141, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 33184, + "start": 33183, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 33140, + "name": "line", + "start": 33136, + "type": "Identifier" + }, + "end": 33185, + "start": 33136, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 33225, + "raw": "0.41290485754343953", + "start": 33206, + "type": "Literal", + "type": "Literal", + "value": 0.41290485754343953 + }, + "end": 33225, + "operator": "-", + "start": 33205, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 33253, + "raw": "0.4152647361760933", + "start": 33235, + "type": "Literal", + "type": "Literal", + "value": 0.4152647361760933 + }, + "end": 33253, + "operator": "-", + "start": 33234, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 33260, + "start": 33196, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 33263, + "start": 33262, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 33195, + "name": "line", + "start": 33191, + "type": "Identifier" + }, + "end": 33264, + "start": 33191, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 33302, + "raw": "0.5169538755575687", + "start": 33284, + "type": "Literal", + "type": "Literal", + "value": 0.5169538755575687 + }, + { + "argument": { + "end": 33330, + "raw": "0.9085567867302617", + "start": 33312, + "type": "Literal", + "type": "Literal", + "value": 0.9085567867302617 + }, + "end": 33330, + "operator": "-", + "start": 33311, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 33337, + "start": 33275, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 33340, + "start": 33339, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 33274, + "name": "line", + "start": 33270, + "type": "Identifier" + }, + "end": 33341, + "start": 33270, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 33379, + "raw": "0.6751951211858687", + "start": 33361, + "type": "Literal", + "type": "Literal", + "value": 0.6751951211858687 + }, + { + "argument": { + "end": 33407, + "raw": "0.9709424233465593", + "start": 33389, + "type": "Literal", + "type": "Literal", + "value": 0.9709424233465593 + }, + "end": 33407, + "operator": "-", + "start": 33388, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 33414, + "start": 33352, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 33417, + "start": 33416, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 33351, + "name": "line", + "start": 33347, + "type": "Identifier" + }, + "end": 33418, + "start": 33347, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 33457, + "raw": "0.5689619842972184", + "start": 33439, + "type": "Literal", + "type": "Literal", + "value": 0.5689619842972184 + }, + "end": 33457, + "operator": "-", + "start": 33438, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 33484, + "raw": "0.5918969913790362", + "start": 33466, + "type": "Literal", + "type": "Literal", + "value": 0.5918969913790362 + } + ], + "end": 33491, + "start": 33429, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 33494, + "start": 33493, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 33428, + "name": "line", + "start": 33424, + "type": "Identifier" + }, + "end": 33495, + "start": 33424, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 33533, + "raw": "0.9464450621708211", + "start": 33515, + "type": "Literal", + "type": "Literal", + "value": 0.9464450621708211 + }, + { + "argument": { + "end": 33561, + "raw": "0.2684908127803667", + "start": 33543, + "type": "Literal", + "type": "Literal", + "value": 0.2684908127803667 + }, + "end": 33561, + "operator": "-", + "start": 33542, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 33568, + "start": 33506, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 33571, + "start": 33570, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 33505, + "name": "line", + "start": 33501, + "type": "Identifier" + }, + "end": 33572, + "start": 33501, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 33602, + "raw": "0.5241732366617591", + "start": 33584, + "type": "Literal", + "type": "Literal", + "value": 0.5241732366617591 + }, + { + "end": 33622, + "raw": "0.9011437416408563", + "start": 33604, + "type": "Literal", + "type": "Literal", + "value": 0.9011437416408563 + } + ], + "end": 33623, + "start": 33583, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 33626, + "start": 33625, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 33582, + "name": "line", + "start": 33578, + "type": "Identifier" + }, + "end": 33627, + "start": 33578, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 33667, + "raw": "0.14255393713960607", + "start": 33648, + "type": "Literal", + "type": "Literal", + "value": 0.14255393713960607 + }, + "end": 33667, + "operator": "-", + "start": 33647, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 33695, + "raw": "0.5194262624564814", + "start": 33677, + "type": "Literal", + "type": "Literal", + "value": 0.5194262624564814 + }, + "end": 33695, + "operator": "-", + "start": 33676, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 33702, + "start": 33638, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 33705, + "start": 33704, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 33637, + "name": "line", + "start": 33633, + "type": "Identifier" + }, + "end": 33706, + "start": 33633, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 33745, + "raw": "0.4287123231350338", + "start": 33727, + "type": "Literal", + "type": "Literal", + "value": 0.4287123231350338 + }, + "end": 33745, + "operator": "-", + "start": 33726, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 33773, + "raw": "0.4223564528725028", + "start": 33755, + "type": "Literal", + "type": "Literal", + "value": 0.4223564528725028 + }, + "end": 33773, + "operator": "-", + "start": 33754, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 33780, + "start": 33717, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 33783, + "start": 33782, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 33716, + "name": "line", + "start": 33712, + "type": "Identifier" + }, + "end": 33784, + "start": 33712, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 33824, + "raw": "0.09316367294024519", + "start": 33805, + "type": "Literal", + "type": "Literal", + "value": 0.09316367294024519 + }, + "end": 33824, + "operator": "-", + "start": 33804, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 33852, + "raw": "0.9063127021008246", + "start": 33834, + "type": "Literal", + "type": "Literal", + "value": 0.9063127021008246 + }, + "end": 33852, + "operator": "-", + "start": 33833, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 33859, + "start": 33795, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 33862, + "start": 33861, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 33794, + "name": "line", + "start": 33790, + "type": "Identifier" + }, + "end": 33863, + "start": 33790, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 33902, + "raw": "0.2767766535558669", + "start": 33884, + "type": "Literal", + "type": "Literal", + "value": 0.2767766535558669 + }, + "end": 33902, + "operator": "-", + "start": 33883, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 33929, + "raw": "0.6816248114129131", + "start": 33911, + "type": "Literal", + "type": "Literal", + "value": 0.6816248114129131 + } + ], + "end": 33936, + "start": 33874, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 33939, + "start": 33938, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 33873, + "name": "line", + "start": 33869, + "type": "Identifier" + }, + "end": 33940, + "start": 33869, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 33978, + "raw": "0.9796762495562534", + "start": 33960, + "type": "Literal", + "type": "Literal", + "value": 0.9796762495562534 + }, + { + "argument": { + "end": 34006, + "raw": "0.0822145668330625", + "start": 33988, + "type": "Literal", + "type": "Literal", + "value": 0.0822145668330625 + }, + "end": 34006, + "operator": "-", + "start": 33987, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 34013, + "start": 33951, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 34016, + "start": 34015, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 33950, + "name": "line", + "start": 33946, + "type": "Identifier" + }, + "end": 34017, + "start": 33946, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 34056, + "raw": "0.8666513070867441", + "start": 34038, + "type": "Literal", + "type": "Literal", + "value": 0.8666513070867441 + }, + "end": 34056, + "operator": "-", + "start": 34037, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 34083, + "raw": "0.301053160242023", + "start": 34066, + "type": "Literal", + "type": "Literal", + "value": 0.301053160242023 + }, + "end": 34083, + "operator": "-", + "start": 34065, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 34090, + "start": 34028, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 34093, + "start": 34092, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 34027, + "name": "line", + "start": 34023, + "type": "Identifier" + }, + "end": 34094, + "start": 34023, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 34131, + "raw": "0.537415656028112", + "start": 34114, + "type": "Literal", + "type": "Literal", + "value": 0.537415656028112 + }, + { + "end": 34160, + "raw": "0.020272692875002774", + "start": 34140, + "type": "Literal", + "type": "Literal", + "value": 0.020272692875002774 + } + ], + "end": 34167, + "start": 34105, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 34170, + "start": 34169, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 34104, + "name": "line", + "start": 34100, + "type": "Identifier" + }, + "end": 34171, + "start": 34100, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 34209, + "raw": "0.9332396256457531", + "start": 34191, + "type": "Literal", + "type": "Literal", + "value": 0.9332396256457531 + }, + { + "argument": { + "end": 34237, + "raw": "0.6228175690649898", + "start": 34219, + "type": "Literal", + "type": "Literal", + "value": 0.6228175690649898 + }, + "end": 34237, + "operator": "-", + "start": 34218, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 34244, + "start": 34182, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 34247, + "start": 34246, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 34181, + "name": "line", + "start": 34177, + "type": "Identifier" + }, + "end": 34248, + "start": 34177, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 34287, + "raw": "0.18052415837320734", + "start": 34268, + "type": "Literal", + "type": "Literal", + "value": 0.18052415837320734 + }, + { + "argument": { + "end": 34316, + "raw": "0.36894384647296197", + "start": 34297, + "type": "Literal", + "type": "Literal", + "value": 0.36894384647296197 + }, + "end": 34316, + "operator": "-", + "start": 34296, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 34323, + "start": 34259, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 34326, + "start": 34325, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 34258, + "name": "line", + "start": 34254, + "type": "Identifier" + }, + "end": 34327, + "start": 34254, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 34357, + "raw": "0.5384372634075449", + "start": 34339, + "type": "Literal", + "type": "Literal", + "value": 0.5384372634075449 + }, + { + "end": 34377, + "raw": "0.2377565050887107", + "start": 34359, + "type": "Literal", + "type": "Literal", + "value": 0.2377565050887107 + } + ], + "end": 34378, + "start": 34338, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 34381, + "start": 34380, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 34337, + "name": "line", + "start": 34333, + "type": "Identifier" + }, + "end": 34382, + "start": 34333, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 34421, + "raw": "0.39043436929278874", + "start": 34402, + "type": "Literal", + "type": "Literal", + "value": 0.39043436929278874 + }, + { + "end": 34449, + "raw": "0.14273182483160451", + "start": 34430, + "type": "Literal", + "type": "Literal", + "value": 0.14273182483160451 + } + ], + "end": 34456, + "start": 34393, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 34459, + "start": 34458, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 34392, + "name": "line", + "start": 34388, + "type": "Identifier" + }, + "end": 34460, + "start": 34388, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 34499, + "raw": "0.09782890412897283", + "start": 34480, + "type": "Literal", + "type": "Literal", + "value": 0.09782890412897283 + }, + { + "end": 34526, + "raw": "0.9907667536909659", + "start": 34508, + "type": "Literal", + "type": "Literal", + "value": 0.9907667536909659 + } + ], + "end": 34533, + "start": 34471, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 34536, + "start": 34535, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 34470, + "name": "line", + "start": 34466, + "type": "Identifier" + }, + "end": 34537, + "start": 34466, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 34575, + "raw": "0.5286610085921146", + "start": 34557, + "type": "Literal", + "type": "Literal", + "value": 0.5286610085921146 + }, + { + "argument": { + "end": 34603, + "raw": "0.7924508308419256", + "start": 34585, + "type": "Literal", + "type": "Literal", + "value": 0.7924508308419256 + }, + "end": 34603, + "operator": "-", + "start": 34584, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 34610, + "start": 34548, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 34613, + "start": 34612, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 34547, + "name": "line", + "start": 34543, + "type": "Identifier" + }, + "end": 34614, + "start": 34543, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 34652, + "raw": "0.3789978184503342", + "start": 34634, + "type": "Literal", + "type": "Literal", + "value": 0.3789978184503342 + }, + { + "end": 34680, + "raw": "0.12396120576838676", + "start": 34661, + "type": "Literal", + "type": "Literal", + "value": 0.12396120576838676 + } + ], + "end": 34687, + "start": 34625, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 34690, + "start": 34689, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 34624, + "name": "line", + "start": 34620, + "type": "Identifier" + }, + "end": 34691, + "start": 34620, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 34730, + "raw": "0.9484912744890612", + "start": 34712, + "type": "Literal", + "type": "Literal", + "value": 0.9484912744890612 + }, + "end": 34730, + "operator": "-", + "start": 34711, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 34757, + "raw": "0.6729649846476855", + "start": 34739, + "type": "Literal", + "type": "Literal", + "value": 0.6729649846476855 + } + ], + "end": 34764, + "start": 34702, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 34767, + "start": 34766, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 34701, + "name": "line", + "start": 34697, + "type": "Identifier" + }, + "end": 34768, + "start": 34697, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 34806, + "raw": "0.7451758753425153", + "start": 34788, + "type": "Literal", + "type": "Literal", + "value": 0.7451758753425153 + }, + { + "argument": { + "end": 34835, + "raw": "0.21318737562458967", + "start": 34816, + "type": "Literal", + "type": "Literal", + "value": 0.21318737562458967 + }, + "end": 34835, + "operator": "-", + "start": 34815, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 34842, + "start": 34779, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 34845, + "start": 34844, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 34778, + "name": "line", + "start": 34774, + "type": "Identifier" + }, + "end": 34846, + "start": 34774, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 34884, + "raw": "0.1873200727251887", + "start": 34866, + "type": "Literal", + "type": "Literal", + "value": 0.1873200727251887 + }, + { + "argument": { + "end": 34913, + "raw": "0.15961374297992448", + "start": 34894, + "type": "Literal", + "type": "Literal", + "value": 0.15961374297992448 + }, + "end": 34913, + "operator": "-", + "start": 34893, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 34920, + "start": 34857, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 34923, + "start": 34922, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 34856, + "name": "line", + "start": 34852, + "type": "Identifier" + }, + "end": 34924, + "start": 34852, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 34964, + "raw": "0.05729464924537564", + "start": 34945, + "type": "Literal", + "type": "Literal", + "value": 0.05729464924537564 + }, + "end": 34964, + "operator": "-", + "start": 34944, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 34992, + "raw": "0.5436345558508746", + "start": 34974, + "type": "Literal", + "type": "Literal", + "value": 0.5436345558508746 + }, + "end": 34992, + "operator": "-", + "start": 34973, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 34999, + "start": 34935, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 35002, + "start": 35001, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 34934, + "name": "line", + "start": 34930, + "type": "Identifier" + }, + "end": 35003, + "start": 34930, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 35043, + "raw": "0.09582414374469184", + "start": 35024, + "type": "Literal", + "type": "Literal", + "value": 0.09582414374469184 + }, + "end": 35043, + "operator": "-", + "start": 35023, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 35071, + "raw": "0.7533839681212353", + "start": 35053, + "type": "Literal", + "type": "Literal", + "value": 0.7533839681212353 + }, + "end": 35071, + "operator": "-", + "start": 35052, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 35078, + "start": 35014, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 35081, + "start": 35080, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 35013, + "name": "line", + "start": 35009, + "type": "Identifier" + }, + "end": 35082, + "start": 35009, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 35122, + "raw": "0.17254116580051848", + "start": 35103, + "type": "Literal", + "type": "Literal", + "value": 0.17254116580051848 + }, + "end": 35122, + "operator": "-", + "start": 35102, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 35150, + "raw": "0.7669113400341137", + "start": 35132, + "type": "Literal", + "type": "Literal", + "value": 0.7669113400341137 + }, + "end": 35150, + "operator": "-", + "start": 35131, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 35157, + "start": 35093, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 35160, + "start": 35159, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 35092, + "name": "line", + "start": 35088, + "type": "Identifier" + }, + "end": 35161, + "start": 35088, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 35191, + "raw": "0.8944730032887609", + "start": 35173, + "type": "Literal", + "type": "Literal", + "value": 0.8944730032887609 + }, + { + "end": 35211, + "raw": "0.6093318694741408", + "start": 35193, + "type": "Literal", + "type": "Literal", + "value": 0.6093318694741408 + } + ], + "end": 35212, + "start": 35172, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 35215, + "start": 35214, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 35171, + "name": "line", + "start": 35167, + "type": "Identifier" + }, + "end": 35216, + "start": 35167, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 35255, + "raw": "0.6238548626325471", + "start": 35237, + "type": "Literal", + "type": "Literal", + "value": 0.6238548626325471 + }, + "end": 35255, + "operator": "-", + "start": 35236, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 35282, + "raw": "0.4053626746020169", + "start": 35264, + "type": "Literal", + "type": "Literal", + "value": 0.4053626746020169 + } + ], + "end": 35289, + "start": 35227, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 35292, + "start": 35291, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 35226, + "name": "line", + "start": 35222, + "type": "Identifier" + }, + "end": 35293, + "start": 35222, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 35331, + "raw": "0.1379445992766417", + "start": 35313, + "type": "Literal", + "type": "Literal", + "value": 0.1379445992766417 + }, + { + "argument": { + "end": 35360, + "raw": "0.47871087958516045", + "start": 35341, + "type": "Literal", + "type": "Literal", + "value": 0.47871087958516045 + }, + "end": 35360, + "operator": "-", + "start": 35340, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 35367, + "start": 35304, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 35370, + "start": 35369, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 35303, + "name": "line", + "start": 35299, + "type": "Identifier" + }, + "end": 35371, + "start": 35299, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 35410, + "raw": "0.9516767113283946", + "start": 35392, + "type": "Literal", + "type": "Literal", + "value": 0.9516767113283946 + }, + "end": 35410, + "operator": "-", + "start": 35391, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 35437, + "raw": "0.8619900618578948", + "start": 35419, + "type": "Literal", + "type": "Literal", + "value": 0.8619900618578948 + } + ], + "end": 35444, + "start": 35382, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 35447, + "start": 35446, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 35381, + "name": "line", + "start": 35377, + "type": "Identifier" + }, + "end": 35448, + "start": 35377, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 35478, + "raw": "0.9398732950992088", + "start": 35460, + "type": "Literal", + "type": "Literal", + "value": 0.9398732950992088 + }, + { + "end": 35498, + "raw": "0.6326239915683629", + "start": 35480, + "type": "Literal", + "type": "Literal", + "value": 0.6326239915683629 + } + ], + "end": 35499, + "start": 35459, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 35502, + "start": 35501, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 35458, + "name": "line", + "start": 35454, + "type": "Identifier" + }, + "end": 35503, + "start": 35454, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 35542, + "raw": "0.8631974445502164", + "start": 35524, + "type": "Literal", + "type": "Literal", + "value": 0.8631974445502164 + }, + "end": 35542, + "operator": "-", + "start": 35523, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 35571, + "raw": "0.016153555523963137", + "start": 35551, + "type": "Literal", + "type": "Literal", + "value": 0.016153555523963137 + } + ], + "end": 35578, + "start": 35514, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 35581, + "start": 35580, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 35513, + "name": "line", + "start": 35509, + "type": "Identifier" + }, + "end": 35582, + "start": 35509, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 35621, + "raw": "0.19167797120152907", + "start": 35602, + "type": "Literal", + "type": "Literal", + "value": 0.19167797120152907 + }, + { + "argument": { + "end": 35649, + "raw": "0.4916414381703984", + "start": 35631, + "type": "Literal", + "type": "Literal", + "value": 0.4916414381703984 + }, + "end": 35649, + "operator": "-", + "start": 35630, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 35656, + "start": 35593, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 35659, + "start": 35658, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 35592, + "name": "line", + "start": 35588, + "type": "Identifier" + }, + "end": 35660, + "start": 35588, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 35699, + "raw": "0.8644261221501586", + "start": 35681, + "type": "Literal", + "type": "Literal", + "value": 0.8644261221501586 + }, + "end": 35699, + "operator": "-", + "start": 35680, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 35728, + "raw": "0.11434763886359756", + "start": 35709, + "type": "Literal", + "type": "Literal", + "value": 0.11434763886359756 + }, + "end": 35728, + "operator": "-", + "start": 35708, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 35735, + "start": 35671, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 35738, + "start": 35737, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 35670, + "name": "line", + "start": 35666, + "type": "Identifier" + }, + "end": 35739, + "start": 35666, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 35780, + "raw": "0.029081958413378572", + "start": 35760, + "type": "Literal", + "type": "Literal", + "value": 0.029081958413378572 + }, + "end": 35780, + "operator": "-", + "start": 35759, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 35808, + "raw": "0.5214138808318329", + "start": 35790, + "type": "Literal", + "type": "Literal", + "value": 0.5214138808318329 + }, + "end": 35808, + "operator": "-", + "start": 35789, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 35815, + "start": 35750, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 35818, + "start": 35817, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 35749, + "name": "line", + "start": 35745, + "type": "Identifier" + }, + "end": 35819, + "start": 35745, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 35858, + "raw": "0.8713091851579695", + "start": 35840, + "type": "Literal", + "type": "Literal", + "value": 0.8713091851579695 + }, + "end": 35858, + "operator": "-", + "start": 35839, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 35885, + "raw": "0.7866284950967315", + "start": 35867, + "type": "Literal", + "type": "Literal", + "value": 0.7866284950967315 + } + ], + "end": 35892, + "start": 35830, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 35895, + "start": 35894, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 35829, + "name": "line", + "start": 35825, + "type": "Identifier" + }, + "end": 35896, + "start": 35825, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 35925, + "raw": "0.884342023093545", + "start": 35908, + "type": "Literal", + "type": "Literal", + "value": 0.884342023093545 + }, + { + "argument": { + "end": 35946, + "raw": "0.1825407002568431", + "start": 35928, + "type": "Literal", + "type": "Literal", + "value": 0.1825407002568431 + }, + "end": 35946, + "operator": "-", + "start": 35927, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 35947, + "start": 35907, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 35950, + "start": 35949, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 35906, + "name": "line", + "start": 35902, + "type": "Identifier" + }, + "end": 35951, + "start": 35902, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 35990, + "raw": "0.6978385295364686", + "start": 35972, + "type": "Literal", + "type": "Literal", + "value": 0.6978385295364686 + }, + "end": 35990, + "operator": "-", + "start": 35971, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 36017, + "raw": "0.0440574328736949", + "start": 35999, + "type": "Literal", + "type": "Literal", + "value": 0.0440574328736949 + } + ], + "end": 36024, + "start": 35962, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 36027, + "start": 36026, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 35961, + "name": "line", + "start": 35957, + "type": "Identifier" + }, + "end": 36028, + "start": 35957, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 36068, + "raw": "0.48055049324331556", + "start": 36049, + "type": "Literal", + "type": "Literal", + "value": 0.48055049324331556 + }, + "end": 36068, + "operator": "-", + "start": 36048, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 36098, + "raw": "0.028546347149214002", + "start": 36078, + "type": "Literal", + "type": "Literal", + "value": 0.028546347149214002 + }, + "end": 36098, + "operator": "-", + "start": 36077, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 36105, + "start": 36039, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 36108, + "start": 36107, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 36038, + "name": "line", + "start": 36034, + "type": "Identifier" + }, + "end": 36109, + "start": 36034, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 36148, + "raw": "0.41283517382864776", + "start": 36129, + "type": "Literal", + "type": "Literal", + "value": 0.41283517382864776 + }, + { + "argument": { + "end": 36177, + "raw": "0.44938038251347323", + "start": 36158, + "type": "Literal", + "type": "Literal", + "value": 0.44938038251347323 + }, + "end": 36177, + "operator": "-", + "start": 36157, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 36184, + "start": 36120, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 36187, + "start": 36186, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 36119, + "name": "line", + "start": 36115, + "type": "Identifier" + }, + "end": 36188, + "start": 36115, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 36218, + "raw": "0.7911399832501751", + "start": 36200, + "type": "Literal", + "type": "Literal", + "value": 0.7911399832501751 + }, + { + "end": 36237, + "raw": "0.893446368526005", + "start": 36220, + "type": "Literal", + "type": "Literal", + "value": 0.893446368526005 + } + ], + "end": 36238, + "start": 36199, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 36241, + "start": 36240, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 36198, + "name": "line", + "start": 36194, + "type": "Identifier" + }, + "end": 36242, + "start": 36194, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 36280, + "raw": "0.6507434699009087", + "start": 36262, + "type": "Literal", + "type": "Literal", + "value": 0.6507434699009087 + }, + { + "argument": { + "end": 36308, + "raw": "0.6890023920962012", + "start": 36290, + "type": "Literal", + "type": "Literal", + "value": 0.6890023920962012 + }, + "end": 36308, + "operator": "-", + "start": 36289, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 36315, + "start": 36253, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 36318, + "start": 36317, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 36252, + "name": "line", + "start": 36248, + "type": "Identifier" + }, + "end": 36319, + "start": 36248, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 36358, + "raw": "0.10489019777253028", + "start": 36339, + "type": "Literal", + "type": "Literal", + "value": 0.10489019777253028 + }, + { + "argument": { + "end": 36386, + "raw": "0.5467450997193952", + "start": 36368, + "type": "Literal", + "type": "Literal", + "value": 0.5467450997193952 + }, + "end": 36386, + "operator": "-", + "start": 36367, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 36393, + "start": 36330, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 36396, + "start": 36395, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 36329, + "name": "line", + "start": 36325, + "type": "Identifier" + }, + "end": 36397, + "start": 36325, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 36436, + "raw": "0.5760905289992633", + "start": 36418, + "type": "Literal", + "type": "Literal", + "value": 0.5760905289992633 + }, + "end": 36436, + "operator": "-", + "start": 36417, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 36464, + "raw": "0.2639900702114173", + "start": 36446, + "type": "Literal", + "type": "Literal", + "value": 0.2639900702114173 + }, + "end": 36464, + "operator": "-", + "start": 36445, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 36471, + "start": 36408, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 36474, + "start": 36473, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 36407, + "name": "line", + "start": 36403, + "type": "Identifier" + }, + "end": 36475, + "start": 36403, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 36514, + "raw": "0.39828861790105297", + "start": 36495, + "type": "Literal", + "type": "Literal", + "value": 0.39828861790105297 + }, + { + "end": 36541, + "raw": "0.8036624129416385", + "start": 36523, + "type": "Literal", + "type": "Literal", + "value": 0.8036624129416385 + } + ], + "end": 36548, + "start": 36486, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 36551, + "start": 36550, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 36485, + "name": "line", + "start": 36481, + "type": "Identifier" + }, + "end": 36552, + "start": 36481, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 36582, + "raw": "0.673848991328553", + "start": 36565, + "type": "Literal", + "type": "Literal", + "value": 0.673848991328553 + }, + "end": 36582, + "operator": "-", + "start": 36564, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 36602, + "raw": "0.918443329270668", + "start": 36585, + "type": "Literal", + "type": "Literal", + "value": 0.918443329270668 + }, + "end": 36602, + "operator": "-", + "start": 36584, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 36603, + "start": 36563, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 36606, + "start": 36605, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 36562, + "name": "line", + "start": 36558, + "type": "Identifier" + }, + "end": 36607, + "start": 36558, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 36646, + "raw": "0.8599152936179257", + "start": 36628, + "type": "Literal", + "type": "Literal", + "value": 0.8599152936179257 + }, + "end": 36646, + "operator": "-", + "start": 36627, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 36674, + "raw": "0.9499371022680787", + "start": 36656, + "type": "Literal", + "type": "Literal", + "value": 0.9499371022680787 + }, + "end": 36674, + "operator": "-", + "start": 36655, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 36681, + "start": 36618, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 36684, + "start": 36683, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 36617, + "name": "line", + "start": 36613, + "type": "Identifier" + }, + "end": 36685, + "start": 36613, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 36723, + "raw": "0.6285243831393765", + "start": 36705, + "type": "Literal", + "type": "Literal", + "value": 0.6285243831393765 + }, + { + "argument": { + "end": 36751, + "raw": "0.5186557636566307", + "start": 36733, + "type": "Literal", + "type": "Literal", + "value": 0.5186557636566307 + }, + "end": 36751, + "operator": "-", + "start": 36732, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 36758, + "start": 36696, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 36761, + "start": 36760, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 36695, + "name": "line", + "start": 36691, + "type": "Identifier" + }, + "end": 36762, + "start": 36691, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 36800, + "raw": "0.3222412784832269", + "start": 36782, + "type": "Literal", + "type": "Literal", + "value": 0.3222412784832269 + }, + { + "end": 36828, + "raw": "0.24621192679727177", + "start": 36809, + "type": "Literal", + "type": "Literal", + "value": 0.24621192679727177 + } + ], + "end": 36835, + "start": 36773, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 36838, + "start": 36837, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 36772, + "name": "line", + "start": 36768, + "type": "Identifier" + }, + "end": 36839, + "start": 36768, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 36878, + "raw": "0.19754357911311016", + "start": 36859, + "type": "Literal", + "type": "Literal", + "value": 0.19754357911311016 + }, + { + "argument": { + "end": 36906, + "raw": "0.7529246632397206", + "start": 36888, + "type": "Literal", + "type": "Literal", + "value": 0.7529246632397206 + }, + "end": 36906, + "operator": "-", + "start": 36887, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 36913, + "start": 36850, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 36916, + "start": 36915, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 36849, + "name": "line", + "start": 36845, + "type": "Identifier" + }, + "end": 36917, + "start": 36845, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 36957, + "raw": "0.43181570545865555", + "start": 36938, + "type": "Literal", + "type": "Literal", + "value": 0.43181570545865555 + }, + "end": 36957, + "operator": "-", + "start": 36937, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 36985, + "raw": "0.18945437402201537", + "start": 36966, + "type": "Literal", + "type": "Literal", + "value": 0.18945437402201537 + } + ], + "end": 36992, + "start": 36928, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 36995, + "start": 36994, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 36927, + "name": "line", + "start": 36923, + "type": "Identifier" + }, + "end": 36996, + "start": 36923, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 37034, + "raw": "0.8714511090241797", + "start": 37016, + "type": "Literal", + "type": "Literal", + "value": 0.8714511090241797 + }, + { + "argument": { + "end": 37062, + "raw": "0.7215844196844685", + "start": 37044, + "type": "Literal", + "type": "Literal", + "value": 0.7215844196844685 + }, + "end": 37062, + "operator": "-", + "start": 37043, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 37069, + "start": 37007, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 37072, + "start": 37071, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 37006, + "name": "line", + "start": 37002, + "type": "Identifier" + }, + "end": 37073, + "start": 37002, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 37112, + "raw": "0.3670208139314082", + "start": 37094, + "type": "Literal", + "type": "Literal", + "value": 0.3670208139314082 + }, + "end": 37112, + "operator": "-", + "start": 37093, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 37140, + "raw": "0.21201331909674526", + "start": 37121, + "type": "Literal", + "type": "Literal", + "value": 0.21201331909674526 + } + ], + "end": 37147, + "start": 37084, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 37150, + "start": 37149, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 37083, + "name": "line", + "start": 37079, + "type": "Identifier" + }, + "end": 37151, + "start": 37079, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 37190, + "raw": "0.4707511307971115", + "start": 37172, + "type": "Literal", + "type": "Literal", + "value": 0.4707511307971115 + }, + "end": 37190, + "operator": "-", + "start": 37171, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 37217, + "raw": "0.4905279615419764", + "start": 37199, + "type": "Literal", + "type": "Literal", + "value": 0.4905279615419764 + } + ], + "end": 37224, + "start": 37162, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 37227, + "start": 37226, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 37161, + "name": "line", + "start": 37157, + "type": "Identifier" + }, + "end": 37228, + "start": 37157, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 37267, + "raw": "0.8328324229085962", + "start": 37249, + "type": "Literal", + "type": "Literal", + "value": 0.8328324229085962 + }, + "end": 37267, + "operator": "-", + "start": 37248, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 37294, + "raw": "0.4677492878818803", + "start": 37276, + "type": "Literal", + "type": "Literal", + "value": 0.4677492878818803 + } + ], + "end": 37301, + "start": 37239, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 37304, + "start": 37303, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 37238, + "name": "line", + "start": 37234, + "type": "Identifier" + }, + "end": 37305, + "start": 37234, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 37344, + "raw": "0.8111463382182231", + "start": 37326, + "type": "Literal", + "type": "Literal", + "value": 0.8111463382182231 + }, + "end": 37344, + "operator": "-", + "start": 37325, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 37373, + "raw": "0.41814807547140576", + "start": 37354, + "type": "Literal", + "type": "Literal", + "value": 0.41814807547140576 + }, + "end": 37373, + "operator": "-", + "start": 37353, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 37380, + "start": 37316, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 37383, + "start": 37382, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 37315, + "name": "line", + "start": 37311, + "type": "Identifier" + }, + "end": 37384, + "start": 37311, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 37423, + "raw": "0.03807684940941125", + "start": 37404, + "type": "Literal", + "type": "Literal", + "value": 0.03807684940941125 + }, + { + "end": 37451, + "raw": "0.25664826686353326", + "start": 37432, + "type": "Literal", + "type": "Literal", + "value": 0.25664826686353326 + } + ], + "end": 37458, + "start": 37395, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 37461, + "start": 37460, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 37394, + "name": "line", + "start": 37390, + "type": "Identifier" + }, + "end": 37462, + "start": 37390, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 37501, + "raw": "0.23950083339596384", + "start": 37482, + "type": "Literal", + "type": "Literal", + "value": 0.23950083339596384 + }, + { + "end": 37529, + "raw": "0.43693196301855575", + "start": 37510, + "type": "Literal", + "type": "Literal", + "value": 0.43693196301855575 + } + ], + "end": 37536, + "start": 37473, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 37539, + "start": 37538, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 37472, + "name": "line", + "start": 37468, + "type": "Identifier" + }, + "end": 37540, + "start": 37468, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 37580, + "raw": "0.16279444820904887", + "start": 37561, + "type": "Literal", + "type": "Literal", + "value": 0.16279444820904887 + }, + "end": 37580, + "operator": "-", + "start": 37560, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 37607, + "raw": "0.8064475707664818", + "start": 37589, + "type": "Literal", + "type": "Literal", + "value": 0.8064475707664818 + } + ], + "end": 37614, + "start": 37551, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 37617, + "start": 37616, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 37550, + "name": "line", + "start": 37546, + "type": "Identifier" + }, + "end": 37618, + "start": 37546, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 37658, + "raw": "0.08972872009232558", + "start": 37639, + "type": "Literal", + "type": "Literal", + "value": 0.08972872009232558 + }, + "end": 37658, + "operator": "-", + "start": 37638, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 37687, + "raw": "0.08887625823751266", + "start": 37668, + "type": "Literal", + "type": "Literal", + "value": 0.08887625823751266 + }, + "end": 37687, + "operator": "-", + "start": 37667, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 37694, + "start": 37629, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 37697, + "start": 37696, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 37628, + "name": "line", + "start": 37624, + "type": "Identifier" + }, + "end": 37698, + "start": 37624, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 37736, + "raw": "0.9203433427102556", + "start": 37718, + "type": "Literal", + "type": "Literal", + "value": 0.9203433427102556 + }, + { + "argument": { + "end": 37765, + "raw": "0.17343459369697545", + "start": 37746, + "type": "Literal", + "type": "Literal", + "value": 0.17343459369697545 + }, + "end": 37765, + "operator": "-", + "start": 37745, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 37772, + "start": 37709, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 37775, + "start": 37774, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 37708, + "name": "line", + "start": 37704, + "type": "Identifier" + }, + "end": 37776, + "start": 37704, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 37817, + "raw": "0.0017496234414517975", + "start": 37796, + "type": "Literal", + "type": "Literal", + "value": 0.0017496234414517975 + }, + { + "argument": { + "end": 37845, + "raw": "0.5178508316168335", + "start": 37827, + "type": "Literal", + "type": "Literal", + "value": 0.5178508316168335 + }, + "end": 37845, + "operator": "-", + "start": 37826, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 37852, + "start": 37787, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 37855, + "start": 37854, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 37786, + "name": "line", + "start": 37782, + "type": "Identifier" + }, + "end": 37856, + "start": 37782, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 37894, + "raw": "0.6206263405732759", + "start": 37876, + "type": "Literal", + "type": "Literal", + "value": 0.6206263405732759 + }, + { + "argument": { + "end": 37922, + "raw": "0.8733399468665124", + "start": 37904, + "type": "Literal", + "type": "Literal", + "value": 0.8733399468665124 + }, + "end": 37922, + "operator": "-", + "start": 37903, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 37929, + "start": 37867, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 37932, + "start": 37931, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 37866, + "name": "line", + "start": 37862, + "type": "Identifier" + }, + "end": 37933, + "start": 37862, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 37972, + "raw": "0.7776386664456383", + "start": 37954, + "type": "Literal", + "type": "Literal", + "value": 0.7776386664456383 + }, + "end": 37972, + "operator": "-", + "start": 37953, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 37999, + "raw": "0.7602780485384968", + "start": 37981, + "type": "Literal", + "type": "Literal", + "value": 0.7602780485384968 + } + ], + "end": 38006, + "start": 37944, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 38009, + "start": 38008, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 37943, + "name": "line", + "start": 37939, + "type": "Identifier" + }, + "end": 38010, + "start": 37939, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 38040, + "raw": "0.5439379760788592", + "start": 38022, + "type": "Literal", + "type": "Literal", + "value": 0.5439379760788592 + }, + { + "end": 38060, + "raw": "0.8449177589350552", + "start": 38042, + "type": "Literal", + "type": "Literal", + "value": 0.8449177589350552 + } + ], + "end": 38061, + "start": 38021, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 38064, + "start": 38063, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 38020, + "name": "line", + "start": 38016, + "type": "Identifier" + }, + "end": 38065, + "start": 38016, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 38105, + "raw": "0.13036646025917076", + "start": 38086, + "type": "Literal", + "type": "Literal", + "value": 0.13036646025917076 + }, + "end": 38105, + "operator": "-", + "start": 38085, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 38134, + "raw": "0.012051713627069693", + "start": 38114, + "type": "Literal", + "type": "Literal", + "value": 0.012051713627069693 + } + ], + "end": 38141, + "start": 38076, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 38144, + "start": 38143, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 38075, + "name": "line", + "start": 38071, + "type": "Identifier" + }, + "end": 38145, + "start": 38071, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 38184, + "raw": "0.1656465612645519", + "start": 38166, + "type": "Literal", + "type": "Literal", + "value": 0.1656465612645519 + }, + "end": 38184, + "operator": "-", + "start": 38165, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 38213, + "raw": "0.20775229173765486", + "start": 38194, + "type": "Literal", + "type": "Literal", + "value": 0.20775229173765486 + }, + "end": 38213, + "operator": "-", + "start": 38193, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 38220, + "start": 38156, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 38223, + "start": 38222, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 38155, + "name": "line", + "start": 38151, + "type": "Identifier" + }, + "end": 38224, + "start": 38151, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 38263, + "raw": "0.0962723255929061", + "start": 38245, + "type": "Literal", + "type": "Literal", + "value": 0.0962723255929061 + }, + "end": 38263, + "operator": "-", + "start": 38244, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 38292, + "raw": "0.05417797659066137", + "start": 38273, + "type": "Literal", + "type": "Literal", + "value": 0.05417797659066137 + }, + "end": 38292, + "operator": "-", + "start": 38272, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 38299, + "start": 38235, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 38302, + "start": 38301, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 38234, + "name": "line", + "start": 38230, + "type": "Identifier" + }, + "end": 38303, + "start": 38230, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 38332, + "raw": "0.902108945498191", + "start": 38315, + "type": "Literal", + "type": "Literal", + "value": 0.902108945498191 + }, + { + "end": 38352, + "raw": "0.3958978534964961", + "start": 38334, + "type": "Literal", + "type": "Literal", + "value": 0.3958978534964961 + } + ], + "end": 38353, + "start": 38314, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 38356, + "start": 38355, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 38313, + "name": "line", + "start": 38309, + "type": "Identifier" + }, + "end": 38357, + "start": 38309, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 38396, + "raw": "0.27997950083139167", + "start": 38377, + "type": "Literal", + "type": "Literal", + "value": 0.27997950083139167 + }, + { + "argument": { + "end": 38425, + "raw": "0.17778188444008958", + "start": 38406, + "type": "Literal", + "type": "Literal", + "value": 0.17778188444008958 + }, + "end": 38425, + "operator": "-", + "start": 38405, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 38432, + "start": 38368, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 38435, + "start": 38434, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 38367, + "name": "line", + "start": 38363, + "type": "Identifier" + }, + "end": 38436, + "start": 38363, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 38466, + "raw": "0.5235806061589545", + "start": 38448, + "type": "Literal", + "type": "Literal", + "value": 0.5235806061589545 + }, + { + "end": 38485, + "raw": "0.694318985642328", + "start": 38468, + "type": "Literal", + "type": "Literal", + "value": 0.694318985642328 + } + ], + "end": 38486, + "start": 38447, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 38489, + "start": 38488, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 38446, + "name": "line", + "start": 38442, + "type": "Identifier" + }, + "end": 38490, + "start": 38442, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 38529, + "raw": "0.39140760219992154", + "start": 38510, + "type": "Literal", + "type": "Literal", + "value": 0.39140760219992154 + }, + { + "argument": { + "end": 38557, + "raw": "0.7839795272576484", + "start": 38539, + "type": "Literal", + "type": "Literal", + "value": 0.7839795272576484 + }, + "end": 38557, + "operator": "-", + "start": 38538, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 38564, + "start": 38501, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 38567, + "start": 38566, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 38500, + "name": "line", + "start": 38496, + "type": "Identifier" + }, + "end": 38568, + "start": 38496, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 38598, + "raw": "0.8414243527073519", + "start": 38580, + "type": "Literal", + "type": "Literal", + "value": 0.8414243527073519 + }, + { + "end": 38618, + "raw": "0.5395591528940082", + "start": 38600, + "type": "Literal", + "type": "Literal", + "value": 0.5395591528940082 + } + ], + "end": 38619, + "start": 38579, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 38622, + "start": 38621, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 38578, + "name": "line", + "start": 38574, + "type": "Identifier" + }, + "end": 38623, + "start": 38574, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 38661, + "raw": "0.6137667704875602", + "start": 38643, + "type": "Literal", + "type": "Literal", + "value": 0.6137667704875602 + }, + { + "end": 38689, + "raw": "0.22119647516722085", + "start": 38670, + "type": "Literal", + "type": "Literal", + "value": 0.22119647516722085 + } + ], + "end": 38696, + "start": 38634, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 38699, + "start": 38698, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 38633, + "name": "line", + "start": 38629, + "type": "Identifier" + }, + "end": 38700, + "start": 38629, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 38730, + "raw": "0.8830488380766681", + "start": 38712, + "type": "Literal", + "type": "Literal", + "value": 0.8830488380766681 + }, + { + "end": 38750, + "raw": "0.6996724408425232", + "start": 38732, + "type": "Literal", + "type": "Literal", + "value": 0.6996724408425232 + } + ], + "end": 38751, + "start": 38711, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 38754, + "start": 38753, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 38710, + "name": "line", + "start": 38706, + "type": "Identifier" + }, + "end": 38755, + "start": 38706, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 38795, + "raw": "0.41290485754343953", + "start": 38776, + "type": "Literal", + "type": "Literal", + "value": 0.41290485754343953 + }, + "end": 38795, + "operator": "-", + "start": 38775, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 38823, + "raw": "0.4152647361760933", + "start": 38805, + "type": "Literal", + "type": "Literal", + "value": 0.4152647361760933 + }, + "end": 38823, + "operator": "-", + "start": 38804, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 38830, + "start": 38766, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 38833, + "start": 38832, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 38765, + "name": "line", + "start": 38761, + "type": "Identifier" + }, + "end": 38834, + "start": 38761, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 38872, + "raw": "0.5169538755575687", + "start": 38854, + "type": "Literal", + "type": "Literal", + "value": 0.5169538755575687 + }, + { + "argument": { + "end": 38900, + "raw": "0.9085567867302617", + "start": 38882, + "type": "Literal", + "type": "Literal", + "value": 0.9085567867302617 + }, + "end": 38900, + "operator": "-", + "start": 38881, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 38907, + "start": 38845, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 38910, + "start": 38909, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 38844, + "name": "line", + "start": 38840, + "type": "Identifier" + }, + "end": 38911, + "start": 38840, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 38950, + "raw": "0.6716353749059765", + "start": 38932, + "type": "Literal", + "type": "Literal", + "value": 0.6716353749059765 + }, + "end": 38950, + "operator": "-", + "start": 38931, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 38978, + "raw": "0.9605576808879026", + "start": 38960, + "type": "Literal", + "type": "Literal", + "value": 0.9605576808879026 + }, + "end": 38978, + "operator": "-", + "start": 38959, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 38985, + "start": 38922, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 38988, + "start": 38987, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 38921, + "name": "line", + "start": 38917, + "type": "Identifier" + }, + "end": 38989, + "start": 38917, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 39029, + "raw": "0.010280170930300203", + "start": 39009, + "type": "Literal", + "type": "Literal", + "value": 0.010280170930300203 + }, + { + "argument": { + "end": 39058, + "raw": "0.37344123662342166", + "start": 39039, + "type": "Literal", + "type": "Literal", + "value": 0.37344123662342166 + }, + "end": 39058, + "operator": "-", + "start": 39038, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 39065, + "start": 39000, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 39068, + "start": 39067, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 38999, + "name": "line", + "start": 38995, + "type": "Identifier" + }, + "end": 39069, + "start": 38995, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 39108, + "raw": "0.10357375682791004", + "start": 39089, + "type": "Literal", + "type": "Literal", + "value": 0.10357375682791004 + }, + { + "argument": { + "end": 39137, + "raw": "0.42294321030821425", + "start": 39118, + "type": "Literal", + "type": "Literal", + "value": 0.42294321030821425 + }, + "end": 39137, + "operator": "-", + "start": 39117, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 39144, + "start": 39080, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 39147, + "start": 39146, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 39079, + "name": "line", + "start": 39075, + "type": "Identifier" + }, + "end": 39148, + "start": 39075, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 39186, + "raw": "0.4520311575096987", + "start": 39168, + "type": "Literal", + "type": "Literal", + "value": 0.4520311575096987 + }, + { + "argument": { + "end": 39215, + "raw": "0.11232675307600548", + "start": 39196, + "type": "Literal", + "type": "Literal", + "value": 0.11232675307600548 + }, + "end": 39215, + "operator": "-", + "start": 39195, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 39222, + "start": 39159, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 39225, + "start": 39224, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 39158, + "name": "line", + "start": 39154, + "type": "Identifier" + }, + "end": 39226, + "start": 39154, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 39265, + "raw": "0.8821185914380845", + "start": 39247, + "type": "Literal", + "type": "Literal", + "value": 0.8821185914380845 + }, + "end": 39265, + "operator": "-", + "start": 39246, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 39293, + "raw": "0.7155147434939819", + "start": 39275, + "type": "Literal", + "type": "Literal", + "value": 0.7155147434939819 + }, + "end": 39293, + "operator": "-", + "start": 39274, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 39300, + "start": 39237, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 39303, + "start": 39302, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 39236, + "name": "line", + "start": 39232, + "type": "Identifier" + }, + "end": 39304, + "start": 39232, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 39334, + "raw": "0.9195487101690416", + "start": 39316, + "type": "Literal", + "type": "Literal", + "value": 0.9195487101690416 + }, + { + "end": 39354, + "raw": "0.2691627465297364", + "start": 39336, + "type": "Literal", + "type": "Literal", + "value": 0.2691627465297364 + } + ], + "end": 39355, + "start": 39315, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 39358, + "start": 39357, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 39314, + "name": "line", + "start": 39310, + "type": "Identifier" + }, + "end": 39359, + "start": 39310, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 39397, + "raw": "0.7098978191546745", + "start": 39379, + "type": "Literal", + "type": "Literal", + "value": 0.7098978191546745 + }, + { + "end": 39425, + "raw": "0.11710004169385968", + "start": 39406, + "type": "Literal", + "type": "Literal", + "value": 0.11710004169385968 + } + ], + "end": 39432, + "start": 39370, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 39435, + "start": 39434, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 39369, + "name": "line", + "start": 39365, + "type": "Identifier" + }, + "end": 39436, + "start": 39365, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 39476, + "raw": "0.37876368560819995", + "start": 39457, + "type": "Literal", + "type": "Literal", + "value": 0.37876368560819995 + }, + "end": 39476, + "operator": "-", + "start": 39456, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 39503, + "raw": "0.7106729314759084", + "start": 39485, + "type": "Literal", + "type": "Literal", + "value": 0.7106729314759084 + } + ], + "end": 39510, + "start": 39447, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 39513, + "start": 39512, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 39446, + "name": "line", + "start": 39442, + "type": "Identifier" + }, + "end": 39514, + "start": 39442, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 39554, + "raw": "0.29728126898353335", + "start": 39535, + "type": "Literal", + "type": "Literal", + "value": 0.29728126898353335 + }, + "end": 39554, + "operator": "-", + "start": 39534, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 39583, + "raw": "0.06649734568328003", + "start": 39564, + "type": "Literal", + "type": "Literal", + "value": 0.06649734568328003 + }, + "end": 39583, + "operator": "-", + "start": 39563, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 39590, + "start": 39525, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 39593, + "start": 39592, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 39524, + "name": "line", + "start": 39520, + "type": "Identifier" + }, + "end": 39594, + "start": 39520, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 39633, + "raw": "0.22965781558352072", + "start": 39614, + "type": "Literal", + "type": "Literal", + "value": 0.22965781558352072 + }, + { + "argument": { + "end": 39661, + "raw": "0.7601866432836641", + "start": 39643, + "type": "Literal", + "type": "Literal", + "value": 0.7601866432836641 + }, + "end": 39661, + "operator": "-", + "start": 39642, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 39668, + "start": 39605, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 39671, + "start": 39670, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 39604, + "name": "line", + "start": 39600, + "type": "Identifier" + }, + "end": 39672, + "start": 39600, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 39711, + "raw": "0.6356501074317229", + "start": 39693, + "type": "Literal", + "type": "Literal", + "value": 0.6356501074317229 + }, + "end": 39711, + "operator": "-", + "start": 39692, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 39739, + "raw": "0.19458425399338064", + "start": 39720, + "type": "Literal", + "type": "Literal", + "value": 0.19458425399338064 + } + ], + "end": 39746, + "start": 39683, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 39749, + "start": 39748, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 39682, + "name": "line", + "start": 39678, + "type": "Identifier" + }, + "end": 39750, + "start": 39678, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 39780, + "raw": "0.5721251777404546", + "start": 39762, + "type": "Literal", + "type": "Literal", + "value": 0.5721251777404546 + }, + { + "end": 39800, + "raw": "0.2888584097921527", + "start": 39782, + "type": "Literal", + "type": "Literal", + "value": 0.2888584097921527 + } + ], + "end": 39801, + "start": 39761, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 39804, + "start": 39803, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 39760, + "name": "line", + "start": 39756, + "type": "Identifier" + }, + "end": 39805, + "start": 39756, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 39844, + "raw": "0.9580409549552311", + "start": 39826, + "type": "Literal", + "type": "Literal", + "value": 0.9580409549552311 + }, + "end": 39844, + "operator": "-", + "start": 39825, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 39873, + "raw": "0.02243818192078395", + "start": 39854, + "type": "Literal", + "type": "Literal", + "value": 0.02243818192078395 + }, + "end": 39873, + "operator": "-", + "start": 39853, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 39880, + "start": 39816, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 39883, + "start": 39882, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 39815, + "name": "line", + "start": 39811, + "type": "Identifier" + }, + "end": 39884, + "start": 39811, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 39922, + "raw": "0.3299184618602866", + "start": 39904, + "type": "Literal", + "type": "Literal", + "value": 0.3299184618602866 + }, + { + "argument": { + "end": 39950, + "raw": "0.8353726942369875", + "start": 39932, + "type": "Literal", + "type": "Literal", + "value": 0.8353726942369875 + }, + "end": 39950, + "operator": "-", + "start": 39931, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 39957, + "start": 39895, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 39960, + "start": 39959, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 39894, + "name": "line", + "start": 39890, + "type": "Identifier" + }, + "end": 39961, + "start": 39890, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 39999, + "raw": "0.7434639386755209", + "start": 39981, + "type": "Literal", + "type": "Literal", + "value": 0.7434639386755209 + }, + { + "argument": { + "end": 40027, + "raw": "0.7919648864138378", + "start": 40009, + "type": "Literal", + "type": "Literal", + "value": 0.7919648864138378 + }, + "end": 40027, + "operator": "-", + "start": 40008, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 40034, + "start": 39972, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 40037, + "start": 40036, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 39971, + "name": "line", + "start": 39967, + "type": "Identifier" + }, + "end": 40038, + "start": 39967, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 40068, + "raw": "0.9935751011164615", + "start": 40050, + "type": "Literal", + "type": "Literal", + "value": 0.9935751011164615 + }, + { + "end": 40088, + "raw": "0.9042566468497608", + "start": 40070, + "type": "Literal", + "type": "Literal", + "value": 0.9042566468497608 + } + ], + "end": 40089, + "start": 40049, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 40092, + "start": 40091, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 40048, + "name": "line", + "start": 40044, + "type": "Identifier" + }, + "end": 40093, + "start": 40044, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 40132, + "raw": "0.5035812884687294", + "start": 40114, + "type": "Literal", + "type": "Literal", + "value": 0.5035812884687294 + }, + "end": 40132, + "operator": "-", + "start": 40113, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 40159, + "raw": "0.5150967434989442", + "start": 40141, + "type": "Literal", + "type": "Literal", + "value": 0.5150967434989442 + } + ], + "end": 40166, + "start": 40104, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 40169, + "start": 40168, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 40103, + "name": "line", + "start": 40099, + "type": "Identifier" + }, + "end": 40170, + "start": 40099, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 40200, + "raw": "0.5526227215900215", + "start": 40182, + "type": "Literal", + "type": "Literal", + "value": 0.5526227215900215 + }, + { + "end": 40220, + "raw": "0.7612604137272441", + "start": 40202, + "type": "Literal", + "type": "Literal", + "value": 0.7612604137272441 + } + ], + "end": 40221, + "start": 40181, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 40224, + "start": 40223, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 40180, + "name": "line", + "start": 40176, + "type": "Identifier" + }, + "end": 40225, + "start": 40176, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 40263, + "raw": "0.8593271349126876", + "start": 40245, + "type": "Literal", + "type": "Literal", + "value": 0.8593271349126876 + }, + { + "end": 40291, + "raw": "0.08414894953725849", + "start": 40272, + "type": "Literal", + "type": "Literal", + "value": 0.08414894953725849 + } + ], + "end": 40298, + "start": 40236, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 40301, + "start": 40300, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 40235, + "name": "line", + "start": 40231, + "type": "Identifier" + }, + "end": 40302, + "start": 40231, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 40341, + "raw": "0.8181049219192864", + "start": 40323, + "type": "Literal", + "type": "Literal", + "value": 0.8181049219192864 + }, + "end": 40341, + "operator": "-", + "start": 40322, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 40368, + "raw": "0.903548131323352", + "start": 40351, + "type": "Literal", + "type": "Literal", + "value": 0.903548131323352 + }, + "end": 40368, + "operator": "-", + "start": 40350, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 40375, + "start": 40313, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 40378, + "start": 40377, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 40312, + "name": "line", + "start": 40308, + "type": "Identifier" + }, + "end": 40379, + "start": 40308, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 40417, + "raw": "0.3165782044458305", + "start": 40399, + "type": "Literal", + "type": "Literal", + "value": 0.3165782044458305 + }, + { + "argument": { + "end": 40446, + "raw": "0.24189274252014914", + "start": 40427, + "type": "Literal", + "type": "Literal", + "value": 0.24189274252014914 + }, + "end": 40446, + "operator": "-", + "start": 40426, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 40453, + "start": 40390, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 40456, + "start": 40455, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 40389, + "name": "line", + "start": 40385, + "type": "Identifier" + }, + "end": 40457, + "start": 40385, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 40497, + "raw": "0.44390956414045135", + "start": 40478, + "type": "Literal", + "type": "Literal", + "value": 0.44390956414045135 + }, + "end": 40497, + "operator": "-", + "start": 40477, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 40526, + "raw": "0.25912591535126905", + "start": 40507, + "type": "Literal", + "type": "Literal", + "value": 0.25912591535126905 + }, + "end": 40526, + "operator": "-", + "start": 40506, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 40533, + "start": 40468, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 40536, + "start": 40535, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 40467, + "name": "line", + "start": 40463, + "type": "Identifier" + }, + "end": 40537, + "start": 40463, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 40576, + "raw": "0.6605165911891009", + "start": 40558, + "type": "Literal", + "type": "Literal", + "value": 0.6605165911891009 + }, + "end": 40576, + "operator": "-", + "start": 40557, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 40605, + "raw": "0.40355115288839194", + "start": 40586, + "type": "Literal", + "type": "Literal", + "value": 0.40355115288839194 + }, + "end": 40605, + "operator": "-", + "start": 40585, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 40612, + "start": 40548, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 40615, + "start": 40614, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 40547, + "name": "line", + "start": 40543, + "type": "Identifier" + }, + "end": 40616, + "start": 40543, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 40655, + "raw": "0.7170489950180006", + "start": 40637, + "type": "Literal", + "type": "Literal", + "value": 0.7170489950180006 + }, + "end": 40655, + "operator": "-", + "start": 40636, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 40683, + "raw": "0.23454356079651384", + "start": 40664, + "type": "Literal", + "type": "Literal", + "value": 0.23454356079651384 + } + ], + "end": 40690, + "start": 40627, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 40693, + "start": 40692, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 40626, + "name": "line", + "start": 40622, + "type": "Identifier" + }, + "end": 40694, + "start": 40622, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 40733, + "raw": "0.2568187045379722", + "start": 40715, + "type": "Literal", + "type": "Literal", + "value": 0.2568187045379722 + }, + "end": 40733, + "operator": "-", + "start": 40714, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 40762, + "raw": "0.45031188717601367", + "start": 40743, + "type": "Literal", + "type": "Literal", + "value": 0.45031188717601367 + }, + "end": 40762, + "operator": "-", + "start": 40742, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 40769, + "start": 40705, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 40772, + "start": 40771, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 40704, + "name": "line", + "start": 40700, + "type": "Identifier" + }, + "end": 40773, + "start": 40700, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 40811, + "raw": "0.6751951211858687", + "start": 40793, + "type": "Literal", + "type": "Literal", + "value": 0.6751951211858687 + }, + { + "argument": { + "end": 40839, + "raw": "0.9709424233465593", + "start": 40821, + "type": "Literal", + "type": "Literal", + "value": 0.9709424233465593 + }, + "end": 40839, + "operator": "-", + "start": 40820, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 40846, + "start": 40784, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 40849, + "start": 40848, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 40783, + "name": "line", + "start": 40779, + "type": "Identifier" + }, + "end": 40850, + "start": 40779, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 40889, + "raw": "0.5689619842972184", + "start": 40871, + "type": "Literal", + "type": "Literal", + "value": 0.5689619842972184 + }, + "end": 40889, + "operator": "-", + "start": 40870, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 40916, + "raw": "0.5918969913790362", + "start": 40898, + "type": "Literal", + "type": "Literal", + "value": 0.5918969913790362 + } + ], + "end": 40923, + "start": 40861, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 40926, + "start": 40925, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 40860, + "name": "line", + "start": 40856, + "type": "Identifier" + }, + "end": 40927, + "start": 40856, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 40966, + "raw": "0.8328324229085962", + "start": 40948, + "type": "Literal", + "type": "Literal", + "value": 0.8328324229085962 + }, + "end": 40966, + "operator": "-", + "start": 40947, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 40993, + "raw": "0.4677492878818803", + "start": 40975, + "type": "Literal", + "type": "Literal", + "value": 0.4677492878818803 + } + ], + "end": 41000, + "start": 40938, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 41003, + "start": 41002, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 40937, + "name": "line", + "start": 40933, + "type": "Identifier" + }, + "end": 41004, + "start": 40933, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 41043, + "raw": "0.8111463382182231", + "start": 41025, + "type": "Literal", + "type": "Literal", + "value": 0.8111463382182231 + }, + "end": 41043, + "operator": "-", + "start": 41024, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 41072, + "raw": "0.41814807547140576", + "start": 41053, + "type": "Literal", + "type": "Literal", + "value": 0.41814807547140576 + }, + "end": 41072, + "operator": "-", + "start": 41052, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 41079, + "start": 41015, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 41082, + "start": 41081, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 41014, + "name": "line", + "start": 41010, + "type": "Identifier" + }, + "end": 41083, + "start": 41010, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 41122, + "raw": "0.03807684940941125", + "start": 41103, + "type": "Literal", + "type": "Literal", + "value": 0.03807684940941125 + }, + { + "end": 41150, + "raw": "0.25664826686353326", + "start": 41131, + "type": "Literal", + "type": "Literal", + "value": 0.25664826686353326 + } + ], + "end": 41157, + "start": 41094, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 41160, + "start": 41159, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 41093, + "name": "line", + "start": 41089, + "type": "Identifier" + }, + "end": 41161, + "start": 41089, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 41200, + "raw": "0.23950083339596384", + "start": 41181, + "type": "Literal", + "type": "Literal", + "value": 0.23950083339596384 + }, + { + "end": 41228, + "raw": "0.43693196301855575", + "start": 41209, + "type": "Literal", + "type": "Literal", + "value": 0.43693196301855575 + } + ], + "end": 41235, + "start": 41172, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 41238, + "start": 41237, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 41171, + "name": "line", + "start": 41167, + "type": "Identifier" + }, + "end": 41239, + "start": 41167, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 41279, + "raw": "0.16279444820904887", + "start": 41260, + "type": "Literal", + "type": "Literal", + "value": 0.16279444820904887 + }, + "end": 41279, + "operator": "-", + "start": 41259, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 41306, + "raw": "0.8064475707664818", + "start": 41288, + "type": "Literal", + "type": "Literal", + "value": 0.8064475707664818 + } + ], + "end": 41313, + "start": 41250, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 41316, + "start": 41315, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 41249, + "name": "line", + "start": 41245, + "type": "Identifier" + }, + "end": 41317, + "start": 41245, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 41357, + "raw": "0.08972872009232558", + "start": 41338, + "type": "Literal", + "type": "Literal", + "value": 0.08972872009232558 + }, + "end": 41357, + "operator": "-", + "start": 41337, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 41386, + "raw": "0.08887625823751266", + "start": 41367, + "type": "Literal", + "type": "Literal", + "value": 0.08887625823751266 + }, + "end": 41386, + "operator": "-", + "start": 41366, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 41393, + "start": 41328, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 41396, + "start": 41395, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 41327, + "name": "line", + "start": 41323, + "type": "Identifier" + }, + "end": 41397, + "start": 41323, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 41435, + "raw": "0.9203433427102556", + "start": 41417, + "type": "Literal", + "type": "Literal", + "value": 0.9203433427102556 + }, + { + "argument": { + "end": 41464, + "raw": "0.17343459369697545", + "start": 41445, + "type": "Literal", + "type": "Literal", + "value": 0.17343459369697545 + }, + "end": 41464, + "operator": "-", + "start": 41444, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 41471, + "start": 41408, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 41474, + "start": 41473, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 41407, + "name": "line", + "start": 41403, + "type": "Identifier" + }, + "end": 41475, + "start": 41403, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 41516, + "raw": "0.0017496234414517975", + "start": 41495, + "type": "Literal", + "type": "Literal", + "value": 0.0017496234414517975 + }, + { + "argument": { + "end": 41544, + "raw": "0.5178508316168335", + "start": 41526, + "type": "Literal", + "type": "Literal", + "value": 0.5178508316168335 + }, + "end": 41544, + "operator": "-", + "start": 41525, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 41551, + "start": 41486, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 41554, + "start": 41553, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 41485, + "name": "line", + "start": 41481, + "type": "Identifier" + }, + "end": 41555, + "start": 41481, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 41593, + "raw": "0.6206263405732759", + "start": 41575, + "type": "Literal", + "type": "Literal", + "value": 0.6206263405732759 + }, + { + "argument": { + "end": 41621, + "raw": "0.8733399468665124", + "start": 41603, + "type": "Literal", + "type": "Literal", + "value": 0.8733399468665124 + }, + "end": 41621, + "operator": "-", + "start": 41602, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 41628, + "start": 41566, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 41631, + "start": 41630, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 41565, + "name": "line", + "start": 41561, + "type": "Identifier" + }, + "end": 41632, + "start": 41561, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 41671, + "raw": "0.7776386664456383", + "start": 41653, + "type": "Literal", + "type": "Literal", + "value": 0.7776386664456383 + }, + "end": 41671, + "operator": "-", + "start": 41652, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 41698, + "raw": "0.7602780485384968", + "start": 41680, + "type": "Literal", + "type": "Literal", + "value": 0.7602780485384968 + } + ], + "end": 41705, + "start": 41643, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 41708, + "start": 41707, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 41642, + "name": "line", + "start": 41638, + "type": "Identifier" + }, + "end": 41709, + "start": 41638, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 41739, + "raw": "0.5439379760788592", + "start": 41721, + "type": "Literal", + "type": "Literal", + "value": 0.5439379760788592 + }, + { + "end": 41759, + "raw": "0.8449177589350552", + "start": 41741, + "type": "Literal", + "type": "Literal", + "value": 0.8449177589350552 + } + ], + "end": 41760, + "start": 41720, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 41763, + "start": 41762, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 41719, + "name": "line", + "start": 41715, + "type": "Identifier" + }, + "end": 41764, + "start": 41715, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 41804, + "raw": "0.13036646025917076", + "start": 41785, + "type": "Literal", + "type": "Literal", + "value": 0.13036646025917076 + }, + "end": 41804, + "operator": "-", + "start": 41784, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 41833, + "raw": "0.012051713627069693", + "start": 41813, + "type": "Literal", + "type": "Literal", + "value": 0.012051713627069693 + } + ], + "end": 41840, + "start": 41775, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 41843, + "start": 41842, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 41774, + "name": "line", + "start": 41770, + "type": "Identifier" + }, + "end": 41844, + "start": 41770, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 41883, + "raw": "0.1656465612645519", + "start": 41865, + "type": "Literal", + "type": "Literal", + "value": 0.1656465612645519 + }, + "end": 41883, + "operator": "-", + "start": 41864, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 41912, + "raw": "0.20775229173765486", + "start": 41893, + "type": "Literal", + "type": "Literal", + "value": 0.20775229173765486 + }, + "end": 41912, + "operator": "-", + "start": 41892, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 41919, + "start": 41855, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 41922, + "start": 41921, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 41854, + "name": "line", + "start": 41850, + "type": "Identifier" + }, + "end": 41923, + "start": 41850, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 41962, + "raw": "0.0962723255929061", + "start": 41944, + "type": "Literal", + "type": "Literal", + "value": 0.0962723255929061 + }, + "end": 41962, + "operator": "-", + "start": 41943, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 41991, + "raw": "0.05417797659066137", + "start": 41972, + "type": "Literal", + "type": "Literal", + "value": 0.05417797659066137 + }, + "end": 41991, + "operator": "-", + "start": 41971, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 41998, + "start": 41934, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 42001, + "start": 42000, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 41933, + "name": "line", + "start": 41929, + "type": "Identifier" + }, + "end": 42002, + "start": 41929, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 42031, + "raw": "0.902108945498191", + "start": 42014, + "type": "Literal", + "type": "Literal", + "value": 0.902108945498191 + }, + { + "end": 42051, + "raw": "0.3958978534964961", + "start": 42033, + "type": "Literal", + "type": "Literal", + "value": 0.3958978534964961 + } + ], + "end": 42052, + "start": 42013, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 42055, + "start": 42054, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 42012, + "name": "line", + "start": 42008, + "type": "Identifier" + }, + "end": 42056, + "start": 42008, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 42095, + "raw": "0.27997950083139167", + "start": 42076, + "type": "Literal", + "type": "Literal", + "value": 0.27997950083139167 + }, + { + "argument": { + "end": 42124, + "raw": "0.17778188444008958", + "start": 42105, + "type": "Literal", + "type": "Literal", + "value": 0.17778188444008958 + }, + "end": 42124, + "operator": "-", + "start": 42104, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 42131, + "start": 42067, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 42134, + "start": 42133, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 42066, + "name": "line", + "start": 42062, + "type": "Identifier" + }, + "end": 42135, + "start": 42062, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 42165, + "raw": "0.5235806061589545", + "start": 42147, + "type": "Literal", + "type": "Literal", + "value": 0.5235806061589545 + }, + { + "end": 42184, + "raw": "0.694318985642328", + "start": 42167, + "type": "Literal", + "type": "Literal", + "value": 0.694318985642328 + } + ], + "end": 42185, + "start": 42146, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 42188, + "start": 42187, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 42145, + "name": "line", + "start": 42141, + "type": "Identifier" + }, + "end": 42189, + "start": 42141, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 42228, + "raw": "0.39140760219992154", + "start": 42209, + "type": "Literal", + "type": "Literal", + "value": 0.39140760219992154 + }, + { + "argument": { + "end": 42256, + "raw": "0.7839795272576484", + "start": 42238, + "type": "Literal", + "type": "Literal", + "value": 0.7839795272576484 + }, + "end": 42256, + "operator": "-", + "start": 42237, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 42263, + "start": 42200, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 42266, + "start": 42265, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 42199, + "name": "line", + "start": 42195, + "type": "Identifier" + }, + "end": 42267, + "start": 42195, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 42297, + "raw": "0.8414243527073519", + "start": 42279, + "type": "Literal", + "type": "Literal", + "value": 0.8414243527073519 + }, + { + "end": 42317, + "raw": "0.5395591528940082", + "start": 42299, + "type": "Literal", + "type": "Literal", + "value": 0.5395591528940082 + } + ], + "end": 42318, + "start": 42278, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 42321, + "start": 42320, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 42277, + "name": "line", + "start": 42273, + "type": "Identifier" + }, + "end": 42322, + "start": 42273, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 42360, + "raw": "0.6137667704875602", + "start": 42342, + "type": "Literal", + "type": "Literal", + "value": 0.6137667704875602 + }, + { + "end": 42388, + "raw": "0.22119647516722085", + "start": 42369, + "type": "Literal", + "type": "Literal", + "value": 0.22119647516722085 + } + ], + "end": 42395, + "start": 42333, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 42398, + "start": 42397, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 42332, + "name": "line", + "start": 42328, + "type": "Identifier" + }, + "end": 42399, + "start": 42328, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 42429, + "raw": "0.8830488380766681", + "start": 42411, + "type": "Literal", + "type": "Literal", + "value": 0.8830488380766681 + }, + { + "end": 42449, + "raw": "0.6996724408425232", + "start": 42431, + "type": "Literal", + "type": "Literal", + "value": 0.6996724408425232 + } + ], + "end": 42450, + "start": 42410, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 42453, + "start": 42452, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 42409, + "name": "line", + "start": 42405, + "type": "Identifier" + }, + "end": 42454, + "start": 42405, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 42494, + "raw": "0.41290485754343953", + "start": 42475, + "type": "Literal", + "type": "Literal", + "value": 0.41290485754343953 + }, + "end": 42494, + "operator": "-", + "start": 42474, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 42522, + "raw": "0.4152647361760933", + "start": 42504, + "type": "Literal", + "type": "Literal", + "value": 0.4152647361760933 + }, + "end": 42522, + "operator": "-", + "start": 42503, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 42529, + "start": 42465, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 42532, + "start": 42531, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 42464, + "name": "line", + "start": 42460, + "type": "Identifier" + }, + "end": 42533, + "start": 42460, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 42571, + "raw": "0.5169538755575687", + "start": 42553, + "type": "Literal", + "type": "Literal", + "value": 0.5169538755575687 + }, + { + "argument": { + "end": 42599, + "raw": "0.9085567867302617", + "start": 42581, + "type": "Literal", + "type": "Literal", + "value": 0.9085567867302617 + }, + "end": 42599, + "operator": "-", + "start": 42580, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 42606, + "start": 42544, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 42609, + "start": 42608, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 42543, + "name": "line", + "start": 42539, + "type": "Identifier" + }, + "end": 42610, + "start": 42539, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 42648, + "raw": "0.6751951211858687", + "start": 42630, + "type": "Literal", + "type": "Literal", + "value": 0.6751951211858687 + }, + { + "argument": { + "end": 42676, + "raw": "0.9709424233465593", + "start": 42658, + "type": "Literal", + "type": "Literal", + "value": 0.9709424233465593 + }, + "end": 42676, + "operator": "-", + "start": 42657, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 42683, + "start": 42621, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 42686, + "start": 42685, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 42620, + "name": "line", + "start": 42616, + "type": "Identifier" + }, + "end": 42687, + "start": 42616, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 42726, + "raw": "0.5689619842972184", + "start": 42708, + "type": "Literal", + "type": "Literal", + "value": 0.5689619842972184 + }, + "end": 42726, + "operator": "-", + "start": 42707, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 42753, + "raw": "0.5918969913790362", + "start": 42735, + "type": "Literal", + "type": "Literal", + "value": 0.5918969913790362 + } + ], + "end": 42760, + "start": 42698, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 42763, + "start": 42762, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 42697, + "name": "line", + "start": 42693, + "type": "Identifier" + }, + "end": 42764, + "start": 42693, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 42802, + "raw": "0.9464450621708211", + "start": 42784, + "type": "Literal", + "type": "Literal", + "value": 0.9464450621708211 + }, + { + "argument": { + "end": 42830, + "raw": "0.2684908127803667", + "start": 42812, + "type": "Literal", + "type": "Literal", + "value": 0.2684908127803667 + }, + "end": 42830, + "operator": "-", + "start": 42811, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 42837, + "start": 42775, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 42840, + "start": 42839, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 42774, + "name": "line", + "start": 42770, + "type": "Identifier" + }, + "end": 42841, + "start": 42770, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 42871, + "raw": "0.5241732366617591", + "start": 42853, + "type": "Literal", + "type": "Literal", + "value": 0.5241732366617591 + }, + { + "end": 42891, + "raw": "0.9011437416408563", + "start": 42873, + "type": "Literal", + "type": "Literal", + "value": 0.9011437416408563 + } + ], + "end": 42892, + "start": 42852, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 42895, + "start": 42894, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 42851, + "name": "line", + "start": 42847, + "type": "Identifier" + }, + "end": 42896, + "start": 42847, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 42936, + "raw": "0.14255393713960607", + "start": 42917, + "type": "Literal", + "type": "Literal", + "value": 0.14255393713960607 + }, + "end": 42936, + "operator": "-", + "start": 42916, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 42964, + "raw": "0.5194262624564814", + "start": 42946, + "type": "Literal", + "type": "Literal", + "value": 0.5194262624564814 + }, + "end": 42964, + "operator": "-", + "start": 42945, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 42971, + "start": 42907, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 42974, + "start": 42973, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 42906, + "name": "line", + "start": 42902, + "type": "Identifier" + }, + "end": 42975, + "start": 42902, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 43014, + "raw": "0.4287123231350338", + "start": 42996, + "type": "Literal", + "type": "Literal", + "value": 0.4287123231350338 + }, + "end": 43014, + "operator": "-", + "start": 42995, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 43042, + "raw": "0.4223564528725028", + "start": 43024, + "type": "Literal", + "type": "Literal", + "value": 0.4223564528725028 + }, + "end": 43042, + "operator": "-", + "start": 43023, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 43049, + "start": 42986, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 43052, + "start": 43051, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 42985, + "name": "line", + "start": 42981, + "type": "Identifier" + }, + "end": 43053, + "start": 42981, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 43093, + "raw": "0.09316367294024519", + "start": 43074, + "type": "Literal", + "type": "Literal", + "value": 0.09316367294024519 + }, + "end": 43093, + "operator": "-", + "start": 43073, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 43121, + "raw": "0.9063127021008246", + "start": 43103, + "type": "Literal", + "type": "Literal", + "value": 0.9063127021008246 + }, + "end": 43121, + "operator": "-", + "start": 43102, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 43128, + "start": 43064, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 43131, + "start": 43130, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 43063, + "name": "line", + "start": 43059, + "type": "Identifier" + }, + "end": 43132, + "start": 43059, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 43171, + "raw": "0.2767766535558669", + "start": 43153, + "type": "Literal", + "type": "Literal", + "value": 0.2767766535558669 + }, + "end": 43171, + "operator": "-", + "start": 43152, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 43198, + "raw": "0.6816248114129131", + "start": 43180, + "type": "Literal", + "type": "Literal", + "value": 0.6816248114129131 + } + ], + "end": 43205, + "start": 43143, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 43208, + "start": 43207, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 43142, + "name": "line", + "start": 43138, + "type": "Identifier" + }, + "end": 43209, + "start": 43138, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 43247, + "raw": "0.9796762495562534", + "start": 43229, + "type": "Literal", + "type": "Literal", + "value": 0.9796762495562534 + }, + { + "argument": { + "end": 43275, + "raw": "0.0822145668330625", + "start": 43257, + "type": "Literal", + "type": "Literal", + "value": 0.0822145668330625 + }, + "end": 43275, + "operator": "-", + "start": 43256, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 43282, + "start": 43220, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 43285, + "start": 43284, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 43219, + "name": "line", + "start": 43215, + "type": "Identifier" + }, + "end": 43286, + "start": 43215, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 43325, + "raw": "0.8666513070867441", + "start": 43307, + "type": "Literal", + "type": "Literal", + "value": 0.8666513070867441 + }, + "end": 43325, + "operator": "-", + "start": 43306, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 43352, + "raw": "0.301053160242023", + "start": 43335, + "type": "Literal", + "type": "Literal", + "value": 0.301053160242023 + }, + "end": 43352, + "operator": "-", + "start": 43334, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 43359, + "start": 43297, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 43362, + "start": 43361, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 43296, + "name": "line", + "start": 43292, + "type": "Identifier" + }, + "end": 43363, + "start": 43292, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 43400, + "raw": "0.537415656028112", + "start": 43383, + "type": "Literal", + "type": "Literal", + "value": 0.537415656028112 + }, + { + "end": 43429, + "raw": "0.020272692875002774", + "start": 43409, + "type": "Literal", + "type": "Literal", + "value": 0.020272692875002774 + } + ], + "end": 43436, + "start": 43374, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 43439, + "start": 43438, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 43373, + "name": "line", + "start": 43369, + "type": "Identifier" + }, + "end": 43440, + "start": 43369, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 43478, + "raw": "0.9332396256457531", + "start": 43460, + "type": "Literal", + "type": "Literal", + "value": 0.9332396256457531 + }, + { + "argument": { + "end": 43506, + "raw": "0.6228175690649898", + "start": 43488, + "type": "Literal", + "type": "Literal", + "value": 0.6228175690649898 + }, + "end": 43506, + "operator": "-", + "start": 43487, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 43513, + "start": 43451, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 43516, + "start": 43515, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 43450, + "name": "line", + "start": 43446, + "type": "Identifier" + }, + "end": 43517, + "start": 43446, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 43556, + "raw": "0.18052415837320734", + "start": 43537, + "type": "Literal", + "type": "Literal", + "value": 0.18052415837320734 + }, + { + "argument": { + "end": 43585, + "raw": "0.36894384647296197", + "start": 43566, + "type": "Literal", + "type": "Literal", + "value": 0.36894384647296197 + }, + "end": 43585, + "operator": "-", + "start": 43565, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 43592, + "start": 43528, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 43595, + "start": 43594, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 43527, + "name": "line", + "start": 43523, + "type": "Identifier" + }, + "end": 43596, + "start": 43523, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 43626, + "raw": "0.5384372634075449", + "start": 43608, + "type": "Literal", + "type": "Literal", + "value": 0.5384372634075449 + }, + { + "end": 43646, + "raw": "0.2377565050887107", + "start": 43628, + "type": "Literal", + "type": "Literal", + "value": 0.2377565050887107 + } + ], + "end": 43647, + "start": 43607, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 43650, + "start": 43649, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 43606, + "name": "line", + "start": 43602, + "type": "Identifier" + }, + "end": 43651, + "start": 43602, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 43690, + "raw": "0.39043436929278874", + "start": 43671, + "type": "Literal", + "type": "Literal", + "value": 0.39043436929278874 + }, + { + "end": 43718, + "raw": "0.14273182483160451", + "start": 43699, + "type": "Literal", + "type": "Literal", + "value": 0.14273182483160451 + } + ], + "end": 43725, + "start": 43662, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 43728, + "start": 43727, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 43661, + "name": "line", + "start": 43657, + "type": "Identifier" + }, + "end": 43729, + "start": 43657, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 43768, + "raw": "0.09782890412897283", + "start": 43749, + "type": "Literal", + "type": "Literal", + "value": 0.09782890412897283 + }, + { + "end": 43795, + "raw": "0.9907667536909659", + "start": 43777, + "type": "Literal", + "type": "Literal", + "value": 0.9907667536909659 + } + ], + "end": 43802, + "start": 43740, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 43805, + "start": 43804, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 43739, + "name": "line", + "start": 43735, + "type": "Identifier" + }, + "end": 43806, + "start": 43735, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 43844, + "raw": "0.5286610085921146", + "start": 43826, + "type": "Literal", + "type": "Literal", + "value": 0.5286610085921146 + }, + { + "argument": { + "end": 43872, + "raw": "0.7924508308419256", + "start": 43854, + "type": "Literal", + "type": "Literal", + "value": 0.7924508308419256 + }, + "end": 43872, + "operator": "-", + "start": 43853, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 43879, + "start": 43817, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 43882, + "start": 43881, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 43816, + "name": "line", + "start": 43812, + "type": "Identifier" + }, + "end": 43883, + "start": 43812, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 43921, + "raw": "0.3789978184503342", + "start": 43903, + "type": "Literal", + "type": "Literal", + "value": 0.3789978184503342 + }, + { + "end": 43949, + "raw": "0.12396120576838676", + "start": 43930, + "type": "Literal", + "type": "Literal", + "value": 0.12396120576838676 + } + ], + "end": 43956, + "start": 43894, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 43959, + "start": 43958, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 43893, + "name": "line", + "start": 43889, + "type": "Identifier" + }, + "end": 43960, + "start": 43889, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 43999, + "raw": "0.9484912744890612", + "start": 43981, + "type": "Literal", + "type": "Literal", + "value": 0.9484912744890612 + }, + "end": 43999, + "operator": "-", + "start": 43980, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 44026, + "raw": "0.6729649846476855", + "start": 44008, + "type": "Literal", + "type": "Literal", + "value": 0.6729649846476855 + } + ], + "end": 44033, + "start": 43971, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 44036, + "start": 44035, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 43970, + "name": "line", + "start": 43966, + "type": "Identifier" + }, + "end": 44037, + "start": 43966, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 44075, + "raw": "0.7451758753425153", + "start": 44057, + "type": "Literal", + "type": "Literal", + "value": 0.7451758753425153 + }, + { + "argument": { + "end": 44104, + "raw": "0.21318737562458967", + "start": 44085, + "type": "Literal", + "type": "Literal", + "value": 0.21318737562458967 + }, + "end": 44104, + "operator": "-", + "start": 44084, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 44111, + "start": 44048, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 44114, + "start": 44113, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 44047, + "name": "line", + "start": 44043, + "type": "Identifier" + }, + "end": 44115, + "start": 44043, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 44153, + "raw": "0.1873200727251887", + "start": 44135, + "type": "Literal", + "type": "Literal", + "value": 0.1873200727251887 + }, + { + "argument": { + "end": 44182, + "raw": "0.15961374297992448", + "start": 44163, + "type": "Literal", + "type": "Literal", + "value": 0.15961374297992448 + }, + "end": 44182, + "operator": "-", + "start": 44162, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 44189, + "start": 44126, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 44192, + "start": 44191, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 44125, + "name": "line", + "start": 44121, + "type": "Identifier" + }, + "end": 44193, + "start": 44121, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 44233, + "raw": "0.05729464924537564", + "start": 44214, + "type": "Literal", + "type": "Literal", + "value": 0.05729464924537564 + }, + "end": 44233, + "operator": "-", + "start": 44213, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 44261, + "raw": "0.5436345558508746", + "start": 44243, + "type": "Literal", + "type": "Literal", + "value": 0.5436345558508746 + }, + "end": 44261, + "operator": "-", + "start": 44242, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 44268, + "start": 44204, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 44271, + "start": 44270, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 44203, + "name": "line", + "start": 44199, + "type": "Identifier" + }, + "end": 44272, + "start": 44199, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 44312, + "raw": "0.09582414374469184", + "start": 44293, + "type": "Literal", + "type": "Literal", + "value": 0.09582414374469184 + }, + "end": 44312, + "operator": "-", + "start": 44292, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 44340, + "raw": "0.7533839681212353", + "start": 44322, + "type": "Literal", + "type": "Literal", + "value": 0.7533839681212353 + }, + "end": 44340, + "operator": "-", + "start": 44321, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 44347, + "start": 44283, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 44350, + "start": 44349, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 44282, + "name": "line", + "start": 44278, + "type": "Identifier" + }, + "end": 44351, + "start": 44278, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 44391, + "raw": "0.17254116580051848", + "start": 44372, + "type": "Literal", + "type": "Literal", + "value": 0.17254116580051848 + }, + "end": 44391, + "operator": "-", + "start": 44371, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 44419, + "raw": "0.7669113400341137", + "start": 44401, + "type": "Literal", + "type": "Literal", + "value": 0.7669113400341137 + }, + "end": 44419, + "operator": "-", + "start": 44400, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 44426, + "start": 44362, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 44429, + "start": 44428, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 44361, + "name": "line", + "start": 44357, + "type": "Identifier" + }, + "end": 44430, + "start": 44357, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 44460, + "raw": "0.8944730032887609", + "start": 44442, + "type": "Literal", + "type": "Literal", + "value": 0.8944730032887609 + }, + { + "end": 44480, + "raw": "0.6093318694741408", + "start": 44462, + "type": "Literal", + "type": "Literal", + "value": 0.6093318694741408 + } + ], + "end": 44481, + "start": 44441, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 44484, + "start": 44483, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 44440, + "name": "line", + "start": 44436, + "type": "Identifier" + }, + "end": 44485, + "start": 44436, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 44524, + "raw": "0.3670208139314082", + "start": 44506, + "type": "Literal", + "type": "Literal", + "value": 0.3670208139314082 + }, + "end": 44524, + "operator": "-", + "start": 44505, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 44552, + "raw": "0.21201331909674526", + "start": 44533, + "type": "Literal", + "type": "Literal", + "value": 0.21201331909674526 + } + ], + "end": 44559, + "start": 44496, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 44562, + "start": 44561, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 44495, + "name": "line", + "start": 44491, + "type": "Identifier" + }, + "end": 44563, + "start": 44491, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 44602, + "raw": "0.4707511307971115", + "start": 44584, + "type": "Literal", + "type": "Literal", + "value": 0.4707511307971115 + }, + "end": 44602, + "operator": "-", + "start": 44583, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 44629, + "raw": "0.4905279615419764", + "start": 44611, + "type": "Literal", + "type": "Literal", + "value": 0.4905279615419764 + } + ], + "end": 44636, + "start": 44574, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 44639, + "start": 44638, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 44573, + "name": "line", + "start": 44569, + "type": "Identifier" + }, + "end": 44640, + "start": 44569, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 44679, + "raw": "0.8328324229085962", + "start": 44661, + "type": "Literal", + "type": "Literal", + "value": 0.8328324229085962 + }, + "end": 44679, + "operator": "-", + "start": 44660, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 44706, + "raw": "0.4677492878818803", + "start": 44688, + "type": "Literal", + "type": "Literal", + "value": 0.4677492878818803 + } + ], + "end": 44713, + "start": 44651, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 44716, + "start": 44715, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 44650, + "name": "line", + "start": 44646, + "type": "Identifier" + }, + "end": 44717, + "start": 44646, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 44756, + "raw": "0.8111463382182231", + "start": 44738, + "type": "Literal", + "type": "Literal", + "value": 0.8111463382182231 + }, + "end": 44756, + "operator": "-", + "start": 44737, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 44785, + "raw": "0.41814807547140576", + "start": 44766, + "type": "Literal", + "type": "Literal", + "value": 0.41814807547140576 + }, + "end": 44785, + "operator": "-", + "start": 44765, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 44792, + "start": 44728, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 44795, + "start": 44794, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 44727, + "name": "line", + "start": 44723, + "type": "Identifier" + }, + "end": 44796, + "start": 44723, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 44835, + "raw": "0.03807684940941125", + "start": 44816, + "type": "Literal", + "type": "Literal", + "value": 0.03807684940941125 + }, + { + "end": 44863, + "raw": "0.25664826686353326", + "start": 44844, + "type": "Literal", + "type": "Literal", + "value": 0.25664826686353326 + } + ], + "end": 44870, + "start": 44807, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 44873, + "start": 44872, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 44806, + "name": "line", + "start": 44802, + "type": "Identifier" + }, + "end": 44874, + "start": 44802, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 44913, + "raw": "0.23950083339596384", + "start": 44894, + "type": "Literal", + "type": "Literal", + "value": 0.23950083339596384 + }, + { + "end": 44941, + "raw": "0.43693196301855575", + "start": 44922, + "type": "Literal", + "type": "Literal", + "value": 0.43693196301855575 + } + ], + "end": 44948, + "start": 44885, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 44951, + "start": 44950, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 44884, + "name": "line", + "start": 44880, + "type": "Identifier" + }, + "end": 44952, + "start": 44880, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 44992, + "raw": "0.16279444820904887", + "start": 44973, + "type": "Literal", + "type": "Literal", + "value": 0.16279444820904887 + }, + "end": 44992, + "operator": "-", + "start": 44972, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 45019, + "raw": "0.8064475707664818", + "start": 45001, + "type": "Literal", + "type": "Literal", + "value": 0.8064475707664818 + } + ], + "end": 45026, + "start": 44963, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 45029, + "start": 45028, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 44962, + "name": "line", + "start": 44958, + "type": "Identifier" + }, + "end": 45030, + "start": 44958, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 45070, + "raw": "0.08972872009232558", + "start": 45051, + "type": "Literal", + "type": "Literal", + "value": 0.08972872009232558 + }, + "end": 45070, + "operator": "-", + "start": 45050, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 45099, + "raw": "0.08887625823751266", + "start": 45080, + "type": "Literal", + "type": "Literal", + "value": 0.08887625823751266 + }, + "end": 45099, + "operator": "-", + "start": 45079, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 45106, + "start": 45041, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 45109, + "start": 45108, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 45040, + "name": "line", + "start": 45036, + "type": "Identifier" + }, + "end": 45110, + "start": 45036, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 45148, + "raw": "0.9203433427102556", + "start": 45130, + "type": "Literal", + "type": "Literal", + "value": 0.9203433427102556 + }, + { + "argument": { + "end": 45177, + "raw": "0.17343459369697545", + "start": 45158, + "type": "Literal", + "type": "Literal", + "value": 0.17343459369697545 + }, + "end": 45177, + "operator": "-", + "start": 45157, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 45184, + "start": 45121, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 45187, + "start": 45186, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 45120, + "name": "line", + "start": 45116, + "type": "Identifier" + }, + "end": 45188, + "start": 45116, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 45229, + "raw": "0.0017496234414517975", + "start": 45208, + "type": "Literal", + "type": "Literal", + "value": 0.0017496234414517975 + }, + { + "argument": { + "end": 45257, + "raw": "0.5178508316168335", + "start": 45239, + "type": "Literal", + "type": "Literal", + "value": 0.5178508316168335 + }, + "end": 45257, + "operator": "-", + "start": 45238, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 45264, + "start": 45199, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 45267, + "start": 45266, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 45198, + "name": "line", + "start": 45194, + "type": "Identifier" + }, + "end": 45268, + "start": 45194, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 45306, + "raw": "0.6206263405732759", + "start": 45288, + "type": "Literal", + "type": "Literal", + "value": 0.6206263405732759 + }, + { + "argument": { + "end": 45334, + "raw": "0.8733399468665124", + "start": 45316, + "type": "Literal", + "type": "Literal", + "value": 0.8733399468665124 + }, + "end": 45334, + "operator": "-", + "start": 45315, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 45341, + "start": 45279, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 45344, + "start": 45343, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 45278, + "name": "line", + "start": 45274, + "type": "Identifier" + }, + "end": 45345, + "start": 45274, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 45384, + "raw": "0.7776386664456383", + "start": 45366, + "type": "Literal", + "type": "Literal", + "value": 0.7776386664456383 + }, + "end": 45384, + "operator": "-", + "start": 45365, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 45411, + "raw": "0.7602780485384968", + "start": 45393, + "type": "Literal", + "type": "Literal", + "value": 0.7602780485384968 + } + ], + "end": 45418, + "start": 45356, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 45421, + "start": 45420, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 45355, + "name": "line", + "start": 45351, + "type": "Identifier" + }, + "end": 45422, + "start": 45351, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 45452, + "raw": "0.5439379760788592", + "start": 45434, + "type": "Literal", + "type": "Literal", + "value": 0.5439379760788592 + }, + { + "end": 45472, + "raw": "0.8449177589350552", + "start": 45454, + "type": "Literal", + "type": "Literal", + "value": 0.8449177589350552 + } + ], + "end": 45473, + "start": 45433, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 45476, + "start": 45475, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 45432, + "name": "line", + "start": 45428, + "type": "Identifier" + }, + "end": 45477, + "start": 45428, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 45517, + "raw": "0.13036646025917076", + "start": 45498, + "type": "Literal", + "type": "Literal", + "value": 0.13036646025917076 + }, + "end": 45517, + "operator": "-", + "start": 45497, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 45546, + "raw": "0.012051713627069693", + "start": 45526, + "type": "Literal", + "type": "Literal", + "value": 0.012051713627069693 + } + ], + "end": 45553, + "start": 45488, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 45556, + "start": 45555, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 45487, + "name": "line", + "start": 45483, + "type": "Identifier" + }, + "end": 45557, + "start": 45483, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 45596, + "raw": "0.1656465612645519", + "start": 45578, + "type": "Literal", + "type": "Literal", + "value": 0.1656465612645519 + }, + "end": 45596, + "operator": "-", + "start": 45577, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 45625, + "raw": "0.20775229173765486", + "start": 45606, + "type": "Literal", + "type": "Literal", + "value": 0.20775229173765486 + }, + "end": 45625, + "operator": "-", + "start": 45605, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 45632, + "start": 45568, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 45635, + "start": 45634, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 45567, + "name": "line", + "start": 45563, + "type": "Identifier" + }, + "end": 45636, + "start": 45563, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 45675, + "raw": "0.0962723255929061", + "start": 45657, + "type": "Literal", + "type": "Literal", + "value": 0.0962723255929061 + }, + "end": 45675, + "operator": "-", + "start": 45656, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 45704, + "raw": "0.05417797659066137", + "start": 45685, + "type": "Literal", + "type": "Literal", + "value": 0.05417797659066137 + }, + "end": 45704, + "operator": "-", + "start": 45684, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 45711, + "start": 45647, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 45714, + "start": 45713, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 45646, + "name": "line", + "start": 45642, + "type": "Identifier" + }, + "end": 45715, + "start": 45642, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 45744, + "raw": "0.902108945498191", + "start": 45727, + "type": "Literal", + "type": "Literal", + "value": 0.902108945498191 + }, + { + "end": 45764, + "raw": "0.3958978534964961", + "start": 45746, + "type": "Literal", + "type": "Literal", + "value": 0.3958978534964961 + } + ], + "end": 45765, + "start": 45726, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 45768, + "start": 45767, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 45725, + "name": "line", + "start": 45721, + "type": "Identifier" + }, + "end": 45769, + "start": 45721, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 45808, + "raw": "0.27997950083139167", + "start": 45789, + "type": "Literal", + "type": "Literal", + "value": 0.27997950083139167 + }, + { + "argument": { + "end": 45837, + "raw": "0.17778188444008958", + "start": 45818, + "type": "Literal", + "type": "Literal", + "value": 0.17778188444008958 + }, + "end": 45837, + "operator": "-", + "start": 45817, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 45844, + "start": 45780, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 45847, + "start": 45846, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 45779, + "name": "line", + "start": 45775, + "type": "Identifier" + }, + "end": 45848, + "start": 45775, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 45878, + "raw": "0.5235806061589545", + "start": 45860, + "type": "Literal", + "type": "Literal", + "value": 0.5235806061589545 + }, + { + "end": 45897, + "raw": "0.694318985642328", + "start": 45880, + "type": "Literal", + "type": "Literal", + "value": 0.694318985642328 + } + ], + "end": 45898, + "start": 45859, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 45901, + "start": 45900, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 45858, + "name": "line", + "start": 45854, + "type": "Identifier" + }, + "end": 45902, + "start": 45854, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 45941, + "raw": "0.39140760219992154", + "start": 45922, + "type": "Literal", + "type": "Literal", + "value": 0.39140760219992154 + }, + { + "argument": { + "end": 45969, + "raw": "0.7839795272576484", + "start": 45951, + "type": "Literal", + "type": "Literal", + "value": 0.7839795272576484 + }, + "end": 45969, + "operator": "-", + "start": 45950, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 45976, + "start": 45913, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 45979, + "start": 45978, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 45912, + "name": "line", + "start": 45908, + "type": "Identifier" + }, + "end": 45980, + "start": 45908, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 46010, + "raw": "0.8414243527073519", + "start": 45992, + "type": "Literal", + "type": "Literal", + "value": 0.8414243527073519 + }, + { + "end": 46030, + "raw": "0.5395591528940082", + "start": 46012, + "type": "Literal", + "type": "Literal", + "value": 0.5395591528940082 + } + ], + "end": 46031, + "start": 45991, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 46034, + "start": 46033, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 45990, + "name": "line", + "start": 45986, + "type": "Identifier" + }, + "end": 46035, + "start": 45986, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 46073, + "raw": "0.6137667704875602", + "start": 46055, + "type": "Literal", + "type": "Literal", + "value": 0.6137667704875602 + }, + { + "end": 46101, + "raw": "0.22119647516722085", + "start": 46082, + "type": "Literal", + "type": "Literal", + "value": 0.22119647516722085 + } + ], + "end": 46108, + "start": 46046, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 46111, + "start": 46110, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 46045, + "name": "line", + "start": 46041, + "type": "Identifier" + }, + "end": 46112, + "start": 46041, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 46142, + "raw": "0.8830488380766681", + "start": 46124, + "type": "Literal", + "type": "Literal", + "value": 0.8830488380766681 + }, + { + "end": 46162, + "raw": "0.6996724408425232", + "start": 46144, + "type": "Literal", + "type": "Literal", + "value": 0.6996724408425232 + } + ], + "end": 46163, + "start": 46123, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 46166, + "start": 46165, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 46122, + "name": "line", + "start": 46118, + "type": "Identifier" + }, + "end": 46167, + "start": 46118, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 46207, + "raw": "0.41290485754343953", + "start": 46188, + "type": "Literal", + "type": "Literal", + "value": 0.41290485754343953 + }, + "end": 46207, + "operator": "-", + "start": 46187, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 46235, + "raw": "0.4152647361760933", + "start": 46217, + "type": "Literal", + "type": "Literal", + "value": 0.4152647361760933 + }, + "end": 46235, + "operator": "-", + "start": 46216, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 46242, + "start": 46178, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 46245, + "start": 46244, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 46177, + "name": "line", + "start": 46173, + "type": "Identifier" + }, + "end": 46246, + "start": 46173, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 46284, + "raw": "0.5169538755575687", + "start": 46266, + "type": "Literal", + "type": "Literal", + "value": 0.5169538755575687 + }, + { + "argument": { + "end": 46312, + "raw": "0.9085567867302617", + "start": 46294, + "type": "Literal", + "type": "Literal", + "value": 0.9085567867302617 + }, + "end": 46312, + "operator": "-", + "start": 46293, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 46319, + "start": 46257, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 46322, + "start": 46321, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 46256, + "name": "line", + "start": 46252, + "type": "Identifier" + }, + "end": 46323, + "start": 46252, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 46362, + "raw": "0.6716353749059765", + "start": 46344, + "type": "Literal", + "type": "Literal", + "value": 0.6716353749059765 + }, + "end": 46362, + "operator": "-", + "start": 46343, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 46390, + "raw": "0.9605576808879026", + "start": 46372, + "type": "Literal", + "type": "Literal", + "value": 0.9605576808879026 + }, + "end": 46390, + "operator": "-", + "start": 46371, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 46397, + "start": 46334, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 46400, + "start": 46399, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 46333, + "name": "line", + "start": 46329, + "type": "Identifier" + }, + "end": 46401, + "start": 46329, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 46441, + "raw": "0.010280170930300203", + "start": 46421, + "type": "Literal", + "type": "Literal", + "value": 0.010280170930300203 + }, + { + "argument": { + "end": 46470, + "raw": "0.37344123662342166", + "start": 46451, + "type": "Literal", + "type": "Literal", + "value": 0.37344123662342166 + }, + "end": 46470, + "operator": "-", + "start": 46450, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 46477, + "start": 46412, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 46480, + "start": 46479, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 46411, + "name": "line", + "start": 46407, + "type": "Identifier" + }, + "end": 46481, + "start": 46407, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 46520, + "raw": "0.10357375682791004", + "start": 46501, + "type": "Literal", + "type": "Literal", + "value": 0.10357375682791004 + }, + { + "argument": { + "end": 46549, + "raw": "0.42294321030821425", + "start": 46530, + "type": "Literal", + "type": "Literal", + "value": 0.42294321030821425 + }, + "end": 46549, + "operator": "-", + "start": 46529, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 46556, + "start": 46492, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 46559, + "start": 46558, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 46491, + "name": "line", + "start": 46487, + "type": "Identifier" + }, + "end": 46560, + "start": 46487, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 46598, + "raw": "0.4520311575096987", + "start": 46580, + "type": "Literal", + "type": "Literal", + "value": 0.4520311575096987 + }, + { + "argument": { + "end": 46627, + "raw": "0.11232675307600548", + "start": 46608, + "type": "Literal", + "type": "Literal", + "value": 0.11232675307600548 + }, + "end": 46627, + "operator": "-", + "start": 46607, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 46634, + "start": 46571, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 46637, + "start": 46636, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 46570, + "name": "line", + "start": 46566, + "type": "Identifier" + }, + "end": 46638, + "start": 46566, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 46677, + "raw": "0.8821185914380845", + "start": 46659, + "type": "Literal", + "type": "Literal", + "value": 0.8821185914380845 + }, + "end": 46677, + "operator": "-", + "start": 46658, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 46705, + "raw": "0.7155147434939819", + "start": 46687, + "type": "Literal", + "type": "Literal", + "value": 0.7155147434939819 + }, + "end": 46705, + "operator": "-", + "start": 46686, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 46712, + "start": 46649, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 46715, + "start": 46714, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 46648, + "name": "line", + "start": 46644, + "type": "Identifier" + }, + "end": 46716, + "start": 46644, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 46746, + "raw": "0.9195487101690416", + "start": 46728, + "type": "Literal", + "type": "Literal", + "value": 0.9195487101690416 + }, + { + "end": 46766, + "raw": "0.2691627465297364", + "start": 46748, + "type": "Literal", + "type": "Literal", + "value": 0.2691627465297364 + } + ], + "end": 46767, + "start": 46727, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 46770, + "start": 46769, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 46726, + "name": "line", + "start": 46722, + "type": "Identifier" + }, + "end": 46771, + "start": 46722, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 46809, + "raw": "0.7098978191546745", + "start": 46791, + "type": "Literal", + "type": "Literal", + "value": 0.7098978191546745 + }, + { + "end": 46837, + "raw": "0.11710004169385968", + "start": 46818, + "type": "Literal", + "type": "Literal", + "value": 0.11710004169385968 + } + ], + "end": 46844, + "start": 46782, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 46847, + "start": 46846, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 46781, + "name": "line", + "start": 46777, + "type": "Identifier" + }, + "end": 46848, + "start": 46777, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 46888, + "raw": "0.37876368560819995", + "start": 46869, + "type": "Literal", + "type": "Literal", + "value": 0.37876368560819995 + }, + "end": 46888, + "operator": "-", + "start": 46868, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 46915, + "raw": "0.7106729314759084", + "start": 46897, + "type": "Literal", + "type": "Literal", + "value": 0.7106729314759084 + } + ], + "end": 46922, + "start": 46859, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 46925, + "start": 46924, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 46858, + "name": "line", + "start": 46854, + "type": "Identifier" + }, + "end": 46926, + "start": 46854, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 46966, + "raw": "0.29728126898353335", + "start": 46947, + "type": "Literal", + "type": "Literal", + "value": 0.29728126898353335 + }, + "end": 46966, + "operator": "-", + "start": 46946, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 46995, + "raw": "0.06649734568328003", + "start": 46976, + "type": "Literal", + "type": "Literal", + "value": 0.06649734568328003 + }, + "end": 46995, + "operator": "-", + "start": 46975, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 47002, + "start": 46937, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 47005, + "start": 47004, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 46936, + "name": "line", + "start": 46932, + "type": "Identifier" + }, + "end": 47006, + "start": 46932, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 47045, + "raw": "0.22965781558352072", + "start": 47026, + "type": "Literal", + "type": "Literal", + "value": 0.22965781558352072 + }, + { + "argument": { + "end": 47073, + "raw": "0.7601866432836641", + "start": 47055, + "type": "Literal", + "type": "Literal", + "value": 0.7601866432836641 + }, + "end": 47073, + "operator": "-", + "start": 47054, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 47080, + "start": 47017, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 47083, + "start": 47082, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 47016, + "name": "line", + "start": 47012, + "type": "Identifier" + }, + "end": 47084, + "start": 47012, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 47123, + "raw": "0.6356501074317229", + "start": 47105, + "type": "Literal", + "type": "Literal", + "value": 0.6356501074317229 + }, + "end": 47123, + "operator": "-", + "start": 47104, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 47151, + "raw": "0.19458425399338064", + "start": 47132, + "type": "Literal", + "type": "Literal", + "value": 0.19458425399338064 + } + ], + "end": 47158, + "start": 47095, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 47161, + "start": 47160, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 47094, + "name": "line", + "start": 47090, + "type": "Identifier" + }, + "end": 47162, + "start": 47090, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 47192, + "raw": "0.5721251777404546", + "start": 47174, + "type": "Literal", + "type": "Literal", + "value": 0.5721251777404546 + }, + { + "end": 47212, + "raw": "0.2888584097921527", + "start": 47194, + "type": "Literal", + "type": "Literal", + "value": 0.2888584097921527 + } + ], + "end": 47213, + "start": 47173, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 47216, + "start": 47215, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 47172, + "name": "line", + "start": 47168, + "type": "Identifier" + }, + "end": 47217, + "start": 47168, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 47256, + "raw": "0.9580409549552311", + "start": 47238, + "type": "Literal", + "type": "Literal", + "value": 0.9580409549552311 + }, + "end": 47256, + "operator": "-", + "start": 47237, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 47285, + "raw": "0.02243818192078395", + "start": 47266, + "type": "Literal", + "type": "Literal", + "value": 0.02243818192078395 + }, + "end": 47285, + "operator": "-", + "start": 47265, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 47292, + "start": 47228, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 47295, + "start": 47294, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 47227, + "name": "line", + "start": 47223, + "type": "Identifier" + }, + "end": 47296, + "start": 47223, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 47334, + "raw": "0.3299184618602866", + "start": 47316, + "type": "Literal", + "type": "Literal", + "value": 0.3299184618602866 + }, + { + "argument": { + "end": 47362, + "raw": "0.8353726942369875", + "start": 47344, + "type": "Literal", + "type": "Literal", + "value": 0.8353726942369875 + }, + "end": 47362, + "operator": "-", + "start": 47343, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 47369, + "start": 47307, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 47372, + "start": 47371, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 47306, + "name": "line", + "start": 47302, + "type": "Identifier" + }, + "end": 47373, + "start": 47302, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 47411, + "raw": "0.7434639386755209", + "start": 47393, + "type": "Literal", + "type": "Literal", + "value": 0.7434639386755209 + }, + { + "argument": { + "end": 47439, + "raw": "0.7919648864138378", + "start": 47421, + "type": "Literal", + "type": "Literal", + "value": 0.7919648864138378 + }, + "end": 47439, + "operator": "-", + "start": 47420, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 47446, + "start": 47384, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 47449, + "start": 47448, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 47383, + "name": "line", + "start": 47379, + "type": "Identifier" + }, + "end": 47450, + "start": 47379, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 47480, + "raw": "0.9935751011164615", + "start": 47462, + "type": "Literal", + "type": "Literal", + "value": 0.9935751011164615 + }, + { + "end": 47500, + "raw": "0.9042566468497608", + "start": 47482, + "type": "Literal", + "type": "Literal", + "value": 0.9042566468497608 + } + ], + "end": 47501, + "start": 47461, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 47504, + "start": 47503, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 47460, + "name": "line", + "start": 47456, + "type": "Identifier" + }, + "end": 47505, + "start": 47456, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 47544, + "raw": "0.5035812884687294", + "start": 47526, + "type": "Literal", + "type": "Literal", + "value": 0.5035812884687294 + }, + "end": 47544, + "operator": "-", + "start": 47525, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 47571, + "raw": "0.5150967434989442", + "start": 47553, + "type": "Literal", + "type": "Literal", + "value": 0.5150967434989442 + } + ], + "end": 47578, + "start": 47516, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 47581, + "start": 47580, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 47515, + "name": "line", + "start": 47511, + "type": "Identifier" + }, + "end": 47582, + "start": 47511, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 47612, + "raw": "0.5526227215900215", + "start": 47594, + "type": "Literal", + "type": "Literal", + "value": 0.5526227215900215 + }, + { + "end": 47632, + "raw": "0.7612604137272441", + "start": 47614, + "type": "Literal", + "type": "Literal", + "value": 0.7612604137272441 + } + ], + "end": 47633, + "start": 47593, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 47636, + "start": 47635, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 47592, + "name": "line", + "start": 47588, + "type": "Identifier" + }, + "end": 47637, + "start": 47588, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 47675, + "raw": "0.8593271349126876", + "start": 47657, + "type": "Literal", + "type": "Literal", + "value": 0.8593271349126876 + }, + { + "end": 47703, + "raw": "0.08414894953725849", + "start": 47684, + "type": "Literal", + "type": "Literal", + "value": 0.08414894953725849 + } + ], + "end": 47710, + "start": 47648, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 47713, + "start": 47712, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 47647, + "name": "line", + "start": 47643, + "type": "Identifier" + }, + "end": 47714, + "start": 47643, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 47753, + "raw": "0.8181049219192864", + "start": 47735, + "type": "Literal", + "type": "Literal", + "value": 0.8181049219192864 + }, + "end": 47753, + "operator": "-", + "start": 47734, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 47780, + "raw": "0.903548131323352", + "start": 47763, + "type": "Literal", + "type": "Literal", + "value": 0.903548131323352 + }, + "end": 47780, + "operator": "-", + "start": 47762, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 47787, + "start": 47725, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 47790, + "start": 47789, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 47724, + "name": "line", + "start": 47720, + "type": "Identifier" + }, + "end": 47791, + "start": 47720, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 47829, + "raw": "0.3165782044458305", + "start": 47811, + "type": "Literal", + "type": "Literal", + "value": 0.3165782044458305 + }, + { + "argument": { + "end": 47858, + "raw": "0.24189274252014914", + "start": 47839, + "type": "Literal", + "type": "Literal", + "value": 0.24189274252014914 + }, + "end": 47858, + "operator": "-", + "start": 47838, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 47865, + "start": 47802, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 47868, + "start": 47867, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 47801, + "name": "line", + "start": 47797, + "type": "Identifier" + }, + "end": 47869, + "start": 47797, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 47909, + "raw": "0.44390956414045135", + "start": 47890, + "type": "Literal", + "type": "Literal", + "value": 0.44390956414045135 + }, + "end": 47909, + "operator": "-", + "start": 47889, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 47938, + "raw": "0.25912591535126905", + "start": 47919, + "type": "Literal", + "type": "Literal", + "value": 0.25912591535126905 + }, + "end": 47938, + "operator": "-", + "start": 47918, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 47945, + "start": 47880, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 47948, + "start": 47947, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 47879, + "name": "line", + "start": 47875, + "type": "Identifier" + }, + "end": 47949, + "start": 47875, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 47988, + "raw": "0.6605165911891009", + "start": 47970, + "type": "Literal", + "type": "Literal", + "value": 0.6605165911891009 + }, + "end": 47988, + "operator": "-", + "start": 47969, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 48017, + "raw": "0.40355115288839194", + "start": 47998, + "type": "Literal", + "type": "Literal", + "value": 0.40355115288839194 + }, + "end": 48017, + "operator": "-", + "start": 47997, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 48024, + "start": 47960, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 48027, + "start": 48026, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 47959, + "name": "line", + "start": 47955, + "type": "Identifier" + }, + "end": 48028, + "start": 47955, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 48067, + "raw": "0.7170489950180006", + "start": 48049, + "type": "Literal", + "type": "Literal", + "value": 0.7170489950180006 + }, + "end": 48067, + "operator": "-", + "start": 48048, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 48095, + "raw": "0.23454356079651384", + "start": 48076, + "type": "Literal", + "type": "Literal", + "value": 0.23454356079651384 + } + ], + "end": 48102, + "start": 48039, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 48105, + "start": 48104, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 48038, + "name": "line", + "start": 48034, + "type": "Identifier" + }, + "end": 48106, + "start": 48034, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 48145, + "raw": "0.2568187045379722", + "start": 48127, + "type": "Literal", + "type": "Literal", + "value": 0.2568187045379722 + }, + "end": 48145, + "operator": "-", + "start": 48126, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 48174, + "raw": "0.45031188717601367", + "start": 48155, + "type": "Literal", + "type": "Literal", + "value": 0.45031188717601367 + }, + "end": 48174, + "operator": "-", + "start": 48154, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 48181, + "start": 48117, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 48184, + "start": 48183, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 48116, + "name": "line", + "start": 48112, + "type": "Identifier" + }, + "end": 48185, + "start": 48112, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 48223, + "raw": "0.6751951211858687", + "start": 48205, + "type": "Literal", + "type": "Literal", + "value": 0.6751951211858687 + }, + { + "argument": { + "end": 48251, + "raw": "0.9709424233465593", + "start": 48233, + "type": "Literal", + "type": "Literal", + "value": 0.9709424233465593 + }, + "end": 48251, + "operator": "-", + "start": 48232, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 48258, + "start": 48196, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 48261, + "start": 48260, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 48195, + "name": "line", + "start": 48191, + "type": "Identifier" + }, + "end": 48262, + "start": 48191, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 48301, + "raw": "0.5689619842972184", + "start": 48283, + "type": "Literal", + "type": "Literal", + "value": 0.5689619842972184 + }, + "end": 48301, + "operator": "-", + "start": 48282, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 48328, + "raw": "0.5918969913790362", + "start": 48310, + "type": "Literal", + "type": "Literal", + "value": 0.5918969913790362 + } + ], + "end": 48335, + "start": 48273, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 48338, + "start": 48337, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 48272, + "name": "line", + "start": 48268, + "type": "Identifier" + }, + "end": 48339, + "start": 48268, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 48378, + "raw": "0.8328324229085962", + "start": 48360, + "type": "Literal", + "type": "Literal", + "value": 0.8328324229085962 + }, + "end": 48378, + "operator": "-", + "start": 48359, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 48405, + "raw": "0.4677492878818803", + "start": 48387, + "type": "Literal", + "type": "Literal", + "value": 0.4677492878818803 + } + ], + "end": 48412, + "start": 48350, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 48415, + "start": 48414, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 48349, + "name": "line", + "start": 48345, + "type": "Identifier" + }, + "end": 48416, + "start": 48345, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 48455, + "raw": "0.8111463382182231", + "start": 48437, + "type": "Literal", + "type": "Literal", + "value": 0.8111463382182231 + }, + "end": 48455, + "operator": "-", + "start": 48436, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 48484, + "raw": "0.41814807547140576", + "start": 48465, + "type": "Literal", + "type": "Literal", + "value": 0.41814807547140576 + }, + "end": 48484, + "operator": "-", + "start": 48464, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 48491, + "start": 48427, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 48494, + "start": 48493, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 48426, + "name": "line", + "start": 48422, + "type": "Identifier" + }, + "end": 48495, + "start": 48422, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 48534, + "raw": "0.03807684940941125", + "start": 48515, + "type": "Literal", + "type": "Literal", + "value": 0.03807684940941125 + }, + { + "end": 48562, + "raw": "0.25664826686353326", + "start": 48543, + "type": "Literal", + "type": "Literal", + "value": 0.25664826686353326 + } + ], + "end": 48569, + "start": 48506, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 48572, + "start": 48571, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 48505, + "name": "line", + "start": 48501, + "type": "Identifier" + }, + "end": 48573, + "start": 48501, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 48612, + "raw": "0.23950083339596384", + "start": 48593, + "type": "Literal", + "type": "Literal", + "value": 0.23950083339596384 + }, + { + "end": 48640, + "raw": "0.43693196301855575", + "start": 48621, + "type": "Literal", + "type": "Literal", + "value": 0.43693196301855575 + } + ], + "end": 48647, + "start": 48584, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 48650, + "start": 48649, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 48583, + "name": "line", + "start": 48579, + "type": "Identifier" + }, + "end": 48651, + "start": 48579, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 48691, + "raw": "0.16279444820904887", + "start": 48672, + "type": "Literal", + "type": "Literal", + "value": 0.16279444820904887 + }, + "end": 48691, + "operator": "-", + "start": 48671, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 48718, + "raw": "0.8064475707664818", + "start": 48700, + "type": "Literal", + "type": "Literal", + "value": 0.8064475707664818 + } + ], + "end": 48725, + "start": 48662, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 48728, + "start": 48727, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 48661, + "name": "line", + "start": 48657, + "type": "Identifier" + }, + "end": 48729, + "start": 48657, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 48769, + "raw": "0.08972872009232558", + "start": 48750, + "type": "Literal", + "type": "Literal", + "value": 0.08972872009232558 + }, + "end": 48769, + "operator": "-", + "start": 48749, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 48798, + "raw": "0.08887625823751266", + "start": 48779, + "type": "Literal", + "type": "Literal", + "value": 0.08887625823751266 + }, + "end": 48798, + "operator": "-", + "start": 48778, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 48805, + "start": 48740, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 48808, + "start": 48807, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 48739, + "name": "line", + "start": 48735, + "type": "Identifier" + }, + "end": 48809, + "start": 48735, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 48847, + "raw": "0.9203433427102556", + "start": 48829, + "type": "Literal", + "type": "Literal", + "value": 0.9203433427102556 + }, + { + "argument": { + "end": 48876, + "raw": "0.17343459369697545", + "start": 48857, + "type": "Literal", + "type": "Literal", + "value": 0.17343459369697545 + }, + "end": 48876, + "operator": "-", + "start": 48856, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 48883, + "start": 48820, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 48886, + "start": 48885, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 48819, + "name": "line", + "start": 48815, + "type": "Identifier" + }, + "end": 48887, + "start": 48815, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 48928, + "raw": "0.0017496234414517975", + "start": 48907, + "type": "Literal", + "type": "Literal", + "value": 0.0017496234414517975 + }, + { + "argument": { + "end": 48956, + "raw": "0.5178508316168335", + "start": 48938, + "type": "Literal", + "type": "Literal", + "value": 0.5178508316168335 + }, + "end": 48956, + "operator": "-", + "start": 48937, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 48963, + "start": 48898, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 48966, + "start": 48965, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 48897, + "name": "line", + "start": 48893, + "type": "Identifier" + }, + "end": 48967, + "start": 48893, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 49005, + "raw": "0.6206263405732759", + "start": 48987, + "type": "Literal", + "type": "Literal", + "value": 0.6206263405732759 + }, + { + "argument": { + "end": 49033, + "raw": "0.8733399468665124", + "start": 49015, + "type": "Literal", + "type": "Literal", + "value": 0.8733399468665124 + }, + "end": 49033, + "operator": "-", + "start": 49014, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 49040, + "start": 48978, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 49043, + "start": 49042, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 48977, + "name": "line", + "start": 48973, + "type": "Identifier" + }, + "end": 49044, + "start": 48973, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 49083, + "raw": "0.7776386664456383", + "start": 49065, + "type": "Literal", + "type": "Literal", + "value": 0.7776386664456383 + }, + "end": 49083, + "operator": "-", + "start": 49064, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 49110, + "raw": "0.7602780485384968", + "start": 49092, + "type": "Literal", + "type": "Literal", + "value": 0.7602780485384968 + } + ], + "end": 49117, + "start": 49055, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 49120, + "start": 49119, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 49054, + "name": "line", + "start": 49050, + "type": "Identifier" + }, + "end": 49121, + "start": 49050, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 49151, + "raw": "0.5439379760788592", + "start": 49133, + "type": "Literal", + "type": "Literal", + "value": 0.5439379760788592 + }, + { + "end": 49171, + "raw": "0.8449177589350552", + "start": 49153, + "type": "Literal", + "type": "Literal", + "value": 0.8449177589350552 + } + ], + "end": 49172, + "start": 49132, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 49175, + "start": 49174, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 49131, + "name": "line", + "start": 49127, + "type": "Identifier" + }, + "end": 49176, + "start": 49127, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 49216, + "raw": "0.13036646025917076", + "start": 49197, + "type": "Literal", + "type": "Literal", + "value": 0.13036646025917076 + }, + "end": 49216, + "operator": "-", + "start": 49196, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 49245, + "raw": "0.012051713627069693", + "start": 49225, + "type": "Literal", + "type": "Literal", + "value": 0.012051713627069693 + } + ], + "end": 49252, + "start": 49187, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 49255, + "start": 49254, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 49186, + "name": "line", + "start": 49182, + "type": "Identifier" + }, + "end": 49256, + "start": 49182, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 49295, + "raw": "0.1656465612645519", + "start": 49277, + "type": "Literal", + "type": "Literal", + "value": 0.1656465612645519 + }, + "end": 49295, + "operator": "-", + "start": 49276, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 49324, + "raw": "0.20775229173765486", + "start": 49305, + "type": "Literal", + "type": "Literal", + "value": 0.20775229173765486 + }, + "end": 49324, + "operator": "-", + "start": 49304, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 49331, + "start": 49267, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 49334, + "start": 49333, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 49266, + "name": "line", + "start": 49262, + "type": "Identifier" + }, + "end": 49335, + "start": 49262, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 49374, + "raw": "0.0962723255929061", + "start": 49356, + "type": "Literal", + "type": "Literal", + "value": 0.0962723255929061 + }, + "end": 49374, + "operator": "-", + "start": 49355, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 49403, + "raw": "0.05417797659066137", + "start": 49384, + "type": "Literal", + "type": "Literal", + "value": 0.05417797659066137 + }, + "end": 49403, + "operator": "-", + "start": 49383, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 49410, + "start": 49346, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 49413, + "start": 49412, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 49345, + "name": "line", + "start": 49341, + "type": "Identifier" + }, + "end": 49414, + "start": 49341, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 49443, + "raw": "0.902108945498191", + "start": 49426, + "type": "Literal", + "type": "Literal", + "value": 0.902108945498191 + }, + { + "end": 49463, + "raw": "0.3958978534964961", + "start": 49445, + "type": "Literal", + "type": "Literal", + "value": 0.3958978534964961 + } + ], + "end": 49464, + "start": 49425, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 49467, + "start": 49466, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 49424, + "name": "line", + "start": 49420, + "type": "Identifier" + }, + "end": 49468, + "start": 49420, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 49507, + "raw": "0.27997950083139167", + "start": 49488, + "type": "Literal", + "type": "Literal", + "value": 0.27997950083139167 + }, + { + "argument": { + "end": 49536, + "raw": "0.17778188444008958", + "start": 49517, + "type": "Literal", + "type": "Literal", + "value": 0.17778188444008958 + }, + "end": 49536, + "operator": "-", + "start": 49516, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 49543, + "start": 49479, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 49546, + "start": 49545, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 49478, + "name": "line", + "start": 49474, + "type": "Identifier" + }, + "end": 49547, + "start": 49474, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 49577, + "raw": "0.5235806061589545", + "start": 49559, + "type": "Literal", + "type": "Literal", + "value": 0.5235806061589545 + }, + { + "end": 49596, + "raw": "0.694318985642328", + "start": 49579, + "type": "Literal", + "type": "Literal", + "value": 0.694318985642328 + } + ], + "end": 49597, + "start": 49558, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 49600, + "start": 49599, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 49557, + "name": "line", + "start": 49553, + "type": "Identifier" + }, + "end": 49601, + "start": 49553, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 49640, + "raw": "0.39140760219992154", + "start": 49621, + "type": "Literal", + "type": "Literal", + "value": 0.39140760219992154 + }, + { + "argument": { + "end": 49668, + "raw": "0.7839795272576484", + "start": 49650, + "type": "Literal", + "type": "Literal", + "value": 0.7839795272576484 + }, + "end": 49668, + "operator": "-", + "start": 49649, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 49675, + "start": 49612, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 49678, + "start": 49677, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 49611, + "name": "line", + "start": 49607, + "type": "Identifier" + }, + "end": 49679, + "start": 49607, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 49709, + "raw": "0.8414243527073519", + "start": 49691, + "type": "Literal", + "type": "Literal", + "value": 0.8414243527073519 + }, + { + "end": 49729, + "raw": "0.5395591528940082", + "start": 49711, + "type": "Literal", + "type": "Literal", + "value": 0.5395591528940082 + } + ], + "end": 49730, + "start": 49690, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 49733, + "start": 49732, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 49689, + "name": "line", + "start": 49685, + "type": "Identifier" + }, + "end": 49734, + "start": 49685, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 49772, + "raw": "0.6137667704875602", + "start": 49754, + "type": "Literal", + "type": "Literal", + "value": 0.6137667704875602 + }, + { + "end": 49800, + "raw": "0.22119647516722085", + "start": 49781, + "type": "Literal", + "type": "Literal", + "value": 0.22119647516722085 + } + ], + "end": 49807, + "start": 49745, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 49810, + "start": 49809, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 49744, + "name": "line", + "start": 49740, + "type": "Identifier" + }, + "end": 49811, + "start": 49740, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 49841, + "raw": "0.8830488380766681", + "start": 49823, + "type": "Literal", + "type": "Literal", + "value": 0.8830488380766681 + }, + { + "end": 49861, + "raw": "0.6996724408425232", + "start": 49843, + "type": "Literal", + "type": "Literal", + "value": 0.6996724408425232 + } + ], + "end": 49862, + "start": 49822, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 49865, + "start": 49864, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 49821, + "name": "line", + "start": 49817, + "type": "Identifier" + }, + "end": 49866, + "start": 49817, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 49905, + "raw": "0.3670208139314082", + "start": 49887, + "type": "Literal", + "type": "Literal", + "value": 0.3670208139314082 + }, + "end": 49905, + "operator": "-", + "start": 49886, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 49933, + "raw": "0.21201331909674526", + "start": 49914, + "type": "Literal", + "type": "Literal", + "value": 0.21201331909674526 + } + ], + "end": 49940, + "start": 49877, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 49943, + "start": 49942, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 49876, + "name": "line", + "start": 49872, + "type": "Identifier" + }, + "end": 49944, + "start": 49872, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 49983, + "raw": "0.4707511307971115", + "start": 49965, + "type": "Literal", + "type": "Literal", + "value": 0.4707511307971115 + }, + "end": 49983, + "operator": "-", + "start": 49964, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 50010, + "raw": "0.4905279615419764", + "start": 49992, + "type": "Literal", + "type": "Literal", + "value": 0.4905279615419764 + } + ], + "end": 50017, + "start": 49955, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 50020, + "start": 50019, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 49954, + "name": "line", + "start": 49950, + "type": "Identifier" + }, + "end": 50021, + "start": 49950, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 50060, + "raw": "0.8328324229085962", + "start": 50042, + "type": "Literal", + "type": "Literal", + "value": 0.8328324229085962 + }, + "end": 50060, + "operator": "-", + "start": 50041, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 50087, + "raw": "0.4677492878818803", + "start": 50069, + "type": "Literal", + "type": "Literal", + "value": 0.4677492878818803 + } + ], + "end": 50094, + "start": 50032, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 50097, + "start": 50096, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 50031, + "name": "line", + "start": 50027, + "type": "Identifier" + }, + "end": 50098, + "start": 50027, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 50137, + "raw": "0.8111463382182231", + "start": 50119, + "type": "Literal", + "type": "Literal", + "value": 0.8111463382182231 + }, + "end": 50137, + "operator": "-", + "start": 50118, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 50166, + "raw": "0.41814807547140576", + "start": 50147, + "type": "Literal", + "type": "Literal", + "value": 0.41814807547140576 + }, + "end": 50166, + "operator": "-", + "start": 50146, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 50173, + "start": 50109, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 50176, + "start": 50175, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 50108, + "name": "line", + "start": 50104, + "type": "Identifier" + }, + "end": 50177, + "start": 50104, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 50216, + "raw": "0.03807684940941125", + "start": 50197, + "type": "Literal", + "type": "Literal", + "value": 0.03807684940941125 + }, + { + "end": 50244, + "raw": "0.25664826686353326", + "start": 50225, + "type": "Literal", + "type": "Literal", + "value": 0.25664826686353326 + } + ], + "end": 50251, + "start": 50188, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 50254, + "start": 50253, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 50187, + "name": "line", + "start": 50183, + "type": "Identifier" + }, + "end": 50255, + "start": 50183, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 50294, + "raw": "0.23950083339596384", + "start": 50275, + "type": "Literal", + "type": "Literal", + "value": 0.23950083339596384 + }, + { + "end": 50322, + "raw": "0.43693196301855575", + "start": 50303, + "type": "Literal", + "type": "Literal", + "value": 0.43693196301855575 + } + ], + "end": 50329, + "start": 50266, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 50332, + "start": 50331, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 50265, + "name": "line", + "start": 50261, + "type": "Identifier" + }, + "end": 50333, + "start": 50261, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 50373, + "raw": "0.16279444820904887", + "start": 50354, + "type": "Literal", + "type": "Literal", + "value": 0.16279444820904887 + }, + "end": 50373, + "operator": "-", + "start": 50353, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 50400, + "raw": "0.8064475707664818", + "start": 50382, + "type": "Literal", + "type": "Literal", + "value": 0.8064475707664818 + } + ], + "end": 50407, + "start": 50344, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 50410, + "start": 50409, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 50343, + "name": "line", + "start": 50339, + "type": "Identifier" + }, + "end": 50411, + "start": 50339, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 50451, + "raw": "0.08972872009232558", + "start": 50432, + "type": "Literal", + "type": "Literal", + "value": 0.08972872009232558 + }, + "end": 50451, + "operator": "-", + "start": 50431, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 50480, + "raw": "0.08887625823751266", + "start": 50461, + "type": "Literal", + "type": "Literal", + "value": 0.08887625823751266 + }, + "end": 50480, + "operator": "-", + "start": 50460, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 50487, + "start": 50422, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 50490, + "start": 50489, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 50421, + "name": "line", + "start": 50417, + "type": "Identifier" + }, + "end": 50491, + "start": 50417, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 50529, + "raw": "0.9203433427102556", + "start": 50511, + "type": "Literal", + "type": "Literal", + "value": 0.9203433427102556 + }, + { + "argument": { + "end": 50558, + "raw": "0.17343459369697545", + "start": 50539, + "type": "Literal", + "type": "Literal", + "value": 0.17343459369697545 + }, + "end": 50558, + "operator": "-", + "start": 50538, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 50565, + "start": 50502, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 50568, + "start": 50567, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 50501, + "name": "line", + "start": 50497, + "type": "Identifier" + }, + "end": 50569, + "start": 50497, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 50610, + "raw": "0.0017496234414517975", + "start": 50589, + "type": "Literal", + "type": "Literal", + "value": 0.0017496234414517975 + }, + { + "argument": { + "end": 50638, + "raw": "0.5178508316168335", + "start": 50620, + "type": "Literal", + "type": "Literal", + "value": 0.5178508316168335 + }, + "end": 50638, + "operator": "-", + "start": 50619, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 50645, + "start": 50580, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 50648, + "start": 50647, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 50579, + "name": "line", + "start": 50575, + "type": "Identifier" + }, + "end": 50649, + "start": 50575, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 50687, + "raw": "0.6206263405732759", + "start": 50669, + "type": "Literal", + "type": "Literal", + "value": 0.6206263405732759 + }, + { + "argument": { + "end": 50715, + "raw": "0.8733399468665124", + "start": 50697, + "type": "Literal", + "type": "Literal", + "value": 0.8733399468665124 + }, + "end": 50715, + "operator": "-", + "start": 50696, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 50722, + "start": 50660, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 50725, + "start": 50724, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 50659, + "name": "line", + "start": 50655, + "type": "Identifier" + }, + "end": 50726, + "start": 50655, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 50765, + "raw": "0.7776386664456383", + "start": 50747, + "type": "Literal", + "type": "Literal", + "value": 0.7776386664456383 + }, + "end": 50765, + "operator": "-", + "start": 50746, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 50792, + "raw": "0.7602780485384968", + "start": 50774, + "type": "Literal", + "type": "Literal", + "value": 0.7602780485384968 + } + ], + "end": 50799, + "start": 50737, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 50802, + "start": 50801, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 50736, + "name": "line", + "start": 50732, + "type": "Identifier" + }, + "end": 50803, + "start": 50732, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 50833, + "raw": "0.5439379760788592", + "start": 50815, + "type": "Literal", + "type": "Literal", + "value": 0.5439379760788592 + }, + { + "end": 50853, + "raw": "0.8449177589350552", + "start": 50835, + "type": "Literal", + "type": "Literal", + "value": 0.8449177589350552 + } + ], + "end": 50854, + "start": 50814, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 50857, + "start": 50856, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 50813, + "name": "line", + "start": 50809, + "type": "Identifier" + }, + "end": 50858, + "start": 50809, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 50898, + "raw": "0.13036646025917076", + "start": 50879, + "type": "Literal", + "type": "Literal", + "value": 0.13036646025917076 + }, + "end": 50898, + "operator": "-", + "start": 50878, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 50927, + "raw": "0.012051713627069693", + "start": 50907, + "type": "Literal", + "type": "Literal", + "value": 0.012051713627069693 + } + ], + "end": 50934, + "start": 50869, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 50937, + "start": 50936, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 50868, + "name": "line", + "start": 50864, + "type": "Identifier" + }, + "end": 50938, + "start": 50864, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 50977, + "raw": "0.1656465612645519", + "start": 50959, + "type": "Literal", + "type": "Literal", + "value": 0.1656465612645519 + }, + "end": 50977, + "operator": "-", + "start": 50958, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 51006, + "raw": "0.20775229173765486", + "start": 50987, + "type": "Literal", + "type": "Literal", + "value": 0.20775229173765486 + }, + "end": 51006, + "operator": "-", + "start": 50986, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 51013, + "start": 50949, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 51016, + "start": 51015, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 50948, + "name": "line", + "start": 50944, + "type": "Identifier" + }, + "end": 51017, + "start": 50944, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 51056, + "raw": "0.0962723255929061", + "start": 51038, + "type": "Literal", + "type": "Literal", + "value": 0.0962723255929061 + }, + "end": 51056, + "operator": "-", + "start": 51037, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 51085, + "raw": "0.05417797659066137", + "start": 51066, + "type": "Literal", + "type": "Literal", + "value": 0.05417797659066137 + }, + "end": 51085, + "operator": "-", + "start": 51065, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 51092, + "start": 51028, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 51095, + "start": 51094, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 51027, + "name": "line", + "start": 51023, + "type": "Identifier" + }, + "end": 51096, + "start": 51023, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 51125, + "raw": "0.902108945498191", + "start": 51108, + "type": "Literal", + "type": "Literal", + "value": 0.902108945498191 + }, + { + "end": 51145, + "raw": "0.3958978534964961", + "start": 51127, + "type": "Literal", + "type": "Literal", + "value": 0.3958978534964961 + } + ], + "end": 51146, + "start": 51107, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 51149, + "start": 51148, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 51106, + "name": "line", + "start": 51102, + "type": "Identifier" + }, + "end": 51150, + "start": 51102, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 51189, + "raw": "0.27997950083139167", + "start": 51170, + "type": "Literal", + "type": "Literal", + "value": 0.27997950083139167 + }, + { + "argument": { + "end": 51218, + "raw": "0.17778188444008958", + "start": 51199, + "type": "Literal", + "type": "Literal", + "value": 0.17778188444008958 + }, + "end": 51218, + "operator": "-", + "start": 51198, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 51225, + "start": 51161, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 51228, + "start": 51227, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 51160, + "name": "line", + "start": 51156, + "type": "Identifier" + }, + "end": 51229, + "start": 51156, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 51259, + "raw": "0.5235806061589545", + "start": 51241, + "type": "Literal", + "type": "Literal", + "value": 0.5235806061589545 + }, + { + "end": 51278, + "raw": "0.694318985642328", + "start": 51261, + "type": "Literal", + "type": "Literal", + "value": 0.694318985642328 + } + ], + "end": 51279, + "start": 51240, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 51282, + "start": 51281, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 51239, + "name": "line", + "start": 51235, + "type": "Identifier" + }, + "end": 51283, + "start": 51235, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 51322, + "raw": "0.39140760219992154", + "start": 51303, + "type": "Literal", + "type": "Literal", + "value": 0.39140760219992154 + }, + { + "argument": { + "end": 51350, + "raw": "0.7839795272576484", + "start": 51332, + "type": "Literal", + "type": "Literal", + "value": 0.7839795272576484 + }, + "end": 51350, + "operator": "-", + "start": 51331, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 51357, + "start": 51294, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 51360, + "start": 51359, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 51293, + "name": "line", + "start": 51289, + "type": "Identifier" + }, + "end": 51361, + "start": 51289, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 51391, + "raw": "0.8414243527073519", + "start": 51373, + "type": "Literal", + "type": "Literal", + "value": 0.8414243527073519 + }, + { + "end": 51411, + "raw": "0.5395591528940082", + "start": 51393, + "type": "Literal", + "type": "Literal", + "value": 0.5395591528940082 + } + ], + "end": 51412, + "start": 51372, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 51415, + "start": 51414, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 51371, + "name": "line", + "start": 51367, + "type": "Identifier" + }, + "end": 51416, + "start": 51367, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 51454, + "raw": "0.6137667704875602", + "start": 51436, + "type": "Literal", + "type": "Literal", + "value": 0.6137667704875602 + }, + { + "end": 51482, + "raw": "0.22119647516722085", + "start": 51463, + "type": "Literal", + "type": "Literal", + "value": 0.22119647516722085 + } + ], + "end": 51489, + "start": 51427, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 51492, + "start": 51491, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 51426, + "name": "line", + "start": 51422, + "type": "Identifier" + }, + "end": 51493, + "start": 51422, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 51523, + "raw": "0.8830488380766681", + "start": 51505, + "type": "Literal", + "type": "Literal", + "value": 0.8830488380766681 + }, + { + "end": 51543, + "raw": "0.6996724408425232", + "start": 51525, + "type": "Literal", + "type": "Literal", + "value": 0.6996724408425232 + } + ], + "end": 51544, + "start": 51504, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 51547, + "start": 51546, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 51503, + "name": "line", + "start": 51499, + "type": "Identifier" + }, + "end": 51548, + "start": 51499, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 51588, + "raw": "0.41290485754343953", + "start": 51569, + "type": "Literal", + "type": "Literal", + "value": 0.41290485754343953 + }, + "end": 51588, + "operator": "-", + "start": 51568, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 51616, + "raw": "0.4152647361760933", + "start": 51598, + "type": "Literal", + "type": "Literal", + "value": 0.4152647361760933 + }, + "end": 51616, + "operator": "-", + "start": 51597, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 51623, + "start": 51559, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 51626, + "start": 51625, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 51558, + "name": "line", + "start": 51554, + "type": "Identifier" + }, + "end": 51627, + "start": 51554, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 51665, + "raw": "0.5169538755575687", + "start": 51647, + "type": "Literal", + "type": "Literal", + "value": 0.5169538755575687 + }, + { + "argument": { + "end": 51693, + "raw": "0.9085567867302617", + "start": 51675, + "type": "Literal", + "type": "Literal", + "value": 0.9085567867302617 + }, + "end": 51693, + "operator": "-", + "start": 51674, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 51700, + "start": 51638, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 51703, + "start": 51702, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 51637, + "name": "line", + "start": 51633, + "type": "Identifier" + }, + "end": 51704, + "start": 51633, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 51743, + "raw": "0.6716353749059765", + "start": 51725, + "type": "Literal", + "type": "Literal", + "value": 0.6716353749059765 + }, + "end": 51743, + "operator": "-", + "start": 51724, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 51771, + "raw": "0.9605576808879026", + "start": 51753, + "type": "Literal", + "type": "Literal", + "value": 0.9605576808879026 + }, + "end": 51771, + "operator": "-", + "start": 51752, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 51778, + "start": 51715, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 51781, + "start": 51780, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 51714, + "name": "line", + "start": 51710, + "type": "Identifier" + }, + "end": 51782, + "start": 51710, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 51822, + "raw": "0.010280170930300203", + "start": 51802, + "type": "Literal", + "type": "Literal", + "value": 0.010280170930300203 + }, + { + "argument": { + "end": 51851, + "raw": "0.37344123662342166", + "start": 51832, + "type": "Literal", + "type": "Literal", + "value": 0.37344123662342166 + }, + "end": 51851, + "operator": "-", + "start": 51831, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 51858, + "start": 51793, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 51861, + "start": 51860, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 51792, + "name": "line", + "start": 51788, + "type": "Identifier" + }, + "end": 51862, + "start": 51788, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 51901, + "raw": "0.3670208139314082", + "start": 51883, + "type": "Literal", + "type": "Literal", + "value": 0.3670208139314082 + }, + "end": 51901, + "operator": "-", + "start": 51882, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 51929, + "raw": "0.21201331909674526", + "start": 51910, + "type": "Literal", + "type": "Literal", + "value": 0.21201331909674526 + } + ], + "end": 51936, + "start": 51873, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 51939, + "start": 51938, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 51872, + "name": "line", + "start": 51868, + "type": "Identifier" + }, + "end": 51940, + "start": 51868, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 51979, + "raw": "0.4707511307971115", + "start": 51961, + "type": "Literal", + "type": "Literal", + "value": 0.4707511307971115 + }, + "end": 51979, + "operator": "-", + "start": 51960, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 52006, + "raw": "0.4905279615419764", + "start": 51988, + "type": "Literal", + "type": "Literal", + "value": 0.4905279615419764 + } + ], + "end": 52013, + "start": 51951, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 52016, + "start": 52015, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 51950, + "name": "line", + "start": 51946, + "type": "Identifier" + }, + "end": 52017, + "start": 51946, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 52056, + "raw": "0.8328324229085962", + "start": 52038, + "type": "Literal", + "type": "Literal", + "value": 0.8328324229085962 + }, + "end": 52056, + "operator": "-", + "start": 52037, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 52083, + "raw": "0.4677492878818803", + "start": 52065, + "type": "Literal", + "type": "Literal", + "value": 0.4677492878818803 + } + ], + "end": 52090, + "start": 52028, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 52093, + "start": 52092, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 52027, + "name": "line", + "start": 52023, + "type": "Identifier" + }, + "end": 52094, + "start": 52023, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 52133, + "raw": "0.8111463382182231", + "start": 52115, + "type": "Literal", + "type": "Literal", + "value": 0.8111463382182231 + }, + "end": 52133, + "operator": "-", + "start": 52114, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 52162, + "raw": "0.41814807547140576", + "start": 52143, + "type": "Literal", + "type": "Literal", + "value": 0.41814807547140576 + }, + "end": 52162, + "operator": "-", + "start": 52142, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 52169, + "start": 52105, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 52172, + "start": 52171, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 52104, + "name": "line", + "start": 52100, + "type": "Identifier" + }, + "end": 52173, + "start": 52100, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 52212, + "raw": "0.03807684940941125", + "start": 52193, + "type": "Literal", + "type": "Literal", + "value": 0.03807684940941125 + }, + { + "end": 52240, + "raw": "0.25664826686353326", + "start": 52221, + "type": "Literal", + "type": "Literal", + "value": 0.25664826686353326 + } + ], + "end": 52247, + "start": 52184, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 52250, + "start": 52249, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 52183, + "name": "line", + "start": 52179, + "type": "Identifier" + }, + "end": 52251, + "start": 52179, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 52290, + "raw": "0.23950083339596384", + "start": 52271, + "type": "Literal", + "type": "Literal", + "value": 0.23950083339596384 + }, + { + "end": 52318, + "raw": "0.43693196301855575", + "start": 52299, + "type": "Literal", + "type": "Literal", + "value": 0.43693196301855575 + } + ], + "end": 52325, + "start": 52262, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 52328, + "start": 52327, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 52261, + "name": "line", + "start": 52257, + "type": "Identifier" + }, + "end": 52329, + "start": 52257, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 52369, + "raw": "0.16279444820904887", + "start": 52350, + "type": "Literal", + "type": "Literal", + "value": 0.16279444820904887 + }, + "end": 52369, + "operator": "-", + "start": 52349, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 52396, + "raw": "0.8064475707664818", + "start": 52378, + "type": "Literal", + "type": "Literal", + "value": 0.8064475707664818 + } + ], + "end": 52403, + "start": 52340, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 52406, + "start": 52405, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 52339, + "name": "line", + "start": 52335, + "type": "Identifier" + }, + "end": 52407, + "start": 52335, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 52447, + "raw": "0.08972872009232558", + "start": 52428, + "type": "Literal", + "type": "Literal", + "value": 0.08972872009232558 + }, + "end": 52447, + "operator": "-", + "start": 52427, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 52476, + "raw": "0.08887625823751266", + "start": 52457, + "type": "Literal", + "type": "Literal", + "value": 0.08887625823751266 + }, + "end": 52476, + "operator": "-", + "start": 52456, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 52483, + "start": 52418, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 52486, + "start": 52485, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 52417, + "name": "line", + "start": 52413, + "type": "Identifier" + }, + "end": 52487, + "start": 52413, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 52525, + "raw": "0.9203433427102556", + "start": 52507, + "type": "Literal", + "type": "Literal", + "value": 0.9203433427102556 + }, + { + "argument": { + "end": 52554, + "raw": "0.17343459369697545", + "start": 52535, + "type": "Literal", + "type": "Literal", + "value": 0.17343459369697545 + }, + "end": 52554, + "operator": "-", + "start": 52534, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 52561, + "start": 52498, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 52564, + "start": 52563, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 52497, + "name": "line", + "start": 52493, + "type": "Identifier" + }, + "end": 52565, + "start": 52493, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 52606, + "raw": "0.0017496234414517975", + "start": 52585, + "type": "Literal", + "type": "Literal", + "value": 0.0017496234414517975 + }, + { + "argument": { + "end": 52634, + "raw": "0.5178508316168335", + "start": 52616, + "type": "Literal", + "type": "Literal", + "value": 0.5178508316168335 + }, + "end": 52634, + "operator": "-", + "start": 52615, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 52641, + "start": 52576, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 52644, + "start": 52643, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 52575, + "name": "line", + "start": 52571, + "type": "Identifier" + }, + "end": 52645, + "start": 52571, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 52683, + "raw": "0.6206263405732759", + "start": 52665, + "type": "Literal", + "type": "Literal", + "value": 0.6206263405732759 + }, + { + "argument": { + "end": 52711, + "raw": "0.8733399468665124", + "start": 52693, + "type": "Literal", + "type": "Literal", + "value": 0.8733399468665124 + }, + "end": 52711, + "operator": "-", + "start": 52692, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 52718, + "start": 52656, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 52721, + "start": 52720, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 52655, + "name": "line", + "start": 52651, + "type": "Identifier" + }, + "end": 52722, + "start": 52651, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 52761, + "raw": "0.7776386664456383", + "start": 52743, + "type": "Literal", + "type": "Literal", + "value": 0.7776386664456383 + }, + "end": 52761, + "operator": "-", + "start": 52742, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 52788, + "raw": "0.7602780485384968", + "start": 52770, + "type": "Literal", + "type": "Literal", + "value": 0.7602780485384968 + } + ], + "end": 52795, + "start": 52733, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 52798, + "start": 52797, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 52732, + "name": "line", + "start": 52728, + "type": "Identifier" + }, + "end": 52799, + "start": 52728, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 52829, + "raw": "0.5439379760788592", + "start": 52811, + "type": "Literal", + "type": "Literal", + "value": 0.5439379760788592 + }, + { + "end": 52849, + "raw": "0.8449177589350552", + "start": 52831, + "type": "Literal", + "type": "Literal", + "value": 0.8449177589350552 + } + ], + "end": 52850, + "start": 52810, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 52853, + "start": 52852, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 52809, + "name": "line", + "start": 52805, + "type": "Identifier" + }, + "end": 52854, + "start": 52805, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 52894, + "raw": "0.13036646025917076", + "start": 52875, + "type": "Literal", + "type": "Literal", + "value": 0.13036646025917076 + }, + "end": 52894, + "operator": "-", + "start": 52874, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 52923, + "raw": "0.012051713627069693", + "start": 52903, + "type": "Literal", + "type": "Literal", + "value": 0.012051713627069693 + } + ], + "end": 52930, + "start": 52865, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 52933, + "start": 52932, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 52864, + "name": "line", + "start": 52860, + "type": "Identifier" + }, + "end": 52934, + "start": 52860, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 52973, + "raw": "0.1656465612645519", + "start": 52955, + "type": "Literal", + "type": "Literal", + "value": 0.1656465612645519 + }, + "end": 52973, + "operator": "-", + "start": 52954, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 53002, + "raw": "0.20775229173765486", + "start": 52983, + "type": "Literal", + "type": "Literal", + "value": 0.20775229173765486 + }, + "end": 53002, + "operator": "-", + "start": 52982, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 53009, + "start": 52945, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 53012, + "start": 53011, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 52944, + "name": "line", + "start": 52940, + "type": "Identifier" + }, + "end": 53013, + "start": 52940, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 53052, + "raw": "0.0962723255929061", + "start": 53034, + "type": "Literal", + "type": "Literal", + "value": 0.0962723255929061 + }, + "end": 53052, + "operator": "-", + "start": 53033, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 53081, + "raw": "0.05417797659066137", + "start": 53062, + "type": "Literal", + "type": "Literal", + "value": 0.05417797659066137 + }, + "end": 53081, + "operator": "-", + "start": 53061, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 53088, + "start": 53024, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 53091, + "start": 53090, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 53023, + "name": "line", + "start": 53019, + "type": "Identifier" + }, + "end": 53092, + "start": 53019, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 53121, + "raw": "0.902108945498191", + "start": 53104, + "type": "Literal", + "type": "Literal", + "value": 0.902108945498191 + }, + { + "end": 53141, + "raw": "0.3958978534964961", + "start": 53123, + "type": "Literal", + "type": "Literal", + "value": 0.3958978534964961 + } + ], + "end": 53142, + "start": 53103, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 53145, + "start": 53144, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 53102, + "name": "line", + "start": 53098, + "type": "Identifier" + }, + "end": 53146, + "start": 53098, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 53185, + "raw": "0.27997950083139167", + "start": 53166, + "type": "Literal", + "type": "Literal", + "value": 0.27997950083139167 + }, + { + "argument": { + "end": 53214, + "raw": "0.17778188444008958", + "start": 53195, + "type": "Literal", + "type": "Literal", + "value": 0.17778188444008958 + }, + "end": 53214, + "operator": "-", + "start": 53194, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 53221, + "start": 53157, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 53224, + "start": 53223, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 53156, + "name": "line", + "start": 53152, + "type": "Identifier" + }, + "end": 53225, + "start": 53152, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 53255, + "raw": "0.5235806061589545", + "start": 53237, + "type": "Literal", + "type": "Literal", + "value": 0.5235806061589545 + }, + { + "end": 53274, + "raw": "0.694318985642328", + "start": 53257, + "type": "Literal", + "type": "Literal", + "value": 0.694318985642328 + } + ], + "end": 53275, + "start": 53236, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 53278, + "start": 53277, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 53235, + "name": "line", + "start": 53231, + "type": "Identifier" + }, + "end": 53279, + "start": 53231, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 53318, + "raw": "0.39140760219992154", + "start": 53299, + "type": "Literal", + "type": "Literal", + "value": 0.39140760219992154 + }, + { + "argument": { + "end": 53346, + "raw": "0.7839795272576484", + "start": 53328, + "type": "Literal", + "type": "Literal", + "value": 0.7839795272576484 + }, + "end": 53346, + "operator": "-", + "start": 53327, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 53353, + "start": 53290, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 53356, + "start": 53355, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 53289, + "name": "line", + "start": 53285, + "type": "Identifier" + }, + "end": 53357, + "start": 53285, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 53387, + "raw": "0.8414243527073519", + "start": 53369, + "type": "Literal", + "type": "Literal", + "value": 0.8414243527073519 + }, + { + "end": 53407, + "raw": "0.5395591528940082", + "start": 53389, + "type": "Literal", + "type": "Literal", + "value": 0.5395591528940082 + } + ], + "end": 53408, + "start": 53368, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 53411, + "start": 53410, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 53367, + "name": "line", + "start": 53363, + "type": "Identifier" + }, + "end": 53412, + "start": 53363, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 53450, + "raw": "0.6137667704875602", + "start": 53432, + "type": "Literal", + "type": "Literal", + "value": 0.6137667704875602 + }, + { + "end": 53478, + "raw": "0.22119647516722085", + "start": 53459, + "type": "Literal", + "type": "Literal", + "value": 0.22119647516722085 + } + ], + "end": 53485, + "start": 53423, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 53488, + "start": 53487, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 53422, + "name": "line", + "start": 53418, + "type": "Identifier" + }, + "end": 53489, + "start": 53418, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 53519, + "raw": "0.8830488380766681", + "start": 53501, + "type": "Literal", + "type": "Literal", + "value": 0.8830488380766681 + }, + { + "end": 53539, + "raw": "0.6996724408425232", + "start": 53521, + "type": "Literal", + "type": "Literal", + "value": 0.6996724408425232 + } + ], + "end": 53540, + "start": 53500, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 53543, + "start": 53542, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 53499, + "name": "line", + "start": 53495, + "type": "Identifier" + }, + "end": 53544, + "start": 53495, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 53584, + "raw": "0.41290485754343953", + "start": 53565, + "type": "Literal", + "type": "Literal", + "value": 0.41290485754343953 + }, + "end": 53584, + "operator": "-", + "start": 53564, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 53612, + "raw": "0.4152647361760933", + "start": 53594, + "type": "Literal", + "type": "Literal", + "value": 0.4152647361760933 + }, + "end": 53612, + "operator": "-", + "start": 53593, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 53619, + "start": 53555, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 53622, + "start": 53621, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 53554, + "name": "line", + "start": 53550, + "type": "Identifier" + }, + "end": 53623, + "start": 53550, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 53661, + "raw": "0.5169538755575687", + "start": 53643, + "type": "Literal", + "type": "Literal", + "value": 0.5169538755575687 + }, + { + "argument": { + "end": 53689, + "raw": "0.9085567867302617", + "start": 53671, + "type": "Literal", + "type": "Literal", + "value": 0.9085567867302617 + }, + "end": 53689, + "operator": "-", + "start": 53670, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 53696, + "start": 53634, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 53699, + "start": 53698, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 53633, + "name": "line", + "start": 53629, + "type": "Identifier" + }, + "end": 53700, + "start": 53629, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 53739, + "raw": "0.6716353749059765", + "start": 53721, + "type": "Literal", + "type": "Literal", + "value": 0.6716353749059765 + }, + "end": 53739, + "operator": "-", + "start": 53720, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 53767, + "raw": "0.9605576808879026", + "start": 53749, + "type": "Literal", + "type": "Literal", + "value": 0.9605576808879026 + }, + "end": 53767, + "operator": "-", + "start": 53748, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 53774, + "start": 53711, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 53777, + "start": 53776, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 53710, + "name": "line", + "start": 53706, + "type": "Identifier" + }, + "end": 53778, + "start": 53706, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 53818, + "raw": "0.010280170930300203", + "start": 53798, + "type": "Literal", + "type": "Literal", + "value": 0.010280170930300203 + }, + { + "argument": { + "end": 53847, + "raw": "0.37344123662342166", + "start": 53828, + "type": "Literal", + "type": "Literal", + "value": 0.37344123662342166 + }, + "end": 53847, + "operator": "-", + "start": 53827, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 53854, + "start": 53789, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 53857, + "start": 53856, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 53788, + "name": "line", + "start": 53784, + "type": "Identifier" + }, + "end": 53858, + "start": 53784, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 53897, + "raw": "0.10357375682791004", + "start": 53878, + "type": "Literal", + "type": "Literal", + "value": 0.10357375682791004 + }, + { + "argument": { + "end": 53926, + "raw": "0.42294321030821425", + "start": 53907, + "type": "Literal", + "type": "Literal", + "value": 0.42294321030821425 + }, + "end": 53926, + "operator": "-", + "start": 53906, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 53933, + "start": 53869, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 53936, + "start": 53935, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 53868, + "name": "line", + "start": 53864, + "type": "Identifier" + }, + "end": 53937, + "start": 53864, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 53975, + "raw": "0.4520311575096987", + "start": 53957, + "type": "Literal", + "type": "Literal", + "value": 0.4520311575096987 + }, + { + "argument": { + "end": 54004, + "raw": "0.11232675307600548", + "start": 53985, + "type": "Literal", + "type": "Literal", + "value": 0.11232675307600548 + }, + "end": 54004, + "operator": "-", + "start": 53984, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 54011, + "start": 53948, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 54014, + "start": 54013, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 53947, + "name": "line", + "start": 53943, + "type": "Identifier" + }, + "end": 54015, + "start": 53943, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 54054, + "raw": "0.8821185914380845", + "start": 54036, + "type": "Literal", + "type": "Literal", + "value": 0.8821185914380845 + }, + "end": 54054, + "operator": "-", + "start": 54035, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 54082, + "raw": "0.7155147434939819", + "start": 54064, + "type": "Literal", + "type": "Literal", + "value": 0.7155147434939819 + }, + "end": 54082, + "operator": "-", + "start": 54063, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 54089, + "start": 54026, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 54092, + "start": 54091, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 54025, + "name": "line", + "start": 54021, + "type": "Identifier" + }, + "end": 54093, + "start": 54021, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 54123, + "raw": "0.9195487101690416", + "start": 54105, + "type": "Literal", + "type": "Literal", + "value": 0.9195487101690416 + }, + { + "end": 54143, + "raw": "0.2691627465297364", + "start": 54125, + "type": "Literal", + "type": "Literal", + "value": 0.2691627465297364 + } + ], + "end": 54144, + "start": 54104, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 54147, + "start": 54146, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 54103, + "name": "line", + "start": 54099, + "type": "Identifier" + }, + "end": 54148, + "start": 54099, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 54186, + "raw": "0.7098978191546745", + "start": 54168, + "type": "Literal", + "type": "Literal", + "value": 0.7098978191546745 + }, + { + "end": 54214, + "raw": "0.11710004169385968", + "start": 54195, + "type": "Literal", + "type": "Literal", + "value": 0.11710004169385968 + } + ], + "end": 54221, + "start": 54159, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 54224, + "start": 54223, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 54158, + "name": "line", + "start": 54154, + "type": "Identifier" + }, + "end": 54225, + "start": 54154, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 54265, + "raw": "0.37876368560819995", + "start": 54246, + "type": "Literal", + "type": "Literal", + "value": 0.37876368560819995 + }, + "end": 54265, + "operator": "-", + "start": 54245, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 54292, + "raw": "0.7106729314759084", + "start": 54274, + "type": "Literal", + "type": "Literal", + "value": 0.7106729314759084 + } + ], + "end": 54299, + "start": 54236, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 54302, + "start": 54301, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 54235, + "name": "line", + "start": 54231, + "type": "Identifier" + }, + "end": 54303, + "start": 54231, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 54343, + "raw": "0.29728126898353335", + "start": 54324, + "type": "Literal", + "type": "Literal", + "value": 0.29728126898353335 + }, + "end": 54343, + "operator": "-", + "start": 54323, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 54372, + "raw": "0.06649734568328003", + "start": 54353, + "type": "Literal", + "type": "Literal", + "value": 0.06649734568328003 + }, + "end": 54372, + "operator": "-", + "start": 54352, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 54379, + "start": 54314, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 54382, + "start": 54381, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 54313, + "name": "line", + "start": 54309, + "type": "Identifier" + }, + "end": 54383, + "start": 54309, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 54422, + "raw": "0.22965781558352072", + "start": 54403, + "type": "Literal", + "type": "Literal", + "value": 0.22965781558352072 + }, + { + "argument": { + "end": 54450, + "raw": "0.7601866432836641", + "start": 54432, + "type": "Literal", + "type": "Literal", + "value": 0.7601866432836641 + }, + "end": 54450, + "operator": "-", + "start": 54431, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 54457, + "start": 54394, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 54460, + "start": 54459, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 54393, + "name": "line", + "start": 54389, + "type": "Identifier" + }, + "end": 54461, + "start": 54389, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 54500, + "raw": "0.6356501074317229", + "start": 54482, + "type": "Literal", + "type": "Literal", + "value": 0.6356501074317229 + }, + "end": 54500, + "operator": "-", + "start": 54481, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 54528, + "raw": "0.19458425399338064", + "start": 54509, + "type": "Literal", + "type": "Literal", + "value": 0.19458425399338064 + } + ], + "end": 54535, + "start": 54472, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 54538, + "start": 54537, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 54471, + "name": "line", + "start": 54467, + "type": "Identifier" + }, + "end": 54539, + "start": 54467, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 54569, + "raw": "0.5721251777404546", + "start": 54551, + "type": "Literal", + "type": "Literal", + "value": 0.5721251777404546 + }, + { + "end": 54589, + "raw": "0.2888584097921527", + "start": 54571, + "type": "Literal", + "type": "Literal", + "value": 0.2888584097921527 + } + ], + "end": 54590, + "start": 54550, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 54593, + "start": 54592, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 54549, + "name": "line", + "start": 54545, + "type": "Identifier" + }, + "end": 54594, + "start": 54545, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 54633, + "raw": "0.9580409549552311", + "start": 54615, + "type": "Literal", + "type": "Literal", + "value": 0.9580409549552311 + }, + "end": 54633, + "operator": "-", + "start": 54614, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 54662, + "raw": "0.02243818192078395", + "start": 54643, + "type": "Literal", + "type": "Literal", + "value": 0.02243818192078395 + }, + "end": 54662, + "operator": "-", + "start": 54642, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 54669, + "start": 54605, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 54672, + "start": 54671, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 54604, + "name": "line", + "start": 54600, + "type": "Identifier" + }, + "end": 54673, + "start": 54600, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 54711, + "raw": "0.3299184618602866", + "start": 54693, + "type": "Literal", + "type": "Literal", + "value": 0.3299184618602866 + }, + { + "argument": { + "end": 54739, + "raw": "0.8353726942369875", + "start": 54721, + "type": "Literal", + "type": "Literal", + "value": 0.8353726942369875 + }, + "end": 54739, + "operator": "-", + "start": 54720, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 54746, + "start": 54684, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 54749, + "start": 54748, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 54683, + "name": "line", + "start": 54679, + "type": "Identifier" + }, + "end": 54750, + "start": 54679, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 54788, + "raw": "0.7434639386755209", + "start": 54770, + "type": "Literal", + "type": "Literal", + "value": 0.7434639386755209 + }, + { + "argument": { + "end": 54816, + "raw": "0.7919648864138378", + "start": 54798, + "type": "Literal", + "type": "Literal", + "value": 0.7919648864138378 + }, + "end": 54816, + "operator": "-", + "start": 54797, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 54823, + "start": 54761, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 54826, + "start": 54825, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 54760, + "name": "line", + "start": 54756, + "type": "Identifier" + }, + "end": 54827, + "start": 54756, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 54857, + "raw": "0.9935751011164615", + "start": 54839, + "type": "Literal", + "type": "Literal", + "value": 0.9935751011164615 + }, + { + "end": 54877, + "raw": "0.9042566468497608", + "start": 54859, + "type": "Literal", + "type": "Literal", + "value": 0.9042566468497608 + } + ], + "end": 54878, + "start": 54838, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 54881, + "start": 54880, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 54837, + "name": "line", + "start": 54833, + "type": "Identifier" + }, + "end": 54882, + "start": 54833, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 54921, + "raw": "0.5035812884687294", + "start": 54903, + "type": "Literal", + "type": "Literal", + "value": 0.5035812884687294 + }, + "end": 54921, + "operator": "-", + "start": 54902, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 54948, + "raw": "0.5150967434989442", + "start": 54930, + "type": "Literal", + "type": "Literal", + "value": 0.5150967434989442 + } + ], + "end": 54955, + "start": 54893, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 54958, + "start": 54957, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 54892, + "name": "line", + "start": 54888, + "type": "Identifier" + }, + "end": 54959, + "start": 54888, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 54989, + "raw": "0.5526227215900215", + "start": 54971, + "type": "Literal", + "type": "Literal", + "value": 0.5526227215900215 + }, + { + "end": 55009, + "raw": "0.7612604137272441", + "start": 54991, + "type": "Literal", + "type": "Literal", + "value": 0.7612604137272441 + } + ], + "end": 55010, + "start": 54970, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 55013, + "start": 55012, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 54969, + "name": "line", + "start": 54965, + "type": "Identifier" + }, + "end": 55014, + "start": 54965, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 55052, + "raw": "0.8593271349126876", + "start": 55034, + "type": "Literal", + "type": "Literal", + "value": 0.8593271349126876 + }, + { + "end": 55080, + "raw": "0.08414894953725849", + "start": 55061, + "type": "Literal", + "type": "Literal", + "value": 0.08414894953725849 + } + ], + "end": 55087, + "start": 55025, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 55090, + "start": 55089, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 55024, + "name": "line", + "start": 55020, + "type": "Identifier" + }, + "end": 55091, + "start": 55020, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 55130, + "raw": "0.8181049219192864", + "start": 55112, + "type": "Literal", + "type": "Literal", + "value": 0.8181049219192864 + }, + "end": 55130, + "operator": "-", + "start": 55111, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 55157, + "raw": "0.903548131323352", + "start": 55140, + "type": "Literal", + "type": "Literal", + "value": 0.903548131323352 + }, + "end": 55157, + "operator": "-", + "start": 55139, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 55164, + "start": 55102, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 55167, + "start": 55166, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 55101, + "name": "line", + "start": 55097, + "type": "Identifier" + }, + "end": 55168, + "start": 55097, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 55206, + "raw": "0.3165782044458305", + "start": 55188, + "type": "Literal", + "type": "Literal", + "value": 0.3165782044458305 + }, + { + "argument": { + "end": 55235, + "raw": "0.24189274252014914", + "start": 55216, + "type": "Literal", + "type": "Literal", + "value": 0.24189274252014914 + }, + "end": 55235, + "operator": "-", + "start": 55215, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 55242, + "start": 55179, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 55245, + "start": 55244, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 55178, + "name": "line", + "start": 55174, + "type": "Identifier" + }, + "end": 55246, + "start": 55174, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 55286, + "raw": "0.44390956414045135", + "start": 55267, + "type": "Literal", + "type": "Literal", + "value": 0.44390956414045135 + }, + "end": 55286, + "operator": "-", + "start": 55266, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 55315, + "raw": "0.25912591535126905", + "start": 55296, + "type": "Literal", + "type": "Literal", + "value": 0.25912591535126905 + }, + "end": 55315, + "operator": "-", + "start": 55295, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 55322, + "start": 55257, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 55325, + "start": 55324, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 55256, + "name": "line", + "start": 55252, + "type": "Identifier" + }, + "end": 55326, + "start": 55252, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 55365, + "raw": "0.6605165911891009", + "start": 55347, + "type": "Literal", + "type": "Literal", + "value": 0.6605165911891009 + }, + "end": 55365, + "operator": "-", + "start": 55346, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 55394, + "raw": "0.40355115288839194", + "start": 55375, + "type": "Literal", + "type": "Literal", + "value": 0.40355115288839194 + }, + "end": 55394, + "operator": "-", + "start": 55374, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 55401, + "start": 55337, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 55404, + "start": 55403, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 55336, + "name": "line", + "start": 55332, + "type": "Identifier" + }, + "end": 55405, + "start": 55332, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 55444, + "raw": "0.7170489950180006", + "start": 55426, + "type": "Literal", + "type": "Literal", + "value": 0.7170489950180006 + }, + "end": 55444, + "operator": "-", + "start": 55425, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 55472, + "raw": "0.23454356079651384", + "start": 55453, + "type": "Literal", + "type": "Literal", + "value": 0.23454356079651384 + } + ], + "end": 55479, + "start": 55416, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 55482, + "start": 55481, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 55415, + "name": "line", + "start": 55411, + "type": "Identifier" + }, + "end": 55483, + "start": 55411, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 55522, + "raw": "0.2568187045379722", + "start": 55504, + "type": "Literal", + "type": "Literal", + "value": 0.2568187045379722 + }, + "end": 55522, + "operator": "-", + "start": 55503, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 55551, + "raw": "0.45031188717601367", + "start": 55532, + "type": "Literal", + "type": "Literal", + "value": 0.45031188717601367 + }, + "end": 55551, + "operator": "-", + "start": 55531, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 55558, + "start": 55494, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 55561, + "start": 55560, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 55493, + "name": "line", + "start": 55489, + "type": "Identifier" + }, + "end": 55562, + "start": 55489, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 55600, + "raw": "0.6751951211858687", + "start": 55582, + "type": "Literal", + "type": "Literal", + "value": 0.6751951211858687 + }, + { + "argument": { + "end": 55628, + "raw": "0.9709424233465593", + "start": 55610, + "type": "Literal", + "type": "Literal", + "value": 0.9709424233465593 + }, + "end": 55628, + "operator": "-", + "start": 55609, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 55635, + "start": 55573, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 55638, + "start": 55637, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 55572, + "name": "line", + "start": 55568, + "type": "Identifier" + }, + "end": 55639, + "start": 55568, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 55678, + "raw": "0.5689619842972184", + "start": 55660, + "type": "Literal", + "type": "Literal", + "value": 0.5689619842972184 + }, + "end": 55678, + "operator": "-", + "start": 55659, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 55705, + "raw": "0.5918969913790362", + "start": 55687, + "type": "Literal", + "type": "Literal", + "value": 0.5918969913790362 + } + ], + "end": 55712, + "start": 55650, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 55715, + "start": 55714, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 55649, + "name": "line", + "start": 55645, + "type": "Identifier" + }, + "end": 55716, + "start": 55645, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 55755, + "raw": "0.8328324229085962", + "start": 55737, + "type": "Literal", + "type": "Literal", + "value": 0.8328324229085962 + }, + "end": 55755, + "operator": "-", + "start": 55736, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 55782, + "raw": "0.4677492878818803", + "start": 55764, + "type": "Literal", + "type": "Literal", + "value": 0.4677492878818803 + } + ], + "end": 55789, + "start": 55727, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 55792, + "start": 55791, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 55726, + "name": "line", + "start": 55722, + "type": "Identifier" + }, + "end": 55793, + "start": 55722, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 55832, + "raw": "0.8111463382182231", + "start": 55814, + "type": "Literal", + "type": "Literal", + "value": 0.8111463382182231 + }, + "end": 55832, + "operator": "-", + "start": 55813, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 55861, + "raw": "0.41814807547140576", + "start": 55842, + "type": "Literal", + "type": "Literal", + "value": 0.41814807547140576 + }, + "end": 55861, + "operator": "-", + "start": 55841, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 55868, + "start": 55804, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 55871, + "start": 55870, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 55803, + "name": "line", + "start": 55799, + "type": "Identifier" + }, + "end": 55872, + "start": 55799, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 55911, + "raw": "0.03807684940941125", + "start": 55892, + "type": "Literal", + "type": "Literal", + "value": 0.03807684940941125 + }, + { + "end": 55939, + "raw": "0.25664826686353326", + "start": 55920, + "type": "Literal", + "type": "Literal", + "value": 0.25664826686353326 + } + ], + "end": 55946, + "start": 55883, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 55949, + "start": 55948, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 55882, + "name": "line", + "start": 55878, + "type": "Identifier" + }, + "end": 55950, + "start": 55878, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 55989, + "raw": "0.23950083339596384", + "start": 55970, + "type": "Literal", + "type": "Literal", + "value": 0.23950083339596384 + }, + { + "end": 56017, + "raw": "0.43693196301855575", + "start": 55998, + "type": "Literal", + "type": "Literal", + "value": 0.43693196301855575 + } + ], + "end": 56024, + "start": 55961, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 56027, + "start": 56026, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 55960, + "name": "line", + "start": 55956, + "type": "Identifier" + }, + "end": 56028, + "start": 55956, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 56068, + "raw": "0.16279444820904887", + "start": 56049, + "type": "Literal", + "type": "Literal", + "value": 0.16279444820904887 + }, + "end": 56068, + "operator": "-", + "start": 56048, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 56095, + "raw": "0.8064475707664818", + "start": 56077, + "type": "Literal", + "type": "Literal", + "value": 0.8064475707664818 + } + ], + "end": 56102, + "start": 56039, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 56105, + "start": 56104, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 56038, + "name": "line", + "start": 56034, + "type": "Identifier" + }, + "end": 56106, + "start": 56034, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 56146, + "raw": "0.08972872009232558", + "start": 56127, + "type": "Literal", + "type": "Literal", + "value": 0.08972872009232558 + }, + "end": 56146, + "operator": "-", + "start": 56126, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 56175, + "raw": "0.08887625823751266", + "start": 56156, + "type": "Literal", + "type": "Literal", + "value": 0.08887625823751266 + }, + "end": 56175, + "operator": "-", + "start": 56155, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 56182, + "start": 56117, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 56185, + "start": 56184, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 56116, + "name": "line", + "start": 56112, + "type": "Identifier" + }, + "end": 56186, + "start": 56112, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 56224, + "raw": "0.9203433427102556", + "start": 56206, + "type": "Literal", + "type": "Literal", + "value": 0.9203433427102556 + }, + { + "argument": { + "end": 56253, + "raw": "0.17343459369697545", + "start": 56234, + "type": "Literal", + "type": "Literal", + "value": 0.17343459369697545 + }, + "end": 56253, + "operator": "-", + "start": 56233, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 56260, + "start": 56197, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 56263, + "start": 56262, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 56196, + "name": "line", + "start": 56192, + "type": "Identifier" + }, + "end": 56264, + "start": 56192, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 56305, + "raw": "0.0017496234414517975", + "start": 56284, + "type": "Literal", + "type": "Literal", + "value": 0.0017496234414517975 + }, + { + "argument": { + "end": 56333, + "raw": "0.5178508316168335", + "start": 56315, + "type": "Literal", + "type": "Literal", + "value": 0.5178508316168335 + }, + "end": 56333, + "operator": "-", + "start": 56314, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 56340, + "start": 56275, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 56343, + "start": 56342, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 56274, + "name": "line", + "start": 56270, + "type": "Identifier" + }, + "end": 56344, + "start": 56270, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 56382, + "raw": "0.6206263405732759", + "start": 56364, + "type": "Literal", + "type": "Literal", + "value": 0.6206263405732759 + }, + { + "argument": { + "end": 56410, + "raw": "0.8733399468665124", + "start": 56392, + "type": "Literal", + "type": "Literal", + "value": 0.8733399468665124 + }, + "end": 56410, + "operator": "-", + "start": 56391, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 56417, + "start": 56355, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 56420, + "start": 56419, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 56354, + "name": "line", + "start": 56350, + "type": "Identifier" + }, + "end": 56421, + "start": 56350, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 56460, + "raw": "0.7776386664456383", + "start": 56442, + "type": "Literal", + "type": "Literal", + "value": 0.7776386664456383 + }, + "end": 56460, + "operator": "-", + "start": 56441, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 56487, + "raw": "0.7602780485384968", + "start": 56469, + "type": "Literal", + "type": "Literal", + "value": 0.7602780485384968 + } + ], + "end": 56494, + "start": 56432, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 56497, + "start": 56496, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 56431, + "name": "line", + "start": 56427, + "type": "Identifier" + }, + "end": 56498, + "start": 56427, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 56528, + "raw": "0.5439379760788592", + "start": 56510, + "type": "Literal", + "type": "Literal", + "value": 0.5439379760788592 + }, + { + "end": 56548, + "raw": "0.8449177589350552", + "start": 56530, + "type": "Literal", + "type": "Literal", + "value": 0.8449177589350552 + } + ], + "end": 56549, + "start": 56509, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 56552, + "start": 56551, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 56508, + "name": "line", + "start": 56504, + "type": "Identifier" + }, + "end": 56553, + "start": 56504, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 56593, + "raw": "0.13036646025917076", + "start": 56574, + "type": "Literal", + "type": "Literal", + "value": 0.13036646025917076 + }, + "end": 56593, + "operator": "-", + "start": 56573, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 56622, + "raw": "0.012051713627069693", + "start": 56602, + "type": "Literal", + "type": "Literal", + "value": 0.012051713627069693 + } + ], + "end": 56629, + "start": 56564, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 56632, + "start": 56631, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 56563, + "name": "line", + "start": 56559, + "type": "Identifier" + }, + "end": 56633, + "start": 56559, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 56672, + "raw": "0.1656465612645519", + "start": 56654, + "type": "Literal", + "type": "Literal", + "value": 0.1656465612645519 + }, + "end": 56672, + "operator": "-", + "start": 56653, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 56701, + "raw": "0.20775229173765486", + "start": 56682, + "type": "Literal", + "type": "Literal", + "value": 0.20775229173765486 + }, + "end": 56701, + "operator": "-", + "start": 56681, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 56708, + "start": 56644, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 56711, + "start": 56710, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 56643, + "name": "line", + "start": 56639, + "type": "Identifier" + }, + "end": 56712, + "start": 56639, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 56751, + "raw": "0.0962723255929061", + "start": 56733, + "type": "Literal", + "type": "Literal", + "value": 0.0962723255929061 + }, + "end": 56751, + "operator": "-", + "start": 56732, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 56780, + "raw": "0.05417797659066137", + "start": 56761, + "type": "Literal", + "type": "Literal", + "value": 0.05417797659066137 + }, + "end": 56780, + "operator": "-", + "start": 56760, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 56787, + "start": 56723, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 56790, + "start": 56789, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 56722, + "name": "line", + "start": 56718, + "type": "Identifier" + }, + "end": 56791, + "start": 56718, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 56820, + "raw": "0.902108945498191", + "start": 56803, + "type": "Literal", + "type": "Literal", + "value": 0.902108945498191 + }, + { + "end": 56840, + "raw": "0.3958978534964961", + "start": 56822, + "type": "Literal", + "type": "Literal", + "value": 0.3958978534964961 + } + ], + "end": 56841, + "start": 56802, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 56844, + "start": 56843, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 56801, + "name": "line", + "start": 56797, + "type": "Identifier" + }, + "end": 56845, + "start": 56797, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 56884, + "raw": "0.27997950083139167", + "start": 56865, + "type": "Literal", + "type": "Literal", + "value": 0.27997950083139167 + }, + { + "argument": { + "end": 56913, + "raw": "0.17778188444008958", + "start": 56894, + "type": "Literal", + "type": "Literal", + "value": 0.17778188444008958 + }, + "end": 56913, + "operator": "-", + "start": 56893, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 56920, + "start": 56856, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 56923, + "start": 56922, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 56855, + "name": "line", + "start": 56851, + "type": "Identifier" + }, + "end": 56924, + "start": 56851, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 56954, + "raw": "0.5235806061589545", + "start": 56936, + "type": "Literal", + "type": "Literal", + "value": 0.5235806061589545 + }, + { + "end": 56973, + "raw": "0.694318985642328", + "start": 56956, + "type": "Literal", + "type": "Literal", + "value": 0.694318985642328 + } + ], + "end": 56974, + "start": 56935, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 56977, + "start": 56976, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 56934, + "name": "line", + "start": 56930, + "type": "Identifier" + }, + "end": 56978, + "start": 56930, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 57017, + "raw": "0.39140760219992154", + "start": 56998, + "type": "Literal", + "type": "Literal", + "value": 0.39140760219992154 + }, + { + "argument": { + "end": 57045, + "raw": "0.7839795272576484", + "start": 57027, + "type": "Literal", + "type": "Literal", + "value": 0.7839795272576484 + }, + "end": 57045, + "operator": "-", + "start": 57026, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 57052, + "start": 56989, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 57055, + "start": 57054, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 56988, + "name": "line", + "start": 56984, + "type": "Identifier" + }, + "end": 57056, + "start": 56984, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 57086, + "raw": "0.8414243527073519", + "start": 57068, + "type": "Literal", + "type": "Literal", + "value": 0.8414243527073519 + }, + { + "end": 57106, + "raw": "0.5395591528940082", + "start": 57088, + "type": "Literal", + "type": "Literal", + "value": 0.5395591528940082 + } + ], + "end": 57107, + "start": 57067, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 57110, + "start": 57109, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 57066, + "name": "line", + "start": 57062, + "type": "Identifier" + }, + "end": 57111, + "start": 57062, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 57149, + "raw": "0.6137667704875602", + "start": 57131, + "type": "Literal", + "type": "Literal", + "value": 0.6137667704875602 + }, + { + "end": 57177, + "raw": "0.22119647516722085", + "start": 57158, + "type": "Literal", + "type": "Literal", + "value": 0.22119647516722085 + } + ], + "end": 57184, + "start": 57122, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 57187, + "start": 57186, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 57121, + "name": "line", + "start": 57117, + "type": "Identifier" + }, + "end": 57188, + "start": 57117, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 57218, + "raw": "0.8830488380766681", + "start": 57200, + "type": "Literal", + "type": "Literal", + "value": 0.8830488380766681 + }, + { + "end": 57238, + "raw": "0.6996724408425232", + "start": 57220, + "type": "Literal", + "type": "Literal", + "value": 0.6996724408425232 + } + ], + "end": 57239, + "start": 57199, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 57242, + "start": 57241, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 57198, + "name": "line", + "start": 57194, + "type": "Identifier" + }, + "end": 57243, + "start": 57194, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 57283, + "raw": "0.41290485754343953", + "start": 57264, + "type": "Literal", + "type": "Literal", + "value": 0.41290485754343953 + }, + "end": 57283, + "operator": "-", + "start": 57263, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 57311, + "raw": "0.4152647361760933", + "start": 57293, + "type": "Literal", + "type": "Literal", + "value": 0.4152647361760933 + }, + "end": 57311, + "operator": "-", + "start": 57292, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 57318, + "start": 57254, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 57321, + "start": 57320, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 57253, + "name": "line", + "start": 57249, + "type": "Identifier" + }, + "end": 57322, + "start": 57249, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 57360, + "raw": "0.5169538755575687", + "start": 57342, + "type": "Literal", + "type": "Literal", + "value": 0.5169538755575687 + }, + { + "argument": { + "end": 57388, + "raw": "0.9085567867302617", + "start": 57370, + "type": "Literal", + "type": "Literal", + "value": 0.9085567867302617 + }, + "end": 57388, + "operator": "-", + "start": 57369, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 57395, + "start": 57333, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 57398, + "start": 57397, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 57332, + "name": "line", + "start": 57328, + "type": "Identifier" + }, + "end": 57399, + "start": 57328, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 57437, + "raw": "0.6751951211858687", + "start": 57419, + "type": "Literal", + "type": "Literal", + "value": 0.6751951211858687 + }, + { + "argument": { + "end": 57465, + "raw": "0.9709424233465593", + "start": 57447, + "type": "Literal", + "type": "Literal", + "value": 0.9709424233465593 + }, + "end": 57465, + "operator": "-", + "start": 57446, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 57472, + "start": 57410, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 57475, + "start": 57474, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 57409, + "name": "line", + "start": 57405, + "type": "Identifier" + }, + "end": 57476, + "start": 57405, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 57515, + "raw": "0.5689619842972184", + "start": 57497, + "type": "Literal", + "type": "Literal", + "value": 0.5689619842972184 + }, + "end": 57515, + "operator": "-", + "start": 57496, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 57542, + "raw": "0.5918969913790362", + "start": 57524, + "type": "Literal", + "type": "Literal", + "value": 0.5918969913790362 + } + ], + "end": 57549, + "start": 57487, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 57552, + "start": 57551, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 57486, + "name": "line", + "start": 57482, + "type": "Identifier" + }, + "end": 57553, + "start": 57482, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 57591, + "raw": "0.9464450621708211", + "start": 57573, + "type": "Literal", + "type": "Literal", + "value": 0.9464450621708211 + }, + { + "argument": { + "end": 57619, + "raw": "0.2684908127803667", + "start": 57601, + "type": "Literal", + "type": "Literal", + "value": 0.2684908127803667 + }, + "end": 57619, + "operator": "-", + "start": 57600, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 57626, + "start": 57564, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 57629, + "start": 57628, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 57563, + "name": "line", + "start": 57559, + "type": "Identifier" + }, + "end": 57630, + "start": 57559, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 57660, + "raw": "0.5241732366617591", + "start": 57642, + "type": "Literal", + "type": "Literal", + "value": 0.5241732366617591 + }, + { + "end": 57680, + "raw": "0.9011437416408563", + "start": 57662, + "type": "Literal", + "type": "Literal", + "value": 0.9011437416408563 + } + ], + "end": 57681, + "start": 57641, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 57684, + "start": 57683, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 57640, + "name": "line", + "start": 57636, + "type": "Identifier" + }, + "end": 57685, + "start": 57636, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 57725, + "raw": "0.14255393713960607", + "start": 57706, + "type": "Literal", + "type": "Literal", + "value": 0.14255393713960607 + }, + "end": 57725, + "operator": "-", + "start": 57705, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 57753, + "raw": "0.5194262624564814", + "start": 57735, + "type": "Literal", + "type": "Literal", + "value": 0.5194262624564814 + }, + "end": 57753, + "operator": "-", + "start": 57734, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 57760, + "start": 57696, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 57763, + "start": 57762, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 57695, + "name": "line", + "start": 57691, + "type": "Identifier" + }, + "end": 57764, + "start": 57691, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 57803, + "raw": "0.4287123231350338", + "start": 57785, + "type": "Literal", + "type": "Literal", + "value": 0.4287123231350338 + }, + "end": 57803, + "operator": "-", + "start": 57784, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 57831, + "raw": "0.4223564528725028", + "start": 57813, + "type": "Literal", + "type": "Literal", + "value": 0.4223564528725028 + }, + "end": 57831, + "operator": "-", + "start": 57812, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 57838, + "start": 57775, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 57841, + "start": 57840, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 57774, + "name": "line", + "start": 57770, + "type": "Identifier" + }, + "end": 57842, + "start": 57770, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 57882, + "raw": "0.09316367294024519", + "start": 57863, + "type": "Literal", + "type": "Literal", + "value": 0.09316367294024519 + }, + "end": 57882, + "operator": "-", + "start": 57862, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 57910, + "raw": "0.9063127021008246", + "start": 57892, + "type": "Literal", + "type": "Literal", + "value": 0.9063127021008246 + }, + "end": 57910, + "operator": "-", + "start": 57891, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 57917, + "start": 57853, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 57920, + "start": 57919, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 57852, + "name": "line", + "start": 57848, + "type": "Identifier" + }, + "end": 57921, + "start": 57848, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 57960, + "raw": "0.2767766535558669", + "start": 57942, + "type": "Literal", + "type": "Literal", + "value": 0.2767766535558669 + }, + "end": 57960, + "operator": "-", + "start": 57941, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 57987, + "raw": "0.6816248114129131", + "start": 57969, + "type": "Literal", + "type": "Literal", + "value": 0.6816248114129131 + } + ], + "end": 57994, + "start": 57932, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 57997, + "start": 57996, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 57931, + "name": "line", + "start": 57927, + "type": "Identifier" + }, + "end": 57998, + "start": 57927, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 58036, + "raw": "0.9796762495562534", + "start": 58018, + "type": "Literal", + "type": "Literal", + "value": 0.9796762495562534 + }, + { + "argument": { + "end": 58064, + "raw": "0.0822145668330625", + "start": 58046, + "type": "Literal", + "type": "Literal", + "value": 0.0822145668330625 + }, + "end": 58064, + "operator": "-", + "start": 58045, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 58071, + "start": 58009, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 58074, + "start": 58073, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 58008, + "name": "line", + "start": 58004, + "type": "Identifier" + }, + "end": 58075, + "start": 58004, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 58114, + "raw": "0.8666513070867441", + "start": 58096, + "type": "Literal", + "type": "Literal", + "value": 0.8666513070867441 + }, + "end": 58114, + "operator": "-", + "start": 58095, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 58141, + "raw": "0.301053160242023", + "start": 58124, + "type": "Literal", + "type": "Literal", + "value": 0.301053160242023 + }, + "end": 58141, + "operator": "-", + "start": 58123, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 58148, + "start": 58086, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 58151, + "start": 58150, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 58085, + "name": "line", + "start": 58081, + "type": "Identifier" + }, + "end": 58152, + "start": 58081, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 58189, + "raw": "0.537415656028112", + "start": 58172, + "type": "Literal", + "type": "Literal", + "value": 0.537415656028112 + }, + { + "end": 58218, + "raw": "0.020272692875002774", + "start": 58198, + "type": "Literal", + "type": "Literal", + "value": 0.020272692875002774 + } + ], + "end": 58225, + "start": 58163, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 58228, + "start": 58227, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 58162, + "name": "line", + "start": 58158, + "type": "Identifier" + }, + "end": 58229, + "start": 58158, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 58267, + "raw": "0.9332396256457531", + "start": 58249, + "type": "Literal", + "type": "Literal", + "value": 0.9332396256457531 + }, + { + "argument": { + "end": 58295, + "raw": "0.6228175690649898", + "start": 58277, + "type": "Literal", + "type": "Literal", + "value": 0.6228175690649898 + }, + "end": 58295, + "operator": "-", + "start": 58276, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 58302, + "start": 58240, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 58305, + "start": 58304, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 58239, + "name": "line", + "start": 58235, + "type": "Identifier" + }, + "end": 58306, + "start": 58235, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 58345, + "raw": "0.18052415837320734", + "start": 58326, + "type": "Literal", + "type": "Literal", + "value": 0.18052415837320734 + }, + { + "argument": { + "end": 58374, + "raw": "0.36894384647296197", + "start": 58355, + "type": "Literal", + "type": "Literal", + "value": 0.36894384647296197 + }, + "end": 58374, + "operator": "-", + "start": 58354, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 58381, + "start": 58317, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 58384, + "start": 58383, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 58316, + "name": "line", + "start": 58312, + "type": "Identifier" + }, + "end": 58385, + "start": 58312, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 58415, + "raw": "0.5384372634075449", + "start": 58397, + "type": "Literal", + "type": "Literal", + "value": 0.5384372634075449 + }, + { + "end": 58435, + "raw": "0.2377565050887107", + "start": 58417, + "type": "Literal", + "type": "Literal", + "value": 0.2377565050887107 + } + ], + "end": 58436, + "start": 58396, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 58439, + "start": 58438, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 58395, + "name": "line", + "start": 58391, + "type": "Identifier" + }, + "end": 58440, + "start": 58391, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 58479, + "raw": "0.39043436929278874", + "start": 58460, + "type": "Literal", + "type": "Literal", + "value": 0.39043436929278874 + }, + { + "end": 58507, + "raw": "0.14273182483160451", + "start": 58488, + "type": "Literal", + "type": "Literal", + "value": 0.14273182483160451 + } + ], + "end": 58514, + "start": 58451, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 58517, + "start": 58516, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 58450, + "name": "line", + "start": 58446, + "type": "Identifier" + }, + "end": 58518, + "start": 58446, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 58557, + "raw": "0.09782890412897283", + "start": 58538, + "type": "Literal", + "type": "Literal", + "value": 0.09782890412897283 + }, + { + "end": 58584, + "raw": "0.9907667536909659", + "start": 58566, + "type": "Literal", + "type": "Literal", + "value": 0.9907667536909659 + } + ], + "end": 58591, + "start": 58529, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 58594, + "start": 58593, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 58528, + "name": "line", + "start": 58524, + "type": "Identifier" + }, + "end": 58595, + "start": 58524, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 58633, + "raw": "0.5286610085921146", + "start": 58615, + "type": "Literal", + "type": "Literal", + "value": 0.5286610085921146 + }, + { + "argument": { + "end": 58661, + "raw": "0.7924508308419256", + "start": 58643, + "type": "Literal", + "type": "Literal", + "value": 0.7924508308419256 + }, + "end": 58661, + "operator": "-", + "start": 58642, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 58668, + "start": 58606, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 58671, + "start": 58670, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 58605, + "name": "line", + "start": 58601, + "type": "Identifier" + }, + "end": 58672, + "start": 58601, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 58710, + "raw": "0.3789978184503342", + "start": 58692, + "type": "Literal", + "type": "Literal", + "value": 0.3789978184503342 + }, + { + "end": 58738, + "raw": "0.12396120576838676", + "start": 58719, + "type": "Literal", + "type": "Literal", + "value": 0.12396120576838676 + } + ], + "end": 58745, + "start": 58683, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 58748, + "start": 58747, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 58682, + "name": "line", + "start": 58678, + "type": "Identifier" + }, + "end": 58749, + "start": 58678, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 58788, + "raw": "0.9484912744890612", + "start": 58770, + "type": "Literal", + "type": "Literal", + "value": 0.9484912744890612 + }, + "end": 58788, + "operator": "-", + "start": 58769, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 58815, + "raw": "0.6729649846476855", + "start": 58797, + "type": "Literal", + "type": "Literal", + "value": 0.6729649846476855 + } + ], + "end": 58822, + "start": 58760, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 58825, + "start": 58824, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 58759, + "name": "line", + "start": 58755, + "type": "Identifier" + }, + "end": 58826, + "start": 58755, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 58864, + "raw": "0.7451758753425153", + "start": 58846, + "type": "Literal", + "type": "Literal", + "value": 0.7451758753425153 + }, + { + "argument": { + "end": 58893, + "raw": "0.21318737562458967", + "start": 58874, + "type": "Literal", + "type": "Literal", + "value": 0.21318737562458967 + }, + "end": 58893, + "operator": "-", + "start": 58873, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 58900, + "start": 58837, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 58903, + "start": 58902, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 58836, + "name": "line", + "start": 58832, + "type": "Identifier" + }, + "end": 58904, + "start": 58832, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 58942, + "raw": "0.1873200727251887", + "start": 58924, + "type": "Literal", + "type": "Literal", + "value": 0.1873200727251887 + }, + { + "argument": { + "end": 58971, + "raw": "0.15961374297992448", + "start": 58952, + "type": "Literal", + "type": "Literal", + "value": 0.15961374297992448 + }, + "end": 58971, + "operator": "-", + "start": 58951, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 58978, + "start": 58915, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 58981, + "start": 58980, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 58914, + "name": "line", + "start": 58910, + "type": "Identifier" + }, + "end": 58982, + "start": 58910, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 59022, + "raw": "0.05729464924537564", + "start": 59003, + "type": "Literal", + "type": "Literal", + "value": 0.05729464924537564 + }, + "end": 59022, + "operator": "-", + "start": 59002, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 59050, + "raw": "0.5436345558508746", + "start": 59032, + "type": "Literal", + "type": "Literal", + "value": 0.5436345558508746 + }, + "end": 59050, + "operator": "-", + "start": 59031, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 59057, + "start": 58993, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 59060, + "start": 59059, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 58992, + "name": "line", + "start": 58988, + "type": "Identifier" + }, + "end": 59061, + "start": 58988, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 59101, + "raw": "0.09582414374469184", + "start": 59082, + "type": "Literal", + "type": "Literal", + "value": 0.09582414374469184 + }, + "end": 59101, + "operator": "-", + "start": 59081, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 59129, + "raw": "0.7533839681212353", + "start": 59111, + "type": "Literal", + "type": "Literal", + "value": 0.7533839681212353 + }, + "end": 59129, + "operator": "-", + "start": 59110, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 59136, + "start": 59072, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 59139, + "start": 59138, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 59071, + "name": "line", + "start": 59067, + "type": "Identifier" + }, + "end": 59140, + "start": 59067, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 59180, + "raw": "0.17254116580051848", + "start": 59161, + "type": "Literal", + "type": "Literal", + "value": 0.17254116580051848 + }, + "end": 59180, + "operator": "-", + "start": 59160, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 59208, + "raw": "0.7669113400341137", + "start": 59190, + "type": "Literal", + "type": "Literal", + "value": 0.7669113400341137 + }, + "end": 59208, + "operator": "-", + "start": 59189, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 59215, + "start": 59151, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 59218, + "start": 59217, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 59150, + "name": "line", + "start": 59146, + "type": "Identifier" + }, + "end": 59219, + "start": 59146, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 59249, + "raw": "0.8944730032887609", + "start": 59231, + "type": "Literal", + "type": "Literal", + "value": 0.8944730032887609 + }, + { + "end": 59269, + "raw": "0.6093318694741408", + "start": 59251, + "type": "Literal", + "type": "Literal", + "value": 0.6093318694741408 + } + ], + "end": 59270, + "start": 59230, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 59273, + "start": 59272, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 59229, + "name": "line", + "start": 59225, + "type": "Identifier" + }, + "end": 59274, + "start": 59225, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 59313, + "raw": "0.3670208139314082", + "start": 59295, + "type": "Literal", + "type": "Literal", + "value": 0.3670208139314082 + }, + "end": 59313, + "operator": "-", + "start": 59294, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 59341, + "raw": "0.21201331909674526", + "start": 59322, + "type": "Literal", + "type": "Literal", + "value": 0.21201331909674526 + } + ], + "end": 59348, + "start": 59285, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 59351, + "start": 59350, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 59284, + "name": "line", + "start": 59280, + "type": "Identifier" + }, + "end": 59352, + "start": 59280, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 59391, + "raw": "0.4707511307971115", + "start": 59373, + "type": "Literal", + "type": "Literal", + "value": 0.4707511307971115 + }, + "end": 59391, + "operator": "-", + "start": 59372, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 59418, + "raw": "0.4905279615419764", + "start": 59400, + "type": "Literal", + "type": "Literal", + "value": 0.4905279615419764 + } + ], + "end": 59425, + "start": 59363, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 59428, + "start": 59427, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 59362, + "name": "line", + "start": 59358, + "type": "Identifier" + }, + "end": 59429, + "start": 59358, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 59468, + "raw": "0.8328324229085962", + "start": 59450, + "type": "Literal", + "type": "Literal", + "value": 0.8328324229085962 + }, + "end": 59468, + "operator": "-", + "start": 59449, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 59495, + "raw": "0.4677492878818803", + "start": 59477, + "type": "Literal", + "type": "Literal", + "value": 0.4677492878818803 + } + ], + "end": 59502, + "start": 59440, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 59505, + "start": 59504, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 59439, + "name": "line", + "start": 59435, + "type": "Identifier" + }, + "end": 59506, + "start": 59435, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 59545, + "raw": "0.8111463382182231", + "start": 59527, + "type": "Literal", + "type": "Literal", + "value": 0.8111463382182231 + }, + "end": 59545, + "operator": "-", + "start": 59526, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 59574, + "raw": "0.41814807547140576", + "start": 59555, + "type": "Literal", + "type": "Literal", + "value": 0.41814807547140576 + }, + "end": 59574, + "operator": "-", + "start": 59554, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 59581, + "start": 59517, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 59584, + "start": 59583, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 59516, + "name": "line", + "start": 59512, + "type": "Identifier" + }, + "end": 59585, + "start": 59512, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 59624, + "raw": "0.03807684940941125", + "start": 59605, + "type": "Literal", + "type": "Literal", + "value": 0.03807684940941125 + }, + { + "end": 59652, + "raw": "0.25664826686353326", + "start": 59633, + "type": "Literal", + "type": "Literal", + "value": 0.25664826686353326 + } + ], + "end": 59659, + "start": 59596, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 59662, + "start": 59661, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 59595, + "name": "line", + "start": 59591, + "type": "Identifier" + }, + "end": 59663, + "start": 59591, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 59702, + "raw": "0.23950083339596384", + "start": 59683, + "type": "Literal", + "type": "Literal", + "value": 0.23950083339596384 + }, + { + "end": 59730, + "raw": "0.43693196301855575", + "start": 59711, + "type": "Literal", + "type": "Literal", + "value": 0.43693196301855575 + } + ], + "end": 59737, + "start": 59674, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 59740, + "start": 59739, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 59673, + "name": "line", + "start": 59669, + "type": "Identifier" + }, + "end": 59741, + "start": 59669, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 59781, + "raw": "0.16279444820904887", + "start": 59762, + "type": "Literal", + "type": "Literal", + "value": 0.16279444820904887 + }, + "end": 59781, + "operator": "-", + "start": 59761, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 59808, + "raw": "0.8064475707664818", + "start": 59790, + "type": "Literal", + "type": "Literal", + "value": 0.8064475707664818 + } + ], + "end": 59815, + "start": 59752, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 59818, + "start": 59817, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 59751, + "name": "line", + "start": 59747, + "type": "Identifier" + }, + "end": 59819, + "start": 59747, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 59859, + "raw": "0.08972872009232558", + "start": 59840, + "type": "Literal", + "type": "Literal", + "value": 0.08972872009232558 + }, + "end": 59859, + "operator": "-", + "start": 59839, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 59888, + "raw": "0.08887625823751266", + "start": 59869, + "type": "Literal", + "type": "Literal", + "value": 0.08887625823751266 + }, + "end": 59888, + "operator": "-", + "start": 59868, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 59895, + "start": 59830, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 59898, + "start": 59897, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 59829, + "name": "line", + "start": 59825, + "type": "Identifier" + }, + "end": 59899, + "start": 59825, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 59937, + "raw": "0.9203433427102556", + "start": 59919, + "type": "Literal", + "type": "Literal", + "value": 0.9203433427102556 + }, + { + "argument": { + "end": 59966, + "raw": "0.17343459369697545", + "start": 59947, + "type": "Literal", + "type": "Literal", + "value": 0.17343459369697545 + }, + "end": 59966, + "operator": "-", + "start": 59946, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 59973, + "start": 59910, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 59976, + "start": 59975, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 59909, + "name": "line", + "start": 59905, + "type": "Identifier" + }, + "end": 59977, + "start": 59905, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 60018, + "raw": "0.0017496234414517975", + "start": 59997, + "type": "Literal", + "type": "Literal", + "value": 0.0017496234414517975 + }, + { + "argument": { + "end": 60046, + "raw": "0.5178508316168335", + "start": 60028, + "type": "Literal", + "type": "Literal", + "value": 0.5178508316168335 + }, + "end": 60046, + "operator": "-", + "start": 60027, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 60053, + "start": 59988, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 60056, + "start": 60055, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 59987, + "name": "line", + "start": 59983, + "type": "Identifier" + }, + "end": 60057, + "start": 59983, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 60095, + "raw": "0.6206263405732759", + "start": 60077, + "type": "Literal", + "type": "Literal", + "value": 0.6206263405732759 + }, + { + "argument": { + "end": 60123, + "raw": "0.8733399468665124", + "start": 60105, + "type": "Literal", + "type": "Literal", + "value": 0.8733399468665124 + }, + "end": 60123, + "operator": "-", + "start": 60104, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 60130, + "start": 60068, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 60133, + "start": 60132, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 60067, + "name": "line", + "start": 60063, + "type": "Identifier" + }, + "end": 60134, + "start": 60063, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 60173, + "raw": "0.7776386664456383", + "start": 60155, + "type": "Literal", + "type": "Literal", + "value": 0.7776386664456383 + }, + "end": 60173, + "operator": "-", + "start": 60154, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 60200, + "raw": "0.7602780485384968", + "start": 60182, + "type": "Literal", + "type": "Literal", + "value": 0.7602780485384968 + } + ], + "end": 60207, + "start": 60145, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 60210, + "start": 60209, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 60144, + "name": "line", + "start": 60140, + "type": "Identifier" + }, + "end": 60211, + "start": 60140, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 60241, + "raw": "0.5439379760788592", + "start": 60223, + "type": "Literal", + "type": "Literal", + "value": 0.5439379760788592 + }, + { + "end": 60261, + "raw": "0.8449177589350552", + "start": 60243, + "type": "Literal", + "type": "Literal", + "value": 0.8449177589350552 + } + ], + "end": 60262, + "start": 60222, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 60265, + "start": 60264, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 60221, + "name": "line", + "start": 60217, + "type": "Identifier" + }, + "end": 60266, + "start": 60217, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 60306, + "raw": "0.13036646025917076", + "start": 60287, + "type": "Literal", + "type": "Literal", + "value": 0.13036646025917076 + }, + "end": 60306, + "operator": "-", + "start": 60286, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 60335, + "raw": "0.012051713627069693", + "start": 60315, + "type": "Literal", + "type": "Literal", + "value": 0.012051713627069693 + } + ], + "end": 60342, + "start": 60277, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 60345, + "start": 60344, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 60276, + "name": "line", + "start": 60272, + "type": "Identifier" + }, + "end": 60346, + "start": 60272, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 60385, + "raw": "0.1656465612645519", + "start": 60367, + "type": "Literal", + "type": "Literal", + "value": 0.1656465612645519 + }, + "end": 60385, + "operator": "-", + "start": 60366, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 60414, + "raw": "0.20775229173765486", + "start": 60395, + "type": "Literal", + "type": "Literal", + "value": 0.20775229173765486 + }, + "end": 60414, + "operator": "-", + "start": 60394, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 60421, + "start": 60357, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 60424, + "start": 60423, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 60356, + "name": "line", + "start": 60352, + "type": "Identifier" + }, + "end": 60425, + "start": 60352, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 60464, + "raw": "0.0962723255929061", + "start": 60446, + "type": "Literal", + "type": "Literal", + "value": 0.0962723255929061 + }, + "end": 60464, + "operator": "-", + "start": 60445, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 60493, + "raw": "0.05417797659066137", + "start": 60474, + "type": "Literal", + "type": "Literal", + "value": 0.05417797659066137 + }, + "end": 60493, + "operator": "-", + "start": 60473, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 60500, + "start": 60436, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 60503, + "start": 60502, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 60435, + "name": "line", + "start": 60431, + "type": "Identifier" + }, + "end": 60504, + "start": 60431, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 60533, + "raw": "0.902108945498191", + "start": 60516, + "type": "Literal", + "type": "Literal", + "value": 0.902108945498191 + }, + { + "end": 60553, + "raw": "0.3958978534964961", + "start": 60535, + "type": "Literal", + "type": "Literal", + "value": 0.3958978534964961 + } + ], + "end": 60554, + "start": 60515, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 60557, + "start": 60556, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 60514, + "name": "line", + "start": 60510, + "type": "Identifier" + }, + "end": 60558, + "start": 60510, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 60597, + "raw": "0.27997950083139167", + "start": 60578, + "type": "Literal", + "type": "Literal", + "value": 0.27997950083139167 + }, + { + "argument": { + "end": 60626, + "raw": "0.17778188444008958", + "start": 60607, + "type": "Literal", + "type": "Literal", + "value": 0.17778188444008958 + }, + "end": 60626, + "operator": "-", + "start": 60606, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 60633, + "start": 60569, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 60636, + "start": 60635, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 60568, + "name": "line", + "start": 60564, + "type": "Identifier" + }, + "end": 60637, + "start": 60564, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 60667, + "raw": "0.5235806061589545", + "start": 60649, + "type": "Literal", + "type": "Literal", + "value": 0.5235806061589545 + }, + { + "end": 60686, + "raw": "0.694318985642328", + "start": 60669, + "type": "Literal", + "type": "Literal", + "value": 0.694318985642328 + } + ], + "end": 60687, + "start": 60648, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 60690, + "start": 60689, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 60647, + "name": "line", + "start": 60643, + "type": "Identifier" + }, + "end": 60691, + "start": 60643, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 60730, + "raw": "0.39140760219992154", + "start": 60711, + "type": "Literal", + "type": "Literal", + "value": 0.39140760219992154 + }, + { + "argument": { + "end": 60758, + "raw": "0.7839795272576484", + "start": 60740, + "type": "Literal", + "type": "Literal", + "value": 0.7839795272576484 + }, + "end": 60758, + "operator": "-", + "start": 60739, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 60765, + "start": 60702, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 60768, + "start": 60767, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 60701, + "name": "line", + "start": 60697, + "type": "Identifier" + }, + "end": 60769, + "start": 60697, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 60799, + "raw": "0.8414243527073519", + "start": 60781, + "type": "Literal", + "type": "Literal", + "value": 0.8414243527073519 + }, + { + "end": 60819, + "raw": "0.5395591528940082", + "start": 60801, + "type": "Literal", + "type": "Literal", + "value": 0.5395591528940082 + } + ], + "end": 60820, + "start": 60780, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 60823, + "start": 60822, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 60779, + "name": "line", + "start": 60775, + "type": "Identifier" + }, + "end": 60824, + "start": 60775, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 60862, + "raw": "0.6137667704875602", + "start": 60844, + "type": "Literal", + "type": "Literal", + "value": 0.6137667704875602 + }, + { + "end": 60890, + "raw": "0.22119647516722085", + "start": 60871, + "type": "Literal", + "type": "Literal", + "value": 0.22119647516722085 + } + ], + "end": 60897, + "start": 60835, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 60900, + "start": 60899, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 60834, + "name": "line", + "start": 60830, + "type": "Identifier" + }, + "end": 60901, + "start": 60830, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 60931, + "raw": "0.8830488380766681", + "start": 60913, + "type": "Literal", + "type": "Literal", + "value": 0.8830488380766681 + }, + { + "end": 60951, + "raw": "0.6996724408425232", + "start": 60933, + "type": "Literal", + "type": "Literal", + "value": 0.6996724408425232 + } + ], + "end": 60952, + "start": 60912, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 60955, + "start": 60954, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 60911, + "name": "line", + "start": 60907, + "type": "Identifier" + }, + "end": 60956, + "start": 60907, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 60996, + "raw": "0.41290485754343953", + "start": 60977, + "type": "Literal", + "type": "Literal", + "value": 0.41290485754343953 + }, + "end": 60996, + "operator": "-", + "start": 60976, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 61024, + "raw": "0.4152647361760933", + "start": 61006, + "type": "Literal", + "type": "Literal", + "value": 0.4152647361760933 + }, + "end": 61024, + "operator": "-", + "start": 61005, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 61031, + "start": 60967, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 61034, + "start": 61033, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 60966, + "name": "line", + "start": 60962, + "type": "Identifier" + }, + "end": 61035, + "start": 60962, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 61073, + "raw": "0.5169538755575687", + "start": 61055, + "type": "Literal", + "type": "Literal", + "value": 0.5169538755575687 + }, + { + "argument": { + "end": 61101, + "raw": "0.9085567867302617", + "start": 61083, + "type": "Literal", + "type": "Literal", + "value": 0.9085567867302617 + }, + "end": 61101, + "operator": "-", + "start": 61082, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 61108, + "start": 61046, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 61111, + "start": 61110, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 61045, + "name": "line", + "start": 61041, + "type": "Identifier" + }, + "end": 61112, + "start": 61041, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 61151, + "raw": "0.6716353749059765", + "start": 61133, + "type": "Literal", + "type": "Literal", + "value": 0.6716353749059765 + }, + "end": 61151, + "operator": "-", + "start": 61132, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 61179, + "raw": "0.9605576808879026", + "start": 61161, + "type": "Literal", + "type": "Literal", + "value": 0.9605576808879026 + }, + "end": 61179, + "operator": "-", + "start": 61160, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 61186, + "start": 61123, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 61189, + "start": 61188, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 61122, + "name": "line", + "start": 61118, + "type": "Identifier" + }, + "end": 61190, + "start": 61118, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 61230, + "raw": "0.010280170930300203", + "start": 61210, + "type": "Literal", + "type": "Literal", + "value": 0.010280170930300203 + }, + { + "argument": { + "end": 61259, + "raw": "0.37344123662342166", + "start": 61240, + "type": "Literal", + "type": "Literal", + "value": 0.37344123662342166 + }, + "end": 61259, + "operator": "-", + "start": 61239, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 61266, + "start": 61201, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 61269, + "start": 61268, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 61200, + "name": "line", + "start": 61196, + "type": "Identifier" + }, + "end": 61270, + "start": 61196, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 61309, + "raw": "0.10357375682791004", + "start": 61290, + "type": "Literal", + "type": "Literal", + "value": 0.10357375682791004 + }, + { + "argument": { + "end": 61338, + "raw": "0.42294321030821425", + "start": 61319, + "type": "Literal", + "type": "Literal", + "value": 0.42294321030821425 + }, + "end": 61338, + "operator": "-", + "start": 61318, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 61345, + "start": 61281, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 61348, + "start": 61347, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 61280, + "name": "line", + "start": 61276, + "type": "Identifier" + }, + "end": 61349, + "start": 61276, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 61387, + "raw": "0.4520311575096987", + "start": 61369, + "type": "Literal", + "type": "Literal", + "value": 0.4520311575096987 + }, + { + "argument": { + "end": 61416, + "raw": "0.11232675307600548", + "start": 61397, + "type": "Literal", + "type": "Literal", + "value": 0.11232675307600548 + }, + "end": 61416, + "operator": "-", + "start": 61396, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 61423, + "start": 61360, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 61426, + "start": 61425, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 61359, + "name": "line", + "start": 61355, + "type": "Identifier" + }, + "end": 61427, + "start": 61355, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 61466, + "raw": "0.8821185914380845", + "start": 61448, + "type": "Literal", + "type": "Literal", + "value": 0.8821185914380845 + }, + "end": 61466, + "operator": "-", + "start": 61447, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 61494, + "raw": "0.7155147434939819", + "start": 61476, + "type": "Literal", + "type": "Literal", + "value": 0.7155147434939819 + }, + "end": 61494, + "operator": "-", + "start": 61475, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 61501, + "start": 61438, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 61504, + "start": 61503, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 61437, + "name": "line", + "start": 61433, + "type": "Identifier" + }, + "end": 61505, + "start": 61433, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 61535, + "raw": "0.9195487101690416", + "start": 61517, + "type": "Literal", + "type": "Literal", + "value": 0.9195487101690416 + }, + { + "end": 61555, + "raw": "0.2691627465297364", + "start": 61537, + "type": "Literal", + "type": "Literal", + "value": 0.2691627465297364 + } + ], + "end": 61556, + "start": 61516, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 61559, + "start": 61558, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 61515, + "name": "line", + "start": 61511, + "type": "Identifier" + }, + "end": 61560, + "start": 61511, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 61598, + "raw": "0.7098978191546745", + "start": 61580, + "type": "Literal", + "type": "Literal", + "value": 0.7098978191546745 + }, + { + "end": 61626, + "raw": "0.11710004169385968", + "start": 61607, + "type": "Literal", + "type": "Literal", + "value": 0.11710004169385968 + } + ], + "end": 61633, + "start": 61571, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 61636, + "start": 61635, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 61570, + "name": "line", + "start": 61566, + "type": "Identifier" + }, + "end": 61637, + "start": 61566, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 61677, + "raw": "0.37876368560819995", + "start": 61658, + "type": "Literal", + "type": "Literal", + "value": 0.37876368560819995 + }, + "end": 61677, + "operator": "-", + "start": 61657, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 61704, + "raw": "0.7106729314759084", + "start": 61686, + "type": "Literal", + "type": "Literal", + "value": 0.7106729314759084 + } + ], + "end": 61711, + "start": 61648, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 61714, + "start": 61713, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 61647, + "name": "line", + "start": 61643, + "type": "Identifier" + }, + "end": 61715, + "start": 61643, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 61755, + "raw": "0.29728126898353335", + "start": 61736, + "type": "Literal", + "type": "Literal", + "value": 0.29728126898353335 + }, + "end": 61755, + "operator": "-", + "start": 61735, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 61784, + "raw": "0.06649734568328003", + "start": 61765, + "type": "Literal", + "type": "Literal", + "value": 0.06649734568328003 + }, + "end": 61784, + "operator": "-", + "start": 61764, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 61791, + "start": 61726, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 61794, + "start": 61793, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 61725, + "name": "line", + "start": 61721, + "type": "Identifier" + }, + "end": 61795, + "start": 61721, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 61834, + "raw": "0.22965781558352072", + "start": 61815, + "type": "Literal", + "type": "Literal", + "value": 0.22965781558352072 + }, + { + "argument": { + "end": 61862, + "raw": "0.7601866432836641", + "start": 61844, + "type": "Literal", + "type": "Literal", + "value": 0.7601866432836641 + }, + "end": 61862, + "operator": "-", + "start": 61843, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 61869, + "start": 61806, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 61872, + "start": 61871, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 61805, + "name": "line", + "start": 61801, + "type": "Identifier" + }, + "end": 61873, + "start": 61801, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 61912, + "raw": "0.6356501074317229", + "start": 61894, + "type": "Literal", + "type": "Literal", + "value": 0.6356501074317229 + }, + "end": 61912, + "operator": "-", + "start": 61893, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 61940, + "raw": "0.19458425399338064", + "start": 61921, + "type": "Literal", + "type": "Literal", + "value": 0.19458425399338064 + } + ], + "end": 61947, + "start": 61884, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 61950, + "start": 61949, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 61883, + "name": "line", + "start": 61879, + "type": "Identifier" + }, + "end": 61951, + "start": 61879, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 61981, + "raw": "0.5721251777404546", + "start": 61963, + "type": "Literal", + "type": "Literal", + "value": 0.5721251777404546 + }, + { + "end": 62001, + "raw": "0.2888584097921527", + "start": 61983, + "type": "Literal", + "type": "Literal", + "value": 0.2888584097921527 + } + ], + "end": 62002, + "start": 61962, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 62005, + "start": 62004, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 61961, + "name": "line", + "start": 61957, + "type": "Identifier" + }, + "end": 62006, + "start": 61957, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 62045, + "raw": "0.9580409549552311", + "start": 62027, + "type": "Literal", + "type": "Literal", + "value": 0.9580409549552311 + }, + "end": 62045, + "operator": "-", + "start": 62026, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 62074, + "raw": "0.02243818192078395", + "start": 62055, + "type": "Literal", + "type": "Literal", + "value": 0.02243818192078395 + }, + "end": 62074, + "operator": "-", + "start": 62054, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 62081, + "start": 62017, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 62084, + "start": 62083, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 62016, + "name": "line", + "start": 62012, + "type": "Identifier" + }, + "end": 62085, + "start": 62012, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 62123, + "raw": "0.3299184618602866", + "start": 62105, + "type": "Literal", + "type": "Literal", + "value": 0.3299184618602866 + }, + { + "argument": { + "end": 62151, + "raw": "0.8353726942369875", + "start": 62133, + "type": "Literal", + "type": "Literal", + "value": 0.8353726942369875 + }, + "end": 62151, + "operator": "-", + "start": 62132, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 62158, + "start": 62096, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 62161, + "start": 62160, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 62095, + "name": "line", + "start": 62091, + "type": "Identifier" + }, + "end": 62162, + "start": 62091, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 62200, + "raw": "0.7434639386755209", + "start": 62182, + "type": "Literal", + "type": "Literal", + "value": 0.7434639386755209 + }, + { + "argument": { + "end": 62228, + "raw": "0.7919648864138378", + "start": 62210, + "type": "Literal", + "type": "Literal", + "value": 0.7919648864138378 + }, + "end": 62228, + "operator": "-", + "start": 62209, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 62235, + "start": 62173, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 62238, + "start": 62237, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 62172, + "name": "line", + "start": 62168, + "type": "Identifier" + }, + "end": 62239, + "start": 62168, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 62269, + "raw": "0.9935751011164615", + "start": 62251, + "type": "Literal", + "type": "Literal", + "value": 0.9935751011164615 + }, + { + "end": 62289, + "raw": "0.9042566468497608", + "start": 62271, + "type": "Literal", + "type": "Literal", + "value": 0.9042566468497608 + } + ], + "end": 62290, + "start": 62250, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 62293, + "start": 62292, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 62249, + "name": "line", + "start": 62245, + "type": "Identifier" + }, + "end": 62294, + "start": 62245, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 62333, + "raw": "0.5035812884687294", + "start": 62315, + "type": "Literal", + "type": "Literal", + "value": 0.5035812884687294 + }, + "end": 62333, + "operator": "-", + "start": 62314, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 62360, + "raw": "0.5150967434989442", + "start": 62342, + "type": "Literal", + "type": "Literal", + "value": 0.5150967434989442 + } + ], + "end": 62367, + "start": 62305, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 62370, + "start": 62369, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 62304, + "name": "line", + "start": 62300, + "type": "Identifier" + }, + "end": 62371, + "start": 62300, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 62401, + "raw": "0.5526227215900215", + "start": 62383, + "type": "Literal", + "type": "Literal", + "value": 0.5526227215900215 + }, + { + "end": 62421, + "raw": "0.7612604137272441", + "start": 62403, + "type": "Literal", + "type": "Literal", + "value": 0.7612604137272441 + } + ], + "end": 62422, + "start": 62382, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 62425, + "start": 62424, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 62381, + "name": "line", + "start": 62377, + "type": "Identifier" + }, + "end": 62426, + "start": 62377, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 62464, + "raw": "0.8593271349126876", + "start": 62446, + "type": "Literal", + "type": "Literal", + "value": 0.8593271349126876 + }, + { + "end": 62492, + "raw": "0.08414894953725849", + "start": 62473, + "type": "Literal", + "type": "Literal", + "value": 0.08414894953725849 + } + ], + "end": 62499, + "start": 62437, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 62502, + "start": 62501, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 62436, + "name": "line", + "start": 62432, + "type": "Identifier" + }, + "end": 62503, + "start": 62432, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 62542, + "raw": "0.8181049219192864", + "start": 62524, + "type": "Literal", + "type": "Literal", + "value": 0.8181049219192864 + }, + "end": 62542, + "operator": "-", + "start": 62523, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 62569, + "raw": "0.903548131323352", + "start": 62552, + "type": "Literal", + "type": "Literal", + "value": 0.903548131323352 + }, + "end": 62569, + "operator": "-", + "start": 62551, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 62576, + "start": 62514, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 62579, + "start": 62578, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 62513, + "name": "line", + "start": 62509, + "type": "Identifier" + }, + "end": 62580, + "start": 62509, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 62618, + "raw": "0.3165782044458305", + "start": 62600, + "type": "Literal", + "type": "Literal", + "value": 0.3165782044458305 + }, + { + "argument": { + "end": 62647, + "raw": "0.24189274252014914", + "start": 62628, + "type": "Literal", + "type": "Literal", + "value": 0.24189274252014914 + }, + "end": 62647, + "operator": "-", + "start": 62627, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 62654, + "start": 62591, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 62657, + "start": 62656, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 62590, + "name": "line", + "start": 62586, + "type": "Identifier" + }, + "end": 62658, + "start": 62586, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 62698, + "raw": "0.44390956414045135", + "start": 62679, + "type": "Literal", + "type": "Literal", + "value": 0.44390956414045135 + }, + "end": 62698, + "operator": "-", + "start": 62678, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 62727, + "raw": "0.25912591535126905", + "start": 62708, + "type": "Literal", + "type": "Literal", + "value": 0.25912591535126905 + }, + "end": 62727, + "operator": "-", + "start": 62707, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 62734, + "start": 62669, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 62737, + "start": 62736, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 62668, + "name": "line", + "start": 62664, + "type": "Identifier" + }, + "end": 62738, + "start": 62664, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 62777, + "raw": "0.6605165911891009", + "start": 62759, + "type": "Literal", + "type": "Literal", + "value": 0.6605165911891009 + }, + "end": 62777, + "operator": "-", + "start": 62758, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 62806, + "raw": "0.40355115288839194", + "start": 62787, + "type": "Literal", + "type": "Literal", + "value": 0.40355115288839194 + }, + "end": 62806, + "operator": "-", + "start": 62786, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 62813, + "start": 62749, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 62816, + "start": 62815, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 62748, + "name": "line", + "start": 62744, + "type": "Identifier" + }, + "end": 62817, + "start": 62744, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 62856, + "raw": "0.7170489950180006", + "start": 62838, + "type": "Literal", + "type": "Literal", + "value": 0.7170489950180006 + }, + "end": 62856, + "operator": "-", + "start": 62837, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 62884, + "raw": "0.23454356079651384", + "start": 62865, + "type": "Literal", + "type": "Literal", + "value": 0.23454356079651384 + } + ], + "end": 62891, + "start": 62828, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 62894, + "start": 62893, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 62827, + "name": "line", + "start": 62823, + "type": "Identifier" + }, + "end": 62895, + "start": 62823, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 62934, + "raw": "0.2568187045379722", + "start": 62916, + "type": "Literal", + "type": "Literal", + "value": 0.2568187045379722 + }, + "end": 62934, + "operator": "-", + "start": 62915, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 62963, + "raw": "0.45031188717601367", + "start": 62944, + "type": "Literal", + "type": "Literal", + "value": 0.45031188717601367 + }, + "end": 62963, + "operator": "-", + "start": 62943, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 62970, + "start": 62906, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 62973, + "start": 62972, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 62905, + "name": "line", + "start": 62901, + "type": "Identifier" + }, + "end": 62974, + "start": 62901, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 63012, + "raw": "0.6751951211858687", + "start": 62994, + "type": "Literal", + "type": "Literal", + "value": 0.6751951211858687 + }, + { + "argument": { + "end": 63040, + "raw": "0.9709424233465593", + "start": 63022, + "type": "Literal", + "type": "Literal", + "value": 0.9709424233465593 + }, + "end": 63040, + "operator": "-", + "start": 63021, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 63047, + "start": 62985, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 63050, + "start": 63049, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 62984, + "name": "line", + "start": 62980, + "type": "Identifier" + }, + "end": 63051, + "start": 62980, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 63090, + "raw": "0.5689619842972184", + "start": 63072, + "type": "Literal", + "type": "Literal", + "value": 0.5689619842972184 + }, + "end": 63090, + "operator": "-", + "start": 63071, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 63117, + "raw": "0.5918969913790362", + "start": 63099, + "type": "Literal", + "type": "Literal", + "value": 0.5918969913790362 + } + ], + "end": 63124, + "start": 63062, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 63127, + "start": 63126, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 63061, + "name": "line", + "start": 63057, + "type": "Identifier" + }, + "end": 63128, + "start": 63057, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 63167, + "raw": "0.8328324229085962", + "start": 63149, + "type": "Literal", + "type": "Literal", + "value": 0.8328324229085962 + }, + "end": 63167, + "operator": "-", + "start": 63148, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 63194, + "raw": "0.4677492878818803", + "start": 63176, + "type": "Literal", + "type": "Literal", + "value": 0.4677492878818803 + } + ], + "end": 63201, + "start": 63139, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 63204, + "start": 63203, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 63138, + "name": "line", + "start": 63134, + "type": "Identifier" + }, + "end": 63205, + "start": 63134, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 63244, + "raw": "0.8111463382182231", + "start": 63226, + "type": "Literal", + "type": "Literal", + "value": 0.8111463382182231 + }, + "end": 63244, + "operator": "-", + "start": 63225, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 63273, + "raw": "0.41814807547140576", + "start": 63254, + "type": "Literal", + "type": "Literal", + "value": 0.41814807547140576 + }, + "end": 63273, + "operator": "-", + "start": 63253, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 63280, + "start": 63216, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 63283, + "start": 63282, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 63215, + "name": "line", + "start": 63211, + "type": "Identifier" + }, + "end": 63284, + "start": 63211, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 63323, + "raw": "0.03807684940941125", + "start": 63304, + "type": "Literal", + "type": "Literal", + "value": 0.03807684940941125 + }, + { + "end": 63351, + "raw": "0.25664826686353326", + "start": 63332, + "type": "Literal", + "type": "Literal", + "value": 0.25664826686353326 + } + ], + "end": 63358, + "start": 63295, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 63361, + "start": 63360, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 63294, + "name": "line", + "start": 63290, + "type": "Identifier" + }, + "end": 63362, + "start": 63290, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 63401, + "raw": "0.23950083339596384", + "start": 63382, + "type": "Literal", + "type": "Literal", + "value": 0.23950083339596384 + }, + { + "end": 63429, + "raw": "0.43693196301855575", + "start": 63410, + "type": "Literal", + "type": "Literal", + "value": 0.43693196301855575 + } + ], + "end": 63436, + "start": 63373, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 63439, + "start": 63438, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 63372, + "name": "line", + "start": 63368, + "type": "Identifier" + }, + "end": 63440, + "start": 63368, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 63480, + "raw": "0.16279444820904887", + "start": 63461, + "type": "Literal", + "type": "Literal", + "value": 0.16279444820904887 + }, + "end": 63480, + "operator": "-", + "start": 63460, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 63507, + "raw": "0.8064475707664818", + "start": 63489, + "type": "Literal", + "type": "Literal", + "value": 0.8064475707664818 + } + ], + "end": 63514, + "start": 63451, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 63517, + "start": 63516, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 63450, + "name": "line", + "start": 63446, + "type": "Identifier" + }, + "end": 63518, + "start": 63446, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 63558, + "raw": "0.08972872009232558", + "start": 63539, + "type": "Literal", + "type": "Literal", + "value": 0.08972872009232558 + }, + "end": 63558, + "operator": "-", + "start": 63538, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 63587, + "raw": "0.08887625823751266", + "start": 63568, + "type": "Literal", + "type": "Literal", + "value": 0.08887625823751266 + }, + "end": 63587, + "operator": "-", + "start": 63567, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 63594, + "start": 63529, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 63597, + "start": 63596, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 63528, + "name": "line", + "start": 63524, + "type": "Identifier" + }, + "end": 63598, + "start": 63524, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 63636, + "raw": "0.9203433427102556", + "start": 63618, + "type": "Literal", + "type": "Literal", + "value": 0.9203433427102556 + }, + { + "argument": { + "end": 63665, + "raw": "0.17343459369697545", + "start": 63646, + "type": "Literal", + "type": "Literal", + "value": 0.17343459369697545 + }, + "end": 63665, + "operator": "-", + "start": 63645, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 63672, + "start": 63609, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 63675, + "start": 63674, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 63608, + "name": "line", + "start": 63604, + "type": "Identifier" + }, + "end": 63676, + "start": 63604, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 63717, + "raw": "0.0017496234414517975", + "start": 63696, + "type": "Literal", + "type": "Literal", + "value": 0.0017496234414517975 + }, + { + "argument": { + "end": 63745, + "raw": "0.5178508316168335", + "start": 63727, + "type": "Literal", + "type": "Literal", + "value": 0.5178508316168335 + }, + "end": 63745, + "operator": "-", + "start": 63726, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 63752, + "start": 63687, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 63755, + "start": 63754, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 63686, + "name": "line", + "start": 63682, + "type": "Identifier" + }, + "end": 63756, + "start": 63682, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 63794, + "raw": "0.6206263405732759", + "start": 63776, + "type": "Literal", + "type": "Literal", + "value": 0.6206263405732759 + }, + { + "argument": { + "end": 63822, + "raw": "0.8733399468665124", + "start": 63804, + "type": "Literal", + "type": "Literal", + "value": 0.8733399468665124 + }, + "end": 63822, + "operator": "-", + "start": 63803, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 63829, + "start": 63767, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 63832, + "start": 63831, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 63766, + "name": "line", + "start": 63762, + "type": "Identifier" + }, + "end": 63833, + "start": 63762, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 63872, + "raw": "0.7776386664456383", + "start": 63854, + "type": "Literal", + "type": "Literal", + "value": 0.7776386664456383 + }, + "end": 63872, + "operator": "-", + "start": 63853, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 63899, + "raw": "0.7602780485384968", + "start": 63881, + "type": "Literal", + "type": "Literal", + "value": 0.7602780485384968 + } + ], + "end": 63906, + "start": 63844, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 63909, + "start": 63908, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 63843, + "name": "line", + "start": 63839, + "type": "Identifier" + }, + "end": 63910, + "start": 63839, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 63940, + "raw": "0.5439379760788592", + "start": 63922, + "type": "Literal", + "type": "Literal", + "value": 0.5439379760788592 + }, + { + "end": 63960, + "raw": "0.8449177589350552", + "start": 63942, + "type": "Literal", + "type": "Literal", + "value": 0.8449177589350552 + } + ], + "end": 63961, + "start": 63921, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 63964, + "start": 63963, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 63920, + "name": "line", + "start": 63916, + "type": "Identifier" + }, + "end": 63965, + "start": 63916, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 64005, + "raw": "0.13036646025917076", + "start": 63986, + "type": "Literal", + "type": "Literal", + "value": 0.13036646025917076 + }, + "end": 64005, + "operator": "-", + "start": 63985, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 64034, + "raw": "0.012051713627069693", + "start": 64014, + "type": "Literal", + "type": "Literal", + "value": 0.012051713627069693 + } + ], + "end": 64041, + "start": 63976, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 64044, + "start": 64043, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 63975, + "name": "line", + "start": 63971, + "type": "Identifier" + }, + "end": 64045, + "start": 63971, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 64084, + "raw": "0.1656465612645519", + "start": 64066, + "type": "Literal", + "type": "Literal", + "value": 0.1656465612645519 + }, + "end": 64084, + "operator": "-", + "start": 64065, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 64113, + "raw": "0.20775229173765486", + "start": 64094, + "type": "Literal", + "type": "Literal", + "value": 0.20775229173765486 + }, + "end": 64113, + "operator": "-", + "start": 64093, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 64120, + "start": 64056, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 64123, + "start": 64122, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 64055, + "name": "line", + "start": 64051, + "type": "Identifier" + }, + "end": 64124, + "start": 64051, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 64163, + "raw": "0.0962723255929061", + "start": 64145, + "type": "Literal", + "type": "Literal", + "value": 0.0962723255929061 + }, + "end": 64163, + "operator": "-", + "start": 64144, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 64192, + "raw": "0.05417797659066137", + "start": 64173, + "type": "Literal", + "type": "Literal", + "value": 0.05417797659066137 + }, + "end": 64192, + "operator": "-", + "start": 64172, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 64199, + "start": 64135, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 64202, + "start": 64201, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 64134, + "name": "line", + "start": 64130, + "type": "Identifier" + }, + "end": 64203, + "start": 64130, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 64232, + "raw": "0.902108945498191", + "start": 64215, + "type": "Literal", + "type": "Literal", + "value": 0.902108945498191 + }, + { + "end": 64252, + "raw": "0.3958978534964961", + "start": 64234, + "type": "Literal", + "type": "Literal", + "value": 0.3958978534964961 + } + ], + "end": 64253, + "start": 64214, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 64256, + "start": 64255, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 64213, + "name": "line", + "start": 64209, + "type": "Identifier" + }, + "end": 64257, + "start": 64209, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 64296, + "raw": "0.27997950083139167", + "start": 64277, + "type": "Literal", + "type": "Literal", + "value": 0.27997950083139167 + }, + { + "argument": { + "end": 64325, + "raw": "0.17778188444008958", + "start": 64306, + "type": "Literal", + "type": "Literal", + "value": 0.17778188444008958 + }, + "end": 64325, + "operator": "-", + "start": 64305, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 64332, + "start": 64268, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 64335, + "start": 64334, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 64267, + "name": "line", + "start": 64263, + "type": "Identifier" + }, + "end": 64336, + "start": 64263, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 64366, + "raw": "0.5235806061589545", + "start": 64348, + "type": "Literal", + "type": "Literal", + "value": 0.5235806061589545 + }, + { + "end": 64385, + "raw": "0.694318985642328", + "start": 64368, + "type": "Literal", + "type": "Literal", + "value": 0.694318985642328 + } + ], + "end": 64386, + "start": 64347, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 64389, + "start": 64388, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 64346, + "name": "line", + "start": 64342, + "type": "Identifier" + }, + "end": 64390, + "start": 64342, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 64429, + "raw": "0.39140760219992154", + "start": 64410, + "type": "Literal", + "type": "Literal", + "value": 0.39140760219992154 + }, + { + "argument": { + "end": 64457, + "raw": "0.7839795272576484", + "start": 64439, + "type": "Literal", + "type": "Literal", + "value": 0.7839795272576484 + }, + "end": 64457, + "operator": "-", + "start": 64438, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 64464, + "start": 64401, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 64467, + "start": 64466, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 64400, + "name": "line", + "start": 64396, + "type": "Identifier" + }, + "end": 64468, + "start": 64396, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 64498, + "raw": "0.8414243527073519", + "start": 64480, + "type": "Literal", + "type": "Literal", + "value": 0.8414243527073519 + }, + { + "end": 64518, + "raw": "0.5395591528940082", + "start": 64500, + "type": "Literal", + "type": "Literal", + "value": 0.5395591528940082 + } + ], + "end": 64519, + "start": 64479, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 64522, + "start": 64521, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 64478, + "name": "line", + "start": 64474, + "type": "Identifier" + }, + "end": 64523, + "start": 64474, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 64561, + "raw": "0.6137667704875602", + "start": 64543, + "type": "Literal", + "type": "Literal", + "value": 0.6137667704875602 + }, + { + "end": 64589, + "raw": "0.22119647516722085", + "start": 64570, + "type": "Literal", + "type": "Literal", + "value": 0.22119647516722085 + } + ], + "end": 64596, + "start": 64534, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 64599, + "start": 64598, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 64533, + "name": "line", + "start": 64529, + "type": "Identifier" + }, + "end": 64600, + "start": 64529, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 64630, + "raw": "0.8830488380766681", + "start": 64612, + "type": "Literal", + "type": "Literal", + "value": 0.8830488380766681 + }, + { + "end": 64650, + "raw": "0.6996724408425232", + "start": 64632, + "type": "Literal", + "type": "Literal", + "value": 0.6996724408425232 + } + ], + "end": 64651, + "start": 64611, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 64654, + "start": 64653, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 64610, + "name": "line", + "start": 64606, + "type": "Identifier" + }, + "end": 64655, + "start": 64606, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 64694, + "raw": "0.3670208139314082", + "start": 64676, + "type": "Literal", + "type": "Literal", + "value": 0.3670208139314082 + }, + "end": 64694, + "operator": "-", + "start": 64675, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 64722, + "raw": "0.21201331909674526", + "start": 64703, + "type": "Literal", + "type": "Literal", + "value": 0.21201331909674526 + } + ], + "end": 64729, + "start": 64666, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 64732, + "start": 64731, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 64665, + "name": "line", + "start": 64661, + "type": "Identifier" + }, + "end": 64733, + "start": 64661, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 64772, + "raw": "0.4707511307971115", + "start": 64754, + "type": "Literal", + "type": "Literal", + "value": 0.4707511307971115 + }, + "end": 64772, + "operator": "-", + "start": 64753, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 64799, + "raw": "0.4905279615419764", + "start": 64781, + "type": "Literal", + "type": "Literal", + "value": 0.4905279615419764 + } + ], + "end": 64806, + "start": 64744, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 64809, + "start": 64808, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 64743, + "name": "line", + "start": 64739, + "type": "Identifier" + }, + "end": 64810, + "start": 64739, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 64849, + "raw": "0.8328324229085962", + "start": 64831, + "type": "Literal", + "type": "Literal", + "value": 0.8328324229085962 + }, + "end": 64849, + "operator": "-", + "start": 64830, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 64876, + "raw": "0.4677492878818803", + "start": 64858, + "type": "Literal", + "type": "Literal", + "value": 0.4677492878818803 + } + ], + "end": 64883, + "start": 64821, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 64886, + "start": 64885, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 64820, + "name": "line", + "start": 64816, + "type": "Identifier" + }, + "end": 64887, + "start": 64816, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 64926, + "raw": "0.8111463382182231", + "start": 64908, + "type": "Literal", + "type": "Literal", + "value": 0.8111463382182231 + }, + "end": 64926, + "operator": "-", + "start": 64907, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 64955, + "raw": "0.41814807547140576", + "start": 64936, + "type": "Literal", + "type": "Literal", + "value": 0.41814807547140576 + }, + "end": 64955, + "operator": "-", + "start": 64935, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 64962, + "start": 64898, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 64965, + "start": 64964, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 64897, + "name": "line", + "start": 64893, + "type": "Identifier" + }, + "end": 64966, + "start": 64893, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 65005, + "raw": "0.03807684940941125", + "start": 64986, + "type": "Literal", + "type": "Literal", + "value": 0.03807684940941125 + }, + { + "end": 65033, + "raw": "0.25664826686353326", + "start": 65014, + "type": "Literal", + "type": "Literal", + "value": 0.25664826686353326 + } + ], + "end": 65040, + "start": 64977, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 65043, + "start": 65042, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 64976, + "name": "line", + "start": 64972, + "type": "Identifier" + }, + "end": 65044, + "start": 64972, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 65083, + "raw": "0.23950083339596384", + "start": 65064, + "type": "Literal", + "type": "Literal", + "value": 0.23950083339596384 + }, + { + "end": 65111, + "raw": "0.43693196301855575", + "start": 65092, + "type": "Literal", + "type": "Literal", + "value": 0.43693196301855575 + } + ], + "end": 65118, + "start": 65055, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 65121, + "start": 65120, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 65054, + "name": "line", + "start": 65050, + "type": "Identifier" + }, + "end": 65122, + "start": 65050, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 65162, + "raw": "0.16279444820904887", + "start": 65143, + "type": "Literal", + "type": "Literal", + "value": 0.16279444820904887 + }, + "end": 65162, + "operator": "-", + "start": 65142, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 65189, + "raw": "0.8064475707664818", + "start": 65171, + "type": "Literal", + "type": "Literal", + "value": 0.8064475707664818 + } + ], + "end": 65196, + "start": 65133, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 65199, + "start": 65198, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 65132, + "name": "line", + "start": 65128, + "type": "Identifier" + }, + "end": 65200, + "start": 65128, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 65240, + "raw": "0.08972872009232558", + "start": 65221, + "type": "Literal", + "type": "Literal", + "value": 0.08972872009232558 + }, + "end": 65240, + "operator": "-", + "start": 65220, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 65269, + "raw": "0.08887625823751266", + "start": 65250, + "type": "Literal", + "type": "Literal", + "value": 0.08887625823751266 + }, + "end": 65269, + "operator": "-", + "start": 65249, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 65276, + "start": 65211, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 65279, + "start": 65278, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 65210, + "name": "line", + "start": 65206, + "type": "Identifier" + }, + "end": 65280, + "start": 65206, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 65318, + "raw": "0.9203433427102556", + "start": 65300, + "type": "Literal", + "type": "Literal", + "value": 0.9203433427102556 + }, + { + "argument": { + "end": 65347, + "raw": "0.17343459369697545", + "start": 65328, + "type": "Literal", + "type": "Literal", + "value": 0.17343459369697545 + }, + "end": 65347, + "operator": "-", + "start": 65327, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 65354, + "start": 65291, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 65357, + "start": 65356, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 65290, + "name": "line", + "start": 65286, + "type": "Identifier" + }, + "end": 65358, + "start": 65286, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 65399, + "raw": "0.0017496234414517975", + "start": 65378, + "type": "Literal", + "type": "Literal", + "value": 0.0017496234414517975 + }, + { + "argument": { + "end": 65427, + "raw": "0.5178508316168335", + "start": 65409, + "type": "Literal", + "type": "Literal", + "value": 0.5178508316168335 + }, + "end": 65427, + "operator": "-", + "start": 65408, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 65434, + "start": 65369, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 65437, + "start": 65436, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 65368, + "name": "line", + "start": 65364, + "type": "Identifier" + }, + "end": 65438, + "start": 65364, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 65476, + "raw": "0.6206263405732759", + "start": 65458, + "type": "Literal", + "type": "Literal", + "value": 0.6206263405732759 + }, + { + "argument": { + "end": 65504, + "raw": "0.8733399468665124", + "start": 65486, + "type": "Literal", + "type": "Literal", + "value": 0.8733399468665124 + }, + "end": 65504, + "operator": "-", + "start": 65485, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 65511, + "start": 65449, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 65514, + "start": 65513, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 65448, + "name": "line", + "start": 65444, + "type": "Identifier" + }, + "end": 65515, + "start": 65444, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 65554, + "raw": "0.7776386664456383", + "start": 65536, + "type": "Literal", + "type": "Literal", + "value": 0.7776386664456383 + }, + "end": 65554, + "operator": "-", + "start": 65535, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 65581, + "raw": "0.7602780485384968", + "start": 65563, + "type": "Literal", + "type": "Literal", + "value": 0.7602780485384968 + } + ], + "end": 65588, + "start": 65526, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 65591, + "start": 65590, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 65525, + "name": "line", + "start": 65521, + "type": "Identifier" + }, + "end": 65592, + "start": 65521, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 65622, + "raw": "0.5439379760788592", + "start": 65604, + "type": "Literal", + "type": "Literal", + "value": 0.5439379760788592 + }, + { + "end": 65642, + "raw": "0.8449177589350552", + "start": 65624, + "type": "Literal", + "type": "Literal", + "value": 0.8449177589350552 + } + ], + "end": 65643, + "start": 65603, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 65646, + "start": 65645, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 65602, + "name": "line", + "start": 65598, + "type": "Identifier" + }, + "end": 65647, + "start": 65598, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 65687, + "raw": "0.13036646025917076", + "start": 65668, + "type": "Literal", + "type": "Literal", + "value": 0.13036646025917076 + }, + "end": 65687, + "operator": "-", + "start": 65667, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 65716, + "raw": "0.012051713627069693", + "start": 65696, + "type": "Literal", + "type": "Literal", + "value": 0.012051713627069693 + } + ], + "end": 65723, + "start": 65658, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 65726, + "start": 65725, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 65657, + "name": "line", + "start": 65653, + "type": "Identifier" + }, + "end": 65727, + "start": 65653, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 65766, + "raw": "0.1656465612645519", + "start": 65748, + "type": "Literal", + "type": "Literal", + "value": 0.1656465612645519 + }, + "end": 65766, + "operator": "-", + "start": 65747, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 65795, + "raw": "0.20775229173765486", + "start": 65776, + "type": "Literal", + "type": "Literal", + "value": 0.20775229173765486 + }, + "end": 65795, + "operator": "-", + "start": 65775, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 65802, + "start": 65738, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 65805, + "start": 65804, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 65737, + "name": "line", + "start": 65733, + "type": "Identifier" + }, + "end": 65806, + "start": 65733, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 65845, + "raw": "0.0962723255929061", + "start": 65827, + "type": "Literal", + "type": "Literal", + "value": 0.0962723255929061 + }, + "end": 65845, + "operator": "-", + "start": 65826, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 65874, + "raw": "0.05417797659066137", + "start": 65855, + "type": "Literal", + "type": "Literal", + "value": 0.05417797659066137 + }, + "end": 65874, + "operator": "-", + "start": 65854, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 65881, + "start": 65817, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 65884, + "start": 65883, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 65816, + "name": "line", + "start": 65812, + "type": "Identifier" + }, + "end": 65885, + "start": 65812, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 65914, + "raw": "0.902108945498191", + "start": 65897, + "type": "Literal", + "type": "Literal", + "value": 0.902108945498191 + }, + { + "end": 65934, + "raw": "0.3958978534964961", + "start": 65916, + "type": "Literal", + "type": "Literal", + "value": 0.3958978534964961 + } + ], + "end": 65935, + "start": 65896, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 65938, + "start": 65937, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 65895, + "name": "line", + "start": 65891, + "type": "Identifier" + }, + "end": 65939, + "start": 65891, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 65978, + "raw": "0.27997950083139167", + "start": 65959, + "type": "Literal", + "type": "Literal", + "value": 0.27997950083139167 + }, + { + "argument": { + "end": 66007, + "raw": "0.17778188444008958", + "start": 65988, + "type": "Literal", + "type": "Literal", + "value": 0.17778188444008958 + }, + "end": 66007, + "operator": "-", + "start": 65987, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 66014, + "start": 65950, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 66017, + "start": 66016, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 65949, + "name": "line", + "start": 65945, + "type": "Identifier" + }, + "end": 66018, + "start": 65945, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 66048, + "raw": "0.5235806061589545", + "start": 66030, + "type": "Literal", + "type": "Literal", + "value": 0.5235806061589545 + }, + { + "end": 66067, + "raw": "0.694318985642328", + "start": 66050, + "type": "Literal", + "type": "Literal", + "value": 0.694318985642328 + } + ], + "end": 66068, + "start": 66029, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 66071, + "start": 66070, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 66028, + "name": "line", + "start": 66024, + "type": "Identifier" + }, + "end": 66072, + "start": 66024, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 66111, + "raw": "0.39140760219992154", + "start": 66092, + "type": "Literal", + "type": "Literal", + "value": 0.39140760219992154 + }, + { + "argument": { + "end": 66139, + "raw": "0.7839795272576484", + "start": 66121, + "type": "Literal", + "type": "Literal", + "value": 0.7839795272576484 + }, + "end": 66139, + "operator": "-", + "start": 66120, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 66146, + "start": 66083, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 66149, + "start": 66148, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 66082, + "name": "line", + "start": 66078, + "type": "Identifier" + }, + "end": 66150, + "start": 66078, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 66180, + "raw": "0.8414243527073519", + "start": 66162, + "type": "Literal", + "type": "Literal", + "value": 0.8414243527073519 + }, + { + "end": 66200, + "raw": "0.5395591528940082", + "start": 66182, + "type": "Literal", + "type": "Literal", + "value": 0.5395591528940082 + } + ], + "end": 66201, + "start": 66161, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 66204, + "start": 66203, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 66160, + "name": "line", + "start": 66156, + "type": "Identifier" + }, + "end": 66205, + "start": 66156, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 66243, + "raw": "0.6137667704875602", + "start": 66225, + "type": "Literal", + "type": "Literal", + "value": 0.6137667704875602 + }, + { + "end": 66271, + "raw": "0.22119647516722085", + "start": 66252, + "type": "Literal", + "type": "Literal", + "value": 0.22119647516722085 + } + ], + "end": 66278, + "start": 66216, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 66281, + "start": 66280, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 66215, + "name": "line", + "start": 66211, + "type": "Identifier" + }, + "end": 66282, + "start": 66211, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 66312, + "raw": "0.8830488380766681", + "start": 66294, + "type": "Literal", + "type": "Literal", + "value": 0.8830488380766681 + }, + { + "end": 66332, + "raw": "0.6996724408425232", + "start": 66314, + "type": "Literal", + "type": "Literal", + "value": 0.6996724408425232 + } + ], + "end": 66333, + "start": 66293, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 66336, + "start": 66335, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 66292, + "name": "line", + "start": 66288, + "type": "Identifier" + }, + "end": 66337, + "start": 66288, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 66377, + "raw": "0.41290485754343953", + "start": 66358, + "type": "Literal", + "type": "Literal", + "value": 0.41290485754343953 + }, + "end": 66377, + "operator": "-", + "start": 66357, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 66405, + "raw": "0.4152647361760933", + "start": 66387, + "type": "Literal", + "type": "Literal", + "value": 0.4152647361760933 + }, + "end": 66405, + "operator": "-", + "start": 66386, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 66412, + "start": 66348, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 66415, + "start": 66414, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 66347, + "name": "line", + "start": 66343, + "type": "Identifier" + }, + "end": 66416, + "start": 66343, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 66454, + "raw": "0.5169538755575687", + "start": 66436, + "type": "Literal", + "type": "Literal", + "value": 0.5169538755575687 + }, + { + "argument": { + "end": 66482, + "raw": "0.9085567867302617", + "start": 66464, + "type": "Literal", + "type": "Literal", + "value": 0.9085567867302617 + }, + "end": 66482, + "operator": "-", + "start": 66463, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 66489, + "start": 66427, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 66492, + "start": 66491, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 66426, + "name": "line", + "start": 66422, + "type": "Identifier" + }, + "end": 66493, + "start": 66422, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 66532, + "raw": "0.6716353749059765", + "start": 66514, + "type": "Literal", + "type": "Literal", + "value": 0.6716353749059765 + }, + "end": 66532, + "operator": "-", + "start": 66513, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 66560, + "raw": "0.9605576808879026", + "start": 66542, + "type": "Literal", + "type": "Literal", + "value": 0.9605576808879026 + }, + "end": 66560, + "operator": "-", + "start": 66541, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 66567, + "start": 66504, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 66570, + "start": 66569, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 66503, + "name": "line", + "start": 66499, + "type": "Identifier" + }, + "end": 66571, + "start": 66499, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 66611, + "raw": "0.010280170930300203", + "start": 66591, + "type": "Literal", + "type": "Literal", + "value": 0.010280170930300203 + }, + { + "argument": { + "end": 66640, + "raw": "0.37344123662342166", + "start": 66621, + "type": "Literal", + "type": "Literal", + "value": 0.37344123662342166 + }, + "end": 66640, + "operator": "-", + "start": 66620, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 66647, + "start": 66582, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 66650, + "start": 66649, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 66581, + "name": "line", + "start": 66577, + "type": "Identifier" + }, + "end": 66651, + "start": 66577, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 66690, + "raw": "0.10357375682791004", + "start": 66671, + "type": "Literal", + "type": "Literal", + "value": 0.10357375682791004 + }, + { + "argument": { + "end": 66719, + "raw": "0.42294321030821425", + "start": 66700, + "type": "Literal", + "type": "Literal", + "value": 0.42294321030821425 + }, + "end": 66719, + "operator": "-", + "start": 66699, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 66726, + "start": 66662, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 66729, + "start": 66728, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 66661, + "name": "line", + "start": 66657, + "type": "Identifier" + }, + "end": 66730, + "start": 66657, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 66768, + "raw": "0.4520311575096987", + "start": 66750, + "type": "Literal", + "type": "Literal", + "value": 0.4520311575096987 + }, + { + "argument": { + "end": 66797, + "raw": "0.11232675307600548", + "start": 66778, + "type": "Literal", + "type": "Literal", + "value": 0.11232675307600548 + }, + "end": 66797, + "operator": "-", + "start": 66777, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 66804, + "start": 66741, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 66807, + "start": 66806, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 66740, + "name": "line", + "start": 66736, + "type": "Identifier" + }, + "end": 66808, + "start": 66736, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 66847, + "raw": "0.8821185914380845", + "start": 66829, + "type": "Literal", + "type": "Literal", + "value": 0.8821185914380845 + }, + "end": 66847, + "operator": "-", + "start": 66828, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 66875, + "raw": "0.7155147434939819", + "start": 66857, + "type": "Literal", + "type": "Literal", + "value": 0.7155147434939819 + }, + "end": 66875, + "operator": "-", + "start": 66856, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 66882, + "start": 66819, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 66885, + "start": 66884, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 66818, + "name": "line", + "start": 66814, + "type": "Identifier" + }, + "end": 66886, + "start": 66814, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 66916, + "raw": "0.9195487101690416", + "start": 66898, + "type": "Literal", + "type": "Literal", + "value": 0.9195487101690416 + }, + { + "end": 66936, + "raw": "0.2691627465297364", + "start": 66918, + "type": "Literal", + "type": "Literal", + "value": 0.2691627465297364 + } + ], + "end": 66937, + "start": 66897, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 66940, + "start": 66939, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 66896, + "name": "line", + "start": 66892, + "type": "Identifier" + }, + "end": 66941, + "start": 66892, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 66979, + "raw": "0.7098978191546745", + "start": 66961, + "type": "Literal", + "type": "Literal", + "value": 0.7098978191546745 + }, + { + "end": 67007, + "raw": "0.11710004169385968", + "start": 66988, + "type": "Literal", + "type": "Literal", + "value": 0.11710004169385968 + } + ], + "end": 67014, + "start": 66952, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 67017, + "start": 67016, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 66951, + "name": "line", + "start": 66947, + "type": "Identifier" + }, + "end": 67018, + "start": 66947, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 67058, + "raw": "0.37876368560819995", + "start": 67039, + "type": "Literal", + "type": "Literal", + "value": 0.37876368560819995 + }, + "end": 67058, + "operator": "-", + "start": 67038, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 67085, + "raw": "0.7106729314759084", + "start": 67067, + "type": "Literal", + "type": "Literal", + "value": 0.7106729314759084 + } + ], + "end": 67092, + "start": 67029, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 67095, + "start": 67094, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 67028, + "name": "line", + "start": 67024, + "type": "Identifier" + }, + "end": 67096, + "start": 67024, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 67136, + "raw": "0.29728126898353335", + "start": 67117, + "type": "Literal", + "type": "Literal", + "value": 0.29728126898353335 + }, + "end": 67136, + "operator": "-", + "start": 67116, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 67165, + "raw": "0.06649734568328003", + "start": 67146, + "type": "Literal", + "type": "Literal", + "value": 0.06649734568328003 + }, + "end": 67165, + "operator": "-", + "start": 67145, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 67172, + "start": 67107, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 67175, + "start": 67174, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 67106, + "name": "line", + "start": 67102, + "type": "Identifier" + }, + "end": 67176, + "start": 67102, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 67215, + "raw": "0.22965781558352072", + "start": 67196, + "type": "Literal", + "type": "Literal", + "value": 0.22965781558352072 + }, + { + "argument": { + "end": 67243, + "raw": "0.7601866432836641", + "start": 67225, + "type": "Literal", + "type": "Literal", + "value": 0.7601866432836641 + }, + "end": 67243, + "operator": "-", + "start": 67224, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 67250, + "start": 67187, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 67253, + "start": 67252, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 67186, + "name": "line", + "start": 67182, + "type": "Identifier" + }, + "end": 67254, + "start": 67182, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 67293, + "raw": "0.6356501074317229", + "start": 67275, + "type": "Literal", + "type": "Literal", + "value": 0.6356501074317229 + }, + "end": 67293, + "operator": "-", + "start": 67274, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 67321, + "raw": "0.19458425399338064", + "start": 67302, + "type": "Literal", + "type": "Literal", + "value": 0.19458425399338064 + } + ], + "end": 67328, + "start": 67265, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 67331, + "start": 67330, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 67264, + "name": "line", + "start": 67260, + "type": "Identifier" + }, + "end": 67332, + "start": 67260, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 67362, + "raw": "0.5721251777404546", + "start": 67344, + "type": "Literal", + "type": "Literal", + "value": 0.5721251777404546 + }, + { + "end": 67382, + "raw": "0.2888584097921527", + "start": 67364, + "type": "Literal", + "type": "Literal", + "value": 0.2888584097921527 + } + ], + "end": 67383, + "start": 67343, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 67386, + "start": 67385, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 67342, + "name": "line", + "start": 67338, + "type": "Identifier" + }, + "end": 67387, + "start": 67338, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 67426, + "raw": "0.9580409549552311", + "start": 67408, + "type": "Literal", + "type": "Literal", + "value": 0.9580409549552311 + }, + "end": 67426, + "operator": "-", + "start": 67407, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 67455, + "raw": "0.02243818192078395", + "start": 67436, + "type": "Literal", + "type": "Literal", + "value": 0.02243818192078395 + }, + "end": 67455, + "operator": "-", + "start": 67435, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 67462, + "start": 67398, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 67465, + "start": 67464, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 67397, + "name": "line", + "start": 67393, + "type": "Identifier" + }, + "end": 67466, + "start": 67393, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 67504, + "raw": "0.3299184618602866", + "start": 67486, + "type": "Literal", + "type": "Literal", + "value": 0.3299184618602866 + }, + { + "argument": { + "end": 67532, + "raw": "0.8353726942369875", + "start": 67514, + "type": "Literal", + "type": "Literal", + "value": 0.8353726942369875 + }, + "end": 67532, + "operator": "-", + "start": 67513, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 67539, + "start": 67477, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 67542, + "start": 67541, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 67476, + "name": "line", + "start": 67472, + "type": "Identifier" + }, + "end": 67543, + "start": 67472, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 67581, + "raw": "0.7434639386755209", + "start": 67563, + "type": "Literal", + "type": "Literal", + "value": 0.7434639386755209 + }, + { + "argument": { + "end": 67609, + "raw": "0.7919648864138378", + "start": 67591, + "type": "Literal", + "type": "Literal", + "value": 0.7919648864138378 + }, + "end": 67609, + "operator": "-", + "start": 67590, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 67616, + "start": 67554, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 67619, + "start": 67618, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 67553, + "name": "line", + "start": 67549, + "type": "Identifier" + }, + "end": 67620, + "start": 67549, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 67650, + "raw": "0.9935751011164615", + "start": 67632, + "type": "Literal", + "type": "Literal", + "value": 0.9935751011164615 + }, + { + "end": 67670, + "raw": "0.9042566468497608", + "start": 67652, + "type": "Literal", + "type": "Literal", + "value": 0.9042566468497608 + } + ], + "end": 67671, + "start": 67631, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 67674, + "start": 67673, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 67630, + "name": "line", + "start": 67626, + "type": "Identifier" + }, + "end": 67675, + "start": 67626, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 67714, + "raw": "0.5035812884687294", + "start": 67696, + "type": "Literal", + "type": "Literal", + "value": 0.5035812884687294 + }, + "end": 67714, + "operator": "-", + "start": 67695, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 67741, + "raw": "0.5150967434989442", + "start": 67723, + "type": "Literal", + "type": "Literal", + "value": 0.5150967434989442 + } + ], + "end": 67748, + "start": 67686, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 67751, + "start": 67750, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 67685, + "name": "line", + "start": 67681, + "type": "Identifier" + }, + "end": 67752, + "start": 67681, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 67782, + "raw": "0.5526227215900215", + "start": 67764, + "type": "Literal", + "type": "Literal", + "value": 0.5526227215900215 + }, + { + "end": 67802, + "raw": "0.7612604137272441", + "start": 67784, + "type": "Literal", + "type": "Literal", + "value": 0.7612604137272441 + } + ], + "end": 67803, + "start": 67763, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 67806, + "start": 67805, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 67762, + "name": "line", + "start": 67758, + "type": "Identifier" + }, + "end": 67807, + "start": 67758, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 67845, + "raw": "0.8593271349126876", + "start": 67827, + "type": "Literal", + "type": "Literal", + "value": 0.8593271349126876 + }, + { + "end": 67873, + "raw": "0.08414894953725849", + "start": 67854, + "type": "Literal", + "type": "Literal", + "value": 0.08414894953725849 + } + ], + "end": 67880, + "start": 67818, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 67883, + "start": 67882, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 67817, + "name": "line", + "start": 67813, + "type": "Identifier" + }, + "end": 67884, + "start": 67813, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 67923, + "raw": "0.8181049219192864", + "start": 67905, + "type": "Literal", + "type": "Literal", + "value": 0.8181049219192864 + }, + "end": 67923, + "operator": "-", + "start": 67904, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 67950, + "raw": "0.903548131323352", + "start": 67933, + "type": "Literal", + "type": "Literal", + "value": 0.903548131323352 + }, + "end": 67950, + "operator": "-", + "start": 67932, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 67957, + "start": 67895, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 67960, + "start": 67959, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 67894, + "name": "line", + "start": 67890, + "type": "Identifier" + }, + "end": 67961, + "start": 67890, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 67999, + "raw": "0.3165782044458305", + "start": 67981, + "type": "Literal", + "type": "Literal", + "value": 0.3165782044458305 + }, + { + "argument": { + "end": 68028, + "raw": "0.24189274252014914", + "start": 68009, + "type": "Literal", + "type": "Literal", + "value": 0.24189274252014914 + }, + "end": 68028, + "operator": "-", + "start": 68008, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 68035, + "start": 67972, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 68038, + "start": 68037, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 67971, + "name": "line", + "start": 67967, + "type": "Identifier" + }, + "end": 68039, + "start": 67967, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 68079, + "raw": "0.44390956414045135", + "start": 68060, + "type": "Literal", + "type": "Literal", + "value": 0.44390956414045135 + }, + "end": 68079, + "operator": "-", + "start": 68059, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 68108, + "raw": "0.25912591535126905", + "start": 68089, + "type": "Literal", + "type": "Literal", + "value": 0.25912591535126905 + }, + "end": 68108, + "operator": "-", + "start": 68088, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 68115, + "start": 68050, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 68118, + "start": 68117, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 68049, + "name": "line", + "start": 68045, + "type": "Identifier" + }, + "end": 68119, + "start": 68045, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 68158, + "raw": "0.6605165911891009", + "start": 68140, + "type": "Literal", + "type": "Literal", + "value": 0.6605165911891009 + }, + "end": 68158, + "operator": "-", + "start": 68139, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 68187, + "raw": "0.40355115288839194", + "start": 68168, + "type": "Literal", + "type": "Literal", + "value": 0.40355115288839194 + }, + "end": 68187, + "operator": "-", + "start": 68167, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 68194, + "start": 68130, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 68197, + "start": 68196, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 68129, + "name": "line", + "start": 68125, + "type": "Identifier" + }, + "end": 68198, + "start": 68125, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 68237, + "raw": "0.7170489950180006", + "start": 68219, + "type": "Literal", + "type": "Literal", + "value": 0.7170489950180006 + }, + "end": 68237, + "operator": "-", + "start": 68218, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 68265, + "raw": "0.23454356079651384", + "start": 68246, + "type": "Literal", + "type": "Literal", + "value": 0.23454356079651384 + } + ], + "end": 68272, + "start": 68209, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 68275, + "start": 68274, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 68208, + "name": "line", + "start": 68204, + "type": "Identifier" + }, + "end": 68276, + "start": 68204, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 68315, + "raw": "0.2568187045379722", + "start": 68297, + "type": "Literal", + "type": "Literal", + "value": 0.2568187045379722 + }, + "end": 68315, + "operator": "-", + "start": 68296, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 68344, + "raw": "0.45031188717601367", + "start": 68325, + "type": "Literal", + "type": "Literal", + "value": 0.45031188717601367 + }, + "end": 68344, + "operator": "-", + "start": 68324, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 68351, + "start": 68287, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 68354, + "start": 68353, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 68286, + "name": "line", + "start": 68282, + "type": "Identifier" + }, + "end": 68355, + "start": 68282, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 68393, + "raw": "0.6751951211858687", + "start": 68375, + "type": "Literal", + "type": "Literal", + "value": 0.6751951211858687 + }, + { + "argument": { + "end": 68421, + "raw": "0.9709424233465593", + "start": 68403, + "type": "Literal", + "type": "Literal", + "value": 0.9709424233465593 + }, + "end": 68421, + "operator": "-", + "start": 68402, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 68428, + "start": 68366, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 68431, + "start": 68430, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 68365, + "name": "line", + "start": 68361, + "type": "Identifier" + }, + "end": 68432, + "start": 68361, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 68471, + "raw": "0.5689619842972184", + "start": 68453, + "type": "Literal", + "type": "Literal", + "value": 0.5689619842972184 + }, + "end": 68471, + "operator": "-", + "start": 68452, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 68498, + "raw": "0.5918969913790362", + "start": 68480, + "type": "Literal", + "type": "Literal", + "value": 0.5918969913790362 + } + ], + "end": 68505, + "start": 68443, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 68508, + "start": 68507, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 68442, + "name": "line", + "start": 68438, + "type": "Identifier" + }, + "end": 68509, + "start": 68438, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 68548, + "raw": "0.8328324229085962", + "start": 68530, + "type": "Literal", + "type": "Literal", + "value": 0.8328324229085962 + }, + "end": 68548, + "operator": "-", + "start": 68529, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 68575, + "raw": "0.4677492878818803", + "start": 68557, + "type": "Literal", + "type": "Literal", + "value": 0.4677492878818803 + } + ], + "end": 68582, + "start": 68520, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 68585, + "start": 68584, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 68519, + "name": "line", + "start": 68515, + "type": "Identifier" + }, + "end": 68586, + "start": 68515, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 68625, + "raw": "0.8111463382182231", + "start": 68607, + "type": "Literal", + "type": "Literal", + "value": 0.8111463382182231 + }, + "end": 68625, + "operator": "-", + "start": 68606, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 68654, + "raw": "0.41814807547140576", + "start": 68635, + "type": "Literal", + "type": "Literal", + "value": 0.41814807547140576 + }, + "end": 68654, + "operator": "-", + "start": 68634, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 68661, + "start": 68597, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 68664, + "start": 68663, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 68596, + "name": "line", + "start": 68592, + "type": "Identifier" + }, + "end": 68665, + "start": 68592, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 68704, + "raw": "0.03807684940941125", + "start": 68685, + "type": "Literal", + "type": "Literal", + "value": 0.03807684940941125 + }, + { + "end": 68732, + "raw": "0.25664826686353326", + "start": 68713, + "type": "Literal", + "type": "Literal", + "value": 0.25664826686353326 + } + ], + "end": 68739, + "start": 68676, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 68742, + "start": 68741, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 68675, + "name": "line", + "start": 68671, + "type": "Identifier" + }, + "end": 68743, + "start": 68671, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 68782, + "raw": "0.23950083339596384", + "start": 68763, + "type": "Literal", + "type": "Literal", + "value": 0.23950083339596384 + }, + { + "end": 68810, + "raw": "0.43693196301855575", + "start": 68791, + "type": "Literal", + "type": "Literal", + "value": 0.43693196301855575 + } + ], + "end": 68817, + "start": 68754, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 68820, + "start": 68819, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 68753, + "name": "line", + "start": 68749, + "type": "Identifier" + }, + "end": 68821, + "start": 68749, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 68861, + "raw": "0.16279444820904887", + "start": 68842, + "type": "Literal", + "type": "Literal", + "value": 0.16279444820904887 + }, + "end": 68861, + "operator": "-", + "start": 68841, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 68888, + "raw": "0.8064475707664818", + "start": 68870, + "type": "Literal", + "type": "Literal", + "value": 0.8064475707664818 + } + ], + "end": 68895, + "start": 68832, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 68898, + "start": 68897, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 68831, + "name": "line", + "start": 68827, + "type": "Identifier" + }, + "end": 68899, + "start": 68827, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 68939, + "raw": "0.08972872009232558", + "start": 68920, + "type": "Literal", + "type": "Literal", + "value": 0.08972872009232558 + }, + "end": 68939, + "operator": "-", + "start": 68919, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 68968, + "raw": "0.08887625823751266", + "start": 68949, + "type": "Literal", + "type": "Literal", + "value": 0.08887625823751266 + }, + "end": 68968, + "operator": "-", + "start": 68948, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 68975, + "start": 68910, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 68978, + "start": 68977, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 68909, + "name": "line", + "start": 68905, + "type": "Identifier" + }, + "end": 68979, + "start": 68905, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 69017, + "raw": "0.9203433427102556", + "start": 68999, + "type": "Literal", + "type": "Literal", + "value": 0.9203433427102556 + }, + { + "argument": { + "end": 69046, + "raw": "0.17343459369697545", + "start": 69027, + "type": "Literal", + "type": "Literal", + "value": 0.17343459369697545 + }, + "end": 69046, + "operator": "-", + "start": 69026, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 69053, + "start": 68990, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 69056, + "start": 69055, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 68989, + "name": "line", + "start": 68985, + "type": "Identifier" + }, + "end": 69057, + "start": 68985, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 69098, + "raw": "0.0017496234414517975", + "start": 69077, + "type": "Literal", + "type": "Literal", + "value": 0.0017496234414517975 + }, + { + "argument": { + "end": 69126, + "raw": "0.5178508316168335", + "start": 69108, + "type": "Literal", + "type": "Literal", + "value": 0.5178508316168335 + }, + "end": 69126, + "operator": "-", + "start": 69107, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 69133, + "start": 69068, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 69136, + "start": 69135, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 69067, + "name": "line", + "start": 69063, + "type": "Identifier" + }, + "end": 69137, + "start": 69063, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 69175, + "raw": "0.6206263405732759", + "start": 69157, + "type": "Literal", + "type": "Literal", + "value": 0.6206263405732759 + }, + { + "argument": { + "end": 69203, + "raw": "0.8733399468665124", + "start": 69185, + "type": "Literal", + "type": "Literal", + "value": 0.8733399468665124 + }, + "end": 69203, + "operator": "-", + "start": 69184, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 69210, + "start": 69148, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 69213, + "start": 69212, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 69147, + "name": "line", + "start": 69143, + "type": "Identifier" + }, + "end": 69214, + "start": 69143, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 69253, + "raw": "0.7776386664456383", + "start": 69235, + "type": "Literal", + "type": "Literal", + "value": 0.7776386664456383 + }, + "end": 69253, + "operator": "-", + "start": 69234, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 69280, + "raw": "0.7602780485384968", + "start": 69262, + "type": "Literal", + "type": "Literal", + "value": 0.7602780485384968 + } + ], + "end": 69287, + "start": 69225, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 69290, + "start": 69289, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 69224, + "name": "line", + "start": 69220, + "type": "Identifier" + }, + "end": 69291, + "start": 69220, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 69321, + "raw": "0.5439379760788592", + "start": 69303, + "type": "Literal", + "type": "Literal", + "value": 0.5439379760788592 + }, + { + "end": 69341, + "raw": "0.8449177589350552", + "start": 69323, + "type": "Literal", + "type": "Literal", + "value": 0.8449177589350552 + } + ], + "end": 69342, + "start": 69302, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 69345, + "start": 69344, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 69301, + "name": "line", + "start": 69297, + "type": "Identifier" + }, + "end": 69346, + "start": 69297, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 69386, + "raw": "0.13036646025917076", + "start": 69367, + "type": "Literal", + "type": "Literal", + "value": 0.13036646025917076 + }, + "end": 69386, + "operator": "-", + "start": 69366, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 69415, + "raw": "0.012051713627069693", + "start": 69395, + "type": "Literal", + "type": "Literal", + "value": 0.012051713627069693 + } + ], + "end": 69422, + "start": 69357, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 69425, + "start": 69424, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 69356, + "name": "line", + "start": 69352, + "type": "Identifier" + }, + "end": 69426, + "start": 69352, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 69465, + "raw": "0.1656465612645519", + "start": 69447, + "type": "Literal", + "type": "Literal", + "value": 0.1656465612645519 + }, + "end": 69465, + "operator": "-", + "start": 69446, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 69494, + "raw": "0.20775229173765486", + "start": 69475, + "type": "Literal", + "type": "Literal", + "value": 0.20775229173765486 + }, + "end": 69494, + "operator": "-", + "start": 69474, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 69501, + "start": 69437, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 69504, + "start": 69503, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 69436, + "name": "line", + "start": 69432, + "type": "Identifier" + }, + "end": 69505, + "start": 69432, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 69544, + "raw": "0.0962723255929061", + "start": 69526, + "type": "Literal", + "type": "Literal", + "value": 0.0962723255929061 + }, + "end": 69544, + "operator": "-", + "start": 69525, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 69573, + "raw": "0.05417797659066137", + "start": 69554, + "type": "Literal", + "type": "Literal", + "value": 0.05417797659066137 + }, + "end": 69573, + "operator": "-", + "start": 69553, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 69580, + "start": 69516, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 69583, + "start": 69582, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 69515, + "name": "line", + "start": 69511, + "type": "Identifier" + }, + "end": 69584, + "start": 69511, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 69613, + "raw": "0.902108945498191", + "start": 69596, + "type": "Literal", + "type": "Literal", + "value": 0.902108945498191 + }, + { + "end": 69633, + "raw": "0.3958978534964961", + "start": 69615, + "type": "Literal", + "type": "Literal", + "value": 0.3958978534964961 + } + ], + "end": 69634, + "start": 69595, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 69637, + "start": 69636, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 69594, + "name": "line", + "start": 69590, + "type": "Identifier" + }, + "end": 69638, + "start": 69590, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 69677, + "raw": "0.27997950083139167", + "start": 69658, + "type": "Literal", + "type": "Literal", + "value": 0.27997950083139167 + }, + { + "argument": { + "end": 69706, + "raw": "0.17778188444008958", + "start": 69687, + "type": "Literal", + "type": "Literal", + "value": 0.17778188444008958 + }, + "end": 69706, + "operator": "-", + "start": 69686, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 69713, + "start": 69649, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 69716, + "start": 69715, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 69648, + "name": "line", + "start": 69644, + "type": "Identifier" + }, + "end": 69717, + "start": 69644, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 69747, + "raw": "0.5235806061589545", + "start": 69729, + "type": "Literal", + "type": "Literal", + "value": 0.5235806061589545 + }, + { + "end": 69766, + "raw": "0.694318985642328", + "start": 69749, + "type": "Literal", + "type": "Literal", + "value": 0.694318985642328 + } + ], + "end": 69767, + "start": 69728, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 69770, + "start": 69769, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 69727, + "name": "line", + "start": 69723, + "type": "Identifier" + }, + "end": 69771, + "start": 69723, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 69810, + "raw": "0.39140760219992154", + "start": 69791, + "type": "Literal", + "type": "Literal", + "value": 0.39140760219992154 + }, + { + "argument": { + "end": 69838, + "raw": "0.7839795272576484", + "start": 69820, + "type": "Literal", + "type": "Literal", + "value": 0.7839795272576484 + }, + "end": 69838, + "operator": "-", + "start": 69819, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 69845, + "start": 69782, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 69848, + "start": 69847, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 69781, + "name": "line", + "start": 69777, + "type": "Identifier" + }, + "end": 69849, + "start": 69777, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 69879, + "raw": "0.8414243527073519", + "start": 69861, + "type": "Literal", + "type": "Literal", + "value": 0.8414243527073519 + }, + { + "end": 69899, + "raw": "0.5395591528940082", + "start": 69881, + "type": "Literal", + "type": "Literal", + "value": 0.5395591528940082 + } + ], + "end": 69900, + "start": 69860, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 69903, + "start": 69902, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 69859, + "name": "line", + "start": 69855, + "type": "Identifier" + }, + "end": 69904, + "start": 69855, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 69942, + "raw": "0.6137667704875602", + "start": 69924, + "type": "Literal", + "type": "Literal", + "value": 0.6137667704875602 + }, + { + "end": 69970, + "raw": "0.22119647516722085", + "start": 69951, + "type": "Literal", + "type": "Literal", + "value": 0.22119647516722085 + } + ], + "end": 69977, + "start": 69915, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 69980, + "start": 69979, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 69914, + "name": "line", + "start": 69910, + "type": "Identifier" + }, + "end": 69981, + "start": 69910, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 70021, + "raw": "0.09582414374469184", + "start": 70002, + "type": "Literal", + "type": "Literal", + "value": 0.09582414374469184 + }, + "end": 70021, + "operator": "-", + "start": 70001, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 70049, + "raw": "0.7533839681212353", + "start": 70031, + "type": "Literal", + "type": "Literal", + "value": 0.7533839681212353 + }, + "end": 70049, + "operator": "-", + "start": 70030, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 70056, + "start": 69992, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 70059, + "start": 70058, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 69991, + "name": "line", + "start": 69987, + "type": "Identifier" + }, + "end": 70060, + "start": 69987, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 70100, + "raw": "0.17254116580051848", + "start": 70081, + "type": "Literal", + "type": "Literal", + "value": 0.17254116580051848 + }, + "end": 70100, + "operator": "-", + "start": 70080, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 70128, + "raw": "0.7669113400341137", + "start": 70110, + "type": "Literal", + "type": "Literal", + "value": 0.7669113400341137 + }, + "end": 70128, + "operator": "-", + "start": 70109, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 70135, + "start": 70071, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 70138, + "start": 70137, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 70070, + "name": "line", + "start": 70066, + "type": "Identifier" + }, + "end": 70139, + "start": 70066, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 70169, + "raw": "0.8944730032887609", + "start": 70151, + "type": "Literal", + "type": "Literal", + "value": 0.8944730032887609 + }, + { + "end": 70189, + "raw": "0.6093318694741408", + "start": 70171, + "type": "Literal", + "type": "Literal", + "value": 0.6093318694741408 + } + ], + "end": 70190, + "start": 70150, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 70193, + "start": 70192, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 70149, + "name": "line", + "start": 70145, + "type": "Identifier" + }, + "end": 70194, + "start": 70145, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 70234, + "raw": "0.41290485754343953", + "start": 70215, + "type": "Literal", + "type": "Literal", + "value": 0.41290485754343953 + }, + "end": 70234, + "operator": "-", + "start": 70214, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 70262, + "raw": "0.4152647361760933", + "start": 70244, + "type": "Literal", + "type": "Literal", + "value": 0.4152647361760933 + }, + "end": 70262, + "operator": "-", + "start": 70243, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 70269, + "start": 70205, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 70272, + "start": 70271, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 70204, + "name": "line", + "start": 70200, + "type": "Identifier" + }, + "end": 70273, + "start": 70200, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 70311, + "raw": "0.5169538755575687", + "start": 70293, + "type": "Literal", + "type": "Literal", + "value": 0.5169538755575687 + }, + { + "argument": { + "end": 70339, + "raw": "0.9085567867302617", + "start": 70321, + "type": "Literal", + "type": "Literal", + "value": 0.9085567867302617 + }, + "end": 70339, + "operator": "-", + "start": 70320, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 70346, + "start": 70284, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 70349, + "start": 70348, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 70283, + "name": "line", + "start": 70279, + "type": "Identifier" + }, + "end": 70350, + "start": 70279, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 70388, + "raw": "0.6751951211858687", + "start": 70370, + "type": "Literal", + "type": "Literal", + "value": 0.6751951211858687 + }, + { + "argument": { + "end": 70416, + "raw": "0.9709424233465593", + "start": 70398, + "type": "Literal", + "type": "Literal", + "value": 0.9709424233465593 + }, + "end": 70416, + "operator": "-", + "start": 70397, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 70423, + "start": 70361, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 70426, + "start": 70425, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 70360, + "name": "line", + "start": 70356, + "type": "Identifier" + }, + "end": 70427, + "start": 70356, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 70466, + "raw": "0.5689619842972184", + "start": 70448, + "type": "Literal", + "type": "Literal", + "value": 0.5689619842972184 + }, + "end": 70466, + "operator": "-", + "start": 70447, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 70493, + "raw": "0.5918969913790362", + "start": 70475, + "type": "Literal", + "type": "Literal", + "value": 0.5918969913790362 + } + ], + "end": 70500, + "start": 70438, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 70503, + "start": 70502, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 70437, + "name": "line", + "start": 70433, + "type": "Identifier" + }, + "end": 70504, + "start": 70433, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 70542, + "raw": "0.9464450621708211", + "start": 70524, + "type": "Literal", + "type": "Literal", + "value": 0.9464450621708211 + }, + { + "argument": { + "end": 70570, + "raw": "0.2684908127803667", + "start": 70552, + "type": "Literal", + "type": "Literal", + "value": 0.2684908127803667 + }, + "end": 70570, + "operator": "-", + "start": 70551, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 70577, + "start": 70515, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 70580, + "start": 70579, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 70514, + "name": "line", + "start": 70510, + "type": "Identifier" + }, + "end": 70581, + "start": 70510, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 70611, + "raw": "0.5241732366617591", + "start": 70593, + "type": "Literal", + "type": "Literal", + "value": 0.5241732366617591 + }, + { + "end": 70631, + "raw": "0.9011437416408563", + "start": 70613, + "type": "Literal", + "type": "Literal", + "value": 0.9011437416408563 + } + ], + "end": 70632, + "start": 70592, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 70635, + "start": 70634, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 70591, + "name": "line", + "start": 70587, + "type": "Identifier" + }, + "end": 70636, + "start": 70587, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 70676, + "raw": "0.14255393713960607", + "start": 70657, + "type": "Literal", + "type": "Literal", + "value": 0.14255393713960607 + }, + "end": 70676, + "operator": "-", + "start": 70656, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 70704, + "raw": "0.5194262624564814", + "start": 70686, + "type": "Literal", + "type": "Literal", + "value": 0.5194262624564814 + }, + "end": 70704, + "operator": "-", + "start": 70685, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 70711, + "start": 70647, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 70714, + "start": 70713, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 70646, + "name": "line", + "start": 70642, + "type": "Identifier" + }, + "end": 70715, + "start": 70642, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 70754, + "raw": "0.4287123231350338", + "start": 70736, + "type": "Literal", + "type": "Literal", + "value": 0.4287123231350338 + }, + "end": 70754, + "operator": "-", + "start": 70735, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 70782, + "raw": "0.4223564528725028", + "start": 70764, + "type": "Literal", + "type": "Literal", + "value": 0.4223564528725028 + }, + "end": 70782, + "operator": "-", + "start": 70763, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 70789, + "start": 70726, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 70792, + "start": 70791, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 70725, + "name": "line", + "start": 70721, + "type": "Identifier" + }, + "end": 70793, + "start": 70721, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 70833, + "raw": "0.09316367294024519", + "start": 70814, + "type": "Literal", + "type": "Literal", + "value": 0.09316367294024519 + }, + "end": 70833, + "operator": "-", + "start": 70813, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 70861, + "raw": "0.9063127021008246", + "start": 70843, + "type": "Literal", + "type": "Literal", + "value": 0.9063127021008246 + }, + "end": 70861, + "operator": "-", + "start": 70842, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 70868, + "start": 70804, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 70871, + "start": 70870, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 70803, + "name": "line", + "start": 70799, + "type": "Identifier" + }, + "end": 70872, + "start": 70799, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 70911, + "raw": "0.2767766535558669", + "start": 70893, + "type": "Literal", + "type": "Literal", + "value": 0.2767766535558669 + }, + "end": 70911, + "operator": "-", + "start": 70892, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 70938, + "raw": "0.6816248114129131", + "start": 70920, + "type": "Literal", + "type": "Literal", + "value": 0.6816248114129131 + } + ], + "end": 70945, + "start": 70883, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 70948, + "start": 70947, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 70882, + "name": "line", + "start": 70878, + "type": "Identifier" + }, + "end": 70949, + "start": 70878, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 70987, + "raw": "0.9796762495562534", + "start": 70969, + "type": "Literal", + "type": "Literal", + "value": 0.9796762495562534 + }, + { + "argument": { + "end": 71015, + "raw": "0.0822145668330625", + "start": 70997, + "type": "Literal", + "type": "Literal", + "value": 0.0822145668330625 + }, + "end": 71015, + "operator": "-", + "start": 70996, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 71022, + "start": 70960, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 71025, + "start": 71024, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 70959, + "name": "line", + "start": 70955, + "type": "Identifier" + }, + "end": 71026, + "start": 70955, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 71065, + "raw": "0.8666513070867441", + "start": 71047, + "type": "Literal", + "type": "Literal", + "value": 0.8666513070867441 + }, + "end": 71065, + "operator": "-", + "start": 71046, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 71092, + "raw": "0.301053160242023", + "start": 71075, + "type": "Literal", + "type": "Literal", + "value": 0.301053160242023 + }, + "end": 71092, + "operator": "-", + "start": 71074, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 71099, + "start": 71037, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 71102, + "start": 71101, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 71036, + "name": "line", + "start": 71032, + "type": "Identifier" + }, + "end": 71103, + "start": 71032, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 71140, + "raw": "0.537415656028112", + "start": 71123, + "type": "Literal", + "type": "Literal", + "value": 0.537415656028112 + }, + { + "end": 71169, + "raw": "0.020272692875002774", + "start": 71149, + "type": "Literal", + "type": "Literal", + "value": 0.020272692875002774 + } + ], + "end": 71176, + "start": 71114, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 71179, + "start": 71178, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 71113, + "name": "line", + "start": 71109, + "type": "Identifier" + }, + "end": 71180, + "start": 71109, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 71218, + "raw": "0.9332396256457531", + "start": 71200, + "type": "Literal", + "type": "Literal", + "value": 0.9332396256457531 + }, + { + "argument": { + "end": 71246, + "raw": "0.6228175690649898", + "start": 71228, + "type": "Literal", + "type": "Literal", + "value": 0.6228175690649898 + }, + "end": 71246, + "operator": "-", + "start": 71227, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 71253, + "start": 71191, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 71256, + "start": 71255, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 71190, + "name": "line", + "start": 71186, + "type": "Identifier" + }, + "end": 71257, + "start": 71186, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 71296, + "raw": "0.18052415837320734", + "start": 71277, + "type": "Literal", + "type": "Literal", + "value": 0.18052415837320734 + }, + { + "argument": { + "end": 71325, + "raw": "0.36894384647296197", + "start": 71306, + "type": "Literal", + "type": "Literal", + "value": 0.36894384647296197 + }, + "end": 71325, + "operator": "-", + "start": 71305, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 71332, + "start": 71268, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 71335, + "start": 71334, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 71267, + "name": "line", + "start": 71263, + "type": "Identifier" + }, + "end": 71336, + "start": 71263, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 71366, + "raw": "0.5384372634075449", + "start": 71348, + "type": "Literal", + "type": "Literal", + "value": 0.5384372634075449 + }, + { + "end": 71386, + "raw": "0.2377565050887107", + "start": 71368, + "type": "Literal", + "type": "Literal", + "value": 0.2377565050887107 + } + ], + "end": 71387, + "start": 71347, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 71390, + "start": 71389, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 71346, + "name": "line", + "start": 71342, + "type": "Identifier" + }, + "end": 71391, + "start": 71342, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 71430, + "raw": "0.39043436929278874", + "start": 71411, + "type": "Literal", + "type": "Literal", + "value": 0.39043436929278874 + }, + { + "end": 71458, + "raw": "0.14273182483160451", + "start": 71439, + "type": "Literal", + "type": "Literal", + "value": 0.14273182483160451 + } + ], + "end": 71465, + "start": 71402, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 71468, + "start": 71467, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 71401, + "name": "line", + "start": 71397, + "type": "Identifier" + }, + "end": 71469, + "start": 71397, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 71508, + "raw": "0.09782890412897283", + "start": 71489, + "type": "Literal", + "type": "Literal", + "value": 0.09782890412897283 + }, + { + "end": 71535, + "raw": "0.9907667536909659", + "start": 71517, + "type": "Literal", + "type": "Literal", + "value": 0.9907667536909659 + } + ], + "end": 71542, + "start": 71480, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 71545, + "start": 71544, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 71479, + "name": "line", + "start": 71475, + "type": "Identifier" + }, + "end": 71546, + "start": 71475, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 71584, + "raw": "0.5286610085921146", + "start": 71566, + "type": "Literal", + "type": "Literal", + "value": 0.5286610085921146 + }, + { + "argument": { + "end": 71612, + "raw": "0.7924508308419256", + "start": 71594, + "type": "Literal", + "type": "Literal", + "value": 0.7924508308419256 + }, + "end": 71612, + "operator": "-", + "start": 71593, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 71619, + "start": 71557, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 71622, + "start": 71621, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 71556, + "name": "line", + "start": 71552, + "type": "Identifier" + }, + "end": 71623, + "start": 71552, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 71661, + "raw": "0.3789978184503342", + "start": 71643, + "type": "Literal", + "type": "Literal", + "value": 0.3789978184503342 + }, + { + "end": 71689, + "raw": "0.12396120576838676", + "start": 71670, + "type": "Literal", + "type": "Literal", + "value": 0.12396120576838676 + } + ], + "end": 71696, + "start": 71634, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 71699, + "start": 71698, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 71633, + "name": "line", + "start": 71629, + "type": "Identifier" + }, + "end": 71700, + "start": 71629, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 71739, + "raw": "0.9484912744890612", + "start": 71721, + "type": "Literal", + "type": "Literal", + "value": 0.9484912744890612 + }, + "end": 71739, + "operator": "-", + "start": 71720, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 71766, + "raw": "0.6729649846476855", + "start": 71748, + "type": "Literal", + "type": "Literal", + "value": 0.6729649846476855 + } + ], + "end": 71773, + "start": 71711, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 71776, + "start": 71775, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 71710, + "name": "line", + "start": 71706, + "type": "Identifier" + }, + "end": 71777, + "start": 71706, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 71815, + "raw": "0.7451758753425153", + "start": 71797, + "type": "Literal", + "type": "Literal", + "value": 0.7451758753425153 + }, + { + "argument": { + "end": 71844, + "raw": "0.21318737562458967", + "start": 71825, + "type": "Literal", + "type": "Literal", + "value": 0.21318737562458967 + }, + "end": 71844, + "operator": "-", + "start": 71824, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 71851, + "start": 71788, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 71854, + "start": 71853, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 71787, + "name": "line", + "start": 71783, + "type": "Identifier" + }, + "end": 71855, + "start": 71783, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 71893, + "raw": "0.1873200727251887", + "start": 71875, + "type": "Literal", + "type": "Literal", + "value": 0.1873200727251887 + }, + { + "argument": { + "end": 71922, + "raw": "0.15961374297992448", + "start": 71903, + "type": "Literal", + "type": "Literal", + "value": 0.15961374297992448 + }, + "end": 71922, + "operator": "-", + "start": 71902, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 71929, + "start": 71866, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 71932, + "start": 71931, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 71865, + "name": "line", + "start": 71861, + "type": "Identifier" + }, + "end": 71933, + "start": 71861, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 71973, + "raw": "0.05729464924537564", + "start": 71954, + "type": "Literal", + "type": "Literal", + "value": 0.05729464924537564 + }, + "end": 71973, + "operator": "-", + "start": 71953, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 72001, + "raw": "0.5436345558508746", + "start": 71983, + "type": "Literal", + "type": "Literal", + "value": 0.5436345558508746 + }, + "end": 72001, + "operator": "-", + "start": 71982, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 72008, + "start": 71944, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 72011, + "start": 72010, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 71943, + "name": "line", + "start": 71939, + "type": "Identifier" + }, + "end": 72012, + "start": 71939, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 72052, + "raw": "0.09582414374469184", + "start": 72033, + "type": "Literal", + "type": "Literal", + "value": 0.09582414374469184 + }, + "end": 72052, + "operator": "-", + "start": 72032, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 72080, + "raw": "0.7533839681212353", + "start": 72062, + "type": "Literal", + "type": "Literal", + "value": 0.7533839681212353 + }, + "end": 72080, + "operator": "-", + "start": 72061, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 72087, + "start": 72023, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 72090, + "start": 72089, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 72022, + "name": "line", + "start": 72018, + "type": "Identifier" + }, + "end": 72091, + "start": 72018, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 72131, + "raw": "0.17254116580051848", + "start": 72112, + "type": "Literal", + "type": "Literal", + "value": 0.17254116580051848 + }, + "end": 72131, + "operator": "-", + "start": 72111, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 72159, + "raw": "0.7669113400341137", + "start": 72141, + "type": "Literal", + "type": "Literal", + "value": 0.7669113400341137 + }, + "end": 72159, + "operator": "-", + "start": 72140, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 72166, + "start": 72102, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 72169, + "start": 72168, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 72101, + "name": "line", + "start": 72097, + "type": "Identifier" + }, + "end": 72170, + "start": 72097, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 72200, + "raw": "0.8944730032887609", + "start": 72182, + "type": "Literal", + "type": "Literal", + "value": 0.8944730032887609 + }, + { + "end": 72220, + "raw": "0.6093318694741408", + "start": 72202, + "type": "Literal", + "type": "Literal", + "value": 0.6093318694741408 + } + ], + "end": 72221, + "start": 72181, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 72224, + "start": 72223, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 72180, + "name": "line", + "start": 72176, + "type": "Identifier" + }, + "end": 72225, + "start": 72176, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 72264, + "raw": "0.6238548626325471", + "start": 72246, + "type": "Literal", + "type": "Literal", + "value": 0.6238548626325471 + }, + "end": 72264, + "operator": "-", + "start": 72245, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 72291, + "raw": "0.4053626746020169", + "start": 72273, + "type": "Literal", + "type": "Literal", + "value": 0.4053626746020169 + } + ], + "end": 72298, + "start": 72236, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 72301, + "start": 72300, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 72235, + "name": "line", + "start": 72231, + "type": "Identifier" + }, + "end": 72302, + "start": 72231, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 72340, + "raw": "0.1379445992766417", + "start": 72322, + "type": "Literal", + "type": "Literal", + "value": 0.1379445992766417 + }, + { + "argument": { + "end": 72369, + "raw": "0.47871087958516045", + "start": 72350, + "type": "Literal", + "type": "Literal", + "value": 0.47871087958516045 + }, + "end": 72369, + "operator": "-", + "start": 72349, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 72376, + "start": 72313, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 72379, + "start": 72378, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 72312, + "name": "line", + "start": 72308, + "type": "Identifier" + }, + "end": 72380, + "start": 72308, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 72419, + "raw": "0.9516767113283946", + "start": 72401, + "type": "Literal", + "type": "Literal", + "value": 0.9516767113283946 + }, + "end": 72419, + "operator": "-", + "start": 72400, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 72446, + "raw": "0.8619900618578948", + "start": 72428, + "type": "Literal", + "type": "Literal", + "value": 0.8619900618578948 + } + ], + "end": 72453, + "start": 72391, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 72456, + "start": 72455, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 72390, + "name": "line", + "start": 72386, + "type": "Identifier" + }, + "end": 72457, + "start": 72386, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 72487, + "raw": "0.9398732950992088", + "start": 72469, + "type": "Literal", + "type": "Literal", + "value": 0.9398732950992088 + }, + { + "end": 72507, + "raw": "0.6326239915683629", + "start": 72489, + "type": "Literal", + "type": "Literal", + "value": 0.6326239915683629 + } + ], + "end": 72508, + "start": 72468, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 72511, + "start": 72510, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 72467, + "name": "line", + "start": 72463, + "type": "Identifier" + }, + "end": 72512, + "start": 72463, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 72551, + "raw": "0.8631974445502164", + "start": 72533, + "type": "Literal", + "type": "Literal", + "value": 0.8631974445502164 + }, + "end": 72551, + "operator": "-", + "start": 72532, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 72580, + "raw": "0.016153555523963137", + "start": 72560, + "type": "Literal", + "type": "Literal", + "value": 0.016153555523963137 + } + ], + "end": 72587, + "start": 72523, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 72590, + "start": 72589, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 72522, + "name": "line", + "start": 72518, + "type": "Identifier" + }, + "end": 72591, + "start": 72518, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 72630, + "raw": "0.19167797120152907", + "start": 72611, + "type": "Literal", + "type": "Literal", + "value": 0.19167797120152907 + }, + { + "argument": { + "end": 72658, + "raw": "0.4916414381703984", + "start": 72640, + "type": "Literal", + "type": "Literal", + "value": 0.4916414381703984 + }, + "end": 72658, + "operator": "-", + "start": 72639, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 72665, + "start": 72602, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 72668, + "start": 72667, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 72601, + "name": "line", + "start": 72597, + "type": "Identifier" + }, + "end": 72669, + "start": 72597, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 72708, + "raw": "0.8644261221501586", + "start": 72690, + "type": "Literal", + "type": "Literal", + "value": 0.8644261221501586 + }, + "end": 72708, + "operator": "-", + "start": 72689, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 72737, + "raw": "0.11434763886359756", + "start": 72718, + "type": "Literal", + "type": "Literal", + "value": 0.11434763886359756 + }, + "end": 72737, + "operator": "-", + "start": 72717, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 72744, + "start": 72680, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 72747, + "start": 72746, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 72679, + "name": "line", + "start": 72675, + "type": "Identifier" + }, + "end": 72748, + "start": 72675, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 72789, + "raw": "0.029081958413378572", + "start": 72769, + "type": "Literal", + "type": "Literal", + "value": 0.029081958413378572 + }, + "end": 72789, + "operator": "-", + "start": 72768, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 72817, + "raw": "0.5214138808318329", + "start": 72799, + "type": "Literal", + "type": "Literal", + "value": 0.5214138808318329 + }, + "end": 72817, + "operator": "-", + "start": 72798, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 72824, + "start": 72759, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 72827, + "start": 72826, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 72758, + "name": "line", + "start": 72754, + "type": "Identifier" + }, + "end": 72828, + "start": 72754, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 72867, + "raw": "0.8713091851579695", + "start": 72849, + "type": "Literal", + "type": "Literal", + "value": 0.8713091851579695 + }, + "end": 72867, + "operator": "-", + "start": 72848, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 72894, + "raw": "0.7866284950967315", + "start": 72876, + "type": "Literal", + "type": "Literal", + "value": 0.7866284950967315 + } + ], + "end": 72901, + "start": 72839, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 72904, + "start": 72903, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 72838, + "name": "line", + "start": 72834, + "type": "Identifier" + }, + "end": 72905, + "start": 72834, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 72934, + "raw": "0.884342023093545", + "start": 72917, + "type": "Literal", + "type": "Literal", + "value": 0.884342023093545 + }, + { + "argument": { + "end": 72955, + "raw": "0.1825407002568431", + "start": 72937, + "type": "Literal", + "type": "Literal", + "value": 0.1825407002568431 + }, + "end": 72955, + "operator": "-", + "start": 72936, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 72956, + "start": 72916, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 72959, + "start": 72958, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 72915, + "name": "line", + "start": 72911, + "type": "Identifier" + }, + "end": 72960, + "start": 72911, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 72999, + "raw": "0.6978385295364686", + "start": 72981, + "type": "Literal", + "type": "Literal", + "value": 0.6978385295364686 + }, + "end": 72999, + "operator": "-", + "start": 72980, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 73026, + "raw": "0.0440574328736949", + "start": 73008, + "type": "Literal", + "type": "Literal", + "value": 0.0440574328736949 + } + ], + "end": 73033, + "start": 72971, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 73036, + "start": 73035, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 72970, + "name": "line", + "start": 72966, + "type": "Identifier" + }, + "end": 73037, + "start": 72966, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 73077, + "raw": "0.48055049324331556", + "start": 73058, + "type": "Literal", + "type": "Literal", + "value": 0.48055049324331556 + }, + "end": 73077, + "operator": "-", + "start": 73057, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 73107, + "raw": "0.028546347149214002", + "start": 73087, + "type": "Literal", + "type": "Literal", + "value": 0.028546347149214002 + }, + "end": 73107, + "operator": "-", + "start": 73086, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 73114, + "start": 73048, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 73117, + "start": 73116, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 73047, + "name": "line", + "start": 73043, + "type": "Identifier" + }, + "end": 73118, + "start": 73043, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 73157, + "raw": "0.41283517382864776", + "start": 73138, + "type": "Literal", + "type": "Literal", + "value": 0.41283517382864776 + }, + { + "argument": { + "end": 73186, + "raw": "0.44938038251347323", + "start": 73167, + "type": "Literal", + "type": "Literal", + "value": 0.44938038251347323 + }, + "end": 73186, + "operator": "-", + "start": 73166, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 73193, + "start": 73129, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 73196, + "start": 73195, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 73128, + "name": "line", + "start": 73124, + "type": "Identifier" + }, + "end": 73197, + "start": 73124, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 73227, + "raw": "0.7911399832501751", + "start": 73209, + "type": "Literal", + "type": "Literal", + "value": 0.7911399832501751 + }, + { + "end": 73246, + "raw": "0.893446368526005", + "start": 73229, + "type": "Literal", + "type": "Literal", + "value": 0.893446368526005 + } + ], + "end": 73247, + "start": 73208, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 73250, + "start": 73249, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 73207, + "name": "line", + "start": 73203, + "type": "Identifier" + }, + "end": 73251, + "start": 73203, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 73289, + "raw": "0.6507434699009087", + "start": 73271, + "type": "Literal", + "type": "Literal", + "value": 0.6507434699009087 + }, + { + "argument": { + "end": 73317, + "raw": "0.6890023920962012", + "start": 73299, + "type": "Literal", + "type": "Literal", + "value": 0.6890023920962012 + }, + "end": 73317, + "operator": "-", + "start": 73298, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 73324, + "start": 73262, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 73327, + "start": 73326, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 73261, + "name": "line", + "start": 73257, + "type": "Identifier" + }, + "end": 73328, + "start": 73257, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 73367, + "raw": "0.10489019777253028", + "start": 73348, + "type": "Literal", + "type": "Literal", + "value": 0.10489019777253028 + }, + { + "argument": { + "end": 73395, + "raw": "0.5467450997193952", + "start": 73377, + "type": "Literal", + "type": "Literal", + "value": 0.5467450997193952 + }, + "end": 73395, + "operator": "-", + "start": 73376, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 73402, + "start": 73339, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 73405, + "start": 73404, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 73338, + "name": "line", + "start": 73334, + "type": "Identifier" + }, + "end": 73406, + "start": 73334, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 73445, + "raw": "0.5760905289992633", + "start": 73427, + "type": "Literal", + "type": "Literal", + "value": 0.5760905289992633 + }, + "end": 73445, + "operator": "-", + "start": 73426, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 73473, + "raw": "0.2639900702114173", + "start": 73455, + "type": "Literal", + "type": "Literal", + "value": 0.2639900702114173 + }, + "end": 73473, + "operator": "-", + "start": 73454, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 73480, + "start": 73417, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 73483, + "start": 73482, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 73416, + "name": "line", + "start": 73412, + "type": "Identifier" + }, + "end": 73484, + "start": 73412, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 73523, + "raw": "0.39828861790105297", + "start": 73504, + "type": "Literal", + "type": "Literal", + "value": 0.39828861790105297 + }, + { + "end": 73550, + "raw": "0.8036624129416385", + "start": 73532, + "type": "Literal", + "type": "Literal", + "value": 0.8036624129416385 + } + ], + "end": 73557, + "start": 73495, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 73560, + "start": 73559, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 73494, + "name": "line", + "start": 73490, + "type": "Identifier" + }, + "end": 73561, + "start": 73490, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 73591, + "raw": "0.673848991328553", + "start": 73574, + "type": "Literal", + "type": "Literal", + "value": 0.673848991328553 + }, + "end": 73591, + "operator": "-", + "start": 73573, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 73611, + "raw": "0.918443329270668", + "start": 73594, + "type": "Literal", + "type": "Literal", + "value": 0.918443329270668 + }, + "end": 73611, + "operator": "-", + "start": 73593, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 73612, + "start": 73572, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 73615, + "start": 73614, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 73571, + "name": "line", + "start": 73567, + "type": "Identifier" + }, + "end": 73616, + "start": 73567, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 73655, + "raw": "0.8599152936179257", + "start": 73637, + "type": "Literal", + "type": "Literal", + "value": 0.8599152936179257 + }, + "end": 73655, + "operator": "-", + "start": 73636, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 73683, + "raw": "0.9499371022680787", + "start": 73665, + "type": "Literal", + "type": "Literal", + "value": 0.9499371022680787 + }, + "end": 73683, + "operator": "-", + "start": 73664, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 73690, + "start": 73627, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 73693, + "start": 73692, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 73626, + "name": "line", + "start": 73622, + "type": "Identifier" + }, + "end": 73694, + "start": 73622, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 73732, + "raw": "0.6285243831393765", + "start": 73714, + "type": "Literal", + "type": "Literal", + "value": 0.6285243831393765 + }, + { + "argument": { + "end": 73760, + "raw": "0.5186557636566307", + "start": 73742, + "type": "Literal", + "type": "Literal", + "value": 0.5186557636566307 + }, + "end": 73760, + "operator": "-", + "start": 73741, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 73767, + "start": 73705, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 73770, + "start": 73769, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 73704, + "name": "line", + "start": 73700, + "type": "Identifier" + }, + "end": 73771, + "start": 73700, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 73809, + "raw": "0.3222412784832269", + "start": 73791, + "type": "Literal", + "type": "Literal", + "value": 0.3222412784832269 + }, + { + "end": 73837, + "raw": "0.24621192679727177", + "start": 73818, + "type": "Literal", + "type": "Literal", + "value": 0.24621192679727177 + } + ], + "end": 73844, + "start": 73782, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 73847, + "start": 73846, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 73781, + "name": "line", + "start": 73777, + "type": "Identifier" + }, + "end": 73848, + "start": 73777, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 73887, + "raw": "0.19754357911311016", + "start": 73868, + "type": "Literal", + "type": "Literal", + "value": 0.19754357911311016 + }, + { + "argument": { + "end": 73915, + "raw": "0.7529246632397206", + "start": 73897, + "type": "Literal", + "type": "Literal", + "value": 0.7529246632397206 + }, + "end": 73915, + "operator": "-", + "start": 73896, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 73922, + "start": 73859, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 73925, + "start": 73924, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 73858, + "name": "line", + "start": 73854, + "type": "Identifier" + }, + "end": 73926, + "start": 73854, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 73966, + "raw": "0.43181570545865555", + "start": 73947, + "type": "Literal", + "type": "Literal", + "value": 0.43181570545865555 + }, + "end": 73966, + "operator": "-", + "start": 73946, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 73994, + "raw": "0.18945437402201537", + "start": 73975, + "type": "Literal", + "type": "Literal", + "value": 0.18945437402201537 + } + ], + "end": 74001, + "start": 73937, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 74004, + "start": 74003, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 73936, + "name": "line", + "start": 73932, + "type": "Identifier" + }, + "end": 74005, + "start": 73932, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 74043, + "raw": "0.8714511090241797", + "start": 74025, + "type": "Literal", + "type": "Literal", + "value": 0.8714511090241797 + }, + { + "argument": { + "end": 74071, + "raw": "0.7215844196844685", + "start": 74053, + "type": "Literal", + "type": "Literal", + "value": 0.7215844196844685 + }, + "end": 74071, + "operator": "-", + "start": 74052, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 74078, + "start": 74016, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 74081, + "start": 74080, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 74015, + "name": "line", + "start": 74011, + "type": "Identifier" + }, + "end": 74082, + "start": 74011, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 74095, + "start": 74094, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 74093, + "name": "close", + "start": 74088, + "type": "Identifier" + }, + "end": 74096, + "start": 74088, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 74111, + "raw": "5", + "start": 74110, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + { + "end": 74114, + "start": 74113, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 74109, + "name": "extrude", + "start": 74102, + "type": "Identifier" + }, + "end": 74115, + "start": 74102, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 74115, + "start": 10, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 74115, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 74116, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/mike_stress_test/input.kcl b/src/wasm-lib/kcl/tests/mike_stress_test/input.kcl new file mode 100644 index 000000000..de39d6ed9 --- /dev/null +++ b/src/wasm-lib/kcl/tests/mike_stress_test/input.kcl @@ -0,0 +1,3476 @@ +part001 = startSketchOn('XY') + |> startProfileAt([0.0, 0.0], %) + |> line([ + -0.3670208139314082, + 0.21201331909674526 + ], %) + |> line([ + -0.4707511307971115, + 0.4905279615419764 + ], %) + |> line([ + -0.8328324229085962, + 0.4677492878818803 + ], %) + |> line([ + -0.8111463382182231, + -0.41814807547140576 + ], %) + |> line([ + 0.03807684940941125, + 0.25664826686353326 + ], %) + |> line([ + 0.23950083339596384, + 0.43693196301855575 + ], %) + |> line([ + -0.16279444820904887, + 0.8064475707664818 + ], %) + |> line([ + -0.08972872009232558, + -0.08887625823751266 + ], %) + |> line([ + 0.9203433427102556, + -0.17343459369697545 + ], %) + |> line([ + 0.0017496234414517975, + -0.5178508316168335 + ], %) + |> line([ + 0.6206263405732759, + -0.8733399468665124 + ], %) + |> line([ + -0.7776386664456383, + 0.7602780485384968 + ], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([ + -0.13036646025917076, + 0.012051713627069693 + ], %) + |> line([ + -0.1656465612645519, + -0.20775229173765486 + ], %) + |> line([ + -0.0962723255929061, + -0.05417797659066137 + ], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([ + 0.27997950083139167, + -0.17778188444008958 + ], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([ + 0.39140760219992154, + -0.7839795272576484 + ], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([ + 0.6137667704875602, + 0.22119647516722085 + ], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([ + -0.41290485754343953, + -0.4152647361760933 + ], %) + |> line([ + 0.5169538755575687, + -0.9085567867302617 + ], %) + |> line([ + -0.6716353749059765, + -0.9605576808879026 + ], %) + |> line([ + 0.010280170930300203, + -0.37344123662342166 + ], %) + |> line([ + 0.10357375682791004, + -0.42294321030821425 + ], %) + |> line([ + 0.4520311575096987, + -0.11232675307600548 + ], %) + |> line([ + -0.8821185914380845, + -0.7155147434939819 + ], %) + |> line([0.9195487101690416, 0.2691627465297364], %) + |> line([ + 0.7098978191546745, + 0.11710004169385968 + ], %) + |> line([ + -0.37876368560819995, + 0.7106729314759084 + ], %) + |> line([ + -0.29728126898353335, + -0.06649734568328003 + ], %) + |> line([ + 0.22965781558352072, + -0.7601866432836641 + ], %) + |> line([ + -0.6356501074317229, + 0.19458425399338064 + ], %) + |> line([0.5721251777404546, 0.2888584097921527], %) + |> line([ + -0.9580409549552311, + -0.02243818192078395 + ], %) + |> line([ + 0.3299184618602866, + -0.8353726942369875 + ], %) + |> line([ + 0.7434639386755209, + -0.7919648864138378 + ], %) + |> line([0.9935751011164615, 0.9042566468497608], %) + |> line([ + -0.5035812884687294, + 0.5150967434989442 + ], %) + |> line([0.5526227215900215, 0.7612604137272441], %) + |> line([ + 0.8593271349126876, + 0.08414894953725849 + ], %) + |> line([ + -0.8181049219192864, + -0.903548131323352 + ], %) + |> line([ + 0.3165782044458305, + -0.24189274252014914 + ], %) + |> line([ + -0.44390956414045135, + -0.25912591535126905 + ], %) + |> line([ + -0.6605165911891009, + -0.40355115288839194 + ], %) + |> line([ + -0.7170489950180006, + 0.23454356079651384 + ], %) + |> line([ + -0.2568187045379722, + -0.45031188717601367 + ], %) + |> line([ + 0.6751951211858687, + -0.9709424233465593 + ], %) + |> line([ + -0.5689619842972184, + 0.5918969913790362 + ], %) + |> line([ + -0.8328324229085962, + 0.4677492878818803 + ], %) + |> line([ + -0.8111463382182231, + -0.41814807547140576 + ], %) + |> line([ + 0.03807684940941125, + 0.25664826686353326 + ], %) + |> line([ + 0.23950083339596384, + 0.43693196301855575 + ], %) + |> line([ + -0.16279444820904887, + 0.8064475707664818 + ], %) + |> line([ + -0.08972872009232558, + -0.08887625823751266 + ], %) + |> line([ + 0.9203433427102556, + -0.17343459369697545 + ], %) + |> line([ + 0.0017496234414517975, + -0.5178508316168335 + ], %) + |> line([ + 0.6206263405732759, + -0.8733399468665124 + ], %) + |> line([ + -0.7776386664456383, + 0.7602780485384968 + ], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([ + -0.13036646025917076, + 0.012051713627069693 + ], %) + |> line([ + -0.1656465612645519, + -0.20775229173765486 + ], %) + |> line([ + -0.0962723255929061, + -0.05417797659066137 + ], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([ + 0.27997950083139167, + -0.17778188444008958 + ], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([ + 0.39140760219992154, + -0.7839795272576484 + ], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([ + 0.6137667704875602, + 0.22119647516722085 + ], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([ + -0.41290485754343953, + -0.4152647361760933 + ], %) + |> line([ + 0.5169538755575687, + -0.9085567867302617 + ], %) + |> line([ + 0.6751951211858687, + -0.9709424233465593 + ], %) + |> line([ + -0.5689619842972184, + 0.5918969913790362 + ], %) + |> line([ + 0.9464450621708211, + -0.2684908127803667 + ], %) + |> line([0.5241732366617591, 0.9011437416408563], %) + |> line([ + -0.14255393713960607, + -0.5194262624564814 + ], %) + |> line([ + -0.4287123231350338, + -0.4223564528725028 + ], %) + |> line([ + -0.09316367294024519, + -0.9063127021008246 + ], %) + |> line([ + -0.2767766535558669, + 0.6816248114129131 + ], %) + |> line([ + 0.9796762495562534, + -0.0822145668330625 + ], %) + |> line([ + -0.8666513070867441, + -0.301053160242023 + ], %) + |> line([ + 0.537415656028112, + 0.020272692875002774 + ], %) + |> line([ + 0.9332396256457531, + -0.6228175690649898 + ], %) + |> line([ + 0.18052415837320734, + -0.36894384647296197 + ], %) + |> line([0.5384372634075449, 0.2377565050887107], %) + |> line([ + 0.39043436929278874, + 0.14273182483160451 + ], %) + |> line([ + 0.09782890412897283, + 0.9907667536909659 + ], %) + |> line([ + 0.5286610085921146, + -0.7924508308419256 + ], %) + |> line([ + 0.3789978184503342, + 0.12396120576838676 + ], %) + |> line([ + -0.9484912744890612, + 0.6729649846476855 + ], %) + |> line([ + 0.7451758753425153, + -0.21318737562458967 + ], %) + |> line([ + 0.1873200727251887, + -0.15961374297992448 + ], %) + |> line([ + -0.05729464924537564, + -0.5436345558508746 + ], %) + |> line([ + -0.09582414374469184, + -0.7533839681212353 + ], %) + |> line([ + -0.17254116580051848, + -0.7669113400341137 + ], %) + |> line([0.8944730032887609, 0.6093318694741408], %) + |> line([ + -0.3670208139314082, + 0.21201331909674526 + ], %) + |> line([ + -0.4707511307971115, + 0.4905279615419764 + ], %) + |> line([ + -0.8328324229085962, + 0.4677492878818803 + ], %) + |> line([ + -0.8111463382182231, + -0.41814807547140576 + ], %) + |> line([ + 0.03807684940941125, + 0.25664826686353326 + ], %) + |> line([ + 0.23950083339596384, + 0.43693196301855575 + ], %) + |> line([ + -0.16279444820904887, + 0.8064475707664818 + ], %) + |> line([ + -0.08972872009232558, + -0.08887625823751266 + ], %) + |> line([ + 0.9203433427102556, + -0.17343459369697545 + ], %) + |> line([ + 0.0017496234414517975, + -0.5178508316168335 + ], %) + |> line([ + 0.6206263405732759, + -0.8733399468665124 + ], %) + |> line([ + -0.7776386664456383, + 0.7602780485384968 + ], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([ + -0.13036646025917076, + 0.012051713627069693 + ], %) + |> line([ + -0.1656465612645519, + -0.20775229173765486 + ], %) + |> line([ + -0.0962723255929061, + -0.05417797659066137 + ], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([ + 0.27997950083139167, + -0.17778188444008958 + ], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([ + 0.39140760219992154, + -0.7839795272576484 + ], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([ + 0.6137667704875602, + 0.22119647516722085 + ], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([ + -0.41290485754343953, + -0.4152647361760933 + ], %) + |> line([ + 0.5169538755575687, + -0.9085567867302617 + ], %) + |> line([ + -0.6716353749059765, + -0.9605576808879026 + ], %) + |> line([ + 0.010280170930300203, + -0.37344123662342166 + ], %) + |> line([ + 0.10357375682791004, + -0.42294321030821425 + ], %) + |> line([ + 0.4520311575096987, + -0.11232675307600548 + ], %) + |> line([ + -0.8821185914380845, + -0.7155147434939819 + ], %) + |> line([0.9195487101690416, 0.2691627465297364], %) + |> line([ + 0.7098978191546745, + 0.11710004169385968 + ], %) + |> line([ + -0.37876368560819995, + 0.7106729314759084 + ], %) + |> line([ + -0.29728126898353335, + -0.06649734568328003 + ], %) + |> line([ + 0.22965781558352072, + -0.7601866432836641 + ], %) + |> line([ + -0.6356501074317229, + 0.19458425399338064 + ], %) + |> line([0.5721251777404546, 0.2888584097921527], %) + |> line([ + -0.9580409549552311, + -0.02243818192078395 + ], %) + |> line([ + 0.3299184618602866, + -0.8353726942369875 + ], %) + |> line([ + 0.7434639386755209, + -0.7919648864138378 + ], %) + |> line([0.9935751011164615, 0.9042566468497608], %) + |> line([ + -0.5035812884687294, + 0.5150967434989442 + ], %) + |> line([0.5526227215900215, 0.7612604137272441], %) + |> line([ + 0.8593271349126876, + 0.08414894953725849 + ], %) + |> line([ + -0.8181049219192864, + -0.903548131323352 + ], %) + |> line([ + 0.3165782044458305, + -0.24189274252014914 + ], %) + |> line([ + -0.44390956414045135, + -0.25912591535126905 + ], %) + |> line([ + -0.6605165911891009, + -0.40355115288839194 + ], %) + |> line([ + -0.7170489950180006, + 0.23454356079651384 + ], %) + |> line([ + -0.2568187045379722, + -0.45031188717601367 + ], %) + |> line([ + 0.6751951211858687, + -0.9709424233465593 + ], %) + |> line([ + -0.5689619842972184, + 0.5918969913790362 + ], %) + |> line([ + -0.8328324229085962, + 0.4677492878818803 + ], %) + |> line([ + -0.8111463382182231, + -0.41814807547140576 + ], %) + |> line([ + 0.03807684940941125, + 0.25664826686353326 + ], %) + |> line([ + 0.23950083339596384, + 0.43693196301855575 + ], %) + |> line([ + -0.16279444820904887, + 0.8064475707664818 + ], %) + |> line([ + -0.08972872009232558, + -0.08887625823751266 + ], %) + |> line([ + 0.9203433427102556, + -0.17343459369697545 + ], %) + |> line([ + 0.0017496234414517975, + -0.5178508316168335 + ], %) + |> line([ + 0.6206263405732759, + -0.8733399468665124 + ], %) + |> line([ + -0.7776386664456383, + 0.7602780485384968 + ], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([ + -0.13036646025917076, + 0.012051713627069693 + ], %) + |> line([ + -0.1656465612645519, + -0.20775229173765486 + ], %) + |> line([ + -0.0962723255929061, + -0.05417797659066137 + ], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([ + 0.27997950083139167, + -0.17778188444008958 + ], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([ + 0.39140760219992154, + -0.7839795272576484 + ], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([ + 0.6137667704875602, + 0.22119647516722085 + ], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([ + -0.3670208139314082, + 0.21201331909674526 + ], %) + |> line([ + -0.4707511307971115, + 0.4905279615419764 + ], %) + |> line([ + -0.8328324229085962, + 0.4677492878818803 + ], %) + |> line([ + -0.8111463382182231, + -0.41814807547140576 + ], %) + |> line([ + 0.03807684940941125, + 0.25664826686353326 + ], %) + |> line([ + 0.23950083339596384, + 0.43693196301855575 + ], %) + |> line([ + -0.16279444820904887, + 0.8064475707664818 + ], %) + |> line([ + -0.08972872009232558, + -0.08887625823751266 + ], %) + |> line([ + 0.9203433427102556, + -0.17343459369697545 + ], %) + |> line([ + 0.0017496234414517975, + -0.5178508316168335 + ], %) + |> line([ + 0.6206263405732759, + -0.8733399468665124 + ], %) + |> line([ + -0.7776386664456383, + 0.7602780485384968 + ], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([ + -0.13036646025917076, + 0.012051713627069693 + ], %) + |> line([ + -0.1656465612645519, + -0.20775229173765486 + ], %) + |> line([ + -0.0962723255929061, + -0.05417797659066137 + ], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([ + 0.27997950083139167, + -0.17778188444008958 + ], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([ + 0.39140760219992154, + -0.7839795272576484 + ], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([ + 0.6137667704875602, + 0.22119647516722085 + ], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([ + -0.41290485754343953, + -0.4152647361760933 + ], %) + |> line([ + 0.5169538755575687, + -0.9085567867302617 + ], %) + |> line([ + -0.6716353749059765, + -0.9605576808879026 + ], %) + |> line([ + 0.010280170930300203, + -0.37344123662342166 + ], %) + |> line([ + -0.3670208139314082, + 0.21201331909674526 + ], %) + |> line([ + -0.4707511307971115, + 0.4905279615419764 + ], %) + |> line([ + -0.8328324229085962, + 0.4677492878818803 + ], %) + |> line([ + -0.8111463382182231, + -0.41814807547140576 + ], %) + |> line([ + 0.03807684940941125, + 0.25664826686353326 + ], %) + |> line([ + 0.23950083339596384, + 0.43693196301855575 + ], %) + |> line([ + -0.16279444820904887, + 0.8064475707664818 + ], %) + |> line([ + -0.08972872009232558, + -0.08887625823751266 + ], %) + |> line([ + 0.9203433427102556, + -0.17343459369697545 + ], %) + |> line([ + 0.0017496234414517975, + -0.5178508316168335 + ], %) + |> line([ + 0.6206263405732759, + -0.8733399468665124 + ], %) + |> line([ + -0.7776386664456383, + 0.7602780485384968 + ], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([ + -0.13036646025917076, + 0.012051713627069693 + ], %) + |> line([ + -0.1656465612645519, + -0.20775229173765486 + ], %) + |> line([ + -0.0962723255929061, + -0.05417797659066137 + ], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([ + 0.27997950083139167, + -0.17778188444008958 + ], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([ + 0.39140760219992154, + -0.7839795272576484 + ], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([ + 0.6137667704875602, + 0.22119647516722085 + ], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([ + -0.41290485754343953, + -0.4152647361760933 + ], %) + |> line([ + 0.5169538755575687, + -0.9085567867302617 + ], %) + |> line([ + -0.6716353749059765, + -0.9605576808879026 + ], %) + |> line([ + 0.010280170930300203, + -0.37344123662342166 + ], %) + |> line([ + 0.10357375682791004, + -0.42294321030821425 + ], %) + |> line([ + 0.4520311575096987, + -0.11232675307600548 + ], %) + |> line([ + -0.8821185914380845, + -0.7155147434939819 + ], %) + |> line([0.9195487101690416, 0.2691627465297364], %) + |> line([ + 0.7098978191546745, + 0.11710004169385968 + ], %) + |> line([ + -0.37876368560819995, + 0.7106729314759084 + ], %) + |> line([ + -0.29728126898353335, + -0.06649734568328003 + ], %) + |> line([ + 0.22965781558352072, + -0.7601866432836641 + ], %) + |> line([ + -0.6356501074317229, + 0.19458425399338064 + ], %) + |> line([0.5721251777404546, 0.2888584097921527], %) + |> line([ + -0.9580409549552311, + -0.02243818192078395 + ], %) + |> line([ + 0.3299184618602866, + -0.8353726942369875 + ], %) + |> line([ + 0.7434639386755209, + -0.7919648864138378 + ], %) + |> line([0.9935751011164615, 0.9042566468497608], %) + |> line([ + -0.5035812884687294, + 0.5150967434989442 + ], %) + |> line([0.5526227215900215, 0.7612604137272441], %) + |> line([ + 0.8593271349126876, + 0.08414894953725849 + ], %) + |> line([ + -0.8181049219192864, + -0.903548131323352 + ], %) + |> line([ + 0.3165782044458305, + -0.24189274252014914 + ], %) + |> line([ + -0.44390956414045135, + -0.25912591535126905 + ], %) + |> line([ + -0.6605165911891009, + -0.40355115288839194 + ], %) + |> line([ + -0.7170489950180006, + 0.23454356079651384 + ], %) + |> line([ + -0.2568187045379722, + -0.45031188717601367 + ], %) + |> line([ + 0.6751951211858687, + -0.9709424233465593 + ], %) + |> line([ + -0.5689619842972184, + 0.5918969913790362 + ], %) + |> line([ + -0.8328324229085962, + 0.4677492878818803 + ], %) + |> line([ + -0.8111463382182231, + -0.41814807547140576 + ], %) + |> line([ + 0.03807684940941125, + 0.25664826686353326 + ], %) + |> line([ + 0.23950083339596384, + 0.43693196301855575 + ], %) + |> line([ + -0.16279444820904887, + 0.8064475707664818 + ], %) + |> line([ + -0.08972872009232558, + -0.08887625823751266 + ], %) + |> line([ + 0.9203433427102556, + -0.17343459369697545 + ], %) + |> line([ + 0.0017496234414517975, + -0.5178508316168335 + ], %) + |> line([ + 0.6206263405732759, + -0.8733399468665124 + ], %) + |> line([ + -0.7776386664456383, + 0.7602780485384968 + ], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([ + -0.13036646025917076, + 0.012051713627069693 + ], %) + |> line([ + -0.1656465612645519, + -0.20775229173765486 + ], %) + |> line([ + -0.0962723255929061, + -0.05417797659066137 + ], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([ + 0.27997950083139167, + -0.17778188444008958 + ], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([ + 0.39140760219992154, + -0.7839795272576484 + ], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([ + 0.6137667704875602, + 0.22119647516722085 + ], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([ + -0.41290485754343953, + -0.4152647361760933 + ], %) + |> line([ + 0.5169538755575687, + -0.9085567867302617 + ], %) + |> line([ + 0.6751951211858687, + -0.9709424233465593 + ], %) + |> line([ + -0.5689619842972184, + 0.5918969913790362 + ], %) + |> line([ + 0.9464450621708211, + -0.2684908127803667 + ], %) + |> line([0.5241732366617591, 0.9011437416408563], %) + |> line([ + -0.14255393713960607, + -0.5194262624564814 + ], %) + |> line([ + -0.4287123231350338, + -0.4223564528725028 + ], %) + |> line([ + -0.09316367294024519, + -0.9063127021008246 + ], %) + |> line([ + -0.2767766535558669, + 0.6816248114129131 + ], %) + |> line([ + 0.9796762495562534, + -0.0822145668330625 + ], %) + |> line([ + -0.8666513070867441, + -0.301053160242023 + ], %) + |> line([ + 0.537415656028112, + 0.020272692875002774 + ], %) + |> line([ + 0.9332396256457531, + -0.6228175690649898 + ], %) + |> line([ + 0.18052415837320734, + -0.36894384647296197 + ], %) + |> line([0.5384372634075449, 0.2377565050887107], %) + |> line([ + 0.39043436929278874, + 0.14273182483160451 + ], %) + |> line([ + 0.09782890412897283, + 0.9907667536909659 + ], %) + |> line([ + 0.5286610085921146, + -0.7924508308419256 + ], %) + |> line([ + 0.3789978184503342, + 0.12396120576838676 + ], %) + |> line([ + -0.9484912744890612, + 0.6729649846476855 + ], %) + |> line([ + 0.7451758753425153, + -0.21318737562458967 + ], %) + |> line([ + 0.1873200727251887, + -0.15961374297992448 + ], %) + |> line([ + -0.05729464924537564, + -0.5436345558508746 + ], %) + |> line([ + -0.09582414374469184, + -0.7533839681212353 + ], %) + |> line([ + -0.17254116580051848, + -0.7669113400341137 + ], %) + |> line([0.8944730032887609, 0.6093318694741408], %) + |> line([ + -0.3670208139314082, + 0.21201331909674526 + ], %) + |> line([ + -0.4707511307971115, + 0.4905279615419764 + ], %) + |> line([ + -0.8328324229085962, + 0.4677492878818803 + ], %) + |> line([ + -0.8111463382182231, + -0.41814807547140576 + ], %) + |> line([ + 0.03807684940941125, + 0.25664826686353326 + ], %) + |> line([ + 0.23950083339596384, + 0.43693196301855575 + ], %) + |> line([ + -0.16279444820904887, + 0.8064475707664818 + ], %) + |> line([ + -0.08972872009232558, + -0.08887625823751266 + ], %) + |> line([ + 0.9203433427102556, + -0.17343459369697545 + ], %) + |> line([ + 0.0017496234414517975, + -0.5178508316168335 + ], %) + |> line([ + 0.6206263405732759, + -0.8733399468665124 + ], %) + |> line([ + -0.7776386664456383, + 0.7602780485384968 + ], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([ + -0.13036646025917076, + 0.012051713627069693 + ], %) + |> line([ + -0.1656465612645519, + -0.20775229173765486 + ], %) + |> line([ + -0.0962723255929061, + -0.05417797659066137 + ], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([ + 0.27997950083139167, + -0.17778188444008958 + ], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([ + 0.39140760219992154, + -0.7839795272576484 + ], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([ + 0.6137667704875602, + 0.22119647516722085 + ], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([ + -0.41290485754343953, + -0.4152647361760933 + ], %) + |> line([ + 0.5169538755575687, + -0.9085567867302617 + ], %) + |> line([ + -0.6716353749059765, + -0.9605576808879026 + ], %) + |> line([ + 0.010280170930300203, + -0.37344123662342166 + ], %) + |> line([ + 0.10357375682791004, + -0.42294321030821425 + ], %) + |> line([ + 0.4520311575096987, + -0.11232675307600548 + ], %) + |> line([ + -0.8821185914380845, + -0.7155147434939819 + ], %) + |> line([0.9195487101690416, 0.2691627465297364], %) + |> line([ + 0.7098978191546745, + 0.11710004169385968 + ], %) + |> line([ + -0.37876368560819995, + 0.7106729314759084 + ], %) + |> line([ + -0.29728126898353335, + -0.06649734568328003 + ], %) + |> line([ + 0.22965781558352072, + -0.7601866432836641 + ], %) + |> line([ + -0.6356501074317229, + 0.19458425399338064 + ], %) + |> line([0.5721251777404546, 0.2888584097921527], %) + |> line([ + -0.9580409549552311, + -0.02243818192078395 + ], %) + |> line([ + 0.3299184618602866, + -0.8353726942369875 + ], %) + |> line([ + 0.7434639386755209, + -0.7919648864138378 + ], %) + |> line([0.9935751011164615, 0.9042566468497608], %) + |> line([ + -0.5035812884687294, + 0.5150967434989442 + ], %) + |> line([0.5526227215900215, 0.7612604137272441], %) + |> line([ + 0.8593271349126876, + 0.08414894953725849 + ], %) + |> line([ + -0.8181049219192864, + -0.903548131323352 + ], %) + |> line([ + 0.3165782044458305, + -0.24189274252014914 + ], %) + |> line([ + -0.44390956414045135, + -0.25912591535126905 + ], %) + |> line([ + -0.6605165911891009, + -0.40355115288839194 + ], %) + |> line([ + -0.7170489950180006, + 0.23454356079651384 + ], %) + |> line([ + -0.2568187045379722, + -0.45031188717601367 + ], %) + |> line([ + 0.6751951211858687, + -0.9709424233465593 + ], %) + |> line([ + -0.5689619842972184, + 0.5918969913790362 + ], %) + |> line([ + -0.8328324229085962, + 0.4677492878818803 + ], %) + |> line([ + -0.8111463382182231, + -0.41814807547140576 + ], %) + |> line([ + 0.03807684940941125, + 0.25664826686353326 + ], %) + |> line([ + 0.23950083339596384, + 0.43693196301855575 + ], %) + |> line([ + -0.16279444820904887, + 0.8064475707664818 + ], %) + |> line([ + -0.08972872009232558, + -0.08887625823751266 + ], %) + |> line([ + 0.9203433427102556, + -0.17343459369697545 + ], %) + |> line([ + 0.0017496234414517975, + -0.5178508316168335 + ], %) + |> line([ + 0.6206263405732759, + -0.8733399468665124 + ], %) + |> line([ + -0.7776386664456383, + 0.7602780485384968 + ], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([ + -0.13036646025917076, + 0.012051713627069693 + ], %) + |> line([ + -0.1656465612645519, + -0.20775229173765486 + ], %) + |> line([ + -0.0962723255929061, + -0.05417797659066137 + ], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([ + 0.27997950083139167, + -0.17778188444008958 + ], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([ + 0.39140760219992154, + -0.7839795272576484 + ], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([ + 0.6137667704875602, + 0.22119647516722085 + ], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([ + -0.3670208139314082, + 0.21201331909674526 + ], %) + |> line([ + -0.4707511307971115, + 0.4905279615419764 + ], %) + |> line([ + -0.8328324229085962, + 0.4677492878818803 + ], %) + |> line([ + -0.8111463382182231, + -0.41814807547140576 + ], %) + |> line([ + 0.03807684940941125, + 0.25664826686353326 + ], %) + |> line([ + 0.23950083339596384, + 0.43693196301855575 + ], %) + |> line([ + -0.16279444820904887, + 0.8064475707664818 + ], %) + |> line([ + -0.08972872009232558, + -0.08887625823751266 + ], %) + |> line([ + 0.9203433427102556, + -0.17343459369697545 + ], %) + |> line([ + 0.0017496234414517975, + -0.5178508316168335 + ], %) + |> line([ + 0.6206263405732759, + -0.8733399468665124 + ], %) + |> line([ + -0.7776386664456383, + 0.7602780485384968 + ], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([ + -0.13036646025917076, + 0.012051713627069693 + ], %) + |> line([ + -0.1656465612645519, + -0.20775229173765486 + ], %) + |> line([ + -0.0962723255929061, + -0.05417797659066137 + ], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([ + 0.27997950083139167, + -0.17778188444008958 + ], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([ + 0.39140760219992154, + -0.7839795272576484 + ], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([ + 0.6137667704875602, + 0.22119647516722085 + ], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([ + -0.41290485754343953, + -0.4152647361760933 + ], %) + |> line([ + 0.5169538755575687, + -0.9085567867302617 + ], %) + |> line([ + -0.6716353749059765, + -0.9605576808879026 + ], %) + |> line([ + 0.010280170930300203, + -0.37344123662342166 + ], %) + |> line([ + 0.10357375682791004, + -0.42294321030821425 + ], %) + |> line([ + 0.4520311575096987, + -0.11232675307600548 + ], %) + |> line([ + -0.8821185914380845, + -0.7155147434939819 + ], %) + |> line([0.9195487101690416, 0.2691627465297364], %) + |> line([ + 0.7098978191546745, + 0.11710004169385968 + ], %) + |> line([ + -0.37876368560819995, + 0.7106729314759084 + ], %) + |> line([ + -0.29728126898353335, + -0.06649734568328003 + ], %) + |> line([ + 0.22965781558352072, + -0.7601866432836641 + ], %) + |> line([ + -0.6356501074317229, + 0.19458425399338064 + ], %) + |> line([0.5721251777404546, 0.2888584097921527], %) + |> line([ + -0.9580409549552311, + -0.02243818192078395 + ], %) + |> line([ + 0.3299184618602866, + -0.8353726942369875 + ], %) + |> line([ + 0.7434639386755209, + -0.7919648864138378 + ], %) + |> line([0.9935751011164615, 0.9042566468497608], %) + |> line([ + -0.5035812884687294, + 0.5150967434989442 + ], %) + |> line([0.5526227215900215, 0.7612604137272441], %) + |> line([ + 0.8593271349126876, + 0.08414894953725849 + ], %) + |> line([ + -0.8181049219192864, + -0.903548131323352 + ], %) + |> line([ + 0.3165782044458305, + -0.24189274252014914 + ], %) + |> line([ + -0.44390956414045135, + -0.25912591535126905 + ], %) + |> line([ + -0.6605165911891009, + -0.40355115288839194 + ], %) + |> line([ + -0.7170489950180006, + 0.23454356079651384 + ], %) + |> line([ + -0.2568187045379722, + -0.45031188717601367 + ], %) + |> line([ + 0.6751951211858687, + -0.9709424233465593 + ], %) + |> line([ + -0.5689619842972184, + 0.5918969913790362 + ], %) + |> line([ + -0.8328324229085962, + 0.4677492878818803 + ], %) + |> line([ + -0.8111463382182231, + -0.41814807547140576 + ], %) + |> line([ + 0.03807684940941125, + 0.25664826686353326 + ], %) + |> line([ + 0.23950083339596384, + 0.43693196301855575 + ], %) + |> line([ + -0.16279444820904887, + 0.8064475707664818 + ], %) + |> line([ + -0.08972872009232558, + -0.08887625823751266 + ], %) + |> line([ + 0.9203433427102556, + -0.17343459369697545 + ], %) + |> line([ + 0.0017496234414517975, + -0.5178508316168335 + ], %) + |> line([ + 0.6206263405732759, + -0.8733399468665124 + ], %) + |> line([ + -0.7776386664456383, + 0.7602780485384968 + ], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([ + -0.13036646025917076, + 0.012051713627069693 + ], %) + |> line([ + -0.1656465612645519, + -0.20775229173765486 + ], %) + |> line([ + -0.0962723255929061, + -0.05417797659066137 + ], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([ + 0.27997950083139167, + -0.17778188444008958 + ], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([ + 0.39140760219992154, + -0.7839795272576484 + ], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([ + 0.6137667704875602, + 0.22119647516722085 + ], %) + |> line([ + -0.09582414374469184, + -0.7533839681212353 + ], %) + |> line([ + -0.17254116580051848, + -0.7669113400341137 + ], %) + |> line([0.8944730032887609, 0.6093318694741408], %) + |> line([ + -0.41290485754343953, + -0.4152647361760933 + ], %) + |> line([ + 0.5169538755575687, + -0.9085567867302617 + ], %) + |> line([ + 0.6751951211858687, + -0.9709424233465593 + ], %) + |> line([ + -0.5689619842972184, + 0.5918969913790362 + ], %) + |> line([ + 0.9464450621708211, + -0.2684908127803667 + ], %) + |> line([0.5241732366617591, 0.9011437416408563], %) + |> line([ + -0.14255393713960607, + -0.5194262624564814 + ], %) + |> line([ + -0.4287123231350338, + -0.4223564528725028 + ], %) + |> line([ + -0.09316367294024519, + -0.9063127021008246 + ], %) + |> line([ + -0.2767766535558669, + 0.6816248114129131 + ], %) + |> line([ + 0.9796762495562534, + -0.0822145668330625 + ], %) + |> line([ + -0.8666513070867441, + -0.301053160242023 + ], %) + |> line([ + 0.537415656028112, + 0.020272692875002774 + ], %) + |> line([ + 0.9332396256457531, + -0.6228175690649898 + ], %) + |> line([ + 0.18052415837320734, + -0.36894384647296197 + ], %) + |> line([0.5384372634075449, 0.2377565050887107], %) + |> line([ + 0.39043436929278874, + 0.14273182483160451 + ], %) + |> line([ + 0.09782890412897283, + 0.9907667536909659 + ], %) + |> line([ + 0.5286610085921146, + -0.7924508308419256 + ], %) + |> line([ + 0.3789978184503342, + 0.12396120576838676 + ], %) + |> line([ + -0.9484912744890612, + 0.6729649846476855 + ], %) + |> line([ + 0.7451758753425153, + -0.21318737562458967 + ], %) + |> line([ + 0.1873200727251887, + -0.15961374297992448 + ], %) + |> line([ + -0.05729464924537564, + -0.5436345558508746 + ], %) + |> line([ + -0.09582414374469184, + -0.7533839681212353 + ], %) + |> line([ + -0.17254116580051848, + -0.7669113400341137 + ], %) + |> line([0.8944730032887609, 0.6093318694741408], %) + |> line([ + -0.6238548626325471, + 0.4053626746020169 + ], %) + |> line([ + 0.1379445992766417, + -0.47871087958516045 + ], %) + |> line([ + -0.9516767113283946, + 0.8619900618578948 + ], %) + |> line([0.9398732950992088, 0.6326239915683629], %) + |> line([ + -0.8631974445502164, + 0.016153555523963137 + ], %) + |> line([ + 0.19167797120152907, + -0.4916414381703984 + ], %) + |> line([ + -0.8644261221501586, + -0.11434763886359756 + ], %) + |> line([ + -0.029081958413378572, + -0.5214138808318329 + ], %) + |> line([ + -0.8713091851579695, + 0.7866284950967315 + ], %) + |> line([0.884342023093545, -0.1825407002568431], %) + |> line([ + -0.6978385295364686, + 0.0440574328736949 + ], %) + |> line([ + -0.48055049324331556, + -0.028546347149214002 + ], %) + |> line([ + 0.41283517382864776, + -0.44938038251347323 + ], %) + |> line([0.7911399832501751, 0.893446368526005], %) + |> line([ + 0.6507434699009087, + -0.6890023920962012 + ], %) + |> line([ + 0.10489019777253028, + -0.5467450997193952 + ], %) + |> line([ + -0.5760905289992633, + -0.2639900702114173 + ], %) + |> line([ + 0.39828861790105297, + 0.8036624129416385 + ], %) + |> line([-0.673848991328553, -0.918443329270668], %) + |> line([ + -0.8599152936179257, + -0.9499371022680787 + ], %) + |> line([ + 0.6285243831393765, + -0.5186557636566307 + ], %) + |> line([ + 0.3222412784832269, + 0.24621192679727177 + ], %) + |> line([ + 0.19754357911311016, + -0.7529246632397206 + ], %) + |> line([ + -0.43181570545865555, + 0.18945437402201537 + ], %) + |> line([ + 0.8714511090241797, + -0.7215844196844685 + ], %) + |> line([ + -0.3670208139314082, + 0.21201331909674526 + ], %) + |> line([ + -0.4707511307971115, + 0.4905279615419764 + ], %) + |> line([ + -0.8328324229085962, + 0.4677492878818803 + ], %) + |> line([ + -0.8111463382182231, + -0.41814807547140576 + ], %) + |> line([ + 0.03807684940941125, + 0.25664826686353326 + ], %) + |> line([ + 0.23950083339596384, + 0.43693196301855575 + ], %) + |> line([ + -0.16279444820904887, + 0.8064475707664818 + ], %) + |> line([ + -0.08972872009232558, + -0.08887625823751266 + ], %) + |> line([ + 0.9203433427102556, + -0.17343459369697545 + ], %) + |> line([ + 0.0017496234414517975, + -0.5178508316168335 + ], %) + |> line([ + 0.6206263405732759, + -0.8733399468665124 + ], %) + |> line([ + -0.7776386664456383, + 0.7602780485384968 + ], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([ + -0.13036646025917076, + 0.012051713627069693 + ], %) + |> line([ + -0.1656465612645519, + -0.20775229173765486 + ], %) + |> line([ + -0.0962723255929061, + -0.05417797659066137 + ], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([ + 0.27997950083139167, + -0.17778188444008958 + ], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([ + 0.39140760219992154, + -0.7839795272576484 + ], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([ + 0.6137667704875602, + 0.22119647516722085 + ], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([ + -0.41290485754343953, + -0.4152647361760933 + ], %) + |> line([ + 0.5169538755575687, + -0.9085567867302617 + ], %) + |> line([ + -0.6716353749059765, + -0.9605576808879026 + ], %) + |> line([ + 0.010280170930300203, + -0.37344123662342166 + ], %) + |> line([ + 0.10357375682791004, + -0.42294321030821425 + ], %) + |> line([ + 0.4520311575096987, + -0.11232675307600548 + ], %) + |> line([ + -0.8821185914380845, + -0.7155147434939819 + ], %) + |> line([0.9195487101690416, 0.2691627465297364], %) + |> line([ + 0.7098978191546745, + 0.11710004169385968 + ], %) + |> line([ + -0.37876368560819995, + 0.7106729314759084 + ], %) + |> line([ + -0.29728126898353335, + -0.06649734568328003 + ], %) + |> line([ + 0.22965781558352072, + -0.7601866432836641 + ], %) + |> line([ + -0.6356501074317229, + 0.19458425399338064 + ], %) + |> line([0.5721251777404546, 0.2888584097921527], %) + |> line([ + -0.9580409549552311, + -0.02243818192078395 + ], %) + |> line([ + 0.3299184618602866, + -0.8353726942369875 + ], %) + |> line([ + 0.7434639386755209, + -0.7919648864138378 + ], %) + |> line([0.9935751011164615, 0.9042566468497608], %) + |> line([ + -0.5035812884687294, + 0.5150967434989442 + ], %) + |> line([0.5526227215900215, 0.7612604137272441], %) + |> line([ + 0.8593271349126876, + 0.08414894953725849 + ], %) + |> line([ + -0.8181049219192864, + -0.903548131323352 + ], %) + |> line([ + 0.3165782044458305, + -0.24189274252014914 + ], %) + |> line([ + -0.44390956414045135, + -0.25912591535126905 + ], %) + |> line([ + -0.6605165911891009, + -0.40355115288839194 + ], %) + |> line([ + -0.7170489950180006, + 0.23454356079651384 + ], %) + |> line([ + -0.2568187045379722, + -0.45031188717601367 + ], %) + |> line([ + 0.6751951211858687, + -0.9709424233465593 + ], %) + |> line([ + -0.5689619842972184, + 0.5918969913790362 + ], %) + |> line([ + -0.8328324229085962, + 0.4677492878818803 + ], %) + |> line([ + -0.8111463382182231, + -0.41814807547140576 + ], %) + |> line([ + 0.03807684940941125, + 0.25664826686353326 + ], %) + |> line([ + 0.23950083339596384, + 0.43693196301855575 + ], %) + |> line([ + -0.16279444820904887, + 0.8064475707664818 + ], %) + |> line([ + -0.08972872009232558, + -0.08887625823751266 + ], %) + |> line([ + 0.9203433427102556, + -0.17343459369697545 + ], %) + |> line([ + 0.0017496234414517975, + -0.5178508316168335 + ], %) + |> line([ + 0.6206263405732759, + -0.8733399468665124 + ], %) + |> line([ + -0.7776386664456383, + 0.7602780485384968 + ], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([ + -0.13036646025917076, + 0.012051713627069693 + ], %) + |> line([ + -0.1656465612645519, + -0.20775229173765486 + ], %) + |> line([ + -0.0962723255929061, + -0.05417797659066137 + ], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([ + 0.27997950083139167, + -0.17778188444008958 + ], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([ + 0.39140760219992154, + -0.7839795272576484 + ], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([ + 0.6137667704875602, + 0.22119647516722085 + ], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([ + -0.41290485754343953, + -0.4152647361760933 + ], %) + |> line([ + 0.5169538755575687, + -0.9085567867302617 + ], %) + |> line([ + 0.6751951211858687, + -0.9709424233465593 + ], %) + |> line([ + -0.5689619842972184, + 0.5918969913790362 + ], %) + |> line([ + 0.9464450621708211, + -0.2684908127803667 + ], %) + |> line([0.5241732366617591, 0.9011437416408563], %) + |> line([ + -0.14255393713960607, + -0.5194262624564814 + ], %) + |> line([ + -0.4287123231350338, + -0.4223564528725028 + ], %) + |> line([ + -0.09316367294024519, + -0.9063127021008246 + ], %) + |> line([ + -0.2767766535558669, + 0.6816248114129131 + ], %) + |> line([ + 0.9796762495562534, + -0.0822145668330625 + ], %) + |> line([ + -0.8666513070867441, + -0.301053160242023 + ], %) + |> line([ + 0.537415656028112, + 0.020272692875002774 + ], %) + |> line([ + 0.9332396256457531, + -0.6228175690649898 + ], %) + |> line([ + 0.18052415837320734, + -0.36894384647296197 + ], %) + |> line([0.5384372634075449, 0.2377565050887107], %) + |> line([ + 0.39043436929278874, + 0.14273182483160451 + ], %) + |> line([ + 0.09782890412897283, + 0.9907667536909659 + ], %) + |> line([ + 0.5286610085921146, + -0.7924508308419256 + ], %) + |> line([ + 0.3789978184503342, + 0.12396120576838676 + ], %) + |> line([ + -0.9484912744890612, + 0.6729649846476855 + ], %) + |> line([ + 0.7451758753425153, + -0.21318737562458967 + ], %) + |> line([ + 0.1873200727251887, + -0.15961374297992448 + ], %) + |> line([ + -0.05729464924537564, + -0.5436345558508746 + ], %) + |> line([ + -0.09582414374469184, + -0.7533839681212353 + ], %) + |> line([ + -0.17254116580051848, + -0.7669113400341137 + ], %) + |> line([0.8944730032887609, 0.6093318694741408], %) + |> line([ + -0.3670208139314082, + 0.21201331909674526 + ], %) + |> line([ + -0.4707511307971115, + 0.4905279615419764 + ], %) + |> line([ + -0.8328324229085962, + 0.4677492878818803 + ], %) + |> line([ + -0.8111463382182231, + -0.41814807547140576 + ], %) + |> line([ + 0.03807684940941125, + 0.25664826686353326 + ], %) + |> line([ + 0.23950083339596384, + 0.43693196301855575 + ], %) + |> line([ + -0.16279444820904887, + 0.8064475707664818 + ], %) + |> line([ + -0.08972872009232558, + -0.08887625823751266 + ], %) + |> line([ + 0.9203433427102556, + -0.17343459369697545 + ], %) + |> line([ + 0.0017496234414517975, + -0.5178508316168335 + ], %) + |> line([ + 0.6206263405732759, + -0.8733399468665124 + ], %) + |> line([ + -0.7776386664456383, + 0.7602780485384968 + ], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([ + -0.13036646025917076, + 0.012051713627069693 + ], %) + |> line([ + -0.1656465612645519, + -0.20775229173765486 + ], %) + |> line([ + -0.0962723255929061, + -0.05417797659066137 + ], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([ + 0.27997950083139167, + -0.17778188444008958 + ], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([ + 0.39140760219992154, + -0.7839795272576484 + ], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([ + 0.6137667704875602, + 0.22119647516722085 + ], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([ + -0.41290485754343953, + -0.4152647361760933 + ], %) + |> line([ + 0.5169538755575687, + -0.9085567867302617 + ], %) + |> line([ + -0.6716353749059765, + -0.9605576808879026 + ], %) + |> line([ + 0.010280170930300203, + -0.37344123662342166 + ], %) + |> line([ + 0.10357375682791004, + -0.42294321030821425 + ], %) + |> line([ + 0.4520311575096987, + -0.11232675307600548 + ], %) + |> line([ + -0.8821185914380845, + -0.7155147434939819 + ], %) + |> line([0.9195487101690416, 0.2691627465297364], %) + |> line([ + 0.7098978191546745, + 0.11710004169385968 + ], %) + |> line([ + -0.37876368560819995, + 0.7106729314759084 + ], %) + |> line([ + -0.29728126898353335, + -0.06649734568328003 + ], %) + |> line([ + 0.22965781558352072, + -0.7601866432836641 + ], %) + |> line([ + -0.6356501074317229, + 0.19458425399338064 + ], %) + |> line([0.5721251777404546, 0.2888584097921527], %) + |> line([ + -0.9580409549552311, + -0.02243818192078395 + ], %) + |> line([ + 0.3299184618602866, + -0.8353726942369875 + ], %) + |> line([ + 0.7434639386755209, + -0.7919648864138378 + ], %) + |> line([0.9935751011164615, 0.9042566468497608], %) + |> line([ + -0.5035812884687294, + 0.5150967434989442 + ], %) + |> line([0.5526227215900215, 0.7612604137272441], %) + |> line([ + 0.8593271349126876, + 0.08414894953725849 + ], %) + |> line([ + -0.8181049219192864, + -0.903548131323352 + ], %) + |> line([ + 0.3165782044458305, + -0.24189274252014914 + ], %) + |> line([ + -0.44390956414045135, + -0.25912591535126905 + ], %) + |> line([ + -0.6605165911891009, + -0.40355115288839194 + ], %) + |> line([ + -0.7170489950180006, + 0.23454356079651384 + ], %) + |> line([ + -0.2568187045379722, + -0.45031188717601367 + ], %) + |> line([ + 0.6751951211858687, + -0.9709424233465593 + ], %) + |> line([ + -0.5689619842972184, + 0.5918969913790362 + ], %) + |> line([ + -0.8328324229085962, + 0.4677492878818803 + ], %) + |> line([ + -0.8111463382182231, + -0.41814807547140576 + ], %) + |> line([ + 0.03807684940941125, + 0.25664826686353326 + ], %) + |> line([ + 0.23950083339596384, + 0.43693196301855575 + ], %) + |> line([ + -0.16279444820904887, + 0.8064475707664818 + ], %) + |> line([ + -0.08972872009232558, + -0.08887625823751266 + ], %) + |> line([ + 0.9203433427102556, + -0.17343459369697545 + ], %) + |> line([ + 0.0017496234414517975, + -0.5178508316168335 + ], %) + |> line([ + 0.6206263405732759, + -0.8733399468665124 + ], %) + |> line([ + -0.7776386664456383, + 0.7602780485384968 + ], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([ + -0.13036646025917076, + 0.012051713627069693 + ], %) + |> line([ + -0.1656465612645519, + -0.20775229173765486 + ], %) + |> line([ + -0.0962723255929061, + -0.05417797659066137 + ], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([ + 0.27997950083139167, + -0.17778188444008958 + ], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([ + 0.39140760219992154, + -0.7839795272576484 + ], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([ + 0.6137667704875602, + 0.22119647516722085 + ], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([ + -0.3670208139314082, + 0.21201331909674526 + ], %) + |> line([ + -0.4707511307971115, + 0.4905279615419764 + ], %) + |> line([ + -0.8328324229085962, + 0.4677492878818803 + ], %) + |> line([ + -0.8111463382182231, + -0.41814807547140576 + ], %) + |> line([ + 0.03807684940941125, + 0.25664826686353326 + ], %) + |> line([ + 0.23950083339596384, + 0.43693196301855575 + ], %) + |> line([ + -0.16279444820904887, + 0.8064475707664818 + ], %) + |> line([ + -0.08972872009232558, + -0.08887625823751266 + ], %) + |> line([ + 0.9203433427102556, + -0.17343459369697545 + ], %) + |> line([ + 0.0017496234414517975, + -0.5178508316168335 + ], %) + |> line([ + 0.6206263405732759, + -0.8733399468665124 + ], %) + |> line([ + -0.7776386664456383, + 0.7602780485384968 + ], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([ + -0.13036646025917076, + 0.012051713627069693 + ], %) + |> line([ + -0.1656465612645519, + -0.20775229173765486 + ], %) + |> line([ + -0.0962723255929061, + -0.05417797659066137 + ], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([ + 0.27997950083139167, + -0.17778188444008958 + ], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([ + 0.39140760219992154, + -0.7839795272576484 + ], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([ + 0.6137667704875602, + 0.22119647516722085 + ], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([ + -0.41290485754343953, + -0.4152647361760933 + ], %) + |> line([ + 0.5169538755575687, + -0.9085567867302617 + ], %) + |> line([ + -0.6716353749059765, + -0.9605576808879026 + ], %) + |> line([ + 0.010280170930300203, + -0.37344123662342166 + ], %) + |> line([ + -0.3670208139314082, + 0.21201331909674526 + ], %) + |> line([ + -0.4707511307971115, + 0.4905279615419764 + ], %) + |> line([ + -0.8328324229085962, + 0.4677492878818803 + ], %) + |> line([ + -0.8111463382182231, + -0.41814807547140576 + ], %) + |> line([ + 0.03807684940941125, + 0.25664826686353326 + ], %) + |> line([ + 0.23950083339596384, + 0.43693196301855575 + ], %) + |> line([ + -0.16279444820904887, + 0.8064475707664818 + ], %) + |> line([ + -0.08972872009232558, + -0.08887625823751266 + ], %) + |> line([ + 0.9203433427102556, + -0.17343459369697545 + ], %) + |> line([ + 0.0017496234414517975, + -0.5178508316168335 + ], %) + |> line([ + 0.6206263405732759, + -0.8733399468665124 + ], %) + |> line([ + -0.7776386664456383, + 0.7602780485384968 + ], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([ + -0.13036646025917076, + 0.012051713627069693 + ], %) + |> line([ + -0.1656465612645519, + -0.20775229173765486 + ], %) + |> line([ + -0.0962723255929061, + -0.05417797659066137 + ], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([ + 0.27997950083139167, + -0.17778188444008958 + ], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([ + 0.39140760219992154, + -0.7839795272576484 + ], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([ + 0.6137667704875602, + 0.22119647516722085 + ], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([ + -0.41290485754343953, + -0.4152647361760933 + ], %) + |> line([ + 0.5169538755575687, + -0.9085567867302617 + ], %) + |> line([ + -0.6716353749059765, + -0.9605576808879026 + ], %) + |> line([ + 0.010280170930300203, + -0.37344123662342166 + ], %) + |> line([ + 0.10357375682791004, + -0.42294321030821425 + ], %) + |> line([ + 0.4520311575096987, + -0.11232675307600548 + ], %) + |> line([ + -0.8821185914380845, + -0.7155147434939819 + ], %) + |> line([0.9195487101690416, 0.2691627465297364], %) + |> line([ + 0.7098978191546745, + 0.11710004169385968 + ], %) + |> line([ + -0.37876368560819995, + 0.7106729314759084 + ], %) + |> line([ + -0.29728126898353335, + -0.06649734568328003 + ], %) + |> line([ + 0.22965781558352072, + -0.7601866432836641 + ], %) + |> line([ + -0.6356501074317229, + 0.19458425399338064 + ], %) + |> line([0.5721251777404546, 0.2888584097921527], %) + |> line([ + -0.9580409549552311, + -0.02243818192078395 + ], %) + |> line([ + 0.3299184618602866, + -0.8353726942369875 + ], %) + |> line([ + 0.7434639386755209, + -0.7919648864138378 + ], %) + |> line([0.9935751011164615, 0.9042566468497608], %) + |> line([ + -0.5035812884687294, + 0.5150967434989442 + ], %) + |> line([0.5526227215900215, 0.7612604137272441], %) + |> line([ + 0.8593271349126876, + 0.08414894953725849 + ], %) + |> line([ + -0.8181049219192864, + -0.903548131323352 + ], %) + |> line([ + 0.3165782044458305, + -0.24189274252014914 + ], %) + |> line([ + -0.44390956414045135, + -0.25912591535126905 + ], %) + |> line([ + -0.6605165911891009, + -0.40355115288839194 + ], %) + |> line([ + -0.7170489950180006, + 0.23454356079651384 + ], %) + |> line([ + -0.2568187045379722, + -0.45031188717601367 + ], %) + |> line([ + 0.6751951211858687, + -0.9709424233465593 + ], %) + |> line([ + -0.5689619842972184, + 0.5918969913790362 + ], %) + |> line([ + -0.8328324229085962, + 0.4677492878818803 + ], %) + |> line([ + -0.8111463382182231, + -0.41814807547140576 + ], %) + |> line([ + 0.03807684940941125, + 0.25664826686353326 + ], %) + |> line([ + 0.23950083339596384, + 0.43693196301855575 + ], %) + |> line([ + -0.16279444820904887, + 0.8064475707664818 + ], %) + |> line([ + -0.08972872009232558, + -0.08887625823751266 + ], %) + |> line([ + 0.9203433427102556, + -0.17343459369697545 + ], %) + |> line([ + 0.0017496234414517975, + -0.5178508316168335 + ], %) + |> line([ + 0.6206263405732759, + -0.8733399468665124 + ], %) + |> line([ + -0.7776386664456383, + 0.7602780485384968 + ], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([ + -0.13036646025917076, + 0.012051713627069693 + ], %) + |> line([ + -0.1656465612645519, + -0.20775229173765486 + ], %) + |> line([ + -0.0962723255929061, + -0.05417797659066137 + ], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([ + 0.27997950083139167, + -0.17778188444008958 + ], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([ + 0.39140760219992154, + -0.7839795272576484 + ], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([ + 0.6137667704875602, + 0.22119647516722085 + ], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([ + -0.41290485754343953, + -0.4152647361760933 + ], %) + |> line([ + 0.5169538755575687, + -0.9085567867302617 + ], %) + |> line([ + 0.6751951211858687, + -0.9709424233465593 + ], %) + |> line([ + -0.5689619842972184, + 0.5918969913790362 + ], %) + |> line([ + 0.9464450621708211, + -0.2684908127803667 + ], %) + |> line([0.5241732366617591, 0.9011437416408563], %) + |> line([ + -0.14255393713960607, + -0.5194262624564814 + ], %) + |> line([ + -0.4287123231350338, + -0.4223564528725028 + ], %) + |> line([ + -0.09316367294024519, + -0.9063127021008246 + ], %) + |> line([ + -0.2767766535558669, + 0.6816248114129131 + ], %) + |> line([ + 0.9796762495562534, + -0.0822145668330625 + ], %) + |> line([ + -0.8666513070867441, + -0.301053160242023 + ], %) + |> line([ + 0.537415656028112, + 0.020272692875002774 + ], %) + |> line([ + 0.9332396256457531, + -0.6228175690649898 + ], %) + |> line([ + 0.18052415837320734, + -0.36894384647296197 + ], %) + |> line([0.5384372634075449, 0.2377565050887107], %) + |> line([ + 0.39043436929278874, + 0.14273182483160451 + ], %) + |> line([ + 0.09782890412897283, + 0.9907667536909659 + ], %) + |> line([ + 0.5286610085921146, + -0.7924508308419256 + ], %) + |> line([ + 0.3789978184503342, + 0.12396120576838676 + ], %) + |> line([ + -0.9484912744890612, + 0.6729649846476855 + ], %) + |> line([ + 0.7451758753425153, + -0.21318737562458967 + ], %) + |> line([ + 0.1873200727251887, + -0.15961374297992448 + ], %) + |> line([ + -0.05729464924537564, + -0.5436345558508746 + ], %) + |> line([ + -0.09582414374469184, + -0.7533839681212353 + ], %) + |> line([ + -0.17254116580051848, + -0.7669113400341137 + ], %) + |> line([0.8944730032887609, 0.6093318694741408], %) + |> line([ + -0.3670208139314082, + 0.21201331909674526 + ], %) + |> line([ + -0.4707511307971115, + 0.4905279615419764 + ], %) + |> line([ + -0.8328324229085962, + 0.4677492878818803 + ], %) + |> line([ + -0.8111463382182231, + -0.41814807547140576 + ], %) + |> line([ + 0.03807684940941125, + 0.25664826686353326 + ], %) + |> line([ + 0.23950083339596384, + 0.43693196301855575 + ], %) + |> line([ + -0.16279444820904887, + 0.8064475707664818 + ], %) + |> line([ + -0.08972872009232558, + -0.08887625823751266 + ], %) + |> line([ + 0.9203433427102556, + -0.17343459369697545 + ], %) + |> line([ + 0.0017496234414517975, + -0.5178508316168335 + ], %) + |> line([ + 0.6206263405732759, + -0.8733399468665124 + ], %) + |> line([ + -0.7776386664456383, + 0.7602780485384968 + ], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([ + -0.13036646025917076, + 0.012051713627069693 + ], %) + |> line([ + -0.1656465612645519, + -0.20775229173765486 + ], %) + |> line([ + -0.0962723255929061, + -0.05417797659066137 + ], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([ + 0.27997950083139167, + -0.17778188444008958 + ], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([ + 0.39140760219992154, + -0.7839795272576484 + ], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([ + 0.6137667704875602, + 0.22119647516722085 + ], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([ + -0.41290485754343953, + -0.4152647361760933 + ], %) + |> line([ + 0.5169538755575687, + -0.9085567867302617 + ], %) + |> line([ + -0.6716353749059765, + -0.9605576808879026 + ], %) + |> line([ + 0.010280170930300203, + -0.37344123662342166 + ], %) + |> line([ + 0.10357375682791004, + -0.42294321030821425 + ], %) + |> line([ + 0.4520311575096987, + -0.11232675307600548 + ], %) + |> line([ + -0.8821185914380845, + -0.7155147434939819 + ], %) + |> line([0.9195487101690416, 0.2691627465297364], %) + |> line([ + 0.7098978191546745, + 0.11710004169385968 + ], %) + |> line([ + -0.37876368560819995, + 0.7106729314759084 + ], %) + |> line([ + -0.29728126898353335, + -0.06649734568328003 + ], %) + |> line([ + 0.22965781558352072, + -0.7601866432836641 + ], %) + |> line([ + -0.6356501074317229, + 0.19458425399338064 + ], %) + |> line([0.5721251777404546, 0.2888584097921527], %) + |> line([ + -0.9580409549552311, + -0.02243818192078395 + ], %) + |> line([ + 0.3299184618602866, + -0.8353726942369875 + ], %) + |> line([ + 0.7434639386755209, + -0.7919648864138378 + ], %) + |> line([0.9935751011164615, 0.9042566468497608], %) + |> line([ + -0.5035812884687294, + 0.5150967434989442 + ], %) + |> line([0.5526227215900215, 0.7612604137272441], %) + |> line([ + 0.8593271349126876, + 0.08414894953725849 + ], %) + |> line([ + -0.8181049219192864, + -0.903548131323352 + ], %) + |> line([ + 0.3165782044458305, + -0.24189274252014914 + ], %) + |> line([ + -0.44390956414045135, + -0.25912591535126905 + ], %) + |> line([ + -0.6605165911891009, + -0.40355115288839194 + ], %) + |> line([ + -0.7170489950180006, + 0.23454356079651384 + ], %) + |> line([ + -0.2568187045379722, + -0.45031188717601367 + ], %) + |> line([ + 0.6751951211858687, + -0.9709424233465593 + ], %) + |> line([ + -0.5689619842972184, + 0.5918969913790362 + ], %) + |> line([ + -0.8328324229085962, + 0.4677492878818803 + ], %) + |> line([ + -0.8111463382182231, + -0.41814807547140576 + ], %) + |> line([ + 0.03807684940941125, + 0.25664826686353326 + ], %) + |> line([ + 0.23950083339596384, + 0.43693196301855575 + ], %) + |> line([ + -0.16279444820904887, + 0.8064475707664818 + ], %) + |> line([ + -0.08972872009232558, + -0.08887625823751266 + ], %) + |> line([ + 0.9203433427102556, + -0.17343459369697545 + ], %) + |> line([ + 0.0017496234414517975, + -0.5178508316168335 + ], %) + |> line([ + 0.6206263405732759, + -0.8733399468665124 + ], %) + |> line([ + -0.7776386664456383, + 0.7602780485384968 + ], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([ + -0.13036646025917076, + 0.012051713627069693 + ], %) + |> line([ + -0.1656465612645519, + -0.20775229173765486 + ], %) + |> line([ + -0.0962723255929061, + -0.05417797659066137 + ], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([ + 0.27997950083139167, + -0.17778188444008958 + ], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([ + 0.39140760219992154, + -0.7839795272576484 + ], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([ + 0.6137667704875602, + 0.22119647516722085 + ], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([ + -0.3670208139314082, + 0.21201331909674526 + ], %) + |> line([ + -0.4707511307971115, + 0.4905279615419764 + ], %) + |> line([ + -0.8328324229085962, + 0.4677492878818803 + ], %) + |> line([ + -0.8111463382182231, + -0.41814807547140576 + ], %) + |> line([ + 0.03807684940941125, + 0.25664826686353326 + ], %) + |> line([ + 0.23950083339596384, + 0.43693196301855575 + ], %) + |> line([ + -0.16279444820904887, + 0.8064475707664818 + ], %) + |> line([ + -0.08972872009232558, + -0.08887625823751266 + ], %) + |> line([ + 0.9203433427102556, + -0.17343459369697545 + ], %) + |> line([ + 0.0017496234414517975, + -0.5178508316168335 + ], %) + |> line([ + 0.6206263405732759, + -0.8733399468665124 + ], %) + |> line([ + -0.7776386664456383, + 0.7602780485384968 + ], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([ + -0.13036646025917076, + 0.012051713627069693 + ], %) + |> line([ + -0.1656465612645519, + -0.20775229173765486 + ], %) + |> line([ + -0.0962723255929061, + -0.05417797659066137 + ], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([ + 0.27997950083139167, + -0.17778188444008958 + ], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([ + 0.39140760219992154, + -0.7839795272576484 + ], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([ + 0.6137667704875602, + 0.22119647516722085 + ], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([ + -0.41290485754343953, + -0.4152647361760933 + ], %) + |> line([ + 0.5169538755575687, + -0.9085567867302617 + ], %) + |> line([ + -0.6716353749059765, + -0.9605576808879026 + ], %) + |> line([ + 0.010280170930300203, + -0.37344123662342166 + ], %) + |> line([ + 0.10357375682791004, + -0.42294321030821425 + ], %) + |> line([ + 0.4520311575096987, + -0.11232675307600548 + ], %) + |> line([ + -0.8821185914380845, + -0.7155147434939819 + ], %) + |> line([0.9195487101690416, 0.2691627465297364], %) + |> line([ + 0.7098978191546745, + 0.11710004169385968 + ], %) + |> line([ + -0.37876368560819995, + 0.7106729314759084 + ], %) + |> line([ + -0.29728126898353335, + -0.06649734568328003 + ], %) + |> line([ + 0.22965781558352072, + -0.7601866432836641 + ], %) + |> line([ + -0.6356501074317229, + 0.19458425399338064 + ], %) + |> line([0.5721251777404546, 0.2888584097921527], %) + |> line([ + -0.9580409549552311, + -0.02243818192078395 + ], %) + |> line([ + 0.3299184618602866, + -0.8353726942369875 + ], %) + |> line([ + 0.7434639386755209, + -0.7919648864138378 + ], %) + |> line([0.9935751011164615, 0.9042566468497608], %) + |> line([ + -0.5035812884687294, + 0.5150967434989442 + ], %) + |> line([0.5526227215900215, 0.7612604137272441], %) + |> line([ + 0.8593271349126876, + 0.08414894953725849 + ], %) + |> line([ + -0.8181049219192864, + -0.903548131323352 + ], %) + |> line([ + 0.3165782044458305, + -0.24189274252014914 + ], %) + |> line([ + -0.44390956414045135, + -0.25912591535126905 + ], %) + |> line([ + -0.6605165911891009, + -0.40355115288839194 + ], %) + |> line([ + -0.7170489950180006, + 0.23454356079651384 + ], %) + |> line([ + -0.2568187045379722, + -0.45031188717601367 + ], %) + |> line([ + 0.6751951211858687, + -0.9709424233465593 + ], %) + |> line([ + -0.5689619842972184, + 0.5918969913790362 + ], %) + |> line([ + -0.8328324229085962, + 0.4677492878818803 + ], %) + |> line([ + -0.8111463382182231, + -0.41814807547140576 + ], %) + |> line([ + 0.03807684940941125, + 0.25664826686353326 + ], %) + |> line([ + 0.23950083339596384, + 0.43693196301855575 + ], %) + |> line([ + -0.16279444820904887, + 0.8064475707664818 + ], %) + |> line([ + -0.08972872009232558, + -0.08887625823751266 + ], %) + |> line([ + 0.9203433427102556, + -0.17343459369697545 + ], %) + |> line([ + 0.0017496234414517975, + -0.5178508316168335 + ], %) + |> line([ + 0.6206263405732759, + -0.8733399468665124 + ], %) + |> line([ + -0.7776386664456383, + 0.7602780485384968 + ], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([ + -0.13036646025917076, + 0.012051713627069693 + ], %) + |> line([ + -0.1656465612645519, + -0.20775229173765486 + ], %) + |> line([ + -0.0962723255929061, + -0.05417797659066137 + ], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([ + 0.27997950083139167, + -0.17778188444008958 + ], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([ + 0.39140760219992154, + -0.7839795272576484 + ], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([ + 0.6137667704875602, + 0.22119647516722085 + ], %) + |> line([ + -0.09582414374469184, + -0.7533839681212353 + ], %) + |> line([ + -0.17254116580051848, + -0.7669113400341137 + ], %) + |> line([0.8944730032887609, 0.6093318694741408], %) + |> line([ + -0.41290485754343953, + -0.4152647361760933 + ], %) + |> line([ + 0.5169538755575687, + -0.9085567867302617 + ], %) + |> line([ + 0.6751951211858687, + -0.9709424233465593 + ], %) + |> line([ + -0.5689619842972184, + 0.5918969913790362 + ], %) + |> line([ + 0.9464450621708211, + -0.2684908127803667 + ], %) + |> line([0.5241732366617591, 0.9011437416408563], %) + |> line([ + -0.14255393713960607, + -0.5194262624564814 + ], %) + |> line([ + -0.4287123231350338, + -0.4223564528725028 + ], %) + |> line([ + -0.09316367294024519, + -0.9063127021008246 + ], %) + |> line([ + -0.2767766535558669, + 0.6816248114129131 + ], %) + |> line([ + 0.9796762495562534, + -0.0822145668330625 + ], %) + |> line([ + -0.8666513070867441, + -0.301053160242023 + ], %) + |> line([ + 0.537415656028112, + 0.020272692875002774 + ], %) + |> line([ + 0.9332396256457531, + -0.6228175690649898 + ], %) + |> line([ + 0.18052415837320734, + -0.36894384647296197 + ], %) + |> line([0.5384372634075449, 0.2377565050887107], %) + |> line([ + 0.39043436929278874, + 0.14273182483160451 + ], %) + |> line([ + 0.09782890412897283, + 0.9907667536909659 + ], %) + |> line([ + 0.5286610085921146, + -0.7924508308419256 + ], %) + |> line([ + 0.3789978184503342, + 0.12396120576838676 + ], %) + |> line([ + -0.9484912744890612, + 0.6729649846476855 + ], %) + |> line([ + 0.7451758753425153, + -0.21318737562458967 + ], %) + |> line([ + 0.1873200727251887, + -0.15961374297992448 + ], %) + |> line([ + -0.05729464924537564, + -0.5436345558508746 + ], %) + |> line([ + -0.09582414374469184, + -0.7533839681212353 + ], %) + |> line([ + -0.17254116580051848, + -0.7669113400341137 + ], %) + |> line([0.8944730032887609, 0.6093318694741408], %) + |> line([ + -0.6238548626325471, + 0.4053626746020169 + ], %) + |> line([ + 0.1379445992766417, + -0.47871087958516045 + ], %) + |> line([ + -0.9516767113283946, + 0.8619900618578948 + ], %) + |> line([0.9398732950992088, 0.6326239915683629], %) + |> line([ + -0.8631974445502164, + 0.016153555523963137 + ], %) + |> line([ + 0.19167797120152907, + -0.4916414381703984 + ], %) + |> line([ + -0.8644261221501586, + -0.11434763886359756 + ], %) + |> line([ + -0.029081958413378572, + -0.5214138808318329 + ], %) + |> line([ + -0.8713091851579695, + 0.7866284950967315 + ], %) + |> line([0.884342023093545, -0.1825407002568431], %) + |> line([ + -0.6978385295364686, + 0.0440574328736949 + ], %) + |> line([ + -0.48055049324331556, + -0.028546347149214002 + ], %) + |> line([ + 0.41283517382864776, + -0.44938038251347323 + ], %) + |> line([0.7911399832501751, 0.893446368526005], %) + |> line([ + 0.6507434699009087, + -0.6890023920962012 + ], %) + |> line([ + 0.10489019777253028, + -0.5467450997193952 + ], %) + |> line([ + -0.5760905289992633, + -0.2639900702114173 + ], %) + |> line([ + 0.39828861790105297, + 0.8036624129416385 + ], %) + |> line([-0.673848991328553, -0.918443329270668], %) + |> line([ + -0.8599152936179257, + -0.9499371022680787 + ], %) + |> line([ + 0.6285243831393765, + -0.5186557636566307 + ], %) + |> line([ + 0.3222412784832269, + 0.24621192679727177 + ], %) + |> line([ + 0.19754357911311016, + -0.7529246632397206 + ], %) + |> line([ + -0.43181570545865555, + 0.18945437402201537 + ], %) + |> line([ + 0.8714511090241797, + -0.7215844196844685 + ], %) + |> close(%) + |> extrude(5, %) diff --git a/src/wasm-lib/kcl/tests/mike_stress_test/ops.snap b/src/wasm-lib/kcl/tests/mike_stress_test/ops.snap new file mode 100644 index 000000000..e31c958f5 --- /dev/null +++ b/src/wasm-lib/kcl/tests/mike_stress_test/ops.snap @@ -0,0 +1,52 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed mike_stress_test.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 24, + 28, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 10, + 29, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 74110, + 74111, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 74113, + 74114, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 74102, + 74115, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/mike_stress_test/program_memory.snap b/src/wasm-lib/kcl/tests/mike_stress_test/program_memory.snap new file mode 100644 index 000000000..b3f22ceb5 --- /dev/null +++ b/src/wasm-lib/kcl/tests/mike_stress_test/program_memory.snap @@ -0,0 +1,31146 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing mike_stress_test.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "part001": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 70, + 142, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 148, + 219, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 225, + 296, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 302, + 375, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 381, + 453, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 459, + 531, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 537, + 609, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 615, + 689, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 695, + 767, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 773, + 847, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 853, + 924, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 930, + 1001, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1007, + 1056, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1062, + 1136, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1142, + 1215, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1221, + 1294, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1300, + 1348, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1354, + 1427, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1433, + 1481, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1487, + 1559, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1565, + 1614, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1620, + 1691, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1697, + 1746, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1752, + 1825, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1831, + 1902, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1908, + 1980, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1986, + 2060, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2066, + 2139, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2145, + 2217, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2223, + 2295, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2301, + 2350, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2356, + 2427, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2433, + 2505, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2511, + 2585, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2591, + 2663, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2669, + 2741, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2747, + 2796, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2802, + 2875, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2881, + 2952, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 2958, + 3029, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3035, + 3084, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3090, + 3161, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3167, + 3216, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3222, + 3293, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3299, + 3370, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3376, + 3448, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3454, + 3528, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3534, + 3607, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3613, + 3685, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3691, + 3764, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3770, + 3841, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3847, + 3918, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 3924, + 3995, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4001, + 4074, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4080, + 4152, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4158, + 4230, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4236, + 4308, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4314, + 4388, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4394, + 4466, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4472, + 4546, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4552, + 4623, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4629, + 4700, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4706, + 4755, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4761, + 4835, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4841, + 4914, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4920, + 4993, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 4999, + 5047, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5053, + 5126, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5132, + 5180, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5186, + 5258, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5264, + 5313, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5319, + 5390, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5396, + 5445, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5451, + 5524, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5530, + 5601, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5607, + 5678, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5684, + 5755, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5761, + 5832, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5838, + 5887, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5893, + 5966, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 5972, + 6044, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6050, + 6123, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6129, + 6200, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6206, + 6277, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6283, + 6354, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6360, + 6431, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6437, + 6508, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6514, + 6587, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6593, + 6642, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6648, + 6720, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6726, + 6797, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6803, + 6874, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6880, + 6951, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 6957, + 7028, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7034, + 7106, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7112, + 7184, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7190, + 7263, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7269, + 7342, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7348, + 7421, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7427, + 7476, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7482, + 7554, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7560, + 7631, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7637, + 7708, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7714, + 7787, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7793, + 7865, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7871, + 7943, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 7949, + 8021, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8027, + 8101, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8107, + 8179, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8185, + 8259, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8265, + 8336, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8342, + 8413, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8419, + 8468, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8474, + 8548, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8554, + 8627, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8633, + 8706, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8712, + 8760, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8766, + 8839, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8845, + 8893, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8899, + 8971, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 8977, + 9026, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9032, + 9103, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9109, + 9158, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9164, + 9237, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9243, + 9314, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9320, + 9392, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9398, + 9472, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9478, + 9551, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9557, + 9629, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9635, + 9707, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9713, + 9762, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9768, + 9839, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9845, + 9917, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 9923, + 9997, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10003, + 10075, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10081, + 10153, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10159, + 10208, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10214, + 10287, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10293, + 10364, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10370, + 10441, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10447, + 10496, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10502, + 10573, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10579, + 10628, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10634, + 10705, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10711, + 10782, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10788, + 10860, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10866, + 10940, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 10946, + 11019, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11025, + 11097, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11103, + 11176, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11182, + 11253, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11259, + 11330, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11336, + 11407, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11413, + 11486, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11492, + 11564, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11570, + 11642, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11648, + 11720, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11726, + 11800, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11806, + 11878, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11884, + 11958, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 11964, + 12035, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12041, + 12112, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12118, + 12167, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12173, + 12247, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12253, + 12326, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12332, + 12405, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12411, + 12459, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12465, + 12538, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12544, + 12592, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12598, + 12670, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12676, + 12725, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12731, + 12802, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12808, + 12857, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12863, + 12935, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 12941, + 13012, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13018, + 13089, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13095, + 13168, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13174, + 13246, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13252, + 13324, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13330, + 13402, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13408, + 13482, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13488, + 13560, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13566, + 13640, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13646, + 13717, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13723, + 13794, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13800, + 13849, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13855, + 13929, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 13935, + 14008, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14014, + 14087, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14093, + 14141, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14147, + 14220, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14226, + 14274, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14280, + 14352, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14358, + 14407, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14413, + 14484, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14490, + 14539, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14545, + 14618, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14624, + 14695, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14701, + 14773, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14779, + 14853, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14859, + 14931, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 14937, + 15008, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15014, + 15085, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15091, + 15164, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15170, + 15242, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15248, + 15320, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15326, + 15398, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15404, + 15478, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15484, + 15556, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15562, + 15636, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15642, + 15713, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15719, + 15790, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15796, + 15845, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15851, + 15925, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 15931, + 16004, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 16010, + 16083, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 16089, + 16137, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 16143, + 16216, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 16222, + 16270, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 16276, + 16348, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 16354, + 16403, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 16409, + 16480, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 16486, + 16535, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 16541, + 16614, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 16620, + 16691, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 16697, + 16769, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 16775, + 16849, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 16855, + 16928, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 16934, + 17006, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 17012, + 17084, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 17090, + 17139, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 17145, + 17216, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 17222, + 17294, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 17300, + 17374, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 17380, + 17452, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 17458, + 17530, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 17536, + 17585, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 17591, + 17664, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 17670, + 17741, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 17747, + 17818, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 17824, + 17873, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 17879, + 17950, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 17956, + 18005, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 18011, + 18082, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 18088, + 18159, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 18165, + 18237, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 18243, + 18317, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 18323, + 18396, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 18402, + 18474, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 18480, + 18553, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 18559, + 18630, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 18636, + 18707, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 18713, + 18784, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 18790, + 18863, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 18869, + 18941, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 18947, + 19019, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 19025, + 19097, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 19103, + 19177, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 19183, + 19255, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 19261, + 19335, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 19341, + 19412, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 19418, + 19489, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 19495, + 19544, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 19550, + 19624, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 19630, + 19703, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 19709, + 19782, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 19788, + 19836, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 19842, + 19915, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 19921, + 19969, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 19975, + 20047, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 20053, + 20102, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 20108, + 20179, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 20185, + 20234, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 20240, + 20313, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 20319, + 20390, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 20396, + 20467, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 20473, + 20544, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 20550, + 20621, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 20627, + 20676, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 20682, + 20755, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 20761, + 20833, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 20839, + 20912, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 20918, + 20989, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 20995, + 21066, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 21072, + 21143, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 21149, + 21220, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 21226, + 21297, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 21303, + 21376, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 21382, + 21431, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 21437, + 21509, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 21515, + 21586, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 21592, + 21663, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 21669, + 21740, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 21746, + 21817, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 21823, + 21895, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 21901, + 21973, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 21979, + 22052, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 22058, + 22131, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 22137, + 22210, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 22216, + 22265, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 22271, + 22343, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 22349, + 22420, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 22426, + 22497, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 22503, + 22576, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 22582, + 22654, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 22660, + 22732, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 22738, + 22810, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 22816, + 22890, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 22896, + 22968, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 22974, + 23048, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 23054, + 23125, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 23131, + 23202, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 23208, + 23257, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 23263, + 23337, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 23343, + 23416, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 23422, + 23495, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 23501, + 23549, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 23555, + 23628, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 23634, + 23682, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 23688, + 23760, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 23766, + 23815, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 23821, + 23892, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 23898, + 23947, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 23953, + 24026, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 24032, + 24103, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 24109, + 24181, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 24187, + 24261, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 24267, + 24340, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 24346, + 24418, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 24424, + 24496, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 24502, + 24551, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 24557, + 24628, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 24634, + 24706, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 24712, + 24786, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 24792, + 24864, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 24870, + 24942, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 24948, + 24997, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 25003, + 25076, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 25082, + 25153, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 25159, + 25230, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 25236, + 25285, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 25291, + 25362, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 25368, + 25417, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 25423, + 25494, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 25500, + 25571, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 25577, + 25649, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 25655, + 25729, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 25735, + 25808, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 25814, + 25886, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 25892, + 25965, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 25971, + 26042, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 26048, + 26119, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 26125, + 26196, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 26202, + 26275, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 26281, + 26353, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 26359, + 26431, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 26437, + 26509, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 26515, + 26589, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 26595, + 26667, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 26673, + 26747, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 26753, + 26824, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 26830, + 26901, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 26907, + 26956, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 26962, + 27036, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 27042, + 27115, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 27121, + 27194, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 27200, + 27248, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 27254, + 27327, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 27333, + 27381, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 27387, + 27459, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 27465, + 27514, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 27520, + 27591, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 27597, + 27646, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 27652, + 27724, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 27730, + 27801, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 27807, + 27878, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 27884, + 27957, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 27963, + 28035, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 28041, + 28113, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 28119, + 28191, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 28197, + 28271, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 28277, + 28349, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 28355, + 28429, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 28435, + 28506, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 28512, + 28583, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 28589, + 28638, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 28644, + 28718, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 28724, + 28797, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 28803, + 28876, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 28882, + 28930, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 28936, + 29009, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 29015, + 29063, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 29069, + 29141, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 29147, + 29196, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 29202, + 29273, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 29279, + 29328, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 29334, + 29407, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 29413, + 29484, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 29490, + 29562, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 29568, + 29642, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 29648, + 29721, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 29727, + 29799, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 29805, + 29877, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 29883, + 29932, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 29938, + 30009, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 30015, + 30087, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 30093, + 30167, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 30173, + 30245, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 30251, + 30323, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 30329, + 30378, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 30384, + 30457, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 30463, + 30534, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 30540, + 30611, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 30617, + 30666, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 30672, + 30743, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 30749, + 30798, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 30804, + 30875, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 30881, + 30952, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 30958, + 31030, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 31036, + 31110, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 31116, + 31189, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 31195, + 31267, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 31273, + 31346, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 31352, + 31423, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 31429, + 31500, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 31506, + 31577, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 31583, + 31656, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 31662, + 31734, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 31740, + 31812, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 31818, + 31890, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 31896, + 31970, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 31976, + 32048, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 32054, + 32128, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 32134, + 32205, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 32211, + 32282, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 32288, + 32337, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 32343, + 32417, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 32423, + 32496, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 32502, + 32575, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 32581, + 32629, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 32635, + 32708, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 32714, + 32762, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 32768, + 32840, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 32846, + 32895, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 32901, + 32972, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 32978, + 33051, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 33057, + 33130, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 33136, + 33185, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 33191, + 33264, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 33270, + 33341, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 33347, + 33418, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 33424, + 33495, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 33501, + 33572, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 33578, + 33627, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 33633, + 33706, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 33712, + 33784, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 33790, + 33863, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 33869, + 33940, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 33946, + 34017, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 34023, + 34094, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 34100, + 34171, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 34177, + 34248, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 34254, + 34327, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 34333, + 34382, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 34388, + 34460, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 34466, + 34537, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 34543, + 34614, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 34620, + 34691, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 34697, + 34768, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 34774, + 34846, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 34852, + 34924, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 34930, + 35003, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 35009, + 35082, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 35088, + 35161, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 35167, + 35216, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 35222, + 35293, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 35299, + 35371, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 35377, + 35448, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 35454, + 35503, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 35509, + 35582, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 35588, + 35660, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 35666, + 35739, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 35745, + 35819, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 35825, + 35896, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 35902, + 35951, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 35957, + 36028, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 36034, + 36109, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 36115, + 36188, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 36194, + 36242, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 36248, + 36319, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 36325, + 36397, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 36403, + 36475, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 36481, + 36552, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 36558, + 36607, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 36613, + 36685, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 36691, + 36762, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 36768, + 36839, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 36845, + 36917, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 36923, + 36996, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 37002, + 37073, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 37079, + 37151, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 37157, + 37228, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 37234, + 37305, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 37311, + 37384, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 37390, + 37462, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 37468, + 37540, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 37546, + 37618, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 37624, + 37698, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 37704, + 37776, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 37782, + 37856, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 37862, + 37933, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 37939, + 38010, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 38016, + 38065, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 38071, + 38145, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 38151, + 38224, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 38230, + 38303, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 38309, + 38357, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 38363, + 38436, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 38442, + 38490, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 38496, + 38568, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 38574, + 38623, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 38629, + 38700, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 38706, + 38755, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 38761, + 38834, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 38840, + 38911, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 38917, + 38989, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 38995, + 39069, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 39075, + 39148, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 39154, + 39226, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 39232, + 39304, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 39310, + 39359, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 39365, + 39436, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 39442, + 39514, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 39520, + 39594, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 39600, + 39672, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 39678, + 39750, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 39756, + 39805, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 39811, + 39884, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 39890, + 39961, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 39967, + 40038, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 40044, + 40093, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 40099, + 40170, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 40176, + 40225, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 40231, + 40302, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 40308, + 40379, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 40385, + 40457, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 40463, + 40537, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 40543, + 40616, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 40622, + 40694, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 40700, + 40773, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 40779, + 40850, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 40856, + 40927, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 40933, + 41004, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 41010, + 41083, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 41089, + 41161, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 41167, + 41239, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 41245, + 41317, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 41323, + 41397, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 41403, + 41475, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 41481, + 41555, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 41561, + 41632, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 41638, + 41709, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 41715, + 41764, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 41770, + 41844, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 41850, + 41923, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 41929, + 42002, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 42008, + 42056, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 42062, + 42135, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 42141, + 42189, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 42195, + 42267, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 42273, + 42322, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 42328, + 42399, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 42405, + 42454, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 42460, + 42533, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 42539, + 42610, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 42616, + 42687, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 42693, + 42764, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 42770, + 42841, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 42847, + 42896, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 42902, + 42975, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 42981, + 43053, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 43059, + 43132, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 43138, + 43209, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 43215, + 43286, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 43292, + 43363, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 43369, + 43440, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 43446, + 43517, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 43523, + 43596, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 43602, + 43651, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 43657, + 43729, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 43735, + 43806, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 43812, + 43883, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 43889, + 43960, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 43966, + 44037, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 44043, + 44115, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 44121, + 44193, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 44199, + 44272, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 44278, + 44351, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 44357, + 44430, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 44436, + 44485, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 44491, + 44563, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 44569, + 44640, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 44646, + 44717, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 44723, + 44796, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 44802, + 44874, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 44880, + 44952, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 44958, + 45030, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 45036, + 45110, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 45116, + 45188, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 45194, + 45268, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 45274, + 45345, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 45351, + 45422, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 45428, + 45477, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 45483, + 45557, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 45563, + 45636, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 45642, + 45715, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 45721, + 45769, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 45775, + 45848, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 45854, + 45902, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 45908, + 45980, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 45986, + 46035, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 46041, + 46112, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 46118, + 46167, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 46173, + 46246, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 46252, + 46323, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 46329, + 46401, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 46407, + 46481, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 46487, + 46560, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 46566, + 46638, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 46644, + 46716, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 46722, + 46771, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 46777, + 46848, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 46854, + 46926, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 46932, + 47006, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 47012, + 47084, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 47090, + 47162, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 47168, + 47217, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 47223, + 47296, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 47302, + 47373, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 47379, + 47450, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 47456, + 47505, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 47511, + 47582, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 47588, + 47637, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 47643, + 47714, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 47720, + 47791, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 47797, + 47869, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 47875, + 47949, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 47955, + 48028, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 48034, + 48106, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 48112, + 48185, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 48191, + 48262, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 48268, + 48339, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 48345, + 48416, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 48422, + 48495, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 48501, + 48573, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 48579, + 48651, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 48657, + 48729, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 48735, + 48809, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 48815, + 48887, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 48893, + 48967, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 48973, + 49044, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 49050, + 49121, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 49127, + 49176, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 49182, + 49256, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 49262, + 49335, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 49341, + 49414, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 49420, + 49468, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 49474, + 49547, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 49553, + 49601, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 49607, + 49679, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 49685, + 49734, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 49740, + 49811, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 49817, + 49866, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 49872, + 49944, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 49950, + 50021, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 50027, + 50098, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 50104, + 50177, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 50183, + 50255, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 50261, + 50333, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 50339, + 50411, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 50417, + 50491, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 50497, + 50569, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 50575, + 50649, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 50655, + 50726, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 50732, + 50803, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 50809, + 50858, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 50864, + 50938, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 50944, + 51017, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 51023, + 51096, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 51102, + 51150, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 51156, + 51229, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 51235, + 51283, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 51289, + 51361, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 51367, + 51416, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 51422, + 51493, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 51499, + 51548, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 51554, + 51627, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 51633, + 51704, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 51710, + 51782, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 51788, + 51862, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 51868, + 51940, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 51946, + 52017, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 52023, + 52094, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 52100, + 52173, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 52179, + 52251, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 52257, + 52329, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 52335, + 52407, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 52413, + 52487, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 52493, + 52565, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 52571, + 52645, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 52651, + 52722, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 52728, + 52799, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 52805, + 52854, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 52860, + 52934, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 52940, + 53013, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 53019, + 53092, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 53098, + 53146, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 53152, + 53225, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 53231, + 53279, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 53285, + 53357, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 53363, + 53412, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 53418, + 53489, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 53495, + 53544, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 53550, + 53623, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 53629, + 53700, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 53706, + 53778, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 53784, + 53858, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 53864, + 53937, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 53943, + 54015, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 54021, + 54093, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 54099, + 54148, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 54154, + 54225, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 54231, + 54303, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 54309, + 54383, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 54389, + 54461, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 54467, + 54539, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 54545, + 54594, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 54600, + 54673, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 54679, + 54750, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 54756, + 54827, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 54833, + 54882, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 54888, + 54959, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 54965, + 55014, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 55020, + 55091, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 55097, + 55168, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 55174, + 55246, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 55252, + 55326, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 55332, + 55405, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 55411, + 55483, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 55489, + 55562, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 55568, + 55639, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 55645, + 55716, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 55722, + 55793, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 55799, + 55872, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 55878, + 55950, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 55956, + 56028, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 56034, + 56106, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 56112, + 56186, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 56192, + 56264, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 56270, + 56344, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 56350, + 56421, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 56427, + 56498, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 56504, + 56553, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 56559, + 56633, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 56639, + 56712, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 56718, + 56791, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 56797, + 56845, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 56851, + 56924, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 56930, + 56978, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 56984, + 57056, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 57062, + 57111, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 57117, + 57188, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 57194, + 57243, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 57249, + 57322, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 57328, + 57399, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 57405, + 57476, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 57482, + 57553, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 57559, + 57630, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 57636, + 57685, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 57691, + 57764, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 57770, + 57842, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 57848, + 57921, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 57927, + 57998, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 58004, + 58075, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 58081, + 58152, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 58158, + 58229, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 58235, + 58306, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 58312, + 58385, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 58391, + 58440, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 58446, + 58518, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 58524, + 58595, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 58601, + 58672, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 58678, + 58749, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 58755, + 58826, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 58832, + 58904, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 58910, + 58982, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 58988, + 59061, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 59067, + 59140, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 59146, + 59219, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 59225, + 59274, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 59280, + 59352, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 59358, + 59429, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 59435, + 59506, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 59512, + 59585, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 59591, + 59663, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 59669, + 59741, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 59747, + 59819, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 59825, + 59899, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 59905, + 59977, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 59983, + 60057, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 60063, + 60134, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 60140, + 60211, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 60217, + 60266, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 60272, + 60346, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 60352, + 60425, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 60431, + 60504, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 60510, + 60558, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 60564, + 60637, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 60643, + 60691, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 60697, + 60769, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 60775, + 60824, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 60830, + 60901, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 60907, + 60956, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 60962, + 61035, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 61041, + 61112, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 61118, + 61190, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 61196, + 61270, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 61276, + 61349, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 61355, + 61427, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 61433, + 61505, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 61511, + 61560, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 61566, + 61637, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 61643, + 61715, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 61721, + 61795, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 61801, + 61873, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 61879, + 61951, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 61957, + 62006, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 62012, + 62085, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 62091, + 62162, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 62168, + 62239, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 62245, + 62294, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 62300, + 62371, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 62377, + 62426, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 62432, + 62503, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 62509, + 62580, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 62586, + 62658, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 62664, + 62738, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 62744, + 62817, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 62823, + 62895, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 62901, + 62974, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 62980, + 63051, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 63057, + 63128, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 63134, + 63205, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 63211, + 63284, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 63290, + 63362, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 63368, + 63440, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 63446, + 63518, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 63524, + 63598, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 63604, + 63676, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 63682, + 63756, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 63762, + 63833, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 63839, + 63910, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 63916, + 63965, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 63971, + 64045, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 64051, + 64124, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 64130, + 64203, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 64209, + 64257, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 64263, + 64336, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 64342, + 64390, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 64396, + 64468, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 64474, + 64523, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 64529, + 64600, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 64606, + 64655, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 64661, + 64733, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 64739, + 64810, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 64816, + 64887, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 64893, + 64966, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 64972, + 65044, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 65050, + 65122, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 65128, + 65200, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 65206, + 65280, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 65286, + 65358, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 65364, + 65438, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 65444, + 65515, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 65521, + 65592, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 65598, + 65647, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 65653, + 65727, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 65733, + 65806, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 65812, + 65885, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 65891, + 65939, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 65945, + 66018, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66024, + 66072, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66078, + 66150, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66156, + 66205, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66211, + 66282, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66288, + 66337, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66343, + 66416, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66422, + 66493, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66499, + 66571, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66577, + 66651, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66657, + 66730, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66736, + 66808, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66814, + 66886, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66892, + 66941, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66947, + 67018, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 67024, + 67096, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 67102, + 67176, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 67182, + 67254, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 67260, + 67332, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 67338, + 67387, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 67393, + 67466, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 67472, + 67543, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 67549, + 67620, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 67626, + 67675, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 67681, + 67752, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 67758, + 67807, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 67813, + 67884, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 67890, + 67961, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 67967, + 68039, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 68045, + 68119, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 68125, + 68198, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 68204, + 68276, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 68282, + 68355, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 68361, + 68432, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 68438, + 68509, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 68515, + 68586, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 68592, + 68665, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 68671, + 68743, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 68749, + 68821, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 68827, + 68899, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 68905, + 68979, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 68985, + 69057, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 69063, + 69137, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 69143, + 69214, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 69220, + 69291, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 69297, + 69346, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 69352, + 69426, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 69432, + 69505, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 69511, + 69584, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 69590, + 69638, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 69644, + 69717, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 69723, + 69771, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 69777, + 69849, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 69855, + 69904, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 69910, + 69981, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 69987, + 70060, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 70066, + 70139, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 70145, + 70194, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 70200, + 70273, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 70279, + 70350, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 70356, + 70427, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 70433, + 70504, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 70510, + 70581, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 70587, + 70636, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 70642, + 70715, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 70721, + 70793, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 70799, + 70872, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 70878, + 70949, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 70955, + 71026, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 71032, + 71103, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 71109, + 71180, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 71186, + 71257, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 71263, + 71336, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 71342, + 71391, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 71397, + 71469, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 71475, + 71546, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 71552, + 71623, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 71629, + 71700, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 71706, + 71777, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 71783, + 71855, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 71861, + 71933, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 71939, + 72012, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72018, + 72091, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72097, + 72170, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72176, + 72225, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72231, + 72302, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72308, + 72380, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72386, + 72457, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72463, + 72512, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72518, + 72591, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72597, + 72669, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72675, + 72748, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72754, + 72828, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72834, + 72905, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72911, + 72960, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 72966, + 73037, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 73043, + 73118, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 73124, + 73197, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 73203, + 73251, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 73257, + 73328, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 73334, + 73406, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 73412, + 73484, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 73490, + 73561, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 73567, + 73616, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 73622, + 73694, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 73700, + 73771, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 73777, + 73848, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 73854, + 73926, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 73932, + 74005, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 74011, + 74082, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 74088, + 74096, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 70, + 142, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + -0.367, + 0.212 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 148, + 219, + 0 + ] + }, + "from": [ + -0.367, + 0.212 + ], + "tag": null, + "to": [ + -0.8378, + 0.7025 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 225, + 296, + 0 + ] + }, + "from": [ + -0.8378, + 0.7025 + ], + "tag": null, + "to": [ + -1.6706, + 1.1703 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 302, + 375, + 0 + ] + }, + "from": [ + -1.6706, + 1.1703 + ], + "tag": null, + "to": [ + -2.4818, + 0.7521 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 381, + 453, + 0 + ] + }, + "from": [ + -2.4818, + 0.7521 + ], + "tag": null, + "to": [ + -2.4437, + 1.0088 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 459, + 531, + 0 + ] + }, + "from": [ + -2.4437, + 1.0088 + ], + "tag": null, + "to": [ + -2.2042, + 1.4457 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 537, + 609, + 0 + ] + }, + "from": [ + -2.2042, + 1.4457 + ], + "tag": null, + "to": [ + -2.367, + 2.2522 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 615, + 689, + 0 + ] + }, + "from": [ + -2.367, + 2.2522 + ], + "tag": null, + "to": [ + -2.4567, + 2.1633 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 695, + 767, + 0 + ] + }, + "from": [ + -2.4567, + 2.1633 + ], + "tag": null, + "to": [ + -1.5364, + 1.9899 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 773, + 847, + 0 + ] + }, + "from": [ + -1.5364, + 1.9899 + ], + "tag": null, + "to": [ + -1.5346, + 1.472 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 853, + 924, + 0 + ] + }, + "from": [ + -1.5346, + 1.472 + ], + "tag": null, + "to": [ + -0.914, + 0.5987 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 930, + 1001, + 0 + ] + }, + "from": [ + -0.914, + 0.5987 + ], + "tag": null, + "to": [ + -1.6916, + 1.3589 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1007, + 1056, + 0 + ] + }, + "from": [ + -1.6916, + 1.3589 + ], + "tag": null, + "to": [ + -1.1477, + 2.2039 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1062, + 1136, + 0 + ] + }, + "from": [ + -1.1477, + 2.2039 + ], + "tag": null, + "to": [ + -1.278, + 2.2159 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1142, + 1215, + 0 + ] + }, + "from": [ + -1.278, + 2.2159 + ], + "tag": null, + "to": [ + -1.4437, + 2.0082 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1221, + 1294, + 0 + ] + }, + "from": [ + -1.4437, + 2.0082 + ], + "tag": null, + "to": [ + -1.54, + 1.954 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1300, + 1348, + 0 + ] + }, + "from": [ + -1.54, + 1.954 + ], + "tag": null, + "to": [ + -0.6379, + 2.3499 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1354, + 1427, + 0 + ] + }, + "from": [ + -0.6379, + 2.3499 + ], + "tag": null, + "to": [ + -0.3579, + 2.1721 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1433, + 1481, + 0 + ] + }, + "from": [ + -0.3579, + 2.1721 + ], + "tag": null, + "to": [ + 0.1657, + 2.8664 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1487, + 1559, + 0 + ] + }, + "from": [ + 0.1657, + 2.8664 + ], + "tag": null, + "to": [ + 0.5571, + 2.0824 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1565, + 1614, + 0 + ] + }, + "from": [ + 0.5571, + 2.0824 + ], + "tag": null, + "to": [ + 1.3985, + 2.622 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1620, + 1691, + 0 + ] + }, + "from": [ + 1.3985, + 2.622 + ], + "tag": null, + "to": [ + 2.0123, + 2.8432 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1697, + 1746, + 0 + ] + }, + "from": [ + 2.0123, + 2.8432 + ], + "tag": null, + "to": [ + 2.8954, + 3.5429 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1752, + 1825, + 0 + ] + }, + "from": [ + 2.8954, + 3.5429 + ], + "tag": null, + "to": [ + 2.4824, + 3.1276 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1831, + 1902, + 0 + ] + }, + "from": [ + 2.4824, + 3.1276 + ], + "tag": null, + "to": [ + 2.9994, + 2.219 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1908, + 1980, + 0 + ] + }, + "from": [ + 2.9994, + 2.219 + ], + "tag": null, + "to": [ + 2.3278, + 1.2585 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1986, + 2060, + 0 + ] + }, + "from": [ + 2.3278, + 1.2585 + ], + "tag": null, + "to": [ + 2.338, + 0.885 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2066, + 2139, + 0 + ] + }, + "from": [ + 2.338, + 0.885 + ], + "tag": null, + "to": [ + 2.4416, + 0.4621 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2145, + 2217, + 0 + ] + }, + "from": [ + 2.4416, + 0.4621 + ], + "tag": null, + "to": [ + 2.8937, + 0.3498 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2223, + 2295, + 0 + ] + }, + "from": [ + 2.8937, + 0.3498 + ], + "tag": null, + "to": [ + 2.0115, + -0.3657 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2301, + 2350, + 0 + ] + }, + "from": [ + 2.0115, + -0.3657 + ], + "tag": null, + "to": [ + 2.9311, + -0.0966 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2356, + 2427, + 0 + ] + }, + "from": [ + 2.9311, + -0.0966 + ], + "tag": null, + "to": [ + 3.641, + 0.0205 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2433, + 2505, + 0 + ] + }, + "from": [ + 3.641, + 0.0205 + ], + "tag": null, + "to": [ + 3.2622, + 0.7312 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2511, + 2585, + 0 + ] + }, + "from": [ + 3.2622, + 0.7312 + ], + "tag": null, + "to": [ + 2.9649, + 0.6647 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2591, + 2663, + 0 + ] + }, + "from": [ + 2.9649, + 0.6647 + ], + "tag": null, + "to": [ + 3.1946, + -0.0955 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2669, + 2741, + 0 + ] + }, + "from": [ + 3.1946, + -0.0955 + ], + "tag": null, + "to": [ + 2.5589, + 0.0991 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2747, + 2796, + 0 + ] + }, + "from": [ + 2.5589, + 0.0991 + ], + "tag": null, + "to": [ + 3.1311, + 0.388 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2802, + 2875, + 0 + ] + }, + "from": [ + 3.1311, + 0.388 + ], + "tag": null, + "to": [ + 2.173, + 0.3655 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2881, + 2952, + 0 + ] + }, + "from": [ + 2.173, + 0.3655 + ], + "tag": null, + "to": [ + 2.5029, + -0.4699 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 2958, + 3029, + 0 + ] + }, + "from": [ + 2.5029, + -0.4699 + ], + "tag": null, + "to": [ + 3.2464, + -1.2618 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3035, + 3084, + 0 + ] + }, + "from": [ + 3.2464, + -1.2618 + ], + "tag": null, + "to": [ + 4.24, + -0.3576 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3090, + 3161, + 0 + ] + }, + "from": [ + 4.24, + -0.3576 + ], + "tag": null, + "to": [ + 3.7364, + 0.1575 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3167, + 3216, + 0 + ] + }, + "from": [ + 3.7364, + 0.1575 + ], + "tag": null, + "to": [ + 4.289, + 0.9188 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3222, + 3293, + 0 + ] + }, + "from": [ + 4.289, + 0.9188 + ], + "tag": null, + "to": [ + 5.1484, + 1.0029 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3299, + 3370, + 0 + ] + }, + "from": [ + 5.1484, + 1.0029 + ], + "tag": null, + "to": [ + 4.3302, + 0.0994 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3376, + 3448, + 0 + ] + }, + "from": [ + 4.3302, + 0.0994 + ], + "tag": null, + "to": [ + 4.6468, + -0.1425 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3454, + 3528, + 0 + ] + }, + "from": [ + 4.6468, + -0.1425 + ], + "tag": null, + "to": [ + 4.2029, + -0.4016 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3534, + 3607, + 0 + ] + }, + "from": [ + 4.2029, + -0.4016 + ], + "tag": null, + "to": [ + 3.5424, + -0.8052 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3613, + 3685, + 0 + ] + }, + "from": [ + 3.5424, + -0.8052 + ], + "tag": null, + "to": [ + 2.8254, + -0.5706 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3691, + 3764, + 0 + ] + }, + "from": [ + 2.8254, + -0.5706 + ], + "tag": null, + "to": [ + 2.5685, + -1.0209 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3770, + 3841, + 0 + ] + }, + "from": [ + 2.5685, + -1.0209 + ], + "tag": null, + "to": [ + 3.2437, + -1.9919 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3847, + 3918, + 0 + ] + }, + "from": [ + 3.2437, + -1.9919 + ], + "tag": null, + "to": [ + 2.6748, + -1.4 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 3924, + 3995, + 0 + ] + }, + "from": [ + 2.6748, + -1.4 + ], + "tag": null, + "to": [ + 1.8419, + -0.9322 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4001, + 4074, + 0 + ] + }, + "from": [ + 1.8419, + -0.9322 + ], + "tag": null, + "to": [ + 1.0308, + -1.3504 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4080, + 4152, + 0 + ] + }, + "from": [ + 1.0308, + -1.3504 + ], + "tag": null, + "to": [ + 1.0689, + -1.0937 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4158, + 4230, + 0 + ] + }, + "from": [ + 1.0689, + -1.0937 + ], + "tag": null, + "to": [ + 1.3084, + -0.6568 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4236, + 4308, + 0 + ] + }, + "from": [ + 1.3084, + -0.6568 + ], + "tag": null, + "to": [ + 1.1456, + 0.1496 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4314, + 4388, + 0 + ] + }, + "from": [ + 1.1456, + 0.1496 + ], + "tag": null, + "to": [ + 1.0558, + 0.0608 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4394, + 4466, + 0 + ] + }, + "from": [ + 1.0558, + 0.0608 + ], + "tag": null, + "to": [ + 1.9762, + -0.1127 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4472, + 4546, + 0 + ] + }, + "from": [ + 1.9762, + -0.1127 + ], + "tag": null, + "to": [ + 1.9779, + -0.6305 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4552, + 4623, + 0 + ] + }, + "from": [ + 1.9779, + -0.6305 + ], + "tag": null, + "to": [ + 2.5986, + -1.5039 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4629, + 4700, + 0 + ] + }, + "from": [ + 2.5986, + -1.5039 + ], + "tag": null, + "to": [ + 1.8209, + -0.7436 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4706, + 4755, + 0 + ] + }, + "from": [ + 1.8209, + -0.7436 + ], + "tag": null, + "to": [ + 2.3649, + 0.1013 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4761, + 4835, + 0 + ] + }, + "from": [ + 2.3649, + 0.1013 + ], + "tag": null, + "to": [ + 2.2345, + 0.1134 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4841, + 4914, + 0 + ] + }, + "from": [ + 2.2345, + 0.1134 + ], + "tag": null, + "to": [ + 2.0688, + -0.0944 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4920, + 4993, + 0 + ] + }, + "from": [ + 2.0688, + -0.0944 + ], + "tag": null, + "to": [ + 1.9726, + -0.1485 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 4999, + 5047, + 0 + ] + }, + "from": [ + 1.9726, + -0.1485 + ], + "tag": null, + "to": [ + 2.8747, + 0.2474 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5053, + 5126, + 0 + ] + }, + "from": [ + 2.8747, + 0.2474 + ], + "tag": null, + "to": [ + 3.1547, + 0.0696 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5132, + 5180, + 0 + ] + }, + "from": [ + 3.1547, + 0.0696 + ], + "tag": null, + "to": [ + 3.6782, + 0.7639 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5186, + 5258, + 0 + ] + }, + "from": [ + 3.6782, + 0.7639 + ], + "tag": null, + "to": [ + 4.0697, + -0.0201 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5264, + 5313, + 0 + ] + }, + "from": [ + 4.0697, + -0.0201 + ], + "tag": null, + "to": [ + 4.9111, + 0.5195 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5319, + 5390, + 0 + ] + }, + "from": [ + 4.9111, + 0.5195 + ], + "tag": null, + "to": [ + 5.5248, + 0.7407 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5396, + 5445, + 0 + ] + }, + "from": [ + 5.5248, + 0.7407 + ], + "tag": null, + "to": [ + 6.4079, + 1.4403 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5451, + 5524, + 0 + ] + }, + "from": [ + 6.4079, + 1.4403 + ], + "tag": null, + "to": [ + 5.995, + 1.0251 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5530, + 5601, + 0 + ] + }, + "from": [ + 5.995, + 1.0251 + ], + "tag": null, + "to": [ + 6.5119, + 0.1165 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5607, + 5678, + 0 + ] + }, + "from": [ + 6.5119, + 0.1165 + ], + "tag": null, + "to": [ + 7.1871, + -0.8544 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5684, + 5755, + 0 + ] + }, + "from": [ + 7.1871, + -0.8544 + ], + "tag": null, + "to": [ + 6.6182, + -0.2625 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5761, + 5832, + 0 + ] + }, + "from": [ + 6.6182, + -0.2625 + ], + "tag": null, + "to": [ + 7.5646, + -0.531 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5838, + 5887, + 0 + ] + }, + "from": [ + 7.5646, + -0.531 + ], + "tag": null, + "to": [ + 8.0888, + 0.3701 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5893, + 5966, + 0 + ] + }, + "from": [ + 8.0888, + 0.3701 + ], + "tag": null, + "to": [ + 7.9462, + -0.1493 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 5972, + 6044, + 0 + ] + }, + "from": [ + 7.9462, + -0.1493 + ], + "tag": null, + "to": [ + 7.5175, + -0.5717 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6050, + 6123, + 0 + ] + }, + "from": [ + 7.5175, + -0.5717 + ], + "tag": null, + "to": [ + 7.4244, + -1.478 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6129, + 6200, + 0 + ] + }, + "from": [ + 7.4244, + -1.478 + ], + "tag": null, + "to": [ + 7.1476, + -0.7963 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6206, + 6277, + 0 + ] + }, + "from": [ + 7.1476, + -0.7963 + ], + "tag": null, + "to": [ + 8.1273, + -0.8786 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6283, + 6354, + 0 + ] + }, + "from": [ + 8.1273, + -0.8786 + ], + "tag": null, + "to": [ + 7.2606, + -1.1796 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6360, + 6431, + 0 + ] + }, + "from": [ + 7.2606, + -1.1796 + ], + "tag": null, + "to": [ + 7.798, + -1.1593 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6437, + 6508, + 0 + ] + }, + "from": [ + 7.798, + -1.1593 + ], + "tag": null, + "to": [ + 8.7313, + -1.7822 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6514, + 6587, + 0 + ] + }, + "from": [ + 8.7313, + -1.7822 + ], + "tag": null, + "to": [ + 8.9118, + -2.1511 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6593, + 6642, + 0 + ] + }, + "from": [ + 8.9118, + -2.1511 + ], + "tag": null, + "to": [ + 9.4502, + -1.9133 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6648, + 6720, + 0 + ] + }, + "from": [ + 9.4502, + -1.9133 + ], + "tag": null, + "to": [ + 9.8407, + -1.7706 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6726, + 6797, + 0 + ] + }, + "from": [ + 9.8407, + -1.7706 + ], + "tag": null, + "to": [ + 9.9385, + -0.7798 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6803, + 6874, + 0 + ] + }, + "from": [ + 9.9385, + -0.7798 + ], + "tag": null, + "to": [ + 10.4672, + -1.5723 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6880, + 6951, + 0 + ] + }, + "from": [ + 10.4672, + -1.5723 + ], + "tag": null, + "to": [ + 10.8461, + -1.4483 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 6957, + 7028, + 0 + ] + }, + "from": [ + 10.8461, + -1.4483 + ], + "tag": null, + "to": [ + 9.8977, + -0.7754 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7034, + 7106, + 0 + ] + }, + "from": [ + 9.8977, + -0.7754 + ], + "tag": null, + "to": [ + 10.6428, + -0.9886 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7112, + 7184, + 0 + ] + }, + "from": [ + 10.6428, + -0.9886 + ], + "tag": null, + "to": [ + 10.8302, + -1.1482 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7190, + 7263, + 0 + ] + }, + "from": [ + 10.8302, + -1.1482 + ], + "tag": null, + "to": [ + 10.7729, + -1.6918 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7269, + 7342, + 0 + ] + }, + "from": [ + 10.7729, + -1.6918 + ], + "tag": null, + "to": [ + 10.677, + -2.4452 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7348, + 7421, + 0 + ] + }, + "from": [ + 10.677, + -2.4452 + ], + "tag": null, + "to": [ + 10.5045, + -3.2121 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7427, + 7476, + 0 + ] + }, + "from": [ + 10.5045, + -3.2121 + ], + "tag": null, + "to": [ + 11.399, + -2.6028 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7482, + 7554, + 0 + ] + }, + "from": [ + 11.399, + -2.6028 + ], + "tag": null, + "to": [ + 11.0319, + -2.3908 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7560, + 7631, + 0 + ] + }, + "from": [ + 11.0319, + -2.3908 + ], + "tag": null, + "to": [ + 10.5612, + -1.9002 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7637, + 7708, + 0 + ] + }, + "from": [ + 10.5612, + -1.9002 + ], + "tag": null, + "to": [ + 9.7284, + -1.4325 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7714, + 7787, + 0 + ] + }, + "from": [ + 9.7284, + -1.4325 + ], + "tag": null, + "to": [ + 8.9172, + -1.8506 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7793, + 7865, + 0 + ] + }, + "from": [ + 8.9172, + -1.8506 + ], + "tag": null, + "to": [ + 8.9553, + -1.594 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7871, + 7943, + 0 + ] + }, + "from": [ + 8.9553, + -1.594 + ], + "tag": null, + "to": [ + 9.1948, + -1.157 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 7949, + 8021, + 0 + ] + }, + "from": [ + 9.1948, + -1.157 + ], + "tag": null, + "to": [ + 9.032, + -0.3506 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8027, + 8101, + 0 + ] + }, + "from": [ + 9.032, + -0.3506 + ], + "tag": null, + "to": [ + 8.9423, + -0.4395 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8107, + 8179, + 0 + ] + }, + "from": [ + 8.9423, + -0.4395 + ], + "tag": null, + "to": [ + 9.8626, + -0.6129 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8185, + 8259, + 0 + ] + }, + "from": [ + 9.8626, + -0.6129 + ], + "tag": null, + "to": [ + 9.8644, + -1.1308 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8265, + 8336, + 0 + ] + }, + "from": [ + 9.8644, + -1.1308 + ], + "tag": null, + "to": [ + 10.485, + -2.0041 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8342, + 8413, + 0 + ] + }, + "from": [ + 10.485, + -2.0041 + ], + "tag": null, + "to": [ + 9.7074, + -1.2438 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8419, + 8468, + 0 + ] + }, + "from": [ + 9.7074, + -1.2438 + ], + "tag": null, + "to": [ + 10.2513, + -0.3989 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8474, + 8548, + 0 + ] + }, + "from": [ + 10.2513, + -0.3989 + ], + "tag": null, + "to": [ + 10.1209, + -0.3869 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8554, + 8627, + 0 + ] + }, + "from": [ + 10.1209, + -0.3869 + ], + "tag": null, + "to": [ + 9.9553, + -0.5946 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8633, + 8706, + 0 + ] + }, + "from": [ + 9.9553, + -0.5946 + ], + "tag": null, + "to": [ + 9.859, + -0.6488 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8712, + 8760, + 0 + ] + }, + "from": [ + 9.859, + -0.6488 + ], + "tag": null, + "to": [ + 10.7611, + -0.2529 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8766, + 8839, + 0 + ] + }, + "from": [ + 10.7611, + -0.2529 + ], + "tag": null, + "to": [ + 11.0411, + -0.4307 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8845, + 8893, + 0 + ] + }, + "from": [ + 11.0411, + -0.4307 + ], + "tag": null, + "to": [ + 11.5647, + 0.2637 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8899, + 8971, + 0 + ] + }, + "from": [ + 11.5647, + 0.2637 + ], + "tag": null, + "to": [ + 11.9561, + -0.5203 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 8977, + 9026, + 0 + ] + }, + "from": [ + 11.9561, + -0.5203 + ], + "tag": null, + "to": [ + 12.7975, + 0.0192 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9032, + 9103, + 0 + ] + }, + "from": [ + 12.7975, + 0.0192 + ], + "tag": null, + "to": [ + 13.4113, + 0.2404 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9109, + 9158, + 0 + ] + }, + "from": [ + 13.4113, + 0.2404 + ], + "tag": null, + "to": [ + 14.2943, + 0.9401 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9164, + 9237, + 0 + ] + }, + "from": [ + 14.2943, + 0.9401 + ], + "tag": null, + "to": [ + 13.8814, + 0.5248 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9243, + 9314, + 0 + ] + }, + "from": [ + 13.8814, + 0.5248 + ], + "tag": null, + "to": [ + 14.3984, + -0.3837 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9320, + 9392, + 0 + ] + }, + "from": [ + 14.3984, + -0.3837 + ], + "tag": null, + "to": [ + 13.7267, + -1.3443 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9398, + 9472, + 0 + ] + }, + "from": [ + 13.7267, + -1.3443 + ], + "tag": null, + "to": [ + 13.737, + -1.7177 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9478, + 9551, + 0 + ] + }, + "from": [ + 13.737, + -1.7177 + ], + "tag": null, + "to": [ + 13.8406, + -2.1407 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9557, + 9629, + 0 + ] + }, + "from": [ + 13.8406, + -2.1407 + ], + "tag": null, + "to": [ + 14.2926, + -2.253 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9635, + 9707, + 0 + ] + }, + "from": [ + 14.2926, + -2.253 + ], + "tag": null, + "to": [ + 13.4105, + -2.9685 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9713, + 9762, + 0 + ] + }, + "from": [ + 13.4105, + -2.9685 + ], + "tag": null, + "to": [ + 14.33, + -2.6993 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9768, + 9839, + 0 + ] + }, + "from": [ + 14.33, + -2.6993 + ], + "tag": null, + "to": [ + 15.0399, + -2.5822 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9845, + 9917, + 0 + ] + }, + "from": [ + 15.0399, + -2.5822 + ], + "tag": null, + "to": [ + 14.6612, + -1.8716 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 9923, + 9997, + 0 + ] + }, + "from": [ + 14.6612, + -1.8716 + ], + "tag": null, + "to": [ + 14.3639, + -1.9381 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10003, + 10075, + 0 + ] + }, + "from": [ + 14.3639, + -1.9381 + ], + "tag": null, + "to": [ + 14.5936, + -2.6983 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10081, + 10153, + 0 + ] + }, + "from": [ + 14.5936, + -2.6983 + ], + "tag": null, + "to": [ + 13.9579, + -2.5037 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10159, + 10208, + 0 + ] + }, + "from": [ + 13.9579, + -2.5037 + ], + "tag": null, + "to": [ + 14.53, + -2.2148 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10214, + 10287, + 0 + ] + }, + "from": [ + 14.53, + -2.2148 + ], + "tag": null, + "to": [ + 13.572, + -2.2372 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10293, + 10364, + 0 + ] + }, + "from": [ + 13.572, + -2.2372 + ], + "tag": null, + "to": [ + 13.9019, + -3.0726 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10370, + 10441, + 0 + ] + }, + "from": [ + 13.9019, + -3.0726 + ], + "tag": null, + "to": [ + 14.6454, + -3.8646 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10447, + 10496, + 0 + ] + }, + "from": [ + 14.6454, + -3.8646 + ], + "tag": null, + "to": [ + 15.639, + -2.9603 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10502, + 10573, + 0 + ] + }, + "from": [ + 15.639, + -2.9603 + ], + "tag": null, + "to": [ + 15.1354, + -2.4452 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10579, + 10628, + 0 + ] + }, + "from": [ + 15.1354, + -2.4452 + ], + "tag": null, + "to": [ + 15.688, + -1.684 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10634, + 10705, + 0 + ] + }, + "from": [ + 15.688, + -1.684 + ], + "tag": null, + "to": [ + 16.5473, + -1.5998 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10711, + 10782, + 0 + ] + }, + "from": [ + 16.5473, + -1.5998 + ], + "tag": null, + "to": [ + 15.7292, + -2.5034 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10788, + 10860, + 0 + ] + }, + "from": [ + 15.7292, + -2.5034 + ], + "tag": null, + "to": [ + 16.0458, + -2.7453 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10866, + 10940, + 0 + ] + }, + "from": [ + 16.0458, + -2.7453 + ], + "tag": null, + "to": [ + 15.6019, + -3.0044 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 10946, + 11019, + 0 + ] + }, + "from": [ + 15.6019, + -3.0044 + ], + "tag": null, + "to": [ + 14.9414, + -3.4079 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11025, + 11097, + 0 + ] + }, + "from": [ + 14.9414, + -3.4079 + ], + "tag": null, + "to": [ + 14.2243, + -3.1734 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11103, + 11176, + 0 + ] + }, + "from": [ + 14.2243, + -3.1734 + ], + "tag": null, + "to": [ + 13.9675, + -3.6237 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11182, + 11253, + 0 + ] + }, + "from": [ + 13.9675, + -3.6237 + ], + "tag": null, + "to": [ + 14.6427, + -4.5947 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11259, + 11330, + 0 + ] + }, + "from": [ + 14.6427, + -4.5947 + ], + "tag": null, + "to": [ + 14.0737, + -4.0028 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11336, + 11407, + 0 + ] + }, + "from": [ + 14.0737, + -4.0028 + ], + "tag": null, + "to": [ + 13.2409, + -3.535 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11413, + 11486, + 0 + ] + }, + "from": [ + 13.2409, + -3.535 + ], + "tag": null, + "to": [ + 12.4298, + -3.9532 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11492, + 11564, + 0 + ] + }, + "from": [ + 12.4298, + -3.9532 + ], + "tag": null, + "to": [ + 12.4678, + -3.6965 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11570, + 11642, + 0 + ] + }, + "from": [ + 12.4678, + -3.6965 + ], + "tag": null, + "to": [ + 12.7073, + -3.2596 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11648, + 11720, + 0 + ] + }, + "from": [ + 12.7073, + -3.2596 + ], + "tag": null, + "to": [ + 12.5445, + -2.4531 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11726, + 11800, + 0 + ] + }, + "from": [ + 12.5445, + -2.4531 + ], + "tag": null, + "to": [ + 12.4548, + -2.542 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11806, + 11878, + 0 + ] + }, + "from": [ + 12.4548, + -2.542 + ], + "tag": null, + "to": [ + 13.3752, + -2.7154 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11884, + 11958, + 0 + ] + }, + "from": [ + 13.3752, + -2.7154 + ], + "tag": null, + "to": [ + 13.3769, + -3.2333 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 11964, + 12035, + 0 + ] + }, + "from": [ + 13.3769, + -3.2333 + ], + "tag": null, + "to": [ + 13.9975, + -4.1066 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12041, + 12112, + 0 + ] + }, + "from": [ + 13.9975, + -4.1066 + ], + "tag": null, + "to": [ + 13.2199, + -3.3463 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12118, + 12167, + 0 + ] + }, + "from": [ + 13.2199, + -3.3463 + ], + "tag": null, + "to": [ + 13.7638, + -2.5014 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12173, + 12247, + 0 + ] + }, + "from": [ + 13.7638, + -2.5014 + ], + "tag": null, + "to": [ + 13.6335, + -2.4894 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12253, + 12326, + 0 + ] + }, + "from": [ + 13.6335, + -2.4894 + ], + "tag": null, + "to": [ + 13.4678, + -2.6971 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12332, + 12405, + 0 + ] + }, + "from": [ + 13.4678, + -2.6971 + ], + "tag": null, + "to": [ + 13.3715, + -2.7513 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12411, + 12459, + 0 + ] + }, + "from": [ + 13.3715, + -2.7513 + ], + "tag": null, + "to": [ + 14.2737, + -2.3554 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12465, + 12538, + 0 + ] + }, + "from": [ + 14.2737, + -2.3554 + ], + "tag": null, + "to": [ + 14.5536, + -2.5332 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12544, + 12592, + 0 + ] + }, + "from": [ + 14.5536, + -2.5332 + ], + "tag": null, + "to": [ + 15.0772, + -1.8389 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12598, + 12670, + 0 + ] + }, + "from": [ + 15.0772, + -1.8389 + ], + "tag": null, + "to": [ + 15.4686, + -2.6229 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12676, + 12725, + 0 + ] + }, + "from": [ + 15.4686, + -2.6229 + ], + "tag": null, + "to": [ + 16.31, + -2.0833 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12731, + 12802, + 0 + ] + }, + "from": [ + 16.31, + -2.0833 + ], + "tag": null, + "to": [ + 16.9238, + -1.8621 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12808, + 12857, + 0 + ] + }, + "from": [ + 16.9238, + -1.8621 + ], + "tag": null, + "to": [ + 17.8069, + -1.1624 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12863, + 12935, + 0 + ] + }, + "from": [ + 17.8069, + -1.1624 + ], + "tag": null, + "to": [ + 17.4398, + -0.9504 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12941, + 13012, + 0 + ] + }, + "from": [ + 17.4398, + -0.9504 + ], + "tag": null, + "to": [ + 16.9691, + -0.4599 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13018, + 13089, + 0 + ] + }, + "from": [ + 16.9691, + -0.4599 + ], + "tag": null, + "to": [ + 16.1363, + 0.0079 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13095, + 13168, + 0 + ] + }, + "from": [ + 16.1363, + 0.0079 + ], + "tag": null, + "to": [ + 15.3251, + -0.4103 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13174, + 13246, + 0 + ] + }, + "from": [ + 15.3251, + -0.4103 + ], + "tag": null, + "to": [ + 15.3632, + -0.1536 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13252, + 13324, + 0 + ] + }, + "from": [ + 15.3632, + -0.1536 + ], + "tag": null, + "to": [ + 15.6027, + 0.2833 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13330, + 13402, + 0 + ] + }, + "from": [ + 15.6027, + 0.2833 + ], + "tag": null, + "to": [ + 15.4399, + 1.0897 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13408, + 13482, + 0 + ] + }, + "from": [ + 15.4399, + 1.0897 + ], + "tag": null, + "to": [ + 15.3502, + 1.0009 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13488, + 13560, + 0 + ] + }, + "from": [ + 15.3502, + 1.0009 + ], + "tag": null, + "to": [ + 16.2705, + 0.8274 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13566, + 13640, + 0 + ] + }, + "from": [ + 16.2705, + 0.8274 + ], + "tag": null, + "to": [ + 16.2723, + 0.3096 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13646, + 13717, + 0 + ] + }, + "from": [ + 16.2723, + 0.3096 + ], + "tag": null, + "to": [ + 16.8929, + -0.5638 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13723, + 13794, + 0 + ] + }, + "from": [ + 16.8929, + -0.5638 + ], + "tag": null, + "to": [ + 16.1152, + 0.1965 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13800, + 13849, + 0 + ] + }, + "from": [ + 16.1152, + 0.1965 + ], + "tag": null, + "to": [ + 16.6592, + 1.0414 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13855, + 13929, + 0 + ] + }, + "from": [ + 16.6592, + 1.0414 + ], + "tag": null, + "to": [ + 16.5288, + 1.0535 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 13935, + 14008, + 0 + ] + }, + "from": [ + 16.5288, + 1.0535 + ], + "tag": null, + "to": [ + 16.3632, + 0.8457 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14014, + 14087, + 0 + ] + }, + "from": [ + 16.3632, + 0.8457 + ], + "tag": null, + "to": [ + 16.2669, + 0.7916 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14093, + 14141, + 0 + ] + }, + "from": [ + 16.2669, + 0.7916 + ], + "tag": null, + "to": [ + 17.169, + 1.1875 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14147, + 14220, + 0 + ] + }, + "from": [ + 17.169, + 1.1875 + ], + "tag": null, + "to": [ + 17.449, + 1.0097 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14226, + 14274, + 0 + ] + }, + "from": [ + 17.449, + 1.0097 + ], + "tag": null, + "to": [ + 17.9726, + 1.704 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14280, + 14352, + 0 + ] + }, + "from": [ + 17.9726, + 1.704 + ], + "tag": null, + "to": [ + 18.364, + 0.92 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14358, + 14407, + 0 + ] + }, + "from": [ + 18.364, + 0.92 + ], + "tag": null, + "to": [ + 19.2054, + 1.4596 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14413, + 14484, + 0 + ] + }, + "from": [ + 19.2054, + 1.4596 + ], + "tag": null, + "to": [ + 19.8192, + 1.6808 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14490, + 14539, + 0 + ] + }, + "from": [ + 19.8192, + 1.6808 + ], + "tag": null, + "to": [ + 20.7022, + 2.3804 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14545, + 14618, + 0 + ] + }, + "from": [ + 20.7022, + 2.3804 + ], + "tag": null, + "to": [ + 20.2893, + 1.9652 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14624, + 14695, + 0 + ] + }, + "from": [ + 20.2893, + 1.9652 + ], + "tag": null, + "to": [ + 20.8063, + 1.0566 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14701, + 14773, + 0 + ] + }, + "from": [ + 20.8063, + 1.0566 + ], + "tag": null, + "to": [ + 20.1346, + 0.0961 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14779, + 14853, + 0 + ] + }, + "from": [ + 20.1346, + 0.0961 + ], + "tag": null, + "to": [ + 20.1449, + -0.2774 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14859, + 14931, + 0 + ] + }, + "from": [ + 20.1449, + -0.2774 + ], + "tag": null, + "to": [ + 19.7779, + -0.0654 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 14937, + 15008, + 0 + ] + }, + "from": [ + 19.7779, + -0.0654 + ], + "tag": null, + "to": [ + 19.3071, + 0.4252 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15014, + 15085, + 0 + ] + }, + "from": [ + 19.3071, + 0.4252 + ], + "tag": null, + "to": [ + 18.4743, + 0.8929 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15091, + 15164, + 0 + ] + }, + "from": [ + 18.4743, + 0.8929 + ], + "tag": null, + "to": [ + 17.6632, + 0.4748 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15170, + 15242, + 0 + ] + }, + "from": [ + 17.6632, + 0.4748 + ], + "tag": null, + "to": [ + 17.7012, + 0.7314 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15248, + 15320, + 0 + ] + }, + "from": [ + 17.7012, + 0.7314 + ], + "tag": null, + "to": [ + 17.9407, + 1.1683 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15326, + 15398, + 0 + ] + }, + "from": [ + 17.9407, + 1.1683 + ], + "tag": null, + "to": [ + 17.7779, + 1.9748 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15404, + 15478, + 0 + ] + }, + "from": [ + 17.7779, + 1.9748 + ], + "tag": null, + "to": [ + 17.6882, + 1.8859 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15484, + 15556, + 0 + ] + }, + "from": [ + 17.6882, + 1.8859 + ], + "tag": null, + "to": [ + 18.6086, + 1.7125 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15562, + 15636, + 0 + ] + }, + "from": [ + 18.6086, + 1.7125 + ], + "tag": null, + "to": [ + 18.6103, + 1.1946 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15642, + 15713, + 0 + ] + }, + "from": [ + 18.6103, + 1.1946 + ], + "tag": null, + "to": [ + 19.2309, + 0.3213 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15719, + 15790, + 0 + ] + }, + "from": [ + 19.2309, + 0.3213 + ], + "tag": null, + "to": [ + 18.4533, + 1.0816 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15796, + 15845, + 0 + ] + }, + "from": [ + 18.4533, + 1.0816 + ], + "tag": null, + "to": [ + 18.9972, + 1.9265 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15851, + 15925, + 0 + ] + }, + "from": [ + 18.9972, + 1.9265 + ], + "tag": null, + "to": [ + 18.8669, + 1.9385 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 15931, + 16004, + 0 + ] + }, + "from": [ + 18.8669, + 1.9385 + ], + "tag": null, + "to": [ + 18.7012, + 1.7308 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 16010, + 16083, + 0 + ] + }, + "from": [ + 18.7012, + 1.7308 + ], + "tag": null, + "to": [ + 18.6049, + 1.6766 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 16089, + 16137, + 0 + ] + }, + "from": [ + 18.6049, + 1.6766 + ], + "tag": null, + "to": [ + 19.5071, + 2.0725 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 16143, + 16216, + 0 + ] + }, + "from": [ + 19.5071, + 2.0725 + ], + "tag": null, + "to": [ + 19.787, + 1.8947 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 16222, + 16270, + 0 + ] + }, + "from": [ + 19.787, + 1.8947 + ], + "tag": null, + "to": [ + 20.3106, + 2.589 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 16276, + 16348, + 0 + ] + }, + "from": [ + 20.3106, + 2.589 + ], + "tag": null, + "to": [ + 20.702, + 1.8051 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 16354, + 16403, + 0 + ] + }, + "from": [ + 20.702, + 1.8051 + ], + "tag": null, + "to": [ + 21.5434, + 2.3446 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 16409, + 16480, + 0 + ] + }, + "from": [ + 21.5434, + 2.3446 + ], + "tag": null, + "to": [ + 22.1572, + 2.5658 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 16486, + 16535, + 0 + ] + }, + "from": [ + 22.1572, + 2.5658 + ], + "tag": null, + "to": [ + 23.0403, + 3.2655 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 16541, + 16614, + 0 + ] + }, + "from": [ + 23.0403, + 3.2655 + ], + "tag": null, + "to": [ + 22.6274, + 2.8502 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 16620, + 16691, + 0 + ] + }, + "from": [ + 22.6274, + 2.8502 + ], + "tag": null, + "to": [ + 23.1443, + 1.9417 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 16697, + 16769, + 0 + ] + }, + "from": [ + 23.1443, + 1.9417 + ], + "tag": null, + "to": [ + 22.4727, + 0.9811 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 16775, + 16849, + 0 + ] + }, + "from": [ + 22.4727, + 0.9811 + ], + "tag": null, + "to": [ + 22.483, + 0.6077 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 16855, + 16928, + 0 + ] + }, + "from": [ + 22.483, + 0.6077 + ], + "tag": null, + "to": [ + 22.5865, + 0.1847 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 16934, + 17006, + 0 + ] + }, + "from": [ + 22.5865, + 0.1847 + ], + "tag": null, + "to": [ + 23.0386, + 0.0724 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 17012, + 17084, + 0 + ] + }, + "from": [ + 23.0386, + 0.0724 + ], + "tag": null, + "to": [ + 22.1564, + -0.6431 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 17090, + 17139, + 0 + ] + }, + "from": [ + 22.1564, + -0.6431 + ], + "tag": null, + "to": [ + 23.076, + -0.3739 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 17145, + 17216, + 0 + ] + }, + "from": [ + 23.076, + -0.3739 + ], + "tag": null, + "to": [ + 23.7859, + -0.2568 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 17222, + 17294, + 0 + ] + }, + "from": [ + 23.7859, + -0.2568 + ], + "tag": null, + "to": [ + 23.4071, + 0.4538 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 17300, + 17374, + 0 + ] + }, + "from": [ + 23.4071, + 0.4538 + ], + "tag": null, + "to": [ + 23.1098, + 0.3873 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 17380, + 17452, + 0 + ] + }, + "from": [ + 23.1098, + 0.3873 + ], + "tag": null, + "to": [ + 23.3395, + -0.3729 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 17458, + 17530, + 0 + ] + }, + "from": [ + 23.3395, + -0.3729 + ], + "tag": null, + "to": [ + 22.7038, + -0.1783 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 17536, + 17585, + 0 + ] + }, + "from": [ + 22.7038, + -0.1783 + ], + "tag": null, + "to": [ + 23.276, + 0.1106 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 17591, + 17664, + 0 + ] + }, + "from": [ + 23.276, + 0.1106 + ], + "tag": null, + "to": [ + 22.3179, + 0.0881 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 17670, + 17741, + 0 + ] + }, + "from": [ + 22.3179, + 0.0881 + ], + "tag": null, + "to": [ + 22.6479, + -0.7472 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 17747, + 17818, + 0 + ] + }, + "from": [ + 22.6479, + -0.7472 + ], + "tag": null, + "to": [ + 23.3913, + -1.5392 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 17824, + 17873, + 0 + ] + }, + "from": [ + 23.3913, + -1.5392 + ], + "tag": null, + "to": [ + 24.3849, + -0.6349 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 17879, + 17950, + 0 + ] + }, + "from": [ + 24.3849, + -0.6349 + ], + "tag": null, + "to": [ + 23.8813, + -0.1198 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 17956, + 18005, + 0 + ] + }, + "from": [ + 23.8813, + -0.1198 + ], + "tag": null, + "to": [ + 24.4339, + 0.6414 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 18011, + 18082, + 0 + ] + }, + "from": [ + 24.4339, + 0.6414 + ], + "tag": null, + "to": [ + 25.2933, + 0.7256 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 18088, + 18159, + 0 + ] + }, + "from": [ + 25.2933, + 0.7256 + ], + "tag": null, + "to": [ + 24.4752, + -0.178 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 18165, + 18237, + 0 + ] + }, + "from": [ + 24.4752, + -0.178 + ], + "tag": null, + "to": [ + 24.7917, + -0.4199 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 18243, + 18317, + 0 + ] + }, + "from": [ + 24.7917, + -0.4199 + ], + "tag": null, + "to": [ + 24.3478, + -0.679 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 18323, + 18396, + 0 + ] + }, + "from": [ + 24.3478, + -0.679 + ], + "tag": null, + "to": [ + 23.6873, + -1.0825 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 18402, + 18474, + 0 + ] + }, + "from": [ + 23.6873, + -1.0825 + ], + "tag": null, + "to": [ + 22.9703, + -0.848 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 18480, + 18553, + 0 + ] + }, + "from": [ + 22.9703, + -0.848 + ], + "tag": null, + "to": [ + 22.7134, + -1.2983 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 18559, + 18630, + 0 + ] + }, + "from": [ + 22.7134, + -1.2983 + ], + "tag": null, + "to": [ + 23.3886, + -2.2693 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 18636, + 18707, + 0 + ] + }, + "from": [ + 23.3886, + -2.2693 + ], + "tag": null, + "to": [ + 22.8197, + -1.6774 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 18713, + 18784, + 0 + ] + }, + "from": [ + 22.8197, + -1.6774 + ], + "tag": null, + "to": [ + 21.9868, + -1.2096 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 18790, + 18863, + 0 + ] + }, + "from": [ + 21.9868, + -1.2096 + ], + "tag": null, + "to": [ + 21.1757, + -1.6278 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 18869, + 18941, + 0 + ] + }, + "from": [ + 21.1757, + -1.6278 + ], + "tag": null, + "to": [ + 21.2138, + -1.3711 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 18947, + 19019, + 0 + ] + }, + "from": [ + 21.2138, + -1.3711 + ], + "tag": null, + "to": [ + 21.4533, + -0.9342 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 19025, + 19097, + 0 + ] + }, + "from": [ + 21.4533, + -0.9342 + ], + "tag": null, + "to": [ + 21.2905, + -0.1277 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 19103, + 19177, + 0 + ] + }, + "from": [ + 21.2905, + -0.1277 + ], + "tag": null, + "to": [ + 21.2007, + -0.2166 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 19183, + 19255, + 0 + ] + }, + "from": [ + 21.2007, + -0.2166 + ], + "tag": null, + "to": [ + 22.1211, + -0.39 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 19261, + 19335, + 0 + ] + }, + "from": [ + 22.1211, + -0.39 + ], + "tag": null, + "to": [ + 22.1228, + -0.9079 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 19341, + 19412, + 0 + ] + }, + "from": [ + 22.1228, + -0.9079 + ], + "tag": null, + "to": [ + 22.7435, + -1.7812 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 19418, + 19489, + 0 + ] + }, + "from": [ + 22.7435, + -1.7812 + ], + "tag": null, + "to": [ + 21.9658, + -1.021 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 19495, + 19544, + 0 + ] + }, + "from": [ + 21.9658, + -1.021 + ], + "tag": null, + "to": [ + 22.5098, + -0.176 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 19550, + 19624, + 0 + ] + }, + "from": [ + 22.5098, + -0.176 + ], + "tag": null, + "to": [ + 22.3794, + -0.164 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 19630, + 19703, + 0 + ] + }, + "from": [ + 22.3794, + -0.164 + ], + "tag": null, + "to": [ + 22.2138, + -0.3717 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 19709, + 19782, + 0 + ] + }, + "from": [ + 22.2138, + -0.3717 + ], + "tag": null, + "to": [ + 22.1175, + -0.4259 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 19788, + 19836, + 0 + ] + }, + "from": [ + 22.1175, + -0.4259 + ], + "tag": null, + "to": [ + 23.0196, + -0.03 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 19842, + 19915, + 0 + ] + }, + "from": [ + 23.0196, + -0.03 + ], + "tag": null, + "to": [ + 23.2996, + -0.2078 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 19921, + 19969, + 0 + ] + }, + "from": [ + 23.2996, + -0.2078 + ], + "tag": null, + "to": [ + 23.8232, + 0.4865 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 19975, + 20047, + 0 + ] + }, + "from": [ + 23.8232, + 0.4865 + ], + "tag": null, + "to": [ + 24.2146, + -0.2975 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 20053, + 20102, + 0 + ] + }, + "from": [ + 24.2146, + -0.2975 + ], + "tag": null, + "to": [ + 25.056, + 0.2421 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 20108, + 20179, + 0 + ] + }, + "from": [ + 25.056, + 0.2421 + ], + "tag": null, + "to": [ + 25.6697, + 0.4633 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 20185, + 20234, + 0 + ] + }, + "from": [ + 25.6697, + 0.4633 + ], + "tag": null, + "to": [ + 26.5528, + 1.163 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 20240, + 20313, + 0 + ] + }, + "from": [ + 26.5528, + 1.163 + ], + "tag": null, + "to": [ + 26.1399, + 0.7477 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 20319, + 20390, + 0 + ] + }, + "from": [ + 26.1399, + 0.7477 + ], + "tag": null, + "to": [ + 26.6568, + -0.1609 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 20396, + 20467, + 0 + ] + }, + "from": [ + 26.6568, + -0.1609 + ], + "tag": null, + "to": [ + 27.332, + -1.1318 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 20473, + 20544, + 0 + ] + }, + "from": [ + 27.332, + -1.1318 + ], + "tag": null, + "to": [ + 26.7631, + -0.5399 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 20550, + 20621, + 0 + ] + }, + "from": [ + 26.7631, + -0.5399 + ], + "tag": null, + "to": [ + 27.7095, + -0.8084 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 20627, + 20676, + 0 + ] + }, + "from": [ + 27.7095, + -0.8084 + ], + "tag": null, + "to": [ + 28.2337, + 0.0928 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 20682, + 20755, + 0 + ] + }, + "from": [ + 28.2337, + 0.0928 + ], + "tag": null, + "to": [ + 28.0911, + -0.4267 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 20761, + 20833, + 0 + ] + }, + "from": [ + 28.0911, + -0.4267 + ], + "tag": null, + "to": [ + 27.6624, + -0.849 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 20839, + 20912, + 0 + ] + }, + "from": [ + 27.6624, + -0.849 + ], + "tag": null, + "to": [ + 27.5693, + -1.7553 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 20918, + 20989, + 0 + ] + }, + "from": [ + 27.5693, + -1.7553 + ], + "tag": null, + "to": [ + 27.2925, + -1.0737 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 20995, + 21066, + 0 + ] + }, + "from": [ + 27.2925, + -1.0737 + ], + "tag": null, + "to": [ + 28.2722, + -1.1559 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 21072, + 21143, + 0 + ] + }, + "from": [ + 28.2722, + -1.1559 + ], + "tag": null, + "to": [ + 27.4055, + -1.457 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 21149, + 21220, + 0 + ] + }, + "from": [ + 27.4055, + -1.457 + ], + "tag": null, + "to": [ + 27.9429, + -1.4367 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 21226, + 21297, + 0 + ] + }, + "from": [ + 27.9429, + -1.4367 + ], + "tag": null, + "to": [ + 28.8762, + -2.0595 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 21303, + 21376, + 0 + ] + }, + "from": [ + 28.8762, + -2.0595 + ], + "tag": null, + "to": [ + 29.0567, + -2.4285 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 21382, + 21431, + 0 + ] + }, + "from": [ + 29.0567, + -2.4285 + ], + "tag": null, + "to": [ + 29.5951, + -2.1907 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 21437, + 21509, + 0 + ] + }, + "from": [ + 29.5951, + -2.1907 + ], + "tag": null, + "to": [ + 29.9856, + -2.048 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 21515, + 21586, + 0 + ] + }, + "from": [ + 29.9856, + -2.048 + ], + "tag": null, + "to": [ + 30.0834, + -1.0572 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 21592, + 21663, + 0 + ] + }, + "from": [ + 30.0834, + -1.0572 + ], + "tag": null, + "to": [ + 30.6121, + -1.8497 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 21669, + 21740, + 0 + ] + }, + "from": [ + 30.6121, + -1.8497 + ], + "tag": null, + "to": [ + 30.9911, + -1.7257 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 21746, + 21817, + 0 + ] + }, + "from": [ + 30.9911, + -1.7257 + ], + "tag": null, + "to": [ + 30.0426, + -1.0527 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 21823, + 21895, + 0 + ] + }, + "from": [ + 30.0426, + -1.0527 + ], + "tag": null, + "to": [ + 30.7877, + -1.2659 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 21901, + 21973, + 0 + ] + }, + "from": [ + 30.7877, + -1.2659 + ], + "tag": null, + "to": [ + 30.9751, + -1.4255 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 21979, + 22052, + 0 + ] + }, + "from": [ + 30.9751, + -1.4255 + ], + "tag": null, + "to": [ + 30.9178, + -1.9692 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 22058, + 22131, + 0 + ] + }, + "from": [ + 30.9178, + -1.9692 + ], + "tag": null, + "to": [ + 30.8219, + -2.7226 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 22137, + 22210, + 0 + ] + }, + "from": [ + 30.8219, + -2.7226 + ], + "tag": null, + "to": [ + 30.6494, + -3.4895 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 22216, + 22265, + 0 + ] + }, + "from": [ + 30.6494, + -3.4895 + ], + "tag": null, + "to": [ + 31.5439, + -2.8801 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 22271, + 22343, + 0 + ] + }, + "from": [ + 31.5439, + -2.8801 + ], + "tag": null, + "to": [ + 31.1769, + -2.6681 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 22349, + 22420, + 0 + ] + }, + "from": [ + 31.1769, + -2.6681 + ], + "tag": null, + "to": [ + 30.7061, + -2.1776 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 22426, + 22497, + 0 + ] + }, + "from": [ + 30.7061, + -2.1776 + ], + "tag": null, + "to": [ + 29.8733, + -1.7099 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 22503, + 22576, + 0 + ] + }, + "from": [ + 29.8733, + -1.7099 + ], + "tag": null, + "to": [ + 29.0621, + -2.128 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 22582, + 22654, + 0 + ] + }, + "from": [ + 29.0621, + -2.128 + ], + "tag": null, + "to": [ + 29.1002, + -1.8714 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 22660, + 22732, + 0 + ] + }, + "from": [ + 29.1002, + -1.8714 + ], + "tag": null, + "to": [ + 29.3397, + -1.4344 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 22738, + 22810, + 0 + ] + }, + "from": [ + 29.3397, + -1.4344 + ], + "tag": null, + "to": [ + 29.1769, + -0.628 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 22816, + 22890, + 0 + ] + }, + "from": [ + 29.1769, + -0.628 + ], + "tag": null, + "to": [ + 29.0872, + -0.7169 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 22896, + 22968, + 0 + ] + }, + "from": [ + 29.0872, + -0.7169 + ], + "tag": null, + "to": [ + 30.0075, + -0.8903 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 22974, + 23048, + 0 + ] + }, + "from": [ + 30.0075, + -0.8903 + ], + "tag": null, + "to": [ + 30.0093, + -1.4081 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 23054, + 23125, + 0 + ] + }, + "from": [ + 30.0093, + -1.4081 + ], + "tag": null, + "to": [ + 30.6299, + -2.2815 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 23131, + 23202, + 0 + ] + }, + "from": [ + 30.6299, + -2.2815 + ], + "tag": null, + "to": [ + 29.8523, + -1.5212 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 23208, + 23257, + 0 + ] + }, + "from": [ + 29.8523, + -1.5212 + ], + "tag": null, + "to": [ + 30.3962, + -0.6763 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 23263, + 23337, + 0 + ] + }, + "from": [ + 30.3962, + -0.6763 + ], + "tag": null, + "to": [ + 30.2658, + -0.6642 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 23343, + 23416, + 0 + ] + }, + "from": [ + 30.2658, + -0.6642 + ], + "tag": null, + "to": [ + 30.1002, + -0.872 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 23422, + 23495, + 0 + ] + }, + "from": [ + 30.1002, + -0.872 + ], + "tag": null, + "to": [ + 30.0039, + -0.9262 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 23501, + 23549, + 0 + ] + }, + "from": [ + 30.0039, + -0.9262 + ], + "tag": null, + "to": [ + 30.906, + -0.5303 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 23555, + 23628, + 0 + ] + }, + "from": [ + 30.906, + -0.5303 + ], + "tag": null, + "to": [ + 31.186, + -0.708 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 23634, + 23682, + 0 + ] + }, + "from": [ + 31.186, + -0.708 + ], + "tag": null, + "to": [ + 31.7096, + -0.0137 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 23688, + 23760, + 0 + ] + }, + "from": [ + 31.7096, + -0.0137 + ], + "tag": null, + "to": [ + 32.101, + -0.7977 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 23766, + 23815, + 0 + ] + }, + "from": [ + 32.101, + -0.7977 + ], + "tag": null, + "to": [ + 32.9424, + -0.2581 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 23821, + 23892, + 0 + ] + }, + "from": [ + 32.9424, + -0.2581 + ], + "tag": null, + "to": [ + 33.5562, + -0.0369 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 23898, + 23947, + 0 + ] + }, + "from": [ + 33.5562, + -0.0369 + ], + "tag": null, + "to": [ + 34.4392, + 0.6627 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 23953, + 24026, + 0 + ] + }, + "from": [ + 34.4392, + 0.6627 + ], + "tag": null, + "to": [ + 34.0263, + 0.2475 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 24032, + 24103, + 0 + ] + }, + "from": [ + 34.0263, + 0.2475 + ], + "tag": null, + "to": [ + 34.5433, + -0.6611 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 24109, + 24181, + 0 + ] + }, + "from": [ + 34.5433, + -0.6611 + ], + "tag": null, + "to": [ + 33.8716, + -1.6217 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 24187, + 24261, + 0 + ] + }, + "from": [ + 33.8716, + -1.6217 + ], + "tag": null, + "to": [ + 33.8819, + -1.9951 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 24267, + 24340, + 0 + ] + }, + "from": [ + 33.8819, + -1.9951 + ], + "tag": null, + "to": [ + 33.9855, + -2.418 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 24346, + 24418, + 0 + ] + }, + "from": [ + 33.9855, + -2.418 + ], + "tag": null, + "to": [ + 34.4375, + -2.5304 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 24424, + 24496, + 0 + ] + }, + "from": [ + 34.4375, + -2.5304 + ], + "tag": null, + "to": [ + 33.5554, + -3.2459 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 24502, + 24551, + 0 + ] + }, + "from": [ + 33.5554, + -3.2459 + ], + "tag": null, + "to": [ + 34.475, + -2.9767 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 24557, + 24628, + 0 + ] + }, + "from": [ + 34.475, + -2.9767 + ], + "tag": null, + "to": [ + 35.1849, + -2.8596 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 24634, + 24706, + 0 + ] + }, + "from": [ + 35.1849, + -2.8596 + ], + "tag": null, + "to": [ + 34.8061, + -2.1489 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 24712, + 24786, + 0 + ] + }, + "from": [ + 34.8061, + -2.1489 + ], + "tag": null, + "to": [ + 34.5088, + -2.2154 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 24792, + 24864, + 0 + ] + }, + "from": [ + 34.5088, + -2.2154 + ], + "tag": null, + "to": [ + 34.7385, + -2.9756 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 24870, + 24942, + 0 + ] + }, + "from": [ + 34.7385, + -2.9756 + ], + "tag": null, + "to": [ + 34.1028, + -2.781 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 24948, + 24997, + 0 + ] + }, + "from": [ + 34.1028, + -2.781 + ], + "tag": null, + "to": [ + 34.6749, + -2.4922 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 25003, + 25076, + 0 + ] + }, + "from": [ + 34.6749, + -2.4922 + ], + "tag": null, + "to": [ + 33.7169, + -2.5146 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 25082, + 25153, + 0 + ] + }, + "from": [ + 33.7169, + -2.5146 + ], + "tag": null, + "to": [ + 34.0468, + -3.35 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 25159, + 25230, + 0 + ] + }, + "from": [ + 34.0468, + -3.35 + ], + "tag": null, + "to": [ + 34.7903, + -4.142 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 25236, + 25285, + 0 + ] + }, + "from": [ + 34.7903, + -4.142 + ], + "tag": null, + "to": [ + 35.7839, + -3.2377 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 25291, + 25362, + 0 + ] + }, + "from": [ + 35.7839, + -3.2377 + ], + "tag": null, + "to": [ + 35.2803, + -2.7226 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 25368, + 25417, + 0 + ] + }, + "from": [ + 35.2803, + -2.7226 + ], + "tag": null, + "to": [ + 35.8329, + -1.9613 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 25423, + 25494, + 0 + ] + }, + "from": [ + 35.8329, + -1.9613 + ], + "tag": null, + "to": [ + 36.6922, + -1.8772 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 25500, + 25571, + 0 + ] + }, + "from": [ + 36.6922, + -1.8772 + ], + "tag": null, + "to": [ + 35.8741, + -2.7807 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 25577, + 25649, + 0 + ] + }, + "from": [ + 35.8741, + -2.7807 + ], + "tag": null, + "to": [ + 36.1907, + -3.0226 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 25655, + 25729, + 0 + ] + }, + "from": [ + 36.1907, + -3.0226 + ], + "tag": null, + "to": [ + 35.7468, + -3.2818 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 25735, + 25808, + 0 + ] + }, + "from": [ + 35.7468, + -3.2818 + ], + "tag": null, + "to": [ + 35.0863, + -3.6853 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 25814, + 25886, + 0 + ] + }, + "from": [ + 35.0863, + -3.6853 + ], + "tag": null, + "to": [ + 34.3692, + -3.4508 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 25892, + 25965, + 0 + ] + }, + "from": [ + 34.3692, + -3.4508 + ], + "tag": null, + "to": [ + 34.1124, + -3.9011 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 25971, + 26042, + 0 + ] + }, + "from": [ + 34.1124, + -3.9011 + ], + "tag": null, + "to": [ + 34.7876, + -4.872 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 26048, + 26119, + 0 + ] + }, + "from": [ + 34.7876, + -4.872 + ], + "tag": null, + "to": [ + 34.2186, + -4.2801 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 26125, + 26196, + 0 + ] + }, + "from": [ + 34.2186, + -4.2801 + ], + "tag": null, + "to": [ + 33.3858, + -3.8124 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 26202, + 26275, + 0 + ] + }, + "from": [ + 33.3858, + -3.8124 + ], + "tag": null, + "to": [ + 32.5747, + -4.2305 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 26281, + 26353, + 0 + ] + }, + "from": [ + 32.5747, + -4.2305 + ], + "tag": null, + "to": [ + 32.6127, + -3.9739 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 26359, + 26431, + 0 + ] + }, + "from": [ + 32.6127, + -3.9739 + ], + "tag": null, + "to": [ + 32.8522, + -3.5369 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 26437, + 26509, + 0 + ] + }, + "from": [ + 32.8522, + -3.5369 + ], + "tag": null, + "to": [ + 32.6894, + -2.7305 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 26515, + 26589, + 0 + ] + }, + "from": [ + 32.6894, + -2.7305 + ], + "tag": null, + "to": [ + 32.5997, + -2.8194 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 26595, + 26667, + 0 + ] + }, + "from": [ + 32.5997, + -2.8194 + ], + "tag": null, + "to": [ + 33.5201, + -2.9928 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 26673, + 26747, + 0 + ] + }, + "from": [ + 33.5201, + -2.9928 + ], + "tag": null, + "to": [ + 33.5218, + -3.5107 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 26753, + 26824, + 0 + ] + }, + "from": [ + 33.5218, + -3.5107 + ], + "tag": null, + "to": [ + 34.1424, + -4.384 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 26830, + 26901, + 0 + ] + }, + "from": [ + 34.1424, + -4.384 + ], + "tag": null, + "to": [ + 33.3648, + -3.6237 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 26907, + 26956, + 0 + ] + }, + "from": [ + 33.3648, + -3.6237 + ], + "tag": null, + "to": [ + 33.9087, + -2.7788 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 26962, + 27036, + 0 + ] + }, + "from": [ + 33.9087, + -2.7788 + ], + "tag": null, + "to": [ + 33.7784, + -2.7668 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 27042, + 27115, + 0 + ] + }, + "from": [ + 33.7784, + -2.7668 + ], + "tag": null, + "to": [ + 33.6127, + -2.9745 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 27121, + 27194, + 0 + ] + }, + "from": [ + 33.6127, + -2.9745 + ], + "tag": null, + "to": [ + 33.5164, + -3.0287 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 27200, + 27248, + 0 + ] + }, + "from": [ + 33.5164, + -3.0287 + ], + "tag": null, + "to": [ + 34.4186, + -2.6328 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 27254, + 27327, + 0 + ] + }, + "from": [ + 34.4186, + -2.6328 + ], + "tag": null, + "to": [ + 34.6985, + -2.8106 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 27333, + 27381, + 0 + ] + }, + "from": [ + 34.6985, + -2.8106 + ], + "tag": null, + "to": [ + 35.2221, + -2.1163 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 27387, + 27459, + 0 + ] + }, + "from": [ + 35.2221, + -2.1163 + ], + "tag": null, + "to": [ + 35.6135, + -2.9002 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 27465, + 27514, + 0 + ] + }, + "from": [ + 35.6135, + -2.9002 + ], + "tag": null, + "to": [ + 36.4549, + -2.3607 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 27520, + 27591, + 0 + ] + }, + "from": [ + 36.4549, + -2.3607 + ], + "tag": null, + "to": [ + 37.0687, + -2.1395 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 27597, + 27646, + 0 + ] + }, + "from": [ + 37.0687, + -2.1395 + ], + "tag": null, + "to": [ + 37.9518, + -1.4398 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 27652, + 27724, + 0 + ] + }, + "from": [ + 37.9518, + -1.4398 + ], + "tag": null, + "to": [ + 37.5847, + -1.2278 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 27730, + 27801, + 0 + ] + }, + "from": [ + 37.5847, + -1.2278 + ], + "tag": null, + "to": [ + 37.114, + -0.7373 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 27807, + 27878, + 0 + ] + }, + "from": [ + 37.114, + -0.7373 + ], + "tag": null, + "to": [ + 36.2812, + -0.2695 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 27884, + 27957, + 0 + ] + }, + "from": [ + 36.2812, + -0.2695 + ], + "tag": null, + "to": [ + 35.47, + -0.6877 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 27963, + 28035, + 0 + ] + }, + "from": [ + 35.47, + -0.6877 + ], + "tag": null, + "to": [ + 35.5081, + -0.431 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 28041, + 28113, + 0 + ] + }, + "from": [ + 35.5081, + -0.431 + ], + "tag": null, + "to": [ + 35.7476, + 0.0059 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 28119, + 28191, + 0 + ] + }, + "from": [ + 35.7476, + 0.0059 + ], + "tag": null, + "to": [ + 35.5848, + 0.8124 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 28197, + 28271, + 0 + ] + }, + "from": [ + 35.5848, + 0.8124 + ], + "tag": null, + "to": [ + 35.4951, + 0.7235 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 28277, + 28349, + 0 + ] + }, + "from": [ + 35.4951, + 0.7235 + ], + "tag": null, + "to": [ + 36.4154, + 0.5501 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 28355, + 28429, + 0 + ] + }, + "from": [ + 36.4154, + 0.5501 + ], + "tag": null, + "to": [ + 36.4172, + 0.0322 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 28435, + 28506, + 0 + ] + }, + "from": [ + 36.4172, + 0.0322 + ], + "tag": null, + "to": [ + 37.0378, + -0.8411 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 28512, + 28583, + 0 + ] + }, + "from": [ + 37.0378, + -0.8411 + ], + "tag": null, + "to": [ + 36.2601, + -0.0809 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 28589, + 28638, + 0 + ] + }, + "from": [ + 36.2601, + -0.0809 + ], + "tag": null, + "to": [ + 36.8041, + 0.7641 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 28644, + 28718, + 0 + ] + }, + "from": [ + 36.8041, + 0.7641 + ], + "tag": null, + "to": [ + 36.6737, + 0.7761 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 28724, + 28797, + 0 + ] + }, + "from": [ + 36.6737, + 0.7761 + ], + "tag": null, + "to": [ + 36.5081, + 0.5684 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 28803, + 28876, + 0 + ] + }, + "from": [ + 36.5081, + 0.5684 + ], + "tag": null, + "to": [ + 36.4118, + 0.5142 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 28882, + 28930, + 0 + ] + }, + "from": [ + 36.4118, + 0.5142 + ], + "tag": null, + "to": [ + 37.3139, + 0.9101 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 28936, + 29009, + 0 + ] + }, + "from": [ + 37.3139, + 0.9101 + ], + "tag": null, + "to": [ + 37.5939, + 0.7323 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 29015, + 29063, + 0 + ] + }, + "from": [ + 37.5939, + 0.7323 + ], + "tag": null, + "to": [ + 38.1175, + 1.4266 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 29069, + 29141, + 0 + ] + }, + "from": [ + 38.1175, + 1.4266 + ], + "tag": null, + "to": [ + 38.5089, + 0.6426 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 29147, + 29196, + 0 + ] + }, + "from": [ + 38.5089, + 0.6426 + ], + "tag": null, + "to": [ + 39.3503, + 1.1822 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 29202, + 29273, + 0 + ] + }, + "from": [ + 39.3503, + 1.1822 + ], + "tag": null, + "to": [ + 39.9641, + 1.4034 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 29279, + 29328, + 0 + ] + }, + "from": [ + 39.9641, + 1.4034 + ], + "tag": null, + "to": [ + 40.8471, + 2.1031 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 29334, + 29407, + 0 + ] + }, + "from": [ + 40.8471, + 2.1031 + ], + "tag": null, + "to": [ + 40.4342, + 1.6878 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 29413, + 29484, + 0 + ] + }, + "from": [ + 40.4342, + 1.6878 + ], + "tag": null, + "to": [ + 40.9512, + 0.7792 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 29490, + 29562, + 0 + ] + }, + "from": [ + 40.9512, + 0.7792 + ], + "tag": null, + "to": [ + 40.2795, + -0.1813 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 29568, + 29642, + 0 + ] + }, + "from": [ + 40.2795, + -0.1813 + ], + "tag": null, + "to": [ + 40.2898, + -0.5548 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 29648, + 29721, + 0 + ] + }, + "from": [ + 40.2898, + -0.5548 + ], + "tag": null, + "to": [ + 40.3934, + -0.9777 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 29727, + 29799, + 0 + ] + }, + "from": [ + 40.3934, + -0.9777 + ], + "tag": null, + "to": [ + 40.8454, + -1.09 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 29805, + 29877, + 0 + ] + }, + "from": [ + 40.8454, + -1.09 + ], + "tag": null, + "to": [ + 39.9633, + -1.8055 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 29883, + 29932, + 0 + ] + }, + "from": [ + 39.9633, + -1.8055 + ], + "tag": null, + "to": [ + 40.8828, + -1.5364 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 29938, + 30009, + 0 + ] + }, + "from": [ + 40.8828, + -1.5364 + ], + "tag": null, + "to": [ + 41.5927, + -1.4193 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 30015, + 30087, + 0 + ] + }, + "from": [ + 41.5927, + -1.4193 + ], + "tag": null, + "to": [ + 41.214, + -0.7086 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 30093, + 30167, + 0 + ] + }, + "from": [ + 41.214, + -0.7086 + ], + "tag": null, + "to": [ + 40.9167, + -0.7751 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 30173, + 30245, + 0 + ] + }, + "from": [ + 40.9167, + -0.7751 + ], + "tag": null, + "to": [ + 41.1464, + -1.5353 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 30251, + 30323, + 0 + ] + }, + "from": [ + 41.1464, + -1.5353 + ], + "tag": null, + "to": [ + 40.5107, + -1.3407 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 30329, + 30378, + 0 + ] + }, + "from": [ + 40.5107, + -1.3407 + ], + "tag": null, + "to": [ + 41.0828, + -1.0518 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 30384, + 30457, + 0 + ] + }, + "from": [ + 41.0828, + -1.0518 + ], + "tag": null, + "to": [ + 40.1248, + -1.0743 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 30463, + 30534, + 0 + ] + }, + "from": [ + 40.1248, + -1.0743 + ], + "tag": null, + "to": [ + 40.4547, + -1.9097 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 30540, + 30611, + 0 + ] + }, + "from": [ + 40.4547, + -1.9097 + ], + "tag": null, + "to": [ + 41.1982, + -2.7016 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 30617, + 30666, + 0 + ] + }, + "from": [ + 41.1982, + -2.7016 + ], + "tag": null, + "to": [ + 42.1917, + -1.7974 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 30672, + 30743, + 0 + ] + }, + "from": [ + 42.1917, + -1.7974 + ], + "tag": null, + "to": [ + 41.6882, + -1.2823 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 30749, + 30798, + 0 + ] + }, + "from": [ + 41.6882, + -1.2823 + ], + "tag": null, + "to": [ + 42.2408, + -0.521 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 30804, + 30875, + 0 + ] + }, + "from": [ + 42.2408, + -0.521 + ], + "tag": null, + "to": [ + 43.1001, + -0.4369 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 30881, + 30952, + 0 + ] + }, + "from": [ + 43.1001, + -0.4369 + ], + "tag": null, + "to": [ + 42.282, + -1.3404 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 30958, + 31030, + 0 + ] + }, + "from": [ + 42.282, + -1.3404 + ], + "tag": null, + "to": [ + 42.5986, + -1.5823 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 31036, + 31110, + 0 + ] + }, + "from": [ + 42.5986, + -1.5823 + ], + "tag": null, + "to": [ + 42.1547, + -1.8414 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 31116, + 31189, + 0 + ] + }, + "from": [ + 42.1547, + -1.8414 + ], + "tag": null, + "to": [ + 41.4942, + -2.245 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 31195, + 31267, + 0 + ] + }, + "from": [ + 41.4942, + -2.245 + ], + "tag": null, + "to": [ + 40.7771, + -2.0104 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 31273, + 31346, + 0 + ] + }, + "from": [ + 40.7771, + -2.0104 + ], + "tag": null, + "to": [ + 40.5203, + -2.4607 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 31352, + 31423, + 0 + ] + }, + "from": [ + 40.5203, + -2.4607 + ], + "tag": null, + "to": [ + 41.1955, + -3.4317 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 31429, + 31500, + 0 + ] + }, + "from": [ + 41.1955, + -3.4317 + ], + "tag": null, + "to": [ + 40.6265, + -2.8398 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 31506, + 31577, + 0 + ] + }, + "from": [ + 40.6265, + -2.8398 + ], + "tag": null, + "to": [ + 39.7937, + -2.372 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 31583, + 31656, + 0 + ] + }, + "from": [ + 39.7937, + -2.372 + ], + "tag": null, + "to": [ + 38.9826, + -2.7902 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 31662, + 31734, + 0 + ] + }, + "from": [ + 38.9826, + -2.7902 + ], + "tag": null, + "to": [ + 39.0206, + -2.5335 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 31740, + 31812, + 0 + ] + }, + "from": [ + 39.0206, + -2.5335 + ], + "tag": null, + "to": [ + 39.2601, + -2.0966 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 31818, + 31890, + 0 + ] + }, + "from": [ + 39.2601, + -2.0966 + ], + "tag": null, + "to": [ + 39.0973, + -1.2902 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 31896, + 31970, + 0 + ] + }, + "from": [ + 39.0973, + -1.2902 + ], + "tag": null, + "to": [ + 39.0076, + -1.379 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 31976, + 32048, + 0 + ] + }, + "from": [ + 39.0076, + -1.379 + ], + "tag": null, + "to": [ + 39.9279, + -1.5525 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 32054, + 32128, + 0 + ] + }, + "from": [ + 39.9279, + -1.5525 + ], + "tag": null, + "to": [ + 39.9297, + -2.0703 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 32134, + 32205, + 0 + ] + }, + "from": [ + 39.9297, + -2.0703 + ], + "tag": null, + "to": [ + 40.5503, + -2.9437 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 32211, + 32282, + 0 + ] + }, + "from": [ + 40.5503, + -2.9437 + ], + "tag": null, + "to": [ + 39.7727, + -2.1834 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 32288, + 32337, + 0 + ] + }, + "from": [ + 39.7727, + -2.1834 + ], + "tag": null, + "to": [ + 40.3166, + -1.3385 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 32343, + 32417, + 0 + ] + }, + "from": [ + 40.3166, + -1.3385 + ], + "tag": null, + "to": [ + 40.1863, + -1.3264 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 32423, + 32496, + 0 + ] + }, + "from": [ + 40.1863, + -1.3264 + ], + "tag": null, + "to": [ + 40.0206, + -1.5342 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 32502, + 32575, + 0 + ] + }, + "from": [ + 40.0206, + -1.5342 + ], + "tag": null, + "to": [ + 39.9243, + -1.5883 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 32581, + 32629, + 0 + ] + }, + "from": [ + 39.9243, + -1.5883 + ], + "tag": null, + "to": [ + 40.8264, + -1.1924 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 32635, + 32708, + 0 + ] + }, + "from": [ + 40.8264, + -1.1924 + ], + "tag": null, + "to": [ + 41.1064, + -1.3702 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 32714, + 32762, + 0 + ] + }, + "from": [ + 41.1064, + -1.3702 + ], + "tag": null, + "to": [ + 41.63, + -0.6759 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 32768, + 32840, + 0 + ] + }, + "from": [ + 41.63, + -0.6759 + ], + "tag": null, + "to": [ + 42.0214, + -1.4599 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 32846, + 32895, + 0 + ] + }, + "from": [ + 42.0214, + -1.4599 + ], + "tag": null, + "to": [ + 42.8628, + -0.9203 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 32901, + 32972, + 0 + ] + }, + "from": [ + 42.8628, + -0.9203 + ], + "tag": null, + "to": [ + 43.4766, + -0.6991 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 32978, + 33051, + 0 + ] + }, + "from": [ + 43.4766, + -0.6991 + ], + "tag": null, + "to": [ + 43.3808, + -1.4525 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 33057, + 33130, + 0 + ] + }, + "from": [ + 43.3808, + -1.4525 + ], + "tag": null, + "to": [ + 43.2082, + -2.2194 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 33136, + 33185, + 0 + ] + }, + "from": [ + 43.2082, + -2.2194 + ], + "tag": null, + "to": [ + 44.1027, + -1.6101 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 33191, + 33264, + 0 + ] + }, + "from": [ + 44.1027, + -1.6101 + ], + "tag": null, + "to": [ + 43.6898, + -2.0254 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 33270, + 33341, + 0 + ] + }, + "from": [ + 43.6898, + -2.0254 + ], + "tag": null, + "to": [ + 44.2068, + -2.9339 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 33347, + 33418, + 0 + ] + }, + "from": [ + 44.2068, + -2.9339 + ], + "tag": null, + "to": [ + 44.882, + -3.9049 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 33424, + 33495, + 0 + ] + }, + "from": [ + 44.882, + -3.9049 + ], + "tag": null, + "to": [ + 44.313, + -3.313 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 33501, + 33572, + 0 + ] + }, + "from": [ + 44.313, + -3.313 + ], + "tag": null, + "to": [ + 45.2594, + -3.5815 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 33578, + 33627, + 0 + ] + }, + "from": [ + 45.2594, + -3.5815 + ], + "tag": null, + "to": [ + 45.7836, + -2.6803 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 33633, + 33706, + 0 + ] + }, + "from": [ + 45.7836, + -2.6803 + ], + "tag": null, + "to": [ + 45.6411, + -3.1997 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 33712, + 33784, + 0 + ] + }, + "from": [ + 45.6411, + -3.1997 + ], + "tag": null, + "to": [ + 45.2123, + -3.6221 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 33790, + 33863, + 0 + ] + }, + "from": [ + 45.2123, + -3.6221 + ], + "tag": null, + "to": [ + 45.1192, + -4.5284 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 33869, + 33940, + 0 + ] + }, + "from": [ + 45.1192, + -4.5284 + ], + "tag": null, + "to": [ + 44.8424, + -3.8468 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 33946, + 34017, + 0 + ] + }, + "from": [ + 44.8424, + -3.8468 + ], + "tag": null, + "to": [ + 45.8221, + -3.929 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 34023, + 34094, + 0 + ] + }, + "from": [ + 45.8221, + -3.929 + ], + "tag": null, + "to": [ + 44.9554, + -4.23 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 34100, + 34171, + 0 + ] + }, + "from": [ + 44.9554, + -4.23 + ], + "tag": null, + "to": [ + 45.4928, + -4.2098 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 34177, + 34248, + 0 + ] + }, + "from": [ + 45.4928, + -4.2098 + ], + "tag": null, + "to": [ + 46.4261, + -4.8326 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 34254, + 34327, + 0 + ] + }, + "from": [ + 46.4261, + -4.8326 + ], + "tag": null, + "to": [ + 46.6066, + -5.2015 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 34333, + 34382, + 0 + ] + }, + "from": [ + 46.6066, + -5.2015 + ], + "tag": null, + "to": [ + 47.1451, + -4.9638 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 34388, + 34460, + 0 + ] + }, + "from": [ + 47.1451, + -4.9638 + ], + "tag": null, + "to": [ + 47.5355, + -4.821 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 34466, + 34537, + 0 + ] + }, + "from": [ + 47.5355, + -4.821 + ], + "tag": null, + "to": [ + 47.6333, + -3.8303 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 34543, + 34614, + 0 + ] + }, + "from": [ + 47.6333, + -3.8303 + ], + "tag": null, + "to": [ + 48.162, + -4.6227 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 34620, + 34691, + 0 + ] + }, + "from": [ + 48.162, + -4.6227 + ], + "tag": null, + "to": [ + 48.541, + -4.4988 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 34697, + 34768, + 0 + ] + }, + "from": [ + 48.541, + -4.4988 + ], + "tag": null, + "to": [ + 47.5925, + -3.8258 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 34774, + 34846, + 0 + ] + }, + "from": [ + 47.5925, + -3.8258 + ], + "tag": null, + "to": [ + 48.3377, + -4.039 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 34852, + 34924, + 0 + ] + }, + "from": [ + 48.3377, + -4.039 + ], + "tag": null, + "to": [ + 48.525, + -4.1986 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 34930, + 35003, + 0 + ] + }, + "from": [ + 48.525, + -4.1986 + ], + "tag": null, + "to": [ + 48.4677, + -4.7422 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35009, + 35082, + 0 + ] + }, + "from": [ + 48.4677, + -4.7422 + ], + "tag": null, + "to": [ + 48.3719, + -5.4956 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35088, + 35161, + 0 + ] + }, + "from": [ + 48.3719, + -5.4956 + ], + "tag": null, + "to": [ + 48.1993, + -6.2625 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35167, + 35216, + 0 + ] + }, + "from": [ + 48.1993, + -6.2625 + ], + "tag": null, + "to": [ + 49.0938, + -5.6532 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35222, + 35293, + 0 + ] + }, + "from": [ + 49.0938, + -5.6532 + ], + "tag": null, + "to": [ + 48.4699, + -5.2478 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35299, + 35371, + 0 + ] + }, + "from": [ + 48.4699, + -5.2478 + ], + "tag": null, + "to": [ + 48.6079, + -5.7266 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35377, + 35448, + 0 + ] + }, + "from": [ + 48.6079, + -5.7266 + ], + "tag": null, + "to": [ + 47.6562, + -4.8646 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35454, + 35503, + 0 + ] + }, + "from": [ + 47.6562, + -4.8646 + ], + "tag": null, + "to": [ + 48.5961, + -4.2319 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35509, + 35582, + 0 + ] + }, + "from": [ + 48.5961, + -4.2319 + ], + "tag": null, + "to": [ + 47.7329, + -4.2158 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35588, + 35660, + 0 + ] + }, + "from": [ + 47.7329, + -4.2158 + ], + "tag": null, + "to": [ + 47.9246, + -4.7074 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35666, + 35739, + 0 + ] + }, + "from": [ + 47.9246, + -4.7074 + ], + "tag": null, + "to": [ + 47.0601, + -4.8218 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35745, + 35819, + 0 + ] + }, + "from": [ + 47.0601, + -4.8218 + ], + "tag": null, + "to": [ + 47.031, + -5.3432 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35825, + 35896, + 0 + ] + }, + "from": [ + 47.031, + -5.3432 + ], + "tag": null, + "to": [ + 46.1597, + -4.5566 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35902, + 35951, + 0 + ] + }, + "from": [ + 46.1597, + -4.5566 + ], + "tag": null, + "to": [ + 47.0441, + -4.7391 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35957, + 36028, + 0 + ] + }, + "from": [ + 47.0441, + -4.7391 + ], + "tag": null, + "to": [ + 46.3462, + -4.695 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 36034, + 36109, + 0 + ] + }, + "from": [ + 46.3462, + -4.695 + ], + "tag": null, + "to": [ + 45.8657, + -4.7236 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 36115, + 36188, + 0 + ] + }, + "from": [ + 45.8657, + -4.7236 + ], + "tag": null, + "to": [ + 46.2785, + -5.173 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 36194, + 36242, + 0 + ] + }, + "from": [ + 46.2785, + -5.173 + ], + "tag": null, + "to": [ + 47.0697, + -4.2795 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 36248, + 36319, + 0 + ] + }, + "from": [ + 47.0697, + -4.2795 + ], + "tag": null, + "to": [ + 47.7204, + -4.9685 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 36325, + 36397, + 0 + ] + }, + "from": [ + 47.7204, + -4.9685 + ], + "tag": null, + "to": [ + 47.8253, + -5.5153 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 36403, + 36475, + 0 + ] + }, + "from": [ + 47.8253, + -5.5153 + ], + "tag": null, + "to": [ + 47.2492, + -5.7793 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 36481, + 36552, + 0 + ] + }, + "from": [ + 47.2492, + -5.7793 + ], + "tag": null, + "to": [ + 47.6475, + -4.9756 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 36558, + 36607, + 0 + ] + }, + "from": [ + 47.6475, + -4.9756 + ], + "tag": null, + "to": [ + 46.9737, + -5.894 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 36613, + 36685, + 0 + ] + }, + "from": [ + 46.9737, + -5.894 + ], + "tag": null, + "to": [ + 46.1137, + -6.844 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 36691, + 36762, + 0 + ] + }, + "from": [ + 46.1137, + -6.844 + ], + "tag": null, + "to": [ + 46.7423, + -7.3626 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 36768, + 36839, + 0 + ] + }, + "from": [ + 46.7423, + -7.3626 + ], + "tag": null, + "to": [ + 47.0645, + -7.1164 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 36845, + 36917, + 0 + ] + }, + "from": [ + 47.0645, + -7.1164 + ], + "tag": null, + "to": [ + 47.262, + -7.8693 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 36923, + 36996, + 0 + ] + }, + "from": [ + 47.262, + -7.8693 + ], + "tag": null, + "to": [ + 46.8302, + -7.6799 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37002, + 37073, + 0 + ] + }, + "from": [ + 46.8302, + -7.6799 + ], + "tag": null, + "to": [ + 47.7017, + -8.4015 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37079, + 37151, + 0 + ] + }, + "from": [ + 47.7017, + -8.4015 + ], + "tag": null, + "to": [ + 47.3347, + -8.1895 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37157, + 37228, + 0 + ] + }, + "from": [ + 47.3347, + -8.1895 + ], + "tag": null, + "to": [ + 46.8639, + -7.6989 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37234, + 37305, + 0 + ] + }, + "from": [ + 46.8639, + -7.6989 + ], + "tag": null, + "to": [ + 46.0311, + -7.2312 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37311, + 37384, + 0 + ] + }, + "from": [ + 46.0311, + -7.2312 + ], + "tag": null, + "to": [ + 45.2199, + -7.6493 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37390, + 37462, + 0 + ] + }, + "from": [ + 45.2199, + -7.6493 + ], + "tag": null, + "to": [ + 45.258, + -7.3927 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37468, + 37540, + 0 + ] + }, + "from": [ + 45.258, + -7.3927 + ], + "tag": null, + "to": [ + 45.4975, + -6.9558 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37546, + 37618, + 0 + ] + }, + "from": [ + 45.4975, + -6.9558 + ], + "tag": null, + "to": [ + 45.3347, + -6.1493 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37624, + 37698, + 0 + ] + }, + "from": [ + 45.3347, + -6.1493 + ], + "tag": null, + "to": [ + 45.245, + -6.2382 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37704, + 37776, + 0 + ] + }, + "from": [ + 45.245, + -6.2382 + ], + "tag": null, + "to": [ + 46.1653, + -6.4116 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37782, + 37856, + 0 + ] + }, + "from": [ + 46.1653, + -6.4116 + ], + "tag": null, + "to": [ + 46.1671, + -6.9295 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37862, + 37933, + 0 + ] + }, + "from": [ + 46.1671, + -6.9295 + ], + "tag": null, + "to": [ + 46.7877, + -7.8028 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37939, + 38010, + 0 + ] + }, + "from": [ + 46.7877, + -7.8028 + ], + "tag": null, + "to": [ + 46.0101, + -7.0425 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 38016, + 38065, + 0 + ] + }, + "from": [ + 46.0101, + -7.0425 + ], + "tag": null, + "to": [ + 46.554, + -6.1976 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 38071, + 38145, + 0 + ] + }, + "from": [ + 46.554, + -6.1976 + ], + "tag": null, + "to": [ + 46.4236, + -6.1856 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 38151, + 38224, + 0 + ] + }, + "from": [ + 46.4236, + -6.1856 + ], + "tag": null, + "to": [ + 46.258, + -6.3933 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 38230, + 38303, + 0 + ] + }, + "from": [ + 46.258, + -6.3933 + ], + "tag": null, + "to": [ + 46.1617, + -6.4475 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 38309, + 38357, + 0 + ] + }, + "from": [ + 46.1617, + -6.4475 + ], + "tag": null, + "to": [ + 47.0638, + -6.0516 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 38363, + 38436, + 0 + ] + }, + "from": [ + 47.0638, + -6.0516 + ], + "tag": null, + "to": [ + 47.3438, + -6.2294 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 38442, + 38490, + 0 + ] + }, + "from": [ + 47.3438, + -6.2294 + ], + "tag": null, + "to": [ + 47.8674, + -5.5351 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 38496, + 38568, + 0 + ] + }, + "from": [ + 47.8674, + -5.5351 + ], + "tag": null, + "to": [ + 48.2588, + -6.319 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 38574, + 38623, + 0 + ] + }, + "from": [ + 48.2588, + -6.319 + ], + "tag": null, + "to": [ + 49.1002, + -5.7795 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 38629, + 38700, + 0 + ] + }, + "from": [ + 49.1002, + -5.7795 + ], + "tag": null, + "to": [ + 49.714, + -5.5583 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 38706, + 38755, + 0 + ] + }, + "from": [ + 49.714, + -5.5583 + ], + "tag": null, + "to": [ + 50.597, + -4.8586 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 38761, + 38834, + 0 + ] + }, + "from": [ + 50.597, + -4.8586 + ], + "tag": null, + "to": [ + 50.1841, + -5.2739 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 38840, + 38911, + 0 + ] + }, + "from": [ + 50.1841, + -5.2739 + ], + "tag": null, + "to": [ + 50.7011, + -6.1824 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 38917, + 38989, + 0 + ] + }, + "from": [ + 50.7011, + -6.1824 + ], + "tag": null, + "to": [ + 50.0294, + -7.143 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 38995, + 39069, + 0 + ] + }, + "from": [ + 50.0294, + -7.143 + ], + "tag": null, + "to": [ + 50.0397, + -7.5164 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 39075, + 39148, + 0 + ] + }, + "from": [ + 50.0397, + -7.5164 + ], + "tag": null, + "to": [ + 50.1433, + -7.9394 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 39154, + 39226, + 0 + ] + }, + "from": [ + 50.1433, + -7.9394 + ], + "tag": null, + "to": [ + 50.5953, + -8.0517 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 39232, + 39304, + 0 + ] + }, + "from": [ + 50.5953, + -8.0517 + ], + "tag": null, + "to": [ + 49.7132, + -8.7672 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 39310, + 39359, + 0 + ] + }, + "from": [ + 49.7132, + -8.7672 + ], + "tag": null, + "to": [ + 50.6328, + -8.4981 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 39365, + 39436, + 0 + ] + }, + "from": [ + 50.6328, + -8.4981 + ], + "tag": null, + "to": [ + 51.3427, + -8.381 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 39442, + 39514, + 0 + ] + }, + "from": [ + 51.3427, + -8.381 + ], + "tag": null, + "to": [ + 50.9639, + -7.6703 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 39520, + 39594, + 0 + ] + }, + "from": [ + 50.9639, + -7.6703 + ], + "tag": null, + "to": [ + 50.6666, + -7.7368 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 39600, + 39672, + 0 + ] + }, + "from": [ + 50.6666, + -7.7368 + ], + "tag": null, + "to": [ + 50.8963, + -8.497 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 39678, + 39750, + 0 + ] + }, + "from": [ + 50.8963, + -8.497 + ], + "tag": null, + "to": [ + 50.2606, + -8.3024 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 39756, + 39805, + 0 + ] + }, + "from": [ + 50.2606, + -8.3024 + ], + "tag": null, + "to": [ + 50.8327, + -8.0135 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 39811, + 39884, + 0 + ] + }, + "from": [ + 50.8327, + -8.0135 + ], + "tag": null, + "to": [ + 49.8747, + -8.036 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 39890, + 39961, + 0 + ] + }, + "from": [ + 49.8747, + -8.036 + ], + "tag": null, + "to": [ + 50.2046, + -8.8713 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 39967, + 40038, + 0 + ] + }, + "from": [ + 50.2046, + -8.8713 + ], + "tag": null, + "to": [ + 50.9481, + -9.6633 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 40044, + 40093, + 0 + ] + }, + "from": [ + 50.9481, + -9.6633 + ], + "tag": null, + "to": [ + 51.9417, + -8.759 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 40099, + 40170, + 0 + ] + }, + "from": [ + 51.9417, + -8.759 + ], + "tag": null, + "to": [ + 51.4381, + -8.2439 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 40176, + 40225, + 0 + ] + }, + "from": [ + 51.4381, + -8.2439 + ], + "tag": null, + "to": [ + 51.9907, + -7.4827 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 40231, + 40302, + 0 + ] + }, + "from": [ + 51.9907, + -7.4827 + ], + "tag": null, + "to": [ + 52.85, + -7.3985 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 40308, + 40379, + 0 + ] + }, + "from": [ + 52.85, + -7.3985 + ], + "tag": null, + "to": [ + 52.0319, + -8.3021 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 40385, + 40457, + 0 + ] + }, + "from": [ + 52.0319, + -8.3021 + ], + "tag": null, + "to": [ + 52.3485, + -8.544 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 40463, + 40537, + 0 + ] + }, + "from": [ + 52.3485, + -8.544 + ], + "tag": null, + "to": [ + 51.9046, + -8.8031 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 40543, + 40616, + 0 + ] + }, + "from": [ + 51.9046, + -8.8031 + ], + "tag": null, + "to": [ + 51.2441, + -9.2067 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 40622, + 40694, + 0 + ] + }, + "from": [ + 51.2441, + -9.2067 + ], + "tag": null, + "to": [ + 50.527, + -8.9721 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 40700, + 40773, + 0 + ] + }, + "from": [ + 50.527, + -8.9721 + ], + "tag": null, + "to": [ + 50.2702, + -9.4224 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 40779, + 40850, + 0 + ] + }, + "from": [ + 50.2702, + -9.4224 + ], + "tag": null, + "to": [ + 50.9454, + -10.3934 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 40856, + 40927, + 0 + ] + }, + "from": [ + 50.9454, + -10.3934 + ], + "tag": null, + "to": [ + 50.3764, + -9.8015 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 40933, + 41004, + 0 + ] + }, + "from": [ + 50.3764, + -9.8015 + ], + "tag": null, + "to": [ + 49.5436, + -9.3337 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41010, + 41083, + 0 + ] + }, + "from": [ + 49.5436, + -9.3337 + ], + "tag": null, + "to": [ + 48.7325, + -9.7519 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41089, + 41161, + 0 + ] + }, + "from": [ + 48.7325, + -9.7519 + ], + "tag": null, + "to": [ + 48.7705, + -9.4952 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41167, + 41239, + 0 + ] + }, + "from": [ + 48.7705, + -9.4952 + ], + "tag": null, + "to": [ + 49.01, + -9.0583 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41245, + 41317, + 0 + ] + }, + "from": [ + 49.01, + -9.0583 + ], + "tag": null, + "to": [ + 48.8473, + -8.2518 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41323, + 41397, + 0 + ] + }, + "from": [ + 48.8473, + -8.2518 + ], + "tag": null, + "to": [ + 48.7575, + -8.3407 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41403, + 41475, + 0 + ] + }, + "from": [ + 48.7575, + -8.3407 + ], + "tag": null, + "to": [ + 49.6779, + -8.5141 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41481, + 41555, + 0 + ] + }, + "from": [ + 49.6779, + -8.5141 + ], + "tag": null, + "to": [ + 49.6796, + -9.032 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41561, + 41632, + 0 + ] + }, + "from": [ + 49.6796, + -9.032 + ], + "tag": null, + "to": [ + 50.3002, + -9.9053 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41638, + 41709, + 0 + ] + }, + "from": [ + 50.3002, + -9.9053 + ], + "tag": null, + "to": [ + 49.5226, + -9.1451 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41715, + 41764, + 0 + ] + }, + "from": [ + 49.5226, + -9.1451 + ], + "tag": null, + "to": [ + 50.0665, + -8.3001 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41770, + 41844, + 0 + ] + }, + "from": [ + 50.0665, + -8.3001 + ], + "tag": null, + "to": [ + 49.9362, + -8.2881 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41850, + 41923, + 0 + ] + }, + "from": [ + 49.9362, + -8.2881 + ], + "tag": null, + "to": [ + 49.7705, + -8.4958 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 41929, + 42002, + 0 + ] + }, + "from": [ + 49.7705, + -8.4958 + ], + "tag": null, + "to": [ + 49.6743, + -8.55 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 42008, + 42056, + 0 + ] + }, + "from": [ + 49.6743, + -8.55 + ], + "tag": null, + "to": [ + 50.5764, + -8.1541 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 42062, + 42135, + 0 + ] + }, + "from": [ + 50.5764, + -8.1541 + ], + "tag": null, + "to": [ + 50.8563, + -8.3319 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 42141, + 42189, + 0 + ] + }, + "from": [ + 50.8563, + -8.3319 + ], + "tag": null, + "to": [ + 51.3799, + -7.6376 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 42195, + 42267, + 0 + ] + }, + "from": [ + 51.3799, + -7.6376 + ], + "tag": null, + "to": [ + 51.7713, + -8.4216 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 42273, + 42322, + 0 + ] + }, + "from": [ + 51.7713, + -8.4216 + ], + "tag": null, + "to": [ + 52.6128, + -7.882 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 42328, + 42399, + 0 + ] + }, + "from": [ + 52.6128, + -7.882 + ], + "tag": null, + "to": [ + 53.2265, + -7.6608 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 42405, + 42454, + 0 + ] + }, + "from": [ + 53.2265, + -7.6608 + ], + "tag": null, + "to": [ + 54.1096, + -6.9611 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 42460, + 42533, + 0 + ] + }, + "from": [ + 54.1096, + -6.9611 + ], + "tag": null, + "to": [ + 53.6967, + -7.3764 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 42539, + 42610, + 0 + ] + }, + "from": [ + 53.6967, + -7.3764 + ], + "tag": null, + "to": [ + 54.2136, + -8.285 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 42616, + 42687, + 0 + ] + }, + "from": [ + 54.2136, + -8.285 + ], + "tag": null, + "to": [ + 54.8888, + -9.2559 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 42693, + 42764, + 0 + ] + }, + "from": [ + 54.8888, + -9.2559 + ], + "tag": null, + "to": [ + 54.3199, + -8.664 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 42770, + 42841, + 0 + ] + }, + "from": [ + 54.3199, + -8.664 + ], + "tag": null, + "to": [ + 55.2663, + -8.9325 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 42847, + 42896, + 0 + ] + }, + "from": [ + 55.2663, + -8.9325 + ], + "tag": null, + "to": [ + 55.7905, + -8.0314 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 42902, + 42975, + 0 + ] + }, + "from": [ + 55.7905, + -8.0314 + ], + "tag": null, + "to": [ + 55.6479, + -8.5508 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 42981, + 43053, + 0 + ] + }, + "from": [ + 55.6479, + -8.5508 + ], + "tag": null, + "to": [ + 55.2192, + -8.9731 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 43059, + 43132, + 0 + ] + }, + "from": [ + 55.2192, + -8.9731 + ], + "tag": null, + "to": [ + 55.126, + -9.8794 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 43138, + 43209, + 0 + ] + }, + "from": [ + 55.126, + -9.8794 + ], + "tag": null, + "to": [ + 54.8493, + -9.1978 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 43215, + 43286, + 0 + ] + }, + "from": [ + 54.8493, + -9.1978 + ], + "tag": null, + "to": [ + 55.8289, + -9.28 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 43292, + 43363, + 0 + ] + }, + "from": [ + 55.8289, + -9.28 + ], + "tag": null, + "to": [ + 54.9623, + -9.5811 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 43369, + 43440, + 0 + ] + }, + "from": [ + 54.9623, + -9.5811 + ], + "tag": null, + "to": [ + 55.4997, + -9.5608 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 43446, + 43517, + 0 + ] + }, + "from": [ + 55.4997, + -9.5608 + ], + "tag": null, + "to": [ + 56.4329, + -10.1836 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 43523, + 43596, + 0 + ] + }, + "from": [ + 56.4329, + -10.1836 + ], + "tag": null, + "to": [ + 56.6135, + -10.5526 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 43602, + 43651, + 0 + ] + }, + "from": [ + 56.6135, + -10.5526 + ], + "tag": null, + "to": [ + 57.1519, + -10.3148 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 43657, + 43729, + 0 + ] + }, + "from": [ + 57.1519, + -10.3148 + ], + "tag": null, + "to": [ + 57.5423, + -10.1721 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 43735, + 43806, + 0 + ] + }, + "from": [ + 57.5423, + -10.1721 + ], + "tag": null, + "to": [ + 57.6402, + -9.1813 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 43812, + 43883, + 0 + ] + }, + "from": [ + 57.6402, + -9.1813 + ], + "tag": null, + "to": [ + 58.1688, + -9.9738 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 43889, + 43960, + 0 + ] + }, + "from": [ + 58.1688, + -9.9738 + ], + "tag": null, + "to": [ + 58.5478, + -9.8498 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 43966, + 44037, + 0 + ] + }, + "from": [ + 58.5478, + -9.8498 + ], + "tag": null, + "to": [ + 57.5993, + -9.1768 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 44043, + 44115, + 0 + ] + }, + "from": [ + 57.5993, + -9.1768 + ], + "tag": null, + "to": [ + 58.3445, + -9.39 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 44121, + 44193, + 0 + ] + }, + "from": [ + 58.3445, + -9.39 + ], + "tag": null, + "to": [ + 58.5318, + -9.5496 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 44199, + 44272, + 0 + ] + }, + "from": [ + 58.5318, + -9.5496 + ], + "tag": null, + "to": [ + 58.4745, + -10.0933 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 44278, + 44351, + 0 + ] + }, + "from": [ + 58.4745, + -10.0933 + ], + "tag": null, + "to": [ + 58.3787, + -10.8467 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 44357, + 44430, + 0 + ] + }, + "from": [ + 58.3787, + -10.8467 + ], + "tag": null, + "to": [ + 58.2062, + -11.6136 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 44436, + 44485, + 0 + ] + }, + "from": [ + 58.2062, + -11.6136 + ], + "tag": null, + "to": [ + 59.1006, + -11.0042 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 44491, + 44563, + 0 + ] + }, + "from": [ + 59.1006, + -11.0042 + ], + "tag": null, + "to": [ + 58.7336, + -10.7922 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 44569, + 44640, + 0 + ] + }, + "from": [ + 58.7336, + -10.7922 + ], + "tag": null, + "to": [ + 58.2629, + -10.3017 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 44646, + 44717, + 0 + ] + }, + "from": [ + 58.2629, + -10.3017 + ], + "tag": null, + "to": [ + 57.43, + -9.834 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 44723, + 44796, + 0 + ] + }, + "from": [ + 57.43, + -9.834 + ], + "tag": null, + "to": [ + 56.6189, + -10.2521 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 44802, + 44874, + 0 + ] + }, + "from": [ + 56.6189, + -10.2521 + ], + "tag": null, + "to": [ + 56.657, + -9.9955 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 44880, + 44952, + 0 + ] + }, + "from": [ + 56.657, + -9.9955 + ], + "tag": null, + "to": [ + 56.8965, + -9.5585 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 44958, + 45030, + 0 + ] + }, + "from": [ + 56.8965, + -9.5585 + ], + "tag": null, + "to": [ + 56.7337, + -8.7521 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 45036, + 45110, + 0 + ] + }, + "from": [ + 56.7337, + -8.7521 + ], + "tag": null, + "to": [ + 56.644, + -8.841 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 45116, + 45188, + 0 + ] + }, + "from": [ + 56.644, + -8.841 + ], + "tag": null, + "to": [ + 57.5643, + -9.0144 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 45194, + 45268, + 0 + ] + }, + "from": [ + 57.5643, + -9.0144 + ], + "tag": null, + "to": [ + 57.566, + -9.5322 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 45274, + 45345, + 0 + ] + }, + "from": [ + 57.566, + -9.5322 + ], + "tag": null, + "to": [ + 58.1867, + -10.4056 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 45351, + 45422, + 0 + ] + }, + "from": [ + 58.1867, + -10.4056 + ], + "tag": null, + "to": [ + 57.409, + -9.6453 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 45428, + 45477, + 0 + ] + }, + "from": [ + 57.409, + -9.6453 + ], + "tag": null, + "to": [ + 57.953, + -8.8004 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 45483, + 45557, + 0 + ] + }, + "from": [ + 57.953, + -8.8004 + ], + "tag": null, + "to": [ + 57.8226, + -8.7883 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 45563, + 45636, + 0 + ] + }, + "from": [ + 57.8226, + -8.7883 + ], + "tag": null, + "to": [ + 57.657, + -8.9961 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 45642, + 45715, + 0 + ] + }, + "from": [ + 57.657, + -8.9961 + ], + "tag": null, + "to": [ + 57.5607, + -9.0503 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 45721, + 45769, + 0 + ] + }, + "from": [ + 57.5607, + -9.0503 + ], + "tag": null, + "to": [ + 58.4628, + -8.6544 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 45775, + 45848, + 0 + ] + }, + "from": [ + 58.4628, + -8.6544 + ], + "tag": null, + "to": [ + 58.7428, + -8.8321 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 45854, + 45902, + 0 + ] + }, + "from": [ + 58.7428, + -8.8321 + ], + "tag": null, + "to": [ + 59.2664, + -8.1378 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 45908, + 45980, + 0 + ] + }, + "from": [ + 59.2664, + -8.1378 + ], + "tag": null, + "to": [ + 59.6578, + -8.9218 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 45986, + 46035, + 0 + ] + }, + "from": [ + 59.6578, + -8.9218 + ], + "tag": null, + "to": [ + 60.4992, + -8.3822 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 46041, + 46112, + 0 + ] + }, + "from": [ + 60.4992, + -8.3822 + ], + "tag": null, + "to": [ + 61.113, + -8.161 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 46118, + 46167, + 0 + ] + }, + "from": [ + 61.113, + -8.161 + ], + "tag": null, + "to": [ + 61.996, + -7.4614 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 46173, + 46246, + 0 + ] + }, + "from": [ + 61.996, + -7.4614 + ], + "tag": null, + "to": [ + 61.5831, + -7.8766 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 46252, + 46323, + 0 + ] + }, + "from": [ + 61.5831, + -7.8766 + ], + "tag": null, + "to": [ + 62.1, + -8.7852 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 46329, + 46401, + 0 + ] + }, + "from": [ + 62.1, + -8.7852 + ], + "tag": null, + "to": [ + 61.4284, + -9.7458 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 46407, + 46481, + 0 + ] + }, + "from": [ + 61.4284, + -9.7458 + ], + "tag": null, + "to": [ + 61.4387, + -10.1192 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 46487, + 46560, + 0 + ] + }, + "from": [ + 61.4387, + -10.1192 + ], + "tag": null, + "to": [ + 61.5423, + -10.5421 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 46566, + 46638, + 0 + ] + }, + "from": [ + 61.5423, + -10.5421 + ], + "tag": null, + "to": [ + 61.9943, + -10.6545 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 46644, + 46716, + 0 + ] + }, + "from": [ + 61.9943, + -10.6545 + ], + "tag": null, + "to": [ + 61.1122, + -11.37 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 46722, + 46771, + 0 + ] + }, + "from": [ + 61.1122, + -11.37 + ], + "tag": null, + "to": [ + 62.0317, + -11.1008 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 46777, + 46848, + 0 + ] + }, + "from": [ + 62.0317, + -11.1008 + ], + "tag": null, + "to": [ + 62.7416, + -10.9837 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 46854, + 46926, + 0 + ] + }, + "from": [ + 62.7416, + -10.9837 + ], + "tag": null, + "to": [ + 62.3629, + -10.273 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 46932, + 47006, + 0 + ] + }, + "from": [ + 62.3629, + -10.273 + ], + "tag": null, + "to": [ + 62.0656, + -10.3395 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 47012, + 47084, + 0 + ] + }, + "from": [ + 62.0656, + -10.3395 + ], + "tag": null, + "to": [ + 62.2952, + -11.0997 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 47090, + 47162, + 0 + ] + }, + "from": [ + 62.2952, + -11.0997 + ], + "tag": null, + "to": [ + 61.6596, + -10.9051 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 47168, + 47217, + 0 + ] + }, + "from": [ + 61.6596, + -10.9051 + ], + "tag": null, + "to": [ + 62.2317, + -10.6163 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 47223, + 47296, + 0 + ] + }, + "from": [ + 62.2317, + -10.6163 + ], + "tag": null, + "to": [ + 61.2737, + -10.6387 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 47302, + 47373, + 0 + ] + }, + "from": [ + 61.2737, + -10.6387 + ], + "tag": null, + "to": [ + 61.6036, + -11.4741 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 47379, + 47450, + 0 + ] + }, + "from": [ + 61.6036, + -11.4741 + ], + "tag": null, + "to": [ + 62.3471, + -12.2661 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 47456, + 47505, + 0 + ] + }, + "from": [ + 62.3471, + -12.2661 + ], + "tag": null, + "to": [ + 63.3406, + -11.3618 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 47511, + 47582, + 0 + ] + }, + "from": [ + 63.3406, + -11.3618 + ], + "tag": null, + "to": [ + 62.8371, + -10.8467 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 47588, + 47637, + 0 + ] + }, + "from": [ + 62.8371, + -10.8467 + ], + "tag": null, + "to": [ + 63.3897, + -10.0854 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 47643, + 47714, + 0 + ] + }, + "from": [ + 63.3897, + -10.0854 + ], + "tag": null, + "to": [ + 64.249, + -10.0013 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 47720, + 47791, + 0 + ] + }, + "from": [ + 64.249, + -10.0013 + ], + "tag": null, + "to": [ + 63.4309, + -10.9048 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 47797, + 47869, + 0 + ] + }, + "from": [ + 63.4309, + -10.9048 + ], + "tag": null, + "to": [ + 63.7475, + -11.1467 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 47875, + 47949, + 0 + ] + }, + "from": [ + 63.7475, + -11.1467 + ], + "tag": null, + "to": [ + 63.3036, + -11.4059 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 47955, + 48028, + 0 + ] + }, + "from": [ + 63.3036, + -11.4059 + ], + "tag": null, + "to": [ + 62.643, + -11.8094 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 48034, + 48106, + 0 + ] + }, + "from": [ + 62.643, + -11.8094 + ], + "tag": null, + "to": [ + 61.926, + -11.5749 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 48112, + 48185, + 0 + ] + }, + "from": [ + 61.926, + -11.5749 + ], + "tag": null, + "to": [ + 61.6692, + -12.0252 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 48191, + 48262, + 0 + ] + }, + "from": [ + 61.6692, + -12.0252 + ], + "tag": null, + "to": [ + 62.3444, + -12.9961 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 48268, + 48339, + 0 + ] + }, + "from": [ + 62.3444, + -12.9961 + ], + "tag": null, + "to": [ + 61.7754, + -12.4042 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 48345, + 48416, + 0 + ] + }, + "from": [ + 61.7754, + -12.4042 + ], + "tag": null, + "to": [ + 60.9426, + -11.9365 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 48422, + 48495, + 0 + ] + }, + "from": [ + 60.9426, + -11.9365 + ], + "tag": null, + "to": [ + 60.1314, + -12.3546 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 48501, + 48573, + 0 + ] + }, + "from": [ + 60.1314, + -12.3546 + ], + "tag": null, + "to": [ + 60.1695, + -12.098 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 48579, + 48651, + 0 + ] + }, + "from": [ + 60.1695, + -12.098 + ], + "tag": null, + "to": [ + 60.409, + -11.6611 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 48657, + 48729, + 0 + ] + }, + "from": [ + 60.409, + -11.6611 + ], + "tag": null, + "to": [ + 60.2462, + -10.8546 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 48735, + 48809, + 0 + ] + }, + "from": [ + 60.2462, + -10.8546 + ], + "tag": null, + "to": [ + 60.1565, + -10.9435 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 48815, + 48887, + 0 + ] + }, + "from": [ + 60.1565, + -10.9435 + ], + "tag": null, + "to": [ + 61.0768, + -11.1169 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 48893, + 48967, + 0 + ] + }, + "from": [ + 61.0768, + -11.1169 + ], + "tag": null, + "to": [ + 61.0786, + -11.6348 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 48973, + 49044, + 0 + ] + }, + "from": [ + 61.0786, + -11.6348 + ], + "tag": null, + "to": [ + 61.6992, + -12.5081 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 49050, + 49121, + 0 + ] + }, + "from": [ + 61.6992, + -12.5081 + ], + "tag": null, + "to": [ + 60.9216, + -11.7478 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 49127, + 49176, + 0 + ] + }, + "from": [ + 60.9216, + -11.7478 + ], + "tag": null, + "to": [ + 61.4655, + -10.9029 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 49182, + 49256, + 0 + ] + }, + "from": [ + 61.4655, + -10.9029 + ], + "tag": null, + "to": [ + 61.3351, + -10.8909 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 49262, + 49335, + 0 + ] + }, + "from": [ + 61.3351, + -10.8909 + ], + "tag": null, + "to": [ + 61.1695, + -11.0986 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 49341, + 49414, + 0 + ] + }, + "from": [ + 61.1695, + -11.0986 + ], + "tag": null, + "to": [ + 61.0732, + -11.1528 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 49420, + 49468, + 0 + ] + }, + "from": [ + 61.0732, + -11.1528 + ], + "tag": null, + "to": [ + 61.9753, + -10.7569 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 49474, + 49547, + 0 + ] + }, + "from": [ + 61.9753, + -10.7569 + ], + "tag": null, + "to": [ + 62.2553, + -10.9347 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 49553, + 49601, + 0 + ] + }, + "from": [ + 62.2553, + -10.9347 + ], + "tag": null, + "to": [ + 62.7789, + -10.2404 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 49607, + 49679, + 0 + ] + }, + "from": [ + 62.7789, + -10.2404 + ], + "tag": null, + "to": [ + 63.1703, + -11.0243 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 49685, + 49734, + 0 + ] + }, + "from": [ + 63.1703, + -11.0243 + ], + "tag": null, + "to": [ + 64.0117, + -10.4848 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 49740, + 49811, + 0 + ] + }, + "from": [ + 64.0117, + -10.4848 + ], + "tag": null, + "to": [ + 64.6255, + -10.2636 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 49817, + 49866, + 0 + ] + }, + "from": [ + 64.6255, + -10.2636 + ], + "tag": null, + "to": [ + 65.5085, + -9.5639 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 49872, + 49944, + 0 + ] + }, + "from": [ + 65.5085, + -9.5639 + ], + "tag": null, + "to": [ + 65.1415, + -9.3519 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 49950, + 50021, + 0 + ] + }, + "from": [ + 65.1415, + -9.3519 + ], + "tag": null, + "to": [ + 64.6708, + -8.8614 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 50027, + 50098, + 0 + ] + }, + "from": [ + 64.6708, + -8.8614 + ], + "tag": null, + "to": [ + 63.8379, + -8.3936 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 50104, + 50177, + 0 + ] + }, + "from": [ + 63.8379, + -8.3936 + ], + "tag": null, + "to": [ + 63.0268, + -8.8118 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 50183, + 50255, + 0 + ] + }, + "from": [ + 63.0268, + -8.8118 + ], + "tag": null, + "to": [ + 63.0649, + -8.5551 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 50261, + 50333, + 0 + ] + }, + "from": [ + 63.0649, + -8.5551 + ], + "tag": null, + "to": [ + 63.3044, + -8.1182 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 50339, + 50411, + 0 + ] + }, + "from": [ + 63.3044, + -8.1182 + ], + "tag": null, + "to": [ + 63.1416, + -7.3117 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 50417, + 50491, + 0 + ] + }, + "from": [ + 63.1416, + -7.3117 + ], + "tag": null, + "to": [ + 63.0518, + -7.4006 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 50497, + 50569, + 0 + ] + }, + "from": [ + 63.0518, + -7.4006 + ], + "tag": null, + "to": [ + 63.9722, + -7.574 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 50575, + 50649, + 0 + ] + }, + "from": [ + 63.9722, + -7.574 + ], + "tag": null, + "to": [ + 63.9739, + -8.0919 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 50655, + 50726, + 0 + ] + }, + "from": [ + 63.9739, + -8.0919 + ], + "tag": null, + "to": [ + 64.5946, + -8.9652 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 50732, + 50803, + 0 + ] + }, + "from": [ + 64.5946, + -8.9652 + ], + "tag": null, + "to": [ + 63.8169, + -8.205 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 50809, + 50858, + 0 + ] + }, + "from": [ + 63.8169, + -8.205 + ], + "tag": null, + "to": [ + 64.3609, + -7.36 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 50864, + 50938, + 0 + ] + }, + "from": [ + 64.3609, + -7.36 + ], + "tag": null, + "to": [ + 64.2305, + -7.348 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 50944, + 51017, + 0 + ] + }, + "from": [ + 64.2305, + -7.348 + ], + "tag": null, + "to": [ + 64.0648, + -7.5557 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 51023, + 51096, + 0 + ] + }, + "from": [ + 64.0648, + -7.5557 + ], + "tag": null, + "to": [ + 63.9686, + -7.6099 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 51102, + 51150, + 0 + ] + }, + "from": [ + 63.9686, + -7.6099 + ], + "tag": null, + "to": [ + 64.8707, + -7.214 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 51156, + 51229, + 0 + ] + }, + "from": [ + 64.8707, + -7.214 + ], + "tag": null, + "to": [ + 65.1507, + -7.3918 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 51235, + 51283, + 0 + ] + }, + "from": [ + 65.1507, + -7.3918 + ], + "tag": null, + "to": [ + 65.6742, + -6.6975 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 51289, + 51361, + 0 + ] + }, + "from": [ + 65.6742, + -6.6975 + ], + "tag": null, + "to": [ + 66.0657, + -7.4815 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 51367, + 51416, + 0 + ] + }, + "from": [ + 66.0657, + -7.4815 + ], + "tag": null, + "to": [ + 66.9071, + -6.9419 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 51422, + 51493, + 0 + ] + }, + "from": [ + 66.9071, + -6.9419 + ], + "tag": null, + "to": [ + 67.5208, + -6.7207 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 51499, + 51548, + 0 + ] + }, + "from": [ + 67.5208, + -6.7207 + ], + "tag": null, + "to": [ + 68.4039, + -6.021 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 51554, + 51627, + 0 + ] + }, + "from": [ + 68.4039, + -6.021 + ], + "tag": null, + "to": [ + 67.991, + -6.4363 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 51633, + 51704, + 0 + ] + }, + "from": [ + 67.991, + -6.4363 + ], + "tag": null, + "to": [ + 68.5079, + -7.3449 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 51710, + 51782, + 0 + ] + }, + "from": [ + 68.5079, + -7.3449 + ], + "tag": null, + "to": [ + 67.8363, + -8.3054 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 51788, + 51862, + 0 + ] + }, + "from": [ + 67.8363, + -8.3054 + ], + "tag": null, + "to": [ + 67.8466, + -8.6789 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 51868, + 51940, + 0 + ] + }, + "from": [ + 67.8466, + -8.6789 + ], + "tag": null, + "to": [ + 67.4796, + -8.4668 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 51946, + 52017, + 0 + ] + }, + "from": [ + 67.4796, + -8.4668 + ], + "tag": null, + "to": [ + 67.0088, + -7.9763 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 52023, + 52094, + 0 + ] + }, + "from": [ + 67.0088, + -7.9763 + ], + "tag": null, + "to": [ + 66.176, + -7.5086 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 52100, + 52173, + 0 + ] + }, + "from": [ + 66.176, + -7.5086 + ], + "tag": null, + "to": [ + 65.3648, + -7.9267 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 52179, + 52251, + 0 + ] + }, + "from": [ + 65.3648, + -7.9267 + ], + "tag": null, + "to": [ + 65.4029, + -7.6701 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 52257, + 52329, + 0 + ] + }, + "from": [ + 65.4029, + -7.6701 + ], + "tag": null, + "to": [ + 65.6424, + -7.2331 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 52335, + 52407, + 0 + ] + }, + "from": [ + 65.6424, + -7.2331 + ], + "tag": null, + "to": [ + 65.4796, + -6.4267 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 52413, + 52487, + 0 + ] + }, + "from": [ + 65.4796, + -6.4267 + ], + "tag": null, + "to": [ + 65.3899, + -6.5156 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 52493, + 52565, + 0 + ] + }, + "from": [ + 65.3899, + -6.5156 + ], + "tag": null, + "to": [ + 66.3102, + -6.689 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 52571, + 52645, + 0 + ] + }, + "from": [ + 66.3102, + -6.689 + ], + "tag": null, + "to": [ + 66.312, + -7.2068 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 52651, + 52722, + 0 + ] + }, + "from": [ + 66.312, + -7.2068 + ], + "tag": null, + "to": [ + 66.9326, + -8.0802 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 52728, + 52799, + 0 + ] + }, + "from": [ + 66.9326, + -8.0802 + ], + "tag": null, + "to": [ + 66.155, + -7.3199 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 52805, + 52854, + 0 + ] + }, + "from": [ + 66.155, + -7.3199 + ], + "tag": null, + "to": [ + 66.6989, + -6.475 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 52860, + 52934, + 0 + ] + }, + "from": [ + 66.6989, + -6.475 + ], + "tag": null, + "to": [ + 66.5685, + -6.4629 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 52940, + 53013, + 0 + ] + }, + "from": [ + 66.5685, + -6.4629 + ], + "tag": null, + "to": [ + 66.4029, + -6.6707 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 53019, + 53092, + 0 + ] + }, + "from": [ + 66.4029, + -6.6707 + ], + "tag": null, + "to": [ + 66.3066, + -6.7249 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 53098, + 53146, + 0 + ] + }, + "from": [ + 66.3066, + -6.7249 + ], + "tag": null, + "to": [ + 67.2087, + -6.329 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 53152, + 53225, + 0 + ] + }, + "from": [ + 67.2087, + -6.329 + ], + "tag": null, + "to": [ + 67.4887, + -6.5068 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 53231, + 53279, + 0 + ] + }, + "from": [ + 67.4887, + -6.5068 + ], + "tag": null, + "to": [ + 68.0123, + -5.8124 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 53285, + 53357, + 0 + ] + }, + "from": [ + 68.0123, + -5.8124 + ], + "tag": null, + "to": [ + 68.4037, + -6.5964 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 53363, + 53412, + 0 + ] + }, + "from": [ + 68.4037, + -6.5964 + ], + "tag": null, + "to": [ + 69.2451, + -6.0569 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 53418, + 53489, + 0 + ] + }, + "from": [ + 69.2451, + -6.0569 + ], + "tag": null, + "to": [ + 69.8589, + -5.8357 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 53495, + 53544, + 0 + ] + }, + "from": [ + 69.8589, + -5.8357 + ], + "tag": null, + "to": [ + 70.7419, + -5.136 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 53550, + 53623, + 0 + ] + }, + "from": [ + 70.7419, + -5.136 + ], + "tag": null, + "to": [ + 70.329, + -5.5513 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 53629, + 53700, + 0 + ] + }, + "from": [ + 70.329, + -5.5513 + ], + "tag": null, + "to": [ + 70.846, + -6.4598 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 53706, + 53778, + 0 + ] + }, + "from": [ + 70.846, + -6.4598 + ], + "tag": null, + "to": [ + 70.1744, + -7.4204 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 53784, + 53858, + 0 + ] + }, + "from": [ + 70.1744, + -7.4204 + ], + "tag": null, + "to": [ + 70.1846, + -7.7938 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 53864, + 53937, + 0 + ] + }, + "from": [ + 70.1846, + -7.7938 + ], + "tag": null, + "to": [ + 70.2882, + -8.2167 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 53943, + 54015, + 0 + ] + }, + "from": [ + 70.2882, + -8.2167 + ], + "tag": null, + "to": [ + 70.7402, + -8.3291 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 54021, + 54093, + 0 + ] + }, + "from": [ + 70.7402, + -8.3291 + ], + "tag": null, + "to": [ + 69.8581, + -9.0446 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 54099, + 54148, + 0 + ] + }, + "from": [ + 69.8581, + -9.0446 + ], + "tag": null, + "to": [ + 70.7777, + -8.7754 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 54154, + 54225, + 0 + ] + }, + "from": [ + 70.7777, + -8.7754 + ], + "tag": null, + "to": [ + 71.4876, + -8.6583 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 54231, + 54303, + 0 + ] + }, + "from": [ + 71.4876, + -8.6583 + ], + "tag": null, + "to": [ + 71.1088, + -7.9477 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 54309, + 54383, + 0 + ] + }, + "from": [ + 71.1088, + -7.9477 + ], + "tag": null, + "to": [ + 70.8115, + -8.0142 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 54389, + 54461, + 0 + ] + }, + "from": [ + 70.8115, + -8.0142 + ], + "tag": null, + "to": [ + 71.0412, + -8.7743 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 54467, + 54539, + 0 + ] + }, + "from": [ + 71.0412, + -8.7743 + ], + "tag": null, + "to": [ + 70.4055, + -8.5798 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 54545, + 54594, + 0 + ] + }, + "from": [ + 70.4055, + -8.5798 + ], + "tag": null, + "to": [ + 70.9777, + -8.2909 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 54600, + 54673, + 0 + ] + }, + "from": [ + 70.9777, + -8.2909 + ], + "tag": null, + "to": [ + 70.0196, + -8.3133 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 54679, + 54750, + 0 + ] + }, + "from": [ + 70.0196, + -8.3133 + ], + "tag": null, + "to": [ + 70.3495, + -9.1487 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 54756, + 54827, + 0 + ] + }, + "from": [ + 70.3495, + -9.1487 + ], + "tag": null, + "to": [ + 71.093, + -9.9407 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 54833, + 54882, + 0 + ] + }, + "from": [ + 71.093, + -9.9407 + ], + "tag": null, + "to": [ + 72.0866, + -9.0364 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 54888, + 54959, + 0 + ] + }, + "from": [ + 72.0866, + -9.0364 + ], + "tag": null, + "to": [ + 71.583, + -8.5213 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 54965, + 55014, + 0 + ] + }, + "from": [ + 71.583, + -8.5213 + ], + "tag": null, + "to": [ + 72.1356, + -7.7601 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 55020, + 55091, + 0 + ] + }, + "from": [ + 72.1356, + -7.7601 + ], + "tag": null, + "to": [ + 72.9949, + -7.6759 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 55097, + 55168, + 0 + ] + }, + "from": [ + 72.9949, + -7.6759 + ], + "tag": null, + "to": [ + 72.1768, + -8.5795 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 55174, + 55246, + 0 + ] + }, + "from": [ + 72.1768, + -8.5795 + ], + "tag": null, + "to": [ + 72.4934, + -8.8214 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 55252, + 55326, + 0 + ] + }, + "from": [ + 72.4934, + -8.8214 + ], + "tag": null, + "to": [ + 72.0495, + -9.0805 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 55332, + 55405, + 0 + ] + }, + "from": [ + 72.0495, + -9.0805 + ], + "tag": null, + "to": [ + 71.389, + -9.484 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 55411, + 55483, + 0 + ] + }, + "from": [ + 71.389, + -9.484 + ], + "tag": null, + "to": [ + 70.6719, + -9.2495 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 55489, + 55562, + 0 + ] + }, + "from": [ + 70.6719, + -9.2495 + ], + "tag": null, + "to": [ + 70.4151, + -9.6998 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 55568, + 55639, + 0 + ] + }, + "from": [ + 70.4151, + -9.6998 + ], + "tag": null, + "to": [ + 71.0903, + -10.6707 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 55645, + 55716, + 0 + ] + }, + "from": [ + 71.0903, + -10.6707 + ], + "tag": null, + "to": [ + 70.5214, + -10.0788 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 55722, + 55793, + 0 + ] + }, + "from": [ + 70.5214, + -10.0788 + ], + "tag": null, + "to": [ + 69.6885, + -9.6111 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 55799, + 55872, + 0 + ] + }, + "from": [ + 69.6885, + -9.6111 + ], + "tag": null, + "to": [ + 68.8774, + -10.0292 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 55878, + 55950, + 0 + ] + }, + "from": [ + 68.8774, + -10.0292 + ], + "tag": null, + "to": [ + 68.9155, + -9.7726 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 55956, + 56028, + 0 + ] + }, + "from": [ + 68.9155, + -9.7726 + ], + "tag": null, + "to": [ + 69.155, + -9.3357 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 56034, + 56106, + 0 + ] + }, + "from": [ + 69.155, + -9.3357 + ], + "tag": null, + "to": [ + 68.9922, + -8.5292 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 56112, + 56186, + 0 + ] + }, + "from": [ + 68.9922, + -8.5292 + ], + "tag": null, + "to": [ + 68.9024, + -8.6181 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 56192, + 56264, + 0 + ] + }, + "from": [ + 68.9024, + -8.6181 + ], + "tag": null, + "to": [ + 69.8228, + -8.7915 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 56270, + 56344, + 0 + ] + }, + "from": [ + 69.8228, + -8.7915 + ], + "tag": null, + "to": [ + 69.8245, + -9.3094 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 56350, + 56421, + 0 + ] + }, + "from": [ + 69.8245, + -9.3094 + ], + "tag": null, + "to": [ + 70.4451, + -10.1827 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 56427, + 56498, + 0 + ] + }, + "from": [ + 70.4451, + -10.1827 + ], + "tag": null, + "to": [ + 69.6675, + -9.4224 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 56504, + 56553, + 0 + ] + }, + "from": [ + 69.6675, + -9.4224 + ], + "tag": null, + "to": [ + 70.2114, + -8.5775 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 56559, + 56633, + 0 + ] + }, + "from": [ + 70.2114, + -8.5775 + ], + "tag": null, + "to": [ + 70.0811, + -8.5655 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 56639, + 56712, + 0 + ] + }, + "from": [ + 70.0811, + -8.5655 + ], + "tag": null, + "to": [ + 69.9154, + -8.7732 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 56718, + 56791, + 0 + ] + }, + "from": [ + 69.9154, + -8.7732 + ], + "tag": null, + "to": [ + 69.8192, + -8.8274 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 56797, + 56845, + 0 + ] + }, + "from": [ + 69.8192, + -8.8274 + ], + "tag": null, + "to": [ + 70.7213, + -8.4315 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 56851, + 56924, + 0 + ] + }, + "from": [ + 70.7213, + -8.4315 + ], + "tag": null, + "to": [ + 71.0012, + -8.6093 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 56930, + 56978, + 0 + ] + }, + "from": [ + 71.0012, + -8.6093 + ], + "tag": null, + "to": [ + 71.5248, + -7.915 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 56984, + 57056, + 0 + ] + }, + "from": [ + 71.5248, + -7.915 + ], + "tag": null, + "to": [ + 71.9162, + -8.6989 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 57062, + 57111, + 0 + ] + }, + "from": [ + 71.9162, + -8.6989 + ], + "tag": null, + "to": [ + 72.7577, + -8.1594 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 57117, + 57188, + 0 + ] + }, + "from": [ + 72.7577, + -8.1594 + ], + "tag": null, + "to": [ + 73.3714, + -7.9382 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 57194, + 57243, + 0 + ] + }, + "from": [ + 73.3714, + -7.9382 + ], + "tag": null, + "to": [ + 74.2545, + -7.2385 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 57249, + 57322, + 0 + ] + }, + "from": [ + 74.2545, + -7.2385 + ], + "tag": null, + "to": [ + 73.8416, + -7.6538 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 57328, + 57399, + 0 + ] + }, + "from": [ + 73.8416, + -7.6538 + ], + "tag": null, + "to": [ + 74.3585, + -8.5623 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 57405, + 57476, + 0 + ] + }, + "from": [ + 74.3585, + -8.5623 + ], + "tag": null, + "to": [ + 75.0337, + -9.5333 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 57482, + 57553, + 0 + ] + }, + "from": [ + 75.0337, + -9.5333 + ], + "tag": null, + "to": [ + 74.4648, + -8.9414 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 57559, + 57630, + 0 + ] + }, + "from": [ + 74.4648, + -8.9414 + ], + "tag": null, + "to": [ + 75.4112, + -9.2099 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 57636, + 57685, + 0 + ] + }, + "from": [ + 75.4112, + -9.2099 + ], + "tag": null, + "to": [ + 75.9354, + -8.3087 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 57691, + 57764, + 0 + ] + }, + "from": [ + 75.9354, + -8.3087 + ], + "tag": null, + "to": [ + 75.7928, + -8.8282 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 57770, + 57842, + 0 + ] + }, + "from": [ + 75.7928, + -8.8282 + ], + "tag": null, + "to": [ + 75.3641, + -9.2505 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 57848, + 57921, + 0 + ] + }, + "from": [ + 75.3641, + -9.2505 + ], + "tag": null, + "to": [ + 75.2709, + -10.1568 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 57927, + 57998, + 0 + ] + }, + "from": [ + 75.2709, + -10.1568 + ], + "tag": null, + "to": [ + 74.9942, + -9.4752 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 58004, + 58075, + 0 + ] + }, + "from": [ + 74.9942, + -9.4752 + ], + "tag": null, + "to": [ + 75.9738, + -9.5574 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 58081, + 58152, + 0 + ] + }, + "from": [ + 75.9738, + -9.5574 + ], + "tag": null, + "to": [ + 75.1072, + -9.8585 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 58158, + 58229, + 0 + ] + }, + "from": [ + 75.1072, + -9.8585 + ], + "tag": null, + "to": [ + 75.6446, + -9.8382 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 58235, + 58306, + 0 + ] + }, + "from": [ + 75.6446, + -9.8382 + ], + "tag": null, + "to": [ + 76.5779, + -10.461 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 58312, + 58385, + 0 + ] + }, + "from": [ + 76.5779, + -10.461 + ], + "tag": null, + "to": [ + 76.7584, + -10.83 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 58391, + 58440, + 0 + ] + }, + "from": [ + 76.7584, + -10.83 + ], + "tag": null, + "to": [ + 77.2968, + -10.5922 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 58446, + 58518, + 0 + ] + }, + "from": [ + 77.2968, + -10.5922 + ], + "tag": null, + "to": [ + 77.6872, + -10.4495 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 58524, + 58595, + 0 + ] + }, + "from": [ + 77.6872, + -10.4495 + ], + "tag": null, + "to": [ + 77.7851, + -9.4587 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 58601, + 58672, + 0 + ] + }, + "from": [ + 77.7851, + -9.4587 + ], + "tag": null, + "to": [ + 78.3137, + -10.2511 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 58678, + 58749, + 0 + ] + }, + "from": [ + 78.3137, + -10.2511 + ], + "tag": null, + "to": [ + 78.6927, + -10.1272 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 58755, + 58826, + 0 + ] + }, + "from": [ + 78.6927, + -10.1272 + ], + "tag": null, + "to": [ + 77.7442, + -9.4542 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 58832, + 58904, + 0 + ] + }, + "from": [ + 77.7442, + -9.4542 + ], + "tag": null, + "to": [ + 78.4894, + -9.6674 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 58910, + 58982, + 0 + ] + }, + "from": [ + 78.4894, + -9.6674 + ], + "tag": null, + "to": [ + 78.6767, + -9.827 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 58988, + 59061, + 0 + ] + }, + "from": [ + 78.6767, + -9.827 + ], + "tag": null, + "to": [ + 78.6194, + -10.3707 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 59067, + 59140, + 0 + ] + }, + "from": [ + 78.6194, + -10.3707 + ], + "tag": null, + "to": [ + 78.5236, + -11.124 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 59146, + 59219, + 0 + ] + }, + "from": [ + 78.5236, + -11.124 + ], + "tag": null, + "to": [ + 78.3511, + -11.891 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 59225, + 59274, + 0 + ] + }, + "from": [ + 78.3511, + -11.891 + ], + "tag": null, + "to": [ + 79.2456, + -11.2816 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 59280, + 59352, + 0 + ] + }, + "from": [ + 79.2456, + -11.2816 + ], + "tag": null, + "to": [ + 78.8785, + -11.0696 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 59358, + 59429, + 0 + ] + }, + "from": [ + 78.8785, + -11.0696 + ], + "tag": null, + "to": [ + 78.4078, + -10.5791 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 59435, + 59506, + 0 + ] + }, + "from": [ + 78.4078, + -10.5791 + ], + "tag": null, + "to": [ + 77.5749, + -10.1113 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 59512, + 59585, + 0 + ] + }, + "from": [ + 77.5749, + -10.1113 + ], + "tag": null, + "to": [ + 76.7638, + -10.5295 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 59591, + 59663, + 0 + ] + }, + "from": [ + 76.7638, + -10.5295 + ], + "tag": null, + "to": [ + 76.8019, + -10.2728 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 59669, + 59741, + 0 + ] + }, + "from": [ + 76.8019, + -10.2728 + ], + "tag": null, + "to": [ + 77.0414, + -9.8359 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 59747, + 59819, + 0 + ] + }, + "from": [ + 77.0414, + -9.8359 + ], + "tag": null, + "to": [ + 76.8786, + -9.0295 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 59825, + 59899, + 0 + ] + }, + "from": [ + 76.8786, + -9.0295 + ], + "tag": null, + "to": [ + 76.7889, + -9.1183 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 59905, + 59977, + 0 + ] + }, + "from": [ + 76.7889, + -9.1183 + ], + "tag": null, + "to": [ + 77.7092, + -9.2918 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 59983, + 60057, + 0 + ] + }, + "from": [ + 77.7092, + -9.2918 + ], + "tag": null, + "to": [ + 77.711, + -9.8096 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 60063, + 60134, + 0 + ] + }, + "from": [ + 77.711, + -9.8096 + ], + "tag": null, + "to": [ + 78.3316, + -10.683 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 60140, + 60211, + 0 + ] + }, + "from": [ + 78.3316, + -10.683 + ], + "tag": null, + "to": [ + 77.5539, + -9.9227 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 60217, + 60266, + 0 + ] + }, + "from": [ + 77.5539, + -9.9227 + ], + "tag": null, + "to": [ + 78.0979, + -9.0778 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 60272, + 60346, + 0 + ] + }, + "from": [ + 78.0979, + -9.0778 + ], + "tag": null, + "to": [ + 77.9675, + -9.0657 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 60352, + 60425, + 0 + ] + }, + "from": [ + 77.9675, + -9.0657 + ], + "tag": null, + "to": [ + 77.8019, + -9.2735 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 60431, + 60504, + 0 + ] + }, + "from": [ + 77.8019, + -9.2735 + ], + "tag": null, + "to": [ + 77.7056, + -9.3276 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 60510, + 60558, + 0 + ] + }, + "from": [ + 77.7056, + -9.3276 + ], + "tag": null, + "to": [ + 78.6077, + -8.9317 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 60564, + 60637, + 0 + ] + }, + "from": [ + 78.6077, + -8.9317 + ], + "tag": null, + "to": [ + 78.8877, + -9.1095 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 60643, + 60691, + 0 + ] + }, + "from": [ + 78.8877, + -9.1095 + ], + "tag": null, + "to": [ + 79.4113, + -8.4152 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 60697, + 60769, + 0 + ] + }, + "from": [ + 79.4113, + -8.4152 + ], + "tag": null, + "to": [ + 79.8027, + -9.1992 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 60775, + 60824, + 0 + ] + }, + "from": [ + 79.8027, + -9.1992 + ], + "tag": null, + "to": [ + 80.6441, + -8.6596 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 60830, + 60901, + 0 + ] + }, + "from": [ + 80.6441, + -8.6596 + ], + "tag": null, + "to": [ + 81.2579, + -8.4384 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 60907, + 60956, + 0 + ] + }, + "from": [ + 81.2579, + -8.4384 + ], + "tag": null, + "to": [ + 82.1409, + -7.7388 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 60962, + 61035, + 0 + ] + }, + "from": [ + 82.1409, + -7.7388 + ], + "tag": null, + "to": [ + 81.728, + -8.154 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 61041, + 61112, + 0 + ] + }, + "from": [ + 81.728, + -8.154 + ], + "tag": null, + "to": [ + 82.245, + -9.0626 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 61118, + 61190, + 0 + ] + }, + "from": [ + 82.245, + -9.0626 + ], + "tag": null, + "to": [ + 81.5733, + -10.0231 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 61196, + 61270, + 0 + ] + }, + "from": [ + 81.5733, + -10.0231 + ], + "tag": null, + "to": [ + 81.5836, + -10.3966 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 61276, + 61349, + 0 + ] + }, + "from": [ + 81.5836, + -10.3966 + ], + "tag": null, + "to": [ + 81.6872, + -10.8195 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 61355, + 61427, + 0 + ] + }, + "from": [ + 81.6872, + -10.8195 + ], + "tag": null, + "to": [ + 82.1392, + -10.9318 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 61433, + 61505, + 0 + ] + }, + "from": [ + 82.1392, + -10.9318 + ], + "tag": null, + "to": [ + 81.2571, + -11.6474 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 61511, + 61560, + 0 + ] + }, + "from": [ + 81.2571, + -11.6474 + ], + "tag": null, + "to": [ + 82.1766, + -11.3782 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 61566, + 61637, + 0 + ] + }, + "from": [ + 82.1766, + -11.3782 + ], + "tag": null, + "to": [ + 82.8865, + -11.2611 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 61643, + 61715, + 0 + ] + }, + "from": [ + 82.8865, + -11.2611 + ], + "tag": null, + "to": [ + 82.5078, + -10.5504 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 61721, + 61795, + 0 + ] + }, + "from": [ + 82.5078, + -10.5504 + ], + "tag": null, + "to": [ + 82.2105, + -10.6169 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 61801, + 61873, + 0 + ] + }, + "from": [ + 82.2105, + -10.6169 + ], + "tag": null, + "to": [ + 82.4401, + -11.3771 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 61879, + 61951, + 0 + ] + }, + "from": [ + 82.4401, + -11.3771 + ], + "tag": null, + "to": [ + 81.8045, + -11.1825 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 61957, + 62006, + 0 + ] + }, + "from": [ + 81.8045, + -11.1825 + ], + "tag": null, + "to": [ + 82.3766, + -10.8937 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 62012, + 62085, + 0 + ] + }, + "from": [ + 82.3766, + -10.8937 + ], + "tag": null, + "to": [ + 81.4186, + -10.9161 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 62091, + 62162, + 0 + ] + }, + "from": [ + 81.4186, + -10.9161 + ], + "tag": null, + "to": [ + 81.7485, + -11.7515 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 62168, + 62239, + 0 + ] + }, + "from": [ + 81.7485, + -11.7515 + ], + "tag": null, + "to": [ + 82.492, + -12.5434 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 62245, + 62294, + 0 + ] + }, + "from": [ + 82.492, + -12.5434 + ], + "tag": null, + "to": [ + 83.4855, + -11.6392 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 62300, + 62371, + 0 + ] + }, + "from": [ + 83.4855, + -11.6392 + ], + "tag": null, + "to": [ + 82.982, + -11.1241 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 62377, + 62426, + 0 + ] + }, + "from": [ + 82.982, + -11.1241 + ], + "tag": null, + "to": [ + 83.5346, + -10.3628 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 62432, + 62503, + 0 + ] + }, + "from": [ + 83.5346, + -10.3628 + ], + "tag": null, + "to": [ + 84.3939, + -10.2787 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 62509, + 62580, + 0 + ] + }, + "from": [ + 84.3939, + -10.2787 + ], + "tag": null, + "to": [ + 83.5758, + -11.1822 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 62586, + 62658, + 0 + ] + }, + "from": [ + 83.5758, + -11.1822 + ], + "tag": null, + "to": [ + 83.8924, + -11.4241 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 62664, + 62738, + 0 + ] + }, + "from": [ + 83.8924, + -11.4241 + ], + "tag": null, + "to": [ + 83.4485, + -11.6832 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 62744, + 62817, + 0 + ] + }, + "from": [ + 83.4485, + -11.6832 + ], + "tag": null, + "to": [ + 82.788, + -12.0868 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 62823, + 62895, + 0 + ] + }, + "from": [ + 82.788, + -12.0868 + ], + "tag": null, + "to": [ + 82.0709, + -11.8523 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 62901, + 62974, + 0 + ] + }, + "from": [ + 82.0709, + -11.8523 + ], + "tag": null, + "to": [ + 81.8141, + -12.3026 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 62980, + 63051, + 0 + ] + }, + "from": [ + 81.8141, + -12.3026 + ], + "tag": null, + "to": [ + 82.4893, + -13.2735 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 63057, + 63128, + 0 + ] + }, + "from": [ + 82.4893, + -13.2735 + ], + "tag": null, + "to": [ + 81.9203, + -12.6816 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 63134, + 63205, + 0 + ] + }, + "from": [ + 81.9203, + -12.6816 + ], + "tag": null, + "to": [ + 81.0875, + -12.2139 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 63211, + 63284, + 0 + ] + }, + "from": [ + 81.0875, + -12.2139 + ], + "tag": null, + "to": [ + 80.2763, + -12.632 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 63290, + 63362, + 0 + ] + }, + "from": [ + 80.2763, + -12.632 + ], + "tag": null, + "to": [ + 80.3144, + -12.3754 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 63368, + 63440, + 0 + ] + }, + "from": [ + 80.3144, + -12.3754 + ], + "tag": null, + "to": [ + 80.5539, + -11.9384 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 63446, + 63518, + 0 + ] + }, + "from": [ + 80.5539, + -11.9384 + ], + "tag": null, + "to": [ + 80.3911, + -11.132 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 63524, + 63598, + 0 + ] + }, + "from": [ + 80.3911, + -11.132 + ], + "tag": null, + "to": [ + 80.3014, + -11.2209 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 63604, + 63676, + 0 + ] + }, + "from": [ + 80.3014, + -11.2209 + ], + "tag": null, + "to": [ + 81.2217, + -11.3943 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 63682, + 63756, + 0 + ] + }, + "from": [ + 81.2217, + -11.3943 + ], + "tag": null, + "to": [ + 81.2235, + -11.9121 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 63762, + 63833, + 0 + ] + }, + "from": [ + 81.2235, + -11.9121 + ], + "tag": null, + "to": [ + 81.8441, + -12.7855 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 63839, + 63910, + 0 + ] + }, + "from": [ + 81.8441, + -12.7855 + ], + "tag": null, + "to": [ + 81.0665, + -12.0252 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 63916, + 63965, + 0 + ] + }, + "from": [ + 81.0665, + -12.0252 + ], + "tag": null, + "to": [ + 81.6104, + -11.1803 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 63971, + 64045, + 0 + ] + }, + "from": [ + 81.6104, + -11.1803 + ], + "tag": null, + "to": [ + 81.48, + -11.1682 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 64051, + 64124, + 0 + ] + }, + "from": [ + 81.48, + -11.1682 + ], + "tag": null, + "to": [ + 81.3144, + -11.376 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 64130, + 64203, + 0 + ] + }, + "from": [ + 81.3144, + -11.376 + ], + "tag": null, + "to": [ + 81.2181, + -11.4302 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 64209, + 64257, + 0 + ] + }, + "from": [ + 81.2181, + -11.4302 + ], + "tag": null, + "to": [ + 82.1202, + -11.0343 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 64263, + 64336, + 0 + ] + }, + "from": [ + 82.1202, + -11.0343 + ], + "tag": null, + "to": [ + 82.4002, + -11.212 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 64342, + 64390, + 0 + ] + }, + "from": [ + 82.4002, + -11.212 + ], + "tag": null, + "to": [ + 82.9238, + -10.5177 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 64396, + 64468, + 0 + ] + }, + "from": [ + 82.9238, + -10.5177 + ], + "tag": null, + "to": [ + 83.3152, + -11.3017 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 64474, + 64523, + 0 + ] + }, + "from": [ + 83.3152, + -11.3017 + ], + "tag": null, + "to": [ + 84.1566, + -10.7621 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 64529, + 64600, + 0 + ] + }, + "from": [ + 84.1566, + -10.7621 + ], + "tag": null, + "to": [ + 84.7704, + -10.541 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 64606, + 64655, + 0 + ] + }, + "from": [ + 84.7704, + -10.541 + ], + "tag": null, + "to": [ + 85.6534, + -9.8413 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 64661, + 64733, + 0 + ] + }, + "from": [ + 85.6534, + -9.8413 + ], + "tag": null, + "to": [ + 85.2864, + -9.6293 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 64739, + 64810, + 0 + ] + }, + "from": [ + 85.2864, + -9.6293 + ], + "tag": null, + "to": [ + 84.8157, + -9.1387 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 64816, + 64887, + 0 + ] + }, + "from": [ + 84.8157, + -9.1387 + ], + "tag": null, + "to": [ + 83.9828, + -8.671 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 64893, + 64966, + 0 + ] + }, + "from": [ + 83.9828, + -8.671 + ], + "tag": null, + "to": [ + 83.1717, + -9.0891 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 64972, + 65044, + 0 + ] + }, + "from": [ + 83.1717, + -9.0891 + ], + "tag": null, + "to": [ + 83.2098, + -8.8325 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 65050, + 65122, + 0 + ] + }, + "from": [ + 83.2098, + -8.8325 + ], + "tag": null, + "to": [ + 83.4493, + -8.3956 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 65128, + 65200, + 0 + ] + }, + "from": [ + 83.4493, + -8.3956 + ], + "tag": null, + "to": [ + 83.2865, + -7.5891 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 65206, + 65280, + 0 + ] + }, + "from": [ + 83.2865, + -7.5891 + ], + "tag": null, + "to": [ + 83.1967, + -7.678 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 65286, + 65358, + 0 + ] + }, + "from": [ + 83.1967, + -7.678 + ], + "tag": null, + "to": [ + 84.1171, + -7.8514 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 65364, + 65438, + 0 + ] + }, + "from": [ + 84.1171, + -7.8514 + ], + "tag": null, + "to": [ + 84.1188, + -8.3693 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 65444, + 65515, + 0 + ] + }, + "from": [ + 84.1188, + -8.3693 + ], + "tag": null, + "to": [ + 84.7395, + -9.2426 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 65521, + 65592, + 0 + ] + }, + "from": [ + 84.7395, + -9.2426 + ], + "tag": null, + "to": [ + 83.9618, + -8.4823 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 65598, + 65647, + 0 + ] + }, + "from": [ + 83.9618, + -8.4823 + ], + "tag": null, + "to": [ + 84.5058, + -7.6374 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 65653, + 65727, + 0 + ] + }, + "from": [ + 84.5058, + -7.6374 + ], + "tag": null, + "to": [ + 84.3754, + -7.6254 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 65733, + 65806, + 0 + ] + }, + "from": [ + 84.3754, + -7.6254 + ], + "tag": null, + "to": [ + 84.2098, + -7.8331 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 65812, + 65885, + 0 + ] + }, + "from": [ + 84.2098, + -7.8331 + ], + "tag": null, + "to": [ + 84.1135, + -7.8873 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 65891, + 65939, + 0 + ] + }, + "from": [ + 84.1135, + -7.8873 + ], + "tag": null, + "to": [ + 85.0156, + -7.4914 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 65945, + 66018, + 0 + ] + }, + "from": [ + 85.0156, + -7.4914 + ], + "tag": null, + "to": [ + 85.2956, + -7.6692 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66024, + 66072, + 0 + ] + }, + "from": [ + 85.2956, + -7.6692 + ], + "tag": null, + "to": [ + 85.8192, + -6.9749 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66078, + 66150, + 0 + ] + }, + "from": [ + 85.8192, + -6.9749 + ], + "tag": null, + "to": [ + 86.2106, + -7.7588 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66156, + 66205, + 0 + ] + }, + "from": [ + 86.2106, + -7.7588 + ], + "tag": null, + "to": [ + 87.052, + -7.2193 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66211, + 66282, + 0 + ] + }, + "from": [ + 87.052, + -7.2193 + ], + "tag": null, + "to": [ + 87.6657, + -6.9981 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66288, + 66337, + 0 + ] + }, + "from": [ + 87.6657, + -6.9981 + ], + "tag": null, + "to": [ + 88.5488, + -6.2984 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66343, + 66416, + 0 + ] + }, + "from": [ + 88.5488, + -6.2984 + ], + "tag": null, + "to": [ + 88.1359, + -6.7137 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66422, + 66493, + 0 + ] + }, + "from": [ + 88.1359, + -6.7137 + ], + "tag": null, + "to": [ + 88.6528, + -7.6222 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66499, + 66571, + 0 + ] + }, + "from": [ + 88.6528, + -7.6222 + ], + "tag": null, + "to": [ + 87.9812, + -8.5828 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66577, + 66651, + 0 + ] + }, + "from": [ + 87.9812, + -8.5828 + ], + "tag": null, + "to": [ + 87.9915, + -8.9562 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66657, + 66730, + 0 + ] + }, + "from": [ + 87.9915, + -8.9562 + ], + "tag": null, + "to": [ + 88.0951, + -9.3792 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66736, + 66808, + 0 + ] + }, + "from": [ + 88.0951, + -9.3792 + ], + "tag": null, + "to": [ + 88.5471, + -9.4915 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66814, + 66886, + 0 + ] + }, + "from": [ + 88.5471, + -9.4915 + ], + "tag": null, + "to": [ + 87.665, + -10.207 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66892, + 66941, + 0 + ] + }, + "from": [ + 87.665, + -10.207 + ], + "tag": null, + "to": [ + 88.5845, + -9.9379 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66947, + 67018, + 0 + ] + }, + "from": [ + 88.5845, + -9.9379 + ], + "tag": null, + "to": [ + 89.2944, + -9.8208 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 67024, + 67096, + 0 + ] + }, + "from": [ + 89.2944, + -9.8208 + ], + "tag": null, + "to": [ + 88.9157, + -9.1101 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 67102, + 67176, + 0 + ] + }, + "from": [ + 88.9157, + -9.1101 + ], + "tag": null, + "to": [ + 88.6184, + -9.1766 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 67182, + 67254, + 0 + ] + }, + "from": [ + 88.6184, + -9.1766 + ], + "tag": null, + "to": [ + 88.848, + -9.9368 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 67260, + 67332, + 0 + ] + }, + "from": [ + 88.848, + -9.9368 + ], + "tag": null, + "to": [ + 88.2124, + -9.7422 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 67338, + 67387, + 0 + ] + }, + "from": [ + 88.2124, + -9.7422 + ], + "tag": null, + "to": [ + 88.7845, + -9.4533 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 67393, + 67466, + 0 + ] + }, + "from": [ + 88.7845, + -9.4533 + ], + "tag": null, + "to": [ + 87.8265, + -9.4758 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 67472, + 67543, + 0 + ] + }, + "from": [ + 87.8265, + -9.4758 + ], + "tag": null, + "to": [ + 88.1564, + -10.3111 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 67549, + 67620, + 0 + ] + }, + "from": [ + 88.1564, + -10.3111 + ], + "tag": null, + "to": [ + 88.8999, + -11.1031 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 67626, + 67675, + 0 + ] + }, + "from": [ + 88.8999, + -11.1031 + ], + "tag": null, + "to": [ + 89.8934, + -10.1988 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 67681, + 67752, + 0 + ] + }, + "from": [ + 89.8934, + -10.1988 + ], + "tag": null, + "to": [ + 89.3898, + -9.6837 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 67758, + 67807, + 0 + ] + }, + "from": [ + 89.3898, + -9.6837 + ], + "tag": null, + "to": [ + 89.9425, + -8.9225 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 67813, + 67884, + 0 + ] + }, + "from": [ + 89.9425, + -8.9225 + ], + "tag": null, + "to": [ + 90.8018, + -8.8383 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 67890, + 67961, + 0 + ] + }, + "from": [ + 90.8018, + -8.8383 + ], + "tag": null, + "to": [ + 89.9837, + -9.7419 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 67967, + 68039, + 0 + ] + }, + "from": [ + 89.9837, + -9.7419 + ], + "tag": null, + "to": [ + 90.3003, + -9.9838 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 68045, + 68119, + 0 + ] + }, + "from": [ + 90.3003, + -9.9838 + ], + "tag": null, + "to": [ + 89.8564, + -10.2429 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 68125, + 68198, + 0 + ] + }, + "from": [ + 89.8564, + -10.2429 + ], + "tag": null, + "to": [ + 89.1958, + -10.6465 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 68204, + 68276, + 0 + ] + }, + "from": [ + 89.1958, + -10.6465 + ], + "tag": null, + "to": [ + 88.4788, + -10.4119 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 68282, + 68355, + 0 + ] + }, + "from": [ + 88.4788, + -10.4119 + ], + "tag": null, + "to": [ + 88.222, + -10.8622 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 68361, + 68432, + 0 + ] + }, + "from": [ + 88.222, + -10.8622 + ], + "tag": null, + "to": [ + 88.8972, + -11.8332 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 68438, + 68509, + 0 + ] + }, + "from": [ + 88.8972, + -11.8332 + ], + "tag": null, + "to": [ + 88.3282, + -11.2413 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 68515, + 68586, + 0 + ] + }, + "from": [ + 88.3282, + -11.2413 + ], + "tag": null, + "to": [ + 87.4954, + -10.7735 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 68592, + 68665, + 0 + ] + }, + "from": [ + 87.4954, + -10.7735 + ], + "tag": null, + "to": [ + 86.6842, + -11.1917 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 68671, + 68743, + 0 + ] + }, + "from": [ + 86.6842, + -11.1917 + ], + "tag": null, + "to": [ + 86.7223, + -10.935 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 68749, + 68821, + 0 + ] + }, + "from": [ + 86.7223, + -10.935 + ], + "tag": null, + "to": [ + 86.9618, + -10.4981 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 68827, + 68899, + 0 + ] + }, + "from": [ + 86.9618, + -10.4981 + ], + "tag": null, + "to": [ + 86.799, + -9.6916 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 68905, + 68979, + 0 + ] + }, + "from": [ + 86.799, + -9.6916 + ], + "tag": null, + "to": [ + 86.7093, + -9.7805 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 68985, + 69057, + 0 + ] + }, + "from": [ + 86.7093, + -9.7805 + ], + "tag": null, + "to": [ + 87.6296, + -9.9539 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 69063, + 69137, + 0 + ] + }, + "from": [ + 87.6296, + -9.9539 + ], + "tag": null, + "to": [ + 87.6314, + -10.4718 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 69143, + 69214, + 0 + ] + }, + "from": [ + 87.6314, + -10.4718 + ], + "tag": null, + "to": [ + 88.252, + -11.3451 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 69220, + 69291, + 0 + ] + }, + "from": [ + 88.252, + -11.3451 + ], + "tag": null, + "to": [ + 87.4744, + -10.5849 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 69297, + 69346, + 0 + ] + }, + "from": [ + 87.4744, + -10.5849 + ], + "tag": null, + "to": [ + 88.0183, + -9.7399 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 69352, + 69426, + 0 + ] + }, + "from": [ + 88.0183, + -9.7399 + ], + "tag": null, + "to": [ + 87.8879, + -9.7279 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 69432, + 69505, + 0 + ] + }, + "from": [ + 87.8879, + -9.7279 + ], + "tag": null, + "to": [ + 87.7223, + -9.9356 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 69511, + 69584, + 0 + ] + }, + "from": [ + 87.7223, + -9.9356 + ], + "tag": null, + "to": [ + 87.626, + -9.9898 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 69590, + 69638, + 0 + ] + }, + "from": [ + 87.626, + -9.9898 + ], + "tag": null, + "to": [ + 88.5281, + -9.5939 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 69644, + 69717, + 0 + ] + }, + "from": [ + 88.5281, + -9.5939 + ], + "tag": null, + "to": [ + 88.8081, + -9.7717 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 69723, + 69771, + 0 + ] + }, + "from": [ + 88.8081, + -9.7717 + ], + "tag": null, + "to": [ + 89.3317, + -9.0774 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 69777, + 69849, + 0 + ] + }, + "from": [ + 89.3317, + -9.0774 + ], + "tag": null, + "to": [ + 89.7231, + -9.8614 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 69855, + 69904, + 0 + ] + }, + "from": [ + 89.7231, + -9.8614 + ], + "tag": null, + "to": [ + 90.5645, + -9.3218 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 69910, + 69981, + 0 + ] + }, + "from": [ + 90.5645, + -9.3218 + ], + "tag": null, + "to": [ + 91.1783, + -9.1006 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 69987, + 70060, + 0 + ] + }, + "from": [ + 91.1783, + -9.1006 + ], + "tag": null, + "to": [ + 91.0825, + -9.854 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 70066, + 70139, + 0 + ] + }, + "from": [ + 91.0825, + -9.854 + ], + "tag": null, + "to": [ + 90.9099, + -10.6209 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 70145, + 70194, + 0 + ] + }, + "from": [ + 90.9099, + -10.6209 + ], + "tag": null, + "to": [ + 91.8044, + -10.0116 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 70200, + 70273, + 0 + ] + }, + "from": [ + 91.8044, + -10.0116 + ], + "tag": null, + "to": [ + 91.3915, + -10.4268 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 70279, + 70350, + 0 + ] + }, + "from": [ + 91.3915, + -10.4268 + ], + "tag": null, + "to": [ + 91.9084, + -11.3354 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 70356, + 70427, + 0 + ] + }, + "from": [ + 91.9084, + -11.3354 + ], + "tag": null, + "to": [ + 92.5836, + -12.3063 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 70433, + 70504, + 0 + ] + }, + "from": [ + 92.5836, + -12.3063 + ], + "tag": null, + "to": [ + 92.0147, + -11.7144 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 70510, + 70581, + 0 + ] + }, + "from": [ + 92.0147, + -11.7144 + ], + "tag": null, + "to": [ + 92.9611, + -11.9829 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 70587, + 70636, + 0 + ] + }, + "from": [ + 92.9611, + -11.9829 + ], + "tag": null, + "to": [ + 93.4853, + -11.0818 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 70642, + 70715, + 0 + ] + }, + "from": [ + 93.4853, + -11.0818 + ], + "tag": null, + "to": [ + 93.3427, + -11.6012 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 70721, + 70793, + 0 + ] + }, + "from": [ + 93.3427, + -11.6012 + ], + "tag": null, + "to": [ + 92.914, + -12.0236 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 70799, + 70872, + 0 + ] + }, + "from": [ + 92.914, + -12.0236 + ], + "tag": null, + "to": [ + 92.8209, + -12.9299 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 70878, + 70949, + 0 + ] + }, + "from": [ + 92.8209, + -12.9299 + ], + "tag": null, + "to": [ + 92.5441, + -12.2483 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 70955, + 71026, + 0 + ] + }, + "from": [ + 92.5441, + -12.2483 + ], + "tag": null, + "to": [ + 93.5238, + -12.3305 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 71032, + 71103, + 0 + ] + }, + "from": [ + 93.5238, + -12.3305 + ], + "tag": null, + "to": [ + 92.6571, + -12.6315 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 71109, + 71180, + 0 + ] + }, + "from": [ + 92.6571, + -12.6315 + ], + "tag": null, + "to": [ + 93.1945, + -12.6113 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 71186, + 71257, + 0 + ] + }, + "from": [ + 93.1945, + -12.6113 + ], + "tag": null, + "to": [ + 94.1278, + -13.2341 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 71263, + 71336, + 0 + ] + }, + "from": [ + 94.1278, + -13.2341 + ], + "tag": null, + "to": [ + 94.3083, + -13.603 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 71342, + 71391, + 0 + ] + }, + "from": [ + 94.3083, + -13.603 + ], + "tag": null, + "to": [ + 94.8467, + -13.3653 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 71397, + 71469, + 0 + ] + }, + "from": [ + 94.8467, + -13.3653 + ], + "tag": null, + "to": [ + 95.2372, + -13.2225 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 71475, + 71546, + 0 + ] + }, + "from": [ + 95.2372, + -13.2225 + ], + "tag": null, + "to": [ + 95.335, + -12.2318 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 71552, + 71623, + 0 + ] + }, + "from": [ + 95.335, + -12.2318 + ], + "tag": null, + "to": [ + 95.8637, + -13.0242 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 71629, + 71700, + 0 + ] + }, + "from": [ + 95.8637, + -13.0242 + ], + "tag": null, + "to": [ + 96.2427, + -12.9003 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 71706, + 71777, + 0 + ] + }, + "from": [ + 96.2427, + -12.9003 + ], + "tag": null, + "to": [ + 95.2942, + -12.2273 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 71783, + 71855, + 0 + ] + }, + "from": [ + 95.2942, + -12.2273 + ], + "tag": null, + "to": [ + 96.0393, + -12.4405 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 71861, + 71933, + 0 + ] + }, + "from": [ + 96.0393, + -12.4405 + ], + "tag": null, + "to": [ + 96.2267, + -12.6001 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 71939, + 72012, + 0 + ] + }, + "from": [ + 96.2267, + -12.6001 + ], + "tag": null, + "to": [ + 96.1694, + -13.1437 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72018, + 72091, + 0 + ] + }, + "from": [ + 96.1694, + -13.1437 + ], + "tag": null, + "to": [ + 96.0735, + -13.8971 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72097, + 72170, + 0 + ] + }, + "from": [ + 96.0735, + -13.8971 + ], + "tag": null, + "to": [ + 95.901, + -14.664 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72176, + 72225, + 0 + ] + }, + "from": [ + 95.901, + -14.664 + ], + "tag": null, + "to": [ + 96.7955, + -14.0547 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72231, + 72302, + 0 + ] + }, + "from": [ + 96.7955, + -14.0547 + ], + "tag": null, + "to": [ + 96.1716, + -13.6493 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72308, + 72380, + 0 + ] + }, + "from": [ + 96.1716, + -13.6493 + ], + "tag": null, + "to": [ + 96.3096, + -14.128 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72386, + 72457, + 0 + ] + }, + "from": [ + 96.3096, + -14.128 + ], + "tag": null, + "to": [ + 95.3579, + -13.266 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72463, + 72512, + 0 + ] + }, + "from": [ + 95.3579, + -13.266 + ], + "tag": null, + "to": [ + 96.2978, + -12.6334 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72518, + 72591, + 0 + ] + }, + "from": [ + 96.2978, + -12.6334 + ], + "tag": null, + "to": [ + 95.4346, + -12.6173 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72597, + 72669, + 0 + ] + }, + "from": [ + 95.4346, + -12.6173 + ], + "tag": null, + "to": [ + 95.6262, + -13.1089 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72675, + 72748, + 0 + ] + }, + "from": [ + 95.6262, + -13.1089 + ], + "tag": null, + "to": [ + 94.7618, + -13.2233 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72754, + 72828, + 0 + ] + }, + "from": [ + 94.7618, + -13.2233 + ], + "tag": null, + "to": [ + 94.7327, + -13.7447 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72834, + 72905, + 0 + ] + }, + "from": [ + 94.7327, + -13.7447 + ], + "tag": null, + "to": [ + 93.8614, + -12.958 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72911, + 72960, + 0 + ] + }, + "from": [ + 93.8614, + -12.958 + ], + "tag": null, + "to": [ + 94.7458, + -13.1406 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 72966, + 73037, + 0 + ] + }, + "from": [ + 94.7458, + -13.1406 + ], + "tag": null, + "to": [ + 94.0479, + -13.0965 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 73043, + 73118, + 0 + ] + }, + "from": [ + 94.0479, + -13.0965 + ], + "tag": null, + "to": [ + 93.5674, + -13.1251 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 73124, + 73197, + 0 + ] + }, + "from": [ + 93.5674, + -13.1251 + ], + "tag": null, + "to": [ + 93.9802, + -13.5744 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 73203, + 73251, + 0 + ] + }, + "from": [ + 93.9802, + -13.5744 + ], + "tag": null, + "to": [ + 94.7713, + -12.681 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 73257, + 73328, + 0 + ] + }, + "from": [ + 94.7713, + -12.681 + ], + "tag": null, + "to": [ + 95.4221, + -13.37 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 73334, + 73406, + 0 + ] + }, + "from": [ + 95.4221, + -13.37 + ], + "tag": null, + "to": [ + 95.527, + -13.9168 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 73412, + 73484, + 0 + ] + }, + "from": [ + 95.527, + -13.9168 + ], + "tag": null, + "to": [ + 94.9509, + -14.1807 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 73490, + 73561, + 0 + ] + }, + "from": [ + 94.9509, + -14.1807 + ], + "tag": null, + "to": [ + 95.3492, + -13.3771 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 73567, + 73616, + 0 + ] + }, + "from": [ + 95.3492, + -13.3771 + ], + "tag": null, + "to": [ + 94.6753, + -14.2955 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 73622, + 73694, + 0 + ] + }, + "from": [ + 94.6753, + -14.2955 + ], + "tag": null, + "to": [ + 93.8154, + -15.2455 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 73700, + 73771, + 0 + ] + }, + "from": [ + 93.8154, + -15.2455 + ], + "tag": null, + "to": [ + 94.4439, + -15.7641 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 73777, + 73848, + 0 + ] + }, + "from": [ + 94.4439, + -15.7641 + ], + "tag": null, + "to": [ + 94.7662, + -15.5179 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 73854, + 73926, + 0 + ] + }, + "from": [ + 94.7662, + -15.5179 + ], + "tag": null, + "to": [ + 94.9637, + -16.2708 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 73932, + 74005, + 0 + ] + }, + "from": [ + 94.9637, + -16.2708 + ], + "tag": null, + "to": [ + 94.5319, + -16.0814 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 74011, + 74082, + 0 + ] + }, + "from": [ + 94.5319, + -16.0814 + ], + "tag": null, + "to": [ + 95.4034, + -16.803 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 74088, + 74096, + 0 + ] + }, + "from": [ + 95.4034, + -16.803 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35, + 64, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 35, + 64, + 0 + ] + } + ] + }, + "height": 5.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 35, + 64, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/mike_stress_test/rendered_model.png b/src/wasm-lib/kcl/tests/mike_stress_test/rendered_model.png new file mode 100644 index 000000000..fe02cc6e6 Binary files /dev/null and b/src/wasm-lib/kcl/tests/mike_stress_test/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/multi_transform/ast.snap b/src/wasm-lib/kcl/tests/multi_transform/ast.snap new file mode 100644 index 000000000..9a8b6ca53 --- /dev/null +++ b/src/wasm-lib/kcl/tests/multi_transform/ast.snap @@ -0,0 +1,450 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing multi_transform.kcl +snapshot_kind: text +--- +{ + "Ok": { + "body": [ + { + "declarations": [ + { + "end": 111, + "id": { + "end": 12, + "name": "transform", + "start": 3, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "elements": [ + { + "end": 68, + "properties": [ + { + "end": 66, + "key": { + "end": 50, + "name": "translate", + "start": 41, + "type": "Identifier" + }, + "start": 41, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 59, + "left": { + "end": 55, + "raw": "30", + "start": 53, + "type": "Literal", + "type": "Literal", + "value": 30 + }, + "operator": "*", + "right": { + "end": 59, + "name": "i", + "start": 58, + "type": "Identifier", + "type": "Identifier" + }, + "start": 53, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 62, + "raw": "0", + "start": 61, + "type": "Literal", + "type": "Literal", + "value": 0 + }, + { + "end": 65, + "raw": "0", + "start": 64, + "type": "Literal", + "type": "Literal", + "value": 0 + } + ], + "end": 66, + "start": 52, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "start": 39, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 105, + "properties": [ + { + "end": 103, + "key": { + "end": 84, + "name": "rotation", + "start": 76, + "type": "Identifier" + }, + "start": 76, + "type": "ObjectProperty", + "value": { + "end": 103, + "properties": [ + { + "end": 101, + "key": { + "end": 93, + "name": "angle", + "start": 88, + "type": "Identifier" + }, + "start": 88, + "type": "ObjectProperty", + "value": { + "end": 101, + "left": { + "end": 97, + "raw": "45", + "start": 95, + "type": "Literal", + "type": "Literal", + "value": 45 + }, + "operator": "*", + "right": { + "end": 101, + "name": "i", + "start": 100, + "type": "Identifier", + "type": "Identifier" + }, + "start": 95, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + } + ], + "start": 86, + "type": "ObjectExpression", + "type": "ObjectExpression" + } + } + ], + "start": 74, + "type": "ObjectExpression", + "type": "ObjectExpression" + } + ], + "end": 109, + "start": 33, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "end": 109, + "start": 26, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 111, + "start": 22 + }, + "end": 111, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 17, + "name": "i", + "start": 16, + "type": "Identifier" + }, + "optional": false + } + ], + "start": 15, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" + } + ], + "end": 111, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 303, + "expression": { + "body": [ + { + "arguments": [ + { + "elements": [ + { + "end": 128, + "raw": "0", + "start": 127, + "type": "Literal", + "type": "Literal", + "value": 0 + }, + { + "end": 131, + "raw": "0", + "start": 130, + "type": "Literal", + "type": "Literal", + "value": 0 + } + ], + "end": 132, + "start": 126, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + ], + "callee": { + "end": 125, + "name": "startSketchAt", + "start": 112, + "type": "Identifier" + }, + "end": 133, + "optional": false, + "start": 112, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 241, + "properties": [ + { + "end": 166, + "key": { + "end": 162, + "name": "radius", + "start": 156, + "type": "Identifier" + }, + "start": 156, + "type": "ObjectProperty", + "value": { + "end": 166, + "raw": "10", + "start": 164, + "type": "Literal", + "type": "Literal", + "value": 10 + } + }, + { + "end": 186, + "key": { + "end": 183, + "name": "numSides", + "start": 175, + "type": "Identifier" + }, + "start": 175, + "type": "ObjectProperty", + "value": { + "end": 186, + "raw": "4", + "start": 185, + "type": "Literal", + "type": "Literal", + "value": 4 + } + }, + { + "end": 209, + "key": { + "end": 201, + "name": "center", + "start": 195, + "type": "Identifier" + }, + "start": 195, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 205, + "raw": "0", + "start": 204, + "type": "Literal", + "type": "Literal", + "value": 0 + }, + { + "end": 208, + "raw": "0", + "start": 207, + "type": "Literal", + "type": "Literal", + "value": 0 + } + ], + "end": 209, + "start": 203, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "end": 234, + "key": { + "end": 227, + "name": "inscribed", + "start": 218, + "type": "Identifier" + }, + "start": 218, + "type": "ObjectProperty", + "value": { + "end": 234, + "raw": "false", + "start": 229, + "type": "Literal", + "type": "Literal", + "value": false + } + } + ], + "start": 147, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 244, + "start": 243, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 146, + "name": "polygon", + "start": 139, + "type": "Identifier" + }, + "end": 245, + "optional": false, + "start": 139, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 260, + "raw": "4", + "start": 259, + "type": "Literal", + "type": "Literal", + "value": 4 + }, + { + "end": 263, + "start": 262, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 258, + "name": "extrude", + "start": 251, + "type": "Identifier" + }, + "end": 264, + "optional": false, + "start": 251, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 288, + "raw": "3", + "start": 287, + "type": "Literal", + "type": "Literal", + "value": 3 + }, + { + "end": 299, + "name": "transform", + "start": 290, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 302, + "start": 301, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 286, + "name": "patternTransform", + "start": 270, + "type": "Identifier" + }, + "end": 303, + "optional": false, + "start": 270, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 303, + "start": 112, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 112, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 305, + "nonCodeMeta": { + "nonCodeNodes": { + "1": [ + { + "end": 305, + "start": 303, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/multi_transform/input.kcl b/src/wasm-lib/kcl/tests/multi_transform/input.kcl new file mode 100644 index 000000000..0cf4e5850 --- /dev/null +++ b/src/wasm-lib/kcl/tests/multi_transform/input.kcl @@ -0,0 +1,16 @@ +fn transform = (i) => { + return [ + { translate: [30 * i, 0, 0] }, + { rotation: { angle: 45 * i } } + ] +} +startSketchAt([0, 0]) + |> polygon({ + radius: 10, + numSides: 4, + center: [0, 0], + inscribed: false + }, %) + |> extrude(4, %) + |> patternTransform(3, transform, %) + diff --git a/src/wasm-lib/kcl/tests/multi_transform/program_memory.snap b/src/wasm-lib/kcl/tests/multi_transform/program_memory.snap new file mode 100644 index 000000000..0de0d34d5 --- /dev/null +++ b/src/wasm-lib/kcl/tests/multi_transform/program_memory.snap @@ -0,0 +1,241 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing multi_transform.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "transform": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "argument": { + "elements": [ + { + "end": 68, + "properties": [ + { + "end": 66, + "key": { + "end": 50, + "name": "translate", + "start": 41, + "type": "Identifier" + }, + "start": 41, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 59, + "left": { + "end": 55, + "raw": "30", + "start": 53, + "type": "Literal", + "type": "Literal", + "value": 30 + }, + "operator": "*", + "right": { + "end": 59, + "name": "i", + "start": 58, + "type": "Identifier", + "type": "Identifier" + }, + "start": 53, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 62, + "raw": "0", + "start": 61, + "type": "Literal", + "type": "Literal", + "value": 0 + }, + { + "end": 65, + "raw": "0", + "start": 64, + "type": "Literal", + "type": "Literal", + "value": 0 + } + ], + "end": 66, + "start": 52, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "start": 39, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 105, + "properties": [ + { + "end": 103, + "key": { + "end": 84, + "name": "rotation", + "start": 76, + "type": "Identifier" + }, + "start": 76, + "type": "ObjectProperty", + "value": { + "end": 103, + "properties": [ + { + "end": 101, + "key": { + "end": 93, + "name": "angle", + "start": 88, + "type": "Identifier" + }, + "start": 88, + "type": "ObjectProperty", + "value": { + "end": 101, + "left": { + "end": 97, + "raw": "45", + "start": 95, + "type": "Literal", + "type": "Literal", + "value": 45 + }, + "operator": "*", + "right": { + "end": 101, + "name": "i", + "start": 100, + "type": "Identifier", + "type": "Identifier" + }, + "start": 95, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + } + ], + "start": 86, + "type": "ObjectExpression", + "type": "ObjectExpression" + } + } + ], + "start": 74, + "type": "ObjectExpression", + "type": "ObjectExpression" + } + ], + "end": 109, + "start": 33, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "end": 109, + "start": 26, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 111, + "start": 22 + }, + "end": 111, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 17, + "name": "i", + "start": 16, + "type": "Identifier" + }, + "optional": false + } + ], + "start": 15, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 15, + 111, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/multi_transform/rendered_model.png b/src/wasm-lib/kcl/tests/multi_transform/rendered_model.png new file mode 100644 index 000000000..93a91064f Binary files /dev/null and b/src/wasm-lib/kcl/tests/multi_transform/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/neg_xz_plane/ast.snap b/src/wasm-lib/kcl/tests/neg_xz_plane/ast.snap new file mode 100644 index 000000000..0ca1ac5c8 --- /dev/null +++ b/src/wasm-lib/kcl/tests/neg_xz_plane/ast.snap @@ -0,0 +1,255 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing neg_xz_plane.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 150, + "id": { + "end": 7, + "name": "part001", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 29, + "raw": "'-XZ'", + "start": 24, + "type": "Literal", + "type": "Literal", + "value": "-XZ" + } + ], + "callee": { + "end": 23, + "name": "startSketchOn", + "start": 10, + "type": "Identifier" + }, + "end": 30, + "start": 10, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 53, + "raw": "0", + "start": 52, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 56, + "raw": "0", + "start": 55, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 57, + "start": 51, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 60, + "start": 59, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 50, + "name": "startProfileAt", + "start": 36, + "type": "Identifier" + }, + "end": 61, + "start": 36, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 78, + "raw": "100", + "start": 75, + "type": "Literal", + "type": "Literal", + "value": 100.0 + }, + { + "end": 83, + "raw": "100", + "start": 80, + "type": "Literal", + "type": "Literal", + "value": 100.0 + } + ], + "end": 84, + "start": 74, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 87, + "start": 86, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 73, + "name": "lineTo", + "start": 67, + "type": "Identifier" + }, + "end": 88, + "start": 67, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 105, + "raw": "100", + "start": 102, + "type": "Literal", + "type": "Literal", + "value": 100.0 + }, + { + "end": 108, + "raw": "0", + "start": 107, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 109, + "start": 101, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 112, + "start": 111, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 100, + "name": "lineTo", + "start": 94, + "type": "Identifier" + }, + "end": 113, + "start": 94, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 126, + "start": 125, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 124, + "name": "close", + "start": 119, + "type": "Identifier" + }, + "end": 127, + "start": 119, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 146, + "left": { + "end": 142, + "raw": "5", + "start": 141, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + "operator": "+", + "right": { + "end": 146, + "raw": "7", + "start": 145, + "type": "Literal", + "type": "Literal", + "value": 7.0 + }, + "start": 141, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 149, + "start": 148, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 140, + "name": "extrude", + "start": 133, + "type": "Identifier" + }, + "end": 150, + "start": 133, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 150, + "start": 10, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 150, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 151, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/neg_xz_plane/input.kcl b/src/wasm-lib/kcl/tests/neg_xz_plane/input.kcl new file mode 100644 index 000000000..f718f8250 --- /dev/null +++ b/src/wasm-lib/kcl/tests/neg_xz_plane/input.kcl @@ -0,0 +1,6 @@ +part001 = startSketchOn('-XZ') + |> startProfileAt([0, 0], %) + |> lineTo([100, 100], %) + |> lineTo([100, 0], %) + |> close(%) + |> extrude(5 + 7, %) diff --git a/src/wasm-lib/kcl/tests/neg_xz_plane/ops.snap b/src/wasm-lib/kcl/tests/neg_xz_plane/ops.snap new file mode 100644 index 000000000..65fb71919 --- /dev/null +++ b/src/wasm-lib/kcl/tests/neg_xz_plane/ops.snap @@ -0,0 +1,52 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed neg_xz_plane.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 24, + 29, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 10, + 30, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 141, + 146, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 148, + 149, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 133, + 150, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/neg_xz_plane/program_memory.snap b/src/wasm-lib/kcl/tests/neg_xz_plane/program_memory.snap new file mode 100644 index 000000000..cc3616dfd --- /dev/null +++ b/src/wasm-lib/kcl/tests/neg_xz_plane/program_memory.snap @@ -0,0 +1,208 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing neg_xz_plane.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "part001": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 67, + 88, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 94, + 113, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 119, + 127, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 67, + 88, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 100.0, + 100.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 94, + 113, + 0 + ] + }, + "from": [ + 100.0, + 100.0 + ], + "tag": null, + "to": [ + 100.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 119, + 127, + 0 + ] + }, + "from": [ + 100.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": -1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 36, + 61, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 36, + 61, + 0 + ] + } + ] + }, + "height": 12.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 36, + 61, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/neg_xz_plane/rendered_model.png b/src/wasm-lib/kcl/tests/neg_xz_plane/rendered_model.png new file mode 100644 index 000000000..546cce076 Binary files /dev/null and b/src/wasm-lib/kcl/tests/neg_xz_plane/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/non_string_key_of_object/ast.snap b/src/wasm-lib/kcl/tests/non_string_key_of_object/ast.snap new file mode 100644 index 000000000..68b4baa02 --- /dev/null +++ b/src/wasm-lib/kcl/tests/non_string_key_of_object/ast.snap @@ -0,0 +1,97 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing non_string_key_of_object.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 19, + "id": { + "end": 3, + "name": "obj", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 19, + "properties": [ + { + "end": 17, + "key": { + "end": 11, + "name": "key", + "start": 8, + "type": "Identifier" + }, + "start": 8, + "type": "ObjectProperty", + "value": { + "end": 17, + "raw": "123", + "start": 14, + "type": "Literal", + "type": "Literal", + "value": 123.0 + } + } + ], + "start": 6, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 19, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 32, + "id": { + "end": 23, + "name": "num", + "start": 20, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 32, + "object": { + "end": 29, + "name": "obj", + "start": 26, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 31, + "raw": "3", + "start": 30, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "start": 26, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 20, + "type": "VariableDeclarator" + }, + "end": 32, + "kind": "const", + "start": 20, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 33, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/non_string_key_of_object/execution_error.snap b/src/wasm-lib/kcl/tests/non_string_key_of_object/execution_error.snap new file mode 100644 index 000000000..5bfbd4db2 --- /dev/null +++ b/src/wasm-lib/kcl/tests/non_string_key_of_object/execution_error.snap @@ -0,0 +1,13 @@ +--- +source: kcl/src/simulation_tests.rs +description: Error from executing non_string_key_of_object.kcl +--- +KCL Semantic error + + × semantic: Only strings can be used as the property of an object, but + │ you're using a number + ╭─[2:7] + 1 │ obj = { key = 123 } + 2 │ num = obj[3] + · ────── + ╰──── diff --git a/src/wasm-lib/kcl/tests/non_string_key_of_object/input.kcl b/src/wasm-lib/kcl/tests/non_string_key_of_object/input.kcl new file mode 100644 index 000000000..232fae4b7 --- /dev/null +++ b/src/wasm-lib/kcl/tests/non_string_key_of_object/input.kcl @@ -0,0 +1,2 @@ +obj = { key = 123 } +num = obj[3] diff --git a/src/wasm-lib/kcl/tests/non_string_key_of_object/ops.snap b/src/wasm-lib/kcl/tests/non_string_key_of_object/ops.snap new file mode 100644 index 000000000..ba8856091 --- /dev/null +++ b/src/wasm-lib/kcl/tests/non_string_key_of_object/ops.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed non_string_key_of_object.kcl +snapshot_kind: text +--- +[] diff --git a/src/wasm-lib/kcl/tests/object_prop_not_found/ast.snap b/src/wasm-lib/kcl/tests/object_prop_not_found/ast.snap new file mode 100644 index 000000000..a62744c38 --- /dev/null +++ b/src/wasm-lib/kcl/tests/object_prop_not_found/ast.snap @@ -0,0 +1,77 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing object_prop_not_found.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 10, + "id": { + "end": 3, + "name": "obj", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 10, + "properties": [], + "start": 6, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 10, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 25, + "id": { + "end": 12, + "name": "k", + "start": 11, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 25, + "object": { + "end": 18, + "name": "obj", + "start": 15, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 24, + "raw": "\"age\"", + "start": 19, + "type": "Literal", + "type": "Literal", + "value": "age" + }, + "start": 15, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 11, + "type": "VariableDeclarator" + }, + "end": 25, + "kind": "const", + "start": 11, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 26, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/object_prop_not_found/execution_error.snap b/src/wasm-lib/kcl/tests/object_prop_not_found/execution_error.snap new file mode 100644 index 000000000..de12e308e --- /dev/null +++ b/src/wasm-lib/kcl/tests/object_prop_not_found/execution_error.snap @@ -0,0 +1,12 @@ +--- +source: kcl/src/simulation_tests.rs +description: Error from executing object_prop_not_found.kcl +--- +KCL UndefinedValue error + + × undefined value: Property 'age' not found in object + ╭─[2:5] + 1 │ obj = { } + 2 │ k = obj["age"] + · ────────── + ╰──── diff --git a/src/wasm-lib/kcl/tests/object_prop_not_found/input.kcl b/src/wasm-lib/kcl/tests/object_prop_not_found/input.kcl new file mode 100644 index 000000000..90d79044e --- /dev/null +++ b/src/wasm-lib/kcl/tests/object_prop_not_found/input.kcl @@ -0,0 +1,2 @@ +obj = { } +k = obj["age"] diff --git a/src/wasm-lib/kcl/tests/object_prop_not_found/ops.snap b/src/wasm-lib/kcl/tests/object_prop_not_found/ops.snap new file mode 100644 index 000000000..344e9f5db --- /dev/null +++ b/src/wasm-lib/kcl/tests/object_prop_not_found/ops.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed object_prop_not_found.kcl +snapshot_kind: text +--- +[] diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance0.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance0.png new file mode 100644 index 000000000..360a32ea1 Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance0.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance1.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance1.png new file mode 100644 index 000000000..6c0403a51 Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance1.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance2.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance2.png new file mode 100644 index 000000000..9735c27cc Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance2.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance3.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance3.png new file mode 100644 index 000000000..00534b64b Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance3.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance4.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance4.png new file mode 100644 index 000000000..00534b64b Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance4.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance5.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance5.png new file mode 100644 index 000000000..dd4c33ceb Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance5.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance6.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance6.png new file mode 100644 index 000000000..dd4c33ceb Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance6.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance7.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance7.png new file mode 100644 index 000000000..4c02bc520 Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance7.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance8.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance8.png new file mode 100644 index 000000000..a16f8de46 Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_appearance8.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_arc0.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_arc0.png index a06938f06..ce6d69dd7 100644 Binary files a/src/wasm-lib/kcl/tests/outputs/serial_test_example_arc0.png and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_arc0.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_arc_to0.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_arc_to0.png new file mode 100644 index 000000000..2729db0fd Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_arc_to0.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_atan20.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_atan20.png new file mode 100644 index 000000000..55bbb2698 Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_atan20.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_circle_three_point0.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_circle_three_point0.png new file mode 100644 index 000000000..ca4803aa1 Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_circle_three_point0.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_helix0.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_helix0.png index 10e6d789e..139eabe76 100644 Binary files a/src/wasm-lib/kcl/tests/outputs/serial_test_example_helix0.png and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_helix0.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_import5.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_import5.png new file mode 100644 index 000000000..4e87e466c Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_import5.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_mirror_2d0.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_mirror_2d0.png index 48a988c6b..d6fb873f9 100644 Binary files a/src/wasm-lib/kcl/tests/outputs/serial_test_example_mirror_2d0.png and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_mirror_2d0.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_offset_plane4.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_offset_plane4.png index 701b46c98..dea293e35 100644 Binary files a/src/wasm-lib/kcl/tests/outputs/serial_test_example_offset_plane4.png and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_offset_plane4.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_pattern_transform5.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_pattern_transform5.png new file mode 100644 index 000000000..93a91064f Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_pattern_transform5.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_pattern_transform_2d0.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_pattern_transform_2d0.png new file mode 100644 index 000000000..89465b50b Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_pattern_transform_2d0.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_polygon0.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_polygon0.png new file mode 100644 index 000000000..bc2eaa56e Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_polygon0.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_polygon1.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_polygon1.png new file mode 100644 index 000000000..7b262d824 Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_polygon1.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_pop0.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_pop0.png new file mode 100644 index 000000000..6148ae432 Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_pop0.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_push0.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_push0.png new file mode 100644 index 000000000..6148ae432 Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_push0.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_reduce0.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_reduce0.png index 50368c6dd..6148ae432 100644 Binary files a/src/wasm-lib/kcl/tests/outputs/serial_test_example_reduce0.png and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_reduce0.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_reduce2.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_reduce2.png index 6148ae432..50368c6dd 100644 Binary files a/src/wasm-lib/kcl/tests/outputs/serial_test_example_reduce2.png and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_reduce2.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_round0.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_round0.png new file mode 100644 index 000000000..6a791cb08 Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_round0.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_segment_end0.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_segment_end0.png new file mode 100644 index 000000000..f4a3e8c7e Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_segment_end0.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_segment_start0.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_segment_start0.png new file mode 100644 index 000000000..39763be30 Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_segment_start0.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_segment_start_x0.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_segment_start_x0.png new file mode 100644 index 000000000..9b186e485 Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_segment_start_x0.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_segment_start_y0.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_segment_start_y0.png new file mode 100644 index 000000000..3592ea952 Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_segment_start_y0.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_sweep0.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_sweep0.png new file mode 100644 index 000000000..7ee2dd94d Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_sweep0.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_tangent_to_end0.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_tangent_to_end0.png new file mode 100644 index 000000000..889de154b Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_tangent_to_end0.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_tangent_to_end1.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_tangent_to_end1.png new file mode 100644 index 000000000..f8495dd5a Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_tangent_to_end1.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_tangent_to_end2.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_tangent_to_end2.png new file mode 100644 index 000000000..2fda72a93 Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_tangent_to_end2.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_tangent_to_end3.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_tangent_to_end3.png new file mode 100644 index 000000000..3e4878899 Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_tangent_to_end3.png differ diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_tangent_to_end4.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_tangent_to_end4.png new file mode 100644 index 000000000..6e6947be3 Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_tangent_to_end4.png differ diff --git a/src/wasm-lib/kcl/tests/parametric/ast.snap b/src/wasm-lib/kcl/tests/parametric/ast.snap new file mode 100644 index 000000000..507baa209 --- /dev/null +++ b/src/wasm-lib/kcl/tests/parametric/ast.snap @@ -0,0 +1,806 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing parametric.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 18, + "id": { + "end": 10, + "name": "sigmaAllow", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 18, + "raw": "35000", + "start": 13, + "type": "Literal", + "type": "Literal", + "value": 35000.0 + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 18, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 35, + "id": { + "end": 31, + "name": "width", + "start": 26, + "type": "Identifier" + }, + "init": { + "end": 35, + "raw": "9", + "start": 34, + "type": "Literal", + "type": "Literal", + "value": 9.0 + }, + "start": 26, + "type": "VariableDeclarator" + }, + "end": 35, + "kind": "const", + "start": 26, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 51, + "id": { + "end": 45, + "name": "p", + "start": 44, + "type": "Identifier" + }, + "init": { + "end": 51, + "raw": "150", + "start": 48, + "type": "Literal", + "type": "Literal", + "value": 150.0 + }, + "start": 44, + "type": "VariableDeclarator" + }, + "end": 51, + "kind": "const", + "start": 44, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 88, + "id": { + "end": 84, + "name": "distance", + "start": 76, + "type": "Identifier" + }, + "init": { + "end": 88, + "raw": "6", + "start": 87, + "type": "Literal", + "type": "Literal", + "value": 6.0 + }, + "start": 76, + "type": "VariableDeclarator" + }, + "end": 88, + "kind": "const", + "start": 76, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 106, + "id": { + "end": 102, + "name": "FOS", + "start": 99, + "type": "Identifier" + }, + "init": { + "end": 106, + "raw": "2", + "start": 105, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 99, + "type": "VariableDeclarator" + }, + "end": 106, + "kind": "const", + "start": 99, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 116, + "id": { + "end": 112, + "name": "leg1", + "start": 108, + "type": "Identifier" + }, + "init": { + "end": 116, + "raw": "5", + "start": 115, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + "start": 108, + "type": "VariableDeclarator" + }, + "end": 116, + "kind": "const", + "start": 108, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 135, + "id": { + "end": 131, + "name": "leg2", + "start": 127, + "type": "Identifier" + }, + "init": { + "end": 135, + "raw": "8", + "start": 134, + "type": "Literal", + "type": "Literal", + "value": 8.0 + }, + "start": 127, + "type": "VariableDeclarator" + }, + "end": 135, + "kind": "const", + "start": 127, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 207, + "id": { + "end": 155, + "name": "thickness", + "start": 146, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 206, + "left": { + "end": 198, + "left": { + "end": 185, + "left": { + "end": 181, + "left": { + "end": 175, + "left": { + "end": 171, + "name": "distance", + "start": 163, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "*", + "right": { + "end": 175, + "name": "p", + "start": 174, + "type": "Identifier", + "type": "Identifier" + }, + "start": 163, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "*", + "right": { + "end": 181, + "name": "FOS", + "start": 178, + "type": "Identifier", + "type": "Identifier" + }, + "start": 163, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "*", + "right": { + "end": 185, + "raw": "6", + "start": 184, + "type": "Literal", + "type": "Literal", + "value": 6.0 + }, + "start": 163, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "/", + "right": { + "end": 198, + "name": "sigmaAllow", + "start": 188, + "type": "Identifier", + "type": "Identifier" + }, + "start": 163, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "/", + "right": { + "end": 206, + "name": "width", + "start": 201, + "type": "Identifier", + "type": "Identifier" + }, + "start": 163, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "callee": { + "end": 162, + "name": "sqrt", + "start": 158, + "type": "Identifier" + }, + "end": 207, + "start": 158, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 146, + "type": "VariableDeclarator" + }, + "end": 207, + "kind": "const", + "start": 146, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 467, + "id": { + "end": 225, + "name": "bracket", + "start": 218, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 246, + "raw": "'XY'", + "start": 242, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 241, + "name": "startSketchOn", + "start": 228, + "type": "Identifier" + }, + "end": 247, + "start": 228, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 270, + "raw": "0", + "start": 269, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 273, + "raw": "0", + "start": 272, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 274, + "start": 268, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 277, + "start": 276, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 267, + "name": "startProfileAt", + "start": 253, + "type": "Identifier" + }, + "end": 278, + "start": 253, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 291, + "raw": "0", + "start": 290, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 297, + "name": "leg1", + "start": 293, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 298, + "start": 289, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 301, + "start": 300, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 288, + "name": "line", + "start": 284, + "type": "Identifier" + }, + "end": 302, + "start": 284, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 318, + "name": "leg2", + "start": 314, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 321, + "raw": "0", + "start": 320, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 322, + "start": 313, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 325, + "start": 324, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 312, + "name": "line", + "start": 308, + "type": "Identifier" + }, + "end": 326, + "start": 308, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 339, + "raw": "0", + "start": 338, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 351, + "name": "thickness", + "start": 342, + "type": "Identifier", + "type": "Identifier" + }, + "end": 351, + "operator": "-", + "start": 341, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 352, + "start": 337, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 355, + "start": 354, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 336, + "name": "line", + "start": 332, + "type": "Identifier" + }, + "end": 356, + "start": 332, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 385, + "left": { + "argument": { + "end": 373, + "name": "leg2", + "start": 369, + "type": "Identifier", + "type": "Identifier" + }, + "end": 373, + "operator": "-", + "start": 368, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 385, + "name": "thickness", + "start": 376, + "type": "Identifier", + "type": "Identifier" + }, + "start": 368, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 388, + "raw": "0", + "start": 387, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 389, + "start": 367, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 392, + "start": 391, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 366, + "name": "line", + "start": 362, + "type": "Identifier" + }, + "end": 393, + "start": 362, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 406, + "raw": "0", + "start": 405, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 425, + "left": { + "argument": { + "end": 413, + "name": "leg1", + "start": 409, + "type": "Identifier", + "type": "Identifier" + }, + "end": 413, + "operator": "-", + "start": 408, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 425, + "name": "thickness", + "start": 416, + "type": "Identifier", + "type": "Identifier" + }, + "start": 408, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 426, + "start": 404, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 429, + "start": 428, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 403, + "name": "line", + "start": 399, + "type": "Identifier" + }, + "end": 430, + "start": 399, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 443, + "start": 442, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 441, + "name": "close", + "start": 436, + "type": "Identifier" + }, + "end": 444, + "start": 436, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 463, + "name": "width", + "start": 458, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 466, + "start": 465, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 457, + "name": "extrude", + "start": 450, + "type": "Identifier" + }, + "end": 467, + "start": 450, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 467, + "start": 228, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 218, + "type": "VariableDeclarator" + }, + "end": 467, + "kind": "const", + "start": 218, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 468, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 25, + "start": 18, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "psi", + "style": "line" + } + } + ], + "1": [ + { + "end": 43, + "start": 35, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "inch", + "style": "line" + } + } + ], + "2": [ + { + "end": 75, + "start": 51, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "Force on shelf - lbs", + "style": "line" + } + } + ], + "3": [ + { + "end": 98, + "start": 88, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "inches", + "style": "line" + } + } + ], + "4": [ + { + "end": 108, + "start": 106, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "5": [ + { + "end": 126, + "start": 116, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "inches", + "style": "line" + } + } + ], + "6": [ + { + "end": 145, + "start": 135, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "inches", + "style": "line" + } + } + ], + "7": [ + { + "end": 217, + "start": 207, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "inches", + "style": "line" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/parametric/input.kcl b/src/wasm-lib/kcl/tests/parametric/input.kcl new file mode 100644 index 000000000..078567419 --- /dev/null +++ b/src/wasm-lib/kcl/tests/parametric/input.kcl @@ -0,0 +1,18 @@ +sigmaAllow = 35000 // psi +width = 9 // inch +p = 150 // Force on shelf - lbs +distance = 6 // inches +FOS = 2 + +leg1 = 5 // inches +leg2 = 8 // inches +thickness = sqrt(distance * p * FOS * 6 / sigmaAllow / width) // inches +bracket = startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line([0, leg1], %) + |> line([leg2, 0], %) + |> line([0, -thickness], %) + |> line([-leg2 + thickness, 0], %) + |> line([0, -leg1 + thickness], %) + |> close(%) + |> extrude(width, %) diff --git a/src/wasm-lib/kcl/tests/parametric/ops.snap b/src/wasm-lib/kcl/tests/parametric/ops.snap new file mode 100644 index 000000000..82b50b661 --- /dev/null +++ b/src/wasm-lib/kcl/tests/parametric/ops.snap @@ -0,0 +1,52 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed parametric.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 242, + 246, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 228, + 247, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 458, + 463, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 465, + 466, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 450, + 467, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/parametric/program_memory.snap b/src/wasm-lib/kcl/tests/parametric/program_memory.snap new file mode 100644 index 000000000..675f99501 --- /dev/null +++ b/src/wasm-lib/kcl/tests/parametric/program_memory.snap @@ -0,0 +1,406 @@ +--- +source: kcl/src/simulation_tests.rs +assertion_line: 92 +description: Program memory after executing parametric.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "FOS": { + "type": "Number", + "value": 2.0, + "__meta": [ + { + "sourceRange": [ + 105, + 106, + 0 + ] + } + ] + }, + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "bracket": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 284, + 302, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 308, + 326, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 332, + 356, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 362, + 393, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 399, + 430, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 436, + 444, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 284, + 302, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 5.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 308, + 326, + 0 + ] + }, + "from": [ + 0.0, + 5.0 + ], + "tag": null, + "to": [ + 8.0, + 5.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 332, + 356, + 0 + ] + }, + "from": [ + 8.0, + 5.0 + ], + "tag": null, + "to": [ + 8.0, + 4.8148 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 362, + 393, + 0 + ] + }, + "from": [ + 8.0, + 4.8148 + ], + "tag": null, + "to": [ + 0.1852, + 4.8148 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 399, + 430, + 0 + ] + }, + "from": [ + 0.1852, + 4.8148 + ], + "tag": null, + "to": [ + 0.1852, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 436, + 444, + 0 + ] + }, + "from": [ + 0.1852, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 253, + 278, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 253, + 278, + 0 + ] + } + ] + }, + "height": 9.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 253, + 278, + 0 + ] + } + ] + }, + "distance": { + "type": "Number", + "value": 6.0, + "__meta": [ + { + "sourceRange": [ + 87, + 88, + 0 + ] + } + ] + }, + "leg1": { + "type": "Number", + "value": 5.0, + "__meta": [ + { + "sourceRange": [ + 115, + 116, + 0 + ] + } + ] + }, + "leg2": { + "type": "Number", + "value": 8.0, + "__meta": [ + { + "sourceRange": [ + 134, + 135, + 0 + ] + } + ] + }, + "p": { + "type": "Number", + "value": 150.0, + "__meta": [ + { + "sourceRange": [ + 48, + 51, + 0 + ] + } + ] + }, + "sigmaAllow": { + "type": "Number", + "value": 35000.0, + "__meta": [ + { + "sourceRange": [ + 13, + 18, + 0 + ] + } + ] + }, + "thickness": { + "type": "Number", + "value": 0.1851640199545103, + "__meta": [ + { + "sourceRange": [ + 158, + 207, + 0 + ] + } + ] + }, + "width": { + "type": "Number", + "value": 9.0, + "__meta": [ + { + "sourceRange": [ + 34, + 35, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/parametric/rendered_model.png b/src/wasm-lib/kcl/tests/parametric/rendered_model.png new file mode 100644 index 000000000..d375cf672 Binary files /dev/null and b/src/wasm-lib/kcl/tests/parametric/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/parametric_with_tan_arc/ast.snap b/src/wasm-lib/kcl/tests/parametric_with_tan_arc/ast.snap new file mode 100644 index 000000000..ddb14c8f3 --- /dev/null +++ b/src/wasm-lib/kcl/tests/parametric_with_tan_arc/ast.snap @@ -0,0 +1,905 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing parametric_with_tan_arc.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 18, + "id": { + "end": 10, + "name": "sigmaAllow", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 18, + "raw": "15000", + "start": 13, + "type": "Literal", + "type": "Literal", + "value": 15000.0 + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 18, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 36, + "id": { + "end": 31, + "name": "width", + "start": 26, + "type": "Identifier" + }, + "init": { + "end": 36, + "raw": "11", + "start": 34, + "type": "Literal", + "type": "Literal", + "value": 11.0 + }, + "start": 26, + "type": "VariableDeclarator" + }, + "end": 36, + "kind": "const", + "start": 26, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 52, + "id": { + "end": 46, + "name": "p", + "start": 45, + "type": "Identifier" + }, + "init": { + "end": 52, + "raw": "150", + "start": 49, + "type": "Literal", + "type": "Literal", + "value": 150.0 + }, + "start": 45, + "type": "VariableDeclarator" + }, + "end": 52, + "kind": "const", + "start": 45, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 90, + "id": { + "end": 85, + "name": "distance", + "start": 77, + "type": "Identifier" + }, + "init": { + "end": 90, + "raw": "12", + "start": 88, + "type": "Literal", + "type": "Literal", + "value": 12.0 + }, + "start": 77, + "type": "VariableDeclarator" + }, + "end": 90, + "kind": "const", + "start": 77, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 108, + "id": { + "end": 104, + "name": "FOS", + "start": 101, + "type": "Identifier" + }, + "init": { + "end": 108, + "raw": "2", + "start": 107, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 101, + "type": "VariableDeclarator" + }, + "end": 108, + "kind": "const", + "start": 101, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 172, + "id": { + "end": 118, + "name": "thickness", + "start": 109, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 170, + "left": { + "end": 148, + "left": { + "end": 144, + "left": { + "end": 138, + "left": { + "end": 134, + "name": "distance", + "start": 126, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "*", + "right": { + "end": 138, + "name": "p", + "start": 137, + "type": "Identifier", + "type": "Identifier" + }, + "start": 126, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "*", + "right": { + "end": 144, + "name": "FOS", + "start": 141, + "type": "Identifier", + "type": "Identifier" + }, + "start": 126, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "*", + "right": { + "end": 148, + "raw": "6", + "start": 147, + "type": "Literal", + "type": "Literal", + "value": 6.0 + }, + "start": 126, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "/", + "right": { + "end": 170, + "left": { + "end": 162, + "name": "sigmaAllow", + "start": 152, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "*", + "right": { + "end": 170, + "name": "width", + "start": 165, + "type": "Identifier", + "type": "Identifier" + }, + "start": 152, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 126, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "callee": { + "end": 125, + "name": "sqrt", + "start": 121, + "type": "Identifier" + }, + "end": 172, + "start": 121, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 109, + "type": "VariableDeclarator" + }, + "end": 172, + "kind": "const", + "start": 109, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 196, + "id": { + "end": 180, + "name": "filletR", + "start": 173, + "type": "Identifier" + }, + "init": { + "end": 196, + "left": { + "end": 192, + "name": "thickness", + "start": 183, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "*", + "right": { + "end": 196, + "raw": "2", + "start": 195, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 183, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 173, + "type": "VariableDeclarator" + }, + "end": 196, + "kind": "const", + "start": 173, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 212, + "id": { + "end": 208, + "name": "shelfMountL", + "start": 197, + "type": "Identifier" + }, + "init": { + "end": 212, + "raw": "9", + "start": 211, + "type": "Literal", + "type": "Literal", + "value": 9.0 + }, + "start": 197, + "type": "VariableDeclarator" + }, + "end": 212, + "kind": "const", + "start": 197, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 227, + "id": { + "end": 223, + "name": "wallMountL", + "start": 213, + "type": "Identifier" + }, + "init": { + "end": 227, + "raw": "8", + "start": 226, + "type": "Literal", + "type": "Literal", + "value": 8.0 + }, + "start": 213, + "type": "VariableDeclarator" + }, + "end": 227, + "kind": "const", + "start": 213, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 597, + "id": { + "end": 236, + "name": "bracket", + "start": 229, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "elements": [ + { + "end": 255, + "raw": "0", + "start": 254, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 258, + "raw": "0", + "start": 257, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 259, + "start": 253, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + ], + "callee": { + "end": 252, + "name": "startSketchAt", + "start": 239, + "type": "Identifier" + }, + "end": 260, + "start": 239, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 273, + "raw": "0", + "start": 272, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 285, + "name": "wallMountL", + "start": 275, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 286, + "start": 271, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 289, + "start": 288, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 270, + "name": "line", + "start": 266, + "type": "Identifier" + }, + "end": 290, + "start": 266, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 343, + "properties": [ + { + "end": 328, + "key": { + "end": 318, + "name": "radius", + "start": 312, + "type": "Identifier" + }, + "start": 312, + "type": "ObjectProperty", + "value": { + "end": 328, + "name": "filletR", + "start": 321, + "type": "Identifier", + "type": "Identifier" + } + }, + { + "end": 341, + "key": { + "end": 336, + "name": "offset", + "start": 330, + "type": "Identifier" + }, + "start": 330, + "type": "ObjectProperty", + "value": { + "end": 341, + "raw": "90", + "start": 339, + "type": "Literal", + "type": "Literal", + "value": 90.0 + } + } + ], + "start": 310, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 346, + "start": 345, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 309, + "name": "tangentialArc", + "start": 296, + "type": "Identifier" + }, + "end": 347, + "start": 296, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 371, + "name": "shelfMountL", + "start": 360, + "type": "Identifier", + "type": "Identifier" + }, + "end": 371, + "operator": "-", + "start": 359, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 374, + "raw": "0", + "start": 373, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 375, + "start": 358, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 378, + "start": 377, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 357, + "name": "line", + "start": 353, + "type": "Identifier" + }, + "end": 379, + "start": 353, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 392, + "raw": "0", + "start": 391, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 404, + "name": "thickness", + "start": 395, + "type": "Identifier", + "type": "Identifier" + }, + "end": 404, + "operator": "-", + "start": 394, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 405, + "start": 390, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 408, + "start": 407, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 389, + "name": "line", + "start": 385, + "type": "Identifier" + }, + "end": 409, + "start": 385, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 432, + "name": "shelfMountL", + "start": 421, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 435, + "raw": "0", + "start": 434, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 436, + "start": 420, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 439, + "start": 438, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 419, + "name": "line", + "start": 415, + "type": "Identifier" + }, + "end": 440, + "start": 415, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 525, + "properties": [ + { + "end": 497, + "key": { + "end": 475, + "name": "radius", + "start": 469, + "type": "Identifier" + }, + "start": 469, + "type": "ObjectProperty", + "value": { + "end": 497, + "left": { + "end": 485, + "name": "filletR", + "start": 478, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "-", + "right": { + "end": 497, + "name": "thickness", + "start": 488, + "type": "Identifier", + "type": "Identifier" + }, + "start": 478, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "end": 518, + "key": { + "end": 512, + "name": "offset", + "start": 506, + "type": "Identifier" + }, + "start": 506, + "type": "ObjectProperty", + "value": { + "argument": { + "end": 518, + "raw": "90", + "start": 516, + "type": "Literal", + "type": "Literal", + "value": 90.0 + }, + "end": 518, + "operator": "-", + "start": 515, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + } + ], + "start": 460, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 528, + "start": 527, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 459, + "name": "tangentialArc", + "start": 446, + "type": "Identifier" + }, + "end": 529, + "start": 446, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 542, + "raw": "0", + "start": 541, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 555, + "name": "wallMountL", + "start": 545, + "type": "Identifier", + "type": "Identifier" + }, + "end": 555, + "operator": "-", + "start": 544, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 556, + "start": 540, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 559, + "start": 558, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 539, + "name": "line", + "start": 535, + "type": "Identifier" + }, + "end": 560, + "start": 535, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 573, + "start": 572, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 571, + "name": "close", + "start": 566, + "type": "Identifier" + }, + "end": 574, + "start": 566, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 593, + "name": "width", + "start": 588, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 596, + "start": 595, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 587, + "name": "extrude", + "start": 580, + "type": "Identifier" + }, + "end": 597, + "start": 580, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 597, + "start": 239, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 229, + "type": "VariableDeclarator" + }, + "end": 597, + "kind": "const", + "start": 229, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 598, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 25, + "start": 18, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "psi", + "style": "line" + } + } + ], + "1": [ + { + "end": 44, + "start": 36, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "inch", + "style": "line" + } + } + ], + "2": [ + { + "end": 76, + "start": 52, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "Force on shelf - lbs", + "style": "line" + } + } + ], + "3": [ + { + "end": 100, + "start": 90, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "inches", + "style": "line" + } + } + ], + "8": [ + { + "end": 229, + "start": 227, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/parametric_with_tan_arc/input.kcl b/src/wasm-lib/kcl/tests/parametric_with_tan_arc/input.kcl new file mode 100644 index 000000000..5dbabd18c --- /dev/null +++ b/src/wasm-lib/kcl/tests/parametric_with_tan_arc/input.kcl @@ -0,0 +1,23 @@ +sigmaAllow = 15000 // psi +width = 11 // inch +p = 150 // Force on shelf - lbs +distance = 12 // inches +FOS = 2 +thickness = sqrt(distance * p * FOS * 6 / (sigmaAllow * width)) +filletR = thickness * 2 +shelfMountL = 9 +wallMountL = 8 + +bracket = startSketchAt([0, 0]) + |> line([0, wallMountL], %) + |> tangentialArc({ radius = filletR, offset = 90 }, %) + |> line([-shelfMountL, 0], %) + |> line([0, -thickness], %) + |> line([shelfMountL, 0], %) + |> tangentialArc({ + radius = filletR - thickness, + offset = -90 + }, %) + |> line([0, -wallMountL], %) + |> close(%) + |> extrude(width, %) diff --git a/src/wasm-lib/kcl/tests/parametric_with_tan_arc/ops.snap b/src/wasm-lib/kcl/tests/parametric_with_tan_arc/ops.snap new file mode 100644 index 000000000..9eedb9e95 --- /dev/null +++ b/src/wasm-lib/kcl/tests/parametric_with_tan_arc/ops.snap @@ -0,0 +1,33 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed parametric_with_tan_arc.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "length": { + "sourceRange": [ + 588, + 593, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 595, + 596, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 580, + 597, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/parametric_with_tan_arc/program_memory.snap b/src/wasm-lib/kcl/tests/parametric_with_tan_arc/program_memory.snap new file mode 100644 index 000000000..83e1b912b --- /dev/null +++ b/src/wasm-lib/kcl/tests/parametric_with_tan_arc/program_memory.snap @@ -0,0 +1,498 @@ +--- +source: kcl/src/simulation_tests.rs +assertion_line: 92 +description: Program memory after executing parametric_with_tan_arc.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "FOS": { + "type": "Number", + "value": 2.0, + "__meta": [ + { + "sourceRange": [ + 107, + 108, + 0 + ] + } + ] + }, + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "bracket": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 266, + 290, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 296, + 347, + 0 + ], + "tag": null, + "type": "extrudeArc" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 353, + 379, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 385, + 409, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 415, + 440, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 446, + 529, + 0 + ], + "tag": null, + "type": "extrudeArc" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 535, + 560, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 566, + 574, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 266, + 290, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 8.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 296, + 347, + 0 + ] + }, + "ccw": true, + "center": [ + -0.7236272269866327, + 8.0 + ], + "from": [ + 0.0, + 8.0 + ], + "tag": null, + "to": [ + -0.7236, + 8.7236 + ], + "type": "TangentialArc" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 353, + 379, + 0 + ] + }, + "from": [ + -0.7236, + 8.7236 + ], + "tag": null, + "to": [ + -9.7236, + 8.7236 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 385, + 409, + 0 + ] + }, + "from": [ + -9.7236, + 8.7236 + ], + "tag": null, + "to": [ + -9.7236, + 8.3618 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 415, + 440, + 0 + ] + }, + "from": [ + -9.7236, + 8.3618 + ], + "tag": null, + "to": [ + -0.7236, + 8.3618 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 446, + 529, + 0 + ] + }, + "ccw": false, + "center": [ + -0.7236272269866326, + 8.0 + ], + "from": [ + -0.7236, + 8.3618 + ], + "tag": null, + "to": [ + -0.3618, + 8.0 + ], + "type": "TangentialArc" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 535, + 560, + 0 + ] + }, + "from": [ + -0.3618, + 8.0 + ], + "tag": null, + "to": [ + -0.3618, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 566, + 574, + 0 + ] + }, + "from": [ + -0.3618, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 239, + 260, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 239, + 260, + 0 + ] + } + ] + }, + "height": 11.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 239, + 260, + 0 + ] + } + ] + }, + "distance": { + "type": "Number", + "value": 12.0, + "__meta": [ + { + "sourceRange": [ + 88, + 90, + 0 + ] + } + ] + }, + "filletR": { + "type": "Number", + "value": 0.7236272269866327, + "__meta": [ + { + "sourceRange": [ + 121, + 172, + 0 + ] + }, + { + "sourceRange": [ + 195, + 196, + 0 + ] + } + ] + }, + "p": { + "type": "Number", + "value": 150.0, + "__meta": [ + { + "sourceRange": [ + 49, + 52, + 0 + ] + } + ] + }, + "shelfMountL": { + "type": "Number", + "value": 9.0, + "__meta": [ + { + "sourceRange": [ + 211, + 212, + 0 + ] + } + ] + }, + "sigmaAllow": { + "type": "Number", + "value": 15000.0, + "__meta": [ + { + "sourceRange": [ + 13, + 18, + 0 + ] + } + ] + }, + "thickness": { + "type": "Number", + "value": 0.36181361349331637, + "__meta": [ + { + "sourceRange": [ + 121, + 172, + 0 + ] + } + ] + }, + "wallMountL": { + "type": "Number", + "value": 8.0, + "__meta": [ + { + "sourceRange": [ + 226, + 227, + 0 + ] + } + ] + }, + "width": { + "type": "Number", + "value": 11.0, + "__meta": [ + { + "sourceRange": [ + 34, + 36, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/parametric_with_tan_arc/rendered_model.png b/src/wasm-lib/kcl/tests/parametric_with_tan_arc/rendered_model.png new file mode 100644 index 000000000..edd426087 Binary files /dev/null and b/src/wasm-lib/kcl/tests/parametric_with_tan_arc/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/ast.snap b/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/ast.snap new file mode 100644 index 000000000..08b348720 --- /dev/null +++ b/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/ast.snap @@ -0,0 +1,1306 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing pentagon_fillet_sugar.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 20, + "id": { + "end": 14, + "name": "triangleHeight", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 20, + "raw": "200", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 200.0 + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 20, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 37, + "id": { + "end": 31, + "name": "plumbusLen", + "start": 21, + "type": "Identifier" + }, + "init": { + "end": 37, + "raw": "100", + "start": 34, + "type": "Literal", + "type": "Literal", + "value": 100.0 + }, + "start": 21, + "type": "VariableDeclarator" + }, + "end": 37, + "kind": "const", + "start": 21, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 49, + "id": { + "end": 44, + "name": "radius", + "start": 38, + "type": "Identifier" + }, + "init": { + "end": 49, + "raw": "80", + "start": 47, + "type": "Literal", + "type": "Literal", + "value": 80.0 + }, + "start": 38, + "type": "VariableDeclarator" + }, + "end": 49, + "kind": "const", + "start": 38, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 116, + "id": { + "end": 54, + "name": "circ", + "start": 50, + "type": "Identifier" + }, + "init": { + "end": 116, + "properties": [ + { + "end": 76, + "key": { + "end": 72, + "name": "angle_start", + "start": 61, + "type": "Identifier" + }, + "start": 61, + "type": "ObjectProperty", + "value": { + "end": 76, + "raw": "0", + "start": 75, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + }, + { + "end": 95, + "key": { + "end": 89, + "name": "angle_end", + "start": 80, + "type": "Identifier" + }, + "start": 80, + "type": "ObjectProperty", + "value": { + "end": 95, + "raw": "360", + "start": 92, + "type": "Literal", + "type": "Literal", + "value": 360.0 + } + }, + { + "end": 114, + "key": { + "end": 105, + "name": "radius", + "start": 99, + "type": "Identifier" + }, + "start": 99, + "type": "ObjectProperty", + "value": { + "end": 114, + "name": "radius", + "start": 108, + "type": "Identifier", + "type": "Identifier" + } + } + ], + "start": 57, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 50, + "type": "VariableDeclarator" + }, + "end": 116, + "kind": "const", + "start": 50, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 135, + "id": { + "end": 129, + "name": "triangleLen", + "start": 118, + "type": "Identifier" + }, + "init": { + "end": 135, + "raw": "500", + "start": 132, + "type": "Literal", + "type": "Literal", + "value": 500.0 + }, + "start": 118, + "type": "VariableDeclarator" + }, + "end": 135, + "kind": "const", + "start": 118, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 407, + "id": { + "end": 137, + "name": "p", + "start": 136, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 158, + "raw": "'XY'", + "start": 154, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 153, + "name": "startSketchOn", + "start": 140, + "type": "Identifier" + }, + "end": 159, + "start": 140, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 182, + "raw": "0", + "start": 181, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 185, + "raw": "0", + "start": 184, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 186, + "start": 180, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 189, + "start": 188, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 179, + "name": "startProfileAt", + "start": 165, + "type": "Identifier" + }, + "end": 190, + "start": 165, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 243, + "properties": [ + { + "end": 219, + "key": { + "end": 214, + "name": "angle", + "start": 209, + "type": "Identifier" + }, + "start": 209, + "type": "ObjectProperty", + "value": { + "end": 219, + "raw": "60", + "start": 217, + "type": "Literal", + "type": "Literal", + "value": 60.0 + } + }, + { + "end": 241, + "key": { + "end": 227, + "name": "length", + "start": 221, + "type": "Identifier" + }, + "start": 221, + "type": "ObjectProperty", + "value": { + "end": 241, + "name": "triangleLen", + "start": 230, + "type": "Identifier", + "type": "Identifier" + } + } + ], + "start": 207, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 246, + "start": 245, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "a" + } + ], + "callee": { + "end": 206, + "name": "angledLine", + "start": 196, + "type": "Identifier" + }, + "end": 251, + "start": 196, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 305, + "properties": [ + { + "end": 281, + "key": { + "end": 275, + "name": "angle", + "start": 270, + "type": "Identifier" + }, + "start": 270, + "type": "ObjectProperty", + "value": { + "end": 281, + "raw": "180", + "start": 278, + "type": "Literal", + "type": "Literal", + "value": 180.0 + } + }, + { + "end": 303, + "key": { + "end": 289, + "name": "length", + "start": 283, + "type": "Identifier" + }, + "start": 283, + "type": "ObjectProperty", + "value": { + "end": 303, + "name": "triangleLen", + "start": 292, + "type": "Identifier", + "type": "Identifier" + } + } + ], + "start": 268, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 308, + "start": 307, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "b" + } + ], + "callee": { + "end": 267, + "name": "angledLine", + "start": 257, + "type": "Identifier" + }, + "end": 313, + "start": 257, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 367, + "properties": [ + { + "end": 343, + "key": { + "end": 337, + "name": "angle", + "start": 332, + "type": "Identifier" + }, + "start": 332, + "type": "ObjectProperty", + "value": { + "end": 343, + "raw": "300", + "start": 340, + "type": "Literal", + "type": "Literal", + "value": 300.0 + } + }, + { + "end": 365, + "key": { + "end": 351, + "name": "length", + "start": 345, + "type": "Identifier" + }, + "start": 345, + "type": "ObjectProperty", + "value": { + "end": 365, + "name": "triangleLen", + "start": 354, + "type": "Identifier", + "type": "Identifier" + } + } + ], + "start": 330, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 370, + "start": 369, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "c" + } + ], + "callee": { + "end": 329, + "name": "angledLine", + "start": 319, + "type": "Identifier" + }, + "end": 375, + "start": 319, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 403, + "name": "triangleHeight", + "start": 389, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 406, + "start": 405, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 388, + "name": "extrude", + "start": 381, + "type": "Identifier" + }, + "end": 407, + "start": 381, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 407, + "start": 140, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 136, + "type": "VariableDeclarator" + }, + "end": 407, + "kind": "const", + "start": 136, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 567, + "id": { + "end": 417, + "name": "circl", + "start": 412, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "body": [ + { + "arguments": [ + { + "end": 453, + "name": "p", + "start": 452, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 459, + "name": "face", + "start": 455, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 451, + "name": "startSketchOn", + "start": 438, + "type": "Identifier" + }, + "end": 460, + "start": 438, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 494, + "left": { + "end": 485, + "name": "x", + "start": 484, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 494, + "name": "radius", + "start": 488, + "type": "Identifier", + "type": "Identifier" + }, + "start": 484, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 514, + "left": { + "end": 510, + "name": "triangleHeight", + "start": 496, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 514, + "raw": "2", + "start": 513, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 496, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 515, + "start": 483, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 518, + "start": 517, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 482, + "name": "startProfileAt", + "start": 468, + "type": "Identifier" + }, + "end": 519, + "start": 468, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 535, + "name": "circ", + "start": 531, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 538, + "start": 537, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 548, + "start": 540, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "arc_tag" + } + ], + "callee": { + "end": 530, + "name": "arc", + "start": 527, + "type": "Identifier" + }, + "end": 549, + "start": 527, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 564, + "start": 563, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 562, + "name": "close", + "start": 557, + "type": "Identifier" + }, + "end": 565, + "start": 557, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 565, + "start": 438, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "end": 565, + "start": 431, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 567, + "start": 427 + }, + "end": 567, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 419, + "name": "x", + "start": 418, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 425, + "name": "face", + "start": 421, + "type": "Identifier" + } + } + ], + "start": 417, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 412, + "type": "VariableDeclarator" + }, + "end": 567, + "kind": "fn", + "start": 409, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 588, + "id": { + "end": 571, + "name": "c1", + "start": 569, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "argument": { + "end": 584, + "raw": "200", + "start": 581, + "type": "Literal", + "type": "Literal", + "value": 200.0 + }, + "end": 584, + "operator": "-", + "start": 580, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 587, + "name": "c", + "start": 586, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 579, + "name": "circl", + "start": 574, + "type": "Identifier" + }, + "end": 588, + "start": 574, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 569, + "type": "VariableDeclarator" + }, + "end": 588, + "kind": "const", + "start": 569, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 767, + "id": { + "end": 597, + "name": "plumbus1", + "start": 589, + "type": "Identifier" + }, + "init": { + "body": [ + { + "end": 602, + "name": "c1", + "start": 600, + "type": "Identifier", + "type": "Identifier" + }, + { + "arguments": [ + { + "end": 626, + "name": "plumbusLen", + "start": 616, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 629, + "start": 628, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 615, + "name": "extrude", + "start": 608, + "type": "Identifier" + }, + "end": 630, + "start": 608, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 763, + "properties": [ + { + "end": 662, + "key": { + "end": 658, + "name": "radius", + "start": 652, + "type": "Identifier" + }, + "start": 652, + "type": "ObjectProperty", + "value": { + "end": 662, + "raw": "5", + "start": 661, + "type": "Literal", + "type": "Literal", + "value": 5.0 + } + }, + { + "end": 756, + "key": { + "end": 675, + "name": "tags", + "start": 671, + "type": "Identifier" + }, + "start": 671, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "computed": false, + "end": 704, + "object": { + "computed": false, + "end": 696, + "object": { + "end": 691, + "name": "c1", + "start": 689, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 696, + "name": "tags", + "start": 692, + "type": "Identifier", + "type": "Identifier" + }, + "start": 689, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "property": { + "end": 704, + "name": "arc_tag", + "start": 697, + "type": "Identifier", + "type": "Identifier" + }, + "start": 689, + "type": "MemberExpression", + "type": "MemberExpression" + }, + { + "arguments": [ + { + "computed": false, + "end": 746, + "object": { + "computed": false, + "end": 738, + "object": { + "end": 733, + "name": "c1", + "start": 731, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 738, + "name": "tags", + "start": 734, + "type": "Identifier", + "type": "Identifier" + }, + "start": 731, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "property": { + "end": 746, + "name": "arc_tag", + "start": 739, + "type": "Identifier", + "type": "Identifier" + }, + "start": 731, + "type": "MemberExpression", + "type": "MemberExpression" + } + ], + "callee": { + "end": 730, + "name": "getOppositeEdge", + "start": 715, + "type": "Identifier" + }, + "end": 747, + "start": 715, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 756, + "start": 678, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "start": 643, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 766, + "start": 765, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 642, + "name": "fillet", + "start": 636, + "type": "Identifier" + }, + "end": 767, + "start": 636, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 767, + "start": 600, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 589, + "type": "VariableDeclarator" + }, + "end": 767, + "kind": "const", + "start": 589, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 786, + "id": { + "end": 770, + "name": "c2", + "start": 768, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 782, + "raw": "200", + "start": 779, + "type": "Literal", + "type": "Literal", + "value": 200.0 + }, + { + "end": 785, + "name": "a", + "start": 784, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 778, + "name": "circl", + "start": 773, + "type": "Identifier" + }, + "end": 786, + "start": 773, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 768, + "type": "VariableDeclarator" + }, + "end": 786, + "kind": "const", + "start": 768, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 965, + "id": { + "end": 795, + "name": "plumbus0", + "start": 787, + "type": "Identifier" + }, + "init": { + "body": [ + { + "end": 800, + "name": "c2", + "start": 798, + "type": "Identifier", + "type": "Identifier" + }, + { + "arguments": [ + { + "end": 824, + "name": "plumbusLen", + "start": 814, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 827, + "start": 826, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 813, + "name": "extrude", + "start": 806, + "type": "Identifier" + }, + "end": 828, + "start": 806, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 961, + "properties": [ + { + "end": 860, + "key": { + "end": 856, + "name": "radius", + "start": 850, + "type": "Identifier" + }, + "start": 850, + "type": "ObjectProperty", + "value": { + "end": 860, + "raw": "5", + "start": 859, + "type": "Literal", + "type": "Literal", + "value": 5.0 + } + }, + { + "end": 954, + "key": { + "end": 873, + "name": "tags", + "start": 869, + "type": "Identifier" + }, + "start": 869, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "computed": false, + "end": 902, + "object": { + "computed": false, + "end": 894, + "object": { + "end": 889, + "name": "c2", + "start": 887, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 894, + "name": "tags", + "start": 890, + "type": "Identifier", + "type": "Identifier" + }, + "start": 887, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "property": { + "end": 902, + "name": "arc_tag", + "start": 895, + "type": "Identifier", + "type": "Identifier" + }, + "start": 887, + "type": "MemberExpression", + "type": "MemberExpression" + }, + { + "arguments": [ + { + "computed": false, + "end": 944, + "object": { + "computed": false, + "end": 936, + "object": { + "end": 931, + "name": "c2", + "start": 929, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 936, + "name": "tags", + "start": 932, + "type": "Identifier", + "type": "Identifier" + }, + "start": 929, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "property": { + "end": 944, + "name": "arc_tag", + "start": 937, + "type": "Identifier", + "type": "Identifier" + }, + "start": 929, + "type": "MemberExpression", + "type": "MemberExpression" + } + ], + "callee": { + "end": 928, + "name": "getOppositeEdge", + "start": 913, + "type": "Identifier" + }, + "end": 945, + "start": 913, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 954, + "start": 876, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "start": 841, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 964, + "start": 963, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 840, + "name": "fillet", + "start": 834, + "type": "Identifier" + }, + "end": 965, + "start": 834, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 965, + "start": 798, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 787, + "type": "VariableDeclarator" + }, + "end": 965, + "kind": "const", + "start": 787, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 966, + "nonCodeMeta": { + "nonCodeNodes": { + "3": [ + { + "end": 118, + "start": 116, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "5": [ + { + "end": 409, + "start": 407, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "6": [ + { + "end": 569, + "start": 567, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/input.kcl b/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/input.kcl new file mode 100644 index 000000000..52730a9e4 --- /dev/null +++ b/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/input.kcl @@ -0,0 +1,44 @@ +triangleHeight = 200 +plumbusLen = 100 +radius = 80 +circ = { + angle_start = 0, + angle_end = 360, + radius = radius +} + +triangleLen = 500 +p = startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> angledLine({ angle = 60, length = triangleLen }, %, $a) + |> angledLine({ angle = 180, length = triangleLen }, %, $b) + |> angledLine({ angle = 300, length = triangleLen }, %, $c) + |> extrude(triangleHeight, %) + +fn circl(x, face) { + return startSketchOn(p, face) + |> startProfileAt([x + radius, triangleHeight / 2], %) + |> arc(circ, %, $arc_tag) + |> close(%) +} + +c1 = circl(-200, c) +plumbus1 = c1 + |> extrude(plumbusLen, %) + |> fillet({ + radius = 5, + tags = [ + c1.tags.arc_tag, + getOppositeEdge(c1.tags.arc_tag) + ] + }, %) +c2 = circl(200, a) +plumbus0 = c2 + |> extrude(plumbusLen, %) + |> fillet({ + radius = 5, + tags = [ + c2.tags.arc_tag, + getOppositeEdge(c2.tags.arc_tag) + ] + }, %) diff --git a/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/ops.snap b/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/ops.snap new file mode 100644 index 000000000..492beead7 --- /dev/null +++ b/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/ops.snap @@ -0,0 +1,246 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed pentagon_fillet_sugar.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 154, + 158, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 140, + 159, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 389, + 403, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 405, + 406, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 381, + 407, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "type": "UserDefinedFunctionCall", + "name": "circl", + "functionSourceRange": [ + 417, + 567, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 574, + 588, + 0 + ] + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 452, + 453, + 0 + ] + }, + "tag": { + "sourceRange": [ + 455, + 459, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 438, + 460, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 616, + 626, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 628, + 629, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 608, + 630, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 643, + 763, + 0 + ] + }, + "solid": { + "sourceRange": [ + 765, + 766, + 0 + ] + } + }, + "name": "fillet", + "sourceRange": [ + 636, + 767, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "type": "UserDefinedFunctionCall", + "name": "circl", + "functionSourceRange": [ + 417, + 567, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 773, + 786, + 0 + ] + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 452, + 453, + 0 + ] + }, + "tag": { + "sourceRange": [ + 455, + 459, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 438, + 460, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 814, + 824, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 826, + 827, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 806, + 828, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 841, + 961, + 0 + ] + }, + "solid": { + "sourceRange": [ + 963, + 964, + 0 + ] + } + }, + "name": "fillet", + "sourceRange": [ + 834, + 965, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/program_memory.snap b/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/program_memory.snap new file mode 100644 index 000000000..7b6fcbc1d --- /dev/null +++ b/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/program_memory.snap @@ -0,0 +1,4027 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing pentagon_fillet_sugar.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "a": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "a", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "to": [ + 250.00000000000006, + 433.0127018922193 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 248, + 250, + 0 + ] + } + ] + }, + "arc_tag": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "arc_tag", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 527, + 549, + 0 + ] + }, + "ccw": true, + "center": [ + 200.0, + 100.0 + ], + "from": [ + 280.0, + 100.0 + ], + "radius": 80.0, + "tag": { + "end": 548, + "start": 540, + "type": "TagDeclarator", + "value": "arc_tag" + }, + "to": [ + 280.0, + 99.99999999999999 + ], + "type": "Arc" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 527, + 549, + 0 + ], + "tag": { + "end": 548, + "start": 540, + "type": "TagDeclarator", + "value": "arc_tag" + }, + "type": "extrudeArc" + } + }, + "__meta": [ + { + "sourceRange": [ + 540, + 548, + 0 + ] + } + ] + }, + "b": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "b", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ] + }, + "from": [ + 250.00000000000006, + 433.0127018922193 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "to": [ + -249.99999999999994, + 433.01270189221935 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 310, + 312, + 0 + ] + } + ] + }, + "c": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "c", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ] + }, + "from": [ + -249.99999999999994, + 433.01270189221935 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "to": [ + 0.00000000000011368683772161603, + 0.00000000000005684341886080802 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 372, + 374, + 0 + ] + } + ] + }, + "c1": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 527, + 549, + 0 + ] + }, + "ccw": true, + "center": [ + -200.0, + 100.0 + ], + "from": [ + -120.0, + 100.0 + ], + "radius": 80.0, + "tag": { + "end": 548, + "start": 540, + "type": "TagDeclarator", + "value": "arc_tag" + }, + "to": [ + -120.0, + 100.0 + ], + "type": "Arc" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 557, + 565, + 0 + ] + }, + "from": [ + -120.0, + 100.0 + ], + "tag": null, + "to": [ + -120.0, + 100.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "c", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "to": [ + 250.0, + 433.0127 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ] + }, + "from": [ + 250.0, + 433.0127 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "to": [ + -250.0, + 433.0127 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ] + }, + "from": [ + -250.0, + 433.0127 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 165, + 190, + 0 + ] + } + }, + "tags": { + "a": { + "type": "TagIdentifier", + "value": "a", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "to": [ + 250.00000000000006, + 433.0127018922193 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 248, + 250, + 0 + ] + } + ] + }, + "b": { + "type": "TagIdentifier", + "value": "b", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ] + }, + "from": [ + 250.00000000000006, + 433.0127018922193 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "to": [ + -249.99999999999994, + 433.01270189221935 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 310, + 312, + 0 + ] + } + ] + }, + "c": { + "type": "TagIdentifier", + "value": "c", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ] + }, + "from": [ + -249.99999999999994, + 433.01270189221935 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "to": [ + 0.00000000000011368683772161603, + 0.00000000000005684341886080802 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 372, + 374, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 165, + 190, + 0 + ] + } + ] + }, + "height": 200.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 165, + 190, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 438, + 460, + 0 + ] + } + ] + }, + "start": { + "from": [ + -120.0, + 100.0 + ], + "to": [ + -120.0, + 100.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 468, + 519, + 0 + ] + } + }, + "tags": { + "arc_tag": { + "type": "TagIdentifier", + "value": "arc_tag", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 527, + 549, + 0 + ] + }, + "ccw": true, + "center": [ + -200.0, + 100.0 + ], + "from": [ + -120.0, + 100.0 + ], + "radius": 80.0, + "tag": { + "end": 548, + "start": 540, + "type": "TagDeclarator", + "value": "arc_tag" + }, + "to": [ + -120.0, + 99.99999999999999 + ], + "type": "Arc" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 527, + 549, + 0 + ], + "tag": { + "end": 548, + "start": 540, + "type": "TagDeclarator", + "value": "arc_tag" + }, + "type": "extrudeArc" + } + }, + "__meta": [ + { + "sourceRange": [ + 540, + 548, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 468, + 519, + 0 + ] + } + ] + } + }, + "c2": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 527, + 549, + 0 + ] + }, + "ccw": true, + "center": [ + 200.0, + 100.0 + ], + "from": [ + 280.0, + 100.0 + ], + "radius": 80.0, + "tag": { + "end": 548, + "start": 540, + "type": "TagDeclarator", + "value": "arc_tag" + }, + "to": [ + 280.0, + 100.0 + ], + "type": "Arc" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 557, + 565, + 0 + ] + }, + "from": [ + 280.0, + 100.0 + ], + "tag": null, + "to": [ + 280.0, + 100.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "a", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "to": [ + 250.0, + 433.0127 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ] + }, + "from": [ + 250.0, + 433.0127 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "to": [ + -250.0, + 433.0127 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ] + }, + "from": [ + -250.0, + 433.0127 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 165, + 190, + 0 + ] + } + }, + "tags": { + "a": { + "type": "TagIdentifier", + "value": "a", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "to": [ + 250.00000000000006, + 433.0127018922193 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 248, + 250, + 0 + ] + } + ] + }, + "b": { + "type": "TagIdentifier", + "value": "b", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ] + }, + "from": [ + 250.00000000000006, + 433.0127018922193 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "to": [ + -249.99999999999994, + 433.01270189221935 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 310, + 312, + 0 + ] + } + ] + }, + "c": { + "type": "TagIdentifier", + "value": "c", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ] + }, + "from": [ + -249.99999999999994, + 433.01270189221935 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "to": [ + 0.00000000000011368683772161603, + 0.00000000000005684341886080802 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 372, + 374, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 165, + 190, + 0 + ] + } + ] + }, + "height": 200.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 165, + 190, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 438, + 460, + 0 + ] + } + ] + }, + "start": { + "from": [ + 280.0, + 100.0 + ], + "to": [ + 280.0, + 100.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 468, + 519, + 0 + ] + } + }, + "tags": { + "arc_tag": { + "type": "TagIdentifier", + "value": "arc_tag", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 527, + 549, + 0 + ] + }, + "ccw": true, + "center": [ + 200.0, + 100.0 + ], + "from": [ + 280.0, + 100.0 + ], + "radius": 80.0, + "tag": { + "end": 548, + "start": 540, + "type": "TagDeclarator", + "value": "arc_tag" + }, + "to": [ + 280.0, + 99.99999999999999 + ], + "type": "Arc" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 527, + 549, + 0 + ], + "tag": { + "end": 548, + "start": 540, + "type": "TagDeclarator", + "value": "arc_tag" + }, + "type": "extrudeArc" + } + }, + "__meta": [ + { + "sourceRange": [ + 540, + 548, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 468, + 519, + 0 + ] + } + ] + } + }, + "circ": { + "type": "Object", + "value": { + "angle_end": { + "type": "Number", + "value": 360.0, + "__meta": [ + { + "sourceRange": [ + 92, + 95, + 0 + ] + } + ] + }, + "angle_start": { + "type": "Number", + "value": 0.0, + "__meta": [ + { + "sourceRange": [ + 75, + 76, + 0 + ] + } + ] + }, + "radius": { + "type": "Number", + "value": 80.0, + "__meta": [ + { + "sourceRange": [ + 47, + 49, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 57, + 116, + 0 + ] + } + ] + }, + "circl": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "argument": { + "body": [ + { + "arguments": [ + { + "end": 453, + "name": "p", + "start": 452, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 459, + "name": "face", + "start": 455, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 451, + "name": "startSketchOn", + "start": 438, + "type": "Identifier" + }, + "end": 460, + "start": 438, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 494, + "left": { + "end": 485, + "name": "x", + "start": 484, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 494, + "name": "radius", + "start": 488, + "type": "Identifier", + "type": "Identifier" + }, + "start": 484, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 514, + "left": { + "end": 510, + "name": "triangleHeight", + "start": 496, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 514, + "raw": "2", + "start": 513, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 496, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 515, + "start": 483, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 518, + "start": 517, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 482, + "name": "startProfileAt", + "start": 468, + "type": "Identifier" + }, + "end": 519, + "start": 468, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 535, + "name": "circ", + "start": 531, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 538, + "start": 537, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 548, + "start": 540, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "arc_tag" + } + ], + "callee": { + "end": 530, + "name": "arc", + "start": 527, + "type": "Identifier" + }, + "end": 549, + "start": 527, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 564, + "start": 563, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 562, + "name": "close", + "start": 557, + "type": "Identifier" + }, + "end": 565, + "start": 557, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 565, + "start": 438, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "end": 565, + "start": 431, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 567, + "start": 427 + }, + "end": 567, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 419, + "name": "x", + "start": 418, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 425, + "name": "face", + "start": 421, + "type": "Identifier" + } + } + ], + "start": 417, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "a": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "a", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "to": [ + 250.00000000000006, + 433.0127018922193 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 248, + 250, + 0 + ] + } + ] + }, + "b": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "b", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ] + }, + "from": [ + 250.00000000000006, + 433.0127018922193 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "to": [ + -249.99999999999994, + 433.01270189221935 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 310, + 312, + 0 + ] + } + ] + }, + "c": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "c", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ] + }, + "from": [ + -249.99999999999994, + 433.01270189221935 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "to": [ + 0.00000000000011368683772161603, + 0.00000000000005684341886080802 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 372, + 374, + 0 + ] + } + ] + }, + "circ": { + "type": "Object", + "value": { + "angle_end": { + "type": "Number", + "value": 360.0, + "__meta": [ + { + "sourceRange": [ + 92, + 95, + 0 + ] + } + ] + }, + "angle_start": { + "type": "Number", + "value": 0.0, + "__meta": [ + { + "sourceRange": [ + 75, + 76, + 0 + ] + } + ] + }, + "radius": { + "type": "Number", + "value": 80.0, + "__meta": [ + { + "sourceRange": [ + 47, + 49, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 57, + 116, + 0 + ] + } + ] + }, + "p": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "to": [ + 250.0, + 433.0127 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ] + }, + "from": [ + 250.0, + 433.0127 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "to": [ + -250.0, + 433.0127 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ] + }, + "from": [ + -250.0, + 433.0127 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 165, + 190, + 0 + ] + } + }, + "tags": { + "a": { + "type": "TagIdentifier", + "value": "a", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "to": [ + 250.00000000000006, + 433.0127018922193 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 248, + 250, + 0 + ] + } + ] + }, + "b": { + "type": "TagIdentifier", + "value": "b", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ] + }, + "from": [ + 250.00000000000006, + 433.0127018922193 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "to": [ + -249.99999999999994, + 433.01270189221935 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 310, + 312, + 0 + ] + } + ] + }, + "c": { + "type": "TagIdentifier", + "value": "c", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ] + }, + "from": [ + -249.99999999999994, + 433.01270189221935 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "to": [ + 0.00000000000011368683772161603, + 0.00000000000005684341886080802 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 372, + 374, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 165, + 190, + 0 + ] + } + ] + }, + "height": 200.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 165, + 190, + 0 + ] + } + ] + }, + "plumbusLen": { + "type": "Number", + "value": 100.0, + "__meta": [ + { + "sourceRange": [ + 34, + 37, + 0 + ] + } + ] + }, + "radius": { + "type": "Number", + "value": 80.0, + "__meta": [ + { + "sourceRange": [ + 47, + 49, + 0 + ] + } + ] + }, + "triangleHeight": { + "type": "Number", + "value": 200.0, + "__meta": [ + { + "sourceRange": [ + 17, + 20, + 0 + ] + } + ] + }, + "triangleLen": { + "type": "Number", + "value": 500.0, + "__meta": [ + { + "sourceRange": [ + 132, + 135, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 417, + 567, + 0 + ] + } + ] + }, + "p": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "to": [ + 250.0, + 433.0127 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ] + }, + "from": [ + 250.0, + 433.0127 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "to": [ + -250.0, + 433.0127 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ] + }, + "from": [ + -250.0, + 433.0127 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 165, + 190, + 0 + ] + } + }, + "tags": { + "a": { + "type": "TagIdentifier", + "value": "a", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "to": [ + 250.00000000000006, + 433.0127018922193 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 248, + 250, + 0 + ] + } + ] + }, + "b": { + "type": "TagIdentifier", + "value": "b", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ] + }, + "from": [ + 250.00000000000006, + 433.0127018922193 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "to": [ + -249.99999999999994, + 433.01270189221935 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 310, + 312, + 0 + ] + } + ] + }, + "c": { + "type": "TagIdentifier", + "value": "c", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ] + }, + "from": [ + -249.99999999999994, + 433.01270189221935 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "to": [ + 0.00000000000011368683772161603, + 0.00000000000005684341886080802 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 372, + 374, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 165, + 190, + 0 + ] + } + ] + }, + "height": 200.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 165, + 190, + 0 + ] + } + ] + }, + "plumbus0": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 527, + 549, + 0 + ], + "tag": { + "end": 548, + "start": 540, + "type": "TagDeclarator", + "value": "arc_tag" + }, + "type": "extrudeArc" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 527, + 549, + 0 + ] + }, + "ccw": true, + "center": [ + 200.0, + 100.0 + ], + "from": [ + 280.0, + 100.0 + ], + "radius": 80.0, + "tag": { + "end": 548, + "start": 540, + "type": "TagDeclarator", + "value": "arc_tag" + }, + "to": [ + 280.0, + 100.0 + ], + "type": "Arc" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 557, + 565, + 0 + ] + }, + "from": [ + 280.0, + 100.0 + ], + "tag": null, + "to": [ + 280.0, + 100.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "a", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "to": [ + 250.0, + 433.0127 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ] + }, + "from": [ + 250.0, + 433.0127 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "to": [ + -250.0, + 433.0127 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ] + }, + "from": [ + -250.0, + 433.0127 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 165, + 190, + 0 + ] + } + }, + "tags": { + "a": { + "type": "TagIdentifier", + "value": "a", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "to": [ + 250.00000000000006, + 433.0127018922193 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 248, + 250, + 0 + ] + } + ] + }, + "b": { + "type": "TagIdentifier", + "value": "b", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ] + }, + "from": [ + 250.00000000000006, + 433.0127018922193 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "to": [ + -249.99999999999994, + 433.01270189221935 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 310, + 312, + 0 + ] + } + ] + }, + "c": { + "type": "TagIdentifier", + "value": "c", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ] + }, + "from": [ + -249.99999999999994, + 433.01270189221935 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "to": [ + 0.00000000000011368683772161603, + 0.00000000000005684341886080802 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 372, + 374, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 165, + 190, + 0 + ] + } + ] + }, + "height": 200.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 165, + 190, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 438, + 460, + 0 + ] + } + ] + }, + "start": { + "from": [ + 280.0, + 100.0 + ], + "to": [ + 280.0, + 100.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 468, + 519, + 0 + ] + } + }, + "tags": { + "arc_tag": { + "type": "TagIdentifier", + "value": "arc_tag", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 527, + 549, + 0 + ] + }, + "ccw": true, + "center": [ + 200.0, + 100.0 + ], + "from": [ + 280.0, + 100.0 + ], + "radius": 80.0, + "tag": { + "end": 548, + "start": 540, + "type": "TagDeclarator", + "value": "arc_tag" + }, + "to": [ + 280.0, + 99.99999999999999 + ], + "type": "Arc" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 527, + 549, + 0 + ], + "tag": { + "end": 548, + "start": 540, + "type": "TagDeclarator", + "value": "arc_tag" + }, + "type": "extrudeArc" + } + }, + "__meta": [ + { + "sourceRange": [ + 540, + 548, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 468, + 519, + 0 + ] + } + ] + }, + "height": 100.0, + "startCapId": null, + "endCapId": "[uuid]", + "edgeCuts": [ + { + "type": "fillet", + "id": "[uuid]", + "radius": 5.0, + "edgeId": "[uuid]", + "tag": null + }, + { + "type": "fillet", + "id": "[uuid]", + "radius": 5.0, + "edgeId": "[uuid]", + "tag": null + } + ], + "__meta": [ + { + "sourceRange": [ + 468, + 519, + 0 + ] + } + ] + }, + "plumbus1": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 527, + 549, + 0 + ], + "tag": { + "end": 548, + "start": 540, + "type": "TagDeclarator", + "value": "arc_tag" + }, + "type": "extrudeArc" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 527, + 549, + 0 + ] + }, + "ccw": true, + "center": [ + -200.0, + 100.0 + ], + "from": [ + -120.0, + 100.0 + ], + "radius": 80.0, + "tag": { + "end": 548, + "start": 540, + "type": "TagDeclarator", + "value": "arc_tag" + }, + "to": [ + -120.0, + 100.0 + ], + "type": "Arc" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 557, + 565, + 0 + ] + }, + "from": [ + -120.0, + 100.0 + ], + "tag": null, + "to": [ + -120.0, + 100.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "c", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "to": [ + 250.0, + 433.0127 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ] + }, + "from": [ + 250.0, + 433.0127 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "to": [ + -250.0, + 433.0127 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ] + }, + "from": [ + -250.0, + 433.0127 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 165, + 190, + 0 + ] + } + }, + "tags": { + "a": { + "type": "TagIdentifier", + "value": "a", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "to": [ + 250.00000000000006, + 433.0127018922193 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 196, + 251, + 0 + ], + "tag": { + "end": 250, + "start": 248, + "type": "TagDeclarator", + "value": "a" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 248, + 250, + 0 + ] + } + ] + }, + "b": { + "type": "TagIdentifier", + "value": "b", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ] + }, + "from": [ + 250.00000000000006, + 433.0127018922193 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "to": [ + -249.99999999999994, + 433.01270189221935 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 257, + 313, + 0 + ], + "tag": { + "end": 312, + "start": 310, + "type": "TagDeclarator", + "value": "b" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 310, + 312, + 0 + ] + } + ] + }, + "c": { + "type": "TagIdentifier", + "value": "c", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ] + }, + "from": [ + -249.99999999999994, + 433.01270189221935 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "to": [ + 0.00000000000011368683772161603, + 0.00000000000005684341886080802 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 319, + 375, + 0 + ], + "tag": { + "end": 374, + "start": 372, + "type": "TagDeclarator", + "value": "c" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 372, + 374, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 165, + 190, + 0 + ] + } + ] + }, + "height": 200.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 165, + 190, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 438, + 460, + 0 + ] + } + ] + }, + "start": { + "from": [ + -120.0, + 100.0 + ], + "to": [ + -120.0, + 100.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 468, + 519, + 0 + ] + } + }, + "tags": { + "arc_tag": { + "type": "TagIdentifier", + "value": "arc_tag", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 527, + 549, + 0 + ] + }, + "ccw": true, + "center": [ + -200.0, + 100.0 + ], + "from": [ + -120.0, + 100.0 + ], + "radius": 80.0, + "tag": { + "end": 548, + "start": 540, + "type": "TagDeclarator", + "value": "arc_tag" + }, + "to": [ + -120.0, + 99.99999999999999 + ], + "type": "Arc" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 527, + 549, + 0 + ], + "tag": { + "end": 548, + "start": 540, + "type": "TagDeclarator", + "value": "arc_tag" + }, + "type": "extrudeArc" + } + }, + "__meta": [ + { + "sourceRange": [ + 540, + 548, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 468, + 519, + 0 + ] + } + ] + }, + "height": 100.0, + "startCapId": null, + "endCapId": "[uuid]", + "edgeCuts": [ + { + "type": "fillet", + "id": "[uuid]", + "radius": 5.0, + "edgeId": "[uuid]", + "tag": null + }, + { + "type": "fillet", + "id": "[uuid]", + "radius": 5.0, + "edgeId": "[uuid]", + "tag": null + } + ], + "__meta": [ + { + "sourceRange": [ + 468, + 519, + 0 + ] + } + ] + }, + "plumbusLen": { + "type": "Number", + "value": 100.0, + "__meta": [ + { + "sourceRange": [ + 34, + 37, + 0 + ] + } + ] + }, + "radius": { + "type": "Number", + "value": 80.0, + "__meta": [ + { + "sourceRange": [ + 47, + 49, + 0 + ] + } + ] + }, + "triangleHeight": { + "type": "Number", + "value": 200.0, + "__meta": [ + { + "sourceRange": [ + 17, + 20, + 0 + ] + } + ] + }, + "triangleLen": { + "type": "Number", + "value": 500.0, + "__meta": [ + { + "sourceRange": [ + 132, + 135, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/rendered_model.png b/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/rendered_model.png new file mode 100644 index 000000000..b2dbd3895 Binary files /dev/null and b/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/pipe_as_arg/ast.snap b/src/wasm-lib/kcl/tests/pipe_as_arg/ast.snap new file mode 100644 index 000000000..9238416b6 --- /dev/null +++ b/src/wasm-lib/kcl/tests/pipe_as_arg/ast.snap @@ -0,0 +1,918 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing pipe_as_arg.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 322, + "id": { + "end": 7, + "name": "cube", + "start": 3, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "declaration": { + "end": 42, + "id": { + "end": 29, + "name": "l", + "start": 28, + "type": "Identifier" + }, + "init": { + "end": 42, + "left": { + "end": 38, + "name": "length", + "start": 32, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 42, + "raw": "2", + "start": 41, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 28, + "type": "VariableDeclarator" + }, + "end": 42, + "kind": "const", + "start": 28, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 58, + "id": { + "end": 46, + "name": "x", + "start": 45, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 58, + "object": { + "end": 55, + "name": "center", + "start": 49, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 57, + "raw": "0", + "start": 56, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "start": 49, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 45, + "type": "VariableDeclarator" + }, + "end": 58, + "kind": "const", + "start": 45, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 74, + "id": { + "end": 62, + "name": "y", + "start": 61, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 74, + "object": { + "end": 71, + "name": "center", + "start": 65, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 73, + "raw": "1", + "start": 72, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 65, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 61, + "type": "VariableDeclarator" + }, + "end": 74, + "kind": "const", + "start": 61, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 98, + "id": { + "end": 79, + "name": "p0", + "start": 77, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 89, + "left": { + "argument": { + "end": 85, + "name": "l", + "start": 84, + "type": "Identifier", + "type": "Identifier" + }, + "end": 85, + "operator": "-", + "start": 83, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 89, + "name": "x", + "start": 88, + "type": "Identifier", + "type": "Identifier" + }, + "start": 83, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 97, + "left": { + "argument": { + "end": 93, + "name": "l", + "start": 92, + "type": "Identifier", + "type": "Identifier" + }, + "end": 93, + "operator": "-", + "start": 91, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 97, + "name": "y", + "start": 96, + "type": "Identifier", + "type": "Identifier" + }, + "start": 91, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 98, + "start": 82, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 77, + "type": "VariableDeclarator" + }, + "end": 98, + "kind": "const", + "start": 77, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 121, + "id": { + "end": 103, + "name": "p1", + "start": 101, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 113, + "left": { + "argument": { + "end": 109, + "name": "l", + "start": 108, + "type": "Identifier", + "type": "Identifier" + }, + "end": 109, + "operator": "-", + "start": 107, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 113, + "name": "x", + "start": 112, + "type": "Identifier", + "type": "Identifier" + }, + "start": 107, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 120, + "left": { + "end": 116, + "name": "l", + "start": 115, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 120, + "name": "y", + "start": 119, + "type": "Identifier", + "type": "Identifier" + }, + "start": 115, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 121, + "start": 106, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 101, + "type": "VariableDeclarator" + }, + "end": 121, + "kind": "const", + "start": 101, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 143, + "id": { + "end": 126, + "name": "p2", + "start": 124, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 135, + "left": { + "end": 131, + "name": "l", + "start": 130, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 135, + "name": "x", + "start": 134, + "type": "Identifier", + "type": "Identifier" + }, + "start": 130, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 142, + "left": { + "end": 138, + "name": "l", + "start": 137, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 142, + "name": "y", + "start": 141, + "type": "Identifier", + "type": "Identifier" + }, + "start": 137, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 143, + "start": 129, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 124, + "type": "VariableDeclarator" + }, + "end": 143, + "kind": "const", + "start": 124, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 166, + "id": { + "end": 148, + "name": "p3", + "start": 146, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 157, + "left": { + "end": 153, + "name": "l", + "start": 152, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 157, + "name": "x", + "start": 156, + "type": "Identifier", + "type": "Identifier" + }, + "start": 152, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 165, + "left": { + "argument": { + "end": 161, + "name": "l", + "start": 160, + "type": "Identifier", + "type": "Identifier" + }, + "end": 161, + "operator": "-", + "start": 159, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 165, + "name": "y", + "start": 164, + "type": "Identifier", + "type": "Identifier" + }, + "start": 159, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 166, + "start": 151, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 146, + "type": "VariableDeclarator" + }, + "end": 166, + "kind": "const", + "start": 146, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "argument": { + "body": [ + { + "arguments": [ + { + "end": 193, + "name": "p0", + "start": 191, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 190, + "name": "startSketchAt", + "start": 177, + "type": "Identifier" + }, + "end": 194, + "start": 177, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 211, + "name": "p1", + "start": 209, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 214, + "start": 213, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 208, + "name": "lineTo", + "start": 202, + "type": "Identifier" + }, + "end": 215, + "start": 202, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 232, + "name": "p2", + "start": 230, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 235, + "start": 234, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 229, + "name": "lineTo", + "start": 223, + "type": "Identifier" + }, + "end": 236, + "start": 223, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 253, + "name": "p3", + "start": 251, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 256, + "start": 255, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 250, + "name": "lineTo", + "start": 244, + "type": "Identifier" + }, + "end": 257, + "start": 244, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 274, + "name": "p0", + "start": 272, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 277, + "start": 276, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 271, + "name": "lineTo", + "start": 265, + "type": "Identifier" + }, + "end": 278, + "start": 265, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 293, + "start": 292, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 291, + "name": "close", + "start": 286, + "type": "Identifier" + }, + "end": 294, + "start": 286, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 316, + "name": "length", + "start": 310, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 319, + "start": 318, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 309, + "name": "extrude", + "start": 302, + "type": "Identifier" + }, + "end": 320, + "start": 302, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 320, + "start": 177, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "end": 320, + "start": 170, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 322, + "nonCodeMeta": { + "nonCodeNodes": { + "6": [ + { + "end": 170, + "start": 166, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 24 + }, + "end": 322, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 14, + "name": "length", + "start": 8, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 22, + "name": "center", + "start": 16, + "type": "Identifier" + } + } + ], + "start": 7, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" + }, + "end": 322, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 355, + "id": { + "end": 333, + "name": "double", + "start": 327, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "end": 353, + "left": { + "end": 349, + "name": "x", + "start": 348, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "*", + "right": { + "end": 353, + "raw": "2", + "start": 352, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 348, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 353, + "start": 341, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 355, + "start": 337 + }, + "end": 355, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 335, + "name": "x", + "start": 334, + "type": "Identifier" + } + } + ], + "start": 333, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 327, + "type": "VariableDeclarator" + }, + "end": 355, + "kind": "fn", + "start": 324, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 383, + "id": { + "end": 364, + "name": "width", + "start": 359, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "end": 381, + "raw": "200", + "start": 378, + "type": "Literal", + "type": "Literal", + "value": 200.0 + }, + "end": 381, + "start": 371, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 383, + "start": 367 + }, + "end": 383, + "params": [], + "start": 364, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 359, + "type": "VariableDeclarator" + }, + "end": 383, + "kind": "fn", + "start": 356, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 426, + "id": { + "end": 391, + "name": "myCube", + "start": 385, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "body": [ + { + "end": 402, + "raw": "200", + "start": 399, + "type": "Literal", + "type": "Literal", + "value": 200.0 + }, + { + "arguments": [ + { + "end": 416, + "start": 415, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 414, + "name": "double", + "start": 408, + "type": "Identifier" + }, + "end": 417, + "start": 408, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 417, + "start": 399, + "type": "PipeExpression", + "type": "PipeExpression" + }, + { + "elements": [ + { + "end": 421, + "raw": "0", + "start": 420, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 424, + "raw": "0", + "start": 423, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 425, + "start": 419, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + ], + "callee": { + "end": 398, + "name": "cube", + "start": 394, + "type": "Identifier" + }, + "end": 426, + "start": 394, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 385, + "type": "VariableDeclarator" + }, + "end": 426, + "kind": "const", + "start": 385, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 427, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 324, + "start": 322, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "2": [ + { + "end": 385, + "start": 383, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/pipe_as_arg/input.kcl b/src/wasm-lib/kcl/tests/pipe_as_arg/input.kcl new file mode 100644 index 000000000..69a3faa33 --- /dev/null +++ b/src/wasm-lib/kcl/tests/pipe_as_arg/input.kcl @@ -0,0 +1,27 @@ +fn cube(length, center) { + l = length / 2 + x = center[0] + y = center[1] + p0 = [-l + x, -l + y] + p1 = [-l + x, l + y] + p2 = [l + x, l + y] + p3 = [l + x, -l + y] + + return startSketchAt(p0) + |> lineTo(p1, %) + |> lineTo(p2, %) + |> lineTo(p3, %) + |> lineTo(p0, %) + |> close(%) + |> extrude(length, %) +} + +fn double(x) { + return x * 2 +} +fn width() { + return 200 +} + +myCube = cube(200 + |> double(%), [0, 0]) diff --git a/src/wasm-lib/kcl/tests/pipe_as_arg/ops.snap b/src/wasm-lib/kcl/tests/pipe_as_arg/ops.snap new file mode 100644 index 000000000..d82988be4 --- /dev/null +++ b/src/wasm-lib/kcl/tests/pipe_as_arg/ops.snap @@ -0,0 +1,71 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed pipe_as_arg.kcl +snapshot_kind: text +--- +[ + { + "type": "UserDefinedFunctionCall", + "name": "double", + "functionSourceRange": [ + 333, + 355, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 408, + 417, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "cube", + "functionSourceRange": [ + 7, + 322, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 394, + 426, + 0 + ] + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 310, + 316, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 318, + 319, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 302, + 320, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "type": "UserDefinedFunctionReturn" + } +] diff --git a/src/wasm-lib/kcl/tests/pipe_as_arg/program_memory.snap b/src/wasm-lib/kcl/tests/pipe_as_arg/program_memory.snap new file mode 100644 index 000000000..c1918dc93 --- /dev/null +++ b/src/wasm-lib/kcl/tests/pipe_as_arg/program_memory.snap @@ -0,0 +1,3309 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing pipe_as_arg.kcl +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "cube": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "declaration": { + "end": 42, + "id": { + "end": 29, + "name": "l", + "start": 28, + "type": "Identifier" + }, + "init": { + "end": 42, + "left": { + "end": 38, + "name": "length", + "start": 32, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 42, + "raw": "2", + "start": 41, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 28, + "type": "VariableDeclarator" + }, + "end": 42, + "kind": "const", + "start": 28, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 58, + "id": { + "end": 46, + "name": "x", + "start": 45, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 58, + "object": { + "end": 55, + "name": "center", + "start": 49, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 57, + "raw": "0", + "start": 56, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "start": 49, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 45, + "type": "VariableDeclarator" + }, + "end": 58, + "kind": "const", + "start": 45, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 74, + "id": { + "end": 62, + "name": "y", + "start": 61, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 74, + "object": { + "end": 71, + "name": "center", + "start": 65, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 73, + "raw": "1", + "start": 72, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 65, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 61, + "type": "VariableDeclarator" + }, + "end": 74, + "kind": "const", + "start": 61, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 98, + "id": { + "end": 79, + "name": "p0", + "start": 77, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 89, + "left": { + "argument": { + "end": 85, + "name": "l", + "start": 84, + "type": "Identifier", + "type": "Identifier" + }, + "end": 85, + "operator": "-", + "start": 83, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 89, + "name": "x", + "start": 88, + "type": "Identifier", + "type": "Identifier" + }, + "start": 83, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 97, + "left": { + "argument": { + "end": 93, + "name": "l", + "start": 92, + "type": "Identifier", + "type": "Identifier" + }, + "end": 93, + "operator": "-", + "start": 91, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 97, + "name": "y", + "start": 96, + "type": "Identifier", + "type": "Identifier" + }, + "start": 91, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 98, + "start": 82, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 77, + "type": "VariableDeclarator" + }, + "end": 98, + "kind": "const", + "start": 77, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 121, + "id": { + "end": 103, + "name": "p1", + "start": 101, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 113, + "left": { + "argument": { + "end": 109, + "name": "l", + "start": 108, + "type": "Identifier", + "type": "Identifier" + }, + "end": 109, + "operator": "-", + "start": 107, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 113, + "name": "x", + "start": 112, + "type": "Identifier", + "type": "Identifier" + }, + "start": 107, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 120, + "left": { + "end": 116, + "name": "l", + "start": 115, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 120, + "name": "y", + "start": 119, + "type": "Identifier", + "type": "Identifier" + }, + "start": 115, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 121, + "start": 106, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 101, + "type": "VariableDeclarator" + }, + "end": 121, + "kind": "const", + "start": 101, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 143, + "id": { + "end": 126, + "name": "p2", + "start": 124, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 135, + "left": { + "end": 131, + "name": "l", + "start": 130, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 135, + "name": "x", + "start": 134, + "type": "Identifier", + "type": "Identifier" + }, + "start": 130, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 142, + "left": { + "end": 138, + "name": "l", + "start": 137, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 142, + "name": "y", + "start": 141, + "type": "Identifier", + "type": "Identifier" + }, + "start": 137, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 143, + "start": 129, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 124, + "type": "VariableDeclarator" + }, + "end": 143, + "kind": "const", + "start": 124, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 166, + "id": { + "end": 148, + "name": "p3", + "start": 146, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 157, + "left": { + "end": 153, + "name": "l", + "start": 152, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 157, + "name": "x", + "start": 156, + "type": "Identifier", + "type": "Identifier" + }, + "start": 152, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 165, + "left": { + "argument": { + "end": 161, + "name": "l", + "start": 160, + "type": "Identifier", + "type": "Identifier" + }, + "end": 161, + "operator": "-", + "start": 159, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 165, + "name": "y", + "start": 164, + "type": "Identifier", + "type": "Identifier" + }, + "start": 159, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 166, + "start": 151, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 146, + "type": "VariableDeclarator" + }, + "end": 166, + "kind": "const", + "start": 146, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "argument": { + "body": [ + { + "arguments": [ + { + "end": 193, + "name": "p0", + "start": 191, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 190, + "name": "startSketchAt", + "start": 177, + "type": "Identifier" + }, + "end": 194, + "start": 177, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 211, + "name": "p1", + "start": 209, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 214, + "start": 213, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 208, + "name": "lineTo", + "start": 202, + "type": "Identifier" + }, + "end": 215, + "start": 202, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 232, + "name": "p2", + "start": 230, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 235, + "start": 234, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 229, + "name": "lineTo", + "start": 223, + "type": "Identifier" + }, + "end": 236, + "start": 223, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 253, + "name": "p3", + "start": 251, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 256, + "start": 255, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 250, + "name": "lineTo", + "start": 244, + "type": "Identifier" + }, + "end": 257, + "start": 244, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 274, + "name": "p0", + "start": 272, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 277, + "start": 276, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 271, + "name": "lineTo", + "start": 265, + "type": "Identifier" + }, + "end": 278, + "start": 265, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 293, + "start": 292, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 291, + "name": "close", + "start": 286, + "type": "Identifier" + }, + "end": 294, + "start": 286, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 316, + "name": "length", + "start": 310, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 319, + "start": 318, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 309, + "name": "extrude", + "start": 302, + "type": "Identifier" + }, + "end": 320, + "start": 302, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 320, + "start": 177, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "end": 320, + "start": 170, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 322, + "nonCodeMeta": { + "nonCodeNodes": { + "6": [ + { + "end": 170, + "start": 166, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 24 + }, + "end": 322, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 14, + "name": "length", + "start": 8, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 22, + "name": "center", + "start": 16, + "type": "Identifier" + } + } + ], + "start": 7, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 7, + 322, + 0 + ] + } + ] + }, + "double": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "argument": { + "end": 353, + "left": { + "end": 349, + "name": "x", + "start": 348, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "*", + "right": { + "end": 353, + "raw": "2", + "start": 352, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 348, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 353, + "start": 341, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 355, + "start": 337 + }, + "end": 355, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 335, + "name": "x", + "start": 334, + "type": "Identifier" + } + } + ], + "start": 333, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "cube": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "declaration": { + "end": 42, + "id": { + "end": 29, + "name": "l", + "start": 28, + "type": "Identifier" + }, + "init": { + "end": 42, + "left": { + "end": 38, + "name": "length", + "start": 32, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 42, + "raw": "2", + "start": 41, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 28, + "type": "VariableDeclarator" + }, + "end": 42, + "kind": "const", + "start": 28, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 58, + "id": { + "end": 46, + "name": "x", + "start": 45, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 58, + "object": { + "end": 55, + "name": "center", + "start": 49, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 57, + "raw": "0", + "start": 56, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "start": 49, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 45, + "type": "VariableDeclarator" + }, + "end": 58, + "kind": "const", + "start": 45, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 74, + "id": { + "end": 62, + "name": "y", + "start": 61, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 74, + "object": { + "end": 71, + "name": "center", + "start": 65, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 73, + "raw": "1", + "start": 72, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 65, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 61, + "type": "VariableDeclarator" + }, + "end": 74, + "kind": "const", + "start": 61, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 98, + "id": { + "end": 79, + "name": "p0", + "start": 77, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 89, + "left": { + "argument": { + "end": 85, + "name": "l", + "start": 84, + "type": "Identifier", + "type": "Identifier" + }, + "end": 85, + "operator": "-", + "start": 83, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 89, + "name": "x", + "start": 88, + "type": "Identifier", + "type": "Identifier" + }, + "start": 83, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 97, + "left": { + "argument": { + "end": 93, + "name": "l", + "start": 92, + "type": "Identifier", + "type": "Identifier" + }, + "end": 93, + "operator": "-", + "start": 91, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 97, + "name": "y", + "start": 96, + "type": "Identifier", + "type": "Identifier" + }, + "start": 91, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 98, + "start": 82, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 77, + "type": "VariableDeclarator" + }, + "end": 98, + "kind": "const", + "start": 77, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 121, + "id": { + "end": 103, + "name": "p1", + "start": 101, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 113, + "left": { + "argument": { + "end": 109, + "name": "l", + "start": 108, + "type": "Identifier", + "type": "Identifier" + }, + "end": 109, + "operator": "-", + "start": 107, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 113, + "name": "x", + "start": 112, + "type": "Identifier", + "type": "Identifier" + }, + "start": 107, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 120, + "left": { + "end": 116, + "name": "l", + "start": 115, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 120, + "name": "y", + "start": 119, + "type": "Identifier", + "type": "Identifier" + }, + "start": 115, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 121, + "start": 106, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 101, + "type": "VariableDeclarator" + }, + "end": 121, + "kind": "const", + "start": 101, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 143, + "id": { + "end": 126, + "name": "p2", + "start": 124, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 135, + "left": { + "end": 131, + "name": "l", + "start": 130, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 135, + "name": "x", + "start": 134, + "type": "Identifier", + "type": "Identifier" + }, + "start": 130, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 142, + "left": { + "end": 138, + "name": "l", + "start": 137, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 142, + "name": "y", + "start": 141, + "type": "Identifier", + "type": "Identifier" + }, + "start": 137, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 143, + "start": 129, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 124, + "type": "VariableDeclarator" + }, + "end": 143, + "kind": "const", + "start": 124, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 166, + "id": { + "end": 148, + "name": "p3", + "start": 146, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 157, + "left": { + "end": 153, + "name": "l", + "start": 152, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 157, + "name": "x", + "start": 156, + "type": "Identifier", + "type": "Identifier" + }, + "start": 152, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 165, + "left": { + "argument": { + "end": 161, + "name": "l", + "start": 160, + "type": "Identifier", + "type": "Identifier" + }, + "end": 161, + "operator": "-", + "start": 159, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 165, + "name": "y", + "start": 164, + "type": "Identifier", + "type": "Identifier" + }, + "start": 159, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 166, + "start": 151, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 146, + "type": "VariableDeclarator" + }, + "end": 166, + "kind": "const", + "start": 146, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "argument": { + "body": [ + { + "arguments": [ + { + "end": 193, + "name": "p0", + "start": 191, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 190, + "name": "startSketchAt", + "start": 177, + "type": "Identifier" + }, + "end": 194, + "start": 177, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 211, + "name": "p1", + "start": 209, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 214, + "start": 213, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 208, + "name": "lineTo", + "start": 202, + "type": "Identifier" + }, + "end": 215, + "start": 202, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 232, + "name": "p2", + "start": 230, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 235, + "start": 234, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 229, + "name": "lineTo", + "start": 223, + "type": "Identifier" + }, + "end": 236, + "start": 223, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 253, + "name": "p3", + "start": 251, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 256, + "start": 255, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 250, + "name": "lineTo", + "start": 244, + "type": "Identifier" + }, + "end": 257, + "start": 244, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 274, + "name": "p0", + "start": 272, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 277, + "start": 276, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 271, + "name": "lineTo", + "start": 265, + "type": "Identifier" + }, + "end": 278, + "start": 265, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 293, + "start": 292, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 291, + "name": "close", + "start": 286, + "type": "Identifier" + }, + "end": 294, + "start": 286, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 316, + "name": "length", + "start": 310, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 319, + "start": 318, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 309, + "name": "extrude", + "start": 302, + "type": "Identifier" + }, + "end": 320, + "start": 302, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 320, + "start": 177, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "end": 320, + "start": 170, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 322, + "nonCodeMeta": { + "nonCodeNodes": { + "6": [ + { + "end": 170, + "start": 166, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 24 + }, + "end": 322, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 14, + "name": "length", + "start": 8, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 22, + "name": "center", + "start": 16, + "type": "Identifier" + } + } + ], + "start": 7, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 7, + 322, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 333, + 355, + 0 + ] + } + ] + }, + "myCube": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 202, + 215, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 223, + 236, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 244, + 257, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 265, + 278, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 202, + 215, + 0 + ] + }, + "from": [ + -200.0, + -200.0 + ], + "tag": null, + "to": [ + -200.0, + 200.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 223, + 236, + 0 + ] + }, + "from": [ + -200.0, + 200.0 + ], + "tag": null, + "to": [ + 200.0, + 200.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 244, + 257, + 0 + ] + }, + "from": [ + 200.0, + 200.0 + ], + "tag": null, + "to": [ + 200.0, + -200.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 265, + 278, + 0 + ] + }, + "from": [ + 200.0, + -200.0 + ], + "tag": null, + "to": [ + -200.0, + -200.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 286, + 294, + 0 + ] + }, + "from": [ + -200.0, + -200.0 + ], + "tag": null, + "to": [ + -200.0, + -200.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + -200.0, + -200.0 + ], + "to": [ + -200.0, + -200.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 177, + 194, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 177, + 194, + 0 + ] + } + ] + }, + "height": 400.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 177, + 194, + 0 + ] + } + ] + }, + "width": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "argument": { + "end": 381, + "raw": "200", + "start": 378, + "type": "Literal", + "type": "Literal", + "value": 200.0 + }, + "end": 381, + "start": 371, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 383, + "start": 367 + }, + "end": 383, + "params": [], + "start": 364, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "cube": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "declaration": { + "end": 42, + "id": { + "end": 29, + "name": "l", + "start": 28, + "type": "Identifier" + }, + "init": { + "end": 42, + "left": { + "end": 38, + "name": "length", + "start": 32, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 42, + "raw": "2", + "start": 41, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 28, + "type": "VariableDeclarator" + }, + "end": 42, + "kind": "const", + "start": 28, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 58, + "id": { + "end": 46, + "name": "x", + "start": 45, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 58, + "object": { + "end": 55, + "name": "center", + "start": 49, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 57, + "raw": "0", + "start": 56, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "start": 49, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 45, + "type": "VariableDeclarator" + }, + "end": 58, + "kind": "const", + "start": 45, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 74, + "id": { + "end": 62, + "name": "y", + "start": 61, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 74, + "object": { + "end": 71, + "name": "center", + "start": 65, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 73, + "raw": "1", + "start": 72, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 65, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 61, + "type": "VariableDeclarator" + }, + "end": 74, + "kind": "const", + "start": 61, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 98, + "id": { + "end": 79, + "name": "p0", + "start": 77, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 89, + "left": { + "argument": { + "end": 85, + "name": "l", + "start": 84, + "type": "Identifier", + "type": "Identifier" + }, + "end": 85, + "operator": "-", + "start": 83, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 89, + "name": "x", + "start": 88, + "type": "Identifier", + "type": "Identifier" + }, + "start": 83, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 97, + "left": { + "argument": { + "end": 93, + "name": "l", + "start": 92, + "type": "Identifier", + "type": "Identifier" + }, + "end": 93, + "operator": "-", + "start": 91, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 97, + "name": "y", + "start": 96, + "type": "Identifier", + "type": "Identifier" + }, + "start": 91, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 98, + "start": 82, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 77, + "type": "VariableDeclarator" + }, + "end": 98, + "kind": "const", + "start": 77, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 121, + "id": { + "end": 103, + "name": "p1", + "start": 101, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 113, + "left": { + "argument": { + "end": 109, + "name": "l", + "start": 108, + "type": "Identifier", + "type": "Identifier" + }, + "end": 109, + "operator": "-", + "start": 107, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 113, + "name": "x", + "start": 112, + "type": "Identifier", + "type": "Identifier" + }, + "start": 107, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 120, + "left": { + "end": 116, + "name": "l", + "start": 115, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 120, + "name": "y", + "start": 119, + "type": "Identifier", + "type": "Identifier" + }, + "start": 115, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 121, + "start": 106, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 101, + "type": "VariableDeclarator" + }, + "end": 121, + "kind": "const", + "start": 101, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 143, + "id": { + "end": 126, + "name": "p2", + "start": 124, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 135, + "left": { + "end": 131, + "name": "l", + "start": 130, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 135, + "name": "x", + "start": 134, + "type": "Identifier", + "type": "Identifier" + }, + "start": 130, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 142, + "left": { + "end": 138, + "name": "l", + "start": 137, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 142, + "name": "y", + "start": 141, + "type": "Identifier", + "type": "Identifier" + }, + "start": 137, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 143, + "start": 129, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 124, + "type": "VariableDeclarator" + }, + "end": 143, + "kind": "const", + "start": 124, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 166, + "id": { + "end": 148, + "name": "p3", + "start": 146, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 157, + "left": { + "end": 153, + "name": "l", + "start": 152, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 157, + "name": "x", + "start": 156, + "type": "Identifier", + "type": "Identifier" + }, + "start": 152, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 165, + "left": { + "argument": { + "end": 161, + "name": "l", + "start": 160, + "type": "Identifier", + "type": "Identifier" + }, + "end": 161, + "operator": "-", + "start": 159, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 165, + "name": "y", + "start": 164, + "type": "Identifier", + "type": "Identifier" + }, + "start": 159, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 166, + "start": 151, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 146, + "type": "VariableDeclarator" + }, + "end": 166, + "kind": "const", + "start": 146, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "argument": { + "body": [ + { + "arguments": [ + { + "end": 193, + "name": "p0", + "start": 191, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 190, + "name": "startSketchAt", + "start": 177, + "type": "Identifier" + }, + "end": 194, + "start": 177, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 211, + "name": "p1", + "start": 209, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 214, + "start": 213, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 208, + "name": "lineTo", + "start": 202, + "type": "Identifier" + }, + "end": 215, + "start": 202, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 232, + "name": "p2", + "start": 230, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 235, + "start": 234, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 229, + "name": "lineTo", + "start": 223, + "type": "Identifier" + }, + "end": 236, + "start": 223, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 253, + "name": "p3", + "start": 251, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 256, + "start": 255, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 250, + "name": "lineTo", + "start": 244, + "type": "Identifier" + }, + "end": 257, + "start": 244, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 274, + "name": "p0", + "start": 272, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 277, + "start": 276, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 271, + "name": "lineTo", + "start": 265, + "type": "Identifier" + }, + "end": 278, + "start": 265, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 293, + "start": 292, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 291, + "name": "close", + "start": 286, + "type": "Identifier" + }, + "end": 294, + "start": 286, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 316, + "name": "length", + "start": 310, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 319, + "start": 318, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 309, + "name": "extrude", + "start": 302, + "type": "Identifier" + }, + "end": 320, + "start": 302, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 320, + "start": 177, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "end": 320, + "start": 170, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 322, + "nonCodeMeta": { + "nonCodeNodes": { + "6": [ + { + "end": 170, + "start": 166, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 24 + }, + "end": 322, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 14, + "name": "length", + "start": 8, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 22, + "name": "center", + "start": 16, + "type": "Identifier" + } + } + ], + "start": 7, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 7, + 322, + 0 + ] + } + ] + }, + "double": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "argument": { + "end": 353, + "left": { + "end": 349, + "name": "x", + "start": 348, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "*", + "right": { + "end": 353, + "raw": "2", + "start": 352, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 348, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 353, + "start": 341, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 355, + "start": 337 + }, + "end": 355, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 335, + "name": "x", + "start": 334, + "type": "Identifier" + } + } + ], + "start": 333, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "cube": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "declaration": { + "end": 42, + "id": { + "end": 29, + "name": "l", + "start": 28, + "type": "Identifier" + }, + "init": { + "end": 42, + "left": { + "end": 38, + "name": "length", + "start": 32, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 42, + "raw": "2", + "start": 41, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 32, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 28, + "type": "VariableDeclarator" + }, + "end": 42, + "kind": "const", + "start": 28, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 58, + "id": { + "end": 46, + "name": "x", + "start": 45, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 58, + "object": { + "end": 55, + "name": "center", + "start": 49, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 57, + "raw": "0", + "start": 56, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "start": 49, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 45, + "type": "VariableDeclarator" + }, + "end": 58, + "kind": "const", + "start": 45, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 74, + "id": { + "end": 62, + "name": "y", + "start": 61, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 74, + "object": { + "end": 71, + "name": "center", + "start": 65, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 73, + "raw": "1", + "start": 72, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 65, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 61, + "type": "VariableDeclarator" + }, + "end": 74, + "kind": "const", + "start": 61, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 98, + "id": { + "end": 79, + "name": "p0", + "start": 77, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 89, + "left": { + "argument": { + "end": 85, + "name": "l", + "start": 84, + "type": "Identifier", + "type": "Identifier" + }, + "end": 85, + "operator": "-", + "start": 83, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 89, + "name": "x", + "start": 88, + "type": "Identifier", + "type": "Identifier" + }, + "start": 83, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 97, + "left": { + "argument": { + "end": 93, + "name": "l", + "start": 92, + "type": "Identifier", + "type": "Identifier" + }, + "end": 93, + "operator": "-", + "start": 91, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 97, + "name": "y", + "start": 96, + "type": "Identifier", + "type": "Identifier" + }, + "start": 91, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 98, + "start": 82, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 77, + "type": "VariableDeclarator" + }, + "end": 98, + "kind": "const", + "start": 77, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 121, + "id": { + "end": 103, + "name": "p1", + "start": 101, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 113, + "left": { + "argument": { + "end": 109, + "name": "l", + "start": 108, + "type": "Identifier", + "type": "Identifier" + }, + "end": 109, + "operator": "-", + "start": 107, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 113, + "name": "x", + "start": 112, + "type": "Identifier", + "type": "Identifier" + }, + "start": 107, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 120, + "left": { + "end": 116, + "name": "l", + "start": 115, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 120, + "name": "y", + "start": 119, + "type": "Identifier", + "type": "Identifier" + }, + "start": 115, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 121, + "start": 106, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 101, + "type": "VariableDeclarator" + }, + "end": 121, + "kind": "const", + "start": 101, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 143, + "id": { + "end": 126, + "name": "p2", + "start": 124, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 135, + "left": { + "end": 131, + "name": "l", + "start": 130, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 135, + "name": "x", + "start": 134, + "type": "Identifier", + "type": "Identifier" + }, + "start": 130, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 142, + "left": { + "end": 138, + "name": "l", + "start": 137, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 142, + "name": "y", + "start": 141, + "type": "Identifier", + "type": "Identifier" + }, + "start": 137, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 143, + "start": 129, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 124, + "type": "VariableDeclarator" + }, + "end": 143, + "kind": "const", + "start": 124, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 166, + "id": { + "end": 148, + "name": "p3", + "start": 146, + "type": "Identifier" + }, + "init": { + "elements": [ + { + "end": 157, + "left": { + "end": 153, + "name": "l", + "start": 152, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 157, + "name": "x", + "start": 156, + "type": "Identifier", + "type": "Identifier" + }, + "start": 152, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 165, + "left": { + "argument": { + "end": 161, + "name": "l", + "start": 160, + "type": "Identifier", + "type": "Identifier" + }, + "end": 161, + "operator": "-", + "start": 159, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 165, + "name": "y", + "start": 164, + "type": "Identifier", + "type": "Identifier" + }, + "start": 159, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 166, + "start": 151, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 146, + "type": "VariableDeclarator" + }, + "end": 166, + "kind": "const", + "start": 146, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "argument": { + "body": [ + { + "arguments": [ + { + "end": 193, + "name": "p0", + "start": 191, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 190, + "name": "startSketchAt", + "start": 177, + "type": "Identifier" + }, + "end": 194, + "start": 177, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 211, + "name": "p1", + "start": 209, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 214, + "start": 213, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 208, + "name": "lineTo", + "start": 202, + "type": "Identifier" + }, + "end": 215, + "start": 202, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 232, + "name": "p2", + "start": 230, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 235, + "start": 234, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 229, + "name": "lineTo", + "start": 223, + "type": "Identifier" + }, + "end": 236, + "start": 223, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 253, + "name": "p3", + "start": 251, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 256, + "start": 255, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 250, + "name": "lineTo", + "start": 244, + "type": "Identifier" + }, + "end": 257, + "start": 244, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 274, + "name": "p0", + "start": 272, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 277, + "start": 276, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 271, + "name": "lineTo", + "start": 265, + "type": "Identifier" + }, + "end": 278, + "start": 265, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 293, + "start": 292, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 291, + "name": "close", + "start": 286, + "type": "Identifier" + }, + "end": 294, + "start": 286, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 316, + "name": "length", + "start": 310, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 319, + "start": 318, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 309, + "name": "extrude", + "start": 302, + "type": "Identifier" + }, + "end": 320, + "start": 302, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 320, + "start": 177, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "end": 320, + "start": 170, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 322, + "nonCodeMeta": { + "nonCodeNodes": { + "6": [ + { + "end": 170, + "start": 166, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 24 + }, + "end": 322, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 14, + "name": "length", + "start": 8, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 22, + "name": "center", + "start": 16, + "type": "Identifier" + } + } + ], + "start": 7, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 7, + 322, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 333, + 355, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 364, + 383, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/pipe_as_arg/rendered_model.png b/src/wasm-lib/kcl/tests/pipe_as_arg/rendered_model.png new file mode 100644 index 000000000..33b50b88c Binary files /dev/null and b/src/wasm-lib/kcl/tests/pipe_as_arg/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/pipe_substitution_inside_function_called_from_pipeline/ast.snap b/src/wasm-lib/kcl/tests/pipe_substitution_inside_function_called_from_pipeline/ast.snap new file mode 100644 index 000000000..b021df879 --- /dev/null +++ b/src/wasm-lib/kcl/tests/pipe_substitution_inside_function_called_from_pipeline/ast.snap @@ -0,0 +1,143 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing pipe_substitution_inside_function_called_from_pipeline.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 89, + "id": { + "end": 65, + "name": "f", + "start": 64, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "end": 87, + "start": 86, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + "end": 87, + "start": 79, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 89, + "start": 75 + }, + "end": 89, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 73, + "name": "ignored", + "start": 66, + "type": "Identifier" + } + } + ], + "start": 65, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 64, + "type": "VariableDeclarator" + }, + "end": 89, + "kind": "fn", + "start": 61, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 111, + "id": { + "end": 97, + "name": "answer", + "start": 91, + "type": "Identifier" + }, + "init": { + "body": [ + { + "end": 101, + "start": 100, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "arguments": [ + { + "end": 110, + "start": 109, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 108, + "name": "f", + "start": 107, + "type": "Identifier" + }, + "end": 111, + "start": 107, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 111, + "start": 100, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 91, + "type": "VariableDeclarator" + }, + "end": 111, + "kind": "const", + "start": 91, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 112, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 91, + "start": 89, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [ + { + "end": 60, + "start": 0, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "Make sure pipe value doesn't leak into the function call.", + "style": "line" + } + } + ] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/pipe_substitution_inside_function_called_from_pipeline/execution_error.snap b/src/wasm-lib/kcl/tests/pipe_substitution_inside_function_called_from_pipeline/execution_error.snap new file mode 100644 index 000000000..d03da638f --- /dev/null +++ b/src/wasm-lib/kcl/tests/pipe_substitution_inside_function_called_from_pipeline/execution_error.snap @@ -0,0 +1,13 @@ +--- +source: kcl/src/simulation_tests.rs +description: Error from executing pipe_substitution_inside_function_called_from_pipeline.kcl +--- +KCL Semantic error + + × semantic: cannot use % outside a pipe expression + ╭─[6:10] + 5 │ + 6 │ answer = % + · ─ + 7 │ |> f(%) + ╰──── diff --git a/src/wasm-lib/kcl/tests/pipe_substitution_inside_function_called_from_pipeline/input.kcl b/src/wasm-lib/kcl/tests/pipe_substitution_inside_function_called_from_pipeline/input.kcl new file mode 100644 index 000000000..b56efda1f --- /dev/null +++ b/src/wasm-lib/kcl/tests/pipe_substitution_inside_function_called_from_pipeline/input.kcl @@ -0,0 +1,7 @@ +// Make sure pipe value doesn't leak into the function call. +fn f(ignored) { + return % +} + +answer = % + |> f(%) diff --git a/src/wasm-lib/kcl/tests/pipe_substitution_inside_function_called_from_pipeline/ops.snap b/src/wasm-lib/kcl/tests/pipe_substitution_inside_function_called_from_pipeline/ops.snap new file mode 100644 index 000000000..81ca4232f --- /dev/null +++ b/src/wasm-lib/kcl/tests/pipe_substitution_inside_function_called_from_pipeline/ops.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed pipe_substitution_inside_function_called_from_pipeline.kcl +snapshot_kind: text +--- +[] diff --git a/src/wasm-lib/kcl/tests/poop_chute/ast.snap b/src/wasm-lib/kcl/tests/poop_chute/ast.snap new file mode 100644 index 000000000..fa00d05b5 --- /dev/null +++ b/src/wasm-lib/kcl/tests/poop_chute/ast.snap @@ -0,0 +1,2010 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing poop_chute.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 22, + "id": { + "end": 14, + "name": "wall_thickness", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 22, + "raw": "0.125", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 0.125 + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 22, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 43, + "id": { + "end": 39, + "name": "back_walls_width", + "start": 23, + "type": "Identifier" + }, + "init": { + "end": 43, + "raw": "2", + "start": 42, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 23, + "type": "VariableDeclarator" + }, + "end": 43, + "kind": "const", + "start": 23, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 67, + "id": { + "end": 61, + "name": "front_walls_width", + "start": 44, + "type": "Identifier" + }, + "init": { + "end": 67, + "raw": "2.5", + "start": 64, + "type": "Literal", + "type": "Literal", + "value": 2.5 + }, + "start": 44, + "type": "VariableDeclarator" + }, + "end": 67, + "kind": "const", + "start": 44, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 80, + "id": { + "end": 74, + "name": "height", + "start": 68, + "type": "Identifier" + }, + "init": { + "end": 80, + "raw": "5.5", + "start": 77, + "type": "Literal", + "type": "Literal", + "value": 5.5 + }, + "start": 68, + "type": "VariableDeclarator" + }, + "end": 80, + "kind": "const", + "start": 68, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 101, + "id": { + "end": 93, + "name": "filletRadius", + "start": 81, + "type": "Identifier" + }, + "init": { + "end": 101, + "raw": "0.050", + "start": 96, + "type": "Literal", + "type": "Literal", + "value": 0.05 + }, + "start": 81, + "type": "VariableDeclarator" + }, + "end": 101, + "kind": "const", + "start": 81, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 117, + "id": { + "end": 113, + "name": "back_length", + "start": 102, + "type": "Identifier" + }, + "init": { + "end": 117, + "raw": "7", + "start": 116, + "type": "Literal", + "type": "Literal", + "value": 7.0 + }, + "start": 102, + "type": "VariableDeclarator" + }, + "end": 117, + "kind": "const", + "start": 102, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 133, + "id": { + "end": 129, + "name": "exit_height", + "start": 118, + "type": "Identifier" + }, + "init": { + "end": 133, + "raw": "1", + "start": 132, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 118, + "type": "VariableDeclarator" + }, + "end": 133, + "kind": "const", + "start": 118, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 150, + "id": { + "end": 146, + "name": "front_length", + "start": 134, + "type": "Identifier" + }, + "init": { + "end": 150, + "raw": "6", + "start": 149, + "type": "Literal", + "type": "Literal", + "value": 6.0 + }, + "start": 134, + "type": "VariableDeclarator" + }, + "end": 150, + "kind": "const", + "start": 134, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 159, + "id": { + "end": 153, + "name": "Fx", + "start": 151, + "type": "Identifier" + }, + "init": { + "end": 159, + "raw": "0.5", + "start": 156, + "type": "Literal", + "type": "Literal", + "value": 0.5 + }, + "start": 151, + "type": "VariableDeclarator" + }, + "end": 159, + "kind": "const", + "start": 151, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 168, + "id": { + "end": 162, + "name": "Fy", + "start": 160, + "type": "Identifier" + }, + "init": { + "end": 168, + "raw": "0.5", + "start": 165, + "type": "Literal", + "type": "Literal", + "value": 0.5 + }, + "start": 160, + "type": "VariableDeclarator" + }, + "end": 168, + "kind": "const", + "start": 160, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 803, + "id": { + "end": 179, + "name": "sketch001", + "start": 170, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 201, + "raw": "'-YZ'", + "start": 196, + "type": "Literal", + "type": "Literal", + "value": "-YZ" + } + ], + "callee": { + "end": 195, + "name": "startSketchOn", + "start": 182, + "type": "Identifier" + }, + "end": 202, + "start": 182, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 244, + "left": { + "end": 240, + "name": "back_walls_width", + "start": 224, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 244, + "raw": "2", + "start": 243, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 224, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 247, + "raw": "0", + "start": 246, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 248, + "start": 223, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 251, + "start": 250, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 222, + "name": "startProfileAt", + "start": 208, + "type": "Identifier" + }, + "end": 252, + "start": 208, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 282, + "left": { + "end": 278, + "name": "wall_thickness", + "start": 264, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 282, + "raw": "2", + "start": 281, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 264, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 285, + "start": 284, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 263, + "name": "xLine", + "start": 258, + "type": "Identifier" + }, + "end": 286, + "start": 258, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 343, + "properties": [ + { + "end": 318, + "key": { + "end": 313, + "name": "angle", + "start": 308, + "type": "Identifier" + }, + "start": 308, + "type": "ObjectProperty", + "value": { + "end": 318, + "raw": "45", + "start": 316, + "type": "Literal", + "type": "Literal", + "value": 45.0 + } + }, + { + "end": 341, + "key": { + "end": 322, + "name": "to", + "start": 320, + "type": "Identifier" + }, + "start": 320, + "type": "ObjectProperty", + "value": { + "end": 341, + "name": "back_walls_width", + "start": 325, + "type": "Identifier", + "type": "Identifier" + } + } + ], + "start": 306, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 346, + "start": 345, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 354, + "start": 348, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "seg01" + } + ], + "callee": { + "end": 305, + "name": "angledLineToX", + "start": 292, + "type": "Identifier" + }, + "end": 355, + "start": 292, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 375, + "name": "height", + "start": 369, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 378, + "start": 377, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 368, + "name": "yLineTo", + "start": 361, + "type": "Identifier" + }, + "end": 379, + "start": 361, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "argument": { + "end": 406, + "name": "wall_thickness", + "start": 392, + "type": "Identifier", + "type": "Identifier" + }, + "end": 406, + "operator": "-", + "start": 391, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 409, + "start": 408, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 390, + "name": "xLine", + "start": 385, + "type": "Identifier" + }, + "end": 410, + "start": 385, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "arguments": [ + { + "end": 437, + "name": "seg01", + "start": 432, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 431, + "name": "segEndY", + "start": 424, + "type": "Identifier" + }, + "end": 438, + "start": 424, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "end": 441, + "start": 440, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 423, + "name": "yLineTo", + "start": 416, + "type": "Identifier" + }, + "end": 442, + "start": 416, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 543, + "properties": [ + { + "end": 481, + "key": { + "end": 476, + "name": "angle", + "start": 471, + "type": "Identifier" + }, + "start": 471, + "type": "ObjectProperty", + "value": { + "end": 481, + "raw": "45", + "start": 479, + "type": "Literal", + "type": "Literal", + "value": 45.0 + } + }, + { + "end": 536, + "key": { + "end": 492, + "name": "to", + "start": 490, + "type": "Identifier" + }, + "start": 490, + "type": "ObjectProperty", + "value": { + "end": 536, + "left": { + "end": 515, + "left": { + "end": 511, + "name": "back_walls_width", + "start": 495, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 515, + "raw": "2", + "start": 514, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 495, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "end": 536, + "left": { + "end": 532, + "name": "wall_thickness", + "start": 518, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 536, + "raw": "2", + "start": 535, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 518, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 495, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + } + ], + "start": 462, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 546, + "start": 545, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 461, + "name": "angledLineToX", + "start": 448, + "type": "Identifier" + }, + "end": 547, + "start": 448, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "argument": { + "end": 574, + "name": "wall_thickness", + "start": 560, + "type": "Identifier", + "type": "Identifier" + }, + "end": 574, + "operator": "-", + "start": 559, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 577, + "start": 576, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 558, + "name": "xLine", + "start": 553, + "type": "Identifier" + }, + "end": 578, + "start": 553, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 658, + "properties": [ + { + "end": 623, + "key": { + "end": 612, + "name": "angle", + "start": 607, + "type": "Identifier" + }, + "start": 607, + "type": "ObjectProperty", + "value": { + "end": 623, + "left": { + "end": 618, + "raw": "180", + "start": 615, + "type": "Literal", + "type": "Literal", + "value": 180.0 + }, + "operator": "-", + "right": { + "end": 623, + "raw": "45", + "start": 621, + "type": "Literal", + "type": "Literal", + "value": 45.0 + }, + "start": 615, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "end": 651, + "key": { + "end": 634, + "name": "to", + "start": 632, + "type": "Identifier" + }, + "start": 632, + "type": "ObjectProperty", + "value": { + "end": 651, + "name": "wall_thickness", + "start": 637, + "type": "Identifier", + "type": "Identifier" + } + } + ], + "start": 598, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 661, + "start": 660, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 597, + "name": "angledLineToX", + "start": 584, + "type": "Identifier" + }, + "end": 662, + "start": 584, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 682, + "name": "height", + "start": 676, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 685, + "start": 684, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 675, + "name": "yLineTo", + "start": 668, + "type": "Identifier" + }, + "end": 686, + "start": 668, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 701, + "raw": "0", + "start": 700, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 704, + "start": 703, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 699, + "name": "xLineTo", + "start": 692, + "type": "Identifier" + }, + "end": 705, + "start": 692, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "arguments": [ + { + "end": 732, + "name": "seg01", + "start": 727, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 726, + "name": "segEndY", + "start": 719, + "type": "Identifier" + }, + "end": 733, + "start": 719, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "end": 736, + "start": 735, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 718, + "name": "yLineTo", + "start": 711, + "type": "Identifier" + }, + "end": 737, + "start": 711, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 785, + "properties": [ + { + "end": 775, + "key": { + "end": 764, + "name": "angle", + "start": 759, + "type": "Identifier" + }, + "start": 759, + "type": "ObjectProperty", + "value": { + "end": 775, + "left": { + "end": 770, + "raw": "180", + "start": 767, + "type": "Literal", + "type": "Literal", + "value": 180.0 + }, + "operator": "-", + "right": { + "end": 775, + "raw": "45", + "start": 773, + "type": "Literal", + "type": "Literal", + "value": 45.0 + }, + "start": 767, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "end": 783, + "key": { + "end": 779, + "name": "to", + "start": 777, + "type": "Identifier" + }, + "start": 777, + "type": "ObjectProperty", + "value": { + "end": 783, + "raw": "0", + "start": 782, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + } + ], + "start": 757, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 788, + "start": 787, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 756, + "name": "angledLineToY", + "start": 743, + "type": "Identifier" + }, + "end": 789, + "start": 743, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 802, + "start": 801, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 800, + "name": "close", + "start": 795, + "type": "Identifier" + }, + "end": 803, + "start": 795, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 803, + "start": 182, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 170, + "type": "VariableDeclarator" + }, + "end": 803, + "kind": "const", + "start": 170, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 952, + "id": { + "end": 811, + "name": "part001", + "start": 804, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 940, + "properties": [ + { + "end": 836, + "key": { + "end": 831, + "name": "angle", + "start": 826, + "type": "Identifier" + }, + "start": 826, + "type": "ObjectProperty", + "value": { + "end": 836, + "raw": "90", + "start": 834, + "type": "Literal", + "type": "Literal", + "value": 90.0 + } + }, + { + "end": 938, + "key": { + "end": 844, + "name": "axis", + "start": 840, + "type": "Identifier" + }, + "start": 840, + "type": "ObjectProperty", + "value": { + "end": 938, + "properties": [ + { + "end": 934, + "key": { + "end": 859, + "name": "custom", + "start": 853, + "type": "Identifier" + }, + "start": 853, + "type": "ObjectProperty", + "value": { + "end": 934, + "properties": [ + { + "end": 887, + "key": { + "end": 874, + "name": "axis", + "start": 870, + "type": "Identifier" + }, + "start": 870, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 881, + "raw": "1.0", + "start": 878, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 886, + "raw": "0.0", + "start": 883, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 887, + "start": 877, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "end": 928, + "key": { + "end": 901, + "name": "origin", + "start": 895, + "type": "Identifier" + }, + "start": 895, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 908, + "raw": "0.0", + "start": 905, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 927, + "left": { + "end": 916, + "name": "height", + "start": 910, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 927, + "raw": ".0000001", + "start": 919, + "type": "Literal", + "type": "Literal", + "value": 0.0000001 + }, + "start": 910, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 928, + "start": 904, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "start": 862, + "type": "ObjectExpression", + "type": "ObjectExpression" + } + } + ], + "start": 847, + "type": "ObjectExpression", + "type": "ObjectExpression" + } + } + ], + "start": 822, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 951, + "name": "sketch001", + "start": 942, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 821, + "name": "revolve", + "start": 814, + "type": "Identifier" + }, + "end": 952, + "start": 814, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 804, + "type": "VariableDeclarator" + }, + "end": 952, + "kind": "const", + "start": 804, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 1625, + "id": { + "end": 963, + "name": "sketch002", + "start": 954, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 985, + "raw": "'-YZ'", + "start": 980, + "type": "Literal", + "type": "Literal", + "value": "-YZ" + } + ], + "callee": { + "end": 979, + "name": "startSketchOn", + "start": 966, + "type": "Identifier" + }, + "end": 986, + "start": 966, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1028, + "left": { + "end": 1024, + "name": "back_walls_width", + "start": 1008, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 1028, + "raw": "2", + "start": 1027, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 1008, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 1031, + "raw": "0", + "start": 1030, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 1032, + "start": 1007, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1035, + "start": 1034, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1006, + "name": "startProfileAt", + "start": 992, + "type": "Identifier" + }, + "end": 1036, + "start": 992, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1066, + "left": { + "end": 1062, + "name": "wall_thickness", + "start": 1048, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 1066, + "raw": "2", + "start": 1065, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 1048, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 1069, + "start": 1068, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1047, + "name": "xLine", + "start": 1042, + "type": "Identifier" + }, + "end": 1070, + "start": 1042, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1127, + "properties": [ + { + "end": 1102, + "key": { + "end": 1097, + "name": "angle", + "start": 1092, + "type": "Identifier" + }, + "start": 1092, + "type": "ObjectProperty", + "value": { + "end": 1102, + "raw": "45", + "start": 1100, + "type": "Literal", + "type": "Literal", + "value": 45.0 + } + }, + { + "end": 1125, + "key": { + "end": 1106, + "name": "to", + "start": 1104, + "type": "Identifier" + }, + "start": 1104, + "type": "ObjectProperty", + "value": { + "end": 1125, + "name": "back_walls_width", + "start": 1109, + "type": "Identifier", + "type": "Identifier" + } + } + ], + "start": 1090, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 1130, + "start": 1129, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 1138, + "start": 1132, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "seg02" + } + ], + "callee": { + "end": 1089, + "name": "angledLineToX", + "start": 1076, + "type": "Identifier" + }, + "end": 1139, + "start": 1076, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1159, + "name": "height", + "start": 1153, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 1162, + "start": 1161, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1152, + "name": "yLineTo", + "start": 1145, + "type": "Identifier" + }, + "end": 1163, + "start": 1145, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "argument": { + "end": 1190, + "name": "wall_thickness", + "start": 1176, + "type": "Identifier", + "type": "Identifier" + }, + "end": 1190, + "operator": "-", + "start": 1175, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 1193, + "start": 1192, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1174, + "name": "xLine", + "start": 1169, + "type": "Identifier" + }, + "end": 1194, + "start": 1169, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "arguments": [ + { + "end": 1221, + "name": "seg01", + "start": 1216, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 1215, + "name": "segEndY", + "start": 1208, + "type": "Identifier" + }, + "end": 1222, + "start": 1208, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "end": 1225, + "start": 1224, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1207, + "name": "yLineTo", + "start": 1200, + "type": "Identifier" + }, + "end": 1226, + "start": 1200, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1327, + "properties": [ + { + "end": 1265, + "key": { + "end": 1260, + "name": "angle", + "start": 1255, + "type": "Identifier" + }, + "start": 1255, + "type": "ObjectProperty", + "value": { + "end": 1265, + "raw": "45", + "start": 1263, + "type": "Literal", + "type": "Literal", + "value": 45.0 + } + }, + { + "end": 1320, + "key": { + "end": 1276, + "name": "to", + "start": 1274, + "type": "Identifier" + }, + "start": 1274, + "type": "ObjectProperty", + "value": { + "end": 1320, + "left": { + "end": 1299, + "left": { + "end": 1295, + "name": "back_walls_width", + "start": 1279, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 1299, + "raw": "2", + "start": 1298, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 1279, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "end": 1320, + "left": { + "end": 1316, + "name": "wall_thickness", + "start": 1302, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "/", + "right": { + "end": 1320, + "raw": "2", + "start": 1319, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 1302, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 1279, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + } + ], + "start": 1246, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 1330, + "start": 1329, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1245, + "name": "angledLineToX", + "start": 1232, + "type": "Identifier" + }, + "end": 1331, + "start": 1232, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "argument": { + "end": 1358, + "name": "wall_thickness", + "start": 1344, + "type": "Identifier", + "type": "Identifier" + }, + "end": 1358, + "operator": "-", + "start": 1343, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 1361, + "start": 1360, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1342, + "name": "xLine", + "start": 1337, + "type": "Identifier" + }, + "end": 1362, + "start": 1337, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1442, + "properties": [ + { + "end": 1407, + "key": { + "end": 1396, + "name": "angle", + "start": 1391, + "type": "Identifier" + }, + "start": 1391, + "type": "ObjectProperty", + "value": { + "end": 1407, + "left": { + "end": 1402, + "raw": "180", + "start": 1399, + "type": "Literal", + "type": "Literal", + "value": 180.0 + }, + "operator": "-", + "right": { + "end": 1407, + "raw": "45", + "start": 1405, + "type": "Literal", + "type": "Literal", + "value": 45.0 + }, + "start": 1399, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "end": 1435, + "key": { + "end": 1418, + "name": "to", + "start": 1416, + "type": "Identifier" + }, + "start": 1416, + "type": "ObjectProperty", + "value": { + "end": 1435, + "name": "wall_thickness", + "start": 1421, + "type": "Identifier", + "type": "Identifier" + } + } + ], + "start": 1382, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 1445, + "start": 1444, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1381, + "name": "angledLineToX", + "start": 1368, + "type": "Identifier" + }, + "end": 1446, + "start": 1368, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1466, + "name": "height", + "start": 1460, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 1469, + "start": 1468, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1459, + "name": "yLineTo", + "start": 1452, + "type": "Identifier" + }, + "end": 1470, + "start": 1452, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1485, + "raw": "0", + "start": 1484, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 1488, + "start": 1487, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1483, + "name": "xLineTo", + "start": 1476, + "type": "Identifier" + }, + "end": 1489, + "start": 1476, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "arguments": [ + { + "end": 1516, + "name": "seg02", + "start": 1511, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 1510, + "name": "segEndY", + "start": 1503, + "type": "Identifier" + }, + "end": 1517, + "start": 1503, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "end": 1520, + "start": 1519, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1502, + "name": "yLineTo", + "start": 1495, + "type": "Identifier" + }, + "end": 1521, + "start": 1495, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1569, + "properties": [ + { + "end": 1559, + "key": { + "end": 1548, + "name": "angle", + "start": 1543, + "type": "Identifier" + }, + "start": 1543, + "type": "ObjectProperty", + "value": { + "end": 1559, + "left": { + "end": 1554, + "raw": "180", + "start": 1551, + "type": "Literal", + "type": "Literal", + "value": 180.0 + }, + "operator": "-", + "right": { + "end": 1559, + "raw": "45", + "start": 1557, + "type": "Literal", + "type": "Literal", + "value": 45.0 + }, + "start": 1551, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "end": 1567, + "key": { + "end": 1563, + "name": "to", + "start": 1561, + "type": "Identifier" + }, + "start": 1561, + "type": "ObjectProperty", + "value": { + "end": 1567, + "raw": "0", + "start": 1566, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + } + ], + "start": 1541, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 1572, + "start": 1571, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1540, + "name": "angledLineToY", + "start": 1527, + "type": "Identifier" + }, + "end": 1573, + "start": 1527, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1586, + "start": 1585, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1584, + "name": "close", + "start": 1579, + "type": "Identifier" + }, + "end": 1587, + "start": 1579, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1621, + "left": { + "end": 1612, + "name": "back_length", + "start": 1601, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "-", + "right": { + "end": 1621, + "name": "height", + "start": 1615, + "type": "Identifier", + "type": "Identifier" + }, + "start": 1601, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 1624, + "start": 1623, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1600, + "name": "extrude", + "start": 1593, + "type": "Identifier" + }, + "end": 1625, + "start": 1593, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 1625, + "start": 966, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 954, + "type": "VariableDeclarator" + }, + "end": 1625, + "kind": "const", + "start": 954, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 1626, + "nonCodeMeta": { + "nonCodeNodes": { + "9": [ + { + "end": 170, + "start": 168, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "11": [ + { + "end": 954, + "start": 952, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/poop_chute/input.kcl b/src/wasm-lib/kcl/tests/poop_chute/input.kcl new file mode 100644 index 000000000..01f00212c --- /dev/null +++ b/src/wasm-lib/kcl/tests/poop_chute/input.kcl @@ -0,0 +1,64 @@ +wall_thickness = 0.125 +back_walls_width = 2 +front_walls_width = 2.5 +height = 5.5 +filletRadius = 0.050 +back_length = 7 +exit_height = 1 +front_length = 6 +Fx = 0.5 +Fy = 0.5 + +sketch001 = startSketchOn('-YZ') + |> startProfileAt([back_walls_width / 2, 0], %) + |> xLine(wall_thickness / 2, %) + |> angledLineToX({ angle = 45, to = back_walls_width }, %, $seg01) + |> yLineTo(height, %) + |> xLine(-wall_thickness, %) + |> yLineTo(segEndY(seg01), %) + |> angledLineToX({ + angle = 45, + to = back_walls_width / 2 + wall_thickness / 2 + }, %) + |> xLine(-wall_thickness, %) + |> angledLineToX({ + angle = 180 - 45, + to = wall_thickness + }, %) + |> yLineTo(height, %) + |> xLineTo(0, %) + |> yLineTo(segEndY(seg01), %) + |> angledLineToY({ angle = 180 - 45, to = 0 }, %) + |> close(%) +part001 = revolve({ + angle = 90, + axis = { + custom = { + axis = [1.0, 0.0], + origin = [0.0, height + .0000001] + } + } +}, sketch001) + +sketch002 = startSketchOn('-YZ') + |> startProfileAt([back_walls_width / 2, 0], %) + |> xLine(wall_thickness / 2, %) + |> angledLineToX({ angle = 45, to = back_walls_width }, %, $seg02) + |> yLineTo(height, %) + |> xLine(-wall_thickness, %) + |> yLineTo(segEndY(seg01), %) + |> angledLineToX({ + angle = 45, + to = back_walls_width / 2 + wall_thickness / 2 + }, %) + |> xLine(-wall_thickness, %) + |> angledLineToX({ + angle = 180 - 45, + to = wall_thickness + }, %) + |> yLineTo(height, %) + |> xLineTo(0, %) + |> yLineTo(segEndY(seg02), %) + |> angledLineToY({ angle = 180 - 45, to = 0 }, %) + |> close(%) + |> extrude(back_length - height, %) diff --git a/src/wasm-lib/kcl/tests/poop_chute/ops.snap b/src/wasm-lib/kcl/tests/poop_chute/ops.snap new file mode 100644 index 000000000..79da91ea9 --- /dev/null +++ b/src/wasm-lib/kcl/tests/poop_chute/ops.snap @@ -0,0 +1,97 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed poop_chute.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 196, + 201, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 182, + 202, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 822, + 940, + 0 + ] + }, + "sketch": { + "sourceRange": [ + 942, + 951, + 0 + ] + } + }, + "name": "revolve", + "sourceRange": [ + 814, + 952, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 980, + 985, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 966, + 986, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 1601, + 1621, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 1623, + 1624, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 1593, + 1625, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/poop_chute/program_memory.snap b/src/wasm-lib/kcl/tests/poop_chute/program_memory.snap new file mode 100644 index 000000000..74379e4ab --- /dev/null +++ b/src/wasm-lib/kcl/tests/poop_chute/program_memory.snap @@ -0,0 +1,1782 @@ +--- +source: kcl/src/simulation_tests.rs +assertion_line: 92 +description: Program memory after executing poop_chute.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "Fx": { + "type": "Number", + "value": 0.5, + "__meta": [ + { + "sourceRange": [ + 156, + 159, + 0 + ] + } + ] + }, + "Fy": { + "type": "Number", + "value": 0.5, + "__meta": [ + { + "sourceRange": [ + 165, + 168, + 0 + ] + } + ] + }, + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "back_length": { + "type": "Number", + "value": 7.0, + "__meta": [ + { + "sourceRange": [ + 116, + 117, + 0 + ] + } + ] + }, + "back_walls_width": { + "type": "Number", + "value": 2.0, + "__meta": [ + { + "sourceRange": [ + 42, + 43, + 0 + ] + } + ] + }, + "exit_height": { + "type": "Number", + "value": 1.0, + "__meta": [ + { + "sourceRange": [ + 132, + 133, + 0 + ] + } + ] + }, + "filletRadius": { + "type": "Number", + "value": 0.05, + "__meta": [ + { + "sourceRange": [ + 96, + 101, + 0 + ] + } + ] + }, + "front_length": { + "type": "Number", + "value": 6.0, + "__meta": [ + { + "sourceRange": [ + 149, + 150, + 0 + ] + } + ] + }, + "front_walls_width": { + "type": "Number", + "value": 2.5, + "__meta": [ + { + "sourceRange": [ + 64, + 67, + 0 + ] + } + ] + }, + "height": { + "type": "Number", + "value": 5.5, + "__meta": [ + { + "sourceRange": [ + 77, + 80, + 0 + ] + } + ] + }, + "part001": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 258, + 286, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 292, + 355, + 0 + ], + "tag": { + "end": 354, + "start": 348, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 361, + 379, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 385, + 410, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 416, + 442, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 448, + 547, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 553, + 578, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 584, + 662, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 668, + 686, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 692, + 705, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 711, + 737, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 743, + 789, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 795, + 803, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 258, + 286, + 0 + ] + }, + "from": [ + 1.0, + 0.0 + ], + "tag": null, + "to": [ + 1.0625, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 292, + 355, + 0 + ] + }, + "from": [ + 1.0625, + 0.0 + ], + "tag": { + "end": 354, + "start": 348, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 2.0, + 0.9375 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 361, + 379, + 0 + ] + }, + "from": [ + 2.0, + 0.9375 + ], + "tag": null, + "to": [ + 2.0, + 5.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 385, + 410, + 0 + ] + }, + "from": [ + 2.0, + 5.5 + ], + "tag": null, + "to": [ + 1.875, + 5.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 416, + 442, + 0 + ] + }, + "from": [ + 1.875, + 5.5 + ], + "tag": null, + "to": [ + 1.875, + 0.9375 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 448, + 547, + 0 + ] + }, + "from": [ + 1.875, + 0.9375 + ], + "tag": null, + "to": [ + 1.0625, + 0.125 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 553, + 578, + 0 + ] + }, + "from": [ + 1.0625, + 0.125 + ], + "tag": null, + "to": [ + 0.9375, + 0.125 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 584, + 662, + 0 + ] + }, + "from": [ + 0.9375, + 0.125 + ], + "tag": null, + "to": [ + 0.125, + 0.9375 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 668, + 686, + 0 + ] + }, + "from": [ + 0.125, + 0.9375 + ], + "tag": null, + "to": [ + 0.125, + 5.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 692, + 705, + 0 + ] + }, + "from": [ + 0.125, + 5.5 + ], + "tag": null, + "to": [ + 0.0, + 5.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 711, + 737, + 0 + ] + }, + "from": [ + 0.0, + 5.5 + ], + "tag": null, + "to": [ + 0.0, + 0.9375 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 743, + 789, + 0 + ] + }, + "from": [ + 0.0, + 0.9375 + ], + "tag": null, + "to": [ + 0.9375, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 795, + 803, + 0 + ] + }, + "from": [ + 0.9375, + 0.0 + ], + "tag": null, + "to": [ + 1.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "YZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": -1.0, + "y": 0.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 1.0, + 0.0 + ], + "to": [ + 1.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 208, + 252, + 0 + ] + } + }, + "tags": { + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 292, + 355, + 0 + ] + }, + "from": [ + 1.0625, + 0.0 + ], + "tag": { + "end": 354, + "start": 348, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 2.0, + 0.9374999999999999 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 292, + 355, + 0 + ], + "tag": { + "end": 354, + "start": 348, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 348, + 354, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 208, + 252, + 0 + ] + } + ] + }, + "height": 0.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 208, + 252, + 0 + ] + } + ] + }, + "seg01": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 292, + 355, + 0 + ] + }, + "from": [ + 1.0625, + 0.0 + ], + "tag": { + "end": 354, + "start": 348, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 2.0, + 0.9374999999999999 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 292, + 355, + 0 + ], + "tag": { + "end": 354, + "start": 348, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 348, + 354, + 0 + ] + } + ] + }, + "seg02": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "seg02", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1076, + 1139, + 0 + ] + }, + "from": [ + 1.0625, + 0.0 + ], + "tag": { + "end": 1138, + "start": 1132, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 2.0, + 0.9374999999999999 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1076, + 1139, + 0 + ], + "tag": { + "end": 1138, + "start": 1132, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1132, + 1138, + 0 + ] + } + ] + }, + "sketch001": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 258, + 286, + 0 + ] + }, + "from": [ + 1.0, + 0.0 + ], + "tag": null, + "to": [ + 1.0625, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 292, + 355, + 0 + ] + }, + "from": [ + 1.0625, + 0.0 + ], + "tag": { + "end": 354, + "start": 348, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 2.0, + 0.9375 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 361, + 379, + 0 + ] + }, + "from": [ + 2.0, + 0.9375 + ], + "tag": null, + "to": [ + 2.0, + 5.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 385, + 410, + 0 + ] + }, + "from": [ + 2.0, + 5.5 + ], + "tag": null, + "to": [ + 1.875, + 5.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 416, + 442, + 0 + ] + }, + "from": [ + 1.875, + 5.5 + ], + "tag": null, + "to": [ + 1.875, + 0.9375 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 448, + 547, + 0 + ] + }, + "from": [ + 1.875, + 0.9375 + ], + "tag": null, + "to": [ + 1.0625, + 0.125 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 553, + 578, + 0 + ] + }, + "from": [ + 1.0625, + 0.125 + ], + "tag": null, + "to": [ + 0.9375, + 0.125 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 584, + 662, + 0 + ] + }, + "from": [ + 0.9375, + 0.125 + ], + "tag": null, + "to": [ + 0.125, + 0.9375 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 668, + 686, + 0 + ] + }, + "from": [ + 0.125, + 0.9375 + ], + "tag": null, + "to": [ + 0.125, + 5.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 692, + 705, + 0 + ] + }, + "from": [ + 0.125, + 5.5 + ], + "tag": null, + "to": [ + 0.0, + 5.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 711, + 737, + 0 + ] + }, + "from": [ + 0.0, + 5.5 + ], + "tag": null, + "to": [ + 0.0, + 0.9375 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 743, + 789, + 0 + ] + }, + "from": [ + 0.0, + 0.9375 + ], + "tag": null, + "to": [ + 0.9375, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 795, + 803, + 0 + ] + }, + "from": [ + 0.9375, + 0.0 + ], + "tag": null, + "to": [ + 1.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "YZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": -1.0, + "y": 0.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 1.0, + 0.0 + ], + "to": [ + 1.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 208, + 252, + 0 + ] + } + }, + "tags": { + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 292, + 355, + 0 + ] + }, + "from": [ + 1.0625, + 0.0 + ], + "tag": { + "end": 354, + "start": 348, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 2.0, + 0.9374999999999999 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 292, + 355, + 0 + ], + "tag": { + "end": 354, + "start": 348, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 348, + 354, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 208, + 252, + 0 + ] + } + ] + } + }, + "sketch002": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1042, + 1070, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1076, + 1139, + 0 + ], + "tag": { + "end": 1138, + "start": 1132, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1145, + 1163, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1169, + 1194, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1200, + 1226, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1232, + 1331, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1337, + 1362, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1368, + 1446, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1452, + 1470, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1476, + 1489, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1495, + 1521, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1527, + 1573, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1579, + 1587, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1042, + 1070, + 0 + ] + }, + "from": [ + 1.0, + 0.0 + ], + "tag": null, + "to": [ + 1.0625, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1076, + 1139, + 0 + ] + }, + "from": [ + 1.0625, + 0.0 + ], + "tag": { + "end": 1138, + "start": 1132, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 2.0, + 0.9375 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1145, + 1163, + 0 + ] + }, + "from": [ + 2.0, + 0.9375 + ], + "tag": null, + "to": [ + 2.0, + 5.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1169, + 1194, + 0 + ] + }, + "from": [ + 2.0, + 5.5 + ], + "tag": null, + "to": [ + 1.875, + 5.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1200, + 1226, + 0 + ] + }, + "from": [ + 1.875, + 5.5 + ], + "tag": null, + "to": [ + 1.875, + 0.9375 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1232, + 1331, + 0 + ] + }, + "from": [ + 1.875, + 0.9375 + ], + "tag": null, + "to": [ + 1.0625, + 0.125 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1337, + 1362, + 0 + ] + }, + "from": [ + 1.0625, + 0.125 + ], + "tag": null, + "to": [ + 0.9375, + 0.125 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1368, + 1446, + 0 + ] + }, + "from": [ + 0.9375, + 0.125 + ], + "tag": null, + "to": [ + 0.125, + 0.9375 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1452, + 1470, + 0 + ] + }, + "from": [ + 0.125, + 0.9375 + ], + "tag": null, + "to": [ + 0.125, + 5.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1476, + 1489, + 0 + ] + }, + "from": [ + 0.125, + 5.5 + ], + "tag": null, + "to": [ + 0.0, + 5.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1495, + 1521, + 0 + ] + }, + "from": [ + 0.0, + 5.5 + ], + "tag": null, + "to": [ + 0.0, + 0.9375 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1527, + 1573, + 0 + ] + }, + "from": [ + 0.0, + 0.9375 + ], + "tag": null, + "to": [ + 0.9375, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1579, + 1587, + 0 + ] + }, + "from": [ + 0.9375, + 0.0 + ], + "tag": null, + "to": [ + 1.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "YZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": -1.0, + "y": 0.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 1.0, + 0.0 + ], + "to": [ + 1.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 992, + 1036, + 0 + ] + } + }, + "tags": { + "seg02": { + "type": "TagIdentifier", + "value": "seg02", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1076, + 1139, + 0 + ] + }, + "from": [ + 1.0625, + 0.0 + ], + "tag": { + "end": 1138, + "start": 1132, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 2.0, + 0.9374999999999999 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1076, + 1139, + 0 + ], + "tag": { + "end": 1138, + "start": 1132, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1132, + 1138, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 992, + 1036, + 0 + ] + } + ] + }, + "height": 1.5, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 992, + 1036, + 0 + ] + } + ] + }, + "wall_thickness": { + "type": "Number", + "value": 0.125, + "__meta": [ + { + "sourceRange": [ + 17, + 22, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/poop_chute/rendered_model.png b/src/wasm-lib/kcl/tests/poop_chute/rendered_model.png new file mode 100644 index 000000000..63f3ec192 Binary files /dev/null and b/src/wasm-lib/kcl/tests/poop_chute/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/property_of_object/ast.snap b/src/wasm-lib/kcl/tests/property_of_object/ast.snap new file mode 100644 index 000000000..6ae23ec98 --- /dev/null +++ b/src/wasm-lib/kcl/tests/property_of_object/ast.snap @@ -0,0 +1,840 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing property_of_object.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 76, + "id": { + "end": 53, + "name": "obj", + "start": 50, + "type": "Identifier" + }, + "init": { + "end": 76, + "properties": [ + { + "end": 65, + "key": { + "end": 61, + "name": "foo", + "start": 58, + "type": "Identifier" + }, + "start": 58, + "type": "ObjectProperty", + "value": { + "end": 65, + "raw": "1", + "start": 64, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + }, + { + "end": 74, + "key": { + "end": 70, + "name": "bar", + "start": 67, + "type": "Identifier" + }, + "start": 67, + "type": "ObjectProperty", + "value": { + "end": 74, + "raw": "0", + "start": 73, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + } + ], + "start": 56, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 50, + "type": "VariableDeclarator" + }, + "end": 76, + "kind": "const", + "start": 50, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 134, + "id": { + "end": 121, + "name": "one_a", + "start": 116, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 134, + "object": { + "end": 127, + "name": "obj", + "start": 124, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 133, + "raw": "\"foo\"", + "start": 128, + "type": "Literal", + "type": "Literal", + "value": "foo" + }, + "start": 124, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 116, + "type": "VariableDeclarator" + }, + "end": 134, + "kind": "const", + "start": 116, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 191, + "expression": { + "arguments": [ + { + "end": 160, + "name": "one_a", + "start": 155, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 163, + "raw": "1", + "start": 162, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 190, + "raw": "\"Literal property lookup\"", + "start": 165, + "type": "Literal", + "type": "Literal", + "value": "Literal property lookup" + } + ], + "callee": { + "end": 154, + "name": "assertLessThanOrEq", + "start": 136, + "type": "Identifier" + }, + "end": 191, + "start": 136, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 136, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 250, + "expression": { + "arguments": [ + { + "end": 219, + "name": "one_a", + "start": 214, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 222, + "raw": "1", + "start": 221, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 249, + "raw": "\"Literal property lookup\"", + "start": 224, + "type": "Literal", + "type": "Literal", + "value": "Literal property lookup" + } + ], + "callee": { + "end": 213, + "name": "assertGreaterThanOrEq", + "start": 192, + "type": "Identifier" + }, + "end": 250, + "start": 192, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 192, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "declaration": { + "end": 349, + "id": { + "end": 341, + "name": "p", + "start": 340, + "type": "Identifier" + }, + "init": { + "end": 349, + "raw": "\"foo\"", + "start": 344, + "type": "Literal", + "type": "Literal", + "value": "foo" + }, + "start": 340, + "type": "VariableDeclarator" + }, + "end": 349, + "kind": "const", + "start": 340, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 364, + "id": { + "end": 355, + "name": "one_b", + "start": 350, + "type": "Identifier" + }, + "init": { + "computed": true, + "end": 364, + "object": { + "end": 361, + "name": "obj", + "start": 358, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 363, + "name": "p", + "start": 362, + "type": "Identifier", + "type": "Identifier" + }, + "start": 358, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 350, + "type": "VariableDeclarator" + }, + "end": 364, + "kind": "const", + "start": 350, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 422, + "expression": { + "arguments": [ + { + "end": 390, + "name": "one_b", + "start": 385, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 393, + "raw": "1", + "start": 392, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 421, + "raw": "\"Computed property lookup\"", + "start": 395, + "type": "Literal", + "type": "Literal", + "value": "Computed property lookup" + } + ], + "callee": { + "end": 384, + "name": "assertLessThanOrEq", + "start": 366, + "type": "Identifier" + }, + "end": 422, + "start": 366, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 366, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 482, + "expression": { + "arguments": [ + { + "end": 450, + "name": "one_b", + "start": 445, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 453, + "raw": "1", + "start": 452, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 481, + "raw": "\"Computed property lookup\"", + "start": 455, + "type": "Literal", + "type": "Literal", + "value": "Computed property lookup" + } + ], + "callee": { + "end": 444, + "name": "assertGreaterThanOrEq", + "start": 423, + "type": "Identifier" + }, + "end": 482, + "start": 423, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 423, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "declaration": { + "end": 546, + "id": { + "end": 528, + "name": "obj2", + "start": 524, + "type": "Identifier" + }, + "init": { + "end": 546, + "properties": [ + { + "end": 544, + "key": { + "end": 538, + "name": "inner", + "start": 533, + "type": "Identifier" + }, + "start": 533, + "type": "ObjectProperty", + "value": { + "end": 544, + "name": "obj", + "start": 541, + "type": "Identifier", + "type": "Identifier" + } + } + ], + "start": 531, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 524, + "type": "VariableDeclarator" + }, + "end": 546, + "kind": "const", + "start": 524, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 573, + "id": { + "end": 553, + "name": "one_c", + "start": 548, + "type": "Identifier" + }, + "init": { + "computed": false, + "end": 573, + "object": { + "computed": false, + "end": 566, + "object": { + "end": 560, + "name": "obj2", + "start": 556, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 566, + "name": "inner", + "start": 561, + "type": "Identifier", + "type": "Identifier" + }, + "start": 556, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "property": { + "end": 572, + "raw": "\"foo\"", + "start": 567, + "type": "Literal", + "type": "Literal", + "value": "foo" + }, + "start": 556, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 548, + "type": "VariableDeclarator" + }, + "end": 573, + "kind": "const", + "start": 548, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 630, + "expression": { + "arguments": [ + { + "end": 599, + "name": "one_c", + "start": 594, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 602, + "raw": "1", + "start": 601, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 629, + "raw": "\"Literal property lookup\"", + "start": 604, + "type": "Literal", + "type": "Literal", + "value": "Literal property lookup" + } + ], + "callee": { + "end": 593, + "name": "assertLessThanOrEq", + "start": 575, + "type": "Identifier" + }, + "end": 630, + "start": 575, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 575, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 689, + "expression": { + "arguments": [ + { + "end": 658, + "name": "one_c", + "start": 653, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 661, + "raw": "1", + "start": 660, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 688, + "raw": "\"Literal property lookup\"", + "start": 663, + "type": "Literal", + "type": "Literal", + "value": "Literal property lookup" + } + ], + "callee": { + "end": 652, + "name": "assertGreaterThanOrEq", + "start": 631, + "type": "Identifier" + }, + "end": 689, + "start": 631, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 631, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "declaration": { + "end": 773, + "id": { + "end": 757, + "name": "one_d", + "start": 752, + "type": "Identifier" + }, + "init": { + "computed": true, + "end": 773, + "object": { + "computed": false, + "end": 770, + "object": { + "end": 764, + "name": "obj2", + "start": 760, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 770, + "name": "inner", + "start": 765, + "type": "Identifier", + "type": "Identifier" + }, + "start": 760, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "property": { + "end": 772, + "name": "p", + "start": 771, + "type": "Identifier", + "type": "Identifier" + }, + "start": 760, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 752, + "type": "VariableDeclarator" + }, + "end": 773, + "kind": "const", + "start": 752, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 831, + "expression": { + "arguments": [ + { + "end": 799, + "name": "one_d", + "start": 794, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 802, + "raw": "1", + "start": 801, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 830, + "raw": "\"Computed property lookup\"", + "start": 804, + "type": "Literal", + "type": "Literal", + "value": "Computed property lookup" + } + ], + "callee": { + "end": 793, + "name": "assertLessThanOrEq", + "start": 775, + "type": "Identifier" + }, + "end": 831, + "start": 775, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 775, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "end": 891, + "expression": { + "arguments": [ + { + "end": 859, + "name": "one_d", + "start": 854, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 862, + "raw": "1", + "start": 861, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 890, + "raw": "\"Computed property lookup\"", + "start": 864, + "type": "Literal", + "type": "Literal", + "value": "Computed property lookup" + } + ], + "callee": { + "end": 853, + "name": "assertGreaterThanOrEq", + "start": 832, + "type": "Identifier" + }, + "end": 891, + "start": 832, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 832, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 892, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 113, + "start": 76, + "type": "NonCodeNode", + "value": { + "type": "newLineBlockComment", + "value": "Test: the property is a literal.", + "style": "line" + } + }, + { + "end": 116, + "start": 113, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "1": [ + { + "end": 136, + "start": 134, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "3": [ + { + "end": 288, + "start": 250, + "type": "NonCodeNode", + "value": { + "type": "newLineBlockComment", + "value": "Test: the property is a variable,", + "style": "line" + } + }, + { + "end": 337, + "start": 289, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "which must be evaluated before looking it up.", + "style": "line" + } + }, + { + "end": 340, + "start": 337, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "5": [ + { + "end": 366, + "start": 364, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "7": [ + { + "end": 521, + "start": 482, + "type": "NonCodeNode", + "value": { + "type": "newLineBlockComment", + "value": "Test: multiple literal properties.", + "style": "line" + } + }, + { + "end": 524, + "start": 521, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "8": [ + { + "end": 548, + "start": 546, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "9": [ + { + "end": 575, + "start": 573, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "11": [ + { + "end": 749, + "start": 689, + "type": "NonCodeNode", + "value": { + "type": "newLineBlockComment", + "value": "Test: multiple properties, mix of literal and computed.", + "style": "line" + } + }, + { + "end": 752, + "start": 749, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "12": [ + { + "end": 775, + "start": 773, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [ + { + "end": 47, + "start": 0, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "This tests evaluating properties of objects.", + "style": "line" + } + }, + { + "end": 50, + "start": 47, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/tests/executor/inputs/no_visuals/property_of_object.kcl b/src/wasm-lib/kcl/tests/property_of_object/input.kcl similarity index 54% rename from src/wasm-lib/tests/executor/inputs/no_visuals/property_of_object.kcl rename to src/wasm-lib/kcl/tests/property_of_object/input.kcl index 70867e84d..9e23c2b3f 100644 --- a/src/wasm-lib/tests/executor/inputs/no_visuals/property_of_object.kcl +++ b/src/wasm-lib/kcl/tests/property_of_object/input.kcl @@ -1,40 +1,40 @@ // This tests evaluating properties of objects. -const obj = { - foo: 1, - bar: 0, -} + +obj = { foo = 1, bar = 0 } // Test: the property is a literal. -const one_a = obj["foo"] -assertLessThanOrEq(one_a, 1, "Literal property lookup") +one_a = obj["foo"] + +assertLessThanOrEq(one_a, 1, "Literal property lookup") assertGreaterThanOrEq(one_a, 1, "Literal property lookup") // Test: the property is a variable, // which must be evaluated before looking it up. -const p = "foo" -const one_b = obj[p] -assertLessThanOrEq(one_b, 1, "Computed property lookup") +p = "foo" +one_b = obj[p] + +assertLessThanOrEq(one_b, 1, "Computed property lookup") assertGreaterThanOrEq(one_b, 1, "Computed property lookup") // Test: multiple literal properties. -const obj2 = { - inner: obj, -} -const one_c = obj2.inner["foo"] +obj2 = { inner = obj } -assertLessThanOrEq(one_c, 1, "Literal property lookup") +one_c = obj2.inner["foo"] + +assertLessThanOrEq(one_c, 1, "Literal property lookup") assertGreaterThanOrEq(one_c, 1, "Literal property lookup") // Test: multiple properties, mix of literal and computed. -const one_d = obj2.inner[p] -assertLessThanOrEq(one_d, 1, "Computed property lookup") +one_d = obj2.inner[p] + +assertLessThanOrEq(one_d, 1, "Computed property lookup") assertGreaterThanOrEq(one_d, 1, "Computed property lookup") diff --git a/src/wasm-lib/kcl/tests/property_of_object/ops.snap b/src/wasm-lib/kcl/tests/property_of_object/ops.snap new file mode 100644 index 000000000..d149fd443 --- /dev/null +++ b/src/wasm-lib/kcl/tests/property_of_object/ops.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed property_of_object.kcl +snapshot_kind: text +--- +[] diff --git a/src/wasm-lib/kcl/tests/property_of_object/program_memory.snap b/src/wasm-lib/kcl/tests/property_of_object/program_memory.snap new file mode 100644 index 000000000..61226925b --- /dev/null +++ b/src/wasm-lib/kcl/tests/property_of_object/program_memory.snap @@ -0,0 +1,196 @@ +--- +source: kcl/src/simulation_tests.rs +assertion_line: 92 +description: Program memory after executing property_of_object.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "obj": { + "type": "Object", + "value": { + "bar": { + "type": "Number", + "value": 0.0, + "__meta": [ + { + "sourceRange": [ + 73, + 74, + 0 + ] + } + ] + }, + "foo": { + "type": "Number", + "value": 1.0, + "__meta": [ + { + "sourceRange": [ + 64, + 65, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 56, + 76, + 0 + ] + } + ] + }, + "obj2": { + "type": "Object", + "value": { + "inner": { + "type": "Object", + "value": { + "bar": { + "type": "Number", + "value": 0.0, + "__meta": [ + { + "sourceRange": [ + 73, + 74, + 0 + ] + } + ] + }, + "foo": { + "type": "Number", + "value": 1.0, + "__meta": [ + { + "sourceRange": [ + 64, + 65, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 56, + 76, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 531, + 546, + 0 + ] + } + ] + }, + "one_a": { + "type": "Number", + "value": 1.0, + "__meta": [ + { + "sourceRange": [ + 64, + 65, + 0 + ] + } + ] + }, + "one_b": { + "type": "Number", + "value": 1.0, + "__meta": [ + { + "sourceRange": [ + 64, + 65, + 0 + ] + } + ] + }, + "one_c": { + "type": "Number", + "value": 1.0, + "__meta": [ + { + "sourceRange": [ + 64, + 65, + 0 + ] + } + ] + }, + "one_d": { + "type": "Number", + "value": 1.0, + "__meta": [ + { + "sourceRange": [ + 64, + 65, + 0 + ] + } + ] + }, + "p": { + "type": "String", + "value": "foo", + "__meta": [ + { + "sourceRange": [ + 344, + 349, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/riddle_small/ast.snap b/src/wasm-lib/kcl/tests/riddle_small/ast.snap new file mode 100644 index 000000000..717d3e66f --- /dev/null +++ b/src/wasm-lib/kcl/tests/riddle_small/ast.snap @@ -0,0 +1,635 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing riddle_small.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 14, + "id": { + "end": 6, + "name": "ANSWER", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 14, + "raw": "41803", + "start": 9, + "type": "Literal", + "type": "Literal", + "value": 41803.0 + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 14, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 66, + "id": { + "end": 20, + "name": "t", + "start": 19, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "end": 64, + "left": { + "end": 54, + "left": { + "end": 46, + "left": { + "end": 42, + "name": "ANSWER", + "start": 36, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "*", + "right": { + "end": 46, + "name": "s", + "start": 45, + "type": "Identifier", + "type": "Identifier" + }, + "start": 36, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "end": 54, + "raw": "12345", + "start": 49, + "type": "Literal", + "type": "Literal", + "value": 12345.0 + }, + "start": 36, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "%", + "right": { + "end": 64, + "raw": "214748", + "start": 58, + "type": "Literal", + "type": "Literal", + "value": 214748.0 + }, + "start": 36, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 64, + "start": 28, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 66, + "start": 24 + }, + "end": 66, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 22, + "name": "s", + "start": 21, + "type": "Identifier" + } + } + ], + "start": 20, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 19, + "type": "VariableDeclarator" + }, + "end": 66, + "kind": "fn", + "start": 16, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 79, + "id": { + "end": 70, + "name": "xs", + "start": 68, + "type": "Identifier" + }, + "init": { + "end": 79, + "raw": "205804", + "start": 73, + "type": "Literal", + "type": "Literal", + "value": 205804.0 + }, + "start": 68, + "type": "VariableDeclarator" + }, + "end": 79, + "kind": "const", + "start": 68, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 90, + "id": { + "end": 82, + "name": "ys", + "start": 80, + "type": "Identifier" + }, + "init": { + "end": 90, + "raw": "71816", + "start": 85, + "type": "Literal", + "type": "Literal", + "value": 71816.0 + }, + "start": 80, + "type": "VariableDeclarator" + }, + "end": 90, + "kind": "const", + "start": 80, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 112, + "id": { + "end": 93, + "name": "ox", + "start": 91, + "type": "Identifier" + }, + "init": { + "end": 112, + "left": { + "end": 98, + "raw": "35", + "start": 96, + "type": "Literal", + "type": "Literal", + "value": 35.0 + }, + "operator": "-", + "right": { + "end": 112, + "left": { + "arguments": [ + { + "end": 106, + "name": "xs", + "start": 104, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 103, + "name": "t", + "start": 102, + "type": "Identifier" + }, + "end": 107, + "start": 102, + "type": "CallExpression", + "type": "CallExpression" + }, + "operator": "%", + "right": { + "end": 112, + "raw": "70", + "start": 110, + "type": "Literal", + "type": "Literal", + "value": 70.0 + }, + "start": 102, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 96, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 91, + "type": "VariableDeclarator" + }, + "end": 112, + "kind": "const", + "start": 91, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 135, + "id": { + "end": 116, + "name": "oy", + "start": 114, + "type": "Identifier" + }, + "init": { + "end": 135, + "left": { + "end": 121, + "raw": "35", + "start": 119, + "type": "Literal", + "type": "Literal", + "value": 35.0 + }, + "operator": "-", + "right": { + "end": 135, + "left": { + "arguments": [ + { + "end": 129, + "name": "ys", + "start": 127, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 126, + "name": "t", + "start": 125, + "type": "Identifier" + }, + "end": 130, + "start": 125, + "type": "CallExpression", + "type": "CallExpression" + }, + "operator": "%", + "right": { + "end": 135, + "raw": "70", + "start": 133, + "type": "Literal", + "type": "Literal", + "value": 70.0 + }, + "start": 125, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 119, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 114, + "type": "VariableDeclarator" + }, + "end": 135, + "kind": "const", + "start": 114, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 291, + "id": { + "end": 138, + "name": "r", + "start": 137, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 159, + "raw": "'XZ'", + "start": 155, + "type": "Literal", + "type": "Literal", + "value": "XZ" + } + ], + "callee": { + "end": 154, + "name": "startSketchOn", + "start": 141, + "type": "Identifier" + }, + "end": 160, + "start": 141, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 184, + "name": "ox", + "start": 182, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 188, + "name": "oy", + "start": 186, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 189, + "start": 181, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 192, + "start": 191, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 180, + "name": "startProfileAt", + "start": 166, + "type": "Identifier" + }, + "end": 193, + "start": 166, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 206, + "raw": "1", + "start": 205, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 209, + "raw": "0", + "start": 208, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 210, + "start": 204, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 213, + "start": 212, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 203, + "name": "line", + "start": 199, + "type": "Identifier" + }, + "end": 214, + "start": 199, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 227, + "raw": "0", + "start": 226, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 231, + "raw": "1", + "start": 230, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "end": 231, + "operator": "-", + "start": 229, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 232, + "start": 225, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 235, + "start": 234, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 224, + "name": "line", + "start": 220, + "type": "Identifier" + }, + "end": 236, + "start": 220, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 250, + "raw": "1", + "start": 249, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "end": 250, + "operator": "-", + "start": 248, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 253, + "raw": "0", + "start": 252, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 254, + "start": 247, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 257, + "start": 256, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 246, + "name": "line", + "start": 242, + "type": "Identifier" + }, + "end": 258, + "start": 242, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 271, + "start": 270, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 269, + "name": "close", + "start": 264, + "type": "Identifier" + }, + "end": 272, + "start": 264, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 287, + "raw": "1", + "start": 286, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 290, + "start": 289, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 285, + "name": "extrude", + "start": 278, + "type": "Identifier" + }, + "end": 291, + "start": 278, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 291, + "start": 141, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 137, + "type": "VariableDeclarator" + }, + "end": 291, + "kind": "const", + "start": 137, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 292, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 16, + "start": 14, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "1": [ + { + "end": 68, + "start": 66, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/riddle_small/input.kcl b/src/wasm-lib/kcl/tests/riddle_small/input.kcl new file mode 100644 index 000000000..d68169231 --- /dev/null +++ b/src/wasm-lib/kcl/tests/riddle_small/input.kcl @@ -0,0 +1,17 @@ +ANSWER = 41803 + +fn t(s) { + return (ANSWER * s + 12345) % 214748 +} + +xs = 205804 +ys = 71816 +ox = 35 - (t(xs) % 70) +oy = 35 - (t(ys) % 70) +r = startSketchOn('XZ') + |> startProfileAt([ox, oy], %) + |> line([1, 0], %) + |> line([0, -1], %) + |> line([-1, 0], %) + |> close(%) + |> extrude(1, %) diff --git a/src/wasm-lib/kcl/tests/riddle_small/ops.snap b/src/wasm-lib/kcl/tests/riddle_small/ops.snap new file mode 100644 index 000000000..34892f29e --- /dev/null +++ b/src/wasm-lib/kcl/tests/riddle_small/ops.snap @@ -0,0 +1,90 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed riddle_small.kcl +snapshot_kind: text +--- +[ + { + "type": "UserDefinedFunctionCall", + "name": "t", + "functionSourceRange": [ + 20, + 66, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 102, + 107, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "type": "UserDefinedFunctionCall", + "name": "t", + "functionSourceRange": [ + 20, + 66, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 125, + 130, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 155, + 159, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 141, + 160, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 286, + 287, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 289, + 290, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 278, + 291, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/riddle_small/program_memory.snap b/src/wasm-lib/kcl/tests/riddle_small/program_memory.snap new file mode 100644 index 000000000..f08672559 --- /dev/null +++ b/src/wasm-lib/kcl/tests/riddle_small/program_memory.snap @@ -0,0 +1,509 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing riddle_small.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "ANSWER": { + "type": "Number", + "value": 41803.0, + "__meta": [ + { + "sourceRange": [ + 9, + 14, + 0 + ] + } + ] + }, + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "ox": { + "type": "Number", + "value": -26.0, + "__meta": [ + { + "sourceRange": [ + 96, + 98, + 0 + ] + }, + { + "sourceRange": [ + 9, + 14, + 0 + ] + }, + { + "sourceRange": [ + 73, + 79, + 0 + ] + }, + { + "sourceRange": [ + 49, + 54, + 0 + ] + }, + { + "sourceRange": [ + 58, + 64, + 0 + ] + }, + { + "sourceRange": [ + 110, + 112, + 0 + ] + } + ] + }, + "oy": { + "type": "Number", + "value": 34.0, + "__meta": [ + { + "sourceRange": [ + 119, + 121, + 0 + ] + }, + { + "sourceRange": [ + 9, + 14, + 0 + ] + }, + { + "sourceRange": [ + 85, + 90, + 0 + ] + }, + { + "sourceRange": [ + 49, + 54, + 0 + ] + }, + { + "sourceRange": [ + 58, + 64, + 0 + ] + }, + { + "sourceRange": [ + 133, + 135, + 0 + ] + } + ] + }, + "r": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 199, + 214, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 220, + 236, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 242, + 258, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 264, + 272, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 199, + 214, + 0 + ] + }, + "from": [ + -26.0, + 34.0 + ], + "tag": null, + "to": [ + -25.0, + 34.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 220, + 236, + 0 + ] + }, + "from": [ + -25.0, + 34.0 + ], + "tag": null, + "to": [ + -25.0, + 33.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 242, + 258, + 0 + ] + }, + "from": [ + -25.0, + 33.0 + ], + "tag": null, + "to": [ + -26.0, + 33.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 264, + 272, + 0 + ] + }, + "from": [ + -26.0, + 33.0 + ], + "tag": null, + "to": [ + -26.0, + 34.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + -26.0, + 34.0 + ], + "to": [ + -26.0, + 34.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 166, + 193, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 166, + 193, + 0 + ] + } + ] + }, + "height": 1.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 166, + 193, + 0 + ] + } + ] + }, + "t": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "argument": { + "end": 64, + "left": { + "end": 54, + "left": { + "end": 46, + "left": { + "end": 42, + "name": "ANSWER", + "start": 36, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "*", + "right": { + "end": 46, + "name": "s", + "start": 45, + "type": "Identifier", + "type": "Identifier" + }, + "start": 36, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "end": 54, + "raw": "12345", + "start": 49, + "type": "Literal", + "type": "Literal", + "value": 12345.0 + }, + "start": 36, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "%", + "right": { + "end": 64, + "raw": "214748", + "start": 58, + "type": "Literal", + "type": "Literal", + "value": 214748.0 + }, + "start": 36, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 64, + "start": 28, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 66, + "start": 24 + }, + "end": 66, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 22, + "name": "s", + "start": 21, + "type": "Identifier" + } + } + ], + "start": 20, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "ANSWER": { + "type": "Number", + "value": 41803.0, + "__meta": [ + { + "sourceRange": [ + 9, + 14, + 0 + ] + } + ] + }, + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 20, + 66, + 0 + ] + } + ] + }, + "xs": { + "type": "Number", + "value": 205804.0, + "__meta": [ + { + "sourceRange": [ + 73, + 79, + 0 + ] + } + ] + }, + "ys": { + "type": "Number", + "value": 71816.0, + "__meta": [ + { + "sourceRange": [ + 85, + 90, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/riddle_small/rendered_model.png b/src/wasm-lib/kcl/tests/riddle_small/rendered_model.png new file mode 100644 index 000000000..ad8b30ddd Binary files /dev/null and b/src/wasm-lib/kcl/tests/riddle_small/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/simtest.tmpl b/src/wasm-lib/kcl/tests/simtest.tmpl new file mode 100644 index 000000000..3c743217c --- /dev/null +++ b/src/wasm-lib/kcl/tests/simtest.tmpl @@ -0,0 +1,21 @@ +mod TEST_NAME_HERE { + const TEST_NAME: &str = "TEST_NAME_HERE"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, RENDER_TO_PNG).await + } +} diff --git a/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/ast.snap b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/ast.snap new file mode 100644 index 000000000..c16a2dada --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/ast.snap @@ -0,0 +1,1594 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing sketch-on-chamfer-two-times-different-order.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 425, + "id": { + "end": 9, + "name": "sketch001", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 30, + "raw": "'XZ'", + "start": 26, + "type": "Literal", + "type": "Literal", + "value": "XZ" + } + ], + "callee": { + "end": 25, + "name": "startSketchOn", + "start": 12, + "type": "Identifier" + }, + "end": 31, + "start": 12, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 57, + "raw": "75.8", + "start": 53, + "type": "Literal", + "type": "Literal", + "value": 75.8 + }, + { + "end": 64, + "raw": "317.2", + "start": 59, + "type": "Literal", + "type": "Literal", + "value": 317.2 + } + ], + "end": 65, + "start": 52, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 68, + "start": 67, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 51, + "name": "startProfileAt", + "start": 37, + "type": "Identifier" + }, + "end": 69, + "start": 37, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 118, + "raw": "0", + "start": 117, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 126, + "raw": "268.43", + "start": 120, + "type": "Literal", + "type": "Literal", + "value": 268.43 + } + ], + "end": 127, + "start": 116, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 130, + "start": 129, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + } + ], + "callee": { + "end": 115, + "name": "angledLine", + "start": 105, + "type": "Identifier" + }, + "end": 154, + "start": 105, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 213, + "left": { + "arguments": [ + { + "end": 207, + "name": "rectangleSegmentA001", + "start": 187, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 186, + "name": "segAng", + "start": 180, + "type": "Identifier" + }, + "end": 208, + "start": 180, + "type": "CallExpression", + "type": "CallExpression" + }, + "operator": "-", + "right": { + "end": 213, + "raw": "90", + "start": 211, + "type": "Literal", + "type": "Literal", + "value": 90.0 + }, + "start": 180, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 228, + "raw": "217.26", + "start": 222, + "type": "Literal", + "type": "Literal", + "value": 217.26 + } + ], + "end": 235, + "start": 171, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 238, + "start": 237, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "seg01" + } + ], + "callee": { + "end": 170, + "name": "angledLine", + "start": 160, + "type": "Identifier" + }, + "end": 247, + "start": 160, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "arguments": [ + { + "end": 300, + "name": "rectangleSegmentA001", + "start": 280, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 279, + "name": "segAng", + "start": 273, + "type": "Identifier" + }, + "end": 301, + "start": 273, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "argument": { + "arguments": [ + { + "end": 338, + "name": "rectangleSegmentA001", + "start": 318, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 317, + "name": "segLen", + "start": 311, + "type": "Identifier" + }, + "end": 339, + "start": 311, + "type": "CallExpression", + "type": "CallExpression" + }, + "end": 339, + "operator": "-", + "start": 310, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 346, + "start": 264, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 349, + "start": 348, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 263, + "name": "angledLine", + "start": 253, + "type": "Identifier" + }, + "end": 350, + "start": 253, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "arguments": [ + { + "end": 379, + "start": 378, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 377, + "name": "profileStartX", + "start": 364, + "type": "Identifier" + }, + "end": 380, + "start": 364, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 397, + "start": 396, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 395, + "name": "profileStartY", + "start": 382, + "type": "Identifier" + }, + "end": 398, + "start": 382, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 399, + "start": 363, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 402, + "start": 401, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "seg02" + } + ], + "callee": { + "end": 362, + "name": "lineTo", + "start": 356, + "type": "Identifier" + }, + "end": 411, + "start": 356, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 424, + "start": 423, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 422, + "name": "close", + "start": 417, + "type": "Identifier" + }, + "end": 425, + "start": 417, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 425, + "nonCodeMeta": { + "nonCodeNodes": { + "1": [ + { + "end": 99, + "start": 69, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "[$startCapTag, $EndCapTag]", + "style": "line" + } + } + ] + }, + "startNodes": [] + }, + "start": 12, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 425, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 660, + "id": { + "end": 436, + "name": "extrude001", + "start": 426, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 450, + "raw": "100", + "start": 447, + "type": "Literal", + "type": "Literal", + "value": 100.0 + }, + { + "end": 461, + "name": "sketch001", + "start": 452, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 446, + "name": "extrude", + "start": 439, + "type": "Identifier" + }, + "end": 462, + "start": 439, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 506, + "properties": [ + { + "end": 488, + "key": { + "end": 483, + "name": "radius", + "start": 477, + "type": "Identifier" + }, + "start": 477, + "type": "ObjectProperty", + "value": { + "end": 488, + "raw": "20", + "start": 486, + "type": "Literal", + "type": "Literal", + "value": 20.0 + } + }, + { + "end": 504, + "key": { + "end": 494, + "name": "tags", + "start": 490, + "type": "Identifier" + }, + "start": 490, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 503, + "name": "seg01", + "start": 498, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 504, + "start": 497, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "start": 475, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 509, + "start": 508, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 474, + "name": "fillet", + "start": 468, + "type": "Identifier" + }, + "end": 510, + "start": 468, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 591, + "properties": [ + { + "end": 544, + "key": { + "end": 539, + "name": "length", + "start": 533, + "type": "Identifier" + }, + "start": 533, + "type": "ObjectProperty", + "value": { + "end": 544, + "raw": "50", + "start": 542, + "type": "Literal", + "type": "Literal", + "value": 50.0 + } + }, + { + "end": 584, + "key": { + "end": 557, + "name": "tags", + "start": 553, + "type": "Identifier" + }, + "start": 553, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "arguments": [ + { + "end": 582, + "name": "seg01", + "start": 577, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 576, + "name": "getOppositeEdge", + "start": 561, + "type": "Identifier" + }, + "end": 583, + "start": 561, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 584, + "start": 560, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "start": 524, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 594, + "start": 593, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 602, + "start": 596, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "seg03" + } + ], + "callee": { + "end": 523, + "name": "chamfer", + "start": 516, + "type": "Identifier" + }, + "end": 603, + "start": 516, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 648, + "properties": [ + { + "end": 630, + "key": { + "end": 625, + "name": "length", + "start": 619, + "type": "Identifier" + }, + "start": 619, + "type": "ObjectProperty", + "value": { + "end": 630, + "raw": "50", + "start": 628, + "type": "Literal", + "type": "Literal", + "value": 50.0 + } + }, + { + "end": 646, + "key": { + "end": 636, + "name": "tags", + "start": 632, + "type": "Identifier" + }, + "start": 632, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 645, + "name": "seg02", + "start": 640, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 646, + "start": 639, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "start": 617, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 651, + "start": 650, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "seg04" + } + ], + "callee": { + "end": 616, + "name": "chamfer", + "start": 609, + "type": "Identifier" + }, + "end": 660, + "start": 609, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 660, + "start": 439, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 426, + "type": "VariableDeclarator" + }, + "end": 660, + "kind": "const", + "start": 426, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 1100, + "id": { + "end": 671, + "name": "sketch003", + "start": 662, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 698, + "name": "extrude001", + "start": 688, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 705, + "name": "seg04", + "start": 700, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 687, + "name": "startSketchOn", + "start": 674, + "type": "Identifier" + }, + "end": 706, + "start": 674, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 733, + "raw": "69.1", + "start": 729, + "type": "Literal", + "type": "Literal", + "value": 69.1 + }, + "end": 733, + "operator": "-", + "start": 728, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 741, + "raw": "277.34", + "start": 735, + "type": "Literal", + "type": "Literal", + "value": 277.34 + } + ], + "end": 742, + "start": 727, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 745, + "start": 744, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 726, + "name": "startProfileAt", + "start": 712, + "type": "Identifier" + }, + "end": 746, + "start": 712, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 765, + "raw": "0", + "start": 764, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 772, + "raw": "41.48", + "start": 767, + "type": "Literal", + "type": "Literal", + "value": 41.48 + } + ], + "end": 773, + "start": 763, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 776, + "start": 775, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 799, + "start": 778, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "rectangleSegmentA003" + } + ], + "callee": { + "end": 762, + "name": "angledLine", + "start": 752, + "type": "Identifier" + }, + "end": 800, + "start": 752, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 859, + "left": { + "arguments": [ + { + "end": 853, + "name": "rectangleSegmentA003", + "start": 833, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 832, + "name": "segAng", + "start": 826, + "type": "Identifier" + }, + "end": 854, + "start": 826, + "type": "CallExpression", + "type": "CallExpression" + }, + "operator": "-", + "right": { + "end": 859, + "raw": "90", + "start": 857, + "type": "Literal", + "type": "Literal", + "value": 90.0 + }, + "start": 826, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 873, + "raw": "104.8", + "start": 868, + "type": "Literal", + "type": "Literal", + "value": 104.8 + } + ], + "end": 880, + "start": 817, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 883, + "start": 882, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 906, + "start": 885, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "rectangleSegmentB002" + } + ], + "callee": { + "end": 816, + "name": "angledLine", + "start": 806, + "type": "Identifier" + }, + "end": 907, + "start": 806, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "arguments": [ + { + "end": 960, + "name": "rectangleSegmentA003", + "start": 940, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 939, + "name": "segAng", + "start": 933, + "type": "Identifier" + }, + "end": 961, + "start": 933, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "argument": { + "arguments": [ + { + "end": 998, + "name": "rectangleSegmentA003", + "start": 978, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 977, + "name": "segLen", + "start": 971, + "type": "Identifier" + }, + "end": 999, + "start": 971, + "type": "CallExpression", + "type": "CallExpression" + }, + "end": 999, + "operator": "-", + "start": 970, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1006, + "start": 924, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1009, + "start": 1008, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 1032, + "start": 1011, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "rectangleSegmentC002" + } + ], + "callee": { + "end": 923, + "name": "angledLine", + "start": 913, + "type": "Identifier" + }, + "end": 1033, + "start": 913, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "arguments": [ + { + "end": 1062, + "start": 1061, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1060, + "name": "profileStartX", + "start": 1047, + "type": "Identifier" + }, + "end": 1063, + "start": 1047, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1080, + "start": 1079, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1078, + "name": "profileStartY", + "start": 1065, + "type": "Identifier" + }, + "end": 1081, + "start": 1065, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 1082, + "start": 1046, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1085, + "start": 1084, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1045, + "name": "lineTo", + "start": 1039, + "type": "Identifier" + }, + "end": 1086, + "start": 1039, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1099, + "start": 1098, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1097, + "name": "close", + "start": 1092, + "type": "Identifier" + }, + "end": 1100, + "start": 1092, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 1100, + "start": 674, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 662, + "type": "VariableDeclarator" + }, + "end": 1100, + "kind": "const", + "start": 662, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 1541, + "id": { + "end": 1110, + "name": "sketch002", + "start": 1101, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 1137, + "name": "extrude001", + "start": 1127, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 1144, + "name": "seg03", + "start": 1139, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 1126, + "name": "startSketchOn", + "start": 1113, + "type": "Identifier" + }, + "end": 1145, + "start": 1113, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1173, + "raw": "159.25", + "start": 1167, + "type": "Literal", + "type": "Literal", + "value": 159.25 + }, + { + "end": 1181, + "raw": "278.35", + "start": 1175, + "type": "Literal", + "type": "Literal", + "value": 278.35 + } + ], + "end": 1182, + "start": 1166, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1185, + "start": 1184, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1165, + "name": "startProfileAt", + "start": 1151, + "type": "Identifier" + }, + "end": 1186, + "start": 1151, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1205, + "raw": "0", + "start": 1204, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 1212, + "raw": "40.82", + "start": 1207, + "type": "Literal", + "type": "Literal", + "value": 40.82 + } + ], + "end": 1213, + "start": 1203, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1216, + "start": 1215, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 1239, + "start": 1218, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "rectangleSegmentA002" + } + ], + "callee": { + "end": 1202, + "name": "angledLine", + "start": 1192, + "type": "Identifier" + }, + "end": 1240, + "start": 1192, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1299, + "left": { + "arguments": [ + { + "end": 1293, + "name": "rectangleSegmentA002", + "start": 1273, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 1272, + "name": "segAng", + "start": 1266, + "type": "Identifier" + }, + "end": 1294, + "start": 1266, + "type": "CallExpression", + "type": "CallExpression" + }, + "operator": "-", + "right": { + "end": 1299, + "raw": "90", + "start": 1297, + "type": "Literal", + "type": "Literal", + "value": 90.0 + }, + "start": 1266, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 1314, + "raw": "132.27", + "start": 1308, + "type": "Literal", + "type": "Literal", + "value": 132.27 + } + ], + "end": 1321, + "start": 1257, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1324, + "start": 1323, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 1347, + "start": 1326, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "rectangleSegmentB001" + } + ], + "callee": { + "end": 1256, + "name": "angledLine", + "start": 1246, + "type": "Identifier" + }, + "end": 1348, + "start": 1246, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "arguments": [ + { + "end": 1401, + "name": "rectangleSegmentA002", + "start": 1381, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 1380, + "name": "segAng", + "start": 1374, + "type": "Identifier" + }, + "end": 1402, + "start": 1374, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "argument": { + "arguments": [ + { + "end": 1439, + "name": "rectangleSegmentA002", + "start": 1419, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 1418, + "name": "segLen", + "start": 1412, + "type": "Identifier" + }, + "end": 1440, + "start": 1412, + "type": "CallExpression", + "type": "CallExpression" + }, + "end": 1440, + "operator": "-", + "start": 1411, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1447, + "start": 1365, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1450, + "start": 1449, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 1473, + "start": 1452, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "rectangleSegmentC001" + } + ], + "callee": { + "end": 1364, + "name": "angledLine", + "start": 1354, + "type": "Identifier" + }, + "end": 1474, + "start": 1354, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "arguments": [ + { + "end": 1503, + "start": 1502, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1501, + "name": "profileStartX", + "start": 1488, + "type": "Identifier" + }, + "end": 1504, + "start": 1488, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1521, + "start": 1520, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1519, + "name": "profileStartY", + "start": 1506, + "type": "Identifier" + }, + "end": 1522, + "start": 1506, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 1523, + "start": 1487, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1526, + "start": 1525, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1486, + "name": "lineTo", + "start": 1480, + "type": "Identifier" + }, + "end": 1527, + "start": 1480, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1540, + "start": 1539, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1538, + "name": "close", + "start": 1533, + "type": "Identifier" + }, + "end": 1541, + "start": 1533, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 1541, + "start": 1113, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 1101, + "type": "VariableDeclarator" + }, + "end": 1541, + "kind": "const", + "start": 1101, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 1577, + "id": { + "end": 1552, + "name": "extrude002", + "start": 1542, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 1565, + "raw": "50", + "start": 1563, + "type": "Literal", + "type": "Literal", + "value": 50.0 + }, + { + "end": 1576, + "name": "sketch002", + "start": 1567, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 1562, + "name": "extrude", + "start": 1555, + "type": "Identifier" + }, + "end": 1577, + "start": 1555, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 1542, + "type": "VariableDeclarator" + }, + "end": 1577, + "kind": "const", + "start": 1542, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 1578, + "nonCodeMeta": { + "nonCodeNodes": { + "1": [ + { + "end": 662, + "start": 660, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/input.kcl b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/input.kcl new file mode 100644 index 000000000..15f5a31e0 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/input.kcl @@ -0,0 +1,48 @@ +sketch001 = startSketchOn('XZ') + |> startProfileAt([75.8, 317.2], %) // [$startCapTag, $EndCapTag] + |> angledLine([0, 268.43], %, $rectangleSegmentA001) + |> angledLine([ + segAng(rectangleSegmentA001) - 90, + 217.26 + ], %, $seg01) + |> angledLine([ + segAng(rectangleSegmentA001), + -segLen(rectangleSegmentA001) + ], %) + |> lineTo([profileStartX(%), profileStartY(%)], %, $seg02) + |> close(%) +extrude001 = extrude(100, sketch001) + |> fillet({ radius = 20, tags = [seg01] }, %) + |> chamfer({ + length = 50, + tags = [getOppositeEdge(seg01)] + }, %, $seg03) + |> chamfer({ length = 50, tags = [seg02] }, %, $seg04) + +sketch003 = startSketchOn(extrude001, seg04) + |> startProfileAt([-69.1, 277.34], %) + |> angledLine([0, 41.48], %, $rectangleSegmentA003) + |> angledLine([ + segAng(rectangleSegmentA003) - 90, + 104.8 + ], %, $rectangleSegmentB002) + |> angledLine([ + segAng(rectangleSegmentA003), + -segLen(rectangleSegmentA003) + ], %, $rectangleSegmentC002) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) +sketch002 = startSketchOn(extrude001, seg03) + |> startProfileAt([159.25, 278.35], %) + |> angledLine([0, 40.82], %, $rectangleSegmentA002) + |> angledLine([ + segAng(rectangleSegmentA002) - 90, + 132.27 + ], %, $rectangleSegmentB001) + |> angledLine([ + segAng(rectangleSegmentA002), + -segLen(rectangleSegmentA002) + ], %, $rectangleSegmentC001) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) +extrude002 = extrude(50, sketch002) diff --git a/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/ops.snap b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/ops.snap new file mode 100644 index 000000000..5576fd8ff --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/ops.snap @@ -0,0 +1,222 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed sketch-on-chamfer-two-times-different-order.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 26, + 30, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 12, + 31, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 447, + 450, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 452, + 461, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 439, + 462, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 475, + 506, + 0 + ] + }, + "solid": { + "sourceRange": [ + 508, + 509, + 0 + ] + } + }, + "name": "fillet", + "sourceRange": [ + 468, + 510, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 524, + 591, + 0 + ] + }, + "solid": { + "sourceRange": [ + 593, + 594, + 0 + ] + }, + "tag": { + "sourceRange": [ + 596, + 602, + 0 + ] + } + }, + "name": "chamfer", + "sourceRange": [ + 516, + 603, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 617, + 648, + 0 + ] + }, + "solid": { + "sourceRange": [ + 650, + 651, + 0 + ] + }, + "tag": { + "sourceRange": [ + 653, + 659, + 0 + ] + } + }, + "name": "chamfer", + "sourceRange": [ + 609, + 660, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 688, + 698, + 0 + ] + }, + "tag": { + "sourceRange": [ + 700, + 705, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 674, + 706, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 1127, + 1137, + 0 + ] + }, + "tag": { + "sourceRange": [ + 1139, + 1144, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 1113, + 1145, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 1563, + 1565, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 1567, + 1576, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 1555, + 1577, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/program_memory.snap b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/program_memory.snap new file mode 100644 index 000000000..1dd362545 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/program_memory.snap @@ -0,0 +1,4405 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing sketch-on-chamfer-two-times-different-order.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "extrude001": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 253, + 350, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 516, + 603, + 0 + ], + "tag": { + "end": 602, + "start": 596, + "type": "TagDeclarator", + "value": "seg03" + }, + "type": "chamfer" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 609, + 660, + 0 + ], + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg04" + }, + "type": "chamfer" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "to": [ + 344.23, + 317.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ] + }, + "from": [ + 344.23, + 317.2 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 344.23, + 99.94 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 253, + 350, + 0 + ] + }, + "from": [ + 344.23, + 99.94 + ], + "tag": null, + "to": [ + 75.8, + 99.94 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ] + }, + "from": [ + 75.8, + 99.94 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 417, + 425, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": null, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 75.8, + 317.2 + ], + "to": [ + 75.8, + 317.2 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 69, + 0 + ] + } + }, + "tags": { + "rectangleSegmentA001": { + "type": "TagIdentifier", + "value": "rectangleSegmentA001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "to": [ + 344.23, + 317.2 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 132, + 153, + 0 + ] + } + ] + }, + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ] + }, + "from": [ + 344.23, + 317.2 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 344.23, + 99.94 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 240, + 246, + 0 + ] + } + ] + }, + "seg02": { + "type": "TagIdentifier", + "value": "seg02", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ] + }, + "from": [ + 75.80000000000001, + 99.94 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 404, + 410, + 0 + ] + } + ] + }, + "seg03": { + "type": "TagIdentifier", + "value": "seg03", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": null, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 516, + 603, + 0 + ], + "tag": { + "end": 602, + "start": 596, + "type": "TagDeclarator", + "value": "seg03" + }, + "type": "chamfer" + } + }, + "__meta": [ + { + "sourceRange": [ + 596, + 602, + 0 + ] + } + ] + }, + "seg04": { + "type": "TagIdentifier", + "value": "seg04", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": null, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 609, + 660, + 0 + ], + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg04" + }, + "type": "chamfer" + } + }, + "__meta": [ + { + "sourceRange": [ + 653, + 659, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 37, + 69, + 0 + ] + } + ] + }, + "height": 100.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "edgeCuts": [ + { + "type": "fillet", + "id": "[uuid]", + "radius": 20.0, + "edgeId": "[uuid]", + "tag": null + }, + { + "type": "chamfer", + "id": "[uuid]", + "length": 50.0, + "edgeId": "[uuid]", + "tag": { + "end": 602, + "start": 596, + "type": "TagDeclarator", + "value": "seg03" + } + }, + { + "type": "chamfer", + "id": "[uuid]", + "length": 50.0, + "edgeId": "[uuid]", + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg04" + } + } + ], + "__meta": [ + { + "sourceRange": [ + 37, + 69, + 0 + ] + } + ] + }, + "extrude002": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1192, + 1240, + 0 + ], + "tag": { + "end": 1239, + "start": 1218, + "type": "TagDeclarator", + "value": "rectangleSegmentA002" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1246, + 1348, + 0 + ], + "tag": { + "end": 1347, + "start": 1326, + "type": "TagDeclarator", + "value": "rectangleSegmentB001" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1354, + 1474, + 0 + ], + "tag": { + "end": 1473, + "start": 1452, + "type": "TagDeclarator", + "value": "rectangleSegmentC001" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1480, + 1527, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1192, + 1240, + 0 + ] + }, + "from": [ + 159.25, + 278.35 + ], + "tag": { + "end": 1239, + "start": 1218, + "type": "TagDeclarator", + "value": "rectangleSegmentA002" + }, + "to": [ + 200.07, + 278.35 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1246, + 1348, + 0 + ] + }, + "from": [ + 200.07, + 278.35 + ], + "tag": { + "end": 1347, + "start": 1326, + "type": "TagDeclarator", + "value": "rectangleSegmentB001" + }, + "to": [ + 200.07, + 146.08 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1354, + 1474, + 0 + ] + }, + "from": [ + 200.07, + 146.08 + ], + "tag": { + "end": 1473, + "start": 1452, + "type": "TagDeclarator", + "value": "rectangleSegmentC001" + }, + "to": [ + 159.25, + 146.08 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1480, + 1527, + 0 + ] + }, + "from": [ + 159.25, + 146.08 + ], + "tag": null, + "to": [ + 159.25, + 278.35 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1533, + 1541, + 0 + ] + }, + "from": [ + 159.25, + 278.35 + ], + "tag": null, + "to": [ + 159.25, + 278.35 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "seg03", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 253, + 350, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 516, + 603, + 0 + ], + "tag": { + "end": 602, + "start": 596, + "type": "TagDeclarator", + "value": "seg03" + }, + "type": "chamfer" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 609, + 660, + 0 + ], + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg04" + }, + "type": "chamfer" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "to": [ + 344.23, + 317.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ] + }, + "from": [ + 344.23, + 317.2 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 344.23, + 99.94 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 253, + 350, + 0 + ] + }, + "from": [ + 344.23, + 99.94 + ], + "tag": null, + "to": [ + 75.8, + 99.94 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ] + }, + "from": [ + 75.8, + 99.94 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 417, + 425, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": null, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 75.8, + 317.2 + ], + "to": [ + 75.8, + 317.2 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 69, + 0 + ] + } + }, + "tags": { + "rectangleSegmentA001": { + "type": "TagIdentifier", + "value": "rectangleSegmentA001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "to": [ + 344.23, + 317.2 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 132, + 153, + 0 + ] + } + ] + }, + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ] + }, + "from": [ + 344.23, + 317.2 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 344.23, + 99.94 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 240, + 246, + 0 + ] + } + ] + }, + "seg02": { + "type": "TagIdentifier", + "value": "seg02", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ] + }, + "from": [ + 75.80000000000001, + 99.94 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 404, + 410, + 0 + ] + } + ] + }, + "seg03": { + "type": "TagIdentifier", + "value": "seg03", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": null, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 516, + 603, + 0 + ], + "tag": { + "end": 602, + "start": 596, + "type": "TagDeclarator", + "value": "seg03" + }, + "type": "chamfer" + } + }, + "__meta": [ + { + "sourceRange": [ + 596, + 602, + 0 + ] + } + ] + }, + "seg04": { + "type": "TagIdentifier", + "value": "seg04", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": null, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 609, + 660, + 0 + ], + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg04" + }, + "type": "chamfer" + } + }, + "__meta": [ + { + "sourceRange": [ + 653, + 659, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 37, + 69, + 0 + ] + } + ] + }, + "height": 100.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "edgeCuts": [ + { + "type": "fillet", + "id": "[uuid]", + "radius": 20.0, + "edgeId": "[uuid]", + "tag": null + }, + { + "type": "chamfer", + "id": "[uuid]", + "length": 50.0, + "edgeId": "[uuid]", + "tag": { + "end": 602, + "start": 596, + "type": "TagDeclarator", + "value": "seg03" + } + }, + { + "type": "chamfer", + "id": "[uuid]", + "length": 50.0, + "edgeId": "[uuid]", + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg04" + } + } + ], + "__meta": [ + { + "sourceRange": [ + 37, + 69, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 1113, + 1145, + 0 + ] + } + ] + }, + "start": { + "from": [ + 159.25, + 278.35 + ], + "to": [ + 159.25, + 278.35 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1151, + 1186, + 0 + ] + } + }, + "tags": { + "rectangleSegmentA002": { + "type": "TagIdentifier", + "value": "rectangleSegmentA002", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1192, + 1240, + 0 + ] + }, + "from": [ + 159.25, + 278.35 + ], + "tag": { + "end": 1239, + "start": 1218, + "type": "TagDeclarator", + "value": "rectangleSegmentA002" + }, + "to": [ + 200.07, + 278.35 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1192, + 1240, + 0 + ], + "tag": { + "end": 1239, + "start": 1218, + "type": "TagDeclarator", + "value": "rectangleSegmentA002" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1218, + 1239, + 0 + ] + } + ] + }, + "rectangleSegmentB001": { + "type": "TagIdentifier", + "value": "rectangleSegmentB001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1246, + 1348, + 0 + ] + }, + "from": [ + 200.07, + 278.35 + ], + "tag": { + "end": 1347, + "start": 1326, + "type": "TagDeclarator", + "value": "rectangleSegmentB001" + }, + "to": [ + 200.07, + 146.08 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1246, + 1348, + 0 + ], + "tag": { + "end": 1347, + "start": 1326, + "type": "TagDeclarator", + "value": "rectangleSegmentB001" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1326, + 1347, + 0 + ] + } + ] + }, + "rectangleSegmentC001": { + "type": "TagIdentifier", + "value": "rectangleSegmentC001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1354, + 1474, + 0 + ] + }, + "from": [ + 200.07, + 146.08 + ], + "tag": { + "end": 1473, + "start": 1452, + "type": "TagDeclarator", + "value": "rectangleSegmentC001" + }, + "to": [ + 159.25, + 146.08 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1354, + 1474, + 0 + ], + "tag": { + "end": 1473, + "start": 1452, + "type": "TagDeclarator", + "value": "rectangleSegmentC001" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1452, + 1473, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 1151, + 1186, + 0 + ] + } + ] + }, + "height": 50.0, + "startCapId": null, + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 1151, + 1186, + 0 + ] + } + ] + }, + "rectangleSegmentA001": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "rectangleSegmentA001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "to": [ + 344.23, + 317.2 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 132, + 153, + 0 + ] + } + ] + }, + "rectangleSegmentA002": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "rectangleSegmentA002", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1192, + 1240, + 0 + ] + }, + "from": [ + 159.25, + 278.35 + ], + "tag": { + "end": 1239, + "start": 1218, + "type": "TagDeclarator", + "value": "rectangleSegmentA002" + }, + "to": [ + 200.07, + 278.35 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1192, + 1240, + 0 + ], + "tag": { + "end": 1239, + "start": 1218, + "type": "TagDeclarator", + "value": "rectangleSegmentA002" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1218, + 1239, + 0 + ] + } + ] + }, + "rectangleSegmentA003": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "rectangleSegmentA003", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 752, + 800, + 0 + ] + }, + "from": [ + -69.1, + 277.34 + ], + "tag": { + "end": 799, + "start": 778, + "type": "TagDeclarator", + "value": "rectangleSegmentA003" + }, + "to": [ + -27.619999999999997, + 277.34 + ], + "type": "ToPoint" + }, + "surface": null + }, + "__meta": [ + { + "sourceRange": [ + 778, + 799, + 0 + ] + } + ] + }, + "rectangleSegmentB001": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "rectangleSegmentB001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1246, + 1348, + 0 + ] + }, + "from": [ + 200.07, + 278.35 + ], + "tag": { + "end": 1347, + "start": 1326, + "type": "TagDeclarator", + "value": "rectangleSegmentB001" + }, + "to": [ + 200.07, + 146.08 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1246, + 1348, + 0 + ], + "tag": { + "end": 1347, + "start": 1326, + "type": "TagDeclarator", + "value": "rectangleSegmentB001" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1326, + 1347, + 0 + ] + } + ] + }, + "rectangleSegmentB002": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "rectangleSegmentB002", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 806, + 907, + 0 + ] + }, + "from": [ + -27.619999999999997, + 277.34 + ], + "tag": { + "end": 906, + "start": 885, + "type": "TagDeclarator", + "value": "rectangleSegmentB002" + }, + "to": [ + -27.61999999999999, + 172.53999999999996 + ], + "type": "ToPoint" + }, + "surface": null + }, + "__meta": [ + { + "sourceRange": [ + 885, + 906, + 0 + ] + } + ] + }, + "rectangleSegmentC001": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "rectangleSegmentC001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1354, + 1474, + 0 + ] + }, + "from": [ + 200.07, + 146.08 + ], + "tag": { + "end": 1473, + "start": 1452, + "type": "TagDeclarator", + "value": "rectangleSegmentC001" + }, + "to": [ + 159.25, + 146.08 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1354, + 1474, + 0 + ], + "tag": { + "end": 1473, + "start": 1452, + "type": "TagDeclarator", + "value": "rectangleSegmentC001" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1452, + 1473, + 0 + ] + } + ] + }, + "rectangleSegmentC002": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "rectangleSegmentC002", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 913, + 1033, + 0 + ] + }, + "from": [ + -27.61999999999999, + 172.53999999999996 + ], + "tag": { + "end": 1032, + "start": 1011, + "type": "TagDeclarator", + "value": "rectangleSegmentC002" + }, + "to": [ + -69.1, + 172.53999999999996 + ], + "type": "ToPoint" + }, + "surface": null + }, + "__meta": [ + { + "sourceRange": [ + 1011, + 1032, + 0 + ] + } + ] + }, + "seg01": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ] + }, + "from": [ + 344.23, + 317.2 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 344.23, + 99.94 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 240, + 246, + 0 + ] + } + ] + }, + "seg02": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "seg02", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ] + }, + "from": [ + 75.80000000000001, + 99.94 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 404, + 410, + 0 + ] + } + ] + }, + "seg03": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "seg03", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": null, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 516, + 603, + 0 + ], + "tag": { + "end": 602, + "start": 596, + "type": "TagDeclarator", + "value": "seg03" + }, + "type": "chamfer" + } + }, + "__meta": [ + { + "sourceRange": [ + 596, + 602, + 0 + ] + } + ] + }, + "seg04": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "seg04", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": null, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 609, + 660, + 0 + ], + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg04" + }, + "type": "chamfer" + } + }, + "__meta": [ + { + "sourceRange": [ + 653, + 659, + 0 + ] + } + ] + }, + "sketch001": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "to": [ + 344.23, + 317.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ] + }, + "from": [ + 344.23, + 317.2 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 344.23, + 99.94 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 253, + 350, + 0 + ] + }, + "from": [ + 344.23, + 99.94 + ], + "tag": null, + "to": [ + 75.8, + 99.94 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ] + }, + "from": [ + 75.8, + 99.94 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 417, + 425, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": null, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 75.8, + 317.2 + ], + "to": [ + 75.8, + 317.2 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 69, + 0 + ] + } + }, + "tags": { + "rectangleSegmentA001": { + "type": "TagIdentifier", + "value": "rectangleSegmentA001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "to": [ + 344.23, + 317.2 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 132, + 153, + 0 + ] + } + ] + }, + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ] + }, + "from": [ + 344.23, + 317.2 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 344.23, + 99.94 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 240, + 246, + 0 + ] + } + ] + }, + "seg02": { + "type": "TagIdentifier", + "value": "seg02", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ] + }, + "from": [ + 75.80000000000001, + 99.94 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 404, + 410, + 0 + ] + } + ] + }, + "seg03": { + "type": "TagIdentifier", + "value": "seg03", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": null, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 516, + 603, + 0 + ], + "tag": { + "end": 602, + "start": 596, + "type": "TagDeclarator", + "value": "seg03" + }, + "type": "chamfer" + } + }, + "__meta": [ + { + "sourceRange": [ + 596, + 602, + 0 + ] + } + ] + }, + "seg04": { + "type": "TagIdentifier", + "value": "seg04", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": null, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 609, + 660, + 0 + ], + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg04" + }, + "type": "chamfer" + } + }, + "__meta": [ + { + "sourceRange": [ + 653, + 659, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 37, + 69, + 0 + ] + } + ] + } + }, + "sketch002": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1192, + 1240, + 0 + ] + }, + "from": [ + 159.25, + 278.35 + ], + "tag": { + "end": 1239, + "start": 1218, + "type": "TagDeclarator", + "value": "rectangleSegmentA002" + }, + "to": [ + 200.07, + 278.35 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1246, + 1348, + 0 + ] + }, + "from": [ + 200.07, + 278.35 + ], + "tag": { + "end": 1347, + "start": 1326, + "type": "TagDeclarator", + "value": "rectangleSegmentB001" + }, + "to": [ + 200.07, + 146.08 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1354, + 1474, + 0 + ] + }, + "from": [ + 200.07, + 146.08 + ], + "tag": { + "end": 1473, + "start": 1452, + "type": "TagDeclarator", + "value": "rectangleSegmentC001" + }, + "to": [ + 159.25, + 146.08 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1480, + 1527, + 0 + ] + }, + "from": [ + 159.25, + 146.08 + ], + "tag": null, + "to": [ + 159.25, + 278.35 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1533, + 1541, + 0 + ] + }, + "from": [ + 159.25, + 278.35 + ], + "tag": null, + "to": [ + 159.25, + 278.35 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "seg03", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 253, + 350, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 516, + 603, + 0 + ], + "tag": { + "end": 602, + "start": 596, + "type": "TagDeclarator", + "value": "seg03" + }, + "type": "chamfer" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 609, + 660, + 0 + ], + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg04" + }, + "type": "chamfer" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "to": [ + 344.23, + 317.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ] + }, + "from": [ + 344.23, + 317.2 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 344.23, + 99.94 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 253, + 350, + 0 + ] + }, + "from": [ + 344.23, + 99.94 + ], + "tag": null, + "to": [ + 75.8, + 99.94 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ] + }, + "from": [ + 75.8, + 99.94 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 417, + 425, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": null, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 75.8, + 317.2 + ], + "to": [ + 75.8, + 317.2 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 69, + 0 + ] + } + }, + "tags": { + "rectangleSegmentA001": { + "type": "TagIdentifier", + "value": "rectangleSegmentA001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "to": [ + 344.23, + 317.2 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 132, + 153, + 0 + ] + } + ] + }, + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ] + }, + "from": [ + 344.23, + 317.2 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 344.23, + 99.94 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 240, + 246, + 0 + ] + } + ] + }, + "seg02": { + "type": "TagIdentifier", + "value": "seg02", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ] + }, + "from": [ + 75.80000000000001, + 99.94 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 404, + 410, + 0 + ] + } + ] + }, + "seg03": { + "type": "TagIdentifier", + "value": "seg03", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": null, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 516, + 603, + 0 + ], + "tag": { + "end": 602, + "start": 596, + "type": "TagDeclarator", + "value": "seg03" + }, + "type": "chamfer" + } + }, + "__meta": [ + { + "sourceRange": [ + 596, + 602, + 0 + ] + } + ] + }, + "seg04": { + "type": "TagIdentifier", + "value": "seg04", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": null, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 609, + 660, + 0 + ], + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg04" + }, + "type": "chamfer" + } + }, + "__meta": [ + { + "sourceRange": [ + 653, + 659, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 37, + 69, + 0 + ] + } + ] + }, + "height": 100.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "edgeCuts": [ + { + "type": "fillet", + "id": "[uuid]", + "radius": 20.0, + "edgeId": "[uuid]", + "tag": null + }, + { + "type": "chamfer", + "id": "[uuid]", + "length": 50.0, + "edgeId": "[uuid]", + "tag": { + "end": 602, + "start": 596, + "type": "TagDeclarator", + "value": "seg03" + } + }, + { + "type": "chamfer", + "id": "[uuid]", + "length": 50.0, + "edgeId": "[uuid]", + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg04" + } + } + ], + "__meta": [ + { + "sourceRange": [ + 37, + 69, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 1113, + 1145, + 0 + ] + } + ] + }, + "start": { + "from": [ + 159.25, + 278.35 + ], + "to": [ + 159.25, + 278.35 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1151, + 1186, + 0 + ] + } + }, + "tags": { + "rectangleSegmentA002": { + "type": "TagIdentifier", + "value": "rectangleSegmentA002", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1192, + 1240, + 0 + ] + }, + "from": [ + 159.25, + 278.35 + ], + "tag": { + "end": 1239, + "start": 1218, + "type": "TagDeclarator", + "value": "rectangleSegmentA002" + }, + "to": [ + 200.07, + 278.35 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1192, + 1240, + 0 + ], + "tag": { + "end": 1239, + "start": 1218, + "type": "TagDeclarator", + "value": "rectangleSegmentA002" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1218, + 1239, + 0 + ] + } + ] + }, + "rectangleSegmentB001": { + "type": "TagIdentifier", + "value": "rectangleSegmentB001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1246, + 1348, + 0 + ] + }, + "from": [ + 200.07, + 278.35 + ], + "tag": { + "end": 1347, + "start": 1326, + "type": "TagDeclarator", + "value": "rectangleSegmentB001" + }, + "to": [ + 200.07, + 146.08 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1246, + 1348, + 0 + ], + "tag": { + "end": 1347, + "start": 1326, + "type": "TagDeclarator", + "value": "rectangleSegmentB001" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1326, + 1347, + 0 + ] + } + ] + }, + "rectangleSegmentC001": { + "type": "TagIdentifier", + "value": "rectangleSegmentC001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1354, + 1474, + 0 + ] + }, + "from": [ + 200.07, + 146.08 + ], + "tag": { + "end": 1473, + "start": 1452, + "type": "TagDeclarator", + "value": "rectangleSegmentC001" + }, + "to": [ + 159.25, + 146.08 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1354, + 1474, + 0 + ], + "tag": { + "end": 1473, + "start": 1452, + "type": "TagDeclarator", + "value": "rectangleSegmentC001" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1452, + 1473, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 1151, + 1186, + 0 + ] + } + ] + } + }, + "sketch003": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 752, + 800, + 0 + ] + }, + "from": [ + -69.1, + 277.34 + ], + "tag": { + "end": 799, + "start": 778, + "type": "TagDeclarator", + "value": "rectangleSegmentA003" + }, + "to": [ + -27.62, + 277.34 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 806, + 907, + 0 + ] + }, + "from": [ + -27.62, + 277.34 + ], + "tag": { + "end": 906, + "start": 885, + "type": "TagDeclarator", + "value": "rectangleSegmentB002" + }, + "to": [ + -27.62, + 172.54 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 913, + 1033, + 0 + ] + }, + "from": [ + -27.62, + 172.54 + ], + "tag": { + "end": 1032, + "start": 1011, + "type": "TagDeclarator", + "value": "rectangleSegmentC002" + }, + "to": [ + -69.1, + 172.54 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1039, + 1086, + 0 + ] + }, + "from": [ + -69.1, + 172.54 + ], + "tag": null, + "to": [ + -69.1, + 277.34 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1092, + 1100, + 0 + ] + }, + "from": [ + -69.1, + 277.34 + ], + "tag": null, + "to": [ + -69.1, + 277.34 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "seg04", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 253, + 350, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 516, + 603, + 0 + ], + "tag": { + "end": 602, + "start": 596, + "type": "TagDeclarator", + "value": "seg03" + }, + "type": "chamfer" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 609, + 660, + 0 + ], + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg04" + }, + "type": "chamfer" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "to": [ + 344.23, + 317.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ] + }, + "from": [ + 344.23, + 317.2 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 344.23, + 99.94 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 253, + 350, + 0 + ] + }, + "from": [ + 344.23, + 99.94 + ], + "tag": null, + "to": [ + 75.8, + 99.94 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ] + }, + "from": [ + 75.8, + 99.94 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 417, + 425, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": null, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 75.8, + 317.2 + ], + "to": [ + 75.8, + 317.2 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 69, + 0 + ] + } + }, + "tags": { + "rectangleSegmentA001": { + "type": "TagIdentifier", + "value": "rectangleSegmentA001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "to": [ + 344.23, + 317.2 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 132, + 153, + 0 + ] + } + ] + }, + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ] + }, + "from": [ + 344.23, + 317.2 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 344.23, + 99.94 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 240, + 246, + 0 + ] + } + ] + }, + "seg02": { + "type": "TagIdentifier", + "value": "seg02", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ] + }, + "from": [ + 75.80000000000001, + 99.94 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 404, + 410, + 0 + ] + } + ] + }, + "seg03": { + "type": "TagIdentifier", + "value": "seg03", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": null, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 516, + 603, + 0 + ], + "tag": { + "end": 602, + "start": 596, + "type": "TagDeclarator", + "value": "seg03" + }, + "type": "chamfer" + } + }, + "__meta": [ + { + "sourceRange": [ + 596, + 602, + 0 + ] + } + ] + }, + "seg04": { + "type": "TagIdentifier", + "value": "seg04", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": null, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 609, + 660, + 0 + ], + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg04" + }, + "type": "chamfer" + } + }, + "__meta": [ + { + "sourceRange": [ + 653, + 659, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 37, + 69, + 0 + ] + } + ] + }, + "height": 100.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "edgeCuts": [ + { + "type": "fillet", + "id": "[uuid]", + "radius": 20.0, + "edgeId": "[uuid]", + "tag": null + }, + { + "type": "chamfer", + "id": "[uuid]", + "length": 50.0, + "edgeId": "[uuid]", + "tag": { + "end": 602, + "start": 596, + "type": "TagDeclarator", + "value": "seg03" + } + }, + { + "type": "chamfer", + "id": "[uuid]", + "length": 50.0, + "edgeId": "[uuid]", + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg04" + } + } + ], + "__meta": [ + { + "sourceRange": [ + 37, + 69, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 674, + 706, + 0 + ] + } + ] + }, + "start": { + "from": [ + -69.1, + 277.34 + ], + "to": [ + -69.1, + 277.34 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 712, + 746, + 0 + ] + } + }, + "tags": { + "rectangleSegmentA003": { + "type": "TagIdentifier", + "value": "rectangleSegmentA003", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 752, + 800, + 0 + ] + }, + "from": [ + -69.1, + 277.34 + ], + "tag": { + "end": 799, + "start": 778, + "type": "TagDeclarator", + "value": "rectangleSegmentA003" + }, + "to": [ + -27.619999999999997, + 277.34 + ], + "type": "ToPoint" + }, + "surface": null + }, + "__meta": [ + { + "sourceRange": [ + 778, + 799, + 0 + ] + } + ] + }, + "rectangleSegmentB002": { + "type": "TagIdentifier", + "value": "rectangleSegmentB002", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 806, + 907, + 0 + ] + }, + "from": [ + -27.619999999999997, + 277.34 + ], + "tag": { + "end": 906, + "start": 885, + "type": "TagDeclarator", + "value": "rectangleSegmentB002" + }, + "to": [ + -27.61999999999999, + 172.53999999999996 + ], + "type": "ToPoint" + }, + "surface": null + }, + "__meta": [ + { + "sourceRange": [ + 885, + 906, + 0 + ] + } + ] + }, + "rectangleSegmentC002": { + "type": "TagIdentifier", + "value": "rectangleSegmentC002", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 913, + 1033, + 0 + ] + }, + "from": [ + -27.61999999999999, + 172.53999999999996 + ], + "tag": { + "end": 1032, + "start": 1011, + "type": "TagDeclarator", + "value": "rectangleSegmentC002" + }, + "to": [ + -69.1, + 172.53999999999996 + ], + "type": "ToPoint" + }, + "surface": null + }, + "__meta": [ + { + "sourceRange": [ + 1011, + 1032, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 712, + 746, + 0 + ] + } + ] + } + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/rendered_model.png b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/rendered_model.png new file mode 100644 index 000000000..15fa02617 Binary files /dev/null and b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/ast.snap b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/ast.snap new file mode 100644 index 000000000..ce6cb39c1 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/ast.snap @@ -0,0 +1,1594 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing sketch-on-chamfer-two-times.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 425, + "id": { + "end": 9, + "name": "sketch001", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 30, + "raw": "'XZ'", + "start": 26, + "type": "Literal", + "type": "Literal", + "value": "XZ" + } + ], + "callee": { + "end": 25, + "name": "startSketchOn", + "start": 12, + "type": "Identifier" + }, + "end": 31, + "start": 12, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 57, + "raw": "75.8", + "start": 53, + "type": "Literal", + "type": "Literal", + "value": 75.8 + }, + { + "end": 64, + "raw": "317.2", + "start": 59, + "type": "Literal", + "type": "Literal", + "value": 317.2 + } + ], + "end": 65, + "start": 52, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 68, + "start": 67, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 51, + "name": "startProfileAt", + "start": 37, + "type": "Identifier" + }, + "end": 69, + "start": 37, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 118, + "raw": "0", + "start": 117, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 126, + "raw": "268.43", + "start": 120, + "type": "Literal", + "type": "Literal", + "value": 268.43 + } + ], + "end": 127, + "start": 116, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 130, + "start": 129, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + } + ], + "callee": { + "end": 115, + "name": "angledLine", + "start": 105, + "type": "Identifier" + }, + "end": 154, + "start": 105, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 213, + "left": { + "arguments": [ + { + "end": 207, + "name": "rectangleSegmentA001", + "start": 187, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 186, + "name": "segAng", + "start": 180, + "type": "Identifier" + }, + "end": 208, + "start": 180, + "type": "CallExpression", + "type": "CallExpression" + }, + "operator": "-", + "right": { + "end": 213, + "raw": "90", + "start": 211, + "type": "Literal", + "type": "Literal", + "value": 90.0 + }, + "start": 180, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 228, + "raw": "217.26", + "start": 222, + "type": "Literal", + "type": "Literal", + "value": 217.26 + } + ], + "end": 235, + "start": 171, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 238, + "start": 237, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "seg01" + } + ], + "callee": { + "end": 170, + "name": "angledLine", + "start": 160, + "type": "Identifier" + }, + "end": 247, + "start": 160, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "arguments": [ + { + "end": 300, + "name": "rectangleSegmentA001", + "start": 280, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 279, + "name": "segAng", + "start": 273, + "type": "Identifier" + }, + "end": 301, + "start": 273, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "argument": { + "arguments": [ + { + "end": 338, + "name": "rectangleSegmentA001", + "start": 318, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 317, + "name": "segLen", + "start": 311, + "type": "Identifier" + }, + "end": 339, + "start": 311, + "type": "CallExpression", + "type": "CallExpression" + }, + "end": 339, + "operator": "-", + "start": 310, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 346, + "start": 264, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 349, + "start": 348, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 263, + "name": "angledLine", + "start": 253, + "type": "Identifier" + }, + "end": 350, + "start": 253, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "arguments": [ + { + "end": 379, + "start": 378, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 377, + "name": "profileStartX", + "start": 364, + "type": "Identifier" + }, + "end": 380, + "start": 364, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 397, + "start": 396, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 395, + "name": "profileStartY", + "start": 382, + "type": "Identifier" + }, + "end": 398, + "start": 382, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 399, + "start": 363, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 402, + "start": 401, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "seg02" + } + ], + "callee": { + "end": 362, + "name": "lineTo", + "start": 356, + "type": "Identifier" + }, + "end": 411, + "start": 356, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 424, + "start": 423, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 422, + "name": "close", + "start": 417, + "type": "Identifier" + }, + "end": 425, + "start": 417, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 425, + "nonCodeMeta": { + "nonCodeNodes": { + "1": [ + { + "end": 99, + "start": 69, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "[$startCapTag, $EndCapTag]", + "style": "line" + } + } + ] + }, + "startNodes": [] + }, + "start": 12, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 425, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 660, + "id": { + "end": 436, + "name": "extrude001", + "start": 426, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 450, + "raw": "100", + "start": 447, + "type": "Literal", + "type": "Literal", + "value": 100.0 + }, + { + "end": 461, + "name": "sketch001", + "start": 452, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 446, + "name": "extrude", + "start": 439, + "type": "Identifier" + }, + "end": 462, + "start": 439, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 506, + "properties": [ + { + "end": 488, + "key": { + "end": 483, + "name": "radius", + "start": 477, + "type": "Identifier" + }, + "start": 477, + "type": "ObjectProperty", + "value": { + "end": 488, + "raw": "20", + "start": 486, + "type": "Literal", + "type": "Literal", + "value": 20.0 + } + }, + { + "end": 504, + "key": { + "end": 494, + "name": "tags", + "start": 490, + "type": "Identifier" + }, + "start": 490, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 503, + "name": "seg01", + "start": 498, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 504, + "start": 497, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "start": 475, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 509, + "start": 508, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 474, + "name": "fillet", + "start": 468, + "type": "Identifier" + }, + "end": 510, + "start": 468, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 555, + "properties": [ + { + "end": 537, + "key": { + "end": 532, + "name": "length", + "start": 526, + "type": "Identifier" + }, + "start": 526, + "type": "ObjectProperty", + "value": { + "end": 537, + "raw": "50", + "start": 535, + "type": "Literal", + "type": "Literal", + "value": 50.0 + } + }, + { + "end": 553, + "key": { + "end": 543, + "name": "tags", + "start": 539, + "type": "Identifier" + }, + "start": 539, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 552, + "name": "seg02", + "start": 547, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 553, + "start": 546, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "start": 524, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 558, + "start": 557, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 566, + "start": 560, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "seg04" + } + ], + "callee": { + "end": 523, + "name": "chamfer", + "start": 516, + "type": "Identifier" + }, + "end": 567, + "start": 516, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 648, + "properties": [ + { + "end": 601, + "key": { + "end": 596, + "name": "length", + "start": 590, + "type": "Identifier" + }, + "start": 590, + "type": "ObjectProperty", + "value": { + "end": 601, + "raw": "50", + "start": 599, + "type": "Literal", + "type": "Literal", + "value": 50.0 + } + }, + { + "end": 641, + "key": { + "end": 614, + "name": "tags", + "start": 610, + "type": "Identifier" + }, + "start": 610, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "arguments": [ + { + "end": 639, + "name": "seg01", + "start": 634, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 633, + "name": "getOppositeEdge", + "start": 618, + "type": "Identifier" + }, + "end": 640, + "start": 618, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 641, + "start": 617, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "start": 581, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 651, + "start": 650, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "seg03" + } + ], + "callee": { + "end": 580, + "name": "chamfer", + "start": 573, + "type": "Identifier" + }, + "end": 660, + "start": 573, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 660, + "start": 439, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 426, + "type": "VariableDeclarator" + }, + "end": 660, + "kind": "const", + "start": 426, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 1100, + "id": { + "end": 671, + "name": "sketch003", + "start": 662, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 698, + "name": "extrude001", + "start": 688, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 705, + "name": "seg04", + "start": 700, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 687, + "name": "startSketchOn", + "start": 674, + "type": "Identifier" + }, + "end": 706, + "start": 674, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 733, + "raw": "69.1", + "start": 729, + "type": "Literal", + "type": "Literal", + "value": 69.1 + }, + "end": 733, + "operator": "-", + "start": 728, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 741, + "raw": "277.34", + "start": 735, + "type": "Literal", + "type": "Literal", + "value": 277.34 + } + ], + "end": 742, + "start": 727, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 745, + "start": 744, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 726, + "name": "startProfileAt", + "start": 712, + "type": "Identifier" + }, + "end": 746, + "start": 712, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 765, + "raw": "0", + "start": 764, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 772, + "raw": "41.48", + "start": 767, + "type": "Literal", + "type": "Literal", + "value": 41.48 + } + ], + "end": 773, + "start": 763, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 776, + "start": 775, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 799, + "start": 778, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "rectangleSegmentA003" + } + ], + "callee": { + "end": 762, + "name": "angledLine", + "start": 752, + "type": "Identifier" + }, + "end": 800, + "start": 752, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 859, + "left": { + "arguments": [ + { + "end": 853, + "name": "rectangleSegmentA003", + "start": 833, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 832, + "name": "segAng", + "start": 826, + "type": "Identifier" + }, + "end": 854, + "start": 826, + "type": "CallExpression", + "type": "CallExpression" + }, + "operator": "-", + "right": { + "end": 859, + "raw": "90", + "start": 857, + "type": "Literal", + "type": "Literal", + "value": 90.0 + }, + "start": 826, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 873, + "raw": "104.8", + "start": 868, + "type": "Literal", + "type": "Literal", + "value": 104.8 + } + ], + "end": 880, + "start": 817, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 883, + "start": 882, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 906, + "start": 885, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "rectangleSegmentB002" + } + ], + "callee": { + "end": 816, + "name": "angledLine", + "start": 806, + "type": "Identifier" + }, + "end": 907, + "start": 806, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "arguments": [ + { + "end": 960, + "name": "rectangleSegmentA003", + "start": 940, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 939, + "name": "segAng", + "start": 933, + "type": "Identifier" + }, + "end": 961, + "start": 933, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "argument": { + "arguments": [ + { + "end": 998, + "name": "rectangleSegmentA003", + "start": 978, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 977, + "name": "segLen", + "start": 971, + "type": "Identifier" + }, + "end": 999, + "start": 971, + "type": "CallExpression", + "type": "CallExpression" + }, + "end": 999, + "operator": "-", + "start": 970, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1006, + "start": 924, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1009, + "start": 1008, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 1032, + "start": 1011, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "rectangleSegmentC002" + } + ], + "callee": { + "end": 923, + "name": "angledLine", + "start": 913, + "type": "Identifier" + }, + "end": 1033, + "start": 913, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "arguments": [ + { + "end": 1062, + "start": 1061, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1060, + "name": "profileStartX", + "start": 1047, + "type": "Identifier" + }, + "end": 1063, + "start": 1047, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1080, + "start": 1079, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1078, + "name": "profileStartY", + "start": 1065, + "type": "Identifier" + }, + "end": 1081, + "start": 1065, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 1082, + "start": 1046, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1085, + "start": 1084, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1045, + "name": "lineTo", + "start": 1039, + "type": "Identifier" + }, + "end": 1086, + "start": 1039, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1099, + "start": 1098, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1097, + "name": "close", + "start": 1092, + "type": "Identifier" + }, + "end": 1100, + "start": 1092, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 1100, + "start": 674, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 662, + "type": "VariableDeclarator" + }, + "end": 1100, + "kind": "const", + "start": 662, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 1541, + "id": { + "end": 1110, + "name": "sketch002", + "start": 1101, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 1137, + "name": "extrude001", + "start": 1127, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 1144, + "name": "seg03", + "start": 1139, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 1126, + "name": "startSketchOn", + "start": 1113, + "type": "Identifier" + }, + "end": 1145, + "start": 1113, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1173, + "raw": "159.25", + "start": 1167, + "type": "Literal", + "type": "Literal", + "value": 159.25 + }, + { + "end": 1181, + "raw": "278.35", + "start": 1175, + "type": "Literal", + "type": "Literal", + "value": 278.35 + } + ], + "end": 1182, + "start": 1166, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1185, + "start": 1184, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1165, + "name": "startProfileAt", + "start": 1151, + "type": "Identifier" + }, + "end": 1186, + "start": 1151, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1205, + "raw": "0", + "start": 1204, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 1212, + "raw": "40.82", + "start": 1207, + "type": "Literal", + "type": "Literal", + "value": 40.82 + } + ], + "end": 1213, + "start": 1203, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1216, + "start": 1215, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 1239, + "start": 1218, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "rectangleSegmentA002" + } + ], + "callee": { + "end": 1202, + "name": "angledLine", + "start": 1192, + "type": "Identifier" + }, + "end": 1240, + "start": 1192, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1299, + "left": { + "arguments": [ + { + "end": 1293, + "name": "rectangleSegmentA002", + "start": 1273, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 1272, + "name": "segAng", + "start": 1266, + "type": "Identifier" + }, + "end": 1294, + "start": 1266, + "type": "CallExpression", + "type": "CallExpression" + }, + "operator": "-", + "right": { + "end": 1299, + "raw": "90", + "start": 1297, + "type": "Literal", + "type": "Literal", + "value": 90.0 + }, + "start": 1266, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 1314, + "raw": "132.27", + "start": 1308, + "type": "Literal", + "type": "Literal", + "value": 132.27 + } + ], + "end": 1321, + "start": 1257, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1324, + "start": 1323, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 1347, + "start": 1326, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "rectangleSegmentB001" + } + ], + "callee": { + "end": 1256, + "name": "angledLine", + "start": 1246, + "type": "Identifier" + }, + "end": 1348, + "start": 1246, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "arguments": [ + { + "end": 1401, + "name": "rectangleSegmentA002", + "start": 1381, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 1380, + "name": "segAng", + "start": 1374, + "type": "Identifier" + }, + "end": 1402, + "start": 1374, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "argument": { + "arguments": [ + { + "end": 1439, + "name": "rectangleSegmentA002", + "start": 1419, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 1418, + "name": "segLen", + "start": 1412, + "type": "Identifier" + }, + "end": 1440, + "start": 1412, + "type": "CallExpression", + "type": "CallExpression" + }, + "end": 1440, + "operator": "-", + "start": 1411, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1447, + "start": 1365, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1450, + "start": 1449, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 1473, + "start": 1452, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "rectangleSegmentC001" + } + ], + "callee": { + "end": 1364, + "name": "angledLine", + "start": 1354, + "type": "Identifier" + }, + "end": 1474, + "start": 1354, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "arguments": [ + { + "end": 1503, + "start": 1502, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1501, + "name": "profileStartX", + "start": 1488, + "type": "Identifier" + }, + "end": 1504, + "start": 1488, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1521, + "start": 1520, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1519, + "name": "profileStartY", + "start": 1506, + "type": "Identifier" + }, + "end": 1522, + "start": 1506, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 1523, + "start": 1487, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1526, + "start": 1525, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1486, + "name": "lineTo", + "start": 1480, + "type": "Identifier" + }, + "end": 1527, + "start": 1480, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1540, + "start": 1539, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1538, + "name": "close", + "start": 1533, + "type": "Identifier" + }, + "end": 1541, + "start": 1533, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 1541, + "start": 1113, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 1101, + "type": "VariableDeclarator" + }, + "end": 1541, + "kind": "const", + "start": 1101, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 1577, + "id": { + "end": 1552, + "name": "extrude002", + "start": 1542, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 1565, + "raw": "50", + "start": 1563, + "type": "Literal", + "type": "Literal", + "value": 50.0 + }, + { + "end": 1576, + "name": "sketch002", + "start": 1567, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 1562, + "name": "extrude", + "start": 1555, + "type": "Identifier" + }, + "end": 1577, + "start": 1555, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 1542, + "type": "VariableDeclarator" + }, + "end": 1577, + "kind": "const", + "start": 1542, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 1578, + "nonCodeMeta": { + "nonCodeNodes": { + "1": [ + { + "end": 662, + "start": 660, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/input.kcl b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/input.kcl new file mode 100644 index 000000000..2a2a08152 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/input.kcl @@ -0,0 +1,48 @@ +sketch001 = startSketchOn('XZ') + |> startProfileAt([75.8, 317.2], %) // [$startCapTag, $EndCapTag] + |> angledLine([0, 268.43], %, $rectangleSegmentA001) + |> angledLine([ + segAng(rectangleSegmentA001) - 90, + 217.26 + ], %, $seg01) + |> angledLine([ + segAng(rectangleSegmentA001), + -segLen(rectangleSegmentA001) + ], %) + |> lineTo([profileStartX(%), profileStartY(%)], %, $seg02) + |> close(%) +extrude001 = extrude(100, sketch001) + |> fillet({ radius = 20, tags = [seg01] }, %) + |> chamfer({ length = 50, tags = [seg02] }, %, $seg04) + |> chamfer({ + length = 50, + tags = [getOppositeEdge(seg01)] + }, %, $seg03) + +sketch003 = startSketchOn(extrude001, seg04) + |> startProfileAt([-69.1, 277.34], %) + |> angledLine([0, 41.48], %, $rectangleSegmentA003) + |> angledLine([ + segAng(rectangleSegmentA003) - 90, + 104.8 + ], %, $rectangleSegmentB002) + |> angledLine([ + segAng(rectangleSegmentA003), + -segLen(rectangleSegmentA003) + ], %, $rectangleSegmentC002) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) +sketch002 = startSketchOn(extrude001, seg03) + |> startProfileAt([159.25, 278.35], %) + |> angledLine([0, 40.82], %, $rectangleSegmentA002) + |> angledLine([ + segAng(rectangleSegmentA002) - 90, + 132.27 + ], %, $rectangleSegmentB001) + |> angledLine([ + segAng(rectangleSegmentA002), + -segLen(rectangleSegmentA002) + ], %, $rectangleSegmentC001) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) +extrude002 = extrude(50, sketch002) diff --git a/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/ops.snap b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/ops.snap new file mode 100644 index 000000000..78f22fbbb --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/ops.snap @@ -0,0 +1,222 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed sketch-on-chamfer-two-times.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 26, + 30, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 12, + 31, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 447, + 450, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 452, + 461, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 439, + 462, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 475, + 506, + 0 + ] + }, + "solid": { + "sourceRange": [ + 508, + 509, + 0 + ] + } + }, + "name": "fillet", + "sourceRange": [ + 468, + 510, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 524, + 555, + 0 + ] + }, + "solid": { + "sourceRange": [ + 557, + 558, + 0 + ] + }, + "tag": { + "sourceRange": [ + 560, + 566, + 0 + ] + } + }, + "name": "chamfer", + "sourceRange": [ + 516, + 567, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 581, + 648, + 0 + ] + }, + "solid": { + "sourceRange": [ + 650, + 651, + 0 + ] + }, + "tag": { + "sourceRange": [ + 653, + 659, + 0 + ] + } + }, + "name": "chamfer", + "sourceRange": [ + 573, + 660, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 688, + 698, + 0 + ] + }, + "tag": { + "sourceRange": [ + 700, + 705, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 674, + 706, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 1127, + 1137, + 0 + ] + }, + "tag": { + "sourceRange": [ + 1139, + 1144, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 1113, + 1145, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 1563, + 1565, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 1567, + 1576, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 1555, + 1577, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/program_memory.snap b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/program_memory.snap new file mode 100644 index 000000000..7fa5c01da --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/program_memory.snap @@ -0,0 +1,4405 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing sketch-on-chamfer-two-times.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "extrude001": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 253, + 350, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 516, + 567, + 0 + ], + "tag": { + "end": 566, + "start": 560, + "type": "TagDeclarator", + "value": "seg04" + }, + "type": "chamfer" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 573, + 660, + 0 + ], + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg03" + }, + "type": "chamfer" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "to": [ + 344.23, + 317.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ] + }, + "from": [ + 344.23, + 317.2 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 344.23, + 99.94 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 253, + 350, + 0 + ] + }, + "from": [ + 344.23, + 99.94 + ], + "tag": null, + "to": [ + 75.8, + 99.94 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ] + }, + "from": [ + 75.8, + 99.94 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 417, + 425, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": null, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 75.8, + 317.2 + ], + "to": [ + 75.8, + 317.2 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 69, + 0 + ] + } + }, + "tags": { + "rectangleSegmentA001": { + "type": "TagIdentifier", + "value": "rectangleSegmentA001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "to": [ + 344.23, + 317.2 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 132, + 153, + 0 + ] + } + ] + }, + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ] + }, + "from": [ + 344.23, + 317.2 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 344.23, + 99.94 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 240, + 246, + 0 + ] + } + ] + }, + "seg02": { + "type": "TagIdentifier", + "value": "seg02", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ] + }, + "from": [ + 75.80000000000001, + 99.94 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 404, + 410, + 0 + ] + } + ] + }, + "seg03": { + "type": "TagIdentifier", + "value": "seg03", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": null, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 573, + 660, + 0 + ], + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg03" + }, + "type": "chamfer" + } + }, + "__meta": [ + { + "sourceRange": [ + 653, + 659, + 0 + ] + } + ] + }, + "seg04": { + "type": "TagIdentifier", + "value": "seg04", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": null, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 516, + 567, + 0 + ], + "tag": { + "end": 566, + "start": 560, + "type": "TagDeclarator", + "value": "seg04" + }, + "type": "chamfer" + } + }, + "__meta": [ + { + "sourceRange": [ + 560, + 566, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 37, + 69, + 0 + ] + } + ] + }, + "height": 100.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "edgeCuts": [ + { + "type": "fillet", + "id": "[uuid]", + "radius": 20.0, + "edgeId": "[uuid]", + "tag": null + }, + { + "type": "chamfer", + "id": "[uuid]", + "length": 50.0, + "edgeId": "[uuid]", + "tag": { + "end": 566, + "start": 560, + "type": "TagDeclarator", + "value": "seg04" + } + }, + { + "type": "chamfer", + "id": "[uuid]", + "length": 50.0, + "edgeId": "[uuid]", + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg03" + } + } + ], + "__meta": [ + { + "sourceRange": [ + 37, + 69, + 0 + ] + } + ] + }, + "extrude002": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1192, + 1240, + 0 + ], + "tag": { + "end": 1239, + "start": 1218, + "type": "TagDeclarator", + "value": "rectangleSegmentA002" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1246, + 1348, + 0 + ], + "tag": { + "end": 1347, + "start": 1326, + "type": "TagDeclarator", + "value": "rectangleSegmentB001" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1354, + 1474, + 0 + ], + "tag": { + "end": 1473, + "start": 1452, + "type": "TagDeclarator", + "value": "rectangleSegmentC001" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1480, + 1527, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1192, + 1240, + 0 + ] + }, + "from": [ + 159.25, + 278.35 + ], + "tag": { + "end": 1239, + "start": 1218, + "type": "TagDeclarator", + "value": "rectangleSegmentA002" + }, + "to": [ + 200.07, + 278.35 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1246, + 1348, + 0 + ] + }, + "from": [ + 200.07, + 278.35 + ], + "tag": { + "end": 1347, + "start": 1326, + "type": "TagDeclarator", + "value": "rectangleSegmentB001" + }, + "to": [ + 200.07, + 146.08 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1354, + 1474, + 0 + ] + }, + "from": [ + 200.07, + 146.08 + ], + "tag": { + "end": 1473, + "start": 1452, + "type": "TagDeclarator", + "value": "rectangleSegmentC001" + }, + "to": [ + 159.25, + 146.08 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1480, + 1527, + 0 + ] + }, + "from": [ + 159.25, + 146.08 + ], + "tag": null, + "to": [ + 159.25, + 278.35 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1533, + 1541, + 0 + ] + }, + "from": [ + 159.25, + 278.35 + ], + "tag": null, + "to": [ + 159.25, + 278.35 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "seg03", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 253, + 350, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 516, + 567, + 0 + ], + "tag": { + "end": 566, + "start": 560, + "type": "TagDeclarator", + "value": "seg04" + }, + "type": "chamfer" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 573, + 660, + 0 + ], + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg03" + }, + "type": "chamfer" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "to": [ + 344.23, + 317.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ] + }, + "from": [ + 344.23, + 317.2 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 344.23, + 99.94 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 253, + 350, + 0 + ] + }, + "from": [ + 344.23, + 99.94 + ], + "tag": null, + "to": [ + 75.8, + 99.94 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ] + }, + "from": [ + 75.8, + 99.94 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 417, + 425, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": null, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 75.8, + 317.2 + ], + "to": [ + 75.8, + 317.2 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 69, + 0 + ] + } + }, + "tags": { + "rectangleSegmentA001": { + "type": "TagIdentifier", + "value": "rectangleSegmentA001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "to": [ + 344.23, + 317.2 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 132, + 153, + 0 + ] + } + ] + }, + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ] + }, + "from": [ + 344.23, + 317.2 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 344.23, + 99.94 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 240, + 246, + 0 + ] + } + ] + }, + "seg02": { + "type": "TagIdentifier", + "value": "seg02", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ] + }, + "from": [ + 75.80000000000001, + 99.94 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 404, + 410, + 0 + ] + } + ] + }, + "seg03": { + "type": "TagIdentifier", + "value": "seg03", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": null, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 573, + 660, + 0 + ], + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg03" + }, + "type": "chamfer" + } + }, + "__meta": [ + { + "sourceRange": [ + 653, + 659, + 0 + ] + } + ] + }, + "seg04": { + "type": "TagIdentifier", + "value": "seg04", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": null, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 516, + 567, + 0 + ], + "tag": { + "end": 566, + "start": 560, + "type": "TagDeclarator", + "value": "seg04" + }, + "type": "chamfer" + } + }, + "__meta": [ + { + "sourceRange": [ + 560, + 566, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 37, + 69, + 0 + ] + } + ] + }, + "height": 100.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "edgeCuts": [ + { + "type": "fillet", + "id": "[uuid]", + "radius": 20.0, + "edgeId": "[uuid]", + "tag": null + }, + { + "type": "chamfer", + "id": "[uuid]", + "length": 50.0, + "edgeId": "[uuid]", + "tag": { + "end": 566, + "start": 560, + "type": "TagDeclarator", + "value": "seg04" + } + }, + { + "type": "chamfer", + "id": "[uuid]", + "length": 50.0, + "edgeId": "[uuid]", + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg03" + } + } + ], + "__meta": [ + { + "sourceRange": [ + 37, + 69, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 1113, + 1145, + 0 + ] + } + ] + }, + "start": { + "from": [ + 159.25, + 278.35 + ], + "to": [ + 159.25, + 278.35 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1151, + 1186, + 0 + ] + } + }, + "tags": { + "rectangleSegmentA002": { + "type": "TagIdentifier", + "value": "rectangleSegmentA002", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1192, + 1240, + 0 + ] + }, + "from": [ + 159.25, + 278.35 + ], + "tag": { + "end": 1239, + "start": 1218, + "type": "TagDeclarator", + "value": "rectangleSegmentA002" + }, + "to": [ + 200.07, + 278.35 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1192, + 1240, + 0 + ], + "tag": { + "end": 1239, + "start": 1218, + "type": "TagDeclarator", + "value": "rectangleSegmentA002" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1218, + 1239, + 0 + ] + } + ] + }, + "rectangleSegmentB001": { + "type": "TagIdentifier", + "value": "rectangleSegmentB001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1246, + 1348, + 0 + ] + }, + "from": [ + 200.07, + 278.35 + ], + "tag": { + "end": 1347, + "start": 1326, + "type": "TagDeclarator", + "value": "rectangleSegmentB001" + }, + "to": [ + 200.07, + 146.08 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1246, + 1348, + 0 + ], + "tag": { + "end": 1347, + "start": 1326, + "type": "TagDeclarator", + "value": "rectangleSegmentB001" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1326, + 1347, + 0 + ] + } + ] + }, + "rectangleSegmentC001": { + "type": "TagIdentifier", + "value": "rectangleSegmentC001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1354, + 1474, + 0 + ] + }, + "from": [ + 200.07, + 146.08 + ], + "tag": { + "end": 1473, + "start": 1452, + "type": "TagDeclarator", + "value": "rectangleSegmentC001" + }, + "to": [ + 159.25, + 146.08 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1354, + 1474, + 0 + ], + "tag": { + "end": 1473, + "start": 1452, + "type": "TagDeclarator", + "value": "rectangleSegmentC001" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1452, + 1473, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 1151, + 1186, + 0 + ] + } + ] + }, + "height": 50.0, + "startCapId": null, + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 1151, + 1186, + 0 + ] + } + ] + }, + "rectangleSegmentA001": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "rectangleSegmentA001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "to": [ + 344.23, + 317.2 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 132, + 153, + 0 + ] + } + ] + }, + "rectangleSegmentA002": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "rectangleSegmentA002", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1192, + 1240, + 0 + ] + }, + "from": [ + 159.25, + 278.35 + ], + "tag": { + "end": 1239, + "start": 1218, + "type": "TagDeclarator", + "value": "rectangleSegmentA002" + }, + "to": [ + 200.07, + 278.35 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1192, + 1240, + 0 + ], + "tag": { + "end": 1239, + "start": 1218, + "type": "TagDeclarator", + "value": "rectangleSegmentA002" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1218, + 1239, + 0 + ] + } + ] + }, + "rectangleSegmentA003": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "rectangleSegmentA003", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 752, + 800, + 0 + ] + }, + "from": [ + -69.1, + 277.34 + ], + "tag": { + "end": 799, + "start": 778, + "type": "TagDeclarator", + "value": "rectangleSegmentA003" + }, + "to": [ + -27.619999999999997, + 277.34 + ], + "type": "ToPoint" + }, + "surface": null + }, + "__meta": [ + { + "sourceRange": [ + 778, + 799, + 0 + ] + } + ] + }, + "rectangleSegmentB001": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "rectangleSegmentB001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1246, + 1348, + 0 + ] + }, + "from": [ + 200.07, + 278.35 + ], + "tag": { + "end": 1347, + "start": 1326, + "type": "TagDeclarator", + "value": "rectangleSegmentB001" + }, + "to": [ + 200.07, + 146.08 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1246, + 1348, + 0 + ], + "tag": { + "end": 1347, + "start": 1326, + "type": "TagDeclarator", + "value": "rectangleSegmentB001" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1326, + 1347, + 0 + ] + } + ] + }, + "rectangleSegmentB002": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "rectangleSegmentB002", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 806, + 907, + 0 + ] + }, + "from": [ + -27.619999999999997, + 277.34 + ], + "tag": { + "end": 906, + "start": 885, + "type": "TagDeclarator", + "value": "rectangleSegmentB002" + }, + "to": [ + -27.61999999999999, + 172.53999999999996 + ], + "type": "ToPoint" + }, + "surface": null + }, + "__meta": [ + { + "sourceRange": [ + 885, + 906, + 0 + ] + } + ] + }, + "rectangleSegmentC001": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "rectangleSegmentC001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1354, + 1474, + 0 + ] + }, + "from": [ + 200.07, + 146.08 + ], + "tag": { + "end": 1473, + "start": 1452, + "type": "TagDeclarator", + "value": "rectangleSegmentC001" + }, + "to": [ + 159.25, + 146.08 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1354, + 1474, + 0 + ], + "tag": { + "end": 1473, + "start": 1452, + "type": "TagDeclarator", + "value": "rectangleSegmentC001" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1452, + 1473, + 0 + ] + } + ] + }, + "rectangleSegmentC002": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "rectangleSegmentC002", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 913, + 1033, + 0 + ] + }, + "from": [ + -27.61999999999999, + 172.53999999999996 + ], + "tag": { + "end": 1032, + "start": 1011, + "type": "TagDeclarator", + "value": "rectangleSegmentC002" + }, + "to": [ + -69.1, + 172.53999999999996 + ], + "type": "ToPoint" + }, + "surface": null + }, + "__meta": [ + { + "sourceRange": [ + 1011, + 1032, + 0 + ] + } + ] + }, + "seg01": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ] + }, + "from": [ + 344.23, + 317.2 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 344.23, + 99.94 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 240, + 246, + 0 + ] + } + ] + }, + "seg02": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "seg02", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ] + }, + "from": [ + 75.80000000000001, + 99.94 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 404, + 410, + 0 + ] + } + ] + }, + "seg03": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "seg03", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": null, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 573, + 660, + 0 + ], + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg03" + }, + "type": "chamfer" + } + }, + "__meta": [ + { + "sourceRange": [ + 653, + 659, + 0 + ] + } + ] + }, + "seg04": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "seg04", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": null, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 516, + 567, + 0 + ], + "tag": { + "end": 566, + "start": 560, + "type": "TagDeclarator", + "value": "seg04" + }, + "type": "chamfer" + } + }, + "__meta": [ + { + "sourceRange": [ + 560, + 566, + 0 + ] + } + ] + }, + "sketch001": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "to": [ + 344.23, + 317.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ] + }, + "from": [ + 344.23, + 317.2 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 344.23, + 99.94 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 253, + 350, + 0 + ] + }, + "from": [ + 344.23, + 99.94 + ], + "tag": null, + "to": [ + 75.8, + 99.94 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ] + }, + "from": [ + 75.8, + 99.94 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 417, + 425, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": null, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 75.8, + 317.2 + ], + "to": [ + 75.8, + 317.2 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 69, + 0 + ] + } + }, + "tags": { + "rectangleSegmentA001": { + "type": "TagIdentifier", + "value": "rectangleSegmentA001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "to": [ + 344.23, + 317.2 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 132, + 153, + 0 + ] + } + ] + }, + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ] + }, + "from": [ + 344.23, + 317.2 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 344.23, + 99.94 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 240, + 246, + 0 + ] + } + ] + }, + "seg02": { + "type": "TagIdentifier", + "value": "seg02", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ] + }, + "from": [ + 75.80000000000001, + 99.94 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 404, + 410, + 0 + ] + } + ] + }, + "seg03": { + "type": "TagIdentifier", + "value": "seg03", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": null, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 573, + 660, + 0 + ], + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg03" + }, + "type": "chamfer" + } + }, + "__meta": [ + { + "sourceRange": [ + 653, + 659, + 0 + ] + } + ] + }, + "seg04": { + "type": "TagIdentifier", + "value": "seg04", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": null, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 516, + 567, + 0 + ], + "tag": { + "end": 566, + "start": 560, + "type": "TagDeclarator", + "value": "seg04" + }, + "type": "chamfer" + } + }, + "__meta": [ + { + "sourceRange": [ + 560, + 566, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 37, + 69, + 0 + ] + } + ] + } + }, + "sketch002": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1192, + 1240, + 0 + ] + }, + "from": [ + 159.25, + 278.35 + ], + "tag": { + "end": 1239, + "start": 1218, + "type": "TagDeclarator", + "value": "rectangleSegmentA002" + }, + "to": [ + 200.07, + 278.35 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1246, + 1348, + 0 + ] + }, + "from": [ + 200.07, + 278.35 + ], + "tag": { + "end": 1347, + "start": 1326, + "type": "TagDeclarator", + "value": "rectangleSegmentB001" + }, + "to": [ + 200.07, + 146.08 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1354, + 1474, + 0 + ] + }, + "from": [ + 200.07, + 146.08 + ], + "tag": { + "end": 1473, + "start": 1452, + "type": "TagDeclarator", + "value": "rectangleSegmentC001" + }, + "to": [ + 159.25, + 146.08 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1480, + 1527, + 0 + ] + }, + "from": [ + 159.25, + 146.08 + ], + "tag": null, + "to": [ + 159.25, + 278.35 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1533, + 1541, + 0 + ] + }, + "from": [ + 159.25, + 278.35 + ], + "tag": null, + "to": [ + 159.25, + 278.35 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "seg03", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 253, + 350, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 516, + 567, + 0 + ], + "tag": { + "end": 566, + "start": 560, + "type": "TagDeclarator", + "value": "seg04" + }, + "type": "chamfer" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 573, + 660, + 0 + ], + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg03" + }, + "type": "chamfer" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "to": [ + 344.23, + 317.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ] + }, + "from": [ + 344.23, + 317.2 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 344.23, + 99.94 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 253, + 350, + 0 + ] + }, + "from": [ + 344.23, + 99.94 + ], + "tag": null, + "to": [ + 75.8, + 99.94 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ] + }, + "from": [ + 75.8, + 99.94 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 417, + 425, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": null, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 75.8, + 317.2 + ], + "to": [ + 75.8, + 317.2 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 69, + 0 + ] + } + }, + "tags": { + "rectangleSegmentA001": { + "type": "TagIdentifier", + "value": "rectangleSegmentA001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "to": [ + 344.23, + 317.2 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 132, + 153, + 0 + ] + } + ] + }, + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ] + }, + "from": [ + 344.23, + 317.2 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 344.23, + 99.94 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 240, + 246, + 0 + ] + } + ] + }, + "seg02": { + "type": "TagIdentifier", + "value": "seg02", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ] + }, + "from": [ + 75.80000000000001, + 99.94 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 404, + 410, + 0 + ] + } + ] + }, + "seg03": { + "type": "TagIdentifier", + "value": "seg03", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": null, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 573, + 660, + 0 + ], + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg03" + }, + "type": "chamfer" + } + }, + "__meta": [ + { + "sourceRange": [ + 653, + 659, + 0 + ] + } + ] + }, + "seg04": { + "type": "TagIdentifier", + "value": "seg04", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": null, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 516, + 567, + 0 + ], + "tag": { + "end": 566, + "start": 560, + "type": "TagDeclarator", + "value": "seg04" + }, + "type": "chamfer" + } + }, + "__meta": [ + { + "sourceRange": [ + 560, + 566, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 37, + 69, + 0 + ] + } + ] + }, + "height": 100.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "edgeCuts": [ + { + "type": "fillet", + "id": "[uuid]", + "radius": 20.0, + "edgeId": "[uuid]", + "tag": null + }, + { + "type": "chamfer", + "id": "[uuid]", + "length": 50.0, + "edgeId": "[uuid]", + "tag": { + "end": 566, + "start": 560, + "type": "TagDeclarator", + "value": "seg04" + } + }, + { + "type": "chamfer", + "id": "[uuid]", + "length": 50.0, + "edgeId": "[uuid]", + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg03" + } + } + ], + "__meta": [ + { + "sourceRange": [ + 37, + 69, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 1113, + 1145, + 0 + ] + } + ] + }, + "start": { + "from": [ + 159.25, + 278.35 + ], + "to": [ + 159.25, + 278.35 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1151, + 1186, + 0 + ] + } + }, + "tags": { + "rectangleSegmentA002": { + "type": "TagIdentifier", + "value": "rectangleSegmentA002", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1192, + 1240, + 0 + ] + }, + "from": [ + 159.25, + 278.35 + ], + "tag": { + "end": 1239, + "start": 1218, + "type": "TagDeclarator", + "value": "rectangleSegmentA002" + }, + "to": [ + 200.07, + 278.35 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1192, + 1240, + 0 + ], + "tag": { + "end": 1239, + "start": 1218, + "type": "TagDeclarator", + "value": "rectangleSegmentA002" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1218, + 1239, + 0 + ] + } + ] + }, + "rectangleSegmentB001": { + "type": "TagIdentifier", + "value": "rectangleSegmentB001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1246, + 1348, + 0 + ] + }, + "from": [ + 200.07, + 278.35 + ], + "tag": { + "end": 1347, + "start": 1326, + "type": "TagDeclarator", + "value": "rectangleSegmentB001" + }, + "to": [ + 200.07, + 146.08 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1246, + 1348, + 0 + ], + "tag": { + "end": 1347, + "start": 1326, + "type": "TagDeclarator", + "value": "rectangleSegmentB001" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1326, + 1347, + 0 + ] + } + ] + }, + "rectangleSegmentC001": { + "type": "TagIdentifier", + "value": "rectangleSegmentC001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1354, + 1474, + 0 + ] + }, + "from": [ + 200.07, + 146.08 + ], + "tag": { + "end": 1473, + "start": 1452, + "type": "TagDeclarator", + "value": "rectangleSegmentC001" + }, + "to": [ + 159.25, + 146.08 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1354, + 1474, + 0 + ], + "tag": { + "end": 1473, + "start": 1452, + "type": "TagDeclarator", + "value": "rectangleSegmentC001" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1452, + 1473, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 1151, + 1186, + 0 + ] + } + ] + } + }, + "sketch003": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 752, + 800, + 0 + ] + }, + "from": [ + -69.1, + 277.34 + ], + "tag": { + "end": 799, + "start": 778, + "type": "TagDeclarator", + "value": "rectangleSegmentA003" + }, + "to": [ + -27.62, + 277.34 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 806, + 907, + 0 + ] + }, + "from": [ + -27.62, + 277.34 + ], + "tag": { + "end": 906, + "start": 885, + "type": "TagDeclarator", + "value": "rectangleSegmentB002" + }, + "to": [ + -27.62, + 172.54 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 913, + 1033, + 0 + ] + }, + "from": [ + -27.62, + 172.54 + ], + "tag": { + "end": 1032, + "start": 1011, + "type": "TagDeclarator", + "value": "rectangleSegmentC002" + }, + "to": [ + -69.1, + 172.54 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1039, + 1086, + 0 + ] + }, + "from": [ + -69.1, + 172.54 + ], + "tag": null, + "to": [ + -69.1, + 277.34 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1092, + 1100, + 0 + ] + }, + "from": [ + -69.1, + 277.34 + ], + "tag": null, + "to": [ + -69.1, + 277.34 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "seg04", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 253, + 350, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 516, + 567, + 0 + ], + "tag": { + "end": 566, + "start": 560, + "type": "TagDeclarator", + "value": "seg04" + }, + "type": "chamfer" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 573, + 660, + 0 + ], + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg03" + }, + "type": "chamfer" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "to": [ + 344.23, + 317.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ] + }, + "from": [ + 344.23, + 317.2 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 344.23, + 99.94 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 253, + 350, + 0 + ] + }, + "from": [ + 344.23, + 99.94 + ], + "tag": null, + "to": [ + 75.8, + 99.94 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ] + }, + "from": [ + 75.8, + 99.94 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 417, + 425, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": null, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 75.8, + 317.2 + ], + "to": [ + 75.8, + 317.2 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 69, + 0 + ] + } + }, + "tags": { + "rectangleSegmentA001": { + "type": "TagIdentifier", + "value": "rectangleSegmentA001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ] + }, + "from": [ + 75.8, + 317.2 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "to": [ + 344.23, + 317.2 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 105, + 154, + 0 + ], + "tag": { + "end": 153, + "start": 132, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 132, + 153, + 0 + ] + } + ] + }, + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ] + }, + "from": [ + 344.23, + 317.2 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 344.23, + 99.94 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 160, + 247, + 0 + ], + "tag": { + "end": 246, + "start": 240, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 240, + 246, + 0 + ] + } + ] + }, + "seg02": { + "type": "TagIdentifier", + "value": "seg02", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ] + }, + "from": [ + 75.80000000000001, + 99.94 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 75.8, + 317.2 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 356, + 411, + 0 + ], + "tag": { + "end": 410, + "start": 404, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 404, + 410, + 0 + ] + } + ] + }, + "seg03": { + "type": "TagIdentifier", + "value": "seg03", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": null, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 573, + 660, + 0 + ], + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg03" + }, + "type": "chamfer" + } + }, + "__meta": [ + { + "sourceRange": [ + 653, + 659, + 0 + ] + } + ] + }, + "seg04": { + "type": "TagIdentifier", + "value": "seg04", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": null, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 516, + 567, + 0 + ], + "tag": { + "end": 566, + "start": 560, + "type": "TagDeclarator", + "value": "seg04" + }, + "type": "chamfer" + } + }, + "__meta": [ + { + "sourceRange": [ + 560, + 566, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 37, + 69, + 0 + ] + } + ] + }, + "height": 100.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "edgeCuts": [ + { + "type": "fillet", + "id": "[uuid]", + "radius": 20.0, + "edgeId": "[uuid]", + "tag": null + }, + { + "type": "chamfer", + "id": "[uuid]", + "length": 50.0, + "edgeId": "[uuid]", + "tag": { + "end": 566, + "start": 560, + "type": "TagDeclarator", + "value": "seg04" + } + }, + { + "type": "chamfer", + "id": "[uuid]", + "length": 50.0, + "edgeId": "[uuid]", + "tag": { + "end": 659, + "start": 653, + "type": "TagDeclarator", + "value": "seg03" + } + } + ], + "__meta": [ + { + "sourceRange": [ + 37, + 69, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 674, + 706, + 0 + ] + } + ] + }, + "start": { + "from": [ + -69.1, + 277.34 + ], + "to": [ + -69.1, + 277.34 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 712, + 746, + 0 + ] + } + }, + "tags": { + "rectangleSegmentA003": { + "type": "TagIdentifier", + "value": "rectangleSegmentA003", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 752, + 800, + 0 + ] + }, + "from": [ + -69.1, + 277.34 + ], + "tag": { + "end": 799, + "start": 778, + "type": "TagDeclarator", + "value": "rectangleSegmentA003" + }, + "to": [ + -27.619999999999997, + 277.34 + ], + "type": "ToPoint" + }, + "surface": null + }, + "__meta": [ + { + "sourceRange": [ + 778, + 799, + 0 + ] + } + ] + }, + "rectangleSegmentB002": { + "type": "TagIdentifier", + "value": "rectangleSegmentB002", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 806, + 907, + 0 + ] + }, + "from": [ + -27.619999999999997, + 277.34 + ], + "tag": { + "end": 906, + "start": 885, + "type": "TagDeclarator", + "value": "rectangleSegmentB002" + }, + "to": [ + -27.61999999999999, + 172.53999999999996 + ], + "type": "ToPoint" + }, + "surface": null + }, + "__meta": [ + { + "sourceRange": [ + 885, + 906, + 0 + ] + } + ] + }, + "rectangleSegmentC002": { + "type": "TagIdentifier", + "value": "rectangleSegmentC002", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 913, + 1033, + 0 + ] + }, + "from": [ + -27.61999999999999, + 172.53999999999996 + ], + "tag": { + "end": 1032, + "start": 1011, + "type": "TagDeclarator", + "value": "rectangleSegmentC002" + }, + "to": [ + -69.1, + 172.53999999999996 + ], + "type": "ToPoint" + }, + "surface": null + }, + "__meta": [ + { + "sourceRange": [ + 1011, + 1032, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 712, + 746, + 0 + ] + } + ] + } + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/rendered_model.png b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/rendered_model.png new file mode 100644 index 000000000..15fa02617 Binary files /dev/null and b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/sketch_in_object/ast.snap b/src/wasm-lib/kcl/tests/sketch_in_object/ast.snap new file mode 100644 index 000000000..4bc9c77b5 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_in_object/ast.snap @@ -0,0 +1,820 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing sketch_in_object.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 161, + "id": { + "end": 7, + "name": "test", + "start": 3, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "body": [ + { + "arguments": [ + { + "end": 39, + "raw": "'XY'", + "start": 35, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 34, + "name": "startSketchOn", + "start": 21, + "type": "Identifier" + }, + "end": 40, + "start": 21, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 65, + "raw": "0", + "start": 64, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 68, + "raw": "0", + "start": 67, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 69, + "start": 63, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 72, + "start": 71, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 62, + "name": "startProfileAt", + "start": 48, + "type": "Identifier" + }, + "end": 73, + "start": 48, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 88, + "raw": "0", + "start": 87, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 91, + "raw": "1", + "start": 90, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + ], + "end": 92, + "start": 86, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 95, + "start": 94, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 85, + "name": "line", + "start": 81, + "type": "Identifier" + }, + "end": 96, + "start": 81, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 111, + "raw": "1", + "start": 110, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 114, + "raw": "0", + "start": 113, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 115, + "start": 109, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 118, + "start": 117, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 108, + "name": "line", + "start": 104, + "type": "Identifier" + }, + "end": 119, + "start": 104, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 134, + "raw": "0", + "start": 133, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 138, + "raw": "1", + "start": 137, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "end": 138, + "operator": "-", + "start": 136, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 139, + "start": 132, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 142, + "start": 141, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 131, + "name": "line", + "start": 127, + "type": "Identifier" + }, + "end": 143, + "start": 127, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 158, + "start": 157, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 156, + "name": "close", + "start": 151, + "type": "Identifier" + }, + "end": 159, + "start": 151, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 159, + "start": 21, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "end": 159, + "start": 14, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 161, + "start": 10 + }, + "end": 161, + "params": [], + "start": 7, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" + }, + "end": 161, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 387, + "id": { + "end": 171, + "name": "test2", + "start": 166, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "end": 385, + "properties": [ + { + "end": 381, + "key": { + "end": 197, + "name": "thing1", + "start": 191, + "type": "Identifier" + }, + "start": 191, + "type": "ObjectProperty", + "value": { + "end": 381, + "properties": [ + { + "end": 375, + "key": { + "end": 214, + "name": "thing2", + "start": 208, + "type": "Identifier" + }, + "start": 208, + "type": "ObjectProperty", + "value": { + "body": [ + { + "arguments": [ + { + "end": 235, + "raw": "'XY'", + "start": 231, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 230, + "name": "startSketchOn", + "start": 217, + "type": "Identifier" + }, + "end": 236, + "start": 217, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 265, + "raw": "0", + "start": 264, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 268, + "raw": "0", + "start": 267, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 269, + "start": 263, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 272, + "start": 271, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 262, + "name": "startProfileAt", + "start": 248, + "type": "Identifier" + }, + "end": 273, + "start": 248, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 292, + "raw": "0", + "start": 291, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 295, + "raw": "1", + "start": 294, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + ], + "end": 296, + "start": 290, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 299, + "start": 298, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 289, + "name": "line", + "start": 285, + "type": "Identifier" + }, + "end": 300, + "start": 285, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 319, + "raw": "1", + "start": 318, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 322, + "raw": "0", + "start": 321, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 323, + "start": 317, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 326, + "start": 325, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 316, + "name": "line", + "start": 312, + "type": "Identifier" + }, + "end": 327, + "start": 312, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 346, + "raw": "0", + "start": 345, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 350, + "raw": "1", + "start": 349, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "end": 350, + "operator": "-", + "start": 348, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 351, + "start": 344, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 354, + "start": 353, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 343, + "name": "line", + "start": 339, + "type": "Identifier" + }, + "end": 355, + "start": 339, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 374, + "start": 373, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 372, + "name": "close", + "start": 367, + "type": "Identifier" + }, + "end": 375, + "start": 367, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 375, + "start": 217, + "type": "PipeExpression", + "type": "PipeExpression" + } + } + ], + "start": 200, + "type": "ObjectExpression", + "type": "ObjectExpression" + } + } + ], + "start": 185, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "end": 385, + "start": 178, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 387, + "start": 174 + }, + "end": 387, + "params": [], + "start": 171, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 166, + "type": "VariableDeclarator" + }, + "end": 387, + "kind": "fn", + "start": 163, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 399, + "id": { + "end": 390, + "name": "x", + "start": 389, + "type": "Identifier" + }, + "init": { + "arguments": [], + "callee": { + "end": 397, + "name": "test", + "start": 393, + "type": "Identifier" + }, + "end": 399, + "start": 393, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 389, + "type": "VariableDeclarator" + }, + "end": 399, + "kind": "const", + "start": 389, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 422, + "expression": { + "body": [ + { + "end": 401, + "name": "x", + "start": 400, + "type": "Identifier", + "type": "Identifier" + }, + { + "arguments": [ + { + "argument": { + "end": 418, + "raw": "10", + "start": 416, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + "end": 418, + "operator": "-", + "start": 415, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 421, + "start": 420, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 414, + "name": "extrude", + "start": 407, + "type": "Identifier" + }, + "end": 422, + "start": 407, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 422, + "start": 400, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 400, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "declaration": { + "end": 436, + "id": { + "end": 426, + "name": "x2", + "start": 424, + "type": "Identifier" + }, + "init": { + "arguments": [], + "callee": { + "end": 434, + "name": "test2", + "start": 429, + "type": "Identifier" + }, + "end": 436, + "start": 429, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 424, + "type": "VariableDeclarator" + }, + "end": 436, + "kind": "const", + "start": 424, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 473, + "expression": { + "body": [ + { + "computed": false, + "end": 453, + "object": { + "computed": false, + "end": 446, + "object": { + "end": 439, + "name": "x2", + "start": 437, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "end": 446, + "name": "thing1", + "start": 440, + "type": "Identifier", + "type": "Identifier" + }, + "start": 437, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "property": { + "end": 453, + "name": "thing2", + "start": 447, + "type": "Identifier", + "type": "Identifier" + }, + "start": 437, + "type": "MemberExpression", + "type": "MemberExpression" + }, + { + "arguments": [ + { + "end": 469, + "raw": "10", + "start": 467, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + { + "end": 472, + "start": 471, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 466, + "name": "extrude", + "start": 459, + "type": "Identifier" + }, + "end": 473, + "start": 459, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 473, + "start": 437, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 437, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 474, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 163, + "start": 161, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "1": [ + { + "end": 389, + "start": 387, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "3": [ + { + "end": 424, + "start": 422, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/tests/executor/inputs/no_visuals/sketch_in_object.kcl b/src/wasm-lib/kcl/tests/sketch_in_object/input.kcl similarity index 52% rename from src/wasm-lib/tests/executor/inputs/no_visuals/sketch_in_object.kcl rename to src/wasm-lib/kcl/tests/sketch_in_object/input.kcl index 1acbb951d..a5b88c3f9 100644 --- a/src/wasm-lib/tests/executor/inputs/no_visuals/sketch_in_object.kcl +++ b/src/wasm-lib/kcl/tests/sketch_in_object/input.kcl @@ -1,16 +1,16 @@ -fn test = () => { +fn test() { return startSketchOn('XY') - |> startProfileAt([0, 0], %) - |> line([0, 1], %) - |> line([1, 0], %) - |> line([0, -1], %) - |> close(%) + |> startProfileAt([0, 0], %) + |> line([0, 1], %) + |> line([1, 0], %) + |> line([0, -1], %) + |> close(%) } -fn test2 = () => { +fn test2() { return { - thing1: { - thing2: startSketchOn('XY') + thing1 = { + thing2 = startSketchOn('XY') |> startProfileAt([0, 0], %) |> line([0, 1], %) |> line([1, 0], %) @@ -20,10 +20,10 @@ fn test2 = () => { } } -const x = test() +x = test() x |> extrude(-10, %) -const x2 = test2() +x2 = test2() x2.thing1.thing2 |> extrude(10, %) diff --git a/src/wasm-lib/kcl/tests/sketch_in_object/ops.snap b/src/wasm-lib/kcl/tests/sketch_in_object/ops.snap new file mode 100644 index 000000000..8f1d3bec8 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_in_object/ops.snap @@ -0,0 +1,135 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed sketch_in_object.kcl +snapshot_kind: text +--- +[ + { + "type": "UserDefinedFunctionCall", + "name": "test", + "functionSourceRange": [ + 7, + 161, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 393, + 399, + 0 + ] + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 35, + 39, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 21, + 40, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 415, + 418, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 420, + 421, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 407, + 422, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "type": "UserDefinedFunctionCall", + "name": "test2", + "functionSourceRange": [ + 171, + 387, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 429, + 436, + 0 + ] + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 231, + 235, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 217, + 236, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 467, + 469, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 471, + 472, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 459, + 473, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/sketch_in_object/program_memory.snap b/src/wasm-lib/kcl/tests/sketch_in_object/program_memory.snap new file mode 100644 index 000000000..295101a40 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_in_object/program_memory.snap @@ -0,0 +1,1270 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing sketch_in_object.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "test": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "argument": { + "body": [ + { + "arguments": [ + { + "end": 39, + "raw": "'XY'", + "start": 35, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 34, + "name": "startSketchOn", + "start": 21, + "type": "Identifier" + }, + "end": 40, + "start": 21, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 65, + "raw": "0", + "start": 64, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 68, + "raw": "0", + "start": 67, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 69, + "start": 63, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 72, + "start": 71, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 62, + "name": "startProfileAt", + "start": 48, + "type": "Identifier" + }, + "end": 73, + "start": 48, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 88, + "raw": "0", + "start": 87, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 91, + "raw": "1", + "start": 90, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + ], + "end": 92, + "start": 86, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 95, + "start": 94, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 85, + "name": "line", + "start": 81, + "type": "Identifier" + }, + "end": 96, + "start": 81, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 111, + "raw": "1", + "start": 110, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 114, + "raw": "0", + "start": 113, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 115, + "start": 109, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 118, + "start": 117, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 108, + "name": "line", + "start": 104, + "type": "Identifier" + }, + "end": 119, + "start": 104, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 134, + "raw": "0", + "start": 133, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 138, + "raw": "1", + "start": 137, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "end": 138, + "operator": "-", + "start": 136, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 139, + "start": 132, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 142, + "start": 141, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 131, + "name": "line", + "start": 127, + "type": "Identifier" + }, + "end": 143, + "start": 127, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 158, + "start": 157, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 156, + "name": "close", + "start": 151, + "type": "Identifier" + }, + "end": 159, + "start": 151, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 159, + "start": 21, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "end": 159, + "start": 14, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 161, + "start": 10 + }, + "end": 161, + "params": [], + "start": 7, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 7, + 161, + 0 + ] + } + ] + }, + "test2": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "argument": { + "end": 385, + "properties": [ + { + "end": 381, + "key": { + "end": 197, + "name": "thing1", + "start": 191, + "type": "Identifier" + }, + "start": 191, + "type": "ObjectProperty", + "value": { + "end": 381, + "properties": [ + { + "end": 375, + "key": { + "end": 214, + "name": "thing2", + "start": 208, + "type": "Identifier" + }, + "start": 208, + "type": "ObjectProperty", + "value": { + "body": [ + { + "arguments": [ + { + "end": 235, + "raw": "'XY'", + "start": 231, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 230, + "name": "startSketchOn", + "start": 217, + "type": "Identifier" + }, + "end": 236, + "start": 217, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 265, + "raw": "0", + "start": 264, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 268, + "raw": "0", + "start": 267, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 269, + "start": 263, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 272, + "start": 271, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 262, + "name": "startProfileAt", + "start": 248, + "type": "Identifier" + }, + "end": 273, + "start": 248, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 292, + "raw": "0", + "start": 291, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 295, + "raw": "1", + "start": 294, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + ], + "end": 296, + "start": 290, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 299, + "start": 298, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 289, + "name": "line", + "start": 285, + "type": "Identifier" + }, + "end": 300, + "start": 285, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 319, + "raw": "1", + "start": 318, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 322, + "raw": "0", + "start": 321, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 323, + "start": 317, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 326, + "start": 325, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 316, + "name": "line", + "start": 312, + "type": "Identifier" + }, + "end": 327, + "start": 312, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 346, + "raw": "0", + "start": 345, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 350, + "raw": "1", + "start": 349, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "end": 350, + "operator": "-", + "start": 348, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 351, + "start": 344, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 354, + "start": 353, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 343, + "name": "line", + "start": 339, + "type": "Identifier" + }, + "end": 355, + "start": 339, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 374, + "start": 373, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 372, + "name": "close", + "start": 367, + "type": "Identifier" + }, + "end": 375, + "start": 367, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 375, + "start": 217, + "type": "PipeExpression", + "type": "PipeExpression" + } + } + ], + "start": 200, + "type": "ObjectExpression", + "type": "ObjectExpression" + } + } + ], + "start": 185, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "end": 385, + "start": 178, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 387, + "start": 174 + }, + "end": 387, + "params": [], + "start": 171, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "test": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "argument": { + "body": [ + { + "arguments": [ + { + "end": 39, + "raw": "'XY'", + "start": 35, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 34, + "name": "startSketchOn", + "start": 21, + "type": "Identifier" + }, + "end": 40, + "start": 21, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 65, + "raw": "0", + "start": 64, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 68, + "raw": "0", + "start": 67, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 69, + "start": 63, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 72, + "start": 71, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 62, + "name": "startProfileAt", + "start": 48, + "type": "Identifier" + }, + "end": 73, + "start": 48, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 88, + "raw": "0", + "start": 87, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 91, + "raw": "1", + "start": 90, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + ], + "end": 92, + "start": 86, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 95, + "start": 94, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 85, + "name": "line", + "start": 81, + "type": "Identifier" + }, + "end": 96, + "start": 81, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 111, + "raw": "1", + "start": 110, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 114, + "raw": "0", + "start": 113, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 115, + "start": 109, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 118, + "start": 117, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 108, + "name": "line", + "start": 104, + "type": "Identifier" + }, + "end": 119, + "start": 104, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 134, + "raw": "0", + "start": 133, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 138, + "raw": "1", + "start": 137, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "end": 138, + "operator": "-", + "start": 136, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 139, + "start": 132, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 142, + "start": 141, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 131, + "name": "line", + "start": 127, + "type": "Identifier" + }, + "end": 143, + "start": 127, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 158, + "start": 157, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 156, + "name": "close", + "start": 151, + "type": "Identifier" + }, + "end": 159, + "start": 151, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 159, + "start": 21, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "end": 159, + "start": 14, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 161, + "start": 10 + }, + "end": 161, + "params": [], + "start": 7, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 7, + 161, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 171, + 387, + 0 + ] + } + ] + }, + "x": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 81, + 96, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 104, + 119, + 0 + ] + }, + "from": [ + 0.0, + 1.0 + ], + "tag": null, + "to": [ + 1.0, + 1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 127, + 143, + 0 + ] + }, + "from": [ + 1.0, + 1.0 + ], + "tag": null, + "to": [ + 1.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 151, + 159, + 0 + ] + }, + "from": [ + 1.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 48, + 73, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 48, + 73, + 0 + ] + } + ] + } + }, + "x2": { + "type": "Object", + "value": { + "thing1": { + "type": "Object", + "value": { + "thing2": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 285, + 300, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 312, + 327, + 0 + ] + }, + "from": [ + 0.0, + 1.0 + ], + "tag": null, + "to": [ + 1.0, + 1.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 339, + 355, + 0 + ] + }, + "from": [ + 1.0, + 1.0 + ], + "tag": null, + "to": [ + 1.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 367, + 375, + 0 + ] + }, + "from": [ + 1.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 248, + 273, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 248, + 273, + 0 + ] + } + ] + } + } + }, + "__meta": [ + { + "sourceRange": [ + 200, + 381, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 185, + 385, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/sketch_on_face/ast.snap b/src/wasm-lib/kcl/tests/sketch_on_face/ast.snap new file mode 100644 index 000000000..6a5a361d9 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face/ast.snap @@ -0,0 +1,619 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing sketch_on_face.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 198, + "id": { + "end": 7, + "name": "part001", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 28, + "raw": "'XY'", + "start": 24, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 23, + "name": "startSketchOn", + "start": 10, + "type": "Identifier" + }, + "end": 29, + "start": 10, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 56, + "raw": "11.19", + "start": 51, + "type": "Literal", + "type": "Literal", + "value": 11.19 + }, + { + "end": 63, + "raw": "28.35", + "start": 58, + "type": "Literal", + "type": "Literal", + "value": 28.35 + } + ], + "end": 64, + "start": 50, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 67, + "start": 66, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 49, + "name": "startProfileAt", + "start": 35, + "type": "Identifier" + }, + "end": 68, + "start": 35, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 85, + "raw": "28.67", + "start": 80, + "type": "Literal", + "type": "Literal", + "value": 28.67 + }, + { + "argument": { + "end": 93, + "raw": "13.25", + "start": 88, + "type": "Literal", + "type": "Literal", + "value": 13.25 + }, + "end": 93, + "operator": "-", + "start": 87, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 94, + "start": 79, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 97, + "start": 96, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 104, + "start": 99, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "here" + } + ], + "callee": { + "end": 78, + "name": "line", + "start": 74, + "type": "Identifier" + }, + "end": 105, + "start": 74, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 122, + "raw": "4.12", + "start": 118, + "type": "Literal", + "type": "Literal", + "value": 4.12 + }, + "end": 122, + "operator": "-", + "start": 117, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 130, + "raw": "22.81", + "start": 125, + "type": "Literal", + "type": "Literal", + "value": 22.81 + }, + "end": 130, + "operator": "-", + "start": 124, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 131, + "start": 116, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 134, + "start": 133, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 115, + "name": "line", + "start": 111, + "type": "Identifier" + }, + "end": 135, + "start": 111, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 153, + "raw": "33.24", + "start": 148, + "type": "Literal", + "type": "Literal", + "value": 33.24 + }, + "end": 153, + "operator": "-", + "start": 147, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 160, + "raw": "14.55", + "start": 155, + "type": "Literal", + "type": "Literal", + "value": 14.55 + } + ], + "end": 161, + "start": 146, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 164, + "start": 163, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 145, + "name": "line", + "start": 141, + "type": "Identifier" + }, + "end": 165, + "start": 141, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 178, + "start": 177, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 176, + "name": "close", + "start": 171, + "type": "Identifier" + }, + "end": 179, + "start": 171, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 194, + "raw": "5", + "start": 193, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + { + "end": 197, + "start": 196, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 192, + "name": "extrude", + "start": 185, + "type": "Identifier" + }, + "end": 198, + "start": 185, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 198, + "start": 10, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 198, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 369, + "id": { + "end": 207, + "name": "part002", + "start": 200, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 231, + "name": "part001", + "start": 224, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 237, + "name": "here", + "start": 233, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 223, + "name": "startSketchOn", + "start": 210, + "type": "Identifier" + }, + "end": 238, + "start": 210, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 261, + "raw": "0", + "start": 260, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 264, + "raw": "0", + "start": 263, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 265, + "start": 259, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 268, + "start": 267, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 258, + "name": "startProfileAt", + "start": 244, + "type": "Identifier" + }, + "end": 269, + "start": 244, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 282, + "raw": "0", + "start": 281, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 286, + "raw": "10", + "start": 284, + "type": "Literal", + "type": "Literal", + "value": 10.0 + } + ], + "end": 287, + "start": 280, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 290, + "start": 289, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 279, + "name": "line", + "start": 275, + "type": "Identifier" + }, + "end": 291, + "start": 275, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 305, + "raw": "10", + "start": 303, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + { + "end": 308, + "raw": "0", + "start": 307, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 309, + "start": 302, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 312, + "start": 311, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 301, + "name": "line", + "start": 297, + "type": "Identifier" + }, + "end": 313, + "start": 297, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 326, + "raw": "0", + "start": 325, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 331, + "raw": "10", + "start": 329, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + "end": 331, + "operator": "-", + "start": 328, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 332, + "start": 324, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 335, + "start": 334, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 323, + "name": "line", + "start": 319, + "type": "Identifier" + }, + "end": 336, + "start": 319, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 349, + "start": 348, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 347, + "name": "close", + "start": 342, + "type": "Identifier" + }, + "end": 350, + "start": 342, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 365, + "raw": "5", + "start": 364, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + { + "end": 368, + "start": 367, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 363, + "name": "extrude", + "start": 356, + "type": "Identifier" + }, + "end": 369, + "start": 356, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 369, + "start": 210, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 200, + "type": "VariableDeclarator" + }, + "end": 369, + "kind": "const", + "start": 200, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 370, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 200, + "start": 198, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/sketch_on_face/input.kcl b/src/wasm-lib/kcl/tests/sketch_on_face/input.kcl new file mode 100644 index 000000000..d61cdddee --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face/input.kcl @@ -0,0 +1,15 @@ +part001 = startSketchOn('XY') + |> startProfileAt([11.19, 28.35], %) + |> line([28.67, -13.25], %, $here) + |> line([-4.12, -22.81], %) + |> line([-33.24, 14.55], %) + |> close(%) + |> extrude(5, %) + +part002 = startSketchOn(part001, here) + |> startProfileAt([0, 0], %) + |> line([0, 10], %) + |> line([10, 0], %) + |> line([0, -10], %) + |> close(%) + |> extrude(5, %) diff --git a/src/wasm-lib/kcl/tests/sketch_on_face/ops.snap b/src/wasm-lib/kcl/tests/sketch_on_face/ops.snap new file mode 100644 index 000000000..52ea4a1ae --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face/ops.snap @@ -0,0 +1,104 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed sketch_on_face.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 24, + 28, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 10, + 29, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 193, + 194, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 196, + 197, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 185, + 198, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 224, + 231, + 0 + ] + }, + "tag": { + "sourceRange": [ + 233, + 237, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 210, + 238, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 364, + 365, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 367, + 368, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 356, + 369, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/sketch_on_face/program_memory.snap b/src/wasm-lib/kcl/tests/sketch_on_face/program_memory.snap new file mode 100644 index 000000000..accfaf378 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face/program_memory.snap @@ -0,0 +1,849 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing sketch_on_face.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "here": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "here", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 74, + 105, + 0 + ] + }, + "from": [ + 11.19, + 28.35 + ], + "tag": { + "end": 104, + "start": 99, + "type": "TagDeclarator", + "value": "here" + }, + "to": [ + 39.86, + 15.100000000000001 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 74, + 105, + 0 + ], + "tag": { + "end": 104, + "start": 99, + "type": "TagDeclarator", + "value": "here" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 99, + 104, + 0 + ] + } + ] + }, + "part001": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 74, + 105, + 0 + ], + "tag": { + "end": 104, + "start": 99, + "type": "TagDeclarator", + "value": "here" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 111, + 135, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 141, + 165, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 171, + 179, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 74, + 105, + 0 + ] + }, + "from": [ + 11.19, + 28.35 + ], + "tag": { + "end": 104, + "start": 99, + "type": "TagDeclarator", + "value": "here" + }, + "to": [ + 39.86, + 15.1 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 111, + 135, + 0 + ] + }, + "from": [ + 39.86, + 15.1 + ], + "tag": null, + "to": [ + 35.74, + -7.71 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 141, + 165, + 0 + ] + }, + "from": [ + 35.74, + -7.71 + ], + "tag": null, + "to": [ + 2.5, + 6.84 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 171, + 179, + 0 + ] + }, + "from": [ + 2.5, + 6.84 + ], + "tag": null, + "to": [ + 11.19, + 28.35 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 11.19, + 28.35 + ], + "to": [ + 11.19, + 28.35 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35, + 68, + 0 + ] + } + }, + "tags": { + "here": { + "type": "TagIdentifier", + "value": "here", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 74, + 105, + 0 + ] + }, + "from": [ + 11.19, + 28.35 + ], + "tag": { + "end": 104, + "start": 99, + "type": "TagDeclarator", + "value": "here" + }, + "to": [ + 39.86, + 15.100000000000001 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 74, + 105, + 0 + ], + "tag": { + "end": 104, + "start": 99, + "type": "TagDeclarator", + "value": "here" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 99, + 104, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 35, + 68, + 0 + ] + } + ] + }, + "height": 5.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 35, + 68, + 0 + ] + } + ] + }, + "part002": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 275, + 291, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 297, + 313, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 319, + 336, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 342, + 350, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 275, + 291, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 10.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 297, + 313, + 0 + ] + }, + "from": [ + 0.0, + 10.0 + ], + "tag": null, + "to": [ + 10.0, + 10.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 319, + 336, + 0 + ] + }, + "from": [ + 10.0, + 10.0 + ], + "tag": null, + "to": [ + 10.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 342, + 350, + 0 + ] + }, + "from": [ + 10.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "here", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 74, + 105, + 0 + ], + "tag": { + "end": 104, + "start": 99, + "type": "TagDeclarator", + "value": "here" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 111, + 135, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 141, + 165, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 171, + 179, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 74, + 105, + 0 + ] + }, + "from": [ + 11.19, + 28.35 + ], + "tag": { + "end": 104, + "start": 99, + "type": "TagDeclarator", + "value": "here" + }, + "to": [ + 39.86, + 15.1 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 111, + 135, + 0 + ] + }, + "from": [ + 39.86, + 15.1 + ], + "tag": null, + "to": [ + 35.74, + -7.71 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 141, + 165, + 0 + ] + }, + "from": [ + 35.74, + -7.71 + ], + "tag": null, + "to": [ + 2.5, + 6.84 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 171, + 179, + 0 + ] + }, + "from": [ + 2.5, + 6.84 + ], + "tag": null, + "to": [ + 11.19, + 28.35 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 11.19, + 28.35 + ], + "to": [ + 11.19, + 28.35 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35, + 68, + 0 + ] + } + }, + "tags": { + "here": { + "type": "TagIdentifier", + "value": "here", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 74, + 105, + 0 + ] + }, + "from": [ + 11.19, + 28.35 + ], + "tag": { + "end": 104, + "start": 99, + "type": "TagDeclarator", + "value": "here" + }, + "to": [ + 39.86, + 15.100000000000001 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 74, + 105, + 0 + ], + "tag": { + "end": 104, + "start": 99, + "type": "TagDeclarator", + "value": "here" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 99, + 104, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 35, + 68, + 0 + ] + } + ] + }, + "height": 5.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 35, + 68, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 210, + 238, + 0 + ] + } + ] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 244, + 269, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 244, + 269, + 0 + ] + } + ] + }, + "height": 5.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 244, + 269, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/sketch_on_face/rendered_model.png b/src/wasm-lib/kcl/tests/sketch_on_face/rendered_model.png new file mode 100644 index 000000000..0d341d1af Binary files /dev/null and b/src/wasm-lib/kcl/tests/sketch_on_face/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/ast.snap b/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/ast.snap new file mode 100644 index 000000000..e8555b761 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/ast.snap @@ -0,0 +1,1564 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing sketch_on_face_after_fillets_referencing_face.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 369, + "id": { + "end": 365, + "name": "shelfMountL", + "start": 354, + "type": "Identifier" + }, + "init": { + "end": 369, + "raw": "8", + "start": 368, + "type": "Literal", + "type": "Literal", + "value": 8.0 + }, + "start": 354, + "type": "VariableDeclarator" + }, + "end": 369, + "kind": "const", + "start": 354, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 446, + "id": { + "end": 442, + "name": "wallMountL", + "start": 432, + "type": "Identifier" + }, + "init": { + "end": 446, + "raw": "6", + "start": 445, + "type": "Literal", + "type": "Literal", + "value": 6.0 + }, + "start": 432, + "type": "VariableDeclarator" + }, + "end": 446, + "kind": "const", + "start": 432, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 578, + "id": { + "end": 570, + "name": "sigmaAllow", + "start": 560, + "type": "Identifier" + }, + "init": { + "end": 578, + "raw": "35000", + "start": 573, + "type": "Literal", + "type": "Literal", + "value": 35000.0 + }, + "start": 560, + "type": "VariableDeclarator" + }, + "end": 578, + "kind": "const", + "start": 560, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 595, + "id": { + "end": 591, + "name": "width", + "start": 586, + "type": "Identifier" + }, + "init": { + "end": 595, + "raw": "6", + "start": 594, + "type": "Literal", + "type": "Literal", + "value": 6.0 + }, + "start": 586, + "type": "VariableDeclarator" + }, + "end": 595, + "kind": "const", + "start": 586, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 611, + "id": { + "end": 605, + "name": "p", + "start": 604, + "type": "Identifier" + }, + "init": { + "end": 611, + "raw": "300", + "start": 608, + "type": "Literal", + "type": "Literal", + "value": 300.0 + }, + "start": 604, + "type": "VariableDeclarator" + }, + "end": 611, + "kind": "const", + "start": 604, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 642, + "id": { + "end": 637, + "name": "L", + "start": 636, + "type": "Identifier" + }, + "init": { + "end": 642, + "raw": "12", + "start": 640, + "type": "Literal", + "type": "Literal", + "value": 12.0 + }, + "start": 636, + "type": "VariableDeclarator" + }, + "end": 642, + "kind": "const", + "start": 636, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 666, + "id": { + "end": 654, + "name": "M", + "start": 653, + "type": "Identifier" + }, + "init": { + "end": 666, + "left": { + "end": 662, + "left": { + "end": 658, + "name": "L", + "start": 657, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "*", + "right": { + "end": 662, + "name": "p", + "start": 661, + "type": "Identifier", + "type": "Identifier" + }, + "start": 657, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "/", + "right": { + "end": 666, + "raw": "2", + "start": 665, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 657, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 653, + "type": "VariableDeclarator" + }, + "end": 666, + "kind": "const", + "start": 653, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 720, + "id": { + "end": 716, + "name": "FOS", + "start": 713, + "type": "Identifier" + }, + "init": { + "end": 720, + "raw": "2", + "start": 719, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "start": 713, + "type": "VariableDeclarator" + }, + "end": 720, + "kind": "const", + "start": 713, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 890, + "id": { + "end": 847, + "name": "thickness", + "start": 838, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 888, + "left": { + "end": 866, + "left": { + "end": 860, + "left": { + "end": 856, + "raw": "6", + "start": 855, + "type": "Literal", + "type": "Literal", + "value": 6.0 + }, + "operator": "*", + "right": { + "end": 860, + "name": "M", + "start": 859, + "type": "Identifier", + "type": "Identifier" + }, + "start": 855, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "*", + "right": { + "end": 866, + "name": "FOS", + "start": 863, + "type": "Identifier", + "type": "Identifier" + }, + "start": 855, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "/", + "right": { + "end": 888, + "left": { + "end": 875, + "name": "width", + "start": 870, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "*", + "right": { + "end": 888, + "name": "sigmaAllow", + "start": 878, + "type": "Identifier", + "type": "Identifier" + }, + "start": 870, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 855, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "callee": { + "end": 854, + "name": "sqrt", + "start": 850, + "type": "Identifier" + }, + "end": 890, + "start": 850, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 838, + "type": "VariableDeclarator" + }, + "end": 890, + "kind": "const", + "start": 838, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 933, + "id": { + "end": 926, + "name": "filletR", + "start": 919, + "type": "Identifier" + }, + "init": { + "end": 933, + "raw": "0.25", + "start": 929, + "type": "Literal", + "type": "Literal", + "value": 0.25 + }, + "start": 919, + "type": "VariableDeclarator" + }, + "end": 933, + "kind": "const", + "start": 919, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 1495, + "id": { + "end": 989, + "name": "bracket", + "start": 982, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 1010, + "raw": "'XY'", + "start": 1006, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 1005, + "name": "startSketchOn", + "start": 992, + "type": "Identifier" + }, + "end": 1011, + "start": 992, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1034, + "raw": "0", + "start": 1033, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 1037, + "raw": "0", + "start": 1036, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 1038, + "start": 1032, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1041, + "start": 1040, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1031, + "name": "startProfileAt", + "start": 1017, + "type": "Identifier" + }, + "end": 1042, + "start": 1017, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1055, + "raw": "0", + "start": 1054, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 1067, + "name": "wallMountL", + "start": 1057, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 1068, + "start": 1053, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1071, + "start": 1070, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 1083, + "start": 1073, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "outerEdge" + } + ], + "callee": { + "end": 1052, + "name": "line", + "start": 1048, + "type": "Identifier" + }, + "end": 1084, + "start": 1048, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 1108, + "name": "shelfMountL", + "start": 1097, + "type": "Identifier", + "type": "Identifier" + }, + "end": 1108, + "operator": "-", + "start": 1096, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 1111, + "raw": "0", + "start": 1110, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 1112, + "start": 1095, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1115, + "start": 1114, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 1123, + "start": 1117, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "seg01" + } + ], + "callee": { + "end": 1094, + "name": "line", + "start": 1090, + "type": "Identifier" + }, + "end": 1124, + "start": 1090, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1137, + "raw": "0", + "start": 1136, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 1149, + "name": "thickness", + "start": 1140, + "type": "Identifier", + "type": "Identifier" + }, + "end": 1149, + "operator": "-", + "start": 1139, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1150, + "start": 1135, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1153, + "start": 1152, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1134, + "name": "line", + "start": 1130, + "type": "Identifier" + }, + "end": 1154, + "start": 1130, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1189, + "left": { + "end": 1177, + "name": "shelfMountL", + "start": 1166, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "-", + "right": { + "end": 1189, + "name": "thickness", + "start": 1180, + "type": "Identifier", + "type": "Identifier" + }, + "start": 1166, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 1192, + "raw": "0", + "start": 1191, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 1193, + "start": 1165, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1196, + "start": 1195, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 1208, + "start": 1198, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "innerEdge" + } + ], + "callee": { + "end": 1164, + "name": "line", + "start": 1160, + "type": "Identifier" + }, + "end": 1209, + "start": 1160, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1222, + "raw": "0", + "start": 1221, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 1247, + "left": { + "argument": { + "end": 1235, + "name": "wallMountL", + "start": 1225, + "type": "Identifier", + "type": "Identifier" + }, + "end": 1235, + "operator": "-", + "start": 1224, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "end": 1247, + "name": "thickness", + "start": 1238, + "type": "Identifier", + "type": "Identifier" + }, + "start": 1224, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 1248, + "start": 1220, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1251, + "start": 1250, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1219, + "name": "line", + "start": 1215, + "type": "Identifier" + }, + "end": 1252, + "start": 1215, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1265, + "start": 1264, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1263, + "name": "close", + "start": 1258, + "type": "Identifier" + }, + "end": 1266, + "start": 1258, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1285, + "name": "width", + "start": 1280, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 1288, + "start": 1287, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1279, + "name": "extrude", + "start": 1272, + "type": "Identifier" + }, + "end": 1289, + "start": 1272, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1382, + "properties": [ + { + "end": 1327, + "key": { + "end": 1317, + "name": "radius", + "start": 1311, + "type": "Identifier" + }, + "start": 1311, + "type": "ObjectProperty", + "value": { + "end": 1327, + "name": "filletR", + "start": 1320, + "type": "Identifier", + "type": "Identifier" + } + }, + { + "end": 1375, + "key": { + "end": 1340, + "name": "tags", + "start": 1336, + "type": "Identifier" + }, + "start": 1336, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "arguments": [ + { + "end": 1373, + "name": "innerEdge", + "start": 1364, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 1363, + "name": "getNextAdjacentEdge", + "start": 1344, + "type": "Identifier" + }, + "end": 1374, + "start": 1344, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 1375, + "start": 1343, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "start": 1302, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 1385, + "start": 1384, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1301, + "name": "fillet", + "start": 1295, + "type": "Identifier" + }, + "end": 1386, + "start": 1295, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1491, + "properties": [ + { + "end": 1436, + "key": { + "end": 1414, + "name": "radius", + "start": 1408, + "type": "Identifier" + }, + "start": 1408, + "type": "ObjectProperty", + "value": { + "end": 1436, + "left": { + "end": 1424, + "name": "filletR", + "start": 1417, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 1436, + "name": "thickness", + "start": 1427, + "type": "Identifier", + "type": "Identifier" + }, + "start": 1417, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "end": 1484, + "key": { + "end": 1449, + "name": "tags", + "start": 1445, + "type": "Identifier" + }, + "start": 1445, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "arguments": [ + { + "end": 1482, + "name": "outerEdge", + "start": 1473, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 1472, + "name": "getNextAdjacentEdge", + "start": 1453, + "type": "Identifier" + }, + "end": 1483, + "start": 1453, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 1484, + "start": 1452, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "start": 1399, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 1494, + "start": 1493, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1398, + "name": "fillet", + "start": 1392, + "type": "Identifier" + }, + "end": 1495, + "start": 1392, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 1495, + "start": 992, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 982, + "type": "VariableDeclarator" + }, + "end": 1495, + "kind": "const", + "start": 982, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 1746, + "id": { + "end": 1506, + "name": "sketch001", + "start": 1497, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 1530, + "name": "bracket", + "start": 1523, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 1537, + "name": "seg01", + "start": 1532, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 1522, + "name": "startSketchOn", + "start": 1509, + "type": "Identifier" + }, + "end": 1538, + "start": 1509, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1564, + "raw": "4.28", + "start": 1560, + "type": "Literal", + "type": "Literal", + "value": 4.28 + }, + { + "end": 1570, + "raw": "3.83", + "start": 1566, + "type": "Literal", + "type": "Literal", + "value": 3.83 + } + ], + "end": 1571, + "start": 1559, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1574, + "start": 1573, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1558, + "name": "startProfileAt", + "start": 1544, + "type": "Identifier" + }, + "end": 1575, + "start": 1544, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 1591, + "raw": "2.17", + "start": 1587, + "type": "Literal", + "type": "Literal", + "value": 2.17 + }, + { + "argument": { + "end": 1598, + "raw": "0.03", + "start": 1594, + "type": "Literal", + "type": "Literal", + "value": 0.03 + }, + "end": 1598, + "operator": "-", + "start": 1593, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1599, + "start": 1586, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1602, + "start": 1601, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1585, + "name": "line", + "start": 1581, + "type": "Identifier" + }, + "end": 1603, + "start": 1581, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 1620, + "raw": "0.07", + "start": 1616, + "type": "Literal", + "type": "Literal", + "value": 0.07 + }, + "end": 1620, + "operator": "-", + "start": 1615, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 1626, + "raw": "1.8", + "start": 1623, + "type": "Literal", + "type": "Literal", + "value": 1.8 + }, + "end": 1626, + "operator": "-", + "start": 1622, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 1627, + "start": 1614, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1630, + "start": 1629, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1613, + "name": "line", + "start": 1609, + "type": "Identifier" + }, + "end": 1631, + "start": 1609, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 1648, + "raw": "2.07", + "start": 1644, + "type": "Literal", + "type": "Literal", + "value": 2.07 + }, + "end": 1648, + "operator": "-", + "start": 1643, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 1654, + "raw": "0.05", + "start": 1650, + "type": "Literal", + "type": "Literal", + "value": 0.05 + } + ], + "end": 1655, + "start": 1642, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1658, + "start": 1657, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1641, + "name": "line", + "start": 1637, + "type": "Identifier" + }, + "end": 1659, + "start": 1637, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "arguments": [ + { + "end": 1688, + "start": 1687, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1686, + "name": "profileStartX", + "start": 1673, + "type": "Identifier" + }, + "end": 1689, + "start": 1673, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1706, + "start": 1705, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1704, + "name": "profileStartY", + "start": 1691, + "type": "Identifier" + }, + "end": 1707, + "start": 1691, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 1708, + "start": 1672, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 1711, + "start": 1710, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1671, + "name": "lineTo", + "start": 1665, + "type": "Identifier" + }, + "end": 1712, + "start": 1665, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1725, + "start": 1724, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1723, + "name": "close", + "start": 1718, + "type": "Identifier" + }, + "end": 1726, + "start": 1718, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 1742, + "raw": "10", + "start": 1740, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + { + "end": 1745, + "start": 1744, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 1739, + "name": "extrude", + "start": 1732, + "type": "Identifier" + }, + "end": 1746, + "start": 1732, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 1746, + "start": 1509, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 1497, + "type": "VariableDeclarator" + }, + "end": 1746, + "kind": "const", + "start": 1497, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 1747, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 431, + "start": 369, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "The length of the bracket holding up the shelf is 6 inches", + "style": "line" + } + } + ], + "1": [ + { + "end": 475, + "start": 446, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "the length of the bracket", + "style": "line" + } + }, + { + "end": 478, + "start": 475, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + }, + { + "end": 559, + "start": 478, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "Define constants required to calculate the thickness needed to support 300 lbs", + "style": "line" + } + } + ], + "2": [ + { + "end": 585, + "start": 578, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "psi", + "style": "line" + } + } + ], + "3": [ + { + "end": 603, + "start": 595, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "inch", + "style": "line" + } + } + ], + "4": [ + { + "end": 635, + "start": 611, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "Force on shelf - lbs", + "style": "line" + } + } + ], + "5": [ + { + "end": 652, + "start": 642, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "inches", + "style": "line" + } + } + ], + "6": [ + { + "end": 712, + "start": 666, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "Moment experienced at fixed end of bracket", + "style": "line" + } + } + ], + "7": [ + { + "end": 764, + "start": 720, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "Factor of safety of 2 to be conservative", + "style": "line" + } + }, + { + "end": 767, + "start": 764, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + }, + { + "end": 837, + "start": 767, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "Calculate the thickness off the bending stress and factor of safety", + "style": "line" + } + } + ], + "8": [ + { + "end": 918, + "start": 890, + "type": "NonCodeNode", + "value": { + "type": "newLineBlockComment", + "value": "0.25 inch fillet radius", + "style": "line" + } + } + ], + "9": [ + { + "end": 981, + "start": 933, + "type": "NonCodeNode", + "value": { + "type": "newLineBlockComment", + "value": "Sketch the bracket and extrude with fillets", + "style": "line" + } + } + ], + "10": [ + { + "end": 1497, + "start": 1495, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [ + { + "end": 16, + "start": 0, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "Shelf Bracket", + "style": "line" + } + }, + { + "end": 316, + "start": 17, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "This is a shelf bracket made out of 6061-T6 aluminum sheet metal. The required thickness is calculated based on a point load of 300 lbs applied to the end of the shelf. There are two brackets holding up the shelf, so the moment experienced is divided by 2. The shelf is 1 foot long from the wall.", + "style": "line" + } + }, + { + "end": 319, + "start": 316, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + }, + { + "end": 353, + "start": 319, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "Define our bracket feet lengths", + "style": "line" + } + } + ] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/input.kcl b/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/input.kcl new file mode 100644 index 000000000..e68dfcf2d --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/input.kcl @@ -0,0 +1,51 @@ +// Shelf Bracket +// This is a shelf bracket made out of 6061-T6 aluminum sheet metal. The required thickness is calculated based on a point load of 300 lbs applied to the end of the shelf. There are two brackets holding up the shelf, so the moment experienced is divided by 2. The shelf is 1 foot long from the wall. + + +// Define our bracket feet lengths +shelfMountL = 8 // The length of the bracket holding up the shelf is 6 inches +wallMountL = 6 // the length of the bracket + + +// Define constants required to calculate the thickness needed to support 300 lbs +sigmaAllow = 35000 // psi +width = 6 // inch +p = 300 // Force on shelf - lbs +L = 12 // inches +M = L * p / 2 // Moment experienced at fixed end of bracket +FOS = 2 // Factor of safety of 2 to be conservative + + +// Calculate the thickness off the bending stress and factor of safety +thickness = sqrt(6 * M * FOS / (width * sigmaAllow)) + +// 0.25 inch fillet radius +filletR = 0.25 + +// Sketch the bracket and extrude with fillets +bracket = startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line([0, wallMountL], %, $outerEdge) + |> line([-shelfMountL, 0], %, $seg01) + |> line([0, -thickness], %) + |> line([shelfMountL - thickness, 0], %, $innerEdge) + |> line([0, -wallMountL + thickness], %) + |> close(%) + |> extrude(width, %) + |> fillet({ + radius = filletR, + tags = [getNextAdjacentEdge(innerEdge)] + }, %) + |> fillet({ + radius = filletR + thickness, + tags = [getNextAdjacentEdge(outerEdge)] + }, %) + +sketch001 = startSketchOn(bracket, seg01) + |> startProfileAt([4.28, 3.83], %) + |> line([2.17, -0.03], %) + |> line([-0.07, -1.8], %) + |> line([-2.07, 0.05], %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) + |> extrude(10, %) diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/ops.snap b/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/ops.snap new file mode 100644 index 000000000..9f7cf5672 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/ops.snap @@ -0,0 +1,156 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed sketch_on_face_after_fillets_referencing_face.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 1006, + 1010, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 992, + 1011, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 1280, + 1285, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 1287, + 1288, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 1272, + 1289, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 1302, + 1382, + 0 + ] + }, + "solid": { + "sourceRange": [ + 1384, + 1385, + 0 + ] + } + }, + "name": "fillet", + "sourceRange": [ + 1295, + 1386, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 1399, + 1491, + 0 + ] + }, + "solid": { + "sourceRange": [ + 1493, + 1494, + 0 + ] + } + }, + "name": "fillet", + "sourceRange": [ + 1392, + 1495, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 1523, + 1530, + 0 + ] + }, + "tag": { + "sourceRange": [ + 1532, + 1537, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 1509, + 1538, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 1740, + 1742, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 1744, + 1745, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 1732, + 1746, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/program_memory.snap b/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/program_memory.snap new file mode 100644 index 000000000..a4ee54e86 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/program_memory.snap @@ -0,0 +1,1565 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing sketch_on_face_after_fillets_referencing_face.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "FOS": { + "type": "Number", + "value": 2.0, + "__meta": [ + { + "sourceRange": [ + 719, + 720, + 0 + ] + } + ] + }, + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "L": { + "type": "Number", + "value": 12.0, + "__meta": [ + { + "sourceRange": [ + 640, + 642, + 0 + ] + } + ] + }, + "M": { + "type": "Number", + "value": 1800.0, + "__meta": [ + { + "sourceRange": [ + 640, + 642, + 0 + ] + }, + { + "sourceRange": [ + 608, + 611, + 0 + ] + }, + { + "sourceRange": [ + 665, + 666, + 0 + ] + } + ] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "bracket": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1048, + 1084, + 0 + ], + "tag": { + "end": 1083, + "start": 1073, + "type": "TagDeclarator", + "value": "outerEdge" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1090, + 1124, + 0 + ], + "tag": { + "end": 1123, + "start": 1117, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1130, + 1154, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1160, + 1209, + 0 + ], + "tag": { + "end": 1208, + "start": 1198, + "type": "TagDeclarator", + "value": "innerEdge" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1215, + 1252, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1258, + 1266, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1048, + 1084, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 1083, + "start": 1073, + "type": "TagDeclarator", + "value": "outerEdge" + }, + "to": [ + 0.0, + 6.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1090, + 1124, + 0 + ] + }, + "from": [ + 0.0, + 6.0 + ], + "tag": { + "end": 1123, + "start": 1117, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + -8.0, + 6.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1130, + 1154, + 0 + ] + }, + "from": [ + -8.0, + 6.0 + ], + "tag": null, + "to": [ + -8.0, + 5.6793 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1160, + 1209, + 0 + ] + }, + "from": [ + -8.0, + 5.6793 + ], + "tag": { + "end": 1208, + "start": 1198, + "type": "TagDeclarator", + "value": "innerEdge" + }, + "to": [ + -0.3207, + 5.6793 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1215, + 1252, + 0 + ] + }, + "from": [ + -0.3207, + 5.6793 + ], + "tag": null, + "to": [ + -0.3207, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1258, + 1266, + 0 + ] + }, + "from": [ + -0.3207, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1017, + 1042, + 0 + ] + } + }, + "tags": { + "innerEdge": { + "type": "TagIdentifier", + "value": "innerEdge", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1160, + 1209, + 0 + ] + }, + "from": [ + -8.0, + 5.679286509705091 + ], + "tag": { + "end": 1208, + "start": 1198, + "type": "TagDeclarator", + "value": "innerEdge" + }, + "to": [ + -0.32071349029490914, + 5.679286509705091 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1160, + 1209, + 0 + ], + "tag": { + "end": 1208, + "start": 1198, + "type": "TagDeclarator", + "value": "innerEdge" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1198, + 1208, + 0 + ] + } + ] + }, + "outerEdge": { + "type": "TagIdentifier", + "value": "outerEdge", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1048, + 1084, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 1083, + "start": 1073, + "type": "TagDeclarator", + "value": "outerEdge" + }, + "to": [ + 0.0, + 6.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1048, + 1084, + 0 + ], + "tag": { + "end": 1083, + "start": 1073, + "type": "TagDeclarator", + "value": "outerEdge" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1073, + 1083, + 0 + ] + } + ] + }, + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1090, + 1124, + 0 + ] + }, + "from": [ + 0.0, + 6.0 + ], + "tag": { + "end": 1123, + "start": 1117, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + -8.0, + 6.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1090, + 1124, + 0 + ], + "tag": { + "end": 1123, + "start": 1117, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1117, + 1123, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 1017, + 1042, + 0 + ] + } + ] + }, + "height": 6.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "edgeCuts": [ + { + "type": "fillet", + "id": "[uuid]", + "radius": 0.25, + "edgeId": "[uuid]", + "tag": null + }, + { + "type": "fillet", + "id": "[uuid]", + "radius": 0.5707134902949093, + "edgeId": "[uuid]", + "tag": null + } + ], + "__meta": [ + { + "sourceRange": [ + 1017, + 1042, + 0 + ] + } + ] + }, + "filletR": { + "type": "Number", + "value": 0.25, + "__meta": [ + { + "sourceRange": [ + 929, + 933, + 0 + ] + } + ] + }, + "innerEdge": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "innerEdge", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1160, + 1209, + 0 + ] + }, + "from": [ + -8.0, + 5.679286509705091 + ], + "tag": { + "end": 1208, + "start": 1198, + "type": "TagDeclarator", + "value": "innerEdge" + }, + "to": [ + -0.32071349029490914, + 5.679286509705091 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1160, + 1209, + 0 + ], + "tag": { + "end": 1208, + "start": 1198, + "type": "TagDeclarator", + "value": "innerEdge" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1198, + 1208, + 0 + ] + } + ] + }, + "outerEdge": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "outerEdge", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1048, + 1084, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 1083, + "start": 1073, + "type": "TagDeclarator", + "value": "outerEdge" + }, + "to": [ + 0.0, + 6.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1048, + 1084, + 0 + ], + "tag": { + "end": 1083, + "start": 1073, + "type": "TagDeclarator", + "value": "outerEdge" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1073, + 1083, + 0 + ] + } + ] + }, + "p": { + "type": "Number", + "value": 300.0, + "__meta": [ + { + "sourceRange": [ + 608, + 611, + 0 + ] + } + ] + }, + "seg01": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1090, + 1124, + 0 + ] + }, + "from": [ + 0.0, + 6.0 + ], + "tag": { + "end": 1123, + "start": 1117, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + -8.0, + 6.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1090, + 1124, + 0 + ], + "tag": { + "end": 1123, + "start": 1117, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1117, + 1123, + 0 + ] + } + ] + }, + "shelfMountL": { + "type": "Number", + "value": 8.0, + "__meta": [ + { + "sourceRange": [ + 368, + 369, + 0 + ] + } + ] + }, + "sigmaAllow": { + "type": "Number", + "value": 35000.0, + "__meta": [ + { + "sourceRange": [ + 573, + 578, + 0 + ] + } + ] + }, + "sketch001": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1581, + 1603, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1609, + 1631, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1637, + 1659, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1665, + 1712, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1581, + 1603, + 0 + ] + }, + "from": [ + 4.28, + 3.83 + ], + "tag": null, + "to": [ + 6.45, + 3.8 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1609, + 1631, + 0 + ] + }, + "from": [ + 6.45, + 3.8 + ], + "tag": null, + "to": [ + 6.38, + 2.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1637, + 1659, + 0 + ] + }, + "from": [ + 6.38, + 2.0 + ], + "tag": null, + "to": [ + 4.31, + 2.05 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1665, + 1712, + 0 + ] + }, + "from": [ + 4.31, + 2.05 + ], + "tag": null, + "to": [ + 4.28, + 3.83 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1718, + 1726, + 0 + ] + }, + "from": [ + 4.28, + 3.83 + ], + "tag": null, + "to": [ + 4.28, + 3.83 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "seg01", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1048, + 1084, + 0 + ], + "tag": { + "end": 1083, + "start": 1073, + "type": "TagDeclarator", + "value": "outerEdge" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1090, + 1124, + 0 + ], + "tag": { + "end": 1123, + "start": 1117, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1130, + 1154, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1160, + 1209, + 0 + ], + "tag": { + "end": 1208, + "start": 1198, + "type": "TagDeclarator", + "value": "innerEdge" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1215, + 1252, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1258, + 1266, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1048, + 1084, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 1083, + "start": 1073, + "type": "TagDeclarator", + "value": "outerEdge" + }, + "to": [ + 0.0, + 6.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1090, + 1124, + 0 + ] + }, + "from": [ + 0.0, + 6.0 + ], + "tag": { + "end": 1123, + "start": 1117, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + -8.0, + 6.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1130, + 1154, + 0 + ] + }, + "from": [ + -8.0, + 6.0 + ], + "tag": null, + "to": [ + -8.0, + 5.6793 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1160, + 1209, + 0 + ] + }, + "from": [ + -8.0, + 5.6793 + ], + "tag": { + "end": 1208, + "start": 1198, + "type": "TagDeclarator", + "value": "innerEdge" + }, + "to": [ + -0.3207, + 5.6793 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1215, + 1252, + 0 + ] + }, + "from": [ + -0.3207, + 5.6793 + ], + "tag": null, + "to": [ + -0.3207, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1258, + 1266, + 0 + ] + }, + "from": [ + -0.3207, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1017, + 1042, + 0 + ] + } + }, + "tags": { + "innerEdge": { + "type": "TagIdentifier", + "value": "innerEdge", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1160, + 1209, + 0 + ] + }, + "from": [ + -8.0, + 5.679286509705091 + ], + "tag": { + "end": 1208, + "start": 1198, + "type": "TagDeclarator", + "value": "innerEdge" + }, + "to": [ + -0.32071349029490914, + 5.679286509705091 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1160, + 1209, + 0 + ], + "tag": { + "end": 1208, + "start": 1198, + "type": "TagDeclarator", + "value": "innerEdge" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1198, + 1208, + 0 + ] + } + ] + }, + "outerEdge": { + "type": "TagIdentifier", + "value": "outerEdge", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1048, + 1084, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": { + "end": 1083, + "start": 1073, + "type": "TagDeclarator", + "value": "outerEdge" + }, + "to": [ + 0.0, + 6.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1048, + 1084, + 0 + ], + "tag": { + "end": 1083, + "start": 1073, + "type": "TagDeclarator", + "value": "outerEdge" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1073, + 1083, + 0 + ] + } + ] + }, + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1090, + 1124, + 0 + ] + }, + "from": [ + 0.0, + 6.0 + ], + "tag": { + "end": 1123, + "start": 1117, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + -8.0, + 6.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 1090, + 1124, + 0 + ], + "tag": { + "end": 1123, + "start": 1117, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 1117, + 1123, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 1017, + 1042, + 0 + ] + } + ] + }, + "height": 6.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "edgeCuts": [ + { + "type": "fillet", + "id": "[uuid]", + "radius": 0.25, + "edgeId": "[uuid]", + "tag": null + }, + { + "type": "fillet", + "id": "[uuid]", + "radius": 0.5707134902949093, + "edgeId": "[uuid]", + "tag": null + } + ], + "__meta": [ + { + "sourceRange": [ + 1017, + 1042, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 1509, + 1538, + 0 + ] + } + ] + }, + "start": { + "from": [ + 4.28, + 3.83 + ], + "to": [ + 4.28, + 3.83 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 1544, + 1575, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 1544, + 1575, + 0 + ] + } + ] + }, + "height": 10.0, + "startCapId": null, + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 1544, + 1575, + 0 + ] + } + ] + }, + "thickness": { + "type": "Number", + "value": 0.32071349029490925, + "__meta": [ + { + "sourceRange": [ + 850, + 890, + 0 + ] + } + ] + }, + "wallMountL": { + "type": "Number", + "value": 6.0, + "__meta": [ + { + "sourceRange": [ + 445, + 446, + 0 + ] + } + ] + }, + "width": { + "type": "Number", + "value": 6.0, + "__meta": [ + { + "sourceRange": [ + 594, + 595, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/rendered_model.png b/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/rendered_model.png new file mode 100644 index 000000000..3a563875d Binary files /dev/null and b/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/ast.snap b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/ast.snap new file mode 100644 index 000000000..bc3cabc3e --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/ast.snap @@ -0,0 +1,608 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing sketch_on_face_circle_tagged.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 175, + "id": { + "end": 7, + "name": "cube", + "start": 3, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "declaration": { + "end": 160, + "id": { + "end": 26, + "name": "sg", + "start": 24, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 47, + "raw": "'XY'", + "start": 43, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 42, + "name": "startSketchOn", + "start": 29, + "type": "Identifier" + }, + "end": 48, + "start": 29, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 74, + "name": "pos", + "start": 71, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 77, + "start": 76, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 70, + "name": "startProfileAt", + "start": 56, + "type": "Identifier" + }, + "end": 78, + "start": 56, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 93, + "raw": "0", + "start": 92, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 100, + "name": "scale", + "start": 95, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 101, + "start": 91, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 104, + "start": 103, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 90, + "name": "line", + "start": 86, + "type": "Identifier" + }, + "end": 105, + "start": 86, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 124, + "name": "scale", + "start": 119, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 127, + "raw": "0", + "start": 126, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 128, + "start": 118, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 131, + "start": 130, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 117, + "name": "line", + "start": 113, + "type": "Identifier" + }, + "end": 132, + "start": 113, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 147, + "raw": "0", + "start": 146, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 155, + "name": "scale", + "start": 150, + "type": "Identifier", + "type": "Identifier" + }, + "end": 155, + "operator": "-", + "start": 149, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 156, + "start": 145, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 159, + "start": 158, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 144, + "name": "line", + "start": 140, + "type": "Identifier" + }, + "end": 160, + "start": 140, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 160, + "start": 29, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 24, + "type": "VariableDeclarator" + }, + "end": 160, + "kind": "const", + "start": 24, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "argument": { + "end": 173, + "name": "sg", + "start": 171, + "type": "Identifier", + "type": "Identifier" + }, + "end": 173, + "start": 164, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 175, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 164, + "start": 160, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 20 + }, + "end": 175, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 11, + "name": "pos", + "start": 8, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 18, + "name": "scale", + "start": 13, + "type": "Identifier" + } + } + ], + "start": 7, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" + }, + "end": 175, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 236, + "id": { + "end": 183, + "name": "part001", + "start": 176, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "elements": [ + { + "end": 193, + "raw": "0", + "start": 192, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 196, + "raw": "0", + "start": 195, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 197, + "start": 191, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 201, + "raw": "20", + "start": 199, + "type": "Literal", + "type": "Literal", + "value": 20.0 + } + ], + "callee": { + "end": 190, + "name": "cube", + "start": 186, + "type": "Identifier" + }, + "end": 202, + "start": 186, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 215, + "start": 214, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 213, + "name": "close", + "start": 208, + "type": "Identifier" + }, + "end": 216, + "start": 208, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 232, + "raw": "20", + "start": 230, + "type": "Literal", + "type": "Literal", + "value": 20.0 + }, + { + "end": 235, + "start": 234, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 229, + "name": "extrude", + "start": 222, + "type": "Identifier" + }, + "end": 236, + "start": 222, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 236, + "start": 186, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 176, + "type": "VariableDeclarator" + }, + "end": 236, + "kind": "const", + "start": 176, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 355, + "id": { + "end": 245, + "name": "part002", + "start": 238, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 269, + "name": "part001", + "start": 262, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 276, + "raw": "\"end\"", + "start": 271, + "type": "Literal", + "type": "Literal", + "value": "end" + } + ], + "callee": { + "end": 261, + "name": "startSketchOn", + "start": 248, + "type": "Identifier" + }, + "end": 277, + "start": 248, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 321, + "properties": [ + { + "end": 307, + "key": { + "end": 298, + "name": "center", + "start": 292, + "type": "Identifier" + }, + "start": 292, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 303, + "raw": "0", + "start": 302, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 306, + "raw": "0", + "start": 305, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 307, + "start": 301, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "end": 319, + "key": { + "end": 315, + "name": "radius", + "start": 309, + "type": "Identifier" + }, + "start": 309, + "type": "ObjectProperty", + "value": { + "end": 319, + "raw": "5", + "start": 318, + "type": "Literal", + "type": "Literal", + "value": 5.0 + } + } + ], + "start": 290, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 324, + "start": 323, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 335, + "start": 326, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "myCircle" + } + ], + "callee": { + "end": 289, + "name": "circle", + "start": 283, + "type": "Identifier" + }, + "end": 336, + "start": 283, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 351, + "raw": "5", + "start": 350, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + { + "end": 354, + "start": 353, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 349, + "name": "extrude", + "start": 342, + "type": "Identifier" + }, + "end": 355, + "start": 342, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 355, + "start": 248, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 238, + "type": "VariableDeclarator" + }, + "end": 355, + "kind": "const", + "start": 238, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 356, + "nonCodeMeta": { + "nonCodeNodes": { + "1": [ + { + "end": 238, + "start": 236, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/input.kcl b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/input.kcl new file mode 100644 index 000000000..6c845a55b --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/input.kcl @@ -0,0 +1,16 @@ +fn cube(pos, scale) { + sg = startSketchOn('XY') + |> startProfileAt(pos, %) + |> line([0, scale], %) + |> line([scale, 0], %) + |> line([0, -scale], %) + + return sg +} +part001 = cube([0, 0], 20) + |> close(%) + |> extrude(20, %) + +part002 = startSketchOn(part001, "end") + |> circle({ center = [0, 0], radius = 5 }, %, $myCircle) + |> extrude(5, %) diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/ops.snap b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/ops.snap new file mode 100644 index 000000000..fccf2ab3b --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/ops.snap @@ -0,0 +1,123 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed sketch_on_face_circle_tagged.kcl +snapshot_kind: text +--- +[ + { + "type": "UserDefinedFunctionCall", + "name": "cube", + "functionSourceRange": [ + 7, + 175, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 186, + 202, + 0 + ] + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 43, + 47, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 29, + 48, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 230, + 232, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 234, + 235, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 222, + 236, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 262, + 269, + 0 + ] + }, + "tag": { + "sourceRange": [ + 271, + 276, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 248, + 277, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 350, + 351, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 353, + 354, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 342, + 355, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/program_memory.snap b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/program_memory.snap new file mode 100644 index 000000000..e6a5ae5b0 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/program_memory.snap @@ -0,0 +1,1015 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing sketch_on_face_circle_tagged.kcl +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "cube": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "declaration": { + "end": 160, + "id": { + "end": 26, + "name": "sg", + "start": 24, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 47, + "raw": "'XY'", + "start": 43, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 42, + "name": "startSketchOn", + "start": 29, + "type": "Identifier" + }, + "end": 48, + "start": 29, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 74, + "name": "pos", + "start": 71, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 77, + "start": 76, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 70, + "name": "startProfileAt", + "start": 56, + "type": "Identifier" + }, + "end": 78, + "start": 56, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 93, + "raw": "0", + "start": 92, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 100, + "name": "scale", + "start": 95, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 101, + "start": 91, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 104, + "start": 103, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 90, + "name": "line", + "start": 86, + "type": "Identifier" + }, + "end": 105, + "start": 86, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 124, + "name": "scale", + "start": 119, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 127, + "raw": "0", + "start": 126, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 128, + "start": 118, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 131, + "start": 130, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 117, + "name": "line", + "start": 113, + "type": "Identifier" + }, + "end": 132, + "start": 113, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 147, + "raw": "0", + "start": 146, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 155, + "name": "scale", + "start": 150, + "type": "Identifier", + "type": "Identifier" + }, + "end": 155, + "operator": "-", + "start": 149, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 156, + "start": 145, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 159, + "start": 158, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 144, + "name": "line", + "start": 140, + "type": "Identifier" + }, + "end": 160, + "start": 140, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 160, + "start": 29, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 24, + "type": "VariableDeclarator" + }, + "end": 160, + "kind": "const", + "start": 24, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "argument": { + "end": 173, + "name": "sg", + "start": 171, + "type": "Identifier", + "type": "Identifier" + }, + "end": 173, + "start": 164, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 175, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 164, + "start": 160, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 20 + }, + "end": 175, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 11, + "name": "pos", + "start": 8, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 18, + "name": "scale", + "start": 13, + "type": "Identifier" + } + } + ], + "start": 7, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 7, + 175, + 0 + ] + } + ] + }, + "myCircle": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "myCircle", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 283, + 336, + 0 + ] + }, + "ccw": true, + "center": [ + 0.0, + 0.0 + ], + "from": [ + 5.0, + 0.0 + ], + "radius": 5.0, + "tag": { + "end": 335, + "start": 326, + "type": "TagDeclarator", + "value": "myCircle" + }, + "to": [ + 5.0, + 0.0 + ], + "type": "Circle" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 283, + 336, + 0 + ], + "tag": { + "end": 335, + "start": 326, + "type": "TagDeclarator", + "value": "myCircle" + }, + "type": "extrudeArc" + } + }, + "__meta": [ + { + "sourceRange": [ + 326, + 335, + 0 + ] + } + ] + }, + "part001": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 86, + 105, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 113, + 132, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 140, + 160, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 208, + 216, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 86, + 105, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 113, + 132, + 0 + ] + }, + "from": [ + 0.0, + 20.0 + ], + "tag": null, + "to": [ + 20.0, + 20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 140, + 160, + 0 + ] + }, + "from": [ + 20.0, + 20.0 + ], + "tag": null, + "to": [ + 20.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 208, + 216, + 0 + ] + }, + "from": [ + 20.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 56, + 78, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 56, + 78, + 0 + ] + } + ] + }, + "height": 20.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 56, + 78, + 0 + ] + } + ] + }, + "part002": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 283, + 336, + 0 + ], + "tag": { + "end": 335, + "start": 326, + "type": "TagDeclarator", + "value": "myCircle" + }, + "type": "extrudeArc" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 283, + 336, + 0 + ] + }, + "ccw": true, + "center": [ + 0.0, + 0.0 + ], + "from": [ + 5.0, + 0.0 + ], + "radius": 5.0, + "tag": { + "end": 335, + "start": 326, + "type": "TagDeclarator", + "value": "myCircle" + }, + "to": [ + 5.0, + 0.0 + ], + "type": "Circle" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "end", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 86, + 105, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 113, + 132, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 140, + 160, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 208, + 216, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 86, + 105, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 113, + 132, + 0 + ] + }, + "from": [ + 0.0, + 20.0 + ], + "tag": null, + "to": [ + 20.0, + 20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 140, + 160, + 0 + ] + }, + "from": [ + 20.0, + 20.0 + ], + "tag": null, + "to": [ + 20.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 208, + 216, + 0 + ] + }, + "from": [ + 20.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 56, + 78, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 56, + 78, + 0 + ] + } + ] + }, + "height": 20.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 56, + 78, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 248, + 277, + 0 + ] + } + ] + }, + "start": { + "from": [ + 5.0, + 0.0 + ], + "to": [ + 5.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 283, + 336, + 0 + ] + } + }, + "tags": { + "myCircle": { + "type": "TagIdentifier", + "value": "myCircle", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 283, + 336, + 0 + ] + }, + "ccw": true, + "center": [ + 0.0, + 0.0 + ], + "from": [ + 5.0, + 0.0 + ], + "radius": 5.0, + "tag": { + "end": 335, + "start": 326, + "type": "TagDeclarator", + "value": "myCircle" + }, + "to": [ + 5.0, + 0.0 + ], + "type": "Circle" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 283, + 336, + 0 + ], + "tag": { + "end": 335, + "start": 326, + "type": "TagDeclarator", + "value": "myCircle" + }, + "type": "extrudeArc" + } + }, + "__meta": [ + { + "sourceRange": [ + 326, + 335, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 283, + 336, + 0 + ] + } + ] + }, + "height": 5.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 283, + 336, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/rendered_model.png b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/rendered_model.png new file mode 100644 index 000000000..2d076a02a Binary files /dev/null and b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_end/ast.snap b/src/wasm-lib/kcl/tests/sketch_on_face_end/ast.snap new file mode 100644 index 000000000..3e06be725 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_end/ast.snap @@ -0,0 +1,722 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing sketch_on_face_end.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 175, + "id": { + "end": 7, + "name": "cube", + "start": 3, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "declaration": { + "end": 160, + "id": { + "end": 26, + "name": "sg", + "start": 24, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 47, + "raw": "'XY'", + "start": 43, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 42, + "name": "startSketchOn", + "start": 29, + "type": "Identifier" + }, + "end": 48, + "start": 29, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 74, + "name": "pos", + "start": 71, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 77, + "start": 76, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 70, + "name": "startProfileAt", + "start": 56, + "type": "Identifier" + }, + "end": 78, + "start": 56, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 93, + "raw": "0", + "start": 92, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 100, + "name": "scale", + "start": 95, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 101, + "start": 91, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 104, + "start": 103, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 90, + "name": "line", + "start": 86, + "type": "Identifier" + }, + "end": 105, + "start": 86, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 124, + "name": "scale", + "start": 119, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 127, + "raw": "0", + "start": 126, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 128, + "start": 118, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 131, + "start": 130, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 117, + "name": "line", + "start": 113, + "type": "Identifier" + }, + "end": 132, + "start": 113, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 147, + "raw": "0", + "start": 146, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 155, + "name": "scale", + "start": 150, + "type": "Identifier", + "type": "Identifier" + }, + "end": 155, + "operator": "-", + "start": 149, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 156, + "start": 145, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 159, + "start": 158, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 144, + "name": "line", + "start": 140, + "type": "Identifier" + }, + "end": 160, + "start": 140, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 160, + "start": 29, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 24, + "type": "VariableDeclarator" + }, + "end": 160, + "kind": "const", + "start": 24, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "argument": { + "end": 173, + "name": "sg", + "start": 171, + "type": "Identifier", + "type": "Identifier" + }, + "end": 173, + "start": 164, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 175, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 164, + "start": 160, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 20 + }, + "end": 175, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 11, + "name": "pos", + "start": 8, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 18, + "name": "scale", + "start": 13, + "type": "Identifier" + } + } + ], + "start": 7, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" + }, + "end": 175, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 236, + "id": { + "end": 183, + "name": "part001", + "start": 176, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "elements": [ + { + "end": 193, + "raw": "0", + "start": 192, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 196, + "raw": "0", + "start": 195, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 197, + "start": 191, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 201, + "raw": "20", + "start": 199, + "type": "Literal", + "type": "Literal", + "value": 20.0 + } + ], + "callee": { + "end": 190, + "name": "cube", + "start": 186, + "type": "Identifier" + }, + "end": 202, + "start": 186, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 215, + "start": 214, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 213, + "name": "close", + "start": 208, + "type": "Identifier" + }, + "end": 216, + "start": 208, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 232, + "raw": "20", + "start": 230, + "type": "Literal", + "type": "Literal", + "value": 20.0 + }, + { + "end": 235, + "start": 234, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 229, + "name": "extrude", + "start": 222, + "type": "Identifier" + }, + "end": 236, + "start": 222, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 236, + "start": 186, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 176, + "type": "VariableDeclarator" + }, + "end": 236, + "kind": "const", + "start": 176, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 408, + "id": { + "end": 245, + "name": "part002", + "start": 238, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 269, + "name": "part001", + "start": 262, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 276, + "raw": "\"END\"", + "start": 271, + "type": "Literal", + "type": "Literal", + "value": "END" + } + ], + "callee": { + "end": 261, + "name": "startSketchOn", + "start": 248, + "type": "Identifier" + }, + "end": 277, + "start": 248, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 300, + "raw": "0", + "start": 299, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 303, + "raw": "0", + "start": 302, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 304, + "start": 298, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 307, + "start": 306, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 297, + "name": "startProfileAt", + "start": 283, + "type": "Identifier" + }, + "end": 308, + "start": 283, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 321, + "raw": "0", + "start": 320, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 325, + "raw": "10", + "start": 323, + "type": "Literal", + "type": "Literal", + "value": 10.0 + } + ], + "end": 326, + "start": 319, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 329, + "start": 328, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 318, + "name": "line", + "start": 314, + "type": "Identifier" + }, + "end": 330, + "start": 314, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 344, + "raw": "10", + "start": 342, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + { + "end": 347, + "raw": "0", + "start": 346, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 348, + "start": 341, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 351, + "start": 350, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 340, + "name": "line", + "start": 336, + "type": "Identifier" + }, + "end": 352, + "start": 336, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 365, + "raw": "0", + "start": 364, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 370, + "raw": "10", + "start": 368, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + "end": 370, + "operator": "-", + "start": 367, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 371, + "start": 363, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 374, + "start": 373, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 362, + "name": "line", + "start": 358, + "type": "Identifier" + }, + "end": 375, + "start": 358, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 388, + "start": 387, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 386, + "name": "close", + "start": 381, + "type": "Identifier" + }, + "end": 389, + "start": 381, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 404, + "raw": "5", + "start": 403, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + { + "end": 407, + "start": 406, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 402, + "name": "extrude", + "start": 395, + "type": "Identifier" + }, + "end": 408, + "start": 395, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 408, + "start": 248, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 238, + "type": "VariableDeclarator" + }, + "end": 408, + "kind": "const", + "start": 238, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 409, + "nonCodeMeta": { + "nonCodeNodes": { + "1": [ + { + "end": 238, + "start": 236, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_end/input.kcl b/src/wasm-lib/kcl/tests/sketch_on_face_end/input.kcl new file mode 100644 index 000000000..65fd39cd3 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_end/input.kcl @@ -0,0 +1,20 @@ +fn cube(pos, scale) { + sg = startSketchOn('XY') + |> startProfileAt(pos, %) + |> line([0, scale], %) + |> line([scale, 0], %) + |> line([0, -scale], %) + + return sg +} +part001 = cube([0, 0], 20) + |> close(%) + |> extrude(20, %) + +part002 = startSketchOn(part001, "END") + |> startProfileAt([0, 0], %) + |> line([0, 10], %) + |> line([10, 0], %) + |> line([0, -10], %) + |> close(%) + |> extrude(5, %) diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_end/ops.snap b/src/wasm-lib/kcl/tests/sketch_on_face_end/ops.snap new file mode 100644 index 000000000..d94444a8d --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_end/ops.snap @@ -0,0 +1,123 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed sketch_on_face_end.kcl +snapshot_kind: text +--- +[ + { + "type": "UserDefinedFunctionCall", + "name": "cube", + "functionSourceRange": [ + 7, + 175, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 186, + 202, + 0 + ] + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 43, + 47, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 29, + 48, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 230, + 232, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 234, + 235, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 222, + 236, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 262, + 269, + 0 + ] + }, + "tag": { + "sourceRange": [ + 271, + 276, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 248, + 277, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 403, + 404, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 406, + 407, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 395, + 408, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_end/program_memory.snap b/src/wasm-lib/kcl/tests/sketch_on_face_end/program_memory.snap new file mode 100644 index 000000000..98ec90562 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_end/program_memory.snap @@ -0,0 +1,959 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing sketch_on_face_end.kcl +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "cube": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "declaration": { + "end": 160, + "id": { + "end": 26, + "name": "sg", + "start": 24, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 47, + "raw": "'XY'", + "start": 43, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 42, + "name": "startSketchOn", + "start": 29, + "type": "Identifier" + }, + "end": 48, + "start": 29, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 74, + "name": "pos", + "start": 71, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 77, + "start": 76, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 70, + "name": "startProfileAt", + "start": 56, + "type": "Identifier" + }, + "end": 78, + "start": 56, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 93, + "raw": "0", + "start": 92, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 100, + "name": "scale", + "start": 95, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 101, + "start": 91, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 104, + "start": 103, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 90, + "name": "line", + "start": 86, + "type": "Identifier" + }, + "end": 105, + "start": 86, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 124, + "name": "scale", + "start": 119, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 127, + "raw": "0", + "start": 126, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 128, + "start": 118, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 131, + "start": 130, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 117, + "name": "line", + "start": 113, + "type": "Identifier" + }, + "end": 132, + "start": 113, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 147, + "raw": "0", + "start": 146, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 155, + "name": "scale", + "start": 150, + "type": "Identifier", + "type": "Identifier" + }, + "end": 155, + "operator": "-", + "start": 149, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 156, + "start": 145, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 159, + "start": 158, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 144, + "name": "line", + "start": 140, + "type": "Identifier" + }, + "end": 160, + "start": 140, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 160, + "start": 29, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 24, + "type": "VariableDeclarator" + }, + "end": 160, + "kind": "const", + "start": 24, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "argument": { + "end": 173, + "name": "sg", + "start": 171, + "type": "Identifier", + "type": "Identifier" + }, + "end": 173, + "start": 164, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 175, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 164, + "start": 160, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 20 + }, + "end": 175, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 11, + "name": "pos", + "start": 8, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 18, + "name": "scale", + "start": 13, + "type": "Identifier" + } + } + ], + "start": 7, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 7, + 175, + 0 + ] + } + ] + }, + "part001": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 86, + 105, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 113, + 132, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 140, + 160, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 208, + 216, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 86, + 105, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 113, + 132, + 0 + ] + }, + "from": [ + 0.0, + 20.0 + ], + "tag": null, + "to": [ + 20.0, + 20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 140, + 160, + 0 + ] + }, + "from": [ + 20.0, + 20.0 + ], + "tag": null, + "to": [ + 20.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 208, + 216, + 0 + ] + }, + "from": [ + 20.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 56, + 78, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 56, + 78, + 0 + ] + } + ] + }, + "height": 20.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 56, + 78, + 0 + ] + } + ] + }, + "part002": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 314, + 330, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 336, + 352, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 358, + 375, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 381, + 389, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 314, + 330, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 10.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 336, + 352, + 0 + ] + }, + "from": [ + 0.0, + 10.0 + ], + "tag": null, + "to": [ + 10.0, + 10.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 358, + 375, + 0 + ] + }, + "from": [ + 10.0, + 10.0 + ], + "tag": null, + "to": [ + 10.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 381, + 389, + 0 + ] + }, + "from": [ + 10.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "end", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 86, + 105, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 113, + 132, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 140, + 160, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 208, + 216, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 86, + 105, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 113, + 132, + 0 + ] + }, + "from": [ + 0.0, + 20.0 + ], + "tag": null, + "to": [ + 20.0, + 20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 140, + 160, + 0 + ] + }, + "from": [ + 20.0, + 20.0 + ], + "tag": null, + "to": [ + 20.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 208, + 216, + 0 + ] + }, + "from": [ + 20.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 56, + 78, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 56, + 78, + 0 + ] + } + ] + }, + "height": 20.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 56, + 78, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 248, + 277, + 0 + ] + } + ] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 283, + 308, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 283, + 308, + 0 + ] + } + ] + }, + "height": 5.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 283, + 308, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_end/rendered_model.png b/src/wasm-lib/kcl/tests/sketch_on_face_end/rendered_model.png new file mode 100644 index 000000000..8f8748462 Binary files /dev/null and b/src/wasm-lib/kcl/tests/sketch_on_face_end/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/ast.snap b/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/ast.snap new file mode 100644 index 000000000..d086ed494 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/ast.snap @@ -0,0 +1,729 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing sketch_on_face_end_negative_extrude.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 175, + "id": { + "end": 7, + "name": "cube", + "start": 3, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "declaration": { + "end": 160, + "id": { + "end": 26, + "name": "sg", + "start": 24, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 47, + "raw": "'XY'", + "start": 43, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 42, + "name": "startSketchOn", + "start": 29, + "type": "Identifier" + }, + "end": 48, + "start": 29, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 74, + "name": "pos", + "start": 71, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 77, + "start": 76, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 70, + "name": "startProfileAt", + "start": 56, + "type": "Identifier" + }, + "end": 78, + "start": 56, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 93, + "raw": "0", + "start": 92, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 100, + "name": "scale", + "start": 95, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 101, + "start": 91, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 104, + "start": 103, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 90, + "name": "line", + "start": 86, + "type": "Identifier" + }, + "end": 105, + "start": 86, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 124, + "name": "scale", + "start": 119, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 127, + "raw": "0", + "start": 126, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 128, + "start": 118, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 131, + "start": 130, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 117, + "name": "line", + "start": 113, + "type": "Identifier" + }, + "end": 132, + "start": 113, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 147, + "raw": "0", + "start": 146, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 155, + "name": "scale", + "start": 150, + "type": "Identifier", + "type": "Identifier" + }, + "end": 155, + "operator": "-", + "start": 149, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 156, + "start": 145, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 159, + "start": 158, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 144, + "name": "line", + "start": 140, + "type": "Identifier" + }, + "end": 160, + "start": 140, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 160, + "start": 29, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 24, + "type": "VariableDeclarator" + }, + "end": 160, + "kind": "const", + "start": 24, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "argument": { + "end": 173, + "name": "sg", + "start": 171, + "type": "Identifier", + "type": "Identifier" + }, + "end": 173, + "start": 164, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 175, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 164, + "start": 160, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 20 + }, + "end": 175, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 11, + "name": "pos", + "start": 8, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 18, + "name": "scale", + "start": 13, + "type": "Identifier" + } + } + ], + "start": 7, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" + }, + "end": 175, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 236, + "id": { + "end": 183, + "name": "part001", + "start": 176, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "elements": [ + { + "end": 193, + "raw": "0", + "start": 192, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 196, + "raw": "0", + "start": 195, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 197, + "start": 191, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 201, + "raw": "20", + "start": 199, + "type": "Literal", + "type": "Literal", + "value": 20.0 + } + ], + "callee": { + "end": 190, + "name": "cube", + "start": 186, + "type": "Identifier" + }, + "end": 202, + "start": 186, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 215, + "start": 214, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 213, + "name": "close", + "start": 208, + "type": "Identifier" + }, + "end": 216, + "start": 208, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 232, + "raw": "20", + "start": 230, + "type": "Literal", + "type": "Literal", + "value": 20.0 + }, + { + "end": 235, + "start": 234, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 229, + "name": "extrude", + "start": 222, + "type": "Identifier" + }, + "end": 236, + "start": 222, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 236, + "start": 186, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 176, + "type": "VariableDeclarator" + }, + "end": 236, + "kind": "const", + "start": 176, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 409, + "id": { + "end": 245, + "name": "part002", + "start": 238, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 269, + "name": "part001", + "start": 262, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 276, + "raw": "\"END\"", + "start": 271, + "type": "Literal", + "type": "Literal", + "value": "END" + } + ], + "callee": { + "end": 261, + "name": "startSketchOn", + "start": 248, + "type": "Identifier" + }, + "end": 277, + "start": 248, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 300, + "raw": "0", + "start": 299, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 303, + "raw": "0", + "start": 302, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 304, + "start": 298, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 307, + "start": 306, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 297, + "name": "startProfileAt", + "start": 283, + "type": "Identifier" + }, + "end": 308, + "start": 283, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 321, + "raw": "0", + "start": 320, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 325, + "raw": "10", + "start": 323, + "type": "Literal", + "type": "Literal", + "value": 10.0 + } + ], + "end": 326, + "start": 319, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 329, + "start": 328, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 318, + "name": "line", + "start": 314, + "type": "Identifier" + }, + "end": 330, + "start": 314, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 344, + "raw": "10", + "start": 342, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + { + "end": 347, + "raw": "0", + "start": 346, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 348, + "start": 341, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 351, + "start": 350, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 340, + "name": "line", + "start": 336, + "type": "Identifier" + }, + "end": 352, + "start": 336, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 365, + "raw": "0", + "start": 364, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 370, + "raw": "10", + "start": 368, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + "end": 370, + "operator": "-", + "start": 367, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 371, + "start": 363, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 374, + "start": 373, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 362, + "name": "line", + "start": 358, + "type": "Identifier" + }, + "end": 375, + "start": 358, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 388, + "start": 387, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 386, + "name": "close", + "start": 381, + "type": "Identifier" + }, + "end": 389, + "start": 381, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "argument": { + "end": 405, + "raw": "5", + "start": 404, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + "end": 405, + "operator": "-", + "start": 403, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 408, + "start": 407, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 402, + "name": "extrude", + "start": 395, + "type": "Identifier" + }, + "end": 409, + "start": 395, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 409, + "start": 248, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 238, + "type": "VariableDeclarator" + }, + "end": 409, + "kind": "const", + "start": 238, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 410, + "nonCodeMeta": { + "nonCodeNodes": { + "1": [ + { + "end": 238, + "start": 236, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/input.kcl b/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/input.kcl new file mode 100644 index 000000000..7b65dfd3b --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/input.kcl @@ -0,0 +1,20 @@ +fn cube(pos, scale) { + sg = startSketchOn('XY') + |> startProfileAt(pos, %) + |> line([0, scale], %) + |> line([scale, 0], %) + |> line([0, -scale], %) + + return sg +} +part001 = cube([0, 0], 20) + |> close(%) + |> extrude(20, %) + +part002 = startSketchOn(part001, "END") + |> startProfileAt([0, 0], %) + |> line([0, 10], %) + |> line([10, 0], %) + |> line([0, -10], %) + |> close(%) + |> extrude(-5, %) diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/ops.snap b/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/ops.snap new file mode 100644 index 000000000..e9a4b2dbf --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/ops.snap @@ -0,0 +1,123 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed sketch_on_face_end_negative_extrude.kcl +snapshot_kind: text +--- +[ + { + "type": "UserDefinedFunctionCall", + "name": "cube", + "functionSourceRange": [ + 7, + 175, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 186, + 202, + 0 + ] + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 43, + 47, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 29, + 48, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 230, + 232, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 234, + 235, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 222, + 236, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 262, + 269, + 0 + ] + }, + "tag": { + "sourceRange": [ + 271, + 276, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 248, + 277, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 403, + 405, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 407, + 408, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 395, + 409, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/program_memory.snap b/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/program_memory.snap new file mode 100644 index 000000000..95fb3387f --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/program_memory.snap @@ -0,0 +1,959 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing sketch_on_face_end_negative_extrude.kcl +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "cube": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "declaration": { + "end": 160, + "id": { + "end": 26, + "name": "sg", + "start": 24, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 47, + "raw": "'XY'", + "start": 43, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 42, + "name": "startSketchOn", + "start": 29, + "type": "Identifier" + }, + "end": 48, + "start": 29, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 74, + "name": "pos", + "start": 71, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 77, + "start": 76, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 70, + "name": "startProfileAt", + "start": 56, + "type": "Identifier" + }, + "end": 78, + "start": 56, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 93, + "raw": "0", + "start": 92, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 100, + "name": "scale", + "start": 95, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 101, + "start": 91, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 104, + "start": 103, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 90, + "name": "line", + "start": 86, + "type": "Identifier" + }, + "end": 105, + "start": 86, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 124, + "name": "scale", + "start": 119, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 127, + "raw": "0", + "start": 126, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 128, + "start": 118, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 131, + "start": 130, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 117, + "name": "line", + "start": 113, + "type": "Identifier" + }, + "end": 132, + "start": 113, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 147, + "raw": "0", + "start": 146, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 155, + "name": "scale", + "start": 150, + "type": "Identifier", + "type": "Identifier" + }, + "end": 155, + "operator": "-", + "start": 149, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 156, + "start": 145, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 159, + "start": 158, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 144, + "name": "line", + "start": 140, + "type": "Identifier" + }, + "end": 160, + "start": 140, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 160, + "start": 29, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 24, + "type": "VariableDeclarator" + }, + "end": 160, + "kind": "const", + "start": 24, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "argument": { + "end": 173, + "name": "sg", + "start": 171, + "type": "Identifier", + "type": "Identifier" + }, + "end": 173, + "start": 164, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 175, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 164, + "start": 160, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 20 + }, + "end": 175, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 11, + "name": "pos", + "start": 8, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 18, + "name": "scale", + "start": 13, + "type": "Identifier" + } + } + ], + "start": 7, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 7, + 175, + 0 + ] + } + ] + }, + "part001": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 86, + 105, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 113, + 132, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 140, + 160, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 208, + 216, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 86, + 105, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 113, + 132, + 0 + ] + }, + "from": [ + 0.0, + 20.0 + ], + "tag": null, + "to": [ + 20.0, + 20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 140, + 160, + 0 + ] + }, + "from": [ + 20.0, + 20.0 + ], + "tag": null, + "to": [ + 20.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 208, + 216, + 0 + ] + }, + "from": [ + 20.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 56, + 78, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 56, + 78, + 0 + ] + } + ] + }, + "height": 20.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 56, + 78, + 0 + ] + } + ] + }, + "part002": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 314, + 330, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 336, + 352, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 358, + 375, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 381, + 389, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 314, + 330, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 10.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 336, + 352, + 0 + ] + }, + "from": [ + 0.0, + 10.0 + ], + "tag": null, + "to": [ + 10.0, + 10.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 358, + 375, + 0 + ] + }, + "from": [ + 10.0, + 10.0 + ], + "tag": null, + "to": [ + 10.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 381, + 389, + 0 + ] + }, + "from": [ + 10.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "end", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 86, + 105, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 113, + 132, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 140, + 160, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 208, + 216, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 86, + 105, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 113, + 132, + 0 + ] + }, + "from": [ + 0.0, + 20.0 + ], + "tag": null, + "to": [ + 20.0, + 20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 140, + 160, + 0 + ] + }, + "from": [ + 20.0, + 20.0 + ], + "tag": null, + "to": [ + 20.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 208, + 216, + 0 + ] + }, + "from": [ + 20.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 56, + 78, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 56, + 78, + 0 + ] + } + ] + }, + "height": 20.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 56, + 78, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 248, + 277, + 0 + ] + } + ] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 283, + 308, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 283, + 308, + 0 + ] + } + ] + }, + "height": -5.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 283, + 308, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/rendered_model.png b/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/rendered_model.png new file mode 100644 index 000000000..31d2b08af Binary files /dev/null and b/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_start/ast.snap b/src/wasm-lib/kcl/tests/sketch_on_face_start/ast.snap new file mode 100644 index 000000000..482c000c8 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_start/ast.snap @@ -0,0 +1,734 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing sketch_on_face_start.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 175, + "id": { + "end": 7, + "name": "cube", + "start": 3, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "declaration": { + "end": 160, + "id": { + "end": 26, + "name": "sg", + "start": 24, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 47, + "raw": "'XY'", + "start": 43, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 42, + "name": "startSketchOn", + "start": 29, + "type": "Identifier" + }, + "end": 48, + "start": 29, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 74, + "name": "pos", + "start": 71, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 77, + "start": 76, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 70, + "name": "startProfileAt", + "start": 56, + "type": "Identifier" + }, + "end": 78, + "start": 56, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 93, + "raw": "0", + "start": 92, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 100, + "name": "scale", + "start": 95, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 101, + "start": 91, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 104, + "start": 103, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 90, + "name": "line", + "start": 86, + "type": "Identifier" + }, + "end": 105, + "start": 86, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 124, + "name": "scale", + "start": 119, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 127, + "raw": "0", + "start": 126, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 128, + "start": 118, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 131, + "start": 130, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 117, + "name": "line", + "start": 113, + "type": "Identifier" + }, + "end": 132, + "start": 113, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 147, + "raw": "0", + "start": 146, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 155, + "name": "scale", + "start": 150, + "type": "Identifier", + "type": "Identifier" + }, + "end": 155, + "operator": "-", + "start": 149, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 156, + "start": 145, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 159, + "start": 158, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 144, + "name": "line", + "start": 140, + "type": "Identifier" + }, + "end": 160, + "start": 140, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 160, + "start": 29, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 24, + "type": "VariableDeclarator" + }, + "end": 160, + "kind": "const", + "start": 24, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "argument": { + "end": 173, + "name": "sg", + "start": 171, + "type": "Identifier", + "type": "Identifier" + }, + "end": 173, + "start": 164, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 175, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 164, + "start": 160, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 20 + }, + "end": 175, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 11, + "name": "pos", + "start": 8, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 18, + "name": "scale", + "start": 13, + "type": "Identifier" + } + } + ], + "start": 7, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" + }, + "end": 175, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 243, + "id": { + "end": 183, + "name": "part001", + "start": 176, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "elements": [ + { + "end": 193, + "raw": "0", + "start": 192, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 196, + "raw": "0", + "start": 195, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 197, + "start": 191, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 201, + "raw": "20", + "start": 199, + "type": "Literal", + "type": "Literal", + "value": 20.0 + } + ], + "callee": { + "end": 190, + "name": "cube", + "start": 186, + "type": "Identifier" + }, + "end": 202, + "start": 186, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 215, + "start": 214, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 213, + "name": "close", + "start": 208, + "type": "Identifier" + }, + "end": 216, + "start": 208, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "end": 243, + "expr": { + "arguments": [ + { + "end": 232, + "raw": "20", + "start": 230, + "type": "Literal", + "type": "Literal", + "value": 20.0 + }, + { + "end": 235, + "start": 234, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 229, + "name": "extrude", + "start": 222, + "type": "Identifier" + }, + "end": 236, + "start": 222, + "type": "CallExpression", + "type": "CallExpression" + }, + "label": { + "end": 243, + "name": "foo", + "start": 240, + "type": "Identifier" + }, + "start": 222, + "type": "LabelledExpression", + "type": "LabelledExpression" + } + ], + "end": 243, + "start": 186, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 176, + "type": "VariableDeclarator" + }, + "end": 243, + "kind": "const", + "start": 176, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 413, + "id": { + "end": 252, + "name": "part002", + "start": 245, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 272, + "name": "foo", + "start": 269, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 281, + "raw": "\"start\"", + "start": 274, + "type": "Literal", + "type": "Literal", + "value": "start" + } + ], + "callee": { + "end": 268, + "name": "startSketchOn", + "start": 255, + "type": "Identifier" + }, + "end": 282, + "start": 255, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 305, + "raw": "0", + "start": 304, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 308, + "raw": "0", + "start": 307, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 309, + "start": 303, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 312, + "start": 311, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 302, + "name": "startProfileAt", + "start": 288, + "type": "Identifier" + }, + "end": 313, + "start": 288, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 326, + "raw": "0", + "start": 325, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 330, + "raw": "10", + "start": 328, + "type": "Literal", + "type": "Literal", + "value": 10.0 + } + ], + "end": 331, + "start": 324, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 334, + "start": 333, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 323, + "name": "line", + "start": 319, + "type": "Identifier" + }, + "end": 335, + "start": 319, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 349, + "raw": "10", + "start": 347, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + { + "end": 352, + "raw": "0", + "start": 351, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 353, + "start": 346, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 356, + "start": 355, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 345, + "name": "line", + "start": 341, + "type": "Identifier" + }, + "end": 357, + "start": 341, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 370, + "raw": "0", + "start": 369, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 375, + "raw": "10", + "start": 373, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + "end": 375, + "operator": "-", + "start": 372, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 376, + "start": 368, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 379, + "start": 378, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 367, + "name": "line", + "start": 363, + "type": "Identifier" + }, + "end": 380, + "start": 363, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 393, + "start": 392, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 391, + "name": "close", + "start": 386, + "type": "Identifier" + }, + "end": 394, + "start": 386, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 409, + "raw": "5", + "start": 408, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + { + "end": 412, + "start": 411, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 407, + "name": "extrude", + "start": 400, + "type": "Identifier" + }, + "end": 413, + "start": 400, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 413, + "start": 255, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 245, + "type": "VariableDeclarator" + }, + "end": 413, + "kind": "const", + "start": 245, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 414, + "nonCodeMeta": { + "nonCodeNodes": { + "1": [ + { + "end": 245, + "start": 243, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_start/input.kcl b/src/wasm-lib/kcl/tests/sketch_on_face_start/input.kcl new file mode 100644 index 000000000..ba310a435 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_start/input.kcl @@ -0,0 +1,20 @@ +fn cube(pos, scale) { + sg = startSketchOn('XY') + |> startProfileAt(pos, %) + |> line([0, scale], %) + |> line([scale, 0], %) + |> line([0, -scale], %) + + return sg +} +part001 = cube([0, 0], 20) + |> close(%) + |> extrude(20, %) as foo + +part002 = startSketchOn(foo, "start") + |> startProfileAt([0, 0], %) + |> line([0, 10], %) + |> line([10, 0], %) + |> line([0, -10], %) + |> close(%) + |> extrude(5, %) diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_start/ops.snap b/src/wasm-lib/kcl/tests/sketch_on_face_start/ops.snap new file mode 100644 index 000000000..6f2c0dfb7 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_start/ops.snap @@ -0,0 +1,123 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed sketch_on_face_start.kcl +snapshot_kind: text +--- +[ + { + "type": "UserDefinedFunctionCall", + "name": "cube", + "functionSourceRange": [ + 7, + 175, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 186, + 202, + 0 + ] + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 43, + 47, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 29, + 48, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 230, + 232, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 234, + 235, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 222, + 236, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 269, + 272, + 0 + ] + }, + "tag": { + "sourceRange": [ + 274, + 281, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 255, + 282, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 408, + 409, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 411, + 412, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 400, + 413, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_start/program_memory.snap b/src/wasm-lib/kcl/tests/sketch_on_face_start/program_memory.snap new file mode 100644 index 000000000..67c8f7dfe --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_start/program_memory.snap @@ -0,0 +1,1162 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing sketch_on_face_start.kcl +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "cube": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "declaration": { + "end": 160, + "id": { + "end": 26, + "name": "sg", + "start": 24, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 47, + "raw": "'XY'", + "start": 43, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 42, + "name": "startSketchOn", + "start": 29, + "type": "Identifier" + }, + "end": 48, + "start": 29, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 74, + "name": "pos", + "start": 71, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 77, + "start": 76, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 70, + "name": "startProfileAt", + "start": 56, + "type": "Identifier" + }, + "end": 78, + "start": 56, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 93, + "raw": "0", + "start": 92, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 100, + "name": "scale", + "start": 95, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 101, + "start": 91, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 104, + "start": 103, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 90, + "name": "line", + "start": 86, + "type": "Identifier" + }, + "end": 105, + "start": 86, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 124, + "name": "scale", + "start": 119, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 127, + "raw": "0", + "start": 126, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 128, + "start": 118, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 131, + "start": 130, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 117, + "name": "line", + "start": 113, + "type": "Identifier" + }, + "end": 132, + "start": 113, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 147, + "raw": "0", + "start": 146, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 155, + "name": "scale", + "start": 150, + "type": "Identifier", + "type": "Identifier" + }, + "end": 155, + "operator": "-", + "start": 149, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 156, + "start": 145, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 159, + "start": 158, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 144, + "name": "line", + "start": 140, + "type": "Identifier" + }, + "end": 160, + "start": 140, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 160, + "start": 29, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 24, + "type": "VariableDeclarator" + }, + "end": 160, + "kind": "const", + "start": 24, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "argument": { + "end": 173, + "name": "sg", + "start": 171, + "type": "Identifier", + "type": "Identifier" + }, + "end": 173, + "start": 164, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 175, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 164, + "start": 160, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 20 + }, + "end": 175, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 11, + "name": "pos", + "start": 8, + "type": "Identifier" + } + }, + { + "type": "Parameter", + "identifier": { + "end": 18, + "name": "scale", + "start": 13, + "type": "Identifier" + } + } + ], + "start": 7, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 7, + 175, + 0 + ] + } + ] + }, + "foo": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 86, + 105, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 113, + 132, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 140, + 160, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 208, + 216, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 86, + 105, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 113, + 132, + 0 + ] + }, + "from": [ + 0.0, + 20.0 + ], + "tag": null, + "to": [ + 20.0, + 20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 140, + 160, + 0 + ] + }, + "from": [ + 20.0, + 20.0 + ], + "tag": null, + "to": [ + 20.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 208, + 216, + 0 + ] + }, + "from": [ + 20.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 56, + 78, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 56, + 78, + 0 + ] + } + ] + }, + "height": 20.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 56, + 78, + 0 + ] + } + ] + }, + "part001": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 86, + 105, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 113, + 132, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 140, + 160, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 208, + 216, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 86, + 105, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 113, + 132, + 0 + ] + }, + "from": [ + 0.0, + 20.0 + ], + "tag": null, + "to": [ + 20.0, + 20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 140, + 160, + 0 + ] + }, + "from": [ + 20.0, + 20.0 + ], + "tag": null, + "to": [ + 20.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 208, + 216, + 0 + ] + }, + "from": [ + 20.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 56, + 78, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 56, + 78, + 0 + ] + } + ] + }, + "height": 20.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 56, + 78, + 0 + ] + } + ] + }, + "part002": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 319, + 335, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 341, + 357, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 363, + 380, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 386, + 394, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 319, + 335, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 10.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 341, + 357, + 0 + ] + }, + "from": [ + 0.0, + 10.0 + ], + "tag": null, + "to": [ + 10.0, + 10.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 363, + 380, + 0 + ] + }, + "from": [ + 10.0, + 10.0 + ], + "tag": null, + "to": [ + 10.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 386, + 394, + 0 + ] + }, + "from": [ + 10.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "start", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 86, + 105, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 113, + 132, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 140, + 160, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 208, + 216, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 86, + 105, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 113, + 132, + 0 + ] + }, + "from": [ + 0.0, + 20.0 + ], + "tag": null, + "to": [ + 20.0, + 20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 140, + 160, + 0 + ] + }, + "from": [ + 20.0, + 20.0 + ], + "tag": null, + "to": [ + 20.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 208, + 216, + 0 + ] + }, + "from": [ + 20.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 56, + 78, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 56, + 78, + 0 + ] + } + ] + }, + "height": 20.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 56, + 78, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 255, + 282, + 0 + ] + } + ] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 288, + 313, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 288, + 313, + 0 + ] + } + ] + }, + "height": 5.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 288, + 313, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_start/rendered_model.png b/src/wasm-lib/kcl/tests/sketch_on_face_start/rendered_model.png new file mode 100644 index 000000000..1648fdbe5 Binary files /dev/null and b/src/wasm-lib/kcl/tests/sketch_on_face_start/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/tag_can_be_proxied_through_parameter/ops.snap b/src/wasm-lib/kcl/tests/tag_can_be_proxied_through_parameter/ops.snap new file mode 100644 index 000000000..8bd5b293e --- /dev/null +++ b/src/wasm-lib/kcl/tests/tag_can_be_proxied_through_parameter/ops.snap @@ -0,0 +1,83 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed tag_can_be_proxied_through_parameter.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 139, + 143, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 125, + 144, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "type": "UserDefinedFunctionCall", + "name": "myCircle", + "functionSourceRange": [ + 47, + 118, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 181, + 199, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 324, + 328, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 310, + 329, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "type": "UserDefinedFunctionCall", + "name": "myCircle", + "functionSourceRange": [ + 47, + 118, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 366, + 384, + 0 + ] + }, + { + "type": "UserDefinedFunctionReturn" + } +] diff --git a/src/wasm-lib/kcl/tests/tag_proxied_through_function_does_not_define_var/ops.snap b/src/wasm-lib/kcl/tests/tag_proxied_through_function_does_not_define_var/ops.snap new file mode 100644 index 000000000..62eca1b55 --- /dev/null +++ b/src/wasm-lib/kcl/tests/tag_proxied_through_function_does_not_define_var/ops.snap @@ -0,0 +1,42 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed tag_proxied_through_function_does_not_define_var.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 214, + 218, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 200, + 219, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "type": "UserDefinedFunctionCall", + "name": "myCircle", + "functionSourceRange": [ + 47, + 193, + 0 + ], + "unlabeledArg": null, + "labeledArgs": {}, + "sourceRange": [ + 256, + 274, + 0 + ] + } +] diff --git a/src/wasm-lib/kcl/tests/tan_arc_x_line/ast.snap b/src/wasm-lib/kcl/tests/tan_arc_x_line/ast.snap new file mode 100644 index 000000000..8be7978f3 --- /dev/null +++ b/src/wasm-lib/kcl/tests/tan_arc_x_line/ast.snap @@ -0,0 +1,578 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing tan_arc_x_line.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 10, + "id": { + "end": 6, + "name": "startX", + "start": 0, + "type": "Identifier" + }, + "init": { + "end": 10, + "raw": "0", + "start": 9, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 10, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 21, + "id": { + "end": 17, + "name": "startY", + "start": 11, + "type": "Identifier" + }, + "init": { + "end": 21, + "raw": "0", + "start": 20, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + "start": 11, + "type": "VariableDeclarator" + }, + "end": 21, + "kind": "const", + "start": 11, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 39, + "id": { + "end": 33, + "name": "angleOffset", + "start": 22, + "type": "Identifier" + }, + "init": { + "end": 39, + "raw": "135", + "start": 36, + "type": "Literal", + "type": "Literal", + "value": 135.0 + }, + "start": 22, + "type": "VariableDeclarator" + }, + "end": 39, + "kind": "const", + "start": 22, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 45, + "id": { + "end": 41, + "name": "r", + "start": 40, + "type": "Identifier" + }, + "init": { + "end": 45, + "raw": "1", + "start": 44, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + "start": 40, + "type": "VariableDeclarator" + }, + "end": 45, + "kind": "const", + "start": 40, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 62, + "id": { + "end": 56, + "name": "angleStart", + "start": 46, + "type": "Identifier" + }, + "init": { + "end": 62, + "raw": "110", + "start": 59, + "type": "Literal", + "type": "Literal", + "value": 110.0 + }, + "start": 46, + "type": "VariableDeclarator" + }, + "end": 62, + "kind": "const", + "start": 46, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "end": 456, + "expression": { + "body": [ + { + "arguments": [ + { + "end": 82, + "raw": "'XY'", + "start": 78, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 77, + "name": "startSketchOn", + "start": 64, + "type": "Identifier" + }, + "end": 83, + "start": 64, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 111, + "name": "startX", + "start": 105, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 119, + "name": "startY", + "start": 113, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 120, + "start": 104, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 123, + "start": 122, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 103, + "name": "startProfileAt", + "start": 89, + "type": "Identifier" + }, + "end": 124, + "start": 89, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 181, + "properties": [ + { + "end": 161, + "key": { + "end": 148, + "name": "angle", + "start": 143, + "type": "Identifier" + }, + "start": 143, + "type": "ObjectProperty", + "value": { + "end": 161, + "name": "angleStart", + "start": 151, + "type": "Identifier", + "type": "Identifier" + } + }, + { + "end": 179, + "key": { + "end": 169, + "name": "length", + "start": 163, + "type": "Identifier" + }, + "start": 163, + "type": "ObjectProperty", + "value": { + "end": 179, + "raw": ".000001", + "start": 172, + "type": "Literal", + "type": "Literal", + "value": 0.000001 + } + } + ], + "start": 141, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 184, + "start": 183, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 140, + "name": "angledLine", + "start": 130, + "type": "Identifier" + }, + "end": 185, + "start": 130, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 241, + "properties": [ + { + "end": 227, + "key": { + "end": 213, + "name": "offset", + "start": 207, + "type": "Identifier" + }, + "start": 207, + "type": "ObjectProperty", + "value": { + "end": 227, + "name": "angleOffset", + "start": 216, + "type": "Identifier", + "type": "Identifier" + } + }, + { + "end": 239, + "key": { + "end": 235, + "name": "radius", + "start": 229, + "type": "Identifier" + }, + "start": 229, + "type": "ObjectProperty", + "value": { + "end": 239, + "name": "r", + "start": 238, + "type": "Identifier", + "type": "Identifier" + } + } + ], + "start": 205, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 244, + "start": 243, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 251, + "start": 246, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "arc1" + } + ], + "callee": { + "end": 204, + "name": "tangentialArc", + "start": 191, + "type": "Identifier" + }, + "end": 252, + "start": 191, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 333, + "properties": [ + { + "end": 301, + "key": { + "end": 287, + "name": "offset", + "start": 281, + "type": "Identifier" + }, + "start": 281, + "type": "ObjectProperty", + "value": { + "end": 301, + "name": "angleOffset", + "start": 290, + "type": "Identifier", + "type": "Identifier" + } + }, + { + "end": 326, + "key": { + "end": 316, + "name": "radius", + "start": 310, + "type": "Identifier" + }, + "start": 310, + "type": "ObjectProperty", + "value": { + "end": 326, + "left": { + "end": 322, + "raw": "0.5", + "start": 319, + "type": "Literal", + "type": "Literal", + "value": 0.5 + }, + "operator": "*", + "right": { + "end": 326, + "name": "r", + "start": 325, + "type": "Identifier", + "type": "Identifier" + }, + "start": 319, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + } + ], + "start": 272, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 336, + "start": 335, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 343, + "start": 338, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "arc2" + } + ], + "callee": { + "end": 271, + "name": "tangentialArc", + "start": 258, + "type": "Identifier" + }, + "end": 344, + "start": 258, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 426, + "properties": [ + { + "end": 394, + "key": { + "end": 379, + "name": "offset", + "start": 373, + "type": "Identifier" + }, + "start": 373, + "type": "ObjectProperty", + "value": { + "argument": { + "end": 394, + "name": "angleOffset", + "start": 383, + "type": "Identifier", + "type": "Identifier" + }, + "end": 394, + "operator": "-", + "start": 382, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + }, + { + "end": 419, + "key": { + "end": 409, + "name": "radius", + "start": 403, + "type": "Identifier" + }, + "start": 403, + "type": "ObjectProperty", + "value": { + "end": 419, + "left": { + "end": 415, + "raw": "0.5", + "start": 412, + "type": "Literal", + "type": "Literal", + "value": 0.5 + }, + "operator": "*", + "right": { + "end": 419, + "name": "r", + "start": 418, + "type": "Identifier", + "type": "Identifier" + }, + "start": 412, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + } + ], + "start": 364, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 429, + "start": 428, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 436, + "start": 431, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "arc3" + } + ], + "callee": { + "end": 363, + "name": "tangentialArc", + "start": 350, + "type": "Identifier" + }, + "end": 437, + "start": 350, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 452, + "raw": "1", + "start": 451, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 455, + "start": 454, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 450, + "name": "xLineTo", + "start": 443, + "type": "Identifier" + }, + "end": 456, + "start": 443, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 456, + "start": 64, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 64, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 457, + "nonCodeMeta": { + "nonCodeNodes": { + "4": [ + { + "end": 64, + "start": 62, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/tan_arc_x_line/input.kcl b/src/wasm-lib/kcl/tests/tan_arc_x_line/input.kcl new file mode 100644 index 000000000..ad35a6377 --- /dev/null +++ b/src/wasm-lib/kcl/tests/tan_arc_x_line/input.kcl @@ -0,0 +1,19 @@ +startX = 0 +startY = 0 +angleOffset = 135 +r = 1 +angleStart = 110 + +startSketchOn('XY') + |> startProfileAt([startX, startY], %) + |> angledLine({ angle = angleStart, length = .000001 }, %) + |> tangentialArc({ offset = angleOffset, radius = r }, %, $arc1) + |> tangentialArc({ + offset = angleOffset, + radius = 0.5 * r + }, %, $arc2) + |> tangentialArc({ + offset = -angleOffset, + radius = 0.5 * r + }, %, $arc3) + |> xLineTo(1, %) diff --git a/src/wasm-lib/kcl/tests/tan_arc_x_line/ops.snap b/src/wasm-lib/kcl/tests/tan_arc_x_line/ops.snap new file mode 100644 index 000000000..f2c805e84 --- /dev/null +++ b/src/wasm-lib/kcl/tests/tan_arc_x_line/ops.snap @@ -0,0 +1,26 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed tan_arc_x_line.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 78, + 82, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 64, + 83, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/tan_arc_x_line/program_memory.snap b/src/wasm-lib/kcl/tests/tan_arc_x_line/program_memory.snap new file mode 100644 index 000000000..140495cae --- /dev/null +++ b/src/wasm-lib/kcl/tests/tan_arc_x_line/program_memory.snap @@ -0,0 +1,252 @@ +--- +source: kcl/src/simulation_tests.rs +assertion_line: 92 +description: Program memory after executing tan_arc_x_line.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "angleOffset": { + "type": "Number", + "value": 135.0, + "__meta": [ + { + "sourceRange": [ + 36, + 39, + 0 + ] + } + ] + }, + "angleStart": { + "type": "Number", + "value": 110.0, + "__meta": [ + { + "sourceRange": [ + 59, + 62, + 0 + ] + } + ] + }, + "arc1": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "arc1", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 191, + 252, + 0 + ] + }, + "ccw": true, + "center": [ + -0.9396929628060517, + -0.34201920363304794 + ], + "from": [ + -0.0000003420201433256687, + 0.0000009396926207859084 + ], + "tag": { + "end": 251, + "start": 246, + "type": "TagDeclarator", + "value": "arc1" + }, + "to": [ + -1.8460007498427018, + 0.08059905810765156 + ], + "type": "TangentialArc" + }, + "surface": null + }, + "__meta": [ + { + "sourceRange": [ + 246, + 251, + 0 + ] + } + ] + }, + "arc2": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "arc2", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 258, + 344, + 0 + ] + }, + "ccw": true, + "center": [ + -1.3928468563243768, + -0.13071007276269808 + ], + "from": [ + -1.8460007498427018, + 0.08059905810765156 + ], + "tag": { + "end": 343, + "start": 338, + "type": "TagDeclarator", + "value": "arc2" + }, + "to": [ + -1.2218367846615423, + -0.6005563831556522 + ], + "type": "TangentialArc" + }, + "surface": null + }, + "__meta": [ + { + "sourceRange": [ + 338, + 343, + 0 + ] + } + ] + }, + "arc3": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "arc3", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 350, + 437, + 0 + ] + }, + "ccw": false, + "center": [ + -1.050826712998708, + -1.0704026935486064 + ], + "from": [ + -1.2218367846615423, + -0.6005563831556522 + ], + "tag": { + "end": 436, + "start": 431, + "type": "TagDeclarator", + "value": "arc3" + }, + "to": [ + -0.5976728194803829, + -1.281711824418956 + ], + "type": "TangentialArc" + }, + "surface": null + }, + "__meta": [ + { + "sourceRange": [ + 431, + 436, + 0 + ] + } + ] + }, + "r": { + "type": "Number", + "value": 1.0, + "__meta": [ + { + "sourceRange": [ + 44, + 45, + 0 + ] + } + ] + }, + "startX": { + "type": "Number", + "value": 0.0, + "__meta": [ + { + "sourceRange": [ + 9, + 10, + 0 + ] + } + ] + }, + "startY": { + "type": "Number", + "value": 0.0, + "__meta": [ + { + "sourceRange": [ + 20, + 21, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/tan_arc_x_line/rendered_model.png b/src/wasm-lib/kcl/tests/tan_arc_x_line/rendered_model.png new file mode 100644 index 000000000..fcc3301d9 Binary files /dev/null and b/src/wasm-lib/kcl/tests/tan_arc_x_line/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/tangential_arc/ast.snap b/src/wasm-lib/kcl/tests/tangential_arc/ast.snap new file mode 100644 index 000000000..5e60c4c3e --- /dev/null +++ b/src/wasm-lib/kcl/tests/tangential_arc/ast.snap @@ -0,0 +1,265 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing tangential_arc.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 149, + "id": { + "end": 9, + "name": "boxSketch", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "elements": [ + { + "end": 28, + "raw": "0", + "start": 27, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 31, + "raw": "0", + "start": 30, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 32, + "start": 26, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + ], + "callee": { + "end": 25, + "name": "startSketchAt", + "start": 12, + "type": "Identifier" + }, + "end": 33, + "start": 12, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 46, + "raw": "0", + "start": 45, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 50, + "raw": "10", + "start": 48, + "type": "Literal", + "type": "Literal", + "value": 10.0 + } + ], + "end": 51, + "start": 44, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 54, + "start": 53, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 43, + "name": "line", + "start": 39, + "type": "Identifier" + }, + "end": 55, + "start": 39, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 102, + "properties": [ + { + "end": 87, + "key": { + "end": 83, + "name": "radius", + "start": 77, + "type": "Identifier" + }, + "start": 77, + "type": "ObjectProperty", + "value": { + "end": 87, + "raw": "5", + "start": 86, + "type": "Literal", + "type": "Literal", + "value": 5.0 + } + }, + { + "end": 100, + "key": { + "end": 95, + "name": "offset", + "start": 89, + "type": "Identifier" + }, + "start": 89, + "type": "ObjectProperty", + "value": { + "end": 100, + "raw": "90", + "start": 98, + "type": "Literal", + "type": "Literal", + "value": 90.0 + } + } + ], + "start": 75, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 105, + "start": 104, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 74, + "name": "tangentialArc", + "start": 61, + "type": "Identifier" + }, + "end": 106, + "start": 61, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 119, + "raw": "5", + "start": 118, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + { + "argument": { + "end": 124, + "raw": "15", + "start": 122, + "type": "Literal", + "type": "Literal", + "value": 15.0 + }, + "end": 124, + "operator": "-", + "start": 121, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 125, + "start": 117, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 128, + "start": 127, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 116, + "name": "line", + "start": 112, + "type": "Identifier" + }, + "end": 129, + "start": 112, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 145, + "raw": "10", + "start": 143, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + { + "end": 148, + "start": 147, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 142, + "name": "extrude", + "start": 135, + "type": "Identifier" + }, + "end": 149, + "start": 135, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 149, + "start": 12, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 149, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 150, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/tangential_arc/input.kcl b/src/wasm-lib/kcl/tests/tangential_arc/input.kcl new file mode 100644 index 000000000..f974660b6 --- /dev/null +++ b/src/wasm-lib/kcl/tests/tangential_arc/input.kcl @@ -0,0 +1,5 @@ +boxSketch = startSketchAt([0, 0]) + |> line([0, 10], %) + |> tangentialArc({ radius = 5, offset = 90 }, %) + |> line([5, -15], %) + |> extrude(10, %) diff --git a/src/wasm-lib/kcl/tests/tangential_arc/ops.snap b/src/wasm-lib/kcl/tests/tangential_arc/ops.snap new file mode 100644 index 000000000..dd3dd064b --- /dev/null +++ b/src/wasm-lib/kcl/tests/tangential_arc/ops.snap @@ -0,0 +1,33 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed tangential_arc.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "length": { + "sourceRange": [ + 143, + 145, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 147, + 148, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 135, + 149, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/tangential_arc/program_memory.snap b/src/wasm-lib/kcl/tests/tangential_arc/program_memory.snap new file mode 100644 index 000000000..6eb148a4a --- /dev/null +++ b/src/wasm-lib/kcl/tests/tangential_arc/program_memory.snap @@ -0,0 +1,214 @@ +--- +source: kcl/src/simulation_tests.rs +assertion_line: 105 +description: Program memory after executing tangential_arc.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "boxSketch": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 39, + 55, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 61, + 106, + 0 + ], + "tag": null, + "type": "extrudeArc" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 112, + 129, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 39, + 55, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 10.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 61, + 106, + 0 + ] + }, + "ccw": true, + "center": [ + -5.0, + 10.0 + ], + "from": [ + 0.0, + 10.0 + ], + "tag": null, + "to": [ + -5.0, + 15.0 + ], + "type": "TangentialArc" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 112, + 129, + 0 + ] + }, + "from": [ + -5.0, + 15.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 12, + 33, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 12, + 33, + 0 + ] + } + ] + }, + "height": 10.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 12, + 33, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/tangential_arc/rendered_model.png b/src/wasm-lib/kcl/tests/tangential_arc/rendered_model.png new file mode 100644 index 000000000..ac3223191 Binary files /dev/null and b/src/wasm-lib/kcl/tests/tangential_arc/rendered_model.png differ diff --git a/src/wasm-lib/kcl/tests/xz_plane/ast.snap b/src/wasm-lib/kcl/tests/xz_plane/ast.snap new file mode 100644 index 000000000..fe928e6c0 --- /dev/null +++ b/src/wasm-lib/kcl/tests/xz_plane/ast.snap @@ -0,0 +1,255 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing xz_plane.kcl +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 149, + "id": { + "end": 7, + "name": "part001", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 28, + "raw": "'XZ'", + "start": 24, + "type": "Literal", + "type": "Literal", + "value": "XZ" + } + ], + "callee": { + "end": 23, + "name": "startSketchOn", + "start": 10, + "type": "Identifier" + }, + "end": 29, + "start": 10, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 52, + "raw": "0", + "start": 51, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 55, + "raw": "0", + "start": 54, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 56, + "start": 50, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 59, + "start": 58, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 49, + "name": "startProfileAt", + "start": 35, + "type": "Identifier" + }, + "end": 60, + "start": 35, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 77, + "raw": "100", + "start": 74, + "type": "Literal", + "type": "Literal", + "value": 100.0 + }, + { + "end": 82, + "raw": "100", + "start": 79, + "type": "Literal", + "type": "Literal", + "value": 100.0 + } + ], + "end": 83, + "start": 73, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 86, + "start": 85, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 72, + "name": "lineTo", + "start": 66, + "type": "Identifier" + }, + "end": 87, + "start": 66, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 104, + "raw": "100", + "start": 101, + "type": "Literal", + "type": "Literal", + "value": 100.0 + }, + { + "end": 107, + "raw": "0", + "start": 106, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 108, + "start": 100, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 111, + "start": 110, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 99, + "name": "lineTo", + "start": 93, + "type": "Identifier" + }, + "end": 112, + "start": 93, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 125, + "start": 124, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 123, + "name": "close", + "start": 118, + "type": "Identifier" + }, + "end": 126, + "start": 118, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 145, + "left": { + "end": 141, + "raw": "5", + "start": 140, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + "operator": "+", + "right": { + "end": 145, + "raw": "7", + "start": 144, + "type": "Literal", + "type": "Literal", + "value": 7.0 + }, + "start": 140, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 148, + "start": 147, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 139, + "name": "extrude", + "start": 132, + "type": "Identifier" + }, + "end": 149, + "start": 132, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 149, + "start": 10, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 149, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 150, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/xz_plane/input.kcl b/src/wasm-lib/kcl/tests/xz_plane/input.kcl new file mode 100644 index 000000000..2a293c1f7 --- /dev/null +++ b/src/wasm-lib/kcl/tests/xz_plane/input.kcl @@ -0,0 +1,6 @@ +part001 = startSketchOn('XZ') + |> startProfileAt([0, 0], %) + |> lineTo([100, 100], %) + |> lineTo([100, 0], %) + |> close(%) + |> extrude(5 + 7, %) diff --git a/src/wasm-lib/kcl/tests/xz_plane/ops.snap b/src/wasm-lib/kcl/tests/xz_plane/ops.snap new file mode 100644 index 000000000..8258999ca --- /dev/null +++ b/src/wasm-lib/kcl/tests/xz_plane/ops.snap @@ -0,0 +1,52 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed xz_plane.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 24, + 28, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 10, + 29, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 140, + 145, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 147, + 148, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 132, + 149, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/xz_plane/program_memory.snap b/src/wasm-lib/kcl/tests/xz_plane/program_memory.snap new file mode 100644 index 000000000..8955c8ea7 --- /dev/null +++ b/src/wasm-lib/kcl/tests/xz_plane/program_memory.snap @@ -0,0 +1,208 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing xz_plane.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "part001": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 66, + 87, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 93, + 112, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 118, + 126, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 66, + 87, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 100.0, + 100.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 93, + 112, + 0 + ] + }, + "from": [ + 100.0, + 100.0 + ], + "tag": null, + "to": [ + 100.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 118, + 126, + 0 + ] + }, + "from": [ + 100.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35, + 60, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 35, + 60, + 0 + ] + } + ] + }, + "height": 12.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 35, + 60, + 0 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/xz_plane/rendered_model.png b/src/wasm-lib/kcl/tests/xz_plane/rendered_model.png new file mode 100644 index 000000000..0b156fed6 Binary files /dev/null and b/src/wasm-lib/kcl/tests/xz_plane/rendered_model.png differ diff --git a/src/wasm-lib/rust-toolchain.toml b/src/wasm-lib/rust-toolchain.toml index 87499a931..d8dbc115a 100644 --- a/src/wasm-lib/rust-toolchain.toml +++ b/src/wasm-lib/rust-toolchain.toml @@ -1,3 +1,3 @@ [toolchain] -channel = "1.82.0" +channel = "1.83.0" components = ["clippy", "rustfmt"] diff --git a/src/wasm-lib/src/wasm.rs b/src/wasm-lib/src/wasm.rs index 143f6fa7a..efecd97cb 100644 --- a/src/wasm-lib/src/wasm.rs +++ b/src/wasm-lib/src/wasm.rs @@ -1,85 +1,147 @@ //! Wasm bindings for `kcl`. -use std::{ - str::FromStr, - sync::{Arc, RwLock}, -}; +use std::sync::Arc; use futures::stream::TryStreamExt; use gloo_utils::format::JsValueSerdeExt; -use kcl_lib::{coredump::CoreDump, engine::EngineManager, executor::ExecutorSettings}; +use kcl_lib::{ + exec::IdGenerator, CacheInformation, CoreDump, EngineManager, ExecState, KclErrorWithOutputs, ModuleId, + OldAstState, Program, +}; +use tokio::sync::RwLock; use tower_lsp::{LspService, Server}; use wasm_bindgen::prelude::*; +lazy_static::lazy_static! { + /// A static mutable lock for updating the last successful execution state for the cache. + static ref OLD_AST_MEMORY: Arc>> = Default::default(); +} + +// Read the old ast memory from the lock, this should never fail since +// in failure scenarios we should just bust the cache and send back None as the previous +// state. +async fn read_old_ast_memory() -> Option { + let lock = OLD_AST_MEMORY.read().await; + lock.clone() +} + +async fn bust_cache() { + // We don't use the cache in mock mode. + let mut current_cache = OLD_AST_MEMORY.write().await; + // Set the cache to None. + *current_cache = None; +} + +// wasm_bindgen wrapper for clearing the scene and busting the cache. +#[wasm_bindgen] +pub async fn clear_scene_and_bust_cache( + engine_manager: kcl_lib::wasm_engine::EngineCommandManager, +) -> Result<(), String> { + console_error_panic_hook::set_once(); + + // Bust the cache. + bust_cache().await; + + let engine = kcl_lib::wasm_engine::EngineConnection::new(engine_manager) + .await + .map_err(|e| format!("{:?}", e))?; + + let mut id_generator: IdGenerator = Default::default(); + engine + .clear_scene(&mut id_generator, Default::default()) + .await + .map_err(|e| e.to_string())?; + + Ok(()) +} + // wasm_bindgen wrapper for execute #[wasm_bindgen] -pub async fn execute_wasm( - program_str: &str, - memory_str: &str, - id_generator_str: &str, - units: &str, - engine_manager: kcl_lib::engine::conn_wasm::EngineCommandManager, - fs_manager: kcl_lib::fs::wasm::FileSystemManager, - project_directory: Option, - is_mock: bool, +pub async fn execute( + program_ast_json: &str, + program_memory_override_str: &str, + settings: &str, + engine_manager: kcl_lib::wasm_engine::EngineCommandManager, + fs_manager: kcl_lib::wasm_engine::FileSystemManager, ) -> Result { console_error_panic_hook::set_once(); - // deserialize the ast from a stringified json - let program: kcl_lib::ast::types::Program = serde_json::from_str(program_str).map_err(|e| e.to_string())?; - let memory: kcl_lib::executor::ProgramMemory = serde_json::from_str(memory_str).map_err(|e| e.to_string())?; - let id_generator: kcl_lib::executor::IdGenerator = - serde_json::from_str(id_generator_str).map_err(|e| e.to_string())?; - let units = kcl_lib::settings::types::UnitLength::from_str(units).map_err(|e| e.to_string())?; + let program: Program = serde_json::from_str(program_ast_json).map_err(|e| e.to_string())?; + let program_memory_override: Option = + serde_json::from_str(program_memory_override_str).map_err(|e| e.to_string())?; - let engine: std::sync::Arc> = if is_mock { - Arc::new(Box::new( - kcl_lib::engine::conn_mock::EngineConnection::new() - .await - .map_err(|e| format!("{:?}", e))?, - )) + // If we have a program memory override, assume we are in mock mode. + // You cannot override the memory in non-mock mode. + let is_mock = program_memory_override.is_some(); + + let settings: kcl_lib::Configuration = serde_json::from_str(settings).map_err(|e| e.to_string())?; + let ctx = if is_mock { + kcl_lib::ExecutorContext::new_mock(fs_manager, settings.into()).await? } else { - Arc::new(Box::new( - kcl_lib::engine::conn_wasm::EngineConnection::new(engine_manager) - .await - .map_err(|e| format!("{:?}", e))?, - )) - }; - let fs = Arc::new(kcl_lib::fs::FileManager::new(fs_manager)); - let context_type = if is_mock { - kcl_lib::executor::ContextType::Mock - } else { - kcl_lib::executor::ContextType::Live - }; - let ctx = kcl_lib::executor::ExecutorContext { - engine, - fs, - stdlib: std::sync::Arc::new(kcl_lib::std::StdLib::new()), - settings: ExecutorSettings { - units, - ..Default::default() - }, - context_type, + kcl_lib::ExecutorContext::new(engine_manager, fs_manager, settings.into()).await? }; - let exec_state = ctx - .run(&program, Some(memory), id_generator, project_directory) + let mut exec_state = ExecState::default(); + let mut old_ast_memory = None; + + // Populate from the old exec state if it exists. + if let Some(program_memory_override) = program_memory_override { + exec_state.mod_local.memory = program_memory_override; + } else { + // If we are in mock mode, we don't want to use any cache. + if let Some(old) = read_old_ast_memory().await { + exec_state = old.exec_state.clone(); + old_ast_memory = Some(old); + } + } + + if let Err(err) = ctx + .run( + CacheInformation { + old: old_ast_memory, + new_ast: program.ast.clone(), + }, + &mut exec_state, + ) .await - .map_err(String::from)?; + { + if !is_mock { + bust_cache().await; + } + + // Add additional outputs to the error. + let error = KclErrorWithOutputs::new(err, exec_state.mod_local.operations.clone()); + + // Throw the error. + return Err(serde_json::to_string(&error).map_err(|serde_err| serde_err.to_string())?); + } + + if !is_mock { + // We don't use the cache in mock mode. + let mut current_cache = OLD_AST_MEMORY.write().await; + + // If we aren't in mock mode, save this as the last successful execution to the cache. + *current_cache = Some(OldAstState { + ast: program.ast.clone(), + exec_state: exec_state.clone(), + settings: ctx.settings.clone(), + }); + drop(current_cache); + } // The serde-wasm-bindgen does not work here because of weird HashMap issues so we use the // gloo-serialize crate instead. // DO NOT USE serde_wasm_bindgen::to_value(&exec_state).map_err(|e| e.to_string()) // it will break the frontend. - JsValue::from_serde(&exec_state).map_err(|e| e.to_string()) + JsValue::from_serde(&exec_state.to_wasm_outcome()).map_err(|e| e.to_string()) } // wasm_bindgen wrapper for execute #[wasm_bindgen] -pub async fn kcl_lint(program_str: &str) -> Result { +pub async fn kcl_lint(program_ast_json: &str) -> Result { console_error_panic_hook::set_once(); - let program: kcl_lib::ast::types::Program = serde_json::from_str(program_str).map_err(|e| e.to_string())?; + let program: Program = serde_json::from_str(program_ast_json).map_err(|e| e.to_string())?; let mut findings = vec![]; for discovered_finding in program.lint_all().into_iter().flatten() { findings.push(discovered_finding); @@ -91,16 +153,16 @@ pub async fn kcl_lint(program_str: &str) -> Result { // wasm_bindgen wrapper for creating default planes #[wasm_bindgen] pub async fn make_default_planes( - engine_manager: kcl_lib::engine::conn_wasm::EngineCommandManager, + engine_manager: kcl_lib::wasm_engine::EngineCommandManager, ) -> Result { console_error_panic_hook::set_once(); // deserialize the ast from a stringified json - let engine = kcl_lib::engine::conn_wasm::EngineConnection::new(engine_manager) + let engine = kcl_lib::wasm_engine::EngineConnection::new(engine_manager) .await .map_err(|e| format!("{:?}", e))?; let default_planes = engine - .new_default_planes(&mut kcl_lib::executor::IdGenerator::default(), Default::default()) + .new_default_planes(&mut kcl_lib::exec::IdGenerator::default(), Default::default()) .await .map_err(String::from)?; @@ -109,48 +171,32 @@ pub async fn make_default_planes( JsValue::from_serde(&default_planes).map_err(|e| e.to_string()) } -// wasm_bindgen wrapper for modifying the grid -#[wasm_bindgen] -pub async fn modify_grid( - engine_manager: kcl_lib::engine::conn_wasm::EngineCommandManager, - hidden: bool, -) -> Result<(), String> { - console_error_panic_hook::set_once(); - // deserialize the ast from a stringified json - - let engine = kcl_lib::engine::conn_wasm::EngineConnection::new(engine_manager) - .await - .map_err(|e| format!("{:?}", e))?; - engine.modify_grid(hidden).await.map_err(String::from)?; - - Ok(()) -} - // wasm_bindgen wrapper for execute #[wasm_bindgen] pub async fn modify_ast_for_sketch_wasm( - manager: kcl_lib::engine::conn_wasm::EngineCommandManager, - program_str: &str, + manager: kcl_lib::wasm_engine::EngineCommandManager, + program_ast_json: &str, sketch_name: &str, plane_type: &str, sketch_id: &str, ) -> Result { console_error_panic_hook::set_once(); - // deserialize the ast from a stringified json - let mut program: kcl_lib::ast::types::Program = serde_json::from_str(program_str).map_err(|e| e.to_string())?; + let mut program: Program = serde_json::from_str(program_ast_json).map_err(|e| e.to_string())?; - let plane: kcl_lib::executor::PlaneType = serde_json::from_str(plane_type).map_err(|e| e.to_string())?; + let plane: kcl_lib::exec::PlaneType = serde_json::from_str(plane_type).map_err(|e| e.to_string())?; let engine: Arc> = Arc::new(Box::new( - kcl_lib::engine::conn_wasm::EngineConnection::new(manager) + kcl_lib::wasm_engine::EngineConnection::new(manager) .await .map_err(|e| format!("{:?}", e))?, )); - let _ = kcl_lib::ast::modify::modify_ast_for_sketch( + let module_id = ModuleId::default(); + let _ = kcl_lib::modify_ast_for_sketch( &engine, &mut program, + module_id, sketch_name, plane, uuid::Uuid::parse_str(sketch_id).map_err(|e| e.to_string())?, @@ -182,26 +228,14 @@ pub fn deserialize_files(data: &[u8]) -> Result { Err(JsError::new(&format!("Invalid response type, got: {:?}", ws_resp))) } -// wasm_bindgen wrapper for lexer -// test for this function and by extension lexer are done in javascript land src/lang/tokeniser.test.ts #[wasm_bindgen] -pub fn lexer_wasm(js: &str) -> Result { +pub fn parse_wasm(kcl_program_source: &str) -> Result { console_error_panic_hook::set_once(); - let tokens = kcl_lib::token::lexer(js).map_err(JsError::from)?; - Ok(JsValue::from_serde(&tokens)?) -} - -#[wasm_bindgen] -pub fn parse_wasm(js: &str) -> Result { - console_error_panic_hook::set_once(); - - let tokens = kcl_lib::token::lexer(js).map_err(String::from)?; - let parser = kcl_lib::parser::Parser::new(tokens); - let program = parser.ast().map_err(String::from)?; + let (program, errs) = Program::parse(kcl_program_source).map_err(String::from)?; // The serde-wasm-bindgen does not work here because of weird HashMap issues so we use the // gloo-serialize crate instead. - JsValue::from_serde(&program).map_err(|e| e.to_string()) + JsValue::from_serde(&(program, errs)).map_err(|e| e.to_string()) } // wasm_bindgen wrapper for recast @@ -210,19 +244,15 @@ pub fn parse_wasm(js: &str) -> Result { pub fn recast_wasm(json_str: &str) -> Result { console_error_panic_hook::set_once(); - // deserialize the ast from a stringified json - let program: kcl_lib::ast::types::Program = serde_json::from_str(json_str).map_err(JsError::from)?; - - // Use the default options until we integrate into the UI the ability to change them. - let result = program.recast(&Default::default(), 0); - Ok(JsValue::from_serde(&result)?) + let program: Program = serde_json::from_str(json_str).map_err(JsError::from)?; + Ok(JsValue::from_serde(&program.recast())?) } #[wasm_bindgen] pub struct ServerConfig { into_server: js_sys::AsyncIterator, from_server: web_sys::WritableStream, - fs: kcl_lib::fs::wasm::FileSystemManager, + fs: kcl_lib::wasm_engine::FileSystemManager, } #[wasm_bindgen] @@ -231,7 +261,7 @@ impl ServerConfig { pub fn new( into_server: js_sys::AsyncIterator, from_server: web_sys::WritableStream, - fs: kcl_lib::fs::wasm::FileSystemManager, + fs: kcl_lib::wasm_engine::FileSystemManager, ) -> Self { Self { into_server, @@ -251,8 +281,8 @@ impl ServerConfig { #[wasm_bindgen] pub async fn kcl_lsp_run( config: ServerConfig, - engine_manager: Option, - units: &str, + engine_manager: Option, + settings: Option, token: String, baseurl: String, ) -> Result<(), JsValue> { @@ -264,74 +294,42 @@ pub async fn kcl_lsp_run( fs, } = config; - let stdlib = kcl_lib::std::StdLib::new(); - let stdlib_completions = kcl_lib::lsp::kcl::get_completions_from_stdlib(&stdlib).map_err(|e| e.to_string())?; - let stdlib_signatures = kcl_lib::lsp::kcl::get_signatures_from_stdlib(&stdlib).map_err(|e| e.to_string())?; - - let mut zoo_client = kittycad::Client::new(token); - zoo_client.set_base_url(baseurl.as_str()); - - let file_manager = Arc::new(kcl_lib::fs::FileManager::new(fs)); - let executor_ctx = if let Some(engine_manager) = engine_manager { - let units = kcl_lib::settings::types::UnitLength::from_str(units).map_err(|e| e.to_string())?; - let engine = kcl_lib::engine::conn_wasm::EngineConnection::new(engine_manager) - .await - .map_err(|e| format!("{:?}", e))?; - Some(kcl_lib::executor::ExecutorContext { - engine: Arc::new(Box::new(engine)), - fs: file_manager.clone(), - stdlib: std::sync::Arc::new(stdlib), - settings: ExecutorSettings { - units, - ..Default::default() - }, - context_type: kcl_lib::executor::ContextType::Live, - }) + let settings: kcl_lib::Configuration = if let Some(settings) = settings { + serde_json::from_str(&settings).map_err(|e| e.to_string())? + } else { + Default::default() + }; + Some(kcl_lib::ExecutorContext::new(engine_manager, fs.clone(), settings.into()).await?) } else { None }; - // Check if we can send telememtry for this user. - let privacy_settings = match zoo_client.users().get_privacy_settings().await { - Ok(privacy_settings) => privacy_settings, + let mut zoo_client = kittycad::Client::new(token); + zoo_client.set_base_url(baseurl.as_str()); + + // Check if we can send telemetry for this user. + let can_send_telemetry = match zoo_client.users().get_privacy_settings().await { + Ok(privacy_settings) => privacy_settings.can_train_on_data, Err(err) => { // In the case of dev we don't always have a sub set, but prod we should. if err .to_string() .contains("The modeling app subscription type is missing.") { - kittycad::types::PrivacySettings { - can_train_on_data: true, - } + true } else { - return Err(err.to_string().into()); + web_sys::console::warn_1(&format!("Failed to get privacy settings: {err:?}").into()); + false } } }; - let (service, socket) = LspService::build(|client| kcl_lib::lsp::kcl::Backend { - client, - fs: file_manager, - workspace_folders: Default::default(), - stdlib_completions, - stdlib_signatures, - token_map: Default::default(), - ast_map: Default::default(), - memory_map: Default::default(), - code_map: Default::default(), - diagnostics_map: Default::default(), - symbols_map: Default::default(), - semantic_tokens_map: Default::default(), - zoo_client, - can_send_telemetry: privacy_settings.can_train_on_data, - can_execute: Arc::new(tokio::sync::RwLock::new(executor_ctx.is_some())), - executor_ctx: Arc::new(tokio::sync::RwLock::new(executor_ctx)), - - is_initialized: Default::default(), + let (service, socket) = LspService::build(|client| { + kcl_lib::KclLspBackend::new_wasm(client, executor_ctx, fs, zoo_client, can_send_telemetry).unwrap() }) - .custom_method("kcl/updateUnits", kcl_lib::lsp::kcl::Backend::update_units) - .custom_method("kcl/updateCanExecute", kcl_lib::lsp::kcl::Backend::update_can_execute) + .custom_method("kcl/updateUnits", kcl_lib::KclLspBackend::update_units) + .custom_method("kcl/updateCanExecute", kcl_lib::KclLspBackend::update_can_execute) .finish(); let input = wasm_bindgen_futures::stream::JsStream::from(into_server); @@ -374,40 +372,22 @@ pub async fn copilot_lsp_run(config: ServerConfig, token: String, baseurl: Strin let mut zoo_client = kittycad::Client::new(token); zoo_client.set_base_url(baseurl.as_str()); - let file_manager = Arc::new(kcl_lib::fs::FileManager::new(fs)); + let dev_mode = if baseurl == "https://api.dev.zoo.dev" { + true + } else { + false + }; - let (service, socket) = LspService::build(|client| kcl_lib::lsp::copilot::Backend { - client, - fs: file_manager, - workspace_folders: Default::default(), - code_map: Default::default(), - editor_info: Arc::new(RwLock::new(kcl_lib::lsp::copilot::types::CopilotEditorInfo::default())), - cache: Arc::new(kcl_lib::lsp::copilot::cache::CopilotCache::new()), - telemetry: Default::default(), - zoo_client, - - is_initialized: Default::default(), - diagnostics_map: Default::default(), - dev_mode: if baseurl == "https://api.dev.zoo.dev" { - true - } else { - false - }, - }) - .custom_method("copilot/setEditorInfo", kcl_lib::lsp::copilot::Backend::set_editor_info) - .custom_method( - "copilot/getCompletions", - kcl_lib::lsp::copilot::Backend::get_completions_cycling, - ) - .custom_method( - "copilot/notifyAccepted", - kcl_lib::lsp::copilot::Backend::accept_completion, - ) - .custom_method( - "copilot/notifyRejected", - kcl_lib::lsp::copilot::Backend::reject_completions, - ) - .finish(); + let (service, socket) = + LspService::build(|client| kcl_lib::CopilotLspBackend::new_wasm(client, fs, zoo_client, dev_mode)) + .custom_method("copilot/setEditorInfo", kcl_lib::CopilotLspBackend::set_editor_info) + .custom_method( + "copilot/getCompletions", + kcl_lib::CopilotLspBackend::get_completions_cycling, + ) + .custom_method("copilot/notifyAccepted", kcl_lib::CopilotLspBackend::accept_completion) + .custom_method("copilot/notifyRejected", kcl_lib::CopilotLspBackend::reject_completions) + .finish(); let input = wasm_bindgen_futures::stream::JsStream::from(into_server); let input = input @@ -433,7 +413,7 @@ pub async fn copilot_lsp_run(config: ServerConfig, token: String, baseurl: Strin pub fn is_points_ccw(points: &[f64]) -> i32 { console_error_panic_hook::set_once(); - kcl_lib::std::utils::is_points_ccw_wasm(points) + kcl_lib::std_utils::is_points_ccw_wasm(points) } #[wasm_bindgen] @@ -470,7 +450,7 @@ pub fn get_tangential_arc_to_info( ) -> TangentialArcInfoOutputWasm { console_error_panic_hook::set_once(); - let result = kcl_lib::std::utils::get_tangential_arc_to_info(kcl_lib::std::utils::TangentialArcInfoInput { + let result = kcl_lib::std_utils::get_tangential_arc_to_info(kcl_lib::std_utils::TangentialArcInfoInput { arc_start_point: [arc_start_point_x, arc_start_point_y], arc_end_point: [arc_end_point_x, arc_end_point_y], tan_previous_point: [tan_previous_point_x, tan_previous_point_y], @@ -494,7 +474,7 @@ pub fn get_tangential_arc_to_info( pub fn program_memory_init() -> Result { console_error_panic_hook::set_once(); - let memory = kcl_lib::executor::ProgramMemory::default(); + let memory = kcl_lib::exec::ProgramMemory::default(); // The serde-wasm-bindgen does not work here because of weird HashMap issues so we use the // gloo-serialize crate instead. @@ -503,10 +483,10 @@ pub fn program_memory_init() -> Result { /// Get a coredump. #[wasm_bindgen] -pub async fn coredump(core_dump_manager: kcl_lib::coredump::wasm::CoreDumpManager) -> Result { +pub async fn coredump(core_dump_manager: kcl_lib::wasm_engine::CoreDumpManager) -> Result { console_error_panic_hook::set_once(); - let core_dumper = kcl_lib::coredump::wasm::CoreDumper::new(core_dump_manager); + let core_dumper = kcl_lib::wasm_engine::CoreDumper::new(core_dump_manager); let dump = core_dumper.dump().await.map_err(|e| e.to_string())?; // The serde-wasm-bindgen does not work here because of weird HashMap issues so we use the @@ -519,7 +499,7 @@ pub async fn coredump(core_dump_manager: kcl_lib::coredump::wasm::CoreDumpManage pub fn default_app_settings() -> Result { console_error_panic_hook::set_once(); - let settings = kcl_lib::settings::types::Configuration::default(); + let settings = kcl_lib::Configuration::default(); // The serde-wasm-bindgen does not work here because of weird HashMap issues so we use the // gloo-serialize crate instead. @@ -531,8 +511,7 @@ pub fn default_app_settings() -> Result { pub fn parse_app_settings(toml_str: &str) -> Result { console_error_panic_hook::set_once(); - let settings = kcl_lib::settings::types::Configuration::backwards_compatible_toml_parse(&toml_str) - .map_err(|e| e.to_string())?; + let settings = kcl_lib::Configuration::backwards_compatible_toml_parse(&toml_str).map_err(|e| e.to_string())?; // The serde-wasm-bindgen does not work here because of weird HashMap issues so we use the // gloo-serialize crate instead. @@ -544,7 +523,7 @@ pub fn parse_app_settings(toml_str: &str) -> Result { pub fn default_project_settings() -> Result { console_error_panic_hook::set_once(); - let settings = kcl_lib::settings::types::project::ProjectConfiguration::default(); + let settings = kcl_lib::ProjectConfiguration::default(); // The serde-wasm-bindgen does not work here because of weird HashMap issues so we use the // gloo-serialize crate instead. @@ -556,8 +535,8 @@ pub fn default_project_settings() -> Result { pub fn parse_project_settings(toml_str: &str) -> Result { console_error_panic_hook::set_once(); - let settings = kcl_lib::settings::types::project::ProjectConfiguration::backwards_compatible_toml_parse(&toml_str) - .map_err(|e| e.to_string())?; + let settings = + kcl_lib::ProjectConfiguration::backwards_compatible_toml_parse(&toml_str).map_err(|e| e.to_string())?; // The serde-wasm-bindgen does not work here because of weird HashMap issues so we use the // gloo-serialize crate instead. @@ -569,7 +548,7 @@ pub fn parse_project_settings(toml_str: &str) -> Result { pub fn serialize_project_settings(val: JsValue) -> Result { console_error_panic_hook::set_once(); - let config: kcl_lib::settings::types::Configuration = val.into_serde().map_err(|e| e.to_string())?; + let config: kcl_lib::Configuration = val.into_serde().map_err(|e| e.to_string())?; let toml_str = toml::to_string_pretty(&config).map_err(|e| e.to_string())?; diff --git a/src/wasm-lib/tests/executor/cache.rs b/src/wasm-lib/tests/executor/cache.rs new file mode 100644 index 000000000..6c6a76174 --- /dev/null +++ b/src/wasm-lib/tests/executor/cache.rs @@ -0,0 +1,216 @@ +//! Cache testing framework. + +use anyhow::Result; +use kcl_lib::ExecError; + +struct Variation<'a> { + code: &'a str, + settings: &'a kcl_lib::ExecutorSettings, +} + +async fn cache_test(test_name: &str, variations: Vec>) -> Result> { + let first = variations + .first() + .ok_or_else(|| anyhow::anyhow!("No variations provided for test '{}'", test_name))?; + + let mut ctx = kcl_lib::ExecutorContext::new_with_client(first.settings.clone(), None, None).await?; + let mut exec_state = kcl_lib::ExecState::default(); + + let mut old_ast_state = None; + let mut img_results = Vec::new(); + for (index, variation) in variations.iter().enumerate() { + let program = kcl_lib::Program::parse_no_errs(variation.code)?; + + // set the new settings. + ctx.settings = variation.settings.clone(); + + ctx.run( + kcl_lib::CacheInformation { + old: old_ast_state, + new_ast: program.ast.clone(), + }, + &mut exec_state, + ) + .await?; + let snapshot_png_bytes = ctx.prepare_snapshot().await?.contents.0; + + // Decode the snapshot, return it. + let img = image::ImageReader::new(std::io::Cursor::new(snapshot_png_bytes)) + .with_guessed_format() + .map_err(|e| ExecError::BadPng(e.to_string())) + .and_then(|x| x.decode().map_err(|e| ExecError::BadPng(e.to_string())))?; + // Save the snapshot. + let path = crate::assert_out(&format!("cache_{}_{}", test_name, index), &img); + + img_results.push((path, img)); + + // Prepare the last state. + old_ast_state = Some(kcl_lib::OldAstState { + ast: program.ast, + exec_state: exec_state.clone(), + settings: variation.settings.clone(), + }); + } + + Ok(img_results) +} + +#[tokio::test(flavor = "multi_thread")] +async fn kcl_test_cache_change_units_changes_output() { + let code = r#"part001 = startSketchOn('XY') + |> startProfileAt([5.5229, 5.25217], %) + |> line([10.50433, -1.19122], %) + |> line([8.01362, -5.48731], %) + |> line([-1.02877, -6.76825], %) + |> line([-11.53311, 2.81559], %) + |> close(%) + |> extrude(4, %) +"#; + + let result = cache_test( + "change_units_changes_output", + vec![ + Variation { + code, + settings: &kcl_lib::ExecutorSettings { + units: kcl_lib::UnitLength::In, + ..Default::default() + }, + }, + Variation { + code, + settings: &kcl_lib::ExecutorSettings { + units: kcl_lib::UnitLength::Mm, + ..Default::default() + }, + }, + ], + ) + .await + .unwrap(); + + let first = result.first().unwrap(); + let second = result.last().unwrap(); + + assert!(first.1 != second.1); +} + +#[tokio::test(flavor = "multi_thread")] +async fn kcl_test_cache_change_grid_visualizes_grid_off_to_on() { + let code = r#"part001 = startSketchOn('XY') + |> startProfileAt([5.5229, 5.25217], %) + |> line([10.50433, -1.19122], %) + |> line([8.01362, -5.48731], %) + |> line([-1.02877, -6.76825], %) + |> line([-11.53311, 2.81559], %) + |> close(%) + |> extrude(4, %) +"#; + + let result = cache_test( + "change_grid_visualizes_grid_off_to_on", + vec![ + Variation { + code, + settings: &kcl_lib::ExecutorSettings { + show_grid: false, + ..Default::default() + }, + }, + Variation { + code, + settings: &kcl_lib::ExecutorSettings { + show_grid: true, + ..Default::default() + }, + }, + ], + ) + .await + .unwrap(); + + let first = result.first().unwrap(); + let second = result.last().unwrap(); + + assert!(first.1 != second.1); +} + +#[tokio::test(flavor = "multi_thread")] +async fn kcl_test_cache_change_grid_visualizes_grid_on_to_off() { + let code = r#"part001 = startSketchOn('XY') + |> startProfileAt([5.5229, 5.25217], %) + |> line([10.50433, -1.19122], %) + |> line([8.01362, -5.48731], %) + |> line([-1.02877, -6.76825], %) + |> line([-11.53311, 2.81559], %) + |> close(%) + |> extrude(4, %) +"#; + + let result = cache_test( + "change_grid_visualizes_grid_on_to_off", + vec![ + Variation { + code, + settings: &kcl_lib::ExecutorSettings { + show_grid: true, + ..Default::default() + }, + }, + Variation { + code, + settings: &kcl_lib::ExecutorSettings { + show_grid: false, + ..Default::default() + }, + }, + ], + ) + .await + .unwrap(); + + let first = result.first().unwrap(); + let second = result.last().unwrap(); + + assert!(first.1 != second.1); +} + +#[tokio::test(flavor = "multi_thread")] +async fn kcl_test_cache_change_highlight_edges_changes_visual() { + let code = r#"part001 = startSketchOn('XY') + |> startProfileAt([5.5229, 5.25217], %) + |> line([10.50433, -1.19122], %) + |> line([8.01362, -5.48731], %) + |> line([-1.02877, -6.76825], %) + |> line([-11.53311, 2.81559], %) + |> close(%) + |> extrude(4, %) +"#; + + let result = cache_test( + "change_highlight_edges_changes_visual", + vec![ + Variation { + code, + settings: &kcl_lib::ExecutorSettings { + highlight_edges: true, + ..Default::default() + }, + }, + Variation { + code, + settings: &kcl_lib::ExecutorSettings { + highlight_edges: false, + ..Default::default() + }, + }, + ], + ) + .await + .unwrap(); + + let first = result.first().unwrap(); + let second = result.last().unwrap(); + + assert!(first.1 != second.1); +} diff --git a/src/wasm-lib/tests/executor/inputs/cube.kcl b/src/wasm-lib/tests/executor/inputs/cube.kcl index 88939957a..943054a6c 100644 --- a/src/wasm-lib/tests/executor/inputs/cube.kcl +++ b/src/wasm-lib/tests/executor/inputs/cube.kcl @@ -1,4 +1,4 @@ -fn cube = (length, center) => { +fn cube(length, center) { l = length/2 x = center[0] y = center[1] diff --git a/src/wasm-lib/tests/executor/inputs/e2e-can-sketch-on-chamfer.kcl b/src/wasm-lib/tests/executor/inputs/e2e-can-sketch-on-chamfer.kcl index d7fb0b5bf..bc8769267 100644 --- a/src/wasm-lib/tests/executor/inputs/e2e-can-sketch-on-chamfer.kcl +++ b/src/wasm-lib/tests/executor/inputs/e2e-can-sketch-on-chamfer.kcl @@ -13,8 +13,8 @@ const sketch001 = startSketchOn('XZ') |> close(%) const extrude001 = extrude(100, sketch001) |> chamfer({ - length: 30, - tags: [ + length = 30, + tags = [ seg01, getNextAdjacentEdge(yo), getNextAdjacentEdge(seg02), diff --git a/src/wasm-lib/tests/executor/inputs/helix_ccw.kcl b/src/wasm-lib/tests/executor/inputs/helix_ccw.kcl deleted file mode 100644 index 76f31c6df..000000000 --- a/src/wasm-lib/tests/executor/inputs/helix_ccw.kcl +++ /dev/null @@ -1,4 +0,0 @@ -const part001 = startSketchOn('XY') - |> circle({ center: [5, 5], radius: 10 }, %) - |> extrude(10, %) - |> helix({revolutions: 16, angle_start: 0, ccw: true}, %) diff --git a/src/wasm-lib/tests/executor/inputs/lsystem.kcl b/src/wasm-lib/tests/executor/inputs/lsystem.kcl new file mode 100644 index 000000000..dc698ba68 --- /dev/null +++ b/src/wasm-lib/tests/executor/inputs/lsystem.kcl @@ -0,0 +1,121 @@ +// L-System KCL +// Zoo Corporation ⓒ 2024 + +// Comparators + +fn cond = (bools) => { + return (a, b) => { + x = min(max(-1, a-b), 1) + 1 + return bools[x] + } +} + +fn Not = (b) => { return if b { false } else { true } } +fn And = (a, b) => { return if a { if b { true } else { false } } else { false }} +fn Or = (a, b) => { return if a { true } else { if b { true } else { false }}} + +Eq = cond([false, true, false]) +Lt = cond([true, false, false]) +Gt = cond([false, false, true]) + +fn Lte = (a, b) => { return Not(Gt(a, b)) } +fn Gte = (a, b) => { return Not(Lt(a, b)) } + +// L-system +// Note: it was most concise to encode productions directly in axioms. +// Change them as you need. + +deg = pi()*2 / 360 + +fn setSketch = (state, q) => { + return { + depthMax: state.depthMax, + depth: state.depth + 1, + currentLength: state.currentLength, + factor: state.factor, + currentAngle: state.currentAngle, + angle: state.angle, + q + } +} + +fn setDepth = (state, q) => { + return { + depthMax: state.depthMax, + depth: q, + currentLength: state.currentLength, + factor: state.factor, + currentAngle: state.currentAngle, + angle: state.angle, + q: state.q + } +} + +fn setAngle = (state, q) => { + return { + depthMax: state.depthMax, + depth: state.depth, + currentLength: state.currentLength, + factor: state.factor, + currentAngle: q, + angle: state.angle, + q: state.q + } +} + +fn setLength = (state, q) => { + return { + depthMax: state.depthMax, + depth: state.depth, + currentLength: q, + factor: state.factor, + currentAngle: state.currentAngle, + angle: state.angle, + q: state.q + } +} + +fn Gt2 = (state) => { return setLength(state, state.currentLength * state.factor) } +fn Lt2 = (state) => { return setLength(state, state.currentLength / state.factor) } +fn Add = (state) => { return setAngle(state, rem(int(state.currentAngle - state.angle), divisor = 360)) } +fn Sub = (state) => { return setAngle(state, rem(int(state.currentAngle + state.angle), divisor = 360)) } + +// Only necessary to get around recursion limitations... +fn F = (state, F) => { + return if Lt(state.depth, state.depthMax) { + stateNext = state |> setDepth(%, state.depth + 1) + + // Produce + // Note:if you need [ and ], just save state to a variable. + stateNext + |> F(%, F) |> Sub(%) |> F(%, F) + |> Add(%) |> Add(%) + |> F(%, F) |> Sub(%) |> F(%, F) + |> setDepth(%, stateNext.depth - 1) + + } else { + // Pass onto the next instruction + state |> setSketch(%, angledLine({ angle: state.currentAngle, length: state.currentLength }, state.q)) + } +} + +fn LSystem = (args, axioms) => { + return axioms({ + depthMax: args.iterations, + depth: 0, + currentLength: 1.0, + factor: args.factor, + currentAngle: 0, + angle: args.angle, + q: startSketchAt([0, 0]), + }) +} + +LSystem({ + iterations: 1, + factor: 1.36, + angle: 60, +}, (q) => { + result = q |> F(%, F) |> Add(%) |> Add(%) |> F(%, F) |> Add(%) |> Add(%) |> F(%, F) + return result.q +}) diff --git a/src/wasm-lib/tests/executor/inputs/member_expression_sketch.kcl b/src/wasm-lib/tests/executor/inputs/member_expression_sketch.kcl index 5e18848c8..6d4a3b765 100644 --- a/src/wasm-lib/tests/executor/inputs/member_expression_sketch.kcl +++ b/src/wasm-lib/tests/executor/inputs/member_expression_sketch.kcl @@ -13,5 +13,5 @@ sq = square([0,0], 10) cb = square([3,3], 4) |> extrude(10, %) -pt1 = sq.paths[0] -pt2 = cb.value[0] +// pt1 = sq.paths[0] +// pt2 = cb.value[0] diff --git a/src/wasm-lib/tests/executor/inputs/no_visuals/add_lots.kcl b/src/wasm-lib/tests/executor/inputs/no_visuals/add_lots.kcl deleted file mode 100644 index ae16939cc..000000000 --- a/src/wasm-lib/tests/executor/inputs/no_visuals/add_lots.kcl +++ /dev/null @@ -1,107 +0,0 @@ -fn f = (i) => { - return i * 2 -} - -let x = f(0) -+ f(1) -+ f(2) -+ f(3) -+ f(4) -+ f(5) -+ f(6) -+ f(7) -+ f(8) -+ f(9) -+ f(10) -+ f(11) -+ f(12) -+ f(13) -+ f(14) -+ f(15) -+ f(16) -+ f(17) -+ f(18) -+ f(19) -+ f(20) -+ f(21) -+ f(22) -+ f(23) -+ f(24) -+ f(25) -+ f(26) -+ f(27) -+ f(28) -+ f(29) -+ f(30) -+ f(31) -+ f(32) -+ f(33) -+ f(34) -+ f(35) -+ f(36) -+ f(37) -+ f(38) -+ f(39) -+ f(40) -+ f(41) -+ f(42) -+ f(43) -+ f(44) -+ f(45) -+ f(46) -+ f(47) -+ f(48) -+ f(49) -+ f(50) -+ f(51) -+ f(52) -+ f(53) -+ f(54) -+ f(55) -+ f(56) -+ f(57) -+ f(58) -+ f(59) -+ f(60) -+ f(61) -+ f(62) -+ f(63) -+ f(64) -+ f(65) -+ f(66) -+ f(67) -+ f(68) -+ f(69) -+ f(70) -+ f(71) -+ f(72) -+ f(73) -+ f(74) -+ f(75) -+ f(76) -+ f(77) -+ f(78) -+ f(79) -+ f(80) -+ f(81) -+ f(82) -+ f(83) -+ f(84) -+ f(85) -+ f(86) -+ f(87) -+ f(88) -+ f(89) -+ f(90) -+ f(91) -+ f(92) -+ f(93) -+ f(94) -+ f(95) -+ f(96) -+ f(97) -+ f(98) -+ f(99) -+ f(100) - -assertEqual(x, 10100, 0.1, "Big sum") diff --git a/src/wasm-lib/tests/executor/inputs/no_visuals/array_elem_push_fail.kcl b/src/wasm-lib/tests/executor/inputs/no_visuals/array_elem_push_fail.kcl new file mode 100644 index 000000000..733c22e95 --- /dev/null +++ b/src/wasm-lib/tests/executor/inputs/no_visuals/array_elem_push_fail.kcl @@ -0,0 +1,3 @@ +arr = [1, 2, 3] +pushedArr = push(arr, 4) +fail = arr[3] diff --git a/src/wasm-lib/tests/executor/inputs/no_visuals/double_map.kcl b/src/wasm-lib/tests/executor/inputs/no_visuals/double_map.kcl deleted file mode 100644 index 93f9d7711..000000000 --- a/src/wasm-lib/tests/executor/inputs/no_visuals/double_map.kcl +++ /dev/null @@ -1,6 +0,0 @@ -fn increment = (i) => { return i + 1 } - -xs = [0..2] -ys = xs -|> map(%, increment) -|> map(%, increment) diff --git a/src/wasm-lib/tests/executor/inputs/poop_chute.kcl b/src/wasm-lib/tests/executor/inputs/poop_chute.kcl new file mode 100644 index 000000000..cd6c79a11 --- /dev/null +++ b/src/wasm-lib/tests/executor/inputs/poop_chute.kcl @@ -0,0 +1,58 @@ +wall_thickness = 0.125 +back_walls_width = 2 +front_walls_width = 2.5 +height = 5.5 +filletRadius = 0.050 +back_length = 7 +exit_height = 1 +front_length = 6 +Fx = 0.5 +Fy = 0.5 + +sketch001 = startSketchOn('-YZ') + |> startProfileAt([back_walls_width / 2, 0], %) + |> xLine(wall_thickness / 2, %) + |> angledLineToX({ angle: 45, to: back_walls_width }, %, $seg01) + |> yLineTo(height, %) + |> xLine(-wall_thickness, %) + |> yLineTo(segEndY(seg01), %) + |> angledLineToX({ + angle: 45, + to: back_walls_width / 2 + wall_thickness / 2 + }, %) + |> xLine(-wall_thickness, %) + |> angledLineToX({ angle: 180 - 45, to: wall_thickness }, %) + |> yLineTo(height, %) + |> xLineTo(0, %) + |> yLineTo(segEndY(seg01), %) + |> angledLineToY({ angle: 180 - 45, to: 0 }, %) + |> close(%) +part001 = revolve({ + angle: 90, + axis: { + custom: { + axis: [1.0, 0.0], + origin: [0.0, height + .0000001] + } + } +}, sketch001) + +sketch002 = startSketchOn('-YZ') + |> startProfileAt([back_walls_width / 2, 0], %) + |> xLine(wall_thickness / 2, %) + |> angledLineToX({ angle: 45, to: back_walls_width }, %, $seg02) + |> yLineTo(height, %) + |> xLine(-wall_thickness, %) + |> yLineTo(segEndY(seg01), %) + |> angledLineToX({ + angle: 45, + to: back_walls_width / 2 + wall_thickness / 2 + }, %) + |> xLine(-wall_thickness, %) + |> angledLineToX({ angle: 180 - 45, to: wall_thickness }, %) + |> yLineTo(height, %) + |> xLineTo(0, %) + |> yLineTo(segEndY(seg02), %) + |> angledLineToY({ angle: 180 - 45, to: 0 }, %) + |> close(%) + |> extrude(back_length - height, %) \ No newline at end of file diff --git a/src/wasm-lib/tests/executor/inputs/test-circle-extrude.kcl b/src/wasm-lib/tests/executor/inputs/test-circle-extrude.kcl index 1909ba695..2b493e1e1 100644 --- a/src/wasm-lib/tests/executor/inputs/test-circle-extrude.kcl +++ b/src/wasm-lib/tests/executor/inputs/test-circle-extrude.kcl @@ -12,6 +12,6 @@ const sketch002 = startSketchOn('XZ') |> close(%) const sketch001 = startSketchOn('XZ') |> circle({ - center: [318.33, 168.1], - radius: 182.8 + center = [318.33, 168.1], + radius = 182.8 }, %) diff --git a/src/wasm-lib/tests/executor/main.rs b/src/wasm-lib/tests/executor/main.rs index 1131a97dd..3006fcf1c 100644 --- a/src/wasm-lib/tests/executor/main.rs +++ b/src/wasm-lib/tests/executor/main.rs @@ -1,14 +1,13 @@ +mod cache; + use kcl_lib::{ - settings::types::UnitLength, test_server::{execute_and_snapshot, execute_and_snapshot_no_auth}, + UnitLength, }; /// The minimum permissible difference between asserted twenty-twenty images. /// i.e. how different the current model snapshot can be from the previous saved one. -const MIN_DIFF: f64 = 0.99; - -mod no_visuals; -mod visuals; +pub(crate) const MIN_DIFF: f64 = 0.99; macro_rules! kcl_input { ($file:literal) => { @@ -16,58 +15,25 @@ macro_rules! kcl_input { }; } -fn assert_out(test_name: &str, result: &image::DynamicImage) { - twenty_twenty::assert_image(format!("tests/executor/outputs/{test_name}.png"), result, MIN_DIFF); +pub(crate) fn assert_out(test_name: &str, result: &image::DynamicImage) -> String { + let path = format!("tests/executor/outputs/{test_name}.png"); + twenty_twenty::assert_image(&path, result, MIN_DIFF); + + path } #[tokio::test(flavor = "multi_thread")] async fn kcl_test_fillet_duplicate_tags() { let code = kcl_input!("fillet_duplicate_tags"); - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"type: KclErrorDetails { source_ranges: [SourceRange([203, 249])], message: "Duplicate tags are not allowed." }"#, + r#"type: KclErrorDetails { source_ranges: [SourceRange([203, 249, 0])], message: "Duplicate tags are not allowed." }"#, ); } -#[tokio::test(flavor = "multi_thread")] -async fn kcl_test_execute_with_function_sketch() { - let code = kcl_input!("function_sketch"); - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); - assert_out("function_sketch", &result); -} - -#[tokio::test(flavor = "multi_thread")] -async fn kcl_test_execute_with_function_sketch_with_position() { - let code = kcl_input!("function_sketch_with_position"); - - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); - assert_out("function_sketch_with_position", &result); -} - -#[tokio::test(flavor = "multi_thread")] -async fn kcl_test_execute_with_angled_line() { - let code = kcl_input!("angled_line"); - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); - assert_out("angled_line", &result); -} - -#[tokio::test(flavor = "multi_thread")] -async fn kcl_test_execute_parametric_example() { - let code = kcl_input!("parametric"); - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); - assert_out("parametric", &result); -} - -#[tokio::test(flavor = "multi_thread")] -async fn kcl_test_execute_parametric_with_tan_arc_example() { - let code = kcl_input!("parametric_with_tan_arc"); - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); - assert_out("parametric_with_tan_arc", &result); -} - #[tokio::test(flavor = "multi_thread")] async fn kcl_test_execute_engine_error_return() { let code = r#"part001 = startSketchOn('XY') @@ -79,11 +45,11 @@ async fn kcl_test_execute_engine_error_return() { |> extrude(4, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"engine: KclErrorDetails { source_ranges: [SourceRange([216, 229])], message: "Modeling command failed: [ApiError { error_code: BadRequest, message: \"The path is not closed. Solid2D construction requires a closed path!\" }]" }"#, + r#"engine: KclErrorDetails { source_ranges: [SourceRange([216, 229, 0])], message: "Modeling command failed: [ApiError { error_code: BadRequest, message: \"The path is not closed. Solid2D construction requires a closed path!\" }]" }"#, ); } @@ -92,7 +58,7 @@ async fn kcl_test_execute_i_shape() { // This is some code from lee that starts a pipe expression with a variable. let code = kcl_input!("i_shape"); - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("i_shape", &result); } @@ -101,7 +67,7 @@ async fn kcl_test_execute_i_shape() { async fn kcl_test_execute_pipes_on_pipes() { let code = kcl_input!("pipes_on_pipes"); - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("pipes_on_pipes", &result); } @@ -109,7 +75,7 @@ async fn kcl_test_execute_pipes_on_pipes() { async fn kcl_test_execute_cylinder() { let code = kcl_input!("cylinder"); - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("cylinder", &result); } @@ -117,15 +83,23 @@ async fn kcl_test_execute_cylinder() { async fn kcl_test_execute_kittycad_svg() { let code = kcl_input!("kittycad_svg"); - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("kittycad_svg", &result); } +#[tokio::test(flavor = "multi_thread")] +async fn kcl_test_execute_lsystem() { + let code = kcl_input!("lsystem"); + + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); + assert_out("lsystem", &result); +} + #[tokio::test(flavor = "multi_thread")] async fn kcl_test_member_expression_sketch() { let code = kcl_input!("member_expression_sketch"); - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("member_expression_sketch", &result); } @@ -133,7 +107,7 @@ async fn kcl_test_member_expression_sketch() { async fn kcl_test_helix_defaults() { let code = kcl_input!("helix_defaults"); - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("helix_defaults", &result); } @@ -141,23 +115,15 @@ async fn kcl_test_helix_defaults() { async fn kcl_test_helix_defaults_negative_extrude() { let code = kcl_input!("helix_defaults_negative_extrude"); - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("helix_defaults_negative_extrude", &result); } -#[tokio::test(flavor = "multi_thread")] -async fn kcl_test_helix_ccw() { - let code = kcl_input!("helix_ccw"); - - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); - assert_out("helix_ccw", &result); -} - #[tokio::test(flavor = "multi_thread")] async fn kcl_test_helix_with_length() { let code = kcl_input!("helix_with_length"); - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("helix_with_length", &result); } @@ -165,7 +131,7 @@ async fn kcl_test_helix_with_length() { async fn kcl_test_dimensions_match() { let code = kcl_input!("dimensions_match"); - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("dimensions_match", &result); } @@ -173,7 +139,7 @@ async fn kcl_test_dimensions_match() { async fn kcl_test_close_arc() { let code = kcl_input!("close_arc"); - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("close_arc", &result); } @@ -181,7 +147,7 @@ async fn kcl_test_close_arc() { async fn kcl_test_negative_args() { let code = kcl_input!("negative_args"); - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("negative_args", &result); } @@ -194,7 +160,7 @@ async fn kcl_test_basic_tangential_arc_with_point() { |> extrude(10, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("tangential_arc_with_point", &result); } @@ -207,7 +173,7 @@ async fn kcl_test_basic_tangential_arc_to() { |> extrude(10, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("tangential_arc_to", &result); } @@ -234,7 +200,7 @@ box(30, 43, 18, '-xy') let thing = box(-12, -15, 10, 'yz') box(-20, -5, 10, 'xy')"#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("different_planes_same_drawing", &result); } @@ -292,7 +258,7 @@ part004 = startSketchOn('YZ') |> close(%) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("lots_of_planes", &result); } @@ -309,7 +275,7 @@ async fn kcl_test_holes() { |> extrude(2, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("holes", &result); } @@ -328,7 +294,7 @@ async fn optional_params() { thing = other_circle([2, 2], 20) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("optional_params", &result); } @@ -364,7 +330,7 @@ part = roundedRectangle([0, 0], 20, 20, 4) |> extrude(2, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("rounded_with_holes", &result); } @@ -372,7 +338,7 @@ part = roundedRectangle([0, 0], 20, 20, 4) async fn kcl_test_top_level_expression() { let code = r#"startSketchOn('XY') |> circle({ center: [0,0], radius: 22 }, %) |> extrude(14, %)"#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("top_level_expression", &result); } @@ -386,7 +352,7 @@ part = startSketchOn('XY') |> extrude(1, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("patterns_linear_basic_with_math", &result); } @@ -398,7 +364,7 @@ async fn kcl_test_patterns_linear_basic() { |> extrude(1, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("patterns_linear_basic", &result); } @@ -414,7 +380,7 @@ async fn kcl_test_patterns_linear_basic_3d() { |> patternLinear3d({axis: [1, 0, 1], instances: 4, distance: 6}, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("patterns_linear_basic_3d", &result); } @@ -426,7 +392,7 @@ async fn kcl_test_patterns_linear_basic_negative_distance() { |> extrude(1, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("patterns_linear_basic_negative_distance", &result); } @@ -438,7 +404,7 @@ async fn kcl_test_patterns_linear_basic_negative_axis() { |> extrude(1, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("patterns_linear_basic_negative_axis", &result); } @@ -459,7 +425,7 @@ rectangle = startSketchOn('XY') "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("patterns_linear_basic_holes", &result); } @@ -471,7 +437,7 @@ async fn kcl_test_patterns_circular_basic_2d() { |> extrude(1, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("patterns_circular_basic_2d", &result); } @@ -487,7 +453,7 @@ async fn kcl_test_patterns_circular_basic_3d() { |> patternCircular3d({axis: [0,0, 1], center: [-20, -20, -20], instances: 41, arcDegrees: 360, rotateDuplicates: false}, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("patterns_circular_basic_3d", &result); } @@ -503,7 +469,7 @@ async fn kcl_test_patterns_circular_3d_tilted_axis() { |> patternCircular3d({axis: [1,1,0], center: [10, 0, 10], instances: 11, arcDegrees: 360, rotateDuplicates: true}, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("patterns_circular_3d_tilted_axis", &result); } @@ -511,11 +477,11 @@ async fn kcl_test_patterns_circular_3d_tilted_axis() { async fn kcl_test_import_file_doesnt_exist() { let code = r#"model = import("thing.obj")"#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"semantic: KclErrorDetails { source_ranges: [SourceRange([8, 27])], message: "File `thing.obj` does not exist." }"# + r#"semantic: KclErrorDetails { source_ranges: [SourceRange([8, 27, 0])], message: "File `thing.obj` does not exist." }"# ); } @@ -523,15 +489,15 @@ async fn kcl_test_import_file_doesnt_exist() { async fn kcl_test_import_obj_with_mtl() { let code = r#"model = import("tests/executor/inputs/cube.obj")"#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("import_obj_with_mtl", &result); } #[tokio::test(flavor = "multi_thread")] async fn kcl_test_import_obj_with_mtl_units() { - let code = r#"model = import("tests/executor/inputs/cube.obj", {type: "obj", units: "m"})"#; + let code = r#"model = import("tests/executor/inputs/cube.obj", {format: "obj", units: "m"})"#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("import_obj_with_mtl_units", &result); } @@ -539,7 +505,7 @@ async fn kcl_test_import_obj_with_mtl_units() { async fn kcl_test_import_stl() { let code = r#"model = import("tests/executor/inputs/2-5-long-m8-chc-screw.stl")"#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("import_stl", &result); } @@ -547,7 +513,7 @@ async fn kcl_test_import_stl() { async fn kcl_test_import_gltf_with_bin() { let code = r#"model = import("tests/executor/inputs/cube.gltf")"#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("import_gltf_with_bin", &result); } @@ -555,7 +521,7 @@ async fn kcl_test_import_gltf_with_bin() { async fn kcl_test_import_gltf_embedded() { let code = r#"model = import("tests/executor/inputs/cube-embedded.gltf")"#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("import_gltf_embedded", &result); } @@ -563,7 +529,7 @@ async fn kcl_test_import_gltf_embedded() { async fn kcl_test_import_glb() { let code = r#"model = import("tests/executor/inputs/cube.glb")"#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("import_glb", &result); } @@ -571,19 +537,19 @@ async fn kcl_test_import_glb() { async fn kcl_test_import_glb_no_assign() { let code = r#"import("tests/executor/inputs/cube.glb")"#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("import_glb_no_assign", &result); } #[tokio::test(flavor = "multi_thread")] async fn kcl_test_import_ext_doesnt_match() { - let code = r#"model = import("tests/executor/inputs/cube.gltf", {type: "obj", units: "m"})"#; + let code = r#"model = import("tests/executor/inputs/cube.gltf", {format: "obj", units: "m"})"#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"semantic: KclErrorDetails { source_ranges: [SourceRange([8, 76])], message: "The given format does not match the file extension. Expected: `gltf`, Given: `obj`" }"# + r#"semantic: KclErrorDetails { source_ranges: [SourceRange([8, 78, 0])], message: "The given format does not match the file extension. Expected: `gltf`, Given: `obj`" }"# ); } @@ -604,7 +570,7 @@ async fn kcl_test_cube_mm() { myCube = cube([0,0], 10) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("cube_mm", &result); } @@ -625,7 +591,7 @@ async fn kcl_test_cube_cm() { myCube = cube([0,0], 10) "#; - let result = execute_and_snapshot(code, UnitLength::Cm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Cm, None).await.unwrap(); assert_out("cube_cm", &result); } @@ -646,7 +612,7 @@ async fn kcl_test_cube_m() { myCube = cube([0,0], 10) "#; - let result = execute_and_snapshot(code, UnitLength::M).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::M, None).await.unwrap(); assert_out("cube_m", &result); } @@ -667,7 +633,7 @@ async fn kcl_test_cube_in() { myCube = cube([0,0], 10) "#; - let result = execute_and_snapshot(code, UnitLength::In).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::In, None).await.unwrap(); assert_out("cube_in", &result); } @@ -688,7 +654,7 @@ async fn kcl_test_cube_ft() { myCube = cube([0,0], 10) "#; - let result = execute_and_snapshot(code, UnitLength::Ft).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Ft, None).await.unwrap(); assert_out("cube_ft", &result); } @@ -709,7 +675,7 @@ async fn kcl_test_cube_yd() { myCube = cube([0,0], 10) "#; - let result = execute_and_snapshot(code, UnitLength::Yd).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Yd, None).await.unwrap(); assert_out("cube_yd", &result); } @@ -737,12 +703,12 @@ part002 = startSketchOn(part001, part001.sketch.tags.here) |> extrude(1, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"semantic: KclErrorDetails { source_ranges: [SourceRange([88, 133]), SourceRange([210, 226])], message: "could not sketch tangential arc, because its center would be infinitely far away in the X direction" }"# + r#"semantic: KclErrorDetails { source_ranges: [SourceRange([88, 133, 0]), SourceRange([210, 226, 0])], message: "could not sketch tangential arc, because its center would be infinitely far away in the X direction" }"# ); } @@ -778,7 +744,7 @@ part003 = startSketchOn(part002, "end") |> extrude(5, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("sketch_on_face_of_face", &result); } @@ -795,11 +761,11 @@ async fn kcl_test_stdlib_kcl_error_right_code_path() { |> extrude(2, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"semantic: KclErrorDetails { source_ranges: [SourceRange([151, 189])], message: "Expected an argument at index 1" }"#, + r#"semantic: KclErrorDetails { source_ranges: [SourceRange([151, 189, 0])], message: "Expected an argument at index 1" }"#, ); } @@ -823,7 +789,7 @@ part002 = startSketchOn(part001, "end") |> extrude(5, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("sketch_on_face_circle", &result); } @@ -865,11 +831,11 @@ part = rectShape([0, 0], 20, 20) }, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"semantic: KclErrorDetails { source_ranges: [SourceRange([863, 912])], message: "Argument at index 0 was supposed to be type kcl_lib::std::shapes::CircleData but found string (text)" }"#, + r#"semantic: KclErrorDetails { source_ranges: [SourceRange([870, 874, 0])], message: "Argument at index 0 was supposed to be type kcl_lib::std::shapes::CircleData but found string (text)" }"#, ); } @@ -889,7 +855,7 @@ async fn kcl_test_simple_revolve() { "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("simple_revolve", &result); } @@ -909,7 +875,7 @@ async fn kcl_test_simple_revolve_uppercase() { "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("simple_revolve_uppercase", &result); } @@ -929,7 +895,7 @@ async fn kcl_test_simple_revolve_negative() { "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("simple_revolve_negative", &result); } @@ -949,12 +915,12 @@ async fn kcl_test_revolve_bad_angle_low() { "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"semantic: KclErrorDetails { source_ranges: [SourceRange([272, 308])], message: "Expected angle to be between -360 and 360 and not 0, found `-455`" }"# + r#"semantic: KclErrorDetails { source_ranges: [SourceRange([272, 308, 0])], message: "Expected angle to be between -360 and 360 and not 0, found `-455`" }"# ); } @@ -974,12 +940,12 @@ async fn kcl_test_revolve_bad_angle_high() { "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"semantic: KclErrorDetails { source_ranges: [SourceRange([272, 307])], message: "Expected angle to be between -360 and 360 and not 0, found `455`" }"# + r#"semantic: KclErrorDetails { source_ranges: [SourceRange([272, 307, 0])], message: "Expected angle to be between -360 and 360 and not 0, found `455`" }"# ); } @@ -999,7 +965,7 @@ async fn kcl_test_simple_revolve_custom_angle() { "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("simple_revolve_custom_angle", &result); } @@ -1019,7 +985,7 @@ async fn kcl_test_simple_revolve_custom_axis() { "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("simple_revolve_custom_axis", &result); } @@ -1043,7 +1009,7 @@ sketch001 = startSketchOn(box, "end") "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("revolve_on_edge", &result); } @@ -1067,13 +1033,13 @@ sketch001 = startSketchOn(box, revolveAxis) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_err()); //this fails right now, but slightly differently, lets just say its enough for it to fail - mike //assert_eq!( // result.err().unwrap().to_string(), - // r#"engine: KclErrorDetails { source_ranges: [SourceRange([346, 390])], message: "Modeling command failed: [ApiError { error_code: InternalEngine, message: \"Solid3D revolve failed: sketch profile must lie entirely on one side of the revolution axis\" }]" }"# + // r#"engine: KclErrorDetails { source_ranges: [SourceRange([346, 390, 0])], message: "Modeling command failed: [ApiError { error_code: InternalEngine, message: \"Solid3D revolve failed: sketch profile must lie entirely on one side of the revolution axis\" }]" }"# //); } @@ -1095,7 +1061,7 @@ sketch001 = startSketchOn(box, "END") }, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("revolve_on_face_circle_edge", &result); } @@ -1117,7 +1083,7 @@ sketch001 = startSketchOn(box, "END") }, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("revolve_on_face_circle", &result); } @@ -1143,7 +1109,7 @@ sketch001 = startSketchOn(box, "end") }, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("revolve_on_face", &result); } @@ -1157,7 +1123,7 @@ async fn kcl_test_basic_revolve_circle() { }, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("basic_revolve_circle", &result); } @@ -1184,7 +1150,7 @@ part002 = startSketchOn(part001, 'end') |> extrude(5, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("simple_revolve_sketch_on_edge", &result); } @@ -1247,7 +1213,7 @@ plumbus1 = circle1 }, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("plumbus_fillets", &result); } @@ -1255,7 +1221,7 @@ plumbus1 = circle1 async fn kcl_test_empty_file_is_ok() { let code = r#""#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_ok()); } @@ -1285,7 +1251,7 @@ async fn kcl_test_member_expression_in_params() { capScrew([0, 0.5, 0], 50, 37.5, 50, 25) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("member_expression_in_params", &result); } @@ -1330,7 +1296,7 @@ bracket = startSketchOn('XY') }, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_ok()); } @@ -1350,11 +1316,11 @@ secondSketch = startSketchOn(part001, '') |> extrude(20, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"semantic: KclErrorDetails { source_ranges: [SourceRange([260, 286])], message: "Argument at index 1 was supposed to be type kcl_lib::std::sketch::FaceTag but found string (text)" }"# + r#"semantic: KclErrorDetails { source_ranges: [SourceRange([283, 285, 0])], message: "Argument at index 1 was supposed to be type Option but found string (text)" }"# ); } @@ -1381,11 +1347,11 @@ extrusion = startSketchOn('XY') |> extrude(height, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"semantic: KclErrorDetails { source_ranges: [SourceRange([68, 334]), SourceRange([428, 461])], message: "Expected 2 arguments, got 3" }"# + r#"semantic: KclErrorDetails { source_ranges: [SourceRange([68, 334, 0]), SourceRange([428, 461, 0])], message: "Expected 2 arguments, got 3" }"# ); } @@ -1414,7 +1380,7 @@ sketch001 = [profile001, profile002] extrude(10, sketch001) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("array_of_sketches", &result); } @@ -1450,7 +1416,7 @@ pattn1 = patternLinear3d({ }, extrudes) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("pattern3d_array_of_extrudes", &result); } @@ -1498,7 +1464,7 @@ baseExtrusion = extrude(width, sketch001) }, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("fillets_referencing_other_fillets", &result); } @@ -1546,7 +1512,7 @@ baseExtrusion = extrude(width, sketch001) }, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("chamfers_referencing_other_chamfers", &result); } @@ -1566,7 +1532,7 @@ async fn kcl_test_shell_with_tag() { }, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("shell_with_tag", &result); } @@ -1597,7 +1563,7 @@ pattn1 = patternLinear3d({ "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("linear_pattern3d_filleted_sketch", &result); } @@ -1624,7 +1590,7 @@ pattn2 = patternCircular3d({axis: [0,0, 1], center: [-20, -20, -20], instances: "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("circular_pattern3d_filleted_sketch", &result); } @@ -1651,7 +1617,7 @@ pattn2 = patternCircular3d({axis: [0,0, 1], center: [-20, -20, -20], instances: "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("circular_pattern3d_chamfered_sketch", &result); } @@ -1677,11 +1643,11 @@ part001 = cube([0,0], 20) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"type: KclErrorDetails { source_ranges: [SourceRange([259, 345])], message: "You can only tag one edge at a time with a tagged chamfer. Either delete the tag for the chamfer fn if you don't need it OR separate into individual chamfer functions for each tag." }"# + r#"type: KclErrorDetails { source_ranges: [SourceRange([259, 345, 0])], message: "You can only tag one edge at a time with a tagged chamfer. Either delete the tag for the chamfer fn if you don't need it OR separate into individual chamfer functions for each tag." }"# ); } @@ -1704,60 +1670,60 @@ async fn kcl_test_duplicate_tags_should_error() { let p = triangle(200) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"value already defined: KclErrorDetails { source_ranges: [SourceRange([311, 313]), SourceRange([326, 339])], message: "Cannot redefine `a`" }"# + r#"value already defined: KclErrorDetails { source_ranges: [SourceRange([311, 313, 0]), SourceRange([326, 339, 0])], message: "Cannot redefine `a`" }"# ); } #[tokio::test(flavor = "multi_thread")] async fn kcl_test_global_tags() { let code = kcl_input!("global-tags"); - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("global_tags", &result); } #[tokio::test(flavor = "multi_thread")] async fn kcl_test_extrude_inside_fn_with_tags() { let code = kcl_input!("extrude-inside-fn-with-tags"); - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("extrude-inside-fn-with-tags", &result); } #[tokio::test(flavor = "multi_thread")] async fn kcl_test_pattern_vase() { let code = kcl_input!("pattern_vase"); - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("pattern_vase", &result); } #[tokio::test(flavor = "multi_thread")] async fn kcl_test_scoped_tags() { let code = kcl_input!("scoped-tags"); - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("scoped_tags", &result); } #[tokio::test(flavor = "multi_thread")] async fn kcl_test_order_sketch_extrude_in_order() { let code = kcl_input!("order-sketch-extrude-in-order"); - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("order-sketch-extrude-in-order", &result); } #[tokio::test(flavor = "multi_thread")] async fn kcl_test_order_sketch_extrude_out_of_order() { let code = kcl_input!("order-sketch-extrude-out-of-order"); - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("order-sketch-extrude-out-of-order", &result); } #[tokio::test(flavor = "multi_thread")] async fn kcl_test_extrude_custom_plane() { let code = kcl_input!("extrude-custom-plane"); - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("extrude-custom-plane", &result); } @@ -1779,11 +1745,11 @@ async fn kcl_test_arc_error_same_start_end() { }, %) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"type: KclErrorDetails { source_ranges: [SourceRange([57, 140])], message: "Arc start and end angles must be different" }"# + r#"type: KclErrorDetails { source_ranges: [SourceRange([57, 140, 0])], message: "Arc start and end angles must be different" }"# ); } @@ -1799,11 +1765,11 @@ async fn kcl_test_angled_line_to_x_90() { example = extrude(10, exampleSketch) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"type: KclErrorDetails { source_ranges: [SourceRange([72, 111])], message: "Cannot have an x constrained angle of 90 degrees" }"# + r#"type: KclErrorDetails { source_ranges: [SourceRange([72, 111, 0])], message: "Cannot have an x constrained angle of 90 degrees" }"# ); } @@ -1819,11 +1785,11 @@ async fn kcl_test_angled_line_to_x_270() { example = extrude(10, exampleSketch) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"type: KclErrorDetails { source_ranges: [SourceRange([72, 112])], message: "Cannot have an x constrained angle of 270 degrees" }"# + r#"type: KclErrorDetails { source_ranges: [SourceRange([72, 112, 0])], message: "Cannot have an x constrained angle of 270 degrees" }"# ); } @@ -1839,11 +1805,11 @@ async fn kcl_test_angled_line_to_y_0() { example = extrude(10, exampleSketch) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"type: KclErrorDetails { source_ranges: [SourceRange([72, 110])], message: "Cannot have a y constrained angle of 0 degrees" }"# + r#"type: KclErrorDetails { source_ranges: [SourceRange([72, 110, 0])], message: "Cannot have a y constrained angle of 0 degrees" }"# ); } @@ -1859,11 +1825,11 @@ async fn kcl_test_angled_line_to_y_180() { example = extrude(10, exampleSketch) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"type: KclErrorDetails { source_ranges: [SourceRange([72, 112])], message: "Cannot have a y constrained angle of 180 degrees" }"# + r#"type: KclErrorDetails { source_ranges: [SourceRange([72, 112, 0])], message: "Cannot have a y constrained angle of 180 degrees" }"# ); } @@ -1879,11 +1845,11 @@ async fn kcl_test_angled_line_of_x_length_90() { extrusion = extrude(10, sketch001) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"type: KclErrorDetails { source_ranges: [SourceRange([68, 125])], message: "Cannot have an x constrained angle of 90 degrees" }"# + r#"type: KclErrorDetails { source_ranges: [SourceRange([68, 125, 0])], message: "Cannot have an x constrained angle of 90 degrees" }"# ); } @@ -1899,11 +1865,11 @@ async fn kcl_test_angled_line_of_x_length_270() { extrusion = extrude(10, sketch001) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"type: KclErrorDetails { source_ranges: [SourceRange([68, 125])], message: "Cannot have an x constrained angle of 90 degrees" }"# + r#"type: KclErrorDetails { source_ranges: [SourceRange([68, 125, 0])], message: "Cannot have an x constrained angle of 90 degrees" }"# ); } @@ -1921,11 +1887,11 @@ async fn kcl_test_angled_line_of_y_length_0() { example = extrude(10, exampleSketch) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"type: KclErrorDetails { source_ranges: [SourceRange([94, 142])], message: "Cannot have a y constrained angle of 0 degrees" }"# + r#"type: KclErrorDetails { source_ranges: [SourceRange([94, 142, 0])], message: "Cannot have a y constrained angle of 0 degrees" }"# ); } @@ -1943,11 +1909,11 @@ async fn kcl_test_angled_line_of_y_length_180() { example = extrude(10, exampleSketch) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"type: KclErrorDetails { source_ranges: [SourceRange([94, 144])], message: "Cannot have a y constrained angle of 180 degrees" }"# + r#"type: KclErrorDetails { source_ranges: [SourceRange([94, 144, 0])], message: "Cannot have a y constrained angle of 180 degrees" }"# ); } @@ -1965,11 +1931,11 @@ async fn kcl_test_angled_line_of_y_length_negative_180() { example = extrude(10, exampleSketch) "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"type: KclErrorDetails { source_ranges: [SourceRange([94, 145])], message: "Cannot have a y constrained angle of 180 degrees" }"# + r#"type: KclErrorDetails { source_ranges: [SourceRange([94, 145, 0])], message: "Cannot have a y constrained angle of 180 degrees" }"# ); } @@ -1982,11 +1948,11 @@ async fn kcl_test_error_inside_fn_also_has_source_range_of_call_site() { someFunction('INVALID') "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"semantic: KclErrorDetails { source_ranges: [SourceRange([37, 61]), SourceRange([65, 88])], message: "Argument at index 0 was supposed to be type kcl_lib::std::sketch::SketchData but found string (text)" }"# + r#"semantic: KclErrorDetails { source_ranges: [SourceRange([51, 60, 0]), SourceRange([65, 88, 0])], message: "Argument at index 0 was supposed to be type kcl_lib::std::sketch::SketchData but found string (text)" }"# ); } @@ -2003,11 +1969,11 @@ async fn kcl_test_error_inside_fn_also_has_source_range_of_call_site_recursive() someFunction('INVALID') "#; - let result = execute_and_snapshot(code, UnitLength::Mm).await; + let result = execute_and_snapshot(code, UnitLength::Mm, None).await; assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"semantic: KclErrorDetails { source_ranges: [SourceRange([89, 114]), SourceRange([126, 155]), SourceRange([159, 182])], message: "Argument at index 0 was supposed to be type kcl_lib::std::sketch::SketchData but found string (text)" }"# + r#"semantic: KclErrorDetails { source_ranges: [SourceRange([103, 113, 0]), SourceRange([126, 155, 0]), SourceRange([159, 182, 0])], message: "Argument at index 0 was supposed to be type kcl_lib::std::sketch::SketchData but found string (text)" }"# ); } @@ -2027,7 +1993,7 @@ async fn kcl_test_error_no_auth_websocket() { }, %) "#; - let result = execute_and_snapshot_no_auth(code, UnitLength::Mm).await; + let result = execute_and_snapshot_no_auth(code, UnitLength::Mm, None).await; assert!(result.is_err()); assert!(result .err() diff --git a/src/wasm-lib/tests/executor/no_visuals.rs b/src/wasm-lib/tests/executor/no_visuals.rs deleted file mode 100644 index 921f55531..000000000 --- a/src/wasm-lib/tests/executor/no_visuals.rs +++ /dev/null @@ -1,175 +0,0 @@ -use kcl_lib::{ - ast::types::Program, - errors::KclError, - executor::{ExecutorContext, IdGenerator}, - parser, -}; - -macro_rules! gen_test { - ($file:ident) => { - #[tokio::test] - async fn $file() { - let code = include_str!(concat!("inputs/no_visuals/", stringify!($file), ".kcl")); - run(&code).await; - } - }; -} - -macro_rules! gen_test_fail { - ($file:ident, $expected:literal) => { - #[tokio::test] - async fn $file() { - let code = include_str!(concat!("inputs/no_visuals/", stringify!($file), ".kcl")); - let actual = run_fail(&code).await; - assert_eq!(actual.get_message(), $expected); - } - }; -} - -macro_rules! gen_test_parse_fail { - ($file:ident, $expected:literal) => { - #[tokio::test] - async fn $file() { - let code = include_str!(concat!("inputs/no_visuals/", stringify!($file), ".kcl")); - let actual = run_parse_fail(&code).await; - assert_eq!(actual.get_message(), $expected); - } - }; -} - -async fn run(code: &str) { - let (ctx, program, id_generator) = setup(code).await; - - let res = ctx - .run( - &program, - None, - id_generator, - Some("tests/executor/inputs/no_visuals/".to_owned()), - ) - .await; - match res { - Ok(state) => { - println!("{:#?}", state.memory); - } - Err(e) => { - panic!("{e}"); - } - } -} - -async fn setup(program: &str) -> (ExecutorContext, Program, IdGenerator) { - let tokens = kcl_lib::token::lexer(program).unwrap(); - let parser = kcl_lib::parser::Parser::new(tokens); - let program = parser.ast().unwrap(); - let ctx = kcl_lib::executor::ExecutorContext { - engine: std::sync::Arc::new(Box::new( - kcl_lib::engine::conn_mock::EngineConnection::new().await.unwrap(), - )), - fs: std::sync::Arc::new(kcl_lib::fs::FileManager::new()), - stdlib: std::sync::Arc::new(kcl_lib::std::StdLib::new()), - settings: Default::default(), - context_type: kcl_lib::executor::ContextType::Mock, - }; - (ctx, program, IdGenerator::default()) -} - -async fn run_fail(code: &str) -> KclError { - let (ctx, program, id_generator) = setup(code).await; - let Err(e) = ctx - .run( - &program, - None, - id_generator, - Some("tests/executor/inputs/no_visuals/".to_owned()), - ) - .await - else { - panic!("Expected this KCL program to fail, but it (incorrectly) never threw an error."); - }; - e -} - -async fn run_parse_fail(code: &str) -> KclError { - let Err(e) = parser::parse(code) else { - panic!("Expected this KCL program to fail to parse, but it (incorrectly) never threw an error."); - }; - e -} - -gen_test!(property_of_object); -gen_test!(index_of_array); -gen_test!(comparisons); -gen_test!(array_range_expr); -gen_test!(array_range_negative_expr); -gen_test_fail!( - invalid_index_str, - "semantic: Only integers >= 0 can be used as the index of an array, but you're using a string" -); -gen_test_fail!( - invalid_index_negative, - "semantic: '-1' is not a valid index, indices must be whole positive numbers" -); -gen_test_fail!( - invalid_index_fractional, - "semantic: Only strings or ints (>= 0) can be properties/indexes" -); -gen_test_fail!( - invalid_member_object, - "semantic: Only arrays and objects can be indexed, but you're trying to index a number" -); -gen_test_fail!( - invalid_member_object_prop, - "semantic: Only arrays and objects can be indexed, but you're trying to index a boolean (true/false value)" -); -gen_test_fail!( - non_string_key_of_object, - "semantic: Only strings can be used as the property of an object, but you're using a number" -); -gen_test_fail!( - array_index_oob, - "undefined value: The array doesn't have any item at index 0" -); -gen_test_fail!( - object_prop_not_found, - "undefined value: Property 'age' not found in object" -); -gen_test_fail!( - pipe_substitution_inside_function_called_from_pipeline, - "semantic: cannot use % outside a pipe expression" -); -gen_test!(sketch_in_object); -gen_test!(if_else); -// gen_test_fail!( -// if_else_no_expr, -// "syntax: blocks inside an if/else expression must end in an expression" -// ); -gen_test_fail!(comparisons_multiple, "syntax: Invalid number: true"); -gen_test!(import_simple); -gen_test_fail!( - import_cycle1, - "import cycle: circular import of modules is not allowed: tests/executor/inputs/no_visuals/import_cycle2.kcl -> tests/executor/inputs/no_visuals/import_cycle3.kcl -> tests/executor/inputs/no_visuals/import_cycle1.kcl -> tests/executor/inputs/no_visuals/import_cycle2.kcl" -); -gen_test_fail!( - import_constant, - "semantic: Error loading imported file. Open it to view more details. export_constant.kcl: Only functions can be exported" -); -gen_test_fail!( - import_side_effect, - "semantic: Error loading imported file. Open it to view more details. export_side_effect.kcl: Cannot send modeling commands while importing. Wrap your code in a function if you want to import the file." -); -gen_test_parse_fail!( - import_from_other_directory, - "syntax: import path may only contain alphanumeric characters, underscore, hyphen, and period. Files in other directories are not yet supported." -); -// TODO: We'd like these tests. -// gen_test_fail!( -// import_in_if, -// "syntax: Can import only import at the top level" -// ); -// gen_test_fail!( -// import_in_function, -// "syntax: Can import only import at the top level" -// ); -gen_test!(add_lots); -gen_test!(double_map); diff --git a/src/wasm-lib/tests/executor/outputs/cache_change_grid_visualizes_grid_off_to_on_0.png b/src/wasm-lib/tests/executor/outputs/cache_change_grid_visualizes_grid_off_to_on_0.png new file mode 100644 index 000000000..8f97850b7 Binary files /dev/null and b/src/wasm-lib/tests/executor/outputs/cache_change_grid_visualizes_grid_off_to_on_0.png differ diff --git a/src/wasm-lib/tests/executor/outputs/cache_change_grid_visualizes_grid_off_to_on_1.png b/src/wasm-lib/tests/executor/outputs/cache_change_grid_visualizes_grid_off_to_on_1.png new file mode 100644 index 000000000..3425e99c6 Binary files /dev/null and b/src/wasm-lib/tests/executor/outputs/cache_change_grid_visualizes_grid_off_to_on_1.png differ diff --git a/src/wasm-lib/tests/executor/outputs/cache_change_grid_visualizes_grid_on_to_off_0.png b/src/wasm-lib/tests/executor/outputs/cache_change_grid_visualizes_grid_on_to_off_0.png new file mode 100644 index 000000000..10a5d3ae3 Binary files /dev/null and b/src/wasm-lib/tests/executor/outputs/cache_change_grid_visualizes_grid_on_to_off_0.png differ diff --git a/src/wasm-lib/tests/executor/outputs/cache_change_grid_visualizes_grid_on_to_off_1.png b/src/wasm-lib/tests/executor/outputs/cache_change_grid_visualizes_grid_on_to_off_1.png new file mode 100644 index 000000000..8f97850b7 Binary files /dev/null and b/src/wasm-lib/tests/executor/outputs/cache_change_grid_visualizes_grid_on_to_off_1.png differ diff --git a/src/wasm-lib/tests/executor/outputs/cache_change_highlight_edges_changes_visual_0.png b/src/wasm-lib/tests/executor/outputs/cache_change_highlight_edges_changes_visual_0.png new file mode 100644 index 000000000..8f97850b7 Binary files /dev/null and b/src/wasm-lib/tests/executor/outputs/cache_change_highlight_edges_changes_visual_0.png differ diff --git a/src/wasm-lib/tests/executor/outputs/cache_change_highlight_edges_changes_visual_1.png b/src/wasm-lib/tests/executor/outputs/cache_change_highlight_edges_changes_visual_1.png new file mode 100644 index 000000000..0deafe039 Binary files /dev/null and b/src/wasm-lib/tests/executor/outputs/cache_change_highlight_edges_changes_visual_1.png differ diff --git a/src/wasm-lib/tests/executor/outputs/cache_change_units_changes_output_0.png b/src/wasm-lib/tests/executor/outputs/cache_change_units_changes_output_0.png new file mode 100644 index 000000000..fa87beb72 Binary files /dev/null and b/src/wasm-lib/tests/executor/outputs/cache_change_units_changes_output_0.png differ diff --git a/src/wasm-lib/tests/executor/outputs/cache_change_units_changes_output_1.png b/src/wasm-lib/tests/executor/outputs/cache_change_units_changes_output_1.png new file mode 100644 index 000000000..8f97850b7 Binary files /dev/null and b/src/wasm-lib/tests/executor/outputs/cache_change_units_changes_output_1.png differ diff --git a/src/wasm-lib/tests/executor/outputs/circle_three_point.png b/src/wasm-lib/tests/executor/outputs/circle_three_point.png new file mode 100644 index 000000000..5a201e4fd Binary files /dev/null and b/src/wasm-lib/tests/executor/outputs/circle_three_point.png differ diff --git a/src/wasm-lib/tests/executor/outputs/circular_pattern3d_chamfered_sketch.png b/src/wasm-lib/tests/executor/outputs/circular_pattern3d_chamfered_sketch.png index 17b2b2233..5a8f8979f 100644 Binary files a/src/wasm-lib/tests/executor/outputs/circular_pattern3d_chamfered_sketch.png and b/src/wasm-lib/tests/executor/outputs/circular_pattern3d_chamfered_sketch.png differ diff --git a/src/wasm-lib/tests/executor/outputs/circular_pattern3d_filleted_sketch.png b/src/wasm-lib/tests/executor/outputs/circular_pattern3d_filleted_sketch.png index d3ed14c14..896c9e297 100644 Binary files a/src/wasm-lib/tests/executor/outputs/circular_pattern3d_filleted_sketch.png and b/src/wasm-lib/tests/executor/outputs/circular_pattern3d_filleted_sketch.png differ diff --git a/src/wasm-lib/tests/executor/outputs/helix_defaults.png b/src/wasm-lib/tests/executor/outputs/helix_defaults.png index a98832023..b97a3461c 100644 Binary files a/src/wasm-lib/tests/executor/outputs/helix_defaults.png and b/src/wasm-lib/tests/executor/outputs/helix_defaults.png differ diff --git a/src/wasm-lib/tests/executor/outputs/helix_defaults_negative_extrude.png b/src/wasm-lib/tests/executor/outputs/helix_defaults_negative_extrude.png index 447ec5061..7514c09a5 100644 Binary files a/src/wasm-lib/tests/executor/outputs/helix_defaults_negative_extrude.png and b/src/wasm-lib/tests/executor/outputs/helix_defaults_negative_extrude.png differ diff --git a/src/wasm-lib/tests/executor/outputs/lsystem.png b/src/wasm-lib/tests/executor/outputs/lsystem.png new file mode 100644 index 000000000..3a35d169f Binary files /dev/null and b/src/wasm-lib/tests/executor/outputs/lsystem.png differ diff --git a/src/wasm-lib/tests/executor/outputs/patterns_circular_basic_3d.png b/src/wasm-lib/tests/executor/outputs/patterns_circular_basic_3d.png index b26c5aa22..62cb19649 100644 Binary files a/src/wasm-lib/tests/executor/outputs/patterns_circular_basic_3d.png and b/src/wasm-lib/tests/executor/outputs/patterns_circular_basic_3d.png differ diff --git a/src/wasm-lib/tests/executor/outputs/poop_chute.png b/src/wasm-lib/tests/executor/outputs/poop_chute.png new file mode 100644 index 000000000..63f3ec192 Binary files /dev/null and b/src/wasm-lib/tests/executor/outputs/poop_chute.png differ diff --git a/src/wasm-lib/tests/executor/visuals.rs b/src/wasm-lib/tests/executor/visuals.rs deleted file mode 100644 index 735330a7d..000000000 --- a/src/wasm-lib/tests/executor/visuals.rs +++ /dev/null @@ -1,73 +0,0 @@ -macro_rules! kcl_input { - ($file:literal) => { - include_str!(concat!("inputs/", $file, ".kcl")) - }; -} - -macro_rules! kcl_test { - ($file:literal, $test_name:ident) => { - #[tokio::test(flavor = "multi_thread")] - async fn $test_name() { - let code = kcl_input!($file); - - let result = super::execute_and_snapshot(code, kcl_lib::settings::types::UnitLength::Mm) - .await - .unwrap(); - super::assert_out($file, &result); - } - }; -} - -kcl_test!("sketch_on_face", kcl_test_sketch_on_face); -kcl_test!("neg_xz_plane", kcl_test_neg_xz_plane); -kcl_test!("xz_plane", kcl_test_xz_plane); -kcl_test!( - "sketch_on_face_after_fillets_referencing_face", - kcl_test_sketch_on_face_after_fillets_referencing_face -); -kcl_test!("circular_pattern3d_a_pattern", kcl_test_circular_pattern3d_a_pattern); -kcl_test!("linear_pattern3d_a_pattern", kcl_test_linear_pattern3d_a_pattern); - -kcl_test!("tangential_arc", kcl_test_tangential_arc); -kcl_test!( - "big_number_angle_to_match_length_x", - kcl_test_big_number_angle_to_match_length_x -); -kcl_test!( - "big_number_angle_to_match_length_y", - kcl_test_big_number_angle_to_match_length_y -); -kcl_test!("sketch_on_face_circle_tagged", kcl_test_sketch_on_face_circle_tagged); -kcl_test!("basic_fillet_cube_start", kcl_test_basic_fillet_cube_start); -kcl_test!( - "basic_fillet_cube_next_adjacent", - kcl_test_basic_fillet_cube_next_adjacent -); -kcl_test!( - "basic_fillet_cube_previous_adjacent", - kcl_test_basic_fillet_cube_previous_adjacent -); -kcl_test!("basic_fillet_cube_end", kcl_test_basic_fillet_cube_end); -kcl_test!( - "basic_fillet_cube_close_opposite", - kcl_test_basic_fillet_cube_close_opposite -); -kcl_test!("sketch_on_face_end", kcl_test_sketch_on_face_end); -kcl_test!("sketch_on_face_start", kcl_test_sketch_on_face_start); -kcl_test!( - "sketch_on_face_end_negative_extrude", - kcl_test_sketch_on_face_end_negative_extrude -); -kcl_test!("mike_stress_test", kcl_test_mike_stress_test); -kcl_test!("pentagon_fillet_sugar", kcl_test_pentagon_fillet_sugar); -kcl_test!("pipe_as_arg", kcl_test_pipe_as_arg); -kcl_test!("computed_var", kcl_test_computed_var); -kcl_test!("lego", kcl_test_lego); -kcl_test!("riddle_small", kcl_test_riddle_small); -kcl_test!("tan_arc_x_line", kcl_test_tan_arc_x_line); -kcl_test!("fillet-and-shell", kcl_test_fillet_and_shell); -kcl_test!("sketch-on-chamfer-two-times", kcl_test_sketch_on_chamfer_two_times); -kcl_test!( - "sketch-on-chamfer-two-times-different-order", - kcl_test_sketch_on_chamfer_two_times_different_order -); diff --git a/src/wasm-lib/tests/modify/main.rs b/src/wasm-lib/tests/modify/main.rs index 43032153a..22c813d74 100644 --- a/src/wasm-lib/tests/modify/main.rs +++ b/src/wasm-lib/tests/modify/main.rs @@ -1,26 +1,22 @@ use anyhow::Result; use kcl_lib::{ - ast::{modify::modify_ast_for_sketch, types::Program}, - executor::{ExecutorContext, IdGenerator, KclValue, PlaneType, Sketch, SourceRange}, + exec::{KclValue, PlaneType}, + modify_ast_for_sketch, ExecState, ExecutorContext, ModuleId, Program, SourceRange, }; use kittycad_modeling_cmds::{each_cmd as mcmd, length_unit::LengthUnit, shared::Point3d, ModelingCmd}; use pretty_assertions::assert_eq; /// Setup the engine and parse code for an ast. -async fn setup(code: &str, name: &str) -> Result<(ExecutorContext, Program, uuid::Uuid)> { - let tokens = kcl_lib::token::lexer(code)?; - let parser = kcl_lib::parser::Parser::new(tokens); - let program = parser.ast()?; - let ctx = kcl_lib::executor::ExecutorContext::new_with_default_client(Default::default()).await?; - let exec_state = ctx.run(&program, None, IdGenerator::default(), None).await?; +async fn setup(code: &str, name: &str) -> Result<(ExecutorContext, Program, ModuleId, uuid::Uuid)> { + let program = Program::parse_no_errs(code)?; + let ctx = kcl_lib::ExecutorContext::new_with_default_client(Default::default()).await?; + let mut exec_state = ExecState::default(); + ctx.run(program.clone().into(), &mut exec_state).await?; // We need to get the sketch ID. // Get the sketch ID from memory. - let KclValue::UserVal(user_val) = exec_state.memory.get(name, SourceRange::default()).unwrap() else { - anyhow::bail!("part001 not found in memory: {:?}", exec_state.memory); - }; - let Some((sketch, _meta)) = user_val.get::() else { - anyhow::bail!("part001 was not a Sketch"); + let KclValue::Sketch { value: sketch } = exec_state.memory().get(name, SourceRange::default()).unwrap() else { + anyhow::bail!("part001 not found in memory: {:?}", exec_state.memory()); }; let sketch_id = sketch.id; @@ -57,7 +53,7 @@ async fn setup(code: &str, name: &str) -> Result<(ExecutorContext, Program, uuid ) .await?; - Ok((ctx, program, sketch_id)) + Ok((ctx, program, ModuleId::default(), sketch_id)) } #[tokio::test(flavor = "multi_thread")] @@ -73,9 +69,9 @@ async fn kcl_test_modify_sketch_part001() { name ); - let (ctx, program, sketch_id) = setup(&code, name).await.unwrap(); + let (ctx, program, module_id, sketch_id) = setup(&code, name).await.unwrap(); let mut new_program = program.clone(); - let new_code = modify_ast_for_sketch(&ctx.engine, &mut new_program, name, PlaneType::XY, sketch_id) + let new_code = modify_ast_for_sketch(&ctx.engine, &mut new_program, module_id, name, PlaneType::XY, sketch_id) .await .unwrap(); @@ -98,9 +94,9 @@ async fn kcl_test_modify_sketch_part002() { name ); - let (ctx, program, sketch_id) = setup(&code, name).await.unwrap(); + let (ctx, program, module_id, sketch_id) = setup(&code, name).await.unwrap(); let mut new_program = program.clone(); - let new_code = modify_ast_for_sketch(&ctx.engine, &mut new_program, name, PlaneType::XY, sketch_id) + let new_code = modify_ast_for_sketch(&ctx.engine, &mut new_program, module_id, name, PlaneType::XY, sketch_id) .await .unwrap(); @@ -125,9 +121,9 @@ async fn kcl_test_modify_close_sketch() { name ); - let (ctx, program, sketch_id) = setup(&code, name).await.unwrap(); + let (ctx, program, module_id, sketch_id) = setup(&code, name).await.unwrap(); let mut new_program = program.clone(); - let new_code = modify_ast_for_sketch(&ctx.engine, &mut new_program, name, PlaneType::XY, sketch_id) + let new_code = modify_ast_for_sketch(&ctx.engine, &mut new_program, module_id, name, PlaneType::XY, sketch_id) .await .unwrap(); @@ -151,9 +147,9 @@ async fn kcl_test_modify_line_to_close_sketch() { name ); - let (ctx, program, sketch_id) = setup(&code, name).await.unwrap(); + let (ctx, program, module_id, sketch_id) = setup(&code, name).await.unwrap(); let mut new_program = program.clone(); - let new_code = modify_ast_for_sketch(&ctx.engine, &mut new_program, name, PlaneType::XY, sketch_id) + let new_code = modify_ast_for_sketch(&ctx.engine, &mut new_program, module_id, name, PlaneType::XY, sketch_id) .await .unwrap(); @@ -188,14 +184,14 @@ const {} = startSketchOn("XY") name ); - let (ctx, program, sketch_id) = setup(&code, name).await.unwrap(); + let (ctx, program, module_id, sketch_id) = setup(&code, name).await.unwrap(); let mut new_program = program.clone(); - let result = modify_ast_for_sketch(&ctx.engine, &mut new_program, name, PlaneType::XY, sketch_id).await; + let result = modify_ast_for_sketch(&ctx.engine, &mut new_program, module_id, name, PlaneType::XY, sketch_id).await; assert!(result.is_err()); assert_eq!( result.unwrap_err().to_string(), - r#"engine: KclErrorDetails { source_ranges: [SourceRange([188, 193])], message: "Sketch part002 is constrained `partial` and cannot be modified" }"# + r#"engine: KclErrorDetails { source_ranges: [SourceRange([188, 193, 0])], message: "Sketch part002 is constrained `partial` and cannot be modified" }"# ); } @@ -213,9 +209,9 @@ async fn kcl_test_modify_line_should_close_sketch() { name ); - let (ctx, program, sketch_id) = setup(&code, name).await.unwrap(); + let (ctx, program, module_id, sketch_id) = setup(&code, name).await.unwrap(); let mut new_program = program.clone(); - let new_code = modify_ast_for_sketch(&ctx.engine, &mut new_program, name, PlaneType::XY, sketch_id) + let new_code = modify_ast_for_sketch(&ctx.engine, &mut new_program, module_id, name, PlaneType::XY, sketch_id) .await .unwrap(); diff --git a/tsconfig.json b/tsconfig.json index b5913f0d7..3624d4f38 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,6 +5,9 @@ "@kittycad/codemirror-lsp-client": [ "../packages/codemirror-lsp-client/src/index.ts" ], + "@kittycad/codemirror-lang-kcl": [ + "../packages/codemirror-lang-kcl/src/index.ts" + ], "/*": ["src/*"] }, "types": [ diff --git a/vite.config.ts b/vite.config.ts index 0c9691e28..c8b8414be 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,6 +1,6 @@ import react from '@vitejs/plugin-react' import viteTsconfigPaths from 'vite-tsconfig-paths' -import eslint from 'vite-plugin-eslint' +import eslint from '@nabla/vite-plugin-eslint' import { defineConfig, configDefaults } from 'vitest/config' import version from 'vite-plugin-package-version' // @ts-ignore: No types available @@ -58,6 +58,7 @@ const config = defineConfig({ resolve: { alias: { '@kittycad/codemirror-lsp-client': '/packages/codemirror-lsp-client/src', + '@kittycad/codemirror-lang-kcl': '/packages/codemirror-lang-kcl/src', }, }, plugins: [react(), viteTsconfigPaths(), eslint(), version(), lezer()], diff --git a/vite.main.config.ts b/vite.main.config.ts index ed4e6203a..89645e874 100644 --- a/vite.main.config.ts +++ b/vite.main.config.ts @@ -2,7 +2,7 @@ import type { ConfigEnv, UserConfig } from 'vite' import { defineConfig, mergeConfig } from 'vite' import { configDefaults } from 'vitest/config' import viteTsconfigPaths from 'vite-tsconfig-paths' -import vitePluginEslint from 'vite-plugin-eslint' +import vitePluginEslint from '@nabla/vite-plugin-eslint' import vitePluginPackageVersion from 'vite-plugin-package-version' import { getBuildConfig, diff --git a/yarn.lock b/yarn.lock index 53c24c078..c87227c75 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1204,11 +1204,6 @@ "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" -"@bitdisaster/exe-icon-extractor@^1.0.10": - version "1.0.10" - resolved "https://registry.yarnpkg.com/@bitdisaster/exe-icon-extractor/-/exe-icon-extractor-1.0.10.tgz#3f5107864254c351db1db5c5922452d9d4154e8f" - integrity sha512-iTZ8cVGZ5dglNRyFdSj8U60mHIrC8XNIuOHN/NkM5/dQP4nsmpyqeQTAADLLQgoFCNJD+DiwQCv8dR2cCeWP4g== - "@codemirror/autocomplete@^6.0.0", "@codemirror/autocomplete@^6.17.0": version "6.17.0" resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.17.0.tgz#24ff5fc37fd91f6439df6f4ff9c8e910cde1b053" @@ -1229,10 +1224,10 @@ "@codemirror/view" "^6.27.0" "@lezer/common" "^1.1.0" -"@codemirror/language@^6.0.0", "@codemirror/language@^6.10.2": - version "6.10.2" - resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-6.10.2.tgz#4056dc219619627ffe995832eeb09cea6060be61" - integrity sha512-kgbTYTo0Au6dCSc/TFy7fK3fpJmgHDv1sG1KNQKJXVi+xBTEeBPY/M30YXiU6mMXeH+YIDLsbrT4ZwNRdtF+SA== +"@codemirror/language@^6.0.0", "@codemirror/language@^6.10.3": + version "6.10.3" + resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-6.10.3.tgz#eb25fc5ade19032e7bf1dcaa957804e5f1660585" + integrity sha512-kDqEU5sCP55Oabl6E7m5N+vZRoc0iWqgDVhEKifcHzPzjqCegcO4amfrYVL9PmPZpl4G0yjkpTpUO/Ui8CzO8A== dependencies: "@codemirror/state" "^6.0.0" "@codemirror/view" "^6.23.0" @@ -1241,13 +1236,13 @@ "@lezer/lr" "^1.0.0" style-mod "^4.0.0" -"@codemirror/lint@^6.0.0", "@codemirror/lint@^6.8.1": - version "6.8.1" - resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-6.8.1.tgz#6427848815baaf68c08e98c7673b804d3d8c0e7f" - integrity sha512-IZ0Y7S4/bpaunwggW2jYqwLuHj0QtESf5xcROewY6+lDNwZ/NzvR4t+vpYgg9m7V8UXLPYqG+lu3DF470E5Oxg== +"@codemirror/lint@^6.0.0", "@codemirror/lint@^6.8.4": + version "6.8.4" + resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-6.8.4.tgz#7d8aa5d1a6dec89ffcc23ad45ddca2e12e90982d" + integrity sha512-u4q7PnZlJUojeRe8FJa/njJcMctISGgPQ4PnWsd9268R4ZTtU+tfFYmwkBvgcrK2+QQ8tYFVALVb5fVJykKc5A== dependencies: "@codemirror/state" "^6.0.0" - "@codemirror/view" "^6.0.0" + "@codemirror/view" "^6.35.0" crelt "^1.0.5" "@codemirror/search@^6.0.0", "@codemirror/search@^6.5.6": @@ -1259,10 +1254,12 @@ "@codemirror/view" "^6.0.0" crelt "^1.0.5" -"@codemirror/state@^6.0.0", "@codemirror/state@^6.2.1", "@codemirror/state@^6.4.0", "@codemirror/state@^6.4.1": - version "6.4.1" - resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.4.1.tgz#da57143695c056d9a3c38705ed34136e2b68171b" - integrity sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A== +"@codemirror/state@^6.0.0", "@codemirror/state@^6.2.1", "@codemirror/state@^6.4.0", "@codemirror/state@^6.4.1", "@codemirror/state@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.5.0.tgz#e98dde85620618651543152fe1c2483300a0ccc9" + integrity sha512-MwBHVK60IiIHDcoMet78lxt6iw5gJOGSbNbOIVBHWVXIH4/Nq1+GQgLLGgI1KlnN86WDXsPudVaqYHKBIx7Eyw== + dependencies: + "@marijn/find-cluster-break" "^1.0.0" "@codemirror/theme-one-dark@^6.1.2": version "6.1.2" @@ -1274,12 +1271,12 @@ "@codemirror/view" "^6.0.0" "@lezer/highlight" "^1.0.0" -"@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.27.0": - version "6.29.1" - resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.29.1.tgz#9c6c6f8a15e12df1b7e9d136dcbf4ff90b81ef71" - integrity sha512-7r+DlO/QFwPqKp73uq5mmrS4TuLPUVotbNOKYzN3OLP5ScrOVXcm4g13/48b6ZXGhdmzMinzFYqH0vo+qihIkQ== +"@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.27.0", "@codemirror/view@^6.35.0": + version "6.36.1" + resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.36.1.tgz#3c543b8fd72c96b30c4b2b1464d1ebce7e0c5c4b" + integrity sha512-miD1nyT4m4uopZaDdO2uXU/LLHliKNYL9kB1C1wJHrunHLm/rpkb5QVSokqgw9hFqEZakrdlb/VGWX8aYZTslQ== dependencies: - "@codemirror/state" "^6.4.0" + "@codemirror/state" "^6.5.0" style-mod "^4.1.0" w3c-keyname "^2.2.4" @@ -1295,37 +1292,37 @@ resolved "https://registry.yarnpkg.com/@csstools/color-helpers/-/color-helpers-5.0.1.tgz#829f1c76f5800b79c51c709e2f36821b728e0e10" integrity sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA== -"@csstools/css-calc@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@csstools/css-calc/-/css-calc-2.0.1.tgz#1675297b19f0933c729fdd7f4f5279b855ae724f" - integrity sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q== +"@csstools/css-calc@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@csstools/css-calc/-/css-calc-2.1.1.tgz#a7dbc66627f5cf458d42aed14bda0d3860562383" + integrity sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag== -"@csstools/css-color-parser@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@csstools/css-color-parser/-/css-color-parser-3.0.2.tgz#710abb97142d58bcefc3a5e032a55a246895351c" - integrity sha512-mNg7A6HnNjlm0we/pDS9dUafOuBxcanN0TBhEGeIk6zZincuk0+mAbnBqfVs29NlvWHZ8diwTG6g5FeU8246sA== +"@csstools/css-color-parser@^3.0.7": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@csstools/css-color-parser/-/css-color-parser-3.0.7.tgz#442d61d58e54ad258d52c309a787fceb33906484" + integrity sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA== dependencies: "@csstools/color-helpers" "^5.0.1" - "@csstools/css-calc" "^2.0.1" + "@csstools/css-calc" "^2.1.1" -"@csstools/css-parser-algorithms@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz#f14ade63bae5f6025ac85c7d03fe47a7ca0e58af" - integrity sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg== +"@csstools/css-parser-algorithms@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz#74426e93bd1c4dcab3e441f5cc7ba4fb35d94356" + integrity sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A== -"@csstools/css-tokenizer@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz#9dd9b10084f3011290f96789598091e5bcb3c29a" - integrity sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw== +"@csstools/css-tokenizer@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz#a5502c8539265fecbd873c1e395a890339f119c2" + integrity sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw== -"@csstools/postcss-oklab-function@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.2.tgz#3d36974fbb7c3a589d52756e4eb029eaa29e4735" - integrity sha512-2iSK/T77PHMeorakBAk/WLxSodfIJ/lmi6nxEkuruXfhGH7fByZim4Fw6ZJf4B73SVieRSH2ep8zvYkA2ZfRtA== +"@csstools/postcss-oklab-function@^4.0.7": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.7.tgz#33b3322dfb27b0b5eb83a7ad36e67f08bc4e66cd" + integrity sha512-I6WFQIbEKG2IO3vhaMGZDkucbCaUSXMxvHNzDdnfsTCF5tc0UlV3Oe2AhamatQoKFjBi75dSEMrgWq3+RegsOQ== dependencies: - "@csstools/css-color-parser" "^3.0.2" - "@csstools/css-parser-algorithms" "^3.0.1" - "@csstools/css-tokenizer" "^3.0.1" + "@csstools/css-color-parser" "^3.0.7" + "@csstools/css-parser-algorithms" "^3.0.4" + "@csstools/css-tokenizer" "^3.0.3" "@csstools/postcss-progressive-custom-properties" "^4.0.0" "@csstools/utilities" "^2.0.0" @@ -1349,7 +1346,7 @@ ajv "^6.12.0" ajv-keywords "^3.4.1" -"@electron-forge/cli@^7.4.0": +"@electron-forge/cli@7.4.0": version "7.4.0" resolved "https://registry.yarnpkg.com/@electron-forge/cli/-/cli-7.4.0.tgz#db16f4bc678d1f6cec8890cdf86041e9c8336350" integrity sha512-a+zZv3ja/IxkJzNyx4sOHSZv6DPV85S0PEVF6pcRjUpbDL5r+DxjRFsNc0Nq4UIWyFm1nw7RWoPdd9uDst4Tvg== @@ -1430,68 +1427,6 @@ fs-extra "^10.0.0" which "^2.0.2" -"@electron-forge/maker-deb@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@electron-forge/maker-deb/-/maker-deb-7.4.0.tgz#7787f525ab8c7ddcc3e9665e60d704179a92848a" - integrity sha512-npWea3IpGeu96xNqJpsCOYX6V4E+HY6u/okeTUzUOMX96UteT14MecdUefMam158glRTX84k2ryh7WcBoOa4mg== - dependencies: - "@electron-forge/maker-base" "7.4.0" - "@electron-forge/shared-types" "7.4.0" - optionalDependencies: - electron-installer-debian "^3.2.0" - -"@electron-forge/maker-rpm@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@electron-forge/maker-rpm/-/maker-rpm-7.4.0.tgz#135b7c4b621048ce565b3c92a7577915b43ab371" - integrity sha512-N64Yh/K/91GzIk28T1jKsCGgYaquDuhXcEJW+TkVyP5tPZ9aTz9SjXLBxAg8WhcroArAZEsVyPOFKthmFzAUuA== - dependencies: - "@electron-forge/maker-base" "7.4.0" - "@electron-forge/shared-types" "7.4.0" - optionalDependencies: - electron-installer-redhat "^3.2.0" - -"@electron-forge/maker-squirrel@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@electron-forge/maker-squirrel/-/maker-squirrel-7.4.0.tgz#982f3a7ad9d45258de8f78133eefdd79c90f870e" - integrity sha512-mCQyufnSNfjffiKho59ZqVg4W601zGOl6h01OyfDwjOU/G4iQtpnnDEOXGe26q7OVT5ORb1WDnfyGgBeJ6Ge7g== - dependencies: - "@electron-forge/maker-base" "7.4.0" - "@electron-forge/shared-types" "7.4.0" - fs-extra "^10.0.0" - optionalDependencies: - electron-winstaller "^5.3.0" - -"@electron-forge/maker-wix@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@electron-forge/maker-wix/-/maker-wix-7.4.0.tgz#4c271a70506247f07d704634ef6cbe0fe6060bdc" - integrity sha512-+a5zNh/e8/aguDT7Ya+hEsKkkV7VSSaaB45RaA4ahI91bx/mRAWEhGQjnqakGkSAZkRzM6n37Tedx3wz0/2H4A== - dependencies: - "@electron-forge/maker-base" "7.4.0" - "@electron-forge/shared-types" "7.4.0" - chalk "^4.0.0" - electron-wix-msi "^5.1.3" - log-symbols "^4.0.0" - parse-author "^2.0.0" - -"@electron-forge/maker-zip@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@electron-forge/maker-zip/-/maker-zip-7.4.0.tgz#e82ab6174344c43eb9a30b2fb5e2c2e32de2113d" - integrity sha512-UGbMdpuK/P29x1FFRWNOs3bNz+7QNFWVWyTM5hcWqib66cNuUmoaPifQyuwW2POIrIohrxlzLK87/i9Zc8g4dA== - dependencies: - "@electron-forge/maker-base" "7.4.0" - "@electron-forge/shared-types" "7.4.0" - cross-zip "^4.0.0" - fs-extra "^10.0.0" - got "^11.8.5" - -"@electron-forge/plugin-auto-unpack-natives@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@electron-forge/plugin-auto-unpack-natives/-/plugin-auto-unpack-natives-7.4.0.tgz#34382b91d45691824f26503af7b5f585af7ee3f1" - integrity sha512-jJ/v2blH32bcvdlJbeeW/yO99K9SduW8yrS7zuFN6y+B1cmzLd+S7L8oCcOghFDMAlYjQaBlnCe/nMJbT9mN4g== - dependencies: - "@electron-forge/plugin-base" "7.4.0" - "@electron-forge/shared-types" "7.4.0" - "@electron-forge/plugin-base@7.4.0": version "7.4.0" resolved "https://registry.yarnpkg.com/@electron-forge/plugin-base/-/plugin-base-7.4.0.tgz#1c7743a528b1ec3e7a92580870c23398c5a5526f" @@ -1499,7 +1434,7 @@ dependencies: "@electron-forge/shared-types" "7.4.0" -"@electron-forge/plugin-fuses@^7.4.0": +"@electron-forge/plugin-fuses@7.4.0": version "7.4.0" resolved "https://registry.yarnpkg.com/@electron-forge/plugin-fuses/-/plugin-fuses-7.4.0.tgz#3a3b78bf3c5d2b2d445825b05bce145d116df792" integrity sha512-LKcyIaO0sUkzZdOB1PySjG1R9KAl5Vi453ZQcambBI7RpZtPKozluNd0zlXey1cf7ycTwhzvmrI6ss3LHQyjvw== @@ -1507,7 +1442,7 @@ "@electron-forge/plugin-base" "7.4.0" "@electron-forge/shared-types" "7.4.0" -"@electron-forge/plugin-vite@^7.4.0": +"@electron-forge/plugin-vite@7.4.0": version "7.4.0" resolved "https://registry.yarnpkg.com/@electron-forge/plugin-vite/-/plugin-vite-7.4.0.tgz#66b0154269205a0c4e70200b5f5f410833beea40" integrity sha512-GZqBUsyNH0XCvQlBKMS0aOJM6PX80irijgPR9Lfl6ctYIuKTo+82td+nIK8Fef/qSDUEt/U1f4Qb9GfLfhRRig== @@ -1612,7 +1547,7 @@ glob "^7.1.6" minimatch "^3.0.4" -"@electron/fuses@^1.8.0": +"@electron/fuses@1.8.0": version "1.8.0" resolved "https://registry.yarnpkg.com/@electron/fuses/-/fuses-1.8.0.tgz#ad34d3cc4703b1258b83f6989917052cfc1490a0" integrity sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw== @@ -1718,7 +1653,7 @@ semver "^7.1.3" yargs-parser "^21.1.1" -"@electron/rebuild@^3.2.10", "@electron/rebuild@^3.6.0": +"@electron/rebuild@^3.2.10": version "3.6.0" resolved "https://registry.yarnpkg.com/@electron/rebuild/-/rebuild-3.6.0.tgz#60211375a5f8541a71eb07dd2f97354ad0b2b96f" integrity sha512-zF4x3QupRU3uNGaP5X1wjpmcjfw1H87kyqZ00Tc3HvriV+4gmOGuvQjGNkrJuXdsApssdNyVwLsy+TaeTGGcVw== @@ -1764,7 +1699,7 @@ minimatch "^9.0.3" plist "^3.1.0" -"@electron/windows-sign@^1.0.0", "@electron/windows-sign@^1.1.2": +"@electron/windows-sign@^1.0.0": version "1.1.3" resolved "https://registry.yarnpkg.com/@electron/windows-sign/-/windows-sign-1.1.3.tgz#52023d17d8f6c686d934f518be76736f6f2f0aef" integrity sha512-OqVSdAe+/88fIjvTDWiy+5Ho1nXsiBhE5RTsIQ6M/zcxcDAEP2TlQCkOyusItnmzXRN+XTFaK9gKhiZ6KGyXQw== @@ -2075,10 +2010,10 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@kittycad/lib@2.0.7": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@kittycad/lib/-/lib-2.0.7.tgz#63e9c81fc7705c9d0c5fab5939e5d839ec6f393b" - integrity sha512-P26rRZ0KF8C3zhEG2beLlkTJhTPtJF6Nn1wg7w1MxXNvK9RZF6P7DcXqdIh7nJGQt72+JrXoPmApB8Z/R1gQRg== +"@kittycad/lib@2.0.12": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@kittycad/lib/-/lib-2.0.12.tgz#517be58ee8b5f59e5c89bb5076492c960b4ef7d8" + integrity sha512-1eXIP+JbFvWSWQe//ijBuhlnCLRUnZzNAiOf7oMI0WcRTTn8SD8A+TY+NgK6OVGG12unyTPCVXxRR4Xtm3ahLQ== dependencies: openapi-types "^12.0.0" ts-node "^10.9.1" @@ -2116,7 +2051,7 @@ dependencies: "@lezer/common" "^1.0.0" -"@malept/cross-spawn-promise@^1.0.0", "@malept/cross-spawn-promise@^1.1.0": +"@malept/cross-spawn-promise@^1.1.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d" integrity sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ== @@ -2140,6 +2075,20 @@ lodash "^4.17.15" tmp-promise "^3.0.2" +"@marijn/find-cluster-break@^1.0.0": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz#775374306116d51c0c500b8c4face0f9a04752d8" + integrity sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g== + +"@nabla/vite-plugin-eslint@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nabla/vite-plugin-eslint/-/vite-plugin-eslint-2.0.5.tgz#f99333a9fe26442e497fd6af269803453b8c4c68" + integrity sha512-m6Q8ZVM0ASZfYyfFbG661mDklhZQZEeBMQgtB26NhdadxPSctHzHsUbF87msdSb0V4Z8R1p/vRkB5SHNOpANAQ== + dependencies: + "@types/eslint" "*" + chalk "^4" + debug "^4" + "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": version "5.1.1-v1" resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" @@ -2189,12 +2138,12 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@playwright/test@^1.46.1": - version "1.46.1" - resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.46.1.tgz#a8dfdcd623c4c23bb1b7ea588058aad41055c188" - integrity sha512-Fq6SwLujA/DOIvNC2EL/SojJnkKf/rAwJ//APpJJHRyMi1PdKrY3Az+4XNQ51N4RTbItbIByQ0jgd1tayq1aeA== +"@playwright/test@^1.49.0": + version "1.49.1" + resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.49.1.tgz#55fa360658b3187bfb6371e2f8a64f50ef80c827" + integrity sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g== dependencies: - playwright "1.46.1" + playwright "1.49.1" "@react-hook/latest@^1.0.2": version "1.0.3" @@ -2214,10 +2163,10 @@ "@react-hook/latest" "^1.0.2" "@react-hook/passive-layout-effect" "^1.2.0" -"@remix-run/router@1.19.1": - version "1.19.1" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.19.1.tgz#984771bfd1de2715f42394c87fb716c1349e014f" - integrity sha512-S45oynt/WH19bHbIXjtli6QmwNYvaz+vtnubvNpNDvUOoA/OWh6j1OikIP3G+v5GHdxyC6EXoChG3HgYGEUfcg== +"@remix-run/router@1.21.0": + version "1.21.0" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.21.0.tgz#c65ae4262bdcfe415dbd4f64ec87676e4a56e2b5" + integrity sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA== "@replit/codemirror-interact@^6.3.1": version "6.3.1" @@ -2226,93 +2175,100 @@ dependencies: "@codemirror/state" "^6.2.1" -"@rollup/pluginutils@^4.2.1": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d" - integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== - dependencies: - estree-walker "^2.0.1" - picomatch "^2.2.2" +"@rollup/rollup-android-arm-eabi@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.29.1.tgz#9bd38df6a29afb7f0336d988bc8112af0c8816c0" + integrity sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw== -"@rollup/rollup-android-arm-eabi@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.0.tgz#d941173f82f9b041c61b0dc1a2a91dcd06e4b31e" - integrity sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA== +"@rollup/rollup-android-arm64@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.29.1.tgz#bd1a98390e15b76eeef907175a37c5f0f9e4d214" + integrity sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew== -"@rollup/rollup-android-arm64@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.0.tgz#7e7157c8543215245ceffc445134d9e843ba51c0" - integrity sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA== +"@rollup/rollup-darwin-arm64@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.29.1.tgz#bc6fa8a2cc77b5f367424e5e994e3537524e6879" + integrity sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw== -"@rollup/rollup-darwin-arm64@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.0.tgz#f0a18a4fc8dc6eb1e94a51fa2adb22876f477947" - integrity sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA== +"@rollup/rollup-darwin-x64@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.29.1.tgz#76059c91f06b17406347b127df10f065283b2e61" + integrity sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng== -"@rollup/rollup-darwin-x64@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.0.tgz#34b7867613e5cc42d2b85ddc0424228cc33b43f0" - integrity sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg== +"@rollup/rollup-freebsd-arm64@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.29.1.tgz#83178315c0be4b4c8c1fd835e1952d2dc1eb4e6e" + integrity sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw== -"@rollup/rollup-linux-arm-gnueabihf@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.0.tgz#422b19ff9ae02b05d3395183d1d43b38c7c8be0b" - integrity sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA== +"@rollup/rollup-freebsd-x64@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.29.1.tgz#1ef24fa0576bf7899a0a0a649156606dbd7a0d46" + integrity sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w== -"@rollup/rollup-linux-arm-musleabihf@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.0.tgz#568aa29195ef6fc57ec6ed3f518923764406a8ee" - integrity sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w== +"@rollup/rollup-linux-arm-gnueabihf@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.29.1.tgz#443a6f5681bf4611caae42988994a6d8ee676216" + integrity sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A== -"@rollup/rollup-linux-arm64-gnu@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.0.tgz#22309c8bcba9a73114f69165c72bc94b2fbec085" - integrity sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w== +"@rollup/rollup-linux-arm-musleabihf@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.29.1.tgz#9738b27184102228637a683e5f35b22ea352394f" + integrity sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ== -"@rollup/rollup-linux-arm64-musl@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.0.tgz#c93c388af6d33f082894b8a60839d7265b2b9bc5" - integrity sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw== +"@rollup/rollup-linux-arm64-gnu@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.29.1.tgz#b5e9d5e30ff36a19bedd29c715ba18a1889ff269" + integrity sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA== -"@rollup/rollup-linux-powerpc64le-gnu@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.0.tgz#493c5e19e395cf3c6bd860c7139c8a903dea72b4" - integrity sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg== +"@rollup/rollup-linux-arm64-musl@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.29.1.tgz#1d8f68f0829b57f746ec03432ad046f1af014a98" + integrity sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA== -"@rollup/rollup-linux-riscv64-gnu@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.0.tgz#a2eab4346fbe5909165ce99adb935ba30c9fb444" - integrity sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg== +"@rollup/rollup-linux-loongarch64-gnu@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.29.1.tgz#07027feb883408e74a3002c8e50caaedd288ae38" + integrity sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw== -"@rollup/rollup-linux-s390x-gnu@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.0.tgz#0bc49a79db4345d78d757bb1b05e73a1b42fa5c3" - integrity sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw== +"@rollup/rollup-linux-powerpc64le-gnu@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.29.1.tgz#544ce1b0847a9c1240425e86f33daceac7ec4e12" + integrity sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w== -"@rollup/rollup-linux-x64-gnu@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.0.tgz#4fd36a6a41f3406d8693321b13d4f9b7658dd4b9" - integrity sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg== +"@rollup/rollup-linux-riscv64-gnu@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.29.1.tgz#64be13d51852ec1e2dfbd25d997ed5f42f35ea6d" + integrity sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ== -"@rollup/rollup-linux-x64-musl@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.0.tgz#10ebb13bd4469cbad1a5d9b073bd27ec8a886200" - integrity sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ== +"@rollup/rollup-linux-s390x-gnu@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.29.1.tgz#31f51e1e05c6264552d03875d9e2e673f0fd86e3" + integrity sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g== -"@rollup/rollup-win32-arm64-msvc@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.0.tgz#2fef1a90f1402258ef915ae5a94cc91a5a1d5bfc" - integrity sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ== +"@rollup/rollup-linux-x64-gnu@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.29.1.tgz#f4c95b26f4ad69ebdb64b42f0ae4da2a0f617958" + integrity sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ== -"@rollup/rollup-win32-ia32-msvc@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.0.tgz#a18ad47a95c5f264defb60acdd8c27569f816fc1" - integrity sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg== +"@rollup/rollup-linux-x64-musl@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.29.1.tgz#ab7be89192f72beb9ea6e2386186fefde4f69d82" + integrity sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA== -"@rollup/rollup-win32-x64-msvc@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.0.tgz#20c09cf44dcb082140cc7f439dd679fe4bba3375" - integrity sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ== +"@rollup/rollup-win32-arm64-msvc@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.29.1.tgz#7f12efb8240b238346951559998802722944421e" + integrity sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig== + +"@rollup/rollup-win32-ia32-msvc@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.29.1.tgz#353d14d6eee943004d129796e4feddd3aa260921" + integrity sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng== + +"@rollup/rollup-win32-x64-msvc@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.29.1.tgz#c82f04a09ba481e13857d6f2516e072aaa51b7f4" + integrity sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg== "@rtsao/scc@^1.1.0": version "1.1.0" @@ -2423,7 +2379,7 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== -"@tweenjs/tween.js@^23.1.1", "@tweenjs/tween.js@~23.1.1": +"@tweenjs/tween.js@^23.1.1", "@tweenjs/tween.js@~23.1.3": version "23.1.3" resolved "https://registry.yarnpkg.com/@tweenjs/tween.js/-/tween.js-23.1.3.tgz#eff0245735c04a928bb19c026b58c2a56460539d" integrity sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA== @@ -2488,6 +2444,11 @@ dependencies: "@types/ms" "*" +"@types/diff@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@types/diff/-/diff-6.0.0.tgz#031f27cf57564f3cce825f38fb19fdd4349ad07a" + integrity sha512-dhVCYGv3ZSbzmQaBSagrv1WJ6rXCdkyTcDyoNu1MD8JohI7pR7k8wdZEm+mvdxRKXyHVwckFzWU1vJc+Z29MlA== + "@types/electron@^1.6.10": version "1.6.10" resolved "https://registry.yarnpkg.com/@types/electron/-/electron-1.6.10.tgz#7e87888ed3888767cca68e92772c2c8ea46bc873" @@ -2495,34 +2456,31 @@ dependencies: electron "*" -"@types/eslint@^8.4.5": - version "8.56.11" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.11.tgz#e2ff61510a3b9454b3329fe7731e3b4c6f780041" - integrity sha512-sVBpJMf7UPo/wGecYOpk2aQya2VUGeHhe38WG7/mN5FufNSubf5VT9Uh9Uyp8/eLJpu1/tuhJ/qTo4mhSB4V4Q== +"@types/eslint@*": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.1.tgz#d5795ad732ce81715f27f75da913004a56751584" + integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== dependencies: "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@1.0.5", "@types/estree@^1.0.0": +"@types/estree@*", "@types/estree@^1.0.0": version "1.0.5" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== -"@types/fs-extra@9.0.13", "@types/fs-extra@^9.0.1", "@types/fs-extra@^9.0.11": +"@types/estree@1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + +"@types/fs-extra@9.0.13", "@types/fs-extra@^9.0.11": version "9.0.13" resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== dependencies: "@types/node" "*" -"@types/glob@^7.1.1": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" - integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - "@types/http-cache-semantics@*": version "4.0.4" resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" @@ -2577,11 +2535,6 @@ dependencies: "@types/node" "*" -"@types/minimatch@*": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" - integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== - "@types/minimist@^1.2.5": version "1.2.5" resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" @@ -2643,10 +2596,10 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== -"@types/react-dom@^18.0.0", "@types/react-dom@^18.2.25": - version "18.3.0" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" - integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== +"@types/react-dom@^18.0.0", "@types/react-dom@^18.3.1": + version "18.3.1" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.1.tgz#1e4654c08a9cdcfb6594c780ac59b55aad42fe07" + integrity sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ== dependencies: "@types/react" "*" @@ -2694,14 +2647,15 @@ dependencies: "@types/jest" "*" -"@types/three@^0.163.0": - version "0.163.0" - resolved "https://registry.yarnpkg.com/@types/three/-/three-0.163.0.tgz#96f5440fcd39452d2c84dfe0c9b7a9cf0247b9e6" - integrity sha512-uIdDhsXRpQiBUkflBS/i1l3JX14fW6Ot9csed60nfbZNXHDTRsnV2xnTVwXcgbvTiboAR4IW+t+lTL5f1rqIqA== +"@types/three@^0.172.0": + version "0.172.0" + resolved "https://registry.yarnpkg.com/@types/three/-/three-0.172.0.tgz#5094852dfa781d2fe1c65eb1b4985a4aa99858b7" + integrity sha512-LrUtP3FEG26Zg5WiF0nbg8VoXiKokBLTcqM2iLvM9vzcfEiYmmBAPGdBgV0OYx9fvWlY3R/3ERTZcD9X5sc0NA== dependencies: - "@tweenjs/tween.js" "~23.1.1" + "@tweenjs/tween.js" "~23.1.3" "@types/stats.js" "*" "@types/webxr" "*" + "@webgpu/types" "*" fflate "~0.8.2" meshoptimizer "~0.18.1" @@ -2730,10 +2684,10 @@ resolved "https://registry.yarnpkg.com/@types/wicg-file-system-access/-/wicg-file-system-access-2023.10.5.tgz#14b3c25eb4d914b5734795bdea71da229f918b9d" integrity sha512-e9kZO9kCdLqT2h9Tw38oGv9UNzBBWaR1MzuAavxPcsV/7FJ3tWbU6RI3uB+yKIDPGLkGVbplS52ub0AcRLvrhA== -"@types/ws@^8.5.10": - version "8.5.12" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e" - integrity sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ== +"@types/ws@^8.5.13": + version "8.5.13" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.13.tgz#6414c280875e2691d0d1e080b05addbf5cb91e20" + integrity sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA== dependencies: "@types/node" "*" @@ -2914,6 +2868,11 @@ dependencies: debug "^4.3.4" +"@webgpu/types@*": + version "0.1.52" + resolved "https://registry.yarnpkg.com/@webgpu/types/-/types-0.1.52.tgz#239995418d86de927269aca54cbadfbee04eb03a" + integrity sha512-eI883Nlag2hGIkhXxAnq8s4APpqXWuPL3Gbn2ghiU12UjLvfCbVqHK4XfXl3eLRTatqcMmeK7jws7IwWsGfbzw== + "@xmldom/xmldom@^0.8.8": version "0.8.10" resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" @@ -3272,18 +3231,6 @@ asap@~2.0.3: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== -asar@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/asar/-/asar-3.2.0.tgz#e6edb5edd6f627ebef04db62f771c61bea9c1221" - integrity sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg== - dependencies: - chromium-pickle-js "^0.2.0" - commander "^5.0.0" - glob "^7.1.6" - minimatch "^3.0.4" - optionalDependencies: - "@types/glob" "^7.1.1" - assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" @@ -3750,7 +3697,7 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: +chalk@^4, chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -3852,15 +3799,6 @@ client-only@^0.0.1: resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -4083,15 +4021,6 @@ cross-fetch@^3.1.5: dependencies: node-fetch "^2.6.12" -cross-spawn-windows-exe@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/cross-spawn-windows-exe/-/cross-spawn-windows-exe-1.2.0.tgz#46253b0f497676e766faf4a7061004618b5ac5ec" - integrity sha512-mkLtJJcYbDCxEG7Js6eUnUNndWjyUZwJ3H7bErmmtOYU/Zb99DyUkpamuIZE0b3bhmJyZ7D90uS6f+CGxRRjOw== - dependencies: - "@malept/cross-spawn-promise" "^1.1.0" - is-wsl "^2.2.0" - which "^2.0.2" - cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -4112,11 +4041,6 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -cross-zip@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cross-zip/-/cross-zip-4.0.1.tgz#1bbf5d3b0e5a77b5f5ca130a6d38f770786e1270" - integrity sha512-n63i0lZ0rvQ6FXiGQ+/JFCKAUyPFhLQYJIqKaa+tSJtfKeULF/IDNDAbdnSIxgS4NTuw2b0+lj8LzfITuq+ZxQ== - css-line-break@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/css-line-break/-/css-line-break-2.1.0.tgz#bfef660dfa6f5397ea54116bb3cb4873edbc4fa0" @@ -4226,6 +4150,13 @@ debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + decamelize@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-6.0.0.tgz#8cad4d916fde5c41a264a43d0ecc56fe3d31749e" @@ -4354,6 +4285,11 @@ diff@^4.0.1: resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== +diff@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a" + integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw== + dir-compare@^3.0.0: version "3.3.0" resolved "https://registry.yarnpkg.com/dir-compare/-/dir-compare-3.3.0.tgz#2c749f973b5c4b5d087f11edaae730db31788416" @@ -4468,7 +4404,7 @@ ejs@^3.1.8: dependencies: jake "^10.8.5" -electron-builder@^24.13.3: +electron-builder@24.13.3: version "24.13.3" resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-24.13.3.tgz#c506dfebd36d9a50a83ee8aa32d803d83dbe4616" integrity sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg== @@ -4485,51 +4421,7 @@ electron-builder@^24.13.3: simple-update-notifier "2.0.0" yargs "^17.6.2" -electron-installer-common@^0.10.2: - version "0.10.3" - resolved "https://registry.yarnpkg.com/electron-installer-common/-/electron-installer-common-0.10.3.tgz#40f9db644ca60eb28673d545b67ee0113aef4444" - integrity sha512-mYbP+6i+nHMIm0WZHXgGdmmXMe+KXncl6jZYQNcCF9C1WsNA9C5SZ2VP4TLQMSIoFO+X4ugkMEA5uld1bmyEvA== - dependencies: - "@malept/cross-spawn-promise" "^1.0.0" - asar "^3.0.0" - debug "^4.1.1" - fs-extra "^9.0.0" - glob "^7.1.4" - lodash "^4.17.15" - parse-author "^2.0.0" - semver "^7.1.1" - tmp-promise "^3.0.2" - optionalDependencies: - "@types/fs-extra" "^9.0.1" - -electron-installer-debian@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/electron-installer-debian/-/electron-installer-debian-3.2.0.tgz#2a9c8220f50a57807de8f93619a0d61ec41271e0" - integrity sha512-58ZrlJ1HQY80VucsEIG9tQ//HrTlG6sfofA3nRGr6TmkX661uJyu4cMPPh6kXW+aHdq/7+q25KyQhDrXvRL7jw== - dependencies: - "@malept/cross-spawn-promise" "^1.0.0" - debug "^4.1.1" - electron-installer-common "^0.10.2" - fs-extra "^9.0.0" - get-folder-size "^2.0.1" - lodash "^4.17.4" - word-wrap "^1.2.3" - yargs "^16.0.2" - -electron-installer-redhat@^3.2.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/electron-installer-redhat/-/electron-installer-redhat-3.4.0.tgz#4a7f8d67b48b7d5b23bd1eb074f4b684ae43b192" - integrity sha512-gEISr3U32Sgtj+fjxUAlSDo3wyGGq6OBx7rF5UdpIgbnpUvMN4W5uYb0ThpnAZ42VEJh/3aODQXHbFS4f5J3Iw== - dependencies: - "@malept/cross-spawn-promise" "^1.0.0" - debug "^4.1.1" - electron-installer-common "^0.10.2" - fs-extra "^9.0.0" - lodash "^4.17.15" - word-wrap "^1.2.3" - yargs "^16.0.2" - -electron-notarize@^1.2.2: +electron-notarize@1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/electron-notarize/-/electron-notarize-1.2.2.tgz#ebf2b258e8e08c1c9f8ff61dc53d5b16b439daf4" integrity sha512-ZStVWYcWI7g87/PgjPJSIIhwQXOaw4/XeXU+pWqMMktSLHaGMLHdyPPN7Cmao7+Cr7fYufA16npdtMndYciHNw== @@ -4550,13 +4442,6 @@ electron-publish@24.13.1: lazy-val "^1.0.5" mime "^2.5.2" -electron-squirrel-startup@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/electron-squirrel-startup/-/electron-squirrel-startup-1.0.1.tgz#c9171568d724884c7a2b03760bfeedcf921c63ab" - integrity sha512-sTfFIHGku+7PsHLJ7v0dRcZNkALrV+YEozINTW8X1nM//e5O3L+rfYuvSW00lmGHnYmUjARZulD8F2V8ISI9RA== - dependencies: - debug "^2.2.0" - electron-to-chromium@^1.4.820: version "1.5.4" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.4.tgz#cd477c830dd6fca41fbd5465c1ff6ce08ac22343" @@ -4567,7 +4452,7 @@ electron-to-chromium@^1.5.4: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz#1abf0410c5344b2b829b7247e031f02810d442e6" integrity sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q== -electron-updater@^6.3.0: +electron-updater@6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-6.3.0.tgz#13a5c3c3f0b2b114fe33181e24a8270096734b3e" integrity sha512-3Xlezhk+dKaSQrOnkQNqCGiuGSSUPO9BV9TQZ4Iig6AyTJ4FzJONE5gFFc382sY53Sh9dwJfzKsA3DxRHt2btw== @@ -4581,36 +4466,7 @@ electron-updater@^6.3.0: semver "^7.3.8" tiny-typed-emitter "^2.1.0" -electron-winstaller@^5.3.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/electron-winstaller/-/electron-winstaller-5.4.0.tgz#f0660d476d5c4f579fdf7edd2f0cf01d54c4d0b2" - integrity sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg== - dependencies: - "@electron/asar" "^3.2.1" - debug "^4.1.1" - fs-extra "^7.0.1" - lodash "^4.17.21" - temp "^0.9.0" - optionalDependencies: - "@electron/windows-sign" "^1.1.2" - -electron-wix-msi@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/electron-wix-msi/-/electron-wix-msi-5.1.3.tgz#ab85dc1145a7ce7ae7724ed3ca3f92c447988c9a" - integrity sha512-EYj1cm1nZoVHmIIx3o0aKt784lxdEpJnXbEnyypklUCnglqSb7ni+1xi1Vp/gtrGS/mzIxnWBT+x5fIfuDjhvA== - dependencies: - "@electron/windows-sign" "^1.1.2" - debug "^4.3.4" - fs-extra "^10.1.0" - klaw "^4.1.0" - lodash "^4.17.21" - rcedit "^4.0.1" - rcinfo "^0.1.3" - semver "^7.6.0" - optionalDependencies: - "@bitdisaster/exe-icon-extractor" "^1.0.10" - -electron@*, electron@^32.1.2: +electron@*, electron@32.1.2: version "32.1.2" resolved "https://registry.yarnpkg.com/electron/-/electron-32.1.2.tgz#84d1efd95d41224e58a6a9bbd1db4ba80154fc02" integrity sha512-CXe6doFzhmh1U7daOvUzmF6Cj8hssdYWMeEPRnRO6rB9/bbwMlWctcQ7P8NJXhLQ88/vYUJQrJvlJPh8qM0BRQ== @@ -5119,11 +4975,6 @@ estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== -estree-walker@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== - estree-walker@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" @@ -5451,11 +5302,16 @@ flux@^4.0.1: fbemitter "^3.0.0" fbjs "^3.0.1" -follow-redirects@^1.0.0, follow-redirects@^1.14.8: +follow-redirects@^1.0.0: version "1.15.6" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== +follow-redirects@^1.14.8: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -5520,15 +5376,6 @@ fs-extra@^11.1.0, fs-extra@^11.1.1: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -5604,11 +5451,6 @@ galactus@^1.0.0: flora-colossus "^2.0.0" fs-extra "^10.1.0" -gar@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/gar/-/gar-1.0.4.tgz#f777bc7db425c0572fdeb52676172ca1ae9888b8" - integrity sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w== - gauge@^4.0.3: version "4.0.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" @@ -5633,14 +5475,6 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-folder-size@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/get-folder-size/-/get-folder-size-2.0.1.tgz#3fe0524dd3bad05257ef1311331417bcd020a497" - integrity sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA== - dependencies: - gar "^1.0.4" - tiny-each-async "2.0.3" - get-func-name@^2.0.1, get-func-name@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" @@ -5871,10 +5705,10 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== -happy-dom@^14.3.10: - version "14.12.3" - resolved "https://registry.yarnpkg.com/happy-dom/-/happy-dom-14.12.3.tgz#1b5892c670461fd1db041bee690981c22d3d521f" - integrity sha512-vsYlEs3E9gLwA1Hp+w3qzu+RUDFf4VTT8cyKqVICoZ2k7WM++Qyd2LwzyTi5bqMJFiIC/vNpTDYuxdreENRK/g== +happy-dom@^15.11.7: + version "15.11.7" + resolved "https://registry.yarnpkg.com/happy-dom/-/happy-dom-15.11.7.tgz#db9854f11e5dd3fd4ab20cbbcfdf7bd9e17cd971" + integrity sha512-KyrFvnl+J9US63TEzwoiJOQzZBJY7KgBushJA8X61DMbNsH+2ONkDuLDnCnwUiPTF42tLoEmrPyoqbenVA5zrg== dependencies: entities "^4.5.0" webidl-conversions "^7.0.0" @@ -6244,11 +6078,6 @@ is-date-object@^1.0.1, is-date-object@^1.0.5: dependencies: has-tostringtag "^1.0.0" -is-docker@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -6403,13 +6232,6 @@ is-windows@^1.0.1: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" @@ -6665,11 +6487,6 @@ kill-port@^2.0.1: get-them-args "1.3.2" shell-exec "1.0.2" -klaw@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-4.1.0.tgz#5df608067d8cb62bbfb24374f8e5d956323338f3" - integrity sha512-1zGZ9MF9H22UnkpVeuaGKOjfA2t6WrfdrJmGjy16ykcjnKQDmHVX+KI477rpbGevz/5FD4MC3xf1oxylBgcaQw== - language-subtag-registry@^0.3.20: version "0.3.23" resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7" @@ -6804,7 +6621,7 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.2, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: +lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.2, lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -7108,7 +6925,7 @@ minizlib@^2.1.1, minizlib@^2.1.2: minipass "^3.0.0" yallist "^4.0.0" -mkdirp@^0.5.1, mkdirp@^0.5.6: +mkdirp@^0.5.6: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== @@ -7140,7 +6957,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.0.0, ms@^2.1.1: +ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -7163,9 +6980,9 @@ mz@^2.7.0: thenify-all "^1.0.0" nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + version "3.3.8" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" + integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== natural-compare-lite@^1.4.0: version "1.4.0" @@ -7694,7 +7511,7 @@ picocolors@^1.0.0, picocolors@^1.0.1: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -7732,17 +7549,17 @@ pkg-types@^1.0.3, pkg-types@^1.1.1: mlly "^1.7.1" pathe "^1.1.2" -playwright-core@1.46.1: - version "1.46.1" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.46.1.tgz#28f3ab35312135dda75b0c92a3e5c0e7edb9cc8b" - integrity sha512-h9LqIQaAv+CYvWzsZ+h3RsrqCStkBHlgo6/TJlFst3cOTlLghBQlJwPOZKQJTKNaD3QIB7aAVQ+gfWbN3NXB7A== +playwright-core@1.49.1: + version "1.49.1" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.49.1.tgz#32c62f046e950f586ff9e35ed490a424f2248015" + integrity sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg== -playwright@1.46.1: - version "1.46.1" - resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.46.1.tgz#ea562bc48373648e10420a10c16842f0b227c218" - integrity sha512-oPcr1yqoXLCkgKtD5eNUPLiN40rYEM39odNpIb6VE6S7/15gJmA1NzVv6zJYusV0e7tzvkU/utBFNa/Kpxmwng== +playwright@1.49.1: + version "1.49.1" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.49.1.tgz#830266dbca3008022afa7b4783565db9944ded7c" + integrity sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA== dependencies: - playwright-core "1.46.1" + playwright-core "1.49.1" optionalDependencies: fsevents "2.3.2" @@ -7969,18 +7786,6 @@ raw-body@2.5.2: iconv-lite "0.4.24" unpipe "1.0.0" -rcedit@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/rcedit/-/rcedit-4.0.1.tgz#892ac47a19204a380f49e00ea38ce070443343c2" - integrity sha512-bZdaQi34krFWhrDn+O53ccBDw0MkAT2Vhu75SqhtvhQu4OPyFM4RoVheyYiVQYdjhUi6EJMVWQ0tR6bCIYVkUg== - dependencies: - cross-spawn-windows-exe "^1.1.0" - -rcinfo@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/rcinfo/-/rcinfo-0.1.3.tgz#ac36832d1f1e5970c6379e571480ea5826511fc6" - integrity sha512-c2XV2aYgY7x3BscO+/B/nCTtMvnclZ8w5D7R6zgK4sGOQnE0MjlXhOPynno7yp6Iw1RPNSXBwXwB1svZVRfcSw== - re-resizable@^6.9.11: version "6.9.17" resolved "https://registry.yarnpkg.com/re-resizable/-/re-resizable-6.9.17.tgz#78e4349934ff24a8fcb4b6b5a43ff9ed5f319d2a" @@ -8066,20 +7871,20 @@ react-refresh@^0.14.2: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== -react-router-dom@^6.26.1: - version "6.26.1" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.26.1.tgz#a408892b41767a49dc94b3564b0e7d8e3959f623" - integrity sha512-veut7m41S1fLql4pLhxeSW3jlqs+4MtjRLj0xvuCEXsxusJCbs6I8yn9BxzzDX2XDgafrccY6hwjmd/bL54tFw== +react-router-dom@^6.28.0: + version "6.28.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.28.0.tgz#f73ebb3490e59ac9f299377062ad1d10a9f579e6" + integrity sha512-kQ7Unsl5YdyOltsPGl31zOjLrDv+m2VcIEcIHqYYD3Lp0UppLjrzcfJqDJwXxFw3TH/yvapbnUvPlAj7Kx5nbg== dependencies: - "@remix-run/router" "1.19.1" - react-router "6.26.1" + "@remix-run/router" "1.21.0" + react-router "6.28.0" -react-router@6.26.1: - version "6.26.1" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.26.1.tgz#88c64837e05ffab6899a49df2a1484a22471e4ce" - integrity sha512-kIwJveZNwp7teQRI5QmwWo39A5bXRyqpH0COKKmPnyD2vBvDwgFXSqDUYtt1h+FEyfnE8eXr7oe0MxRzVwCcvQ== +react-router@6.28.0: + version "6.28.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.28.0.tgz#29247c86d7ba901d7e5a13aa79a96723c3e59d0d" + integrity sha512-HrYdIFqdrnhDw0PqG/AKjAqEqM7AvxCz0DQ4h2W8k6nqmc5uRBYDag0SBxx9iYz5G8gnuNVLzUe13wl9eAsXXg== dependencies: - "@remix-run/router" "1.19.1" + "@remix-run/router" "1.21.0" react-textarea-autosize@^8.3.2: version "8.5.3" @@ -8371,13 +8176,6 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -rimraf@~2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - roarr@^2.15.3: version "2.15.4" resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" @@ -8390,36 +8188,32 @@ roarr@^2.15.3: semver-compare "^1.0.0" sprintf-js "^1.1.2" -rollup@^2.77.2: - version "2.79.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" - integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== - optionalDependencies: - fsevents "~2.3.2" - rollup@^4.20.0: - version "4.21.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.21.0.tgz#28db5f5c556a5180361d35009979ccc749560b9d" - integrity sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ== + version "4.29.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.29.1.tgz#a9aaaece817e5f778489e5bf82e379cc8a5c05bc" + integrity sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw== dependencies: - "@types/estree" "1.0.5" + "@types/estree" "1.0.6" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.21.0" - "@rollup/rollup-android-arm64" "4.21.0" - "@rollup/rollup-darwin-arm64" "4.21.0" - "@rollup/rollup-darwin-x64" "4.21.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.21.0" - "@rollup/rollup-linux-arm-musleabihf" "4.21.0" - "@rollup/rollup-linux-arm64-gnu" "4.21.0" - "@rollup/rollup-linux-arm64-musl" "4.21.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.21.0" - "@rollup/rollup-linux-riscv64-gnu" "4.21.0" - "@rollup/rollup-linux-s390x-gnu" "4.21.0" - "@rollup/rollup-linux-x64-gnu" "4.21.0" - "@rollup/rollup-linux-x64-musl" "4.21.0" - "@rollup/rollup-win32-arm64-msvc" "4.21.0" - "@rollup/rollup-win32-ia32-msvc" "4.21.0" - "@rollup/rollup-win32-x64-msvc" "4.21.0" + "@rollup/rollup-android-arm-eabi" "4.29.1" + "@rollup/rollup-android-arm64" "4.29.1" + "@rollup/rollup-darwin-arm64" "4.29.1" + "@rollup/rollup-darwin-x64" "4.29.1" + "@rollup/rollup-freebsd-arm64" "4.29.1" + "@rollup/rollup-freebsd-x64" "4.29.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.29.1" + "@rollup/rollup-linux-arm-musleabihf" "4.29.1" + "@rollup/rollup-linux-arm64-gnu" "4.29.1" + "@rollup/rollup-linux-arm64-musl" "4.29.1" + "@rollup/rollup-linux-loongarch64-gnu" "4.29.1" + "@rollup/rollup-linux-powerpc64le-gnu" "4.29.1" + "@rollup/rollup-linux-riscv64-gnu" "4.29.1" + "@rollup/rollup-linux-s390x-gnu" "4.29.1" + "@rollup/rollup-linux-x64-gnu" "4.29.1" + "@rollup/rollup-linux-x64-musl" "4.29.1" + "@rollup/rollup-win32-arm64-msvc" "4.29.1" + "@rollup/rollup-win32-ia32-msvc" "4.29.1" + "@rollup/rollup-win32-x64-msvc" "4.29.1" fsevents "~2.3.2" run-parallel@^1.1.9: @@ -8502,7 +8296,7 @@ semver@^6.2.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.6.0: +semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -9047,14 +8841,6 @@ temp-file@^3.4.0: async-exit-hook "^2.0.1" fs-extra "^10.0.0" -temp@^0.9.0: - version "0.9.4" - resolved "https://registry.yarnpkg.com/temp/-/temp-0.9.4.tgz#cd20a8580cb63635d0e4e9d4bd989d44286e7620" - integrity sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA== - dependencies: - mkdirp "^0.5.1" - rimraf "~2.6.2" - text-segmentation@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/text-segmentation/-/text-segmentation-1.0.3.tgz#52a388159efffe746b24a63ba311b6ac9f2d7943" @@ -9081,21 +8867,16 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" -three@^0.166.1: - version "0.166.1" - resolved "https://registry.yarnpkg.com/three/-/three-0.166.1.tgz#322cfc48fff4e751cd47d61fd1558c387d098d7c" - integrity sha512-LtuafkKHHzm61AQA1be2MAYIw1IjmhOUxhBa0prrLpEMWbV7ijvxCRHjSgHPGp2493wLBzwKV46tA9nivLEgKg== +three@^0.172.0: + version "0.172.0" + resolved "https://registry.yarnpkg.com/three/-/three-0.172.0.tgz#6944a72f8439e8f7e4b034c8539ec82f5ebe0082" + integrity sha512-6HMgMlzU97MsV7D/tY8Va38b83kz8YJX+BefKjspMNAv0Vx6dxMogHOrnRl/sbMIs3BPUKijPqDqJ/+UwJbIow== thunky@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== -tiny-each-async@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/tiny-each-async/-/tiny-each-async-2.0.3.tgz#8ebbbfd6d6295f1370003fbb37162afe5a0a51d1" - integrity sha512-5ROII7nElnAirvFn8g7H7MtpfV1daMcyfTGQwsn/x2VtyV+VPiO5CjReCJtWLvoKTDEDmZocf3cNPraiMnBXLA== - tiny-invariant@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" @@ -9309,11 +9090,16 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" -typescript@^5.0.0, typescript@^5.3.3: +typescript@^5.3.3: version "5.5.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== +typescript@^5.7.2: + version "5.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" + integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== + ua-parser-js@^1.0.35, ua-parser-js@^1.0.37: version "1.0.38" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.38.tgz#66bb0c4c0e322fe48edfe6d446df6042e62f25e2" @@ -9475,10 +9261,10 @@ utrie@^1.0.2: dependencies: base64-arraybuffer "^1.0.2" -uuid@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" - integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== +uuid@^11.0.2: + version "11.0.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.0.2.tgz#a8d68ba7347d051e7ea716cc8dcbbab634d66875" + integrity sha512-14FfcOJmqdjbBPdDjFQyk/SdT4NySW4eM0zcG+HqbHP5jzuH56xO3J1DGhgs/cEMCfwYi3HQI1gnTO62iaG+tQ== v8-compile-cache-lib@^3.0.1: version "3.0.1" @@ -9518,15 +9304,6 @@ vite-node@1.6.0: picocolors "^1.0.0" vite "^5.0.0" -vite-plugin-eslint@^1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/vite-plugin-eslint/-/vite-plugin-eslint-1.8.1.tgz#0381b8272e7f0fd8b663311b64f7608d55d8b04c" - integrity sha512-PqdMf3Y2fLO9FsNPmMX+//2BF5SF8nEWspZdgl4kSt7UvHDRHVVfHvxsD7ULYzZrJDGRxR81Nq7TOFgwMnUang== - dependencies: - "@rollup/pluginutils" "^4.2.1" - "@types/eslint" "^8.4.5" - rollup "^2.77.2" - vite-plugin-package-version@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/vite-plugin-package-version/-/vite-plugin-package-version-1.1.0.tgz#7d8088955aa21e4ec93353c98992b3f58c4bf13c" @@ -9626,10 +9403,10 @@ warning@^4.0.3: dependencies: loose-envify "^1.0.0" -wasm-pack@^0.13.0: - version "0.13.0" - resolved "https://registry.yarnpkg.com/wasm-pack/-/wasm-pack-0.13.0.tgz#c2637e0129e1854735f3daead45d92165d54709d" - integrity sha512-AmboGZEnZoIcVCzSlkLEmNFEqJN+IwgshJ5S7pi30uNUTce4LvWkifQzsQRxnWj47G8gkqZxlyGlyQplsnIS7w== +wasm-pack@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/wasm-pack/-/wasm-pack-0.13.1.tgz#345701522420ad74a5b584f1bdaf6db8c264cb54" + integrity sha512-P9exD4YkjpDbw68xUhF3MDm/CC/3eTmmthyG5bHJ56kalxOTewOunxTke4SyF8MTXV6jUtNjXggPgrGmMtczGg== dependencies: binary-install "^1.0.1" @@ -9764,7 +9541,7 @@ wide-align@^1.1.5: dependencies: string-width "^1.0.2 || 2 || 3 || 4" -word-wrap@^1.2.3, word-wrap@^1.2.5: +word-wrap@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== @@ -9871,30 +9648,12 @@ yaml@^2.3.4: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.0.tgz#c6165a721cf8000e91c36490a41d7be25176cf5d" integrity sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw== -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^16.0.2: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - 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" - -yargs@^17.0.1, yargs@^17.6.2: +yargs@^17.0.1, yargs@^17.6.2, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==